【发布时间】: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遍历它,在循环过程中写下(在纸上)lis和i的值。 -
建议的欺骗目标中的答案都没有完全复制罗伯特威廉汉克斯的代码,尽管那里解释了一般原则。也许RWH自己会看到这个问题……
-
顺便说一句,使用
//比使用浮点除法和转换结果更有效。即lis[i*i::2*i]=[False]*((n-i*i-1)//(2*i)+1)
标签: python algorithm python-3.x math primes