爆速 QB64
それは、十進BASIC(http://hp.vector.co.jp/authors/VA008683/)を使って、上限数1千万までにある素数すべてを求めようとしたことから始まった。作った十進BASICのプログラムは最終的に以下のような感じ。
プログラムの名前は PNS20 と名付けた。どこにでもよくある内容のプログラムだが、この PNS20 の前身である PNS10 を作ってくれ切っ掛けをくれた仲間に感謝したい。
REM PNS20 in 十進BASIC
INPUT PROMPT "素数を求める上限整数を指定せよ:":n
PRINT
PRINT 2;
LET pn=1
FOR z=3 TO n STEP 2
LET f=0
LET s=INT(SQR(z))
FOR p=3 TO s STEP 2
IF MOD(z, p)=0 THEN
LET f=1
EXIT FOR
END IF
NEXT p
IF f=0 THEN
PRINT z;
LET pn=pn+1
END IF
NEXT z
PRINT
PRINT
PRINT "出力した素数の個数は"; pn ;"個です。"
END
このプログラムのなかで INT(SQR(z)) の INT() がなくてもよいことはわかっているがぼくの趣味で入れたままである。で、まずはこのプログラムを上限数100万で動かした。かかった時間は 10分58秒だった。
こういうプログラムというものはコンパイラ言語を使うものだということはわかっている。しかし、ぼくは続けて 1千万(10000000)を上限数に指定して動かしたのだ。なんと、10時間ほどもかかってしまった。時間は正確じゃないけど、まぁだいたい10時間だ。
ふつうはこれ以上はやらないところだが、ぼくは普通じゃなかった。上限数1億(100000000)に挑戦だ。ハハハ..、1週間動かしたよ。で、半分までもいかなかった。結果は以下のとおりだ。つまり、素数を 257万個ほど手に入れたのだ。暗黒通信団(素数15万個書籍を販売中)など屁でもないぞ。
これで正気に戻ったぼくは、GFortran(ぐるぐるしてくれ)を使うことにした。プログラムはこんな感じ。なお、GFortran はMinGW 32bit版だ。言い忘れていたがぼくは Windows野郎で使用しているパソコンは Windows7 64bit版、メモリたくさんだ(ええかげんやな)。
! ***** FORTRAN 90 によるプログラム *****
program PNS20
integer :: n, pn, f, z, s, p
write(*,fmt='(A)',advance='no') "素数を求める上限整数を指定せよ:"
read *, n
print *,
write(*,fmt='(I10)', advance='no') 2
pn=1
do z= 3, n, 2
f=0
s=int(sqrt(real(z)))
do p= 3, s, 2
if (mod(z, p)==0) then
f=1
exit
end if
end do
if (f==0) then
write(*,fmt='(I10)', advance='no') z
pn=pn+1
end if
end do
print *,
print *,
print *, "出力した素数の個数は",pn,"個です。"
end program
十進BASIC版 PNS20 を見ながら10分で完成。動かしたぞぉ。で、ビックリ。上限数1千万が 13秒だ。上限数1億もやったよ。2分51秒だった。さすが Fortran というほかはない。
そのほか、QB64(QuickBASIC互換コンパイラ)や FreeBasic(QuickBASIC互換モード)や GCC(MinGW 32bit版)などでもやってみたぞ。結果の一覧をお見せしよう。
なんと、素数を求めるまじん杯で QB64 が優勝に輝いたのだ。まぁ、時間は正確じゃないよ。目覚まし時計の秒針で計ったのだからね。
それでもだよ。QB64 のこの爆速ぶりを見よ!
えっ、QB64 なんて知らない?
そんなあなたのためにインストールから簡単な使い方までぼくが教えて進ぜよう。ぼくが記事に書くまで、まっててくれたまえ。ただしね、QB64 は開発中のソフトウェアであり、さらに日本語はまったく通らない。日本語のドキュメントもない。
しかしね、QB64 は QuickBASIC 4.5互換なのだ。そこのきみも使えるはずだよ。操作も簡単だ。で、QB64 で動かしたプログラムはこんな感じ。どれもこれも似たようなもの。
'***********************************
'* PNS20 in QB64 *
'***********************************
DIM n AS LONG
DIM pn AS LONG
DIM z AS LONG
DIM s AS LONG
DIM p AS LONG
DIM f AS INTEGER
'***********************************
INPUT "Pls input the upper limit number: ", n
PRINT
PRINT 2;
LET pn = 1
FOR z = 3 TO n STEP 2
LET f = 0
LET s = INT(SQR(z))
FOR p = 3 TO s STEP 2
IF z MOD p = 0 THEN
LET f = 1
EXIT FOR
END IF
NEXT p
IF f = 0 THEN
PRINT z;
LET pn = pn + 1
END IF
NEXT z
PRINT
PRINT
PRINT "The number of prime numbers is "; pn
END
'************************************
あと、おまけに FreeBasic(正確にいうと FBEdit)の画面でもどうぞ。
QB64 のプログラムとまったく同じ内容で動作した。正確にいうとコメントと表示メッセージだけは違うけど、本質的な部分は同一といっていい。
QuickBASIC互換って素敵だね。
ぼくはこの「QuickBASIC」という小さな仕様のプログラム言語が大好きなのだ。QuickBASIC の日本語書籍ならいまでも古本で簡単安価に手に入るだろう。それを読んで、FreeBasic の QuickBASIC 互換モードをガンガン使おう! 爆速がほしければ、QB64 を使ってみるとよい。
さて、FreeBasic は GCC 程度だけど、十分速い。日本語も通るし、そもそもが Unicode 対応だ。GUI(Window9)も充実している。日本語のドキュメントも十分だ。
また、QuickBASIC を知っている人なら、明日からでも FreeBasic で QuickBASIC のプログラムを動かすことができるだろう。
もし、爆速ゲームを作りたければ、QB64 があるじゃないか。ただね、グラフィックス性能はまだよく知らないから、ゲーム全体が爆速になるかどうかは希望的な話。
ゲームプログラミングが得意な人は試してみてはいかがだろうか。