在C/C++中,我該如何計算(a^b)%m
,其中b
不適合64位?換句話說,是否有使用b%m
而不是b
來計算上述值的方法?模塊求冪
是否有任何算法可以計算出上述結果O(log(b))
時間或O(log(b%m))
時間?
在C/C++中,我該如何計算(a^b)%m
,其中b
不適合64位?換句話說,是否有使用b%m
而不是b
來計算上述值的方法?模塊求冪
是否有任何算法可以計算出上述結果O(log(b))
時間或O(log(b%m))
時間?
據Euler's theorem,如果a
和m
互質:
ab mod m = ab mod phi(m) mod m
所以如果b
較大,則可以使用值b % phi(m)
而不是b
。 phi(m)
是Euler's totient function,如果知道m
的素因分解,可以很容易地計算出來。
以這種方式減少了b
的值後,使用Exponentiation by squaring來計算O(log (b % phi(m)))
中的模數求冪。
這似乎更像是一個數學問題。 – 2012-07-12 09:19:41
請嘗試http://math.stackexchange.com/ – 2012-07-12 09:19:58
你的意思是說b不適合64位?通常的指數運算法則是,如果b的下一位被設置,然後進行平方,則通過乘以a來累加結果。對於大b來說這似乎相當容易,大a和m很難。 – tbroberg 2012-07-12 09:35:52