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
  • 相关阅读:
    二维几何前置知识
    点分治学习笔记
    $fhq-treap$学习笔记
    对拍使用方法
    2021.2.18-2021.5.18 三个月后端开发实习的学习路径
    蓝桥杯常考算法 + 知识点
    Linux
    Linux
    Intern Day112
    Linux上编译运行C/C++程序
  • 原文地址:https://www.cnblogs.com/Guhongying/p/9850728.html
Copyright © 2011-2022 走看看