| Top Page | 雑多ないろいろ | 素数年 2003年 |
# 素数に恵まれた10年をさがす Perl プログラム # # 4 January, 2003 by TAKENAKA, A. $upto = 1000000; # 最大ここまで調べる. # 配列 @numbers の初期化. for ($i = 0; $i <= $upto; ++$i) { push @numbers, 1; } # エラストテネスのふるいで,@numbers の合成数番目の要素を 0 にしていく. # 最終的に, @numbers の n 番めの要素は,n が素数なら 1, # 素数でないなら 0 になる. $numbers[0] = $numbers[1] = 0; # 0も1も素数ではない. # $upto が合成数なら,$uptoの平方根以下の素因数を必ず持つので, # ここまで調べればじゅうぶん. $check_max = int(sqrt($upto) + 1); for ($i = 2; $i <= $check_max; ++$i) { # 2以上のすべての数について next if @numbers[$i] == 0; # 合成数ならスキップ for ($j = 2 * $i; $j <= $upto; $j += $i) { # $i の倍数番めの要素を @numbers[$j] = 0; # 0 にしていく. } } $count_decade = 0; # 「恵まれた10年」の数を数えるカウンタの初期化 for ($i = 0; $i <= $upto; $i += 10) { # 10年ごとにチェック # その10年のうちの素数の数を調べる. $count_prime = 0; for ($j = 0; $j < 10; ++$j) { ++$count_prime if $numbers[$i + $j] > 0; } if ($count_prime == 4) { # 恵まれてたら出力. ++$count_decade; print $count_decade, ":"; for ($j = 0; $j < 10; ++$j) { print "\t", $i + $j if $numbers[$i + $j]; } print "\n"; } }