标准特技用于计算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