#!bin/bash # ここで用いるプログラムは素因数分解に用いる素数を分解する数値の上限を平方根から導出し、そこまでの素数を小さい順に分解し、上限値を超えたら分解する数値自身を表記すると言う方法である. # echo "What's the number ?" read b # 素因数分解する数値を端末に入力するコマンド a=2 # 素数の下限値 c=2 # 素数候補の2乗を表す. (最初は計算の便宜上 "1" としておく) e=$a # 計算上の便宜的な処理 g=$b x=1 # 以下のループを用いて$bまでを回す if [ $b -le 1 ]; then echo "Arguments Error : This number don't have prime factors." # 2 未満の整数を代入すると、分解できない旨を伝える文章 echo "$b:" else while [ $c -le $b ]; # 素因数分解する数値より分解する素数の2乗が大きくなるまでループさせる. ここで大きくなった1つ前の $c, つまり $e が分解に用いる素数の上限 do d=$e # $d が分解可能な素数の上限 e=`expr $e + 1` c=`expr $e '*' $e` # シェルスクリプトでは, 平方根の演算ができないため, 逆に2乗することでその代わりとする. done r="" while [ $b -ge 2 ]; do if [ "`expr $b % $a `" = "0" ]; # 分解する数値を素数で割ったとき, あまりがゼロになれば, その素数は分解する数値の素因数である. then b=`expr $b / $a` # 分解する数値をあまりがゼロになった数値で実際に割り, 割った数値を新たに分解する数値とする. r="$r $a" if [ $b -eq 1 ]; # もし, 素因数の候補ですべて割りきれてしまった場合, ここでループを終わらせる. then echo "$g:$r" >> quiz2.txt fi else if [ $a -le $d ]; # もし上の条件にあてはまらなければ, それは素因数ではないので, 次の素因数候補に替えて, 同じ作業をする. then a=`expr $a + 1` # ただし, 素因数候補の上限値より小さくなければその操作は行わない. else echo "$g:$r $b" >> quiz2.txt # もし, 素因数候補の上限値より大きくなれば, それは分解する数値自身しか, もう素因数を含まないということなので, そのまま表示する. b=1 fi fi done fi