如何找到(2 ^ n)%p的结果?

时间:2012-01-05 10:44:15

标签: modulus

我被困在一个问题,要求找到(2 ^ n)%p其中n是10 ^ 36的非常大的数量,p是素数。如何快速地做到这里???这里^表示功率 我遇到了这个算法,但它给出了堆栈溢出,因为10 ^ 36非常大

double power(double a,double b,int mod)
{
if (b==0)
return 1;
else if(b%2==0)
return square(power(a,b/2,mod))%mod;
else return power(a,b-1,mod)%mod;
}

他们是否有其他方式或改进?

2 个答案:

答案 0 :(得分:1)

你可以使用分而治之的方法。

这是基本的想法:

2 ^ 8 =(2 ^ 4)^ 2 2 ^ 4 =(2 ^ 2)^ 2

因此,您需要计算2 ^ 2一次并将其平方以得到2 ^ 4。然后Square得到2 ^ 8,等等。

如果n是2的幂,则证明的情况非常有效。但是,有可能将这样的权力分解为2或3个子问题。

例如,如果n = 20,则会破坏为(2 ^ 10)^ 2。 如果n = 21,则会破坏为(2 ^ 10)^ 2 * 2.

因此,根据功率的奇数和偶数值,您可以将其溶解到组件中。

希望插图清楚。

答案 1 :(得分:-1)

在这种情况下, Python 可以为您提供帮助。在python中你不需要关心数据类型的范围,你只需要给出数据值python就会自动调整变量的数据类型。