Last active
December 17, 2015 14:31
-
-
Save skhokhlov/613858eeda02d4658bed to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* Возводит матрицу a в степень n в кольце r | |
*/ | |
function power(a, n, r){ | |
'use strict'; | |
/** | |
* Возвращает нулевую квадратную матрицу рамера s | |
*/ | |
// var makeNull = (s) => new Array(s).fill(new Array(s).fill(0)); | |
function makeNull(s) { | |
var r = []; | |
for (var i = 0; i < s; i++) { | |
r[i] = []; | |
for (var j = 0; j < s; j++){ | |
r[i][j] = 0; | |
} | |
} | |
return r; | |
} | |
/** | |
* Перемножает две квадратные матрицы | |
*/ | |
function p(a, b) { | |
var r = makeNull(a.length); | |
for (var i = 0; i < a.length; i++) { | |
for (var j = 0; j < a.length; j++) { | |
for (var k = 0; k < a.length; k++) | |
r[i][j] += a[i][k] * b[k][j]; | |
} | |
} | |
return r; | |
} | |
/** | |
* Получение элемена сравнимого с a в кольце r | |
*/ | |
function getComparable(m) { | |
for (let i = 0; i < a.length; i++) { | |
for (let j = 0; j < a.length; j++) { | |
while (m[i][j] < 0) { | |
m[i][j] += r; | |
} | |
while (m[i][j] >= r) { | |
m[i][j] -= r; | |
} | |
} | |
} | |
return m; | |
} | |
var s = makeNull(a.length); | |
for (var i = 0; i < a.length; i++){ | |
s[i][i] = 1; | |
} | |
// В этот момент s является единичной матрицей | |
// console.log(a); | |
// console.log('in degrees ' + n); | |
while (n) { | |
if (n%2 === 0) { | |
a = getComparable(p(a, a)); | |
n /= 2; | |
} else { | |
s = getComparable(p(s, a)); | |
n--; | |
} | |
} | |
return s; | |
} | |
console.log(power([ | |
[533, 50], | |
[940, 70] | |
], Math.pow(10, 9), 983)[1][0]); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment