| Top Page | 雑多ないろいろ | 素数年 2003年 |

素数に恵まれた10年をさがす Perl プログラム

#   素数に恵まれた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";
    }
}

>上のプログラムの実行結果