素数を求める(1)
なぜ、このタイミングで素数を求めるのかアレですが、息抜きです。
勘のイイ人は気付いてるかもしれませんが、
この数列を使って、シェルソートを動かしてみたい訳です。
まずは、素数を求めてみます。
use strict; use warnings; use v5.10; die 'Usage: perl aaa.pl <integer>' if scalar(@ARGV) == 0; my @prime = calc_prime( $ARGV[0] ); while ( @prime ) { for ( 1..10 ) { printf( "%4d", shift @prime ); if ( 0 < scalar(@prime) ) { print ','; } else { last; } } print "\n"; } sub calc_prime { my $n = shift; my @ret = (); if ( $n < 2 ) { return @ret; } my @wk = 2..$n; while ( @wk ) { my $prime = shift @wk; @wk = grep { ($_ % $prime); } @wk; push @ret, $prime; } return @ret; }
実行するとこんな感じ。
$ perl aaa.pl 100
2, 3, 5, 7, 11, 13, 17, 19, 23, 29,
31, 37, 41, 43, 47, 53, 59, 61, 67, 71,
73, 79, 83, 89, 97
このアルゴリズムは、「エラトステネスのふるい」というそうです。(*1)
見ての通り、小さい方から素数を確定して、
その素数で割り切れる数字を取り除いて、
この繰り返しで計算しています。
今回は、「余り」を求めて、grep
で除去していますが、
他の方法もあるので、次回はそっちも実装して、
処理時間を比較してみようと思います。
おしまい。
(*1) 自分の解釈で書いてるので、おかしいことになってたらゴメンなさい。
Leave a Comment