用C ++查找大功率

时间:2013-11-17 04:38:48

标签: c++ exponent largenumber

我有两个数字A和B

其中A和B可以在1 <= A的范围内,B <= 100 ^ 100000

我们怎样才能在C ++中找到A ^ B模数为M的值?

4 个答案:

答案 0 :(得分:3)

在我指出的副本中,我特别喜欢的解决方案是https://stackoverflow.com/a/8972838/1967396(参见那里的归因和参考资料)

为方便起见,我在这里重现了代码(包含在SCCE中 - 但是使用C而不是C ++):

#include <stdio.h>

int modular(int base, unsigned int exp, unsigned int mod)
{
    int x = 1;
    int i;
    int power = base % mod;

    for (i = 0; i < sizeof(int) * 8; i++) {
        int least_sig_bit = 0x00000001 & (exp >> i);
        if (least_sig_bit)
            x = (x * power) % mod;
        power = (power * power) % mod;
    }

    return x;
}

int main(void) {
  printf("123^456mod567 = %d\n", modular(123, 456, 567));
}

太棒了,不是吗。

答案 1 :(得分:2)

使用公式(a*b)mod m = (a*(b (mod m))) (mod m)。有关详细信息,请参阅Wiki页面Modular exponentiation

答案 2 :(得分:1)

另一个解决方案假设您的M是固定的(或者至少需要使用相同的M多次计算A ^ B)。

步骤1:计算Euler's totient function(这需要M的因子分解,因此它非常昂贵)。我们将此号码称为k

由于Fermat's little theorem,您的答案很简单:

(a%M)^(b%k)

现在,除非M是一个大素数,否则大大简化了问题。

答案 3 :(得分:0)

使用下面的代码段可以解决上述问题。 因此,为了确保此代码不会溢出,请检查n * n&lt; = 2 ^ 31。

int modPow(int base, int exp, int n) {

base = base%n;

if (exp == 0)
    return 1;

else if (exp == 1)
    return base;

else if (exp%2 == 0)
    return modPow(base*base%n, exp/2, n);

else
    return base*modPow(base, exp-1, n)%n; 

}