数学ガールを読むぞぉ 7 - フィボナッチ数列の一般項(2)

フィボナッチ数列の一般項の続きです。


フィボナッチの一般項は、

F_n = \frac{1}{\sqrt{5}} \left\{ \left( \frac{1+\sqrt{5}}{2} \right)^n - \left( \frac{1-\sqrt{5}}{2} \right)^n \right\}

なんですが、(1 + √5)^nの計算が重い。結局n回展開しなければならないため、計算回数は反復の時と変わらなかった。桁落ちしてしまうので、浮動小数点は使いたくないし・・・。


むむぅ・・・と考え。


あ。


あらかじめ展開してやればいいじゃないか!!


ということで、√5をxと置きます。

\frac{(1+x)^n-(1-x)^n}{2^nx}

だいぶスッキリです。


上の部分だけ計算すると、

0 : 1 - 1                                         = 0
1 : (1 + x) - (1 - x)                             = 2x
2 : (1 + 2x + x^2) - (1 - 2x + x^2)               = 4x
3 : (1 + 3x + 3x^2 + x^3) - (1 - 3x + 3x^2 - x^3) = 6x  +  2x^3
4 : ...                                           = 8x  +  8x^3
5 :                                               = 10x + 20x^3 +  2x^5
6 :                                               = 12x + 40x^3 + 12x^5

何かパターンがありそうなんだけど見えない。


うぅん。式にどんな性質があるんだろう。とじっと式を眺めてみると。

1
1  1
1  2  1
1  3  3  1
1  4  6  4  1
1  5 10 10  5  1
1  6 15 20 15  6  1
   ^     ^     ^

を2倍したの偶数列。


パスカルの三角形!!


とりあえず計算してみる。6の時、

(12x + 40x^3 + 12x^5) / 2^6x
(12 + 40x^2 + 12x^4) / 2^6
(12 + 40 * 5 + 12 * 25) / 2^6
512 / 64
8

フィボナッチが計算出来ました。


二項定理を使えば出てきそうです。


つまり、フィボナッチ数列の一般項は、

F_n= \frac{2\sum_{k=0}^{n/2}5^k nC_{2k+1}}{2^n}

とも書けるようだ。


誰も信用してくれないだろうけど、フィボナッチが出るんだよ!!


√5が消えたので、浮動小数点を使わなくて良くなった。


さて、Schemeに直す。

(define (combi n r)
  (if (= r 0)
      1
      (* (/ (+ (- n r) 1) r)
         (combi n (- r 1)))))

(define (fib n)
  (/ (* 2 (apply +
                 (list-tabulate (quotient n 2)
                                (lambda (m)
                                  (* (expt 5 m)
                                     (combi n (+ 1 (* 2 m))))))))
     (expt 2 n)))

(fib 10) ; 55

重い・・・階乗の計算をしてるので、二項定理の和が非常に遅い。しかしまだまだ改善できる余地のある形となった。


パスカルの三角形からフィボナッチが出てくるなんて・・・不思議すぎる。


求め方が違うけど、wikipediaにもパスカルの三角形との関係が書かれていた。

パスカルの三角形をずらして、足すと。

1
   1  1
      1  2  1
         1  3  3  1
            1  4  6  4  1
               1  5 10 10  5  1
                  1  6 15 20 15  6  1
-------------------------------------
1  1  2  3  5  8 13 ...

ちっ。僕の発見じゃなかったか(笑


よく考えてみると二項定理はn回の計算が必要なので、高速化したところで限界が見える。√5を外に出すまで展開しないという条件を付けると、速度的には望めない状況のようだ。


ま、自分の力で二項定理まで辿りつけたので、今回は良しとしとこう。


あ、ちと旅行に出かけます。