Skip to content

Instantly share code, notes, and snippets.

@skhokhlov
Last active December 17, 2015 14:31
Show Gist options
  • Save skhokhlov/613858eeda02d4658bed to your computer and use it in GitHub Desktop.
Save skhokhlov/613858eeda02d4658bed to your computer and use it in GitHub Desktop.
/**
* Возводит матрицу 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