快速幂模n运算
模运算里的求幂运算,比如 5^596 mod 1234, 当然,直接使用暴力循环也未尝不可,在书上看到一个快速模幂算法
大概思路是,a^b mod n ,先将b转换成二进制,然后从最高位开始(最高位一定为1),如果遇到一个b[i]=0,则那么此时的结果就是b[i+1]时的结果的平方,若果b[i]=1,则结果是b[i+1]时的结果的平方再乘一个a
从b的角度理解,比如,二进制为 100 ,此时b=4,当下一位为0时,也就是 1000,即b=8,则此时的a^8=(a^4)^2 ,若果下一位为1,即二进制为 1001,b=9,则结果为 a^9=((a^4)^2)*a
代码如下:
1 #快速幂模n运算 2 3 def bits(b): 4 k=[] 5 while b: 6 if b%2!=0: 7 k.append(1) 8 else: 9 k.append(0) 10 b>>=1 11 k.reverse() #对于List等Sequence等类型的变量,比如此处的List变量,其内置函数reverse,是直接操作变量本身,调用reverse后,变量本身的值就是reverse后的值了,所以不能出现:kk=k.reverse()这样的操作 12 return k 13 14 def quickmod(a,b,n): #a^b mod n 15 f=1 16 k=bits(b) 17 for i in range(len(k)): 18 f=(f*f)%n 19 if k[i]: 20 f=(f*a)%n 21 return f