如何计算 2 的大数次方模另一个大数?
How to calculate 2 to the power of a large number modulo another large number?
M = 115792089237316195423570985008687907853269984665640564039457584007908834671663
296514807760119017459957299373576180339312098253841362800539826362414936958669 % M = ?
可以在Python中计算吗?或者还有其他方法吗?
为了计算结果,三参数 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))
M = 115792089237316195423570985008687907853269984665640564039457584007908834671663
296514807760119017459957299373576180339312098253841362800539826362414936958669 % M = ?
可以在Python中计算吗?或者还有其他方法吗?
为了计算结果,三参数 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))