C++快速幂

C++快速幂

核心思想 升底降幂

核心代码

int qmi(int m, int k, int p)
{
    int res = 1 % p, t = m;
    while (k)
    {	
    	if (k&1) res = res * t % p;
        t = t * t % p;
        k >>= 1;
    }
    return res;
}

代码解析

由于快速幂力求快速, 因此涉及位运算

n&1

&符号代表按位与,1的二进制最后一位为1,其余为零。如果一个数为奇数,那么最后一位必为1,其余位必为0,所以得出结果为1。如果是偶数的话,最后一位必然为0,其余位与0与运算必为0,所以结果为0,这样就可以起到判断奇数偶数的效果。

k >>= 1

全部位右移一位,最低位直接舍去。
实际上就是除以2

int qmi(int m, int k, int p)
{
    int res = 1 % p, t = m;
    while (k)
    {	
    	//若k为奇数, 无法继续降幂, 进行计算, 计算后, k变为k-1
        if (k&1) res = res * t % p;
        // 升底数
        t = t * t % p;
        // 降幂数
        k >>= 1;
    }
    return res;
}

实例

2 10 为 例 2^{10}为例 210
快速幂 2 20 = 2 2 ∗ 10 = 4 10 = 4 2 ∗ 5 = 1 6 5 = 16 ∗ 1 6 4 = 25 6 4 = 25 6 2 ∗ 2 = 6553 6 2 = 4294967296 2^{20} = 2^{2*{10}} = 4^{10} =4^{{2*5}}=16^5=16*16 ^4= 256^4 = 256^{2*2}=65536^2=4294967296 220=2210=410=425=165=16164=2564=25622=655362=4294967296
pow暴力 2 ∗ 2 ∗ 2 … … 2 ∗ 2 ∗ 2 2*2*2……2*2*2 222222
原创不易
转载请标明出处
如果对你有所帮助 别忘啦点赞支持哈
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞滕人生TYF

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值