合計を 1 つの項に減らすことはできませんが、5 つの項の合計に減らすことはできます。これにより、O(log n)
算術演算の複雑さが軽減されます。
ただし、ビットFib(n)
がΘ(n)
あるため、ビット操作の数は対数ではありません。Fib(n)
とのサイズの数値の乗算があるn-1
ため、ビット操作の数は ですM(n,log n)
。ここで、 はビット数とビット数M(a,b)
の乗算のビット操作の複雑さです。単純なアルゴリズムの場合、、したがって、以下のアルゴリズムのビット操作の数は です。a
b
M(a,b) = a*b
O(n*log n)
この削減を可能にする事実は、フィボナッチ数 (線形再帰によって定義される数列内のすべての数と同様) が純粋な指数項の和として記述できることです。特に、
Fib(n) = (α^n - β^n) / (α - β)
どこ
α = (1 + √5)/2; β = (1 - √5)/2.
フィボナッチ数に加えて、フィボナッチ数と同じ繰り返しに従うルーカス数も使用します。
Luc(n) = α^n + β^n
したがって、ルーカス数のシーケンス (インデックス 0 から始まる) は次のように始まります。
2 1 3 4 7 11 18 29 47 ...
この関係Luc(n) = Fib(n+1) + Fib(n-1)
により、フィボナッチ数とルーカス数の間の簡単な変換が可能になりLuc(n)
、O(log n)
段階的な計算でフィボナッチ コードを再利用できます。
したがって、上記のフィボナッチ数の表現で、
(α - β)^2 * Fib(k) * Fib(n+3-k) = (α^k - β^k) * (α^(n+3-k) - β^(n+3-k))
= α^(n+3) + β^(n+3) - (α^k * β^(n+3-k)) - (α^(n+3-k) * β^k)
= Luc(n+3) - ((-1)^k * α^(2k) * β^(n+3)) - ((-1)^k * α^(n+3) * β^(2k))
関係を使用しα * β = -1
ます。
さて、α - β = √5
合計k = 1, ..., n-1
が得られるので
n-1 n-1 n-1
5 * ∑ Fib(k)*Fib(n+3-k) = (n-1)*Luc(n+3) - β^(n+3) * ∑ (-α²)^k - α^(n+3) * ∑ (-β²)^k
k=1 k=1 k=1
幾何学的和は閉じた形式で書くことができ、少しジャグリングすると式が得られます
n-1
∑ Fib(k)*Fib(n+3-k) = [5*(n-1)*Luc(n+3) + Luc(n+2) + 2*Luc(n+1) - 2*Luc(n-3) + Luc(n-4)]/25
k=1