主要なテストのためにフェルマーの小定理を実装しようとしています。ここに私が書いたコードがあります:
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)
asの値を取りました2
。
現在、数 n は まで大きくすることができます10^18
。これは、 variableexp
が に近い値に到達できることを意味します10^18
。これは、エクスプレッションがオーバーフローを引き起こす(exp*exp)
ほど高くなる可能性があることをさらに意味します。10^36
どうすればこれを回避できますか。
これをテストしたところ、 まで問題なく動作しました10^9
。私はC++を使用しています