ガレージセールで、コンピューター部品がランダムに入った大きな箱を買いました。その部品を組み立てて、自作のコンピューターを作り始めています。
部品の組み合わせを変えて性能を試してみたくなり、それぞれのコンピューターを比べるためのベンチマークプログラムを自分で作ることにしました。そこで選んだのが、有名な"Sieve of Eratosthenes"というアルゴリズムです。古くからあるアルゴリズムですが、コンピューターを限界まで追い込んでくれるはずです。
エラトステネスの篩アルゴリズムを実装して、与えられた数値以下の素数をすべて見つけるプログラムを作りましょう。
素数とは、1より大きい数で、1とその数自身でしか割り切れない数のことです。 たとえば、2、3、5、7、11、13は素数です。 一方、6は素数では_ありません_。6は1とその数自身だけでなく、2と3でも割り切れるからです。
エラトステネスの篩を使うには、まず2から与えられた数値までのすべての数値を並べた配列を作ります。 そして、次の手順を繰り返します。
配列のすべての数値を見終えるまで、この手順を繰り返します。 最後に、印が付いていない数値がすべて素数です。
テストが確認するのは、このアルゴリズムを実装したかどうかではなく、正しい素数の配列を作れたかどうかだけです。 篩を正しく実装できているか確かめるには、まずは割り算や余りの計算を使っていないか確認するのがよいでしょう。
10以下の素数を求める場合を考えてみましょう。
すべての数値を調べ終えると、2、3、5、7にはまだ印が付いていないことがわかります。つまり、これらが10以下の素数です。
エラトステネスのふるいへのさまざまなアプローチを見ていきます。まず入れ子のループと遅延評価から始め、次に集合に移り、最後に再帰を扱います。