メインコンテンツまでスキップ

エラトステネスの篩: 素数をまとめて見つけよう

エラトステネスの篩は、素数ではない数をふるい落として、素数だけを残す方法です。

「2の倍数を消す、3の倍数を消す、5の倍数を消す」と進めていくと、最後に素数が残ります。

ルール

  1. 2から調べ始める
  2. 素数を見つけたら、その倍数を消す
  3. 次に残っている数へ進む
  4. 最後に残った数が素数になる

図で見る

30までの数で見ると、「残す数」と「消す数」が表のように変化します。

手順ふるいにかける数数の表
最初まだ何も消していない2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
1回目2を残して、2の倍数を消す2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
2回目3を残して、3の倍数を消す2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
3回目5を残して、5の倍数を消す2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
完成消されずに残った数が素数2 3 5 7 11 13 17 19 23 29

コピペ用コード

def sieve_of_eratosthenes(limit):
is_prime = [True] * (limit + 1)
is_prime[0] = False
is_prime[1] = False

for number in range(2, int(limit ** 0.5) + 1):
if is_prime[number]:
for multiple in range(number * number, limit + 1, number):
is_prime[multiple] = False

primes = []
for number in range(limit + 1):
if is_prime[number]:
primes.append(number)

return primes

print(sieve_of_eratosthenes(30))

AOJで挑戦してみよう!

範囲内の素数をまとめて扱う問題で、エラトステネスの篩を使ってみよう。