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)*2 mod 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)*2 mod C
所以以上那些式子都可以依次求得。
最后X*X mod C的值也可以求得。
最后使用 改进方法二 就可以求得A^B mod C了。
此法由于把A再次进行了分解。所以范围又进一步的扩大了。
此法的范围可以达到当A*2<n的时候,都可以求得。