首页 > 编程知识 正文

矩阵乘法快速计算方法,幂的加减法运算法则

时间:2023-05-04 07:43:02 阅读:29735 作者:1664

正常快速乘方:

LLquick_mod(LLa,int n ) { ll sum=1; //由于注意是乘法,所以初始化为1while(n ) (if ) n1 ) /运算符是该数的二进制数的最后一位) { sum=sum*a%mod; //如果这里是1,则总和为现在的a } a=a*a%mod; //无论该比特是0还是1,a都应该平方一波,具体地说,自己理解n=1; //N的二进制向右偏移一位,则等价于n/=2} return sum; }高速乘法:

LLCheng(LLa,ll n ) { ll res=0; a=a%mod; n=n%mod; //先注意单模式,避免大数运算中while(n ) /爆炸。 与高速幂基本相同,唯一的区别是将)变为(if(n1 ) ) RES=(resa ) %mod )。 (a=) a ) %mod; n=1; }返回RES; }

下面是矩阵的:

首先决定矩阵结构体。 我习惯了这样写函数返回类型的时候直接写juzhen就可以了

结构juzhen { ll data [ maxn ] [ maxn ]; (; 矩阵乘法:(优化版本)

Juzhenmul(Juzhena,juzhen b ) { juzhen c; memset(c.data,0,sizeof ) c.data ); for(intk=0; kN; k ) for(intI=0; iN; I ) if (! a.data[i][k] ) continue; //优化在这个位置,如果因为0而指示该位置没有值贡献,则直接跳过,返回for(intj=0; jN; j () if (! b.data[k][j] ) continue; //同上c.data [ I ] [ j ]=[ c.data [ I ] [ j ] a.data [ I ] [ k ] * b.data [ k ] [ j ] % mod ] % mod; //这个地方自己按一下还很容易理解。 这是一个不是一次填满,而是一点一点地追加什么的过程。 目的如上所述} }返回c; }矩阵的快速幂:

Juzhenquick_pow(Juzhena,ll b ) memset ) RES.data,0,sizeof ) RES.data ); for(intI=0,j=0; iNjN; I,j({RES.data[I][j]=1; //首先建立单位矩阵(while(b ) if ) B1 ) RES=mul ) RES,a )。 //与普通高速幂不同,矩阵的高速幂是将数的乘法运算为矩阵和矩阵之间的乘法运算(a=mul(a,a ); b=1; }返回RES; }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。