我不能将总和减少为一项,但可以将其减少为五项的总和,从而降低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