• 快速幂模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
  • 相关阅读:
    EhCacheManager篇
    CXF篇
    soap篇
    动态代理篇
    springmvc中使用interceptor拦截器
    hibernate用注解配置实体类的映射
    项目随笔之springmvc中freemark如何获取项目路径
    项目随笔-------第一篇
    springMVC前台传入字符串日期参数转化
    js获取当前日期方法
  • 原文地址:https://www.cnblogs.com/Guhongying/p/9850728.html
Copyright © 2020-2023  润新知