您的位置:首页 > 其它

矩阵快速幂--最基础的算法,最详细的注释

2017-09-03 22:31 274 查看
整理知识啦

矩阵运算是数学和工程上很常用的方法

计算又是比较耗时的,所以能快一点是一点吧

那矩阵快速幂一般用来干什么呢

emmm 递推变换的时候吧(大概

比如有人问你第五百六十万七千八百三十二个斐波那契数是多少

如果直接递推的话你的计算机小伙伴一时半会儿可能也不知道

但如果用矩阵快速幂也就循环个十几二十次,快到没什么感觉

至于为什么矩阵自乘能算递推,请看线性代数,当然这种递推仅限a+b+c这种

矩阵快速幂的原理就和普通快速幂一样,单个项变成了矩阵而已

上代码#include<stdio.h>
#define N 32 //矩阵大小
struct co{
int u

;//可添加信息
};
struct co quit,part; //传递信息 part输入 quit输出
int matrix_power(int n,int x,int y); //n为阶数 x为指数 y为取余数
int main(){
//设置初始矩阵和阶数啥的
return 0;
}
int matrix_power(int n,int x,int y){
struct co a,b,c,d; //倒换操作
int i,j,k,t;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
d.u[i][j]=part.u[i][j]; //接受根矩阵
for(i=0;i<n;i++)
for(j=0;j<n;j++){ //初始化中间矩阵
if(i==j) b.u[i][j]=1;
else b.u[i][j]=0;
c.u[i][j]=0;
a.u[i][j]=0;
}
for(;x;x>>=1){ //利用二进制 快速幂
if(x&1){ //个位为1 矩阵相乘
for(k=0;k<n;k++)
for(i=0;i<n;i++)
for(j=0;j<n;j++)
c.u[i][j]+=b.u[i][k]*d.u[k][j];
for(i=0;i<n;i++)
for(j=0;j<n;j++){ //中间变换
if(c.u[i][j]>y) b.u[i][j]=c.u[i][j]%y;
else b.u[i][j]=c.u[i][j];
c.u[i][j]=0;
}
}
for(k=0;k<n;k++)
for(i=0;i<n;i++)
for(j=0;j<n;j++) //随指数同步
a.u[i][j]+=d.u[i][k]*d.u[k][j];
for(i=0;i<n;i++)
for(j=0;j<n;j++){ //中间变换
if(a.u[i][j]>y) d.u[i][j]=a.u[i][j]%y;
else d.u[i][j]=a.u[i][j];
a.u[i][j]=0;
}
}
for(i=0;i<n;i++)
for(j=0;j<n;j++){ //输出最终矩阵
quit.u[i][j]=b.u[i][j];

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: