这是测试特殊素数的最快方法吗?

时间:2013-05-03 11:33:30

标签: c++ algorithm math primes

示例代码:

bool is_special_prime (int N) {
  QHash<int, int> o;
  struct A_functor
  {
    int operator()(unsigned int n) { return n >> __builtin_ctz(n);}
  }A;
  int k = A(N + 1);
  if(k == 1)
    return 0;
  o[k] = k;
  int t = (N - 5) >> 1;
  for(int i = 0; i < t; i++) {
      k = A(N + k);
      if(k == 1 || o.contains(k))
        return 0;
      o[k] = k;
  }
  return 1;
}

这种方式是否可以测试大于最新最大素数2 ^ 57885161 - 1?

的数字

3 个答案:

答案 0 :(得分:1)

你读过Lucas-Lehmer吗?在你找到新的和更快的方法来测试质数之前,你可能需要做更多的研究。尝试首先使用bignum库实现Lucas-Lehmer。

你的算法迭代到N / 2,远远不是快速的,它实际上确实非常慢(比素数慢得多)。它也永远不会找到大于2 ^ 32或2 ^ 64的素数,这比2 ^ 57885161要小得多。你明白为什么这么慢吗?它不能返回1,直到它的值小于N / 2。

我没有检查你的代码是否准确地确定了素数。

答案 1 :(得分:0)

您正在传递int类型,该类型可以容纳32位系统上-2^31 to 2^31-1范围内的数字。你不能用它来测试你提到的一些订单

答案 2 :(得分:0)

  

这种方式是否可以测试大于最新最大素数2 ^ 57885161 - 1?

的数字

如果您碰巧使用int至少为57885162位宽的平台,则为是(假设您的算法正确,我没有费心去检查)。

现在,让我们认真思考几秒钟:现在消费级计算机使用最多64位宽的整数,你可以从这个假想的平台看到它是一个很长的镜头......

如果您想要执行此类计算,则需要将int替换为BigNum库(并且在此过程中还会有其他约束 - 支撑自己)。