【问题标题】:Generating "own" Fibonacci sequence生成“自己的”斐波那契数列
【发布时间】:2012-04-26 14:44:41
【问题描述】:

我遇到了一个不寻常的(我认为)问题。对于给定的数字 F_n(我不知道 n 的值),我必须找到数字 F_0、F_1 使得 F_{n}=F_{n-1}+F_{n-2}。另一个困难是这个序列应该尽可能长(F_n 的值 n 应该是最高的),如果存在多个解决方案,我必须用最小的 F_0 来解决这个问题。简而言之,我必须生成我“自己的”斐波那契数列。一些例子:

在:F_n = 10; 出:F_0 = 0; F_1 = 2;

在:F_n = 17; 出:F_0 = 1; F_1 = 5;

在:F_n = 4181; 出:F_0 = 0; F_1 = 1;

我观察到的每个序列(使用“斐​​波那契规则”)F_n 有:

F_n = Fib_n * F_1 + Fib_{n-1} * F_0

Fib_n 是第 n 个斐波那契数。对于斐波那契数列尤其如此。但我不知道这个观察是否值得。我们不知道 n,我们的任务是找到 F_1、F_0,所以我认为我们一无所获。有什么想法吗?

【问题讨论】:

  • F_1 = F_nF_0 = 0 怎么样?你会得到最小的F_0
  • @Shahbaz:但不是最长的序列。
  • F_0 和 F_1 必须是非负数吗?
  • @oldboy,是的,我应该写这个
  • (4,1,5,6,11,17) 长于 (1,5,6,11,17) ;)

标签: algorithm fibonacci


【解决方案1】:

Fn-1 = round(Fn/φ)

其中 φ=(√5+1)/2。

证明留给读者练习;^P

更新这是不正确的,回到绘图板。

更新 2 让我们从 Fn 和 Fn-1 向后计算。

Fn-2 = Fn - Fn-1
Fn-3 = Fn-1 - Fn-2 = Fn-1 - (F n - Fn-1) = 2Fn-1 - Fn
Fn-4 = Fn-2 - Fn-3 = (Fn - Fn-1) - (2Fn-1 - Fn) = 2Fn - 3Fn- 1
Fn-5 = Fn-3 - Fn-4 = (2Fn-1 - F n) - (2Fn - 3Fn-1) = 5Fn-1 - 3F n
Fn-6 = Fn-4 - Fn-5 = (2Fn - 3Fn-1) - (5Fn-1 - 3Fn) = 5Fn - 8Fn- 1

注意到模式了吗?很容易从 real 斐波那契数列和最后两个成员中计算出序列的任何成员。但是我们只知道最后一个成员,我们怎么知道最后一个呢?

让我们用 Fn-1 的形式写下需求 Fi>0。

Fn-2 = Fn - Fn-1 > 0 ⇒ Fn-1n
Fn-3 = 2Fn-1 - Fn > 0 ⇒ Fn-1 > Fn/2
Fn-4 = 2Fn - 3Fn-1 ⇒ Fn-1 n/3
Fn-5 = 5Fn-1 - 3Fn ⇒ Fn-1 > 3F n/5

所以我们在 Fn-1 上有一系列界限,用书面形式表示真正的斐波那契数列,每个界限都比前一个更紧。仍然可满足的最后一个界限确定对应于最长序列的 Fn-1。如果有多个数满足最后一个界限,则使用最小或最大的一个,具体取决于序列的长度是偶数还是奇数。

例如,如果 Fn=101,那么
101*5/8 n-1 n-1 = 63

之前的(不正确的)解决方案将暗示 Fn-1 = 62,这是接近但没有雪茄。

【讨论】:

  • @Karoly Horvath:这不是以 101 结尾的最长的类斐波那契序列。
  • 证明留给读者作为练习 如果你只是猜测,请不要这么说,因为 [11, 1, 12, 13, 25, 38, 63, 101] 优于 [9, 7, 16, 23, 39, 62, 101]。对于我们这些知识渊博、负责任地使用它的人来说,它给我们带来了永无止境的头痛。
  • @oldboy 你是对的,我认为我有一个证据,但显然它充满了漏洞。
  • 另一方面,这是一个非常好的近似值 - 我测试了从 10 到 1000 的所有数字,它与倒数第二个最佳元素的距离从未超过 1.5。
  • 原来这个公式:F_{n-1} = round(F_n/φ) 是绝对正确的。每个具有“斐波那契规则”的序列 F_n=F_{n-1}+F_{n-2} 满足: lim n 到 infty F_{n+1}/F_n = φ。这直接来自这些序列的生成函数。
