A^B mod C
假設0<a,b,c<n
1.使用最原始的方法是把A^B先求出來,最後mod C求出值。
但是這種方法效率低,時間複雜度為O(b)而且a^b必須小於n才不會溢出。具有很大的局限性。
2.改進方法一:
假設A>C,那麼存在A^B mod C = (A mod C)^(B mod C)
這種情況用在A>C的情況下非常適用,但是當A<C的時候,就無法使用。
所以最壞的情況下,還是需要a^b必須小於n才不會溢出。此法也不合適。
改進方法二:
我們可以把A^B中的B分解為(2a+2b+2c...)
例如12^36 = 12^(22+25)
12^36 = 12^22*12^25
12^36 mod 35 = (12^22 mod 35)*(12^25 mod 35) mod 35
我們可以知道
(12^21 mod 35)
(12^22 mod 35)
(12^23 mod 35)
(12^24 mod 35)
(12^25 mod 35)
之間存在著以下關係
(12^2n mod 35) = (12^2n-1 mod 35)*2mod 35
所以以上那些式子都可以依次求得。
最後查表實現(12^22 mod 35)*(12^25 mod 35) mod 35
但是這種方法還存在一個弊端,就是A*A必須要<n,否則也會造成結果的溢出。
雖然這種方法比上面的2種方法範圍都大,但是還是不能滿足我們的要求。
改進方法三:
既然上面一步溢出的臨界值是A*A<n。
那我們就想辦法把A*A再分解,讓最後A*A mod C的值小於n
這邊需要提到一個公式A*B mod C = (A mod C)*(B mod C)
我們假設A*A中,第一個A為X,第二個A為Y,而且必有
Y = 2a+2b+2c...
所以X*Y = X*(2a+2b+2c...)
所以X*Y mod C = ((((X*2a mod C) + (X*2b mod C)) mod C) + (X*2c mod C)) mod C......
由於我們可以知道
(X^21 mod C)
(X^22 mod C)
(X^23 mod C)
(X^24 mod C)
(X^25 mod C)
也存在以下關係
(X^2n mod C) = (X^2n-1 mod C)*2mod C
所以以上那些式子都可以依次求得。
最後X*X mod C的值也可以求得。
最後使用 改進方法二 就可以求得A^B mod C了。
此法由於把A再次進行了分解。所以範圍又進一步的擴大了。
此法的範圍可以達到當A*2<n的時候,都可以求得。