循环矩阵乘

仅供个人查看,没有验证其正确性。

循环矩阵快速幂是可以通过一个一维数组来完成的。(我之前一直用二维数组,比较好理解)

比如说一个$5 \times 5$的循环矩阵,再乘一个$5 \times 5$的矩阵,

        $\times$                      $=$           

第一个用数组$a$表示,第二个用数组$b$表示,第三个用数组$c$表示,

那么我们把$a$和$b$相乘得到的$c$仍然是循环矩阵。

把所有情况都列出来:

根据矩阵乘定义:$c[1]=a[1][1]*b[1][1]+a[1][2]*b[2][1]+a[1][3]*b[3][1]+a[1][4]*b[4][1]+a[1][5]*b[5][1]$,

根据上面的图,把它们都编号($"\times"$前边的是$a$,后边的是$b$),那么:

$c[1]=1\times 1+2\times 5+3\times 4+4\times 3+5\times 2$,

$c[2]=1\times 2+2\times 1+3\times 5+4\times 4+5\times 3$

$c[3]=1\times 3+2\times 2+3\times 1+4\times 5+5\times 4$

$c[4]=1\times 4+2\times 3+3\times 2+4\times 1+5\times 5$

$c[5]=1\times 5+2\times 4+3\times 3+4\times 2+5\times 1$

这样就发现规律了吧,这东西也是循环的,$c[i]=\sum \limits_{j=1}^n a[j]\times b[(i-j+n)\% n+1]$。

这样就能开一维数组存了。

丑陋的伪代码:

for(Reg int i=1;i<=n;++i)
    for(Reg int j=1;j<=n;++j)
        c[i]+=a[j]*b[(i-j+n)%n+1];

 

转载于:https://www.cnblogs.com/Milk-Feng/p/11219062.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值