C/C++大数计算

Psy*_*ust 4 c c++ math numbers modulo

我正在尝试在C程序中计算以下数字:

result = (3 * pow(2,500000000) - 2 ) % 1000000000
Run Code Online (Sandbox Code Playgroud)

2的力量是大到正确处理的方式=>我的印象是我可以使用模数在许多步骤中拆分计算以减小结果大小.有人有这样做的策略吗?还有其他想法吗?

Thanx提前

马努

Dan*_*her 9

最简单的方法是通过在每个步骤中通过模量减少重复的平方来取幂.

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;
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用它来计算

result = (3*mod_pow(2,500000000,1000000000) - 2) % 1000000000;
Run Code Online (Sandbox Code Playgroud)

该函数假设模数的平方不超过64位范围.对于较大的模量,事情更复杂.