如何对另一个大数取模来计算2的大数幂?

时间:2019-12-08 11:09:12

标签: python math modular modular-arithmetic

M = 115792089237316195570570985008687907853269984665640564039457584007908834671663

2 96514807760119017459957299373576180339312098253841362800539826362414936958669 %M =?

是否可以在Python中进行计算?还是还有其他方法?

1 个答案:

答案 0 :(得分:0)

要计算结果,三个参数pow可以有效地做到这一点,正如@MarkDickinson在评论中提到的那样。

有关其工作原理的简化说明:

  • 要计算2**N mod M,请先找到K = 2**(N//2) mod M
  • 如果N是偶数,则2**N mod M = K * K mod M
  • 如果N为奇数,则2**N mod M = K * K * 2 mod M 这样,就无需计算大量数字。实际上,pow使用更多技巧,更通用,不需要递归。

这是一些演示代码:

def pow_mod(B, E, M):
    if E == 0:
        return 1
    elif E == 1:
        return B % M
    else:
        root = pow_mod(B, E // 2, M)
        if E % 2 == 0:
            return (root * root) % M
        else:
            return (root * root * B) % M

M = 115792089237316195423570985008687907853269984665640564039457584007908834671663
E = 96514807760119017459957299373576180339312098253841362800539826362414936958669

print(pow_mod(2, E, M))
print(pow(2, E, M))