模幂运算
模幂运算计算 ,其中 、 是整数。即使 很大,也不必先造出巨大的整数 :若 ,则 ,每次相乘后都可立即取余。反复平方把所需乘法次数从与 同阶降到与其二进制位数同阶。
手算十三次幂
计算 。由 ,依次平方得 、、。因此 。每一步只保存余数,不保存 本身。
从二进制展开到算法
维护不变量 ,起始 。若 为奇数,把一份 乘进 ;随后令 、。若 ,;若 ,先把 放进 再用同一式,故不变量每轮保持。 时得到 。
Python 3
def pow_mod(base: int, exponent: int, modulus: int) -> int:
if exponent < 0 or modulus < 1:
raise ValueError("require exponent >= 0 and modulus >= 1")
result = 1 % modulus
base %= modulus
while exponent:
if exponent % 2:
result = (result * base) % modulus
base = (base * base) % modulus
exponent //= 2
return result
assert pow_mod(7, 13, 11) == 2
assert pow_mod(5, 0, 7) == 1
assert pow_mod(3, 4, 1) == 0循环执行 次模乘法;大整数乘法本身的位复杂度还取决于 的位数。负指数需要 在模 下有逆元,即 ,此页算法故意拒绝它。普通反复平方的执行分支会泄露指数位信息;密码协议应使用经过专门审查的实现,不能把上述教学代码直接当作安全加密库。