C++快速幂函数

该快速幂函数用于求 a b % p a^b\%p ab%p 的结果,既用来计算 a a a b b b次幂取模 p p p的结果。
函数原理:
(利用费马小定理)1
依次判断指数 b b b的二进制位有哪些是 1 1 1。如果二进制最后一位是 1 1 1,就将最终答案 a n s ans ans乘上 a a a,结束判断后再将 a a a平方,同时将 b b b右移 1 1 1位,直到 b b b等于 0 0 0为止。
注意:在每一次计算之后,都要取模 p p p


函数代码:

long long fast_power(long long a, long long b, long long p)
{ // 快速幂函数,求解a^b%p
    long long ans = 1;
    while (b) // 直到b等于0停止循环
    {
        if (b & 1) // 如果二进制最后一位是1
            ans = ans * a % p; // 将最终答案ans乘上a
        a = a * a % p; // 将a平方
        b >>= 1; // 将b右移1位
    }
    return ans;
}

  1. 费马小定理(Fermat’s little theorem)是数论中的一个重要定理,在 1636 1636 1636年提出。如果 p p p是一个质数,而整数 a a a不是 p p p的倍数,则有 a ( p − 1 ) ≡ 1 ( m o d   p ) a^{(p-1)}≡1(mod\ p) a(p1)1(mod p)
    跳转百度百科 ↩︎

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值