我試圖計算在C程序下面的編號:C/C++大量計算
result = (3 * pow(2,500000000) - 2) % 1000000000
2的冪是方式大,以妥善處理=>我的印象我可以使用模以多個步驟拆分計算以減小結果大小。有人有這樣做的策略嗎?任何其他想法?
Thanx提前
馬努
我試圖計算在C程序下面的編號:C/C++大量計算
result = (3 * pow(2,500000000) - 2) % 1000000000
2的冪是方式大,以妥善處理=>我的印象我可以使用模以多個步驟拆分計算以減小結果大小。有人有這樣做的策略嗎?任何其他想法?
Thanx提前
馬努
最簡單的方法是通過反覆平方通過在每個步驟中的模量減少求冪。
unsigned long long mod_pow(unsigned long long base, unsigned long long exponent, unsigned long long modulus)
{
if (exponent == 0) return 1;
unsigned long long aux = 1;
while(exponent > 1) {
if (exponent % 2 != 0) {
aux *= base;
aux %= modulus;
}
base *= base;
base %= modulus;
exponent /= 2;
}
return (base*aux) % modulus;
}
然後可以用它來計算
result = (3*mod_pow(2,500000000,1000000000) - 2) % 1000000000;
該函數假定該模數的平方不超過64位的範圍。對於更大的模量,事情更復雜。
(exponent%2!= 0)===(指數&1)? –
是的,兩者都測試指數是否是奇數,在純粹的二進制表示中,當且僅當最低有效位被設置時。 –
thanx的快速回復。它工作得很好,實際上非常快! – PsychicLocust
我問這個calc到wolframalpha.com,仍然在等待答案 –
還沒有回覆:) –