【发布时间】:2011-08-02 10:06:55
【问题描述】:
所以我正在阅读关于 Eratosthenes 筛子的 Wikipedia 文章,其中包含一个 Python 实现: http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes#Algorithm_complexity_and_implementation
def eratosthenes_sieve(n):
# Create a candidate list within which non-primes will be
# marked as None; only candidates below sqrt(n) need be checked.
candidates = range(n+1)
fin = int(n**0.5)
# Loop over the candidates, marking out each multiple.
for i in xrange(2, fin+1):
if not candidates[i]:
continue
candidates[2*i::i] = [None] * (n//i - 1)
# Filter out non-primes and return the list.
return [i for i in candidates[2:] if i]
它看起来是一个非常简单和优雅的实现。我见过其他实现,即使是在 Python 中,我也了解 Sieve 的工作原理。但是这个实现的具体工作方式,我有点困惑。似乎写那个页面的人非常聪明。
我知道它遍历列表,找到素数,然后将多个素数标记为非素数。
但是这条线到底做了什么:
candidates[2*i::i] = [None] * (n//i - 1)
我已经弄清楚它从 2*i 到末尾的切片候选,按 i 迭代,这意味着 i 的所有倍数,从 2*i 开始,然后到 3*i,然后到 4*我直到你完成列表。
但是[None] * (n//i - 1) 是什么意思?为什么不直接将其设置为 False?
谢谢。一种只有一个答案的特定问题,但我认为这是提出问题的地方。我当然希望得到一个明确的解释。
【问题讨论】:
-
要了解 Eratosthenes 筛的纯 Python 实现能走多远,请查看@Robert William Hanks stackoverflow.com/questions/2068372/… stackoverflow.com/questions/2897297/… 的答案