当前位置:网站首页>新瓶陈酒 --- 矩阵快速幂
新瓶陈酒 --- 矩阵快速幂
2022-07-31 05:21:00 【im34v】
矩阵
//矩阵的定义
typedef struct Matrix{
int r,c,matrix[MAXN][MAXN];
Matrix(){
r=c=0;
memset(matrix,0,sizeof matrix);
}
}Matrix;
//读入矩阵
void readMatrix(Matrix &n){
cin>>n.r>>n.c;
for(int i=1;i<=n.r;++i){
for(int j=1;j<=n.c;++j)
cin>>n.matrix[i][j];
}
}
//打印输出矩阵
void printMatrix(Matrix n){
cout<<n.r<<" "<<n.c;
for(int i=1;i<=n.r;++i){
for(int j=1;j<=n.c;++j)
cout<<n.matrix[i][j]<<" ";
cout<<endl;
}
}
矩阵乘法
//不带取余的矩阵乘法
Matrix multiMatrix(Matrix a,Matrix b){
Matrix c; c.r=a.r; c.c=b.c;
for(int i=1;i<=a.r;++i)
for(int j=1;j<=b.c;++j)
for(int k=1;k<=a.c;++k)
c.matrix[i][j]+=matrix.a[i][k]*b.matrix[k][j];
return c;
}
矩阵快速幂
//带取余的矩阵乘法
Matrix multiMatrix(Matrix a,Matrix b,int mod){
Matrix c;
c.r=a.r;
c.c=b.c;
for(int i=1;i<=a.r;++i)
for(int j=1;j<=b.c;++j)
for(int k=1;k<=a.c;++k)
//和不带取余的矩阵乘法主要差距在这一语句上
c.matrix[i][j]=(c.matrix[i][j]+(a.matrix[i][k]*b.matrix[k][j])%mod)%mod;
return c;
}
//构造一个单位矩阵
Matrix initMatrix(int n){
Matrix a;
a.r=a.c=n;
for(int i=1;i<=n;i++)a.matrix[i][i]=1;
return a;
}
//矩阵快速幂其实和数字的快速幂没有本质区别,都是采用二分的思路
Matrix quickMultiMatrix(Matrix a,int n,int mod){
Matrix ans=initMatrix(a.r);
Matrix temp=a;
while(n){
if(n&1)ans=multiMatrix(ans,temp,mod);
temp=multiMatrix(temp,temp,mod);
n/=2;
}
return ans;
}
边栏推荐
猜你喜欢
随机推荐
三本毕业,中途转行软件测试,顶着这些光环从月薪7k干到20k+,感觉还不错
一种用QT实现即时通信软件表情发送与接收的思路
群晖NAS配置阿里云盘同步
Webrtc从理论到实践二: 架构
JS函数柯里化
Skywalking UI使用
接口报错no message avaliable
记录一下,今天开始刷剑指offer
ES6-03-解构赋值
client
浅谈音视频开发入门基础及进阶资源分享
简单计算器,单层循环输出乘法表,字符串方法的使用,格式化输出
对van-notice-bar组件定义内容进行设置
NFS共享存储服务
定位元素之后操作对象
LXC的安装与配置使用
TCP/IP协议和互联网协议群
Oracle入门 04 - Vmware虚拟机安装配置
ls的用法
MySQL表的增删改查(1)









