广义斐波那契数

2025年2月6日 | 阅读9分钟

理解广义斐波那契数列

斐波那契数列是一个著名的数学序列,它以两个起始项开始,通常表示为 0 和 1。序列中的每一项都是前两项之和。例如,斐波那契数列的第 n 项可以表示为

F(n) 则 F(n)=F(n-1)+F(n-2)

广义斐波那契数列在此基础上,允许使用不同的起始值和组合技术。它们可以以任意两个数字开始,表示为 a 和 b,而不是传统的 0 和 1。

示例

当然!考虑一个广义斐波那契数列,其起始项为 3 和 4。在这种情况下,数列将如下开始

3, 4

为了生成后续项,我们使用与标准斐波那契数列相同的规则,每一项都是前两项之和。因此,数列将继续如下

3 + 4 = 7

4 + 7 = 11

7 + 11 = 18

11 + 18 = 29

以此类推。

在此示例中,第三项 (7) 是通过将前两项 (3 和 4) 相加计算得出的,这与原始斐波那契数列完全相同。同样,每个后续项都是通过组合前两项生成的。

因此,以 3 和 4 为起始项的广义斐波那契数列将如下所示

3, 4, 7, 11, 18, 29, 47, ...

方法一:代数方法

理解广义斐波那契数列的代数方法是用代数表达式描述序列,并开发一个递归公式来生成后续项。这种方法对于识别序列第 n 项的封闭形式表达式和理解其属性非常有用。

让我们通过一个简单的广义斐波那契数列示例来回顾代数技术,其中起始项为 a=1 和 b=2。我们将创建一个递归公式来生成后续项,然后使用 Python 计算直到某个项的序列。

1. 定义初始项。

例如,a=1 和 b=2

2. 定义 b = 2 的递归公式。

广义斐波那契数列使用与传统斐波那契数列相同的递归公式:每一项都是前两项之和。因此,递归公式为

F(n) = F(n-1) + F(n-2)

F(n) 表示序列中的第 n 项。

复杂度分析

  • 此实现的 time complexity 为 O(n),因为它迭代序列直到第 n 项。
  • space complexity 为 O(1),因为它只需要固定数量的额外空间来存储中间变量。

实施

输出

Generalised Fibonacci numbers

说明

  1. 我们定义一个名为 generalizedFibonacci 的方法,它接受三个参数:n(要计算的项的索引)、a(第一个初始项)和 b(第二个初始项)。
  2. 我们通过返回相应的初始项 a 和 b 来处理 n=0 和 n=1 的基本情况。
  3. 我们使用迭代循环来计算序列的第 n 项。我们从第 2 项开始,通过将前两项相加来迭代计算每一项。
  4. 在循环中,prev1 和 prev2 保存前两项,current 保存正在计算的当前项。
  5. 最后,我们返回序列的第 n 项。
  6. 在 main 方法中,我们提供初始项 a 和 b 以及我们要计算项的索引 n。然后我们打印结果。

方法二:矩阵乘法

将广义斐波那契数列表示为矩阵。创建一个包含递推关系系数的矩阵 A 和包含序列前几项的初始状态向量 v。要构造序列,请对 A 进行矩阵指数运算,并给出初始状态 v。

1. 矩阵表示

  • 我们用一个矩阵来表示广义斐波那契数列。M 是一个 2×2 矩阵。
    矩阵 M 定义如下
    Generalised Fibonacci numbers
  • 序列的起始项(a 和 b)表示为列向量
    Generalised Fibonacci numbers

2. 矩阵指数运算

  • 使用矩阵指数运算,我们将矩阵 M 提高到 n-1 次幂以得到 Mn-1
  • 结果矩阵 Mn-1 将包含计算序列第 n 项所需的系数。

3. 最终计算

  • 要获得序列的第 n 项,需要将 Mn-1 乘以原始向量 v。

复杂度分析

  • 使用矩阵乘法计算斐波那契或广义斐波那契数列的时间复杂度为 O(logn)。
  • 使用矩阵乘法计算斐波那契或广义斐波那契数列的空间复杂度为 O(1)。

实施

输出

Generalised Fibonacci numbers

说明

1. 矩阵幂次方法

  • 此技术用于计算矩阵的幂次。如果您不熟悉矩阵,可以将其想象为数字表格。我们可以像乘整数一样将矩阵相乘,但过程更复杂。
  • 为了计算矩阵的幂次,我们采用一种称为“分治法”的技术。我们不是重复地进行矩阵乘法,而是将操作分解成更小的部分。为了得到最终解,我们将矩阵提高到所需幂次的一半,然后将其结果乘以自身。
  • 我们重复此过程,直到达到指定的幂次水平,届时我们将返回结果。
  • 我们重复此过程,直到达到指定的幂次水平,届时我们将返回结果。

2. MultiplyMatrices 方法

  • 此方法涉及将两个矩阵相乘。当我们相乘矩阵时,我们将一个矩阵的行与另一个矩阵的列混合,以得到最终矩阵。
  • 为此,我们遍历输出矩阵的每个元素,并使用两个输入矩阵中相应行和列的点积来计算其值。

3. Generalized Fibonacci 方法

  • 此方法利用矩阵幂次技术来计算广义斐波那契数列的第 n 项。
  • 它初始化一个定义序列变换规则的矩阵,以及一个表示前两项的初始向量。
  • 使用 matrixPower 方法将变换矩阵提高到 1n1 的幂次。
  • 最后,将结果矩阵乘以原始向量,以获得序列的第 n 项。

4. Main 方法

  • 在 main 方法中,我们指定起始项(a 和 b)以及要计算序列第 n 项的 n 值。
  • 我们使用这些参数调用 generalizedFibonacci 方法,并输出结果。

方法三:使用 DP 列表法(Tabulation)

动态规划 (DP) 列表法是计算斐波那契或广义斐波那契数列的另一种有效方法。在 DP 列表法中,序列从底部向上重复构建,并将中间结果保存在数组或表中。我们来解释一下 DP 列表法是如何工作的

1. 初始化

  • 我们设置一个数组来保存斐波那契数或广义斐波那契数列的项。数组的大小由我们希望计算的项数决定。
  • 我们使用指定的初始项在数组中初始化序列。

2. 迭代计算

  • 从第三项(索引 2)开始,我们使用先前计算的项来迭代计算序列中的每个后续项。
  • 我们使用循环从 2 迭代到 n,其中 n 是要计算的项的索引。
  • 在每次迭代中,我们使用递推关系计算序列的第 i 项,并将其存储在数组中。

3. 最终结果

  • 计算完所有直到第 n 项的项后,数组中位置 n 处存储的值表示所需的斐波那契数或广义斐波那契数。它取决于提供的起始项。

时间复杂度

DP 列表法的时间复杂度为 O(n),因为我们需要迭代计算序列中的每一项直到第 n 项。

空间复杂度

DP 列表法的空间复杂度也为 O(n),因为我们需要将整个序列存储在数组中,该数组有 n 个元素。

实施

输出

Generalised Fibonacci numbers

说明

  • 广义斐波那契方法需要三个参数:n(要计算的项的索引)、a(第一个起始项)和 b。
  • 我们从基本情况开始,当 n 为 0 或 1 时,返回起始项。
  • 然后我们设置一个数组 fib 来保存序列的项。它的长度为 n + 1,以便进行零基索引。
  • 我们使用循环填充数组,使用递推关系重复计算每一项。
  • 最后,我们返回索引 n 处的值,代表序列的第 n 项。
  • 在 main 方法中,我们演示了如何使用 n = 5、a = 2 和 b = 3 调用 generalizedFibonacci 并输出结果。

应用与意义

1. 密码学

  • 广义斐波那契数已被用于密码学技术中,用于生成伪随机整数和加密密钥。
  • 广义斐波那契数列的不可预测性使其在提供安全性和匿名性的加密方法中具有价值。

2. 生物学

  • 在叶片排列、树木分枝、贝壳和花朵的螺旋等生物现象中可以看到类似斐波那契数列的模式。
  • 广义斐波那契数为了解和理解这些模式提供了一个基础,从而为生物学中的叶序和形态发生学主题做出了贡献。

3. 金融

  • 斐波那契数及其推广已在金融市场中找到应用,尤其是在技术分析中。
  • 交易员使用由广义斐波那契数列产生的斐波那契回撤位来检测价格变动中的潜在支撑和阻力位,这有助于他们在金融交易中做出决策。

4. 计算机科学

  • 广义斐波那契数列为计算机科学的许多领域的算法创建和优化提供了机会。
  • 它们被用于动态规划技术、组合问题和计算几何中,有助于构建高效的算法和数据结构。

5. 教育

  • 广义斐波那契数列是数学教学中的精彩示例,展示了递归、序列和模式等主题。
  • 它们允许动手探究和发现,这有助于激发孩子们对数学的兴趣和好奇心。

结论

广义斐波那契数为了密押、生物学、经济学和计算机科学的应用提供了一个丰富的基础。除了其经典的起源之外,这些序列拓宽了我们对数学模式的理解,并为各种现实世界挑战提供了答案。它们的意义源于其在各个领域的广泛应用,在这些领域中,它们被用作加密工具、自然现象模型、金融市场预测器和计算机作业算法。