たてたてよこよこまるかいてちょん

組み込み関連の情報を共有するためのブログです

clispとeclで大きい数で遊んでみた

lispはかなり大きな数が扱えるとかで、フィボナッチの関数で大きいものを出して遊んでいた。というかlispになれる練習をしていた。


まず、こんなファイルを作成してみた。

(defun fibo (n &optional (a1 1 ) (a2 0))
  (if (< n 1)
      a1
      (fibo (1- n) (+ a1 a2) a1)))
(defun read-fibnum ()
  (or (parse-integer (read-line *query-io* ) :junk-allowed t) 0))

(format t "~A" (fibo (read-fibnum)))
(quit)

clispの(もちろんslime/Emacs)上にロードして、(fibo 2000)を実行すると、あっというまに二三行を数字で埋め尽くす程の大きな数が返ってきた。
さすがである。だが(fibo 10000)を実行するとうまくいかない。slimeのデバッグはまだよくわからないのでqで脱出した。

そこでeclでもやってみた。eclだったら、そうgmpが使えるはずだからである。
eclを起動して、

(compile-file "fib.lisp" :system-p t)
(c:build-program "fib.x" :lisp-files '("fib.o"))

すると、入力をとって数字ならフィボナッチ数を計算してくれる実行ファイルが作成されるはずだ。

./fib.x

10000を入れると、あっという間である。Terminal.appが数字でいっぱいになった。
しかし20000あたりが限界のようである。これでついにstack over flowしてしまうのだ。うむうむ。

記事のLicense このブログの記事は特に断りのない限り、引用部分を除いて、以下の CC-BY 4.0でライセンスします。 https://creativecommons.org/licenses/by/4.0/deed.ja ただし、ブログ内にあるコードは、特に断りのない限り、CC-BY 4.0またはMITLicense で利用できるものとします。