当前位置:网站首页>新瓶陈酒 --- 矩阵快速幂
新瓶陈酒 --- 矩阵快速幂
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;
}
边栏推荐
猜你喜欢
随机推荐
ES6-03-解构赋值
Openssl一键自签证书
LXC的安装与配置使用
windows下mysql忘记密码登录,并创建用户
Dart入门
Oracle入门 12 - Linux 磁盘分区及LVM实战
对称加密和非对称加密
深度解析 z-index
MySQL官网8.0.17 安装教程(适合离线安装)
Oracle入门 09 - Linux 文件上传与下载
等待,信息打印,浏览器操作,键盘事件
FTP服务与配置
Hook API
网盘程序 ZFile安装
项目-log4j2排查问题
Debian 搭建 WireGuard 服务端
TypeScript进阶
使用powerDesigner反向工程生成Entity
Debian 10 dhcp 服务配置
青龙面板从零搭建教程