矩阵
矩阵的定义和运算可以去看教材或者百度,这里就不叙述了
快速幂
其实思路和数的快速幂一样
先来看看数的快速幂:
比如我们求2的10次方,如果直接2*2*2*2……2的话,需要9次乘法,但如果这样的话:((2*2)(2*2))((2*2)(2*2))*(2*2)的话就只需要4次乘法
代码实现的话就是:
int power(int x,int N)
{
if(N <= 1)
return x;
if(N%2)
return power(x*x,N/2)*x;
else
return power(x*x,N/2);
}
矩阵的快速幂同样也可以用这个思路,因为矩阵的乘法也满足M^(a+b) = M ^ a + M ^b,只不过乘法的具体运算不同罢了
实现代码
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#define mfor(n) for(int i = 0;i < n;i++) for(int j = 0;j < n;j++)
using namespace std;
const int MAX_N = 100 + 1;
struct Matrix {
int n;
int M[MAX_N][MAX_N];
Matrix(int n) : n(n) {
memset(M, 0, sizeof(M));
}
Matrix operator*(Matrix m) {
Matrix q(n);
memset(q.M, 0, sizeof(q.M));
mfor(q.n) for (int k = 0; k < n; k++)
q.M[i][j] += M[i][k] * M[k][j];
return q;
}
void print() {
mfor(n) printf("%d%s", M[i][j], j == n - 1 ? "\n" : " ");
}
};
Matrix power(Matrix M, int N) {
if (N <= 1)
return M;
if (N % 2 == 0)
return power(M * M, N / 2);
else
return power(M * M, N / 2) * M;
}
int main() {
Matrix M(4);
mfor(M.n)M.M[i][j] = 2 * i + j;
Matrix R = power(M, 2 );
R.print();
return 0;
}