今日目标
- 矩阵快速幂
- 完成矩阵快速幂模板
- 矩阵快速幂的相关运用
- 刷题
矩阵快速幂
矩阵快速幂是将矩阵乘法和快速幂进行结合,对递推式进行快速运算的一种方法。
矩阵乘法
- 假如矩阵a有m列s行,矩阵b有s列n行,那么他们的乘积是一个m行n列的矩阵。
- 如图所示,矩阵a有2行3列,矩阵b有3行2列,那么矩阵c就是一个2*2的矩阵。
- 矩阵乘法的规则就是a矩阵的m行与b矩阵的n列分别相乘。
- a矩阵的行必须b矩阵的列相等才能进行矩阵乘法
快速幂
int QuickPow(int x,int N)
{
int res = x;//底数
int ans = 1;//和
while(N)
{
if(N&1)//判断二进制数最后位是否为1
//如果为1
{
ans = ans * res;//将和与当前底数相乘得到新的和
}
res = res*res;//更新底数
N = N>>1;//将二进制数后移一位,相当于/2
}
return ans;
}
快速幂就是将幂拆解
对于218,根据18的二进制数1 0 0 1 0,我们可以将28拆解为(216)*(22)=218。
矩阵快速幂的实现
矩阵快速幂 = 对矩阵使用快速幂算法
具体实现原理为,矩阵取代快速幂算法中的底数,矩阵乘法取代快速幂中的算数乘法。
矩阵快速幂模板
struct matrix{
int m[maxx][maxx];
}ans,res;//结构体储存矩阵
maxtrix Mul(maxtrix a,maxtrix b,int n)//n代表a,b是几阶方形矩阵
{
matrix tmp;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
tmp.m[i][j]=0;
}
}//初始化一个矩阵tmp
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
for(int k=1;k<=n;k++){
tmp.m[i][j]+=a.[i][k]*b.[k][j];
}
}
} //矩阵乘法
return tmp;
}
void quickPow(int n,int m)
{
for(int i=1;i<=m;i++){
for(int j=1;j<=m;j++){
if(i==j) ans.m[i][j]=1;
else ans.m[i][j]=0;
}
} //将矩阵ans初始化为单位矩阵,因为任何矩阵E与单位矩阵A相乘 A*E=E
//这里单位矩阵的作用与1的作用一样
while(n){
if(n&1){
res=Mul(ans,res);
}
res=Mul(res,res);
N=N>>1;
}
}
拓展
矩阵加法
矩阵快速幂的运用
矩阵快速幂常用于递推公式的快速计算,递推公式在第n项巨大的时候效率低,所以可以运用矩阵快速幂使得计算速度更快。
例:裴波纳契数列的第n项的求解
f(n)=f(n-1)1+f(n-2)1
f(n-1)=f(n-1)1+f(n-2)0
从矩阵的角度分析
因为 C=AB Cn-1=ABn-1 C=ACn-1
所以 C=AA*Bn-1=(A^n)*B
矩阵快速幂的运用即是对常数矩阵使用快速幂算法达到递推的效用。
来源:CSDN
作者:一定是数据的错
链接:https://blog.csdn.net/weixin_45652159/article/details/104113120