標準特技用於計算a^p modulo m
是使用連續的正方形。這樣做是爲了擴大p
成二進制,說
p = e0 * 2^0 + e1 * 2^1 + ... + en * 2^n
其中(e0,e1,...,en)
是二進制(0
或1
)和en = 1
。然後用指數的法律得到以下擴張a^p
a^p = a^(e0 * 2^0 + e1 * 2^1 + ... + en * 2^n)
= a^(e0 * 2^0) * a^(e1 * 2^1) * ... * a^(en * 2^n)
= (a^(2^0))^e0 * (a^(2^1))^e1 * ... * (a^(2^n))^en
記住,每個ei
要麼0
或1
,所以這些只是告訴你採用何種數字。因此,您需要的唯一計算是:
a, a^2, a^4, a^8, ..., a^(2^n)
您可以通過平方先前的項來生成此序列。既然你想計算答案mod m
,你應該首先進行模運算。這意味着你要計算以下
A0 = a mod m
Ai = (Ai)^2 mod m for i>1
答案是那麼
a^p mod m = A0^e0 + A1^e1 + ... + An^en
因此計算需要log(p)
的廣場,並呼籲mod m
。
我不能肯定是否有對階乘模擬,而是一個好地方開始尋找將在Wilson's Theorem。另外,您應該對進行測試,在這種情況下n! mod m = 0
。
的[快速的方法來計算n個可能的重複! mod m其中m是素數?](http:// stackoverflow。COM /問題/ 9727962 /快的方式對計算正模 - 間 - 其中 - 間是素數) – Tacet 2014-11-11 00:14:07