問題2 素因数分解

シェルスクリプトのソース(別窓)
スクリプトの使い方の解説
実行結果
考察1(工夫や感想)
さらなる実験(より高速に計算する)
考察2(工夫や感想)
参考資料



スクリプトの使い方

任意の整数を613413として、素因数分解を実行したいときは以下のようにして実行します。

$./quiz2.sh 			;シェルスクリプトを実行
Whats's the number?		;素因数分解すべき数の入力を促してきます。
613413				;ユーザは、素因数分解したい数を入力してください。

(以下、実行結果参照)


ページトップへ
ITPASS 実習レポート1 indexページへ

実行結果

任意の整数を613413として、素因数分解を実行した時に出力される結果は次のようになります。
(出力ファイル(quiz2_output.txt)へのリンク)

$./quiz2.sh 			;シェルスクリプトを実行
Whats's the number?
?				
613413				
>> 613413: 3  3  3  3  7573	;左のように613413を素因数分解した結果が表示されます


ページトップへ
ITPASS 実習レポート1 indexページへ

考察1

作成したシェルスクリプトを実行してみると、613413のように数が大きくなるにつれて素因数分解に必要な時間が長くなっていく様子が見られる。 理由として考えられるのは、

等が考えられる。

例えば、1〜1000000の素因数分解の結果を知りたいと思ったときに今回作成したシェルスクリプトではとても実用的とは言えない。そこで素因数分解の高速化を次の「さらなる実験」のセクションで行いたいと思う。



ページトップへ
ITPASS 実習レポート1 indexページへ

さらなる実験(より高速に計算する)


ここでは、素因数分解を高速化すために考察1で挙げたの2つ目と3つ目の点に注目したいと思う。

シェルスクリプトの処理系(bash)では算術計算が直接的にはできず、度々exprコマンドを呼ぶ必要がある。同様に条件式の評価にもtestコマンドを実行する必要がある。 このことは、Ruby,JavaScriptといったスクリプト言語、Java,.Net言語(C#, VB.net)、C/C++といったコンパイル型言語では十分に解決される。また、高速化という意味ではスクリプト言語よりもコンパイル型言語の方がアドバンテージが大きいのでコンパイル型言語を使って検証してみたいと思う。今回は、プログラム言語としてC++とJavaを使用したがそれぞれのプログラムの実行形態について以下の特質に注意が必要である。

Java

C++


実験内容

上記の点に注意して各言語と素因数分解のベンチマークを見ていきたいと思う。

実験内容は、1〜10(A)、1〜100(B)、1〜1000(C)、1〜10000(D)、1〜100000(E)、1〜1000000(F)、1〜10000000(G) の数を素因数分解を行うプログラムをC++(イ)、C++最適化オプションあり(ロ)、Java(ハ)、シェルスクリプト(ニ)で作成する。そして、計算結果の出力をファイルにリダイレクトして実行し、それにかかった時間を測定をした。(計算結果を画面に出力する場合、標準出力の内容をコンソール画面に描画する必要がある。この作業時間は数値的な計算にかかる時間よりもはるかに大きい。また、出力を描画するのはおそらくOSのAPI(WindowsであればWin32 API)やその上のレイヤーに存在するGUIフレームワーク(X, Gtk, Qt等)であり、それらのAPIを呼び出すオーバヘッドの時間を計測してしまうことになる。これらの理由から、それらの干渉が小さいリダイレクトを用いることにした。)
なお、時間の計測にはtimeコマンドを利用し、5分以上時間がかかったものを除き3回づつ計測しその平均をとった。

以下は、そのソースと実行環境である。

実験結果

以下が各実験項目(イ)〜(二)、(A)〜(G)の計測時間をあらわす表である。なお、各セル2行目の括弧内の数値は(ハ)Javaの計測時間を1としたときの相対的な計測時間の比である。(シェルスクリプトにおいて(E)、(F)、(G)の項目は時間がかかりすぎ終わる気配がないので途中で実験を打ちきった。)

素因数分解による各種プログラミング言語のベンチマーク
*ただし、上の計測時間の数値は±5パーセントほどの誤差は見積もる必要がある。


また、以下のグラフは上の表のデータを直感的にわかりやすくしたものである。左に行くほど計測時間は短く、右に行くほど計測時間が長いことを示している。注意点としては計測時間の数値は、すべて常用対数の目盛でグラフに表されていることである。
素因数分解による各種プログラミング言語のベンチマークグラフ


さて、上記のような結果にたいしての考察を次の考察2で行いたいと思う。

ページトップへ
ITPASS 実習レポート1 indexページへ

考察2

実験結果のグラフを見ると以下のような特徴を見て取れる


感想

まずこの様な実験を行いたいと思った動機は、実験機が64bitでありメモリ8GをきちんとOSが認識するという恵まれた環境に遭遇できたからである。今まで、32bitOSでせいぜいメモリが2GぐらいのスペックのPCを使う程度であった。最初、実験室に入った時からぜひこの高いスペックのパソコンでプログラムを走らせてみたいと思っていた。このような形で、夢をかなえることができたのはとても嬉しいと思う。これらの知識を自然科学の数値計算分野で生かせるようによりスキルを高めて行きたい。


お世話になった方へのお礼

TAの方々や先生には無理を言ってご理解いただき、jdkやg++をインストールするためにsudo権限をいただいました。このスタートがなければ、今回の実験意図はかなえることはできませんでした。ありがとうございました。



ページトップへ
ITPASS 実習レポート1 indexページへ

参考資料

プログラミング言語、OS、仮想実行環境(JVM, CLR)、パフォーマンスチューニングについての知識は数年かけて集めたものなので全ての参考資料を 書き上げることはとてもできず、記事の作者、著書の作者の方には本当に申し訳ありません。少しながらですが主なサイトを以下に挙げさせていただきました。



ページトップへ
ITPASS 実習レポート1 indexページへ
ITPASS 実習レポート1 indexページへ