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
  • 相关阅读:
    day7
    11.3NOIP模拟赛
    codeforces 880E. Maximum Subsequence(折半搜索+双指针)
    11.2NOIP模拟赛
    bzoj1483: [HNOI2009]梦幻布丁(vector+启发式合并)
    day9
    codeforces 1006 F(折半搜索)
    codeforces 28D(dp)
    P2210 Haywire(A*)
    4800: [Ceoi2015]Ice Hockey World Championship(折半搜索)
  • 原文地址:https://www.cnblogs.com/Guhongying/p/9850728.html
Copyright © 2011-2022 走看看