矩阵快速幂

假设现在要求 A^n , 最简单的办法就是一个个连乘,可想而知,性能会比较低下。
一个简单的改进就可以减少连乘的次数,比如可以先求出 B = A^2 ,然后求 B^(n/2) 这样就可以减少一半的
连乘次数了。但是有没有更好的办法呢,答案是有。

比如要求 A^156,因为 156 二进制表示为 10011100,所以原式转换为求 (A^4)*(A^8)*(A^16)*(A^128),后面的矩阵都可
根据前面的矩阵来求得,所以就可以大大降低连乘的次数了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Mat operator ^ (Mat a, int k) {
Mat c;
int i, j;
for(i = 0; i < n; ++i)
for(j = 0; j < n; ++j)
c.mat[i][j] = (i == j); //初始化为单位矩阵

for(; k; k >>= 1) {
if(k&1) c = c*a;

a = a*a;
}
return c;
}