高速フィボナッチ
http://oss.timedia.co.jp/index.fcgi/kahua-web/show/ossz/oneline/2004-11-29
古い記事やけど、なんか最近知った。フィボナッチ数をO(log n)で計算するアルゴリズム。考えてみればフィボナッチ数の一般項とかでもn乗が入ってるから、あれをm^nの要領でO(log n)にまでオーダを落とせるような気がしないでもない感じか?
まぁ、このアルゴリズムは同じ要領でも全然理解できんのやが。状態変数pとqは一体何の意味だ…?
一応Schemeで書くとこんなんかなぁ。
(define (fib n) (let loop ((a 1) (b 0) (p 0) (q 1) (c n)) (cond ((= c 0) b) ((even? c) (loop a b (+ (* p p) (* q q)) (+ (* 2 p q) (* q q)) (/ c 2))) (else (loop (+ (* b q) (* a q) (* a p)) (+ (* b p) (* a q)) p q (- c 1))) )))
のあたりでteranishiさんが解説している。なるほどねー…。数式ぐにゃぐにゃやってますな。