prime = [True] * n # prime[i] = True => i は素数を表す
prime[0] = prime[1] = False # 0 と 1 は素数ではない
for i in range(2, n): # 2 から n までループ
if prime[i]: # i が素数であれば
for j in range(i * i, n, i): # i より小さい倍数はすでにマーク済みなので、ループは i * i から開始
prime[j] = False
Sieve of Eratosthenes to find all the prime numbers smaller than n.n=100 の場合で手順を追ってみましょう:
prime = [False, False, True, True, ..., True] (サイズ 100)
i = 2 ⇒ prime[2] = True ⇒ for j in 4, 6, 8, ... 100 で prime[j] = False にマーク
i = 3 ⇒ prime[3] = True ⇒ for j in 9, 12, ... 100 で prime[j] = False にマーク
i = 4 ⇒ prime[4] = False
i = 5 ⇒ prime[5] = True ⇒ for j in 25, 30, ... 100 で prime[j] = False にマーク
i = 6 ⇒ prime[6] = False
i = 7 ⇒ prime[7] = True ⇒ for j in 49, 56, ... 100 で prime[j] = False にマーク
i = 8 ⇒ prime[8] = False
i = 9 ⇒ prime[9] = False
i = 10 ⇒ prime[10] = False
i = 11 ⇒ prime[11] = True ⇒ for j in [empty] で prime[j] = False にマーク
この段階で i * i はすでに n を超えるので、これ以降はループ内で prime[j] = False をマークすることはありません。よって、この最後の段階で 100 未満の素数をリストから取得すれば完了します。