c++ - 斐波那契数列乘积之和

标签 c++ algorithm math fibonacci

<分区>

给定一个序列

Fib(1) * Fib (n+2) + Fib(2) * Fib(n+1) + Fib(3) * Fib(n) + ...... + Fib(n-1) * 斐波那契(4)

或求和 Fib(x) * Fib (n-x+3) 其中 x 在 1 到 n-1 之间变化 其中 Fib(n) 是斐波那契数列的第 n 个数

要评估这个系列,可以使用矩阵求幂计算 Fib(n)。

但是这个的复杂度是 logn,对于 n 项,它是 nlogn。

我希望这个系列减少到单个项或一些其他优化以提高 *时间复杂度。*

有什么建议吗??

最佳答案

我无法将总和缩减为单个项,但可以将其缩减为五个项的总和,从而将复杂度降低为 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

关于c++ - 斐波那契数列乘积之和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12248587/

相关文章:

ios - 计算正确的冲力或力以将 Box2D 主体移动到特定位置 - Box2D

c++ - 当涉及路径时,如何编写与系统无关的代码?

c++ - 程序在 cout 上崩溃并出现新行 "\n"

c++ - 在没有预处理器的情况下从 hana 元组创建函数签名

python - python/numpy 中矩阵的条件和

java - 将 SIFT 用于增强现实

c++ - 视觉 C++ 2005 : How to view the window during a debugging session

algorithm - 计算球坐标中角距离内的点

math - 如何开始信息提取?

java - 计算器仅在第一次运行