快速幂模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
View Code

 

posted @ 2018-10-25 16:29  一去二三浪里小白龙  阅读(929)  评论(0编辑  收藏  举报
//增加一段JS脚本,为目录生成使用