python快速幂算法解决大数取模

Posted Afololer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python快速幂算法解决大数取模相关的知识,希望对你有一定的参考价值。

1、前置性质

模运算的性质 [(a mod n)×(b mod n)] mod n = (a×b) mod n

指数可以拆分成二进制的形式,如9拆分成 1001

根据二进制的计算,1001 = ((1*2+0) *2 +0) *2+1 = 9

2、例子

那么5^9 mod 8 的计算可以分解为

5^1 mod 8 * 5 ^1 mod 8 * 5^2 mod 8 * 5^4 mod 8 * 5^1 mod 8 

初始化d为0 意为5^0 每n轮计算的d为5^(n/2)次方

算5^1 mod 8 时 因为这时候9转化为2进制最高位为1

5^1 mod 8 = dxd mod 8 * d*a mod 8 

算5^2 mod 8 时 这时候取第二位 0

5^2 mod 8 = dxd mod 8    d*a mod 8(因为是0,不用计算) 

3、python代码实现

def tobinary(a): #转化为二进制
    d = []
    c = a
    while(c!=0):
        b = c % 2
        c = int(c/2)
        d.append(b)
    return d
def quickmi(m,e,n): #快速幂算法
    f = tobinary(e)
    c = 0
    d = 1
    while(c!=e):
        c = 2*c
        d = (d*d)%n
        g = f.pop()
        if(g ==1):
            c=c+1
            d=(d*m)%n
    return d

python内置的pow也可以实现大数幂取膜

4、测试用例

print(quickmi(1612050119,1757316971,5515596313))
print(pow(1612050119,1757316971,5515596313))

输出结果

在这里插入图片描述

以上是关于python快速幂算法解决大数取模的主要内容,如果未能解决你的问题,请参考以下文章

快速幂取模和快乘取模

快速幂+大数取模

快速幂+大数取模

快速幂取模算法

快速幂介绍及其模板

EOJ3134. 短信激活码(大数幂取模)