我正在寻找一种生成素数的算法。我发现罗伯特威廉汉克斯完成了以下一个。它比其他算法更有效,更好,但我无法理解它背后的数学。
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]]
True
s数组与最终素数数组之间的关系是什么?
答案 0 :(得分:5)
从数组中的 n True
值开始,i
枚举从3
到sqrt(n)
的{{1}}步骤,如果 i 数组中的条目仍为2
,则将True
中的所有条目设置为i^2
到{{1}的步骤(这些将是2*i
)的倍数。
最后留在数组中的所有奇数False
条目都是素数。
所有这些找到的数字和 2 都是 n 下面的所有素数。