C 如果数字为<;2^63?

C 如果数字为<;2^63?,c,algorithm,C,Algorithm,我读过费马的素性测试。。。这很好,但是卡迈克尔的号码有一个缺陷。。。这表明它无法找到用素数区分它们的方法 我的代码: 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 retu

我读过费马的素性测试。。。这很好,但是卡迈克尔的号码有一个缺陷。。。这表明它无法找到用素数区分它们的方法

我的代码:

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;
  }
}
bool-fermat(长p,int-itr)
{
如果(p==1)返回false;

对于(int i=0;iMiller-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
函数isPrime(n,k=5)
如果n<2,则返回False
对于[2,3,5,7,11,13,17,19,23,29]中的p
如果n%p==0,则返回n==p
s、 d=0,n-1
而d%2==0
s、 d=s+1,d/2
对于从0到k的i
x=powerMod(randint(2,n-1),d,n)
如果x==1或x==n-1,则下一个i
对于从1到s的r
x=(x*x)%n
如果x==1,则返回False
如果x==n-1,则下一个i
返回错误
返回真值

使用k(默认值5)的随机基数。如果你事先知道n的极限,你可以选择一组给出确定性答案的基数;请参阅各种n的基数列表。

如果你有一个范围,可能最好生成一个筛子。我编辑了我的标题。实际上,我想知道一个数是否为素数。这个数可能是2^63一个巨大的数你可以用数字来表示巨大的数字。2^63其实并没有那么大,你甚至可以做一个简单的老的试算师,好吧,你不会赢得比赛,但也不会花太长时间。你也可以查看并将其扩展到更大的范围。正如@harold所说,2`63并没有那么大。在BigNum类中,你可以轻松地做一个测试,并且在很短的时间内找到o如果一个数是素数。