zoukankan      html  css  js  c++  java
  • 快速幂模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
  • 相关阅读:
    业务逻辑安全之登陆认证模块
    linux下的tcpdump
    wirshark使用(二)
    wirshark 使用(一)
    MVC框架的代码审计小教程
    记一次发卡网代码审计
    HTML知识点(一)
    jQuery基础、效果和事件
    Ajax知识(二)
    jQueryHTML和插件、display和overflow和visibility的区别
  • 原文地址:https://www.cnblogs.com/Guhongying/p/9850728.html
Copyright © 2011-2022 走看看