1. 普通的计算方式
先计算a
b
,再取模,这样很容易益处,在实际中基本不可行,因为幂次很大可能会超过计算机的数值范围。
2. 同余公式
设c是a除以m的余,即c=a-k*m,也可用同余表达式a≡c (mod m)表示,则可以证明:
2.1 同余性质1:
对任意整数b
ab≡bc (mod m)
证明:
c=a mod m <=> a = km +c
=>ab = k*b*m+bc => ab mod m = (k*b*m + bc)mod m = bc mod m
(1)式等价于:ab mod m =b* (a mod m) mod m,这非常适合递归计算。
2.2 同余性质2
a≡c (mod m) => a2≡c2 (mod m)--------------(2)
证明:
a=k*m+c =>a2=(km)2+2ckm+c2 =>a2 mod m =c2 mod m,即(2)成立
3.Montgomery算法
对任意的整数b都可表示为:
- n表示b的实际二进制位
- bi表示该位是0或1
- 因此,ab可表示为:
根据同余性质一
python代码
def mypow(a,n,m):
result = 1
base = a
while n > 0:
if n & 1==1:
result = (result*base) % m
base = (base*base) %m
n >>=1
return result
参考资料:http://blog.youkuaiyun.com/chen77716/article/details/7093600