矩阵快速幂--最基础的算法,最详细的注释
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;
}
矩阵运算是数学和工程上很常用的方法
计算又是比较耗时的,所以能快一点是一点吧
那矩阵快速幂一般用来干什么呢
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;
}
相关文章推荐
- 快速幂+叉乘计算--最基础的算法,最详细的注释
- 字典树(链式+数组模拟)--最基础的算法,最详细的注释
- 基础数论算法(八) 矩阵乘法与线性齐次递推公式的快速求值
- 基础算法 快速排序
- 蓝桥杯 算法提高 递推求值 【矩阵快速幂】
- 发布一个Java写的俄罗斯方块源码 算法简单(300行) 注释详细
- 算法之矩阵快速幂
- Vue.js 2.0 详细教程 快速上手 - 基础篇
- SAP CRM BOL编程基础,代码+详细注释
- 基础算法----快速排序
- 算法——矩阵快速幂 求第N个斐波那契数
- 算法基础(六):广度优先探索迷宫路径(队列实现!)—超详细版!
- logistic回归算法详细分析与Python代码实现注释
- 8点算法计算基础矩阵(计算机视觉)
- 算法基础:排序(三)——快速排序——Python实现
- FOCR:快速最优通道布线算法(详细)
- 基础算法之四--排序:之快速排序
- 矩阵相乘的快速算法
- 发布一个Java写的俄罗斯方块源码 算法简单(300行) 注释详细
- DSP中的基础算法和模型的详细解析