回答 - fib(1000)
Challenge for Geeks - JGeek Log
gosh> (fib2 1) 1 gosh> (fib2 2) 1 gosh> (fib2 3) 2 gosh> (fib2 1000) 43466557686937456435688527675040625802564660517371 78040248172908953655541794905189040387984007925516 92959225930803226347752096896232398733224711616429 96440906533187938298969649928516003704476137795166 849228875
コメントして頂いた行列演算で計算しています.
gaucheの行列演算ライブラリは無いんだろうか? ベクトルはある. それくらい自分で書けって話か.
コメントありがとうございます.
practicalscheme 『簡単なものならgauche.arrayモジュール中に少しあります。
速度や機能が必要なら、何らかの外部ライブラリを呼び出した方が良いと思われます。
こちらにgslを呼び出す例があります。Cライブラリ関数を呼び出しているのであんまり
Schemeらしくありませんが: http://ja.doukaku.org/comment/2334/』(2007/12/03 20:35)
2*2行列をn乗したいだけなので速度は必要ないっす. ということでGauche ユーザリファレンス: 9.1 gauche.array - 配列を使ったので大分とコードがすっきりしました.
(use gauche.array) (define (FIB2 n) (array-ref (array-expt (array (shape 0 2 0 2) '1 '1 '1 '0) (- n 1)) 0 0)) (FIB2 1000)
板倉さん(id:ita)の指摘により思い出したの(0,0)要素がFib(n)になることを利用したもの.
前原さんのところでも話あり.
See http://d.hatena.ne.jp/maehara/20071203