| 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";
}
}