快速幂和矩阵快速幂

本文详细介绍了快速幂的基本原理及其在编程中的应用,并通过示例代码进行了解释。此外,还介绍了矩阵快速幂的概念及其实现方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

快速幂

快速幂原理:就是把指数转化成二进制,并进行分解。

(参考资料:https://www.cnblogs.com/CXCXCXC/p/4641812.html

举例:

\large 11_{(10)}=1011_{(2)}\rightarrow a^{11}=a^{2^0+2^1+2^3}\rightarrow a^{11}=a^{2^0}\cdot a^{2^1}\cdot a^{2^3}

算法原理其实和所想的那样大同小异,都是利用a的n次方等于n个a相乘。

int poww(int a, int b) {
    int ans = 1, base = a;
    while (b) {
        if (b & 1)
            ans *= base;
            base *= base;
            b >>= 1;
    }
    return ans;
}

其实想一想,每次操作是移除掉二进制数的最后一位(b>>=1),然后每一位的2是指数递增,所以base*base每一次操作都得有(第一次是1*a=a^1,第二次就是a*a=a^2,而第三次就是a^2*a^2=a^4,奇妙),然而,答案并不是所有的base*base都需要,当然只有二进制位上是1的那里才需要(也就是&1操作的意义)。所以从最后一个式子可以看出来,a的指数操作是每一轮都要进行,而点乘操作在if条件满足情况下才进行。

矩阵快速幂

和快速幂意义,只不过,乘法变成了矩阵乘法。

手写一个O(n^3)的矩阵乘法就可以!

(参考资料:https://blog.youkuaiyun.com/wust_zzwh/article/details/52058209

const int N=10;
int tmp[N][N];
void multi(int a[][N],int b[][N],int n)
{
    memset(tmp,0,sizeof tmp);
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
        for(int k=0;k<n;k++)
        tmp[i][j]+=a[i][k]*b[k][j];
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
        a[i][j]=tmp[i][j];
}
int res[N][N];
void Pow(int a[][N],int n)
{
    memset(res,0,sizeof res);//n是幂,N是矩阵大小
    for(int i=0;i<N;i++) res[i][i]=1;
    while(n)
    {
        if(n&1)
            multi(res,a,N);//res=res*a;复制直接在multi里面实现了;
        multi(a,a,N);//a=a*a
        n>>=1;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值