(factorial 300000)
ぜんかいの「Scheme スピードテスト」の続きの話ではあるが、こんかいはぜんかい以上にいい加減なテストなんだ。こんかいは時間さえも計っちゃいない。目覚まし時計はお休みちゃん。
とにかく時間がかかってもいいから、計かんないから、やってみろい! しかし、ちょっときついぞ (factorial 300000) だ! どういうわけだか、また 30万なのだ。
まずは最初に訃報だ。ぜんかい優勝の Ypsilon が (factorial 300000) の暴力に吹っ飛んだ。
10万までは高速順調であったが、さすがに 30万となると Ypsilon の想定外なのか黙って落ちた。
そのほかの Scheme メンバーもダウンに次ぐダウン。多倍長ハンターの Lisp 族としての誇りはどうなったのだ。
(define (factorial n) (if (zero? n) 1 (* n (factorial (- n 1)))))
(factorial 300000)
で、プログラムはこんな感じね。
まずは見てくれ。ぼくが信頼し愛用する GP はちゃんとやり終えてくれたぞ。数字はちょっとしか見えていないが実際はすごい量なのだ。30万どころか 300万をやらせてみたがこの通りだ。
いっぽう、こりゃなんじゃ。
こんなの Scheme といえるのか。Infinity って..。あっ、すまない。前回のデータだった。ほんと、いま気づいた。でも、Factorial をやったところで Infinity に決まってるさ。まぁ、いろんな処理系があっていいんだけど、Lisp 族は Fortran が簡単にはできないことができてほしい。
で、肝腎の Scheme は?
みんなが信頼する Gauche はさすがなもので時間はたっぷり掛かったが最後までやってくれた。また、Schluessl は前回どうようの高スピードでこんかいもぼくの期待に応えてくれたのだ。ありがとう。
MIT/GNU-Schme からは、Aborting!: maximum resursion depth exceeded のメッセージをもらった。外国勢も黙ってサラッとやり終えてくれるものはなかなかなかった。そんななか、SISC は Gauche よりも Schluessl よりも速く黙ってやり終えてくれる数少ないひとつだった。
こんかいの結論は、なんとなくこんな感じか。じつは、お気づきのとおり、ぜんかいも Ypsilon よりも SISC のほうが上だった。ただ、あとになってのエントリーだったので、表彰台に登ることはなかったということなのだ。
さて、最後に (factorial 300000) という数字がどれほどのものか伝えておきたいと思う。
この数字がどれほど続くのか。うーん、GAP の力を借りることにしよう。
1512852 桁。151万桁の数字というわけだ。
あっ、これでもわからない? もし、ここにその数字全部を貼り付けたら、記事10回分くらいが数字で溢れかえってしまうだろう。そういう数字を計算して吐き出すことができる言語。それこそが Lisp(Scheme)ではないだろうか。
【追伸】
とはいたってわかっちゃいるよ。
Gauche は Linux において(Windowsのほうはあまり見ちゃいないだろう)、あらゆる使用に耐え、あらゆる場面で高パフォーマンスを出せるようなバランスを取った設計になっているのだろう。Fortran 的に使ったってそこそこいくぜってことだね。
これは想像だけど、Gauche は事務処理、数値計算、記号処理の総合においては最強なのかも知れないよね(ぼく的には根拠はないけど)。
でもね、Fortran の土俵では Fortran にはまったく敵わないだろう。また Fortran だって 30万の階乗の計算だってそりゃもちろんできるだろう。そして、やればどの Scheme にだってスピードじゃ負けないはずだ。
だけど怠け者のぼくはそんな大変なことをやろうとは思わないさ。
言語哲学的にいえば、Scheme はまずは Sceme の得意分野で最高を目指すべきじゃないだろうか。ぼくはけっきょくそれがいいたくて、2回にわたって Gauche の名前がでる記事を書いたのかも知れない。