エラトステネスの篩

素数生成の方法いろいろ

素数を生成するプログラムの作り方はいくつかある。 (なお、素数については「プログラミング 小手調べ」でも扱っているので参照されたい。)

  1. 整数の集合を用意して、2の倍数、3の倍数、…を順に消していく。 篩1

    (2..Math.sqrt(n)).
      each_with_object(a=(2..n).to_a){|i|
        (2..n/i).each{|j|a.delete(i*j)}
      }
  2. (まずは有限の)整数列を用意して、前から順に取り出して、 既知の素数列で順々に(割り切れるか)チェックし、 通過したものを新しく既知の素数列に加える。 篩のイメージ

    (考え方としては右図のように待機列から順々に取り出すイメージになるだろう)。

  3. 無限整数列からスタートすることもできる(言語によって書きやすさがだいぶ変わってくる)