[英]Finding Modulus of multiplication of two very large number with a very large number
在編程練習中,我需要找出一個非常大的模數,例如2提高到500000(輸入中的最大數)的冪,其中1000000007作為其他計算的一部分。
我可能必須找出很多次,一種方法是創建一個5,00,000的數組。 但是它將阻塞大量的內存,所以我想知道還有更好的方法嗎?
這是使用重復平方算法的絕佳時機。 您可以如下計算x y (模modulus
):
int repeatedSquaring(int x, int y, int modulus) {
if (y == 0) return 1;
int val = repeatedSquaring(x, y / 2);
val = (val * val) % modulus;
if (y % 2 == 1) {
val = (val * x) % modulus;
}
return val;
}
該算法僅需要O(log y)乘法和模來計算。 此外,每個中間值最多為modulus
2 ,因此,如果模數不太大,則可以使用plain int
進行計算。
希望這可以幫助!
像這樣簡單的東西怎么樣?:
#include <stdio.h>
unsigned long PowMod(unsigned long p)
{
unsigned long prod;
if (p == 0)
return 1;
if (p == 1)
return 2;
prod = PowMod(p / 2);
prod = (unsigned long long)prod * prod % 1000000007ULL;
if (p % 2 != 0)
{
prod = prod * 2 % 1000000007ULL;
}
return prod;
}
int main(void)
{
printf("%lu\n", PowMod(3));
printf("%lu\n", PowMod(4));
printf("%lu\n", PowMod(30));
printf("%lu\n", PowMod(31));
printf("%lu\n", PowMod(32));
printf("%lu\n", PowMod(33));
return 0;
}
輸出( ideone ):
8
16
73741817
147483634
294967268
589934536
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.