模重复平方算法
概述
主要解决指数运算时指数过大的情况。
求解算法
对于 b n ( m o d m ) b^{n} (mod \quad m) bn(modm),将n展开为二进制,ni 表示二进制的第i位,共k-1位。
- 令 ai = 1, bi = b,
- 如果n0 == 1,ai = ai*bi (mod m),否则ai = ai。 b i ≡ b i ∗ b i ( m o d m ) bi \equiv bi * bi(mod \quad m) bi≡bi∗bi(modm)
- 如果n1 == 1,ai = ai*bi (mod m),否则ai = ai。 b i ≡ b i ∗ b i ( m o d m ) bi \equiv bi * bi(mod \quad m) bi≡bi∗bi(modm)
- 以此类推,直到 k-1位,返回ai.
代码实现
# 莫重复平方运算 b^n%m
def square_and_multiply(b, n, m):
bi = b
ai = 1
k = len("{0:b}".format(n))
for i in range(0, k):
if (n >> i & 1) == 1:#判断第i位为1,还是0
ai = ai * bi % m
bi = bi ** 2 % m
return ai