来聊聊如何将快速幂的思想应用到矩阵乘法上, 以及矩阵快速幂的应用。
矩阵快速幂
矩阵乘法
在线性代数中学过, n行x列的矩阵A与x行m列的矩阵B是可以相乘的, 结果为一个n行m列的矩阵R, 且
而对于方阵
由此我们可以定义矩阵类型, 并实现矩阵乘法。
c++
#define N 2
struct matrix {
int m[N][N];
matrix() {
memset(m, 0, sizeof(m));
}
matrix operator * (const matrix& b) const {
matrix res;
for (int i = 0; i < N; i ++)
for (int j = 0; j < N; j ++)
for (int k = 0; k < N; k ++)
res.m[i][j] += m[i][k] * b.m[k][j];
return res;
}
};
快速幂思想
快速幂的细节不多说, 简单说快速幂的思想, 就是: 计算
可以发现, 计算
矩阵快速幂
我们可以套用快速幂的模板, 写出矩阵快速幂的代码。
cpp
matrix qpow(matrix a, int p) {
matrix res;
for (int i = 0; i < N; i ++) res.m[i][i] = 1; //单位矩阵
while (p) {
if (p & 1) res = res * a;
a = a * a;
p >>= 1;
}
return res;
}
到此, 矩阵快速幂的实现就完成了。
矩阵快速幂的应用
典中典——斐波那契数列
假设有这样一个问题:对于整数n,
显然常规
斐波那契数列我们都知道存在关系式
将
是否能通过
可以发现
将
由此递推可得
所以我们的主要任务就是算出此系数矩阵的n-1次幂,也就可以用上述提到的矩阵快速幂, 这样即使n是
整数的连续幂次和
对于这样一个问题:求
我们不妨定义
以此我们可以构造得到关系式
问题解决。