【问题标题】:Is this the fastest way and a new way to test special prime numbers? [closed]这是测试特殊素数的最快方法和新方法吗? [关闭]
【发布时间】:2013-05-03 11:33:30
【问题描述】:

示例代码:

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 的数字吗?

【问题讨论】:

  • 也许您可以解释一下算法的作用,以及为什么您认为它可以作为素数测试?即便如此,这里可能没有足够的前沿数论家来验证您的算法是否正确和新颖。据推测,N 是潜在梅森素数(例如 57885161)的指数,而不是素数本身(对于int 来说显然太大了)。
  • 正确新颖。这种方式与int无关,只是示例代码。
  • 如果您知道它是正确且新颖的,为什么还要在这里提出模糊的问题而不是发表您的开创性研究?如果没有,那么你需要问一个更清楚的问题;如果不知道单字母变量代表什么以及算术位应该实现什么,则代码有点难以理解。
  • 我说它是正确的和新颖的,但我不确定所以我问。
  • @miket 我会说试试 math.stackexchange.com,但在提出问题之前,您必须通过解释进一步扩展您的答案(SO 接受涵盖所有经验范围的问题,而 math.stackexchange 只允许非常高级的问题)。

标签: c++ algorithm math primes


【解决方案1】:

你读过关于卢卡斯-莱默的书吗?听起来您在寻找新的更快的方法来测试素数之前还需要做更多的研究。首先尝试使用 bignum 库来实现 Lucas-Lehmer。

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

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

【讨论】:

  • 是的,我以前读过关于 Lucas-Lehmer 的文章。它迭代到 N/2,但只有加法和右位移。你知道 Lucas-Lehmer 需要大规模的广场。
  • @miket 但是 Lucas-Lehmer 只需要 O(log N) 算术运算。即使是简单的乘法和除法实现,它也会将N/2 加法和移位从水中吹走。
  • 你打赌如果测试 2 ^ 57885161 − 1 Lucas-Lehmer 需要 3 年,如果使用最快的计算机,新的只需不到 1 秒。
  • @miket 这是因为您的测试明确排除了2^n - 1 形式的所有数字作为第一步。所以在那些方面,它当然很快。但它至少没有帮助确定这样的数字是否是素数。它也非常快速地排除了一些其他特殊形式,但通常需要很长时间才能完成。平方根的试除法平均具有较低的算法复杂度。
【解决方案2】:

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

【讨论】:

  • 这是与范围无关的示例代码,你知道如果测试数大于最新的最大素数 2 ^ 57885161 - 1,你需要更多的东西。
【解决方案3】:

这种方法可以测试大于最新最大素数 2 ^ 57885161 - 1 的数字吗?

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

现在,让我们严肃点几秒钟:现在消费级计算机最多使用 64 位宽的整数,你可以看到,从那个假设的平台来看,这还很遥远……

如果您想执行此类计算,您需要将 int 替换为 BigNum 库(在此过程中还会有其他限制 - 振作起来)。

【讨论】:

    猜你喜欢
    • 2011-02-04
    • 1970-01-01
    • 2011-01-24
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 2018-04-27
    • 1970-01-01
    相关资源
    最近更新 更多