最大化(X ^ Y)%M的值

时间:2014-03-02 17:04:05

标签: algorithm modulus

我知道计算(X ^ Y)%M。现在我的问题是假设我们需要最大化(X ^ i)%M,其中我可以在0到Y和M = 10 ^ 9 +之间变化。什么可以我说iI意味着什么时候最大?

输入将包含X和Y,它可以达到10 ^ 100,我可以通过使用JAVA的BigIntegers或在c ++中使用模块化算法来处理。

1 个答案:

答案 0 :(得分:0)

你应该做的第一件事就是转移

X=X%M
Y=Y%M

注意,10 9 +7远小于10 100 。因此,您不需要大于long的数字。对于中间结果,您将需要很长时间。

您应该依次计算X i

power[0]=X;
long i;
for(i=1; i<Y; i++){
    power[i]=(power[i-1]*X)%M;
    if (power[i] is in power[0..i-1]) {
       i--;
       break;
    }  
}
find max power[0..i];

因为他们会经常重复。

但我不知道10 9 +7是否为素数。如果是,则在达到10 9 +7以下的所有数字之前不会重复。唯一的变化是每10个 9 +7以下的X将设置自己独特的数字重组1..10 9 +7。

在这种情况下,高于10 9 +7的每个Y的最大值将是10 9 + 7-1。至于较小的Y,你必须经常检查,而不检查重复。