[アルゴリズム] 1から100までの素数を取得(Shell編)

今回はShellを使った素数を求めるプログラムですが、デフォルトで100までの数値にしてますが、コマンド実行の際に、上限数値を与えるようにしてもいいかもしれないですね。
とりあえずは、幾つかの言語との速度差などを見たいので、同じ条件にする必要があるので、現状のまま処理します。
ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
#!/bin/bash function getPrimeNumber(){ num=`expr $1-1` flg=0 for((i=2; i<$num; i++)){ m=`expr $1 % $i` if [ $m -eq 0 ]; then flg=$i break fi } echo $flg } # 受け渡し値の取得 numbers=($@) for((i=2; i<=100; i++)){ res=`getPrimeNumber $i` if [ $res -eq 0 ];then numbers+=($i) fi } echo ${numbers[@]} |
実行
1 2 3 4 5 6 |
$ time bash prime_number.sh 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 real 0m1.776s user 0m0.070s sys 0m0.050s |
コンソールで実行するのでtimeコマンドを付けて、実行時間も計測してみました。
前回のPHP,Pythonの速度計測と比べると、shellは非常に速度が遅いことが分かります。
ディスクIOは早いのに、計算系が弱いという事なんですね。
解説
shellでの数値計算
shellは多言語と違って、if文やfor文などで安易に数値を計算させる事はできません。
一度変数に入れるような処理を挟まないといけないので、面倒くさいと感じる人は多いでしょうね。
そして簡単な演算は以下の方法で実装しましょう。
num=10
res1=expr $num+1
res2=expr $num-1
res3=expr $num*1
res4=expr $num/1
res5=expr $num%1
getPrimeNumber関数内を少し変更
shellの関数はreturnではなく、echoで行うので文字列か数値で対応しなければいけないので、今回のアルゴリズムは、if文で判定してbooleanで返す、今までの方式ではなく、割り切れる数値がなければ”0″、割り切れれば、その数をechoで返すようにしてみました。
これにより、若干ですが、速度向上も見込めるでしょう。