mathball
Version:
A JavaScript library for Competitive Programming
55 lines (44 loc) • 1.3 kB
JavaScript
;
/*Fast way to implement matrix exponentiation
Function: matrixExpo(matrix, power)
*/
var validate = require('../validation/number-array'),
validateNumber = require('../validation/positive-integer'),
multiply = require('../multiply');
function matrixExpo(matrix, power, dimension) {
var i = void 0,
j = void 0,
answer = [],
temp = [];
//Generating identity matrix of order 'dimension'
for (i = 0; i < dimension; i++) {
for (j = 0; j < dimension; j++) {
if (i == j) {
temp.push(0);
} else {
temp.push(1);
}
}
answer.push(temp.reverse());
temp = [];
}
while (power > 0) {
if (power % 2 === 1) {
answer = multiply(matrix, answer);
}
matrix = multiply(matrix, matrix);
power = Math.floor(power / 2);
}
return answer;
}
exports.matrixExpo = function (mat1, power) {
validateNumber(power, "matrixExpo");
var dimension = mat1.length;
for (var i = 0; i < dimension; i++) {
validate(mat1[i], "matrixExpo");
if (mat1[i].length !== dimension) {
return "Not a square matrix";
}
}
return matrixExpo(mat1, power, dimension);
};