快速冪取模


與快速冪類似. http://www.cnblogs.com/7hat/p/3387267.html

只是在每次運算的時候要作mod m運算,利用的是模運算規則 (a * b) mod m = ((a mod m) * (b mod m)) mod m.

因為python直接支持大整數運算,所以這次用python來做,檢驗結果的對錯。從另外一個角度上看,用快速冪取模的方法比直接求冪再取模的方法要快,因為將乘數限制在一定的范圍。

"""
e = e0*(2^0) + e1*(2^1) + e2*(2^2) + ... + en * (2^n)

b^e = b^(e0*(2^0) + e1*(2^1) + e2*(2^2) + ... + en * (2^n))
    = b^(e0*(2^0)) * b^(e1*(2^1)) * b^(e2*(2^2)) * ... * b^(en*(2^n)) 

b^e mod m = ((b^(e0*(2^0)) mod m) * (b^(e1*(2^1)) mod m) * (b^(e2*(2^2)) mod m) * ... * (b^(en*(2^n)) mod m) mod m
"""
def fastExpMod(b, e, m):
    result = 1
    while e != 0:
        if (e&1) == 1:
            # ei = 1, then mul
            result = (result * b) % m
        e >>= 1
        # b, b^2, b^4, b^8, ... , b^(2^n)
        b = (b*b) % m
    return result
B = 33
E = 1024331
M = 783
print fastExpMod(B, E, M)
print B**E % M
Python

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM