我期待实施fermat's little theorem进行主要测试。下面是我写的代码:通过平方运算得到模块求幂的溢出可能性
lld expo(lld n, lld p) //2^p mod n
{
if(p==0)
return 1;
lld exp=expo(n,p/2);
if(p%2==0)
return (exp*exp)%n;
else
return (((exp*exp)%n)*2)%n;
}
bool ifPseudoPrime(lld n)
{
if(expo(n,n)==2)
return true;
else
return false;
}
注:我注意到a(<=n-1)
值作为2
。
现在,数字n可以大到10^18
。这意味着变量exp
可以达到10^18
附近的值。这进一步暗示(exp*exp)
的表达式可能会高达10^36
,从而导致溢出。我如何避免这种情况。
我测试了这个,它运行良好,直到10^9
。我正在使用C++
http://gmplib.org/ – moonshadow 2013-05-07 19:12:36
@moonshadow:请不要。 – 2013-05-07 19:13:58
@ n.m。 GMP有什么问题? – 2013-05-07 19:15:02