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

2017年3月3日

Shell テクノロジー プログラミング 特集

今回はShellを使った素数を求めるプログラムですが、デフォルトで100までの数値にしてますが、コマンド実行の際に、上限数値を与えるようにしてもいいかもしれないですね。 とりあえずは、幾つかの言語との速度差などを見たいので、同じ条件にする必要があるので、現状のまま処理します。

ソースコード

#!/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[@]}

実行

$ 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で返すようにしてみました。 これにより、若干ですが、速度向上も見込めるでしょう。

リンク

色々なプログラム言語でアルゴリズム学習

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。