我有一个不寻常的(我认为)问题。对于给定数量F_n(我不知道n的值),我必须找到数字F_0,F_1,使得F_ {n} = F_ {n-1} + F_ {n-2}。另外的困难是这个序列应该尽可能长(F_n的值n应该是最高的),如果存在多个解决方案,我必须用最小的F_0。总之,我必须生成我自己的“斐波那契”序列。一些例子:
in:F_n = 10; out:F_0 = 0; F_1 = 2;
in:F_n = 17; out:F_0 = 1; F_1 = 5;
in:F_n = 4181; out:F_0 = 0; F_1 = 1;
我观察到的每个序列(“Fibonacci规则”)F_n都有:
F_n = Fib_n * F_1 + Fib_ {n-1} * F_0
其中Fib_n是第n个斐波那契数。特别是斐波纳契数列确实如此。但我不知道这种观察是否值得。我们不知道n,我们的任务是找到F_1,F_0因此我认为我们什么也没有获得。有什么想法吗?
答案 0 :(得分:3)
F n-1 = round(F n /φ)
其中φ=(√5+ 1)/ 2。
证明留给读者练习; ^ P
更新这是错误的,回到绘图板。
更新2 让我们从F n 和F n-1 向后计算。
F n-2 = F n - F n-1
F n-3 = F n-1 - F n-2 = F n-1 - (F n - F n-1 )= 2F n-1 - F n
F n-4 = F n-2 - F n-3 =(F n - F n-1 ) - (2F n-1 - F n )= 2F n - 3F n- 1 子>
F n-5 = F n-3 - F n-4 =(2F n-1 - F n ) - (2F n - 3F n-1 )= 5F n-1 - 3F ñ子>
F n-6 = F n-4 - F n-5 =(2F n - 3F n-1 ) - (5F n-1 - 3F n )= 5F n - 8F n- 1 子>
注意模式?很容易从真实的 Fibonacci序列和最后两个成员计算序列的任何成员。但是我们只知道最后一个成员,我们怎么能知道最后一个呢?
让我们用F n-1 来记下要求F i > 0。
F n-2 = F n -F n-1 &gt; 0⇒F n-1 &lt; ˚F<子>名词子>
F n-3 = 2F n-1 -F n 0⇒F n-1 &gt; ˚F<子>名词子> / 2
F n-4 = 2F n -3F n-1 ⇒F n-1 &lt; 2F <子>名词子> / 3
F n-5 = 5F n-1 -3F n ⇒F n-1 &gt; 3F <子>名词子> / 5
因此,我们在实际Fibonacci序列的书面术语中有一个F n-1 的边界序列,每个都比前一个更紧密。仍然可满足的最后一个界限确定对应于最长序列的F n-1 。如果有多个数字满足最后一个边界,则使用最小或最大的数字,具体取决于序列是偶数还是奇数。
例如,如果F n = 101,则为 101 * 5/8&lt; F n-1 &lt; 101 * 8 /13⇒F n-1 = 63
先前(不正确)解决方案意味着F n-1 = 62,这是接近但没有雪茄。
答案 1 :(得分:2)
我不确定你在找什么。你提到的递归系列定义为:
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-3}
之后可以从F{n-1} and F{n-2}
计算F{n}
。这意味着您可以将数字追溯到无穷大,因此没有“最长”的序列,并且有无限多的有效序列。
在某种程度上,您正在计算具有初始值F{n-1}
和F{i} = F{i+2}-F{i+1}
的反Fibonacci序列,其中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}
和{{1}只有一定数量的可能性(显然可以排除F{0}=F{1}=0
)。然后看看哪些i
(s)在满足平等的那些中是最高的 - 你得到F{0}
和F{1}
答案 2 :(得分:2)
你的等式
F_n = Fib_n * F_1 + Fib_{n-1} * F_0
是linear Diophantine equation in two variables F_1
和F_0
。该链接提供了一种有效的算法来计算解决方案集的描述,使您可以找到解决方案(如果存在),最小F_1 >= 0
,F_0 >= 0
和F_0
。然后,您可以尝试猜测n = 0, 1, ...
,直到找不到解决方案。这种方法是log(F_n)
中的多项式。
答案 3 :(得分:2)
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_1
和F_0
。解决linear Diophantine equation。如果它有解决方案,你就完成了。如果没有,请将n
减1,然后重试,直到找到解决方案。
注意:解决方案始终存在,因为F_2 = 1 * F_1 + 0 * F_0
具有解决方案F_2 = F_1
。
答案 4 :(得分:0)
模拟用矩阵计算Fibonacci数(但具有不同的初始值)。 [[0 1] [11]]到幂k将在乘以[F_ {n},F_ {n + 1}]时产生[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}] ]。并记录(F_n)~n / 5(因此第十亿个斐波那契数字将有大约2亿个数字)。