素数演算・再燃

素数への情熱再燃ですよ。いやあですね、数日前、前述したHTMLの大先生がC言語を勉強するっつーから、突然なんとなく思いついて「おおそれなら素数を計算するソフトを作れや」と言ってしまったのが始まり。言ったからには自分もやるしかないわけで、久々に素数に凝ってみようかと思います(笑)でも実際、素数計算はプログラミング入門には良い題材だと思うわけで。最も基本的な演算方法なら、ループや条件判別等の基礎的な制御構造や変数・演算子の扱い方までプログラミングの基礎的なことを活用してできるから、入門としてはとても効率的な勉強になるし、今度は計算効率を上げるために素数演算アルゴリズムに凝り始めると、論理演算やらメモリ管理やら下手すればアセンブラまで勉強することも必要になってくるわけで、プログラミングの題材としては良いものだと思う。
で、今日はですね、前述した彼らがHTMLを書いている間に、なんとなく気が向いたので自分もプログラムを書いていたわけですよ。以前はJavaで凝って書いたので、今回はこて初めにとりあえずDelphiで書いてみた。けど、まずは何にも凝るわけでなく、最も基本的なアルゴリズム素数を計算してみた。けど目的は計算することより、最も基本的な計算方法でやった場合、演算時間がどのように増えていくかということを試してみたかったので、素数を求めつつ順次演算にかかった時間をグラフに記録していくプログラムを書いてみましたよ。

素数演算速度計測プログラム

この画像を見れば分かるとおり、とても綺麗な曲線を描いてくれたわけで、ある意味うれしい結果に。やはりこの演算方法だと数が大きくなるにつれて二次関数的に演算時間が増えていくのでとても非効率だし、現実的ではないこともわかる。このプログラムはGUIの画面にリアルタイムで求まった素数をリストに追加し、さらにリアルタイムに一定間隔でグラフを更新するようにしてるので、実際には演算にかかった時間よりも画面描画にかかる時間のほうが大きいだろうから、このグラフ(特に演算時間の数字)を完全に信用することはできないだろうけど、演算時間の推移としての参考にはなると思う。(なお、書いてないけど横軸は演算回数を表していて、単位は[3000try]です。)しかし、まあ確かに描画時間が大きいとはいえ、たった100万までの素数を求めるのになんと45分以上もかかっている!以前Javaで書いたプログラムなら100万なんて1秒もかからないどころか、演算自体だけなら0.1秒すらかからないのに・・・やっぱこの基本アルゴリズムはかなり無理があるんだなと実感。なお、こんなくだらないプログラムを実行したいなんていう奇特な人はいないと思うから、実行ファイルはアップしません(笑)