发霉日记 Day1

倾然丶 夕夏残阳落幕 提交于 2020-01-31 00:32:21

今日目标

  1. 矩阵快速幂
  2. 完成矩阵快速幂模板
  3. 矩阵快速幂的相关运用
  4. 刷题

矩阵快速幂

矩阵快速幂是将矩阵乘法和快速幂进行结合,对递推式进行快速运算的一种方法。

矩阵乘法

在这里插入图片描述

  1. 假如矩阵a有m列s行,矩阵b有s列n行,那么他们的乘积是一个m行n列的矩阵。
  2. 如图所示,矩阵a有2行3列,矩阵b有3行2列,那么矩阵c就是一个2*2的矩阵。
  3. 矩阵乘法的规则就是a矩阵的m行与b矩阵的n列分别相乘。
  4. 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=A
B Cn-1=A
Bn-1 C=A
Cn-1
所以 C=A
A*Bn-1=(A^n)*B
矩阵快速幂的运用即是对常数矩阵使用快速幂算法达到递推的效用。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!