矩阵快速幂

矩阵快速幂,是在快速幂的基础上运用矩阵乘法优化程序,典型例子有数据范围较大的斐波那契数列

假设是n*s的矩阵乘以s*m的矩阵,得到n*m的矩阵

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
struct Matrix
{
int m[maxn][maxn];
}ans,res;//定义矩阵结构体

//矩阵乘法

Matrix Mul(Matrix A,Matrix B,int n)//A、B分别代表两个矩阵,n是矩阵的行和列,这里A、B矩阵都是方阵,当然如果不是方阵补零也不影响结果,不是方阵一样可以得到正确结果
{
Matrix tmp;//定义矩阵
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
tmp.m[i][j]=0;//矩阵初始化
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.m[i][k]*B.m[k][j];//这里是矩阵乘法的定义:Ci j=Ai 1*B1 j+Ai 2*B2 j+.......+Ai s*Bs j。并且三层循环在这里,不管是先循环哪一个后循环哪一个,对结果是没有影响的,所以不必太在意顺序
return tmp;
}

//求矩阵res的n次幂
void quickpower(int N,int n)//快速幂,N是指数,n是行列
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(i==j) ans.m[i][j]=1;将矩阵对角线上的值都变为1,其他位置赋值0,将它变成单位矩阵,因为对于任何矩阵,乘以单位矩阵的值等于它本身,也就是不变
else ans.m[i][j]=0;
}
while(N)
{
if(N&1)//如果指数是奇数,那么就应该多乘一次
ans=Mul(ans,res);
res=Mul(res,res);//变成平方,快速幂,懂就行了
N=N>>1;//N/2
}//快速幂的代码
}

 

其实就是矩阵乘法加上快速幂,没有什么难的,斐波那契数列的例子紧随其后

posted @ 2020-03-22 23:38  徐明拯  阅读(222)  评论(0编辑  收藏  举报