我读过关于费马的素性测试......这很好但是有一个关于卡迈克尔数字的缺陷......它表明它找不到用素数来解释它们。 / p>
我的代码:
bool fermat(long long p,int itr)
{
if(p==1)return false;
for(int i=0;i<itr;i++)
{
long long a=rand()%(p-1)+1;
if(modulo(a,p-1,p)!=1)
return false;
else
return true;
}
}
如何在不解决Carmichael数字问题的情况下发现p
是素数?这个算法的任何修改?
答案 0 :(得分:1)
Miller-Rabin检验的伪代码给出了概率答案,如下所示:
function isPrime(n, k=5)
if n < 2 then return False
for p in [2,3,5,7,11,13,17,19,23,29]
if n % p == 0 then return n == p
s, d = 0, n-1
while d % 2 == 0
s, d = s+1, d/2
for i from 0 to k
x = powerMod(randint(2, n-1), d, n)
if x == 1 or x == n-1 then next i
for r from 1 to s
x = (x * x) % n
if x == 1 then return False
if x == n-1 then next i
return False
return True
使用 k (默认5)随机碱基。如果您事先知道 n 的限制,您可以选择一组给出确定性答案的基础;有关各种 n 的基础列表,请参阅miller-rabin.appspot.com。