【解决方案2】:

你的方程式

F_n = Fib_n * F_1 + Fib_{n-1} * F_0

linear Diophantine equation in two variables F_1F_0。该链接提供了一种有效的算法来计算解决方案集的描述,该算法允许您找到解决方案(如果存在),F_1 >= 0F_0 >= 0F_0 最小值。然后您可以尝试猜测n = 0, 1, ...,直到您发现没有解决方案。这种方法在log(F_n) 中是多项式的。

【讨论】:

  • 奖励:您可以使用Cassini's identity 来避免实现扩展的欧几里得 GCD。
  • 编码很难,但我认为最好的方法,至少我最喜欢它。
【解决方案3】:

我不确定您在寻找什么。您提到的递归系列定义为:

Fn = F{n-1} + F{n-2}

显然,如果凝视值可以是任何值,我们可以随意选择F{n-1},它会给出F{n-2} ( = Fn=F{n-1})。知道F{n-1} = F{n-2} + F{n-3},则可以从F{n-1} and F{n-2} 计算出F{n-3}。这意味着您可以将数字追溯到无穷大,因此没有“最长”序列,并且有无限多个有效序列。

在某种程度上,您正在计算一个初始值 F{n}F{n-1} 的逆斐波那契数列,其中 F{i} = F{i+2}-F{i+1}i 永远递减

更新: 如果您希望将解决方案空间限制为所有F{i} 都是非负整数的结果,您将只能获得少数(大多数情况下是单例)解决方案。

如果你计算原始斐波那契数(Fib{i}),很快你就会得到F{n} < Fib{i-1};显然你不需要再进一步了。然后你可以尝试F{0}F{1} 的所有可能组合,这样F{n} <= Fib{i} * F{1}+ Fib{i-1} * F{0} - 非负F{0}F{1} 的可能性是有限的(你显然可以排除F{0}=F{1}=0 )。然后看看哪个i(s) 在满足平等的那些中最高——你也会得到F{0}F{1}

【讨论】:

  • 非常抱歉,我只是没睡好,也没有写好。“最长的序列”我的意思是序列在给定的 F_n 处结束。简单地说,值 n(我们不知道,我介绍它是为了更好地理解)必须是最高的。
  • 虽然他没有提到,但我确定他正在寻找 非负数 整数
  • 是的,所以你从n“向后”走,发现没有“最高”n,这样序列就停止了。
  • 很容易猜测这将定义在整数上,因此 0
  • @DRVic,确切地说......如果存在多个序列,我们必须使用最小的 F_0。 F_n 是非负整数..
【解决方案4】:

F_n = Fib_n * F_1 + Fib_{n-1} * F_0

Fib_n 是第 n 个斐波那契数。尤其是对于 斐波那契数列。但我不知道这个观察是否 什么都值得。我们不知道 n,我们的任务是找到 F_1, F_0 所以我 认为我们一无所获。

嗯,你正在寻找最长的序列,这意味着你想最大化n

为斐波那契数创建一个查找表。从最大的n 开始,例如Fib_n <= F_n,表中的前一个条目是fib_n{n-1}。现在唯一的变量是F_1F_0。解决linear Diophantine equation。如果它有解决方案,你就完成了。如果没有,请将 n 减 1,然后重试,直到找到解决方案。

注意:解决方案始终存在,因为F_2 = 1 * F_1 + 0 * F_0 有解决方案F_2 = F_1

【讨论】:

  • ((Shahbaz 在这篇文章前 21 分钟从注释中讽刺了解决方案 - 这并不意味着(她)他(不要介意面部毛发)首先观察到它。)如果你设法允许对于 F_1 …
【解决方案5】:

使用矩阵模拟斐波那契数的计算(但具有不同的初始值)。当乘以 [F_{n}, F_{n+1}] 时,[[0 1] [1 1]] 的 k 次幂将得到 [F_{n+k}, F_{n+1+k}]。

由于矩阵的幂次是 O(log n)(假设整数的乘法是 O(1)),您可以在 O(log n) 时间内执行整个计算,直到矩阵系数开始主导计算。

我不知道你正在处理的数字有多大,但是这个矩阵的 n 次方是 [[F_{n-1} F_n] [F_n F_{n+1}]]。和 log(F_n) ~ n/5(所以第 10 亿个斐波那契数大约有 2 亿位)。

【讨论】:

    猜你喜欢
    • 2011-12-18
    • 2015-04-25
    • 2017-11-13
    • 1970-01-01
    • 2011-02-20
    • 2013-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多