【问题标题】:Prime numbers generator explanation? [duplicate]素数生成器解释? [复制]
【发布时间】:2017-08-06 06:23:25
【问题描述】:

我正在寻找一种生成素数的算法。我发现罗伯特·威廉·汉克斯(Robert William Hanks)完成了以下一项。它比其他算法非常有效且更好,但我无法理解其背后的数学原理。

def primes(n):
    """ Returns  a list of primes < n """
    lis = [True] * n
    for i in range(3,int(n**0.5)+1,2):
        if lis[i]:
            lis[i*i::2*i]=[False]*int((n-i*i-1)/(2*i)+1)
    return [2] + [i for i in range(3,n,2) if lis[i]]

Trues 值的数组和最终的素数数组之间的关系是什么?

【问题讨论】:

  • 看起来它正在使用埃拉托色尼筛。
  • this answer 中的代码基本上是经过稍微优化的 Eratosthenes 筛。请注意,它是 Python 2 代码,需要进行一些调整才能在 Python 3 上使用。FWIW,我在 this answer 中有 RWH 代码的 Python 3 版本。
  • n = 6 遍历它,在循环过程中写下(在纸上)lisi 的值。
  • 建议的欺骗目标中的答案都没有完全复制罗伯特威廉汉克斯的代码,尽管那里解释了一般原则。也许RWH自己会看到这个问题……
  • 顺便说一句,使用// 比使用浮点除法和转换结果更有效。即lis[i*i::2*i]=[False]*((n-i*i-1)//(2*i)+1)

标签: python algorithm python-3.x math primes


【解决方案1】:

n 数组中的True 值开始,i 通过2 的步骤从3 枚举到sqrt(n),如果 i 数组中的第一个条目仍然是True,设置为False,从i^2到数组末尾的所有条目都以2*i为步长(这些都将是i的倍数) .

1 上方的所有奇数 True 条目最后留在数组中,都是素数。

所有这样找到的数字,以及2,都是存在于n之下的所有素数。

【讨论】:

    猜你喜欢
    • 2023-03-07
    • 2017-09-03
    • 2016-07-08
    • 1970-01-01
    • 1970-01-01
    • 2014-11-08
    • 1970-01-01
    • 2018-08-01
    • 2015-07-02
    相关资源
    最近更新 更多