【问题标题】:Finding first n primes? [duplicate]找到前 n 个素数? [复制]
【发布时间】:2011-06-22 03:47:51
【问题描述】:

可能重复:
Fastest way to list all primes below N in python

虽然我已经编写了一个函数来查找 n (primes(10) -> [2, 3, 5, 7]) 下的所有素数,但我仍在努力寻找一种快速查找前 n 个素数的方法。最快的方法是什么?

【问题讨论】:

  • Memoization 可能是最快的。 ;)
  • 不是重复的:OP 想要前 n 个素数,而不是 n 以下的所有素数。
  • “找到前n个素数”和“找到n以下的所有素数”几乎没有区别。任何可以找到所有低于 k 的素数的算法都可以很容易地修改为继续增加 k 直到找到 n 个素数。
  • 这不是重复的,它提出的问题与建议的重复不同。前 n 个素数与低于 n 的所有素数。

标签: python math performance primes


【解决方案1】:

从估计 g(n) = n log n + n log log n* 开始,它估计 n > 5 的第 n 个素数的大小。

然后对该估计值进行筛选。 g(n) 给出了高估,这没关系,因为我们可以简单地丢弃生成的大于所需 n 的额外素数。

然后考虑“Fastest way to list all primes below N in python”中的答案。

如果您关心代码的实际运行时间(而不是算法时间复杂度的数量级),请考虑使用使用 numpy 的解决方案之一(而不是“纯 python”解决方案之一)。

*当我写log时,我指的是自然对数。

【讨论】:

  • 我不确定该去哪里...我的代码 primes(int(pi*n))[:n] 只返回正确的素数,用于低于 12 的数字。
  • 您的代码应该运行primes(g(n))。我不确定这是否是你的意思。我的回答中g(n) 函数出现错误,请使用新函数重试。
  • 感谢终于搞定了
【解决方案2】:

根据this,第n个质数p_n满足

p_n

对于 n >= 6

因此,如果您使用大于上面右侧的下一个整数运行当前函数(或者,例如,其他答案中提到的筛子之一),则可以保证找到第 n 个素数。

【讨论】:

    【解决方案3】:

    你想要Sieve of Eratosthenes

    使用π 函数来估计您想要查看的 n 值,稍微过冲,然后使用筛子计算到您需要的点。

    【讨论】:

    • +1 表示正确的名称,-1 表示提出相同(不正确)的解决方案。
    • @ChrisLutz 我想我应该得到它,因为我应该在编辑之前加入一个答案来充实它,但对我来说(在我编辑之后)使用 π 来估计一个合理的超调然后只是在去那里的路上早点停下来。我将不得不看看重复的答案暗示了什么。 :)
    • 我没有对这个问题进行任何投票。我很幽默,因为我的数学结果为零。
    • @ChrisLutz 我明白了;过去我做过很多类似的“不投票”cmets。 :)
    【解决方案4】:

    我不知道它是否最快,但Euler's Sieve 似乎不错。

    编辑

    正如其他答案所暗示的,您可以使用素数定理 2 的基本事实。或者您可以学习基本的代数几何并使用椭圆曲线素性检验。

    【讨论】:

    • 这是另一种求n下素数的方法。
    • 我在 n 个函数下看到了大约 172 个素数,我正在寻找前 n 个素数代码。
    【解决方案5】:

    使用 Erastothrones 筛法,因为质数在 2 和 3 之后是 6n+1 或 6n-1 的形式。这将提高程序的速度

    【讨论】:

      猜你喜欢
      • 2010-12-10
      • 1970-01-01
      • 1970-01-01
      • 2013-01-22
      • 2016-02-16
      • 2017-08-04
      • 2016-02-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多