Webで数学!エラトステネスのふるい | Webであなたの夢が叶う!

Webであなたの夢が叶う!

Webを活用して一歩ずつ「夢」に近づきませんか?
みなさんのサポートブログです。    

こんにちは。
Webであなたの夢が叶う!のHirokoです。

Webで数学、
今回はエラトステネスのふるいをご紹介します。

エラトステネスは今から2200年以上前に
エジプトのアレクサンドリアというところで
図書館の館長をしていた数学者です。

グノモンというL字型の定木を使って
地球の大きさを測った人物としても有名です。

その
エラトステネスが、数学の分野でも
素数を発見する手法を考案しています。
それが「
エラトステネスのふるい」です。

素数とは、
1と自分自身以外には約数を持たない数のことでしたね。
また、素数でない数のことを合成数といいます。

自然数をふるいにかけて素数と合成数にわける
という簡単な手法で、手順は以下になります。

① 奇数を昇順に並べて
   ふるいにかける数字リストをつくる
   (偶数は2で割り切れるので省く)

② 1は素数でも合成数でもない特別な数なので
   
ふるいにかける数字リストから省く。

③ 
ふるいにかける数字リスト
   トップに位置する数を素数リストに移動して、
   その数の倍数を
リストからふるい落とす。

④ ③の作業を
ふるいにかける数字リストの先頭値が、
   ふるいにかける数字リスト最大数の平方根に
   なるまで続ける

⑤ ④の用件を満たしたタイミングで
   残りの数を
素数リストに移動する

これで素数を見つけることができます。
単純ですが根気のいる作業ですね。

プログラムを組む人は、
Loopの勉強のときに
エラトステネスのふるい
課題として取り組んだ経験があるのではないでしょうか?

PHPで書くと、

<?php
function eratosthenes($max) {

    // maxの平方根
    $sqrt = floor(sqrt($max));

    // keyで配列
    $lists = array_fill(2, $max-1, true);

    // 倍数を取り除く
    for ($i=2; $i<=$sqrt; $i++) {
        if (isset($lists[$i])) {
            for ($j=$i*2; $j<=$max; $j+=$i) {
                unset($lists[$j]);
            }
        }
    }

    return array_keys($lists);
}
?>

となるでしょうか?


ちなみに・・・
NHKEテレの2355で、2~100までの数を対象にした
エラトステネスの篩」を中尾ミエさんが、
おやすみソングとして歌われていたようです。

またCDも発売中ということですので、
聴いてみたいと思います。


今日も最後まで読んでいただいてありがとうございました。