番目のフィボナッチ数を計算する効率的なアルゴリズム


11

フィボナッチ数目は、次の再発を用いて線形時間で計算することができます。n

def fib(n):
    i, j = 1, 1
    for k in {1...n-1}:
        i, j = j, i+j
    return i

フィボナッチ数番目はまた、計算することができる[ φ N / n。ただし、これにはnが比較的小さい場合でも丸めの問題があります。おそらくこれを回避する方法はありますが、私はそれをやめたいです。[φn/5]n

浮動小数点演算に依存しないn番目のフィボナッチ数を計算するための効率的な(値以上の対数)アルゴリズムはありますか?整数演算(+×/)を一定の時間で実行できると仮定します。nn+×/


5
提案として、フィボナッチ数に関するウィキペディアの記事には多くの方法があります。
仮名

cf. stackoverflow.com/questions/14661633/…およびその中と周辺のリンク。
ウィルネス

回答:


14

行列乗法と恒等式 計算モデルでは、繰り返しの2乗を使用してパワーを実装する場合、これはO log n アルゴリズムです。

[1110]n=[Fn+1FnFnFn1].
O(logn)

1
それは古典です。
-dfeuer

8
このアイデンティティを使用して、繰り返しおよびF 2 n = F 2 n + 2 F n 1 F nを導出することもできます。F2n1=Fn2+Fn12F2n=Fn2+2Fn1Fn
8

4

この数学的記事を読むことができます:大きなフィボナッチ数を計算するための高速アルゴリズム(高橋 read ): PDF

さらに簡単に、C ++(GMPの有無にかかわらず)およびPythonでいくつかのフィボナッチのアルゴリズムを実装しました。Bitbucketの完全なソース。メインページから、次のリンクにアクセスすることもできます。

  • C ++ HTMLオンラインドキュメント。
  • 小さな数学文書: フィボナッチ数-良いアルゴリズムを実装するためのいくつかの関係

最も有用な式は次のとおりです。

  • F2n=Fn+12Fn12=2FnFn1+Fn2
  • F2n+1=Fn+12+Fn2

アルゴリズムに注意してください。同じ値を複数回計算しないでください。単純な再帰アルゴリズム(Python):

def fibonacci_pair(n):
    """Return (F_{n-1}, F_n)"""
    if n != 0:
        f_k_1, f_k = fibonacci_pair(n//2)  # F_{k-1},F_k with k = n/2

        return ((f_k**2 + f_k_1**2,
                 ((f_k*f_k_1)*2) + f_k**2) if n & 1 == 0  # even
                else (((f_k*f_k_1)*2) + f_k**2,
                      (f_k + f_k_1)**2 + f_k**2))
    else:
        return (1, 0)

O(logn)


2
コンピュータサイエンスへようこそ。回答にさらに情報を追加していただけますか?現時点では、2つのリンクに過ぎないため、これらのリンクが停止するか、リンクが接続されているサーバーが使用できない場合、答えは意味がなくなります。詳細情報へのリンクは問題ありませんが、ここのリンクのみが情報です。また、質問はC ++の実装ではなく、アルゴリズムに関するものであることに注意してください。実装は、言語固有の詳細の背後にあるアルゴリズムをあいまいにする傾向があります。
デビッドリチャービー

デビッド、最初のリンクは数学的記事へのリンクです。「高速アルゴリズム[...]」というタイトルは、「効率的な(値n以上の対数)アルゴリズム[...]?」という質問に対する答えです。2番目のリンクは、C ++ および Python でのさまざまな実装へのリンクであり、いくつかの数式を含む小さな数学文書です。
オリビエパイソン

2
いいえ、あなたの答えが含まれている記事のタイトルは何も答えません。回答にほとんど何も含まれていない記事のテキストは、おそらく質問に答えているようです。ただし、Stack Exchangeは、リンクファームではなく、質問と回答のサイトです。(そして、いいえ、記事をコピーして回答に貼り付けることはお勧めしません。しかし要約が必要です。)
デビッド・リチャービー

要約が必要な場合は、それを書いてください!
オリビエパイソン

0

で定数係数を使用して線形回帰を計算するための基本理論とコード Oログ2nhttp://www.jjj.de/から入手できます

無料の本Matters Computationalとpari / gpコードを確認してください。


5
リンクを投稿するだけでなく、アイデアを要約する方が良いでしょう。
8
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.