我正在阅读S.DasGupta的算法书。以下是有关第n个Fibonacci数所需的位数的文本的文本片段。
将加成视为合理是合理的 单个计算机步骤,如果小 正在添加数字,32位 数字说。但第n个斐波那契 数字是关于 0.694n位长,随着n的增长,这可能远远超过32。算术 任意大的操作 不可能执行数字 在一个单一的,恒定的时间步骤。
我的问题是,例如,对于Fibonacci数F1 = 1,F2 = 1,F3 = 2,依此类推。然后用上述公式中的“n”代替,即F1的0.694n约为1,F2约为2位,但对于F3等,上述公式失败。我想我并不理解作者在这里的意思,任何人都可以帮助我理解这个吗?
由于
答案 0 :(得分:7)
那么,
n 3 4 5 6 7 8
0.694n 2.08 2.78 3.47 4.16 4.86 5.55
F(n) 2 3 5 8 13 21
bits 2 2 3 4 4 5
log(F(n)) 1 1.58 2.32 3 3.7 4.39
所需位数是基础2日志的四舍五入,所以这对我来说足够接近。
值0.694来自F(n)
是与(φ n )/√5最接近的整数这一事实。因此log(F(n))
为n * log(phi) - log(sqrt(5))
,log(phi)
为0.694。随着n
越来越大,log(sqrt(5))
和四舍五入迅速变得无足轻重。
答案 1 :(得分:2)
private static int nobFib(int n) // number of bits Fib(n)
{
return n < 6 ? ++n/2 : (int)(0.69424191363061738 * n - 0.1609640474436813);
}
检查n为0到500.000,n = 500.000.000,n = 1.000.000.000
它基于比奈的公式
需要它:Fibonacci序列二元图。
请参阅:http://bigintegers.blogspot.com/2012/09/fibonacci-sequence-binary-plot-edd-peg.html
答案 2 :(得分:1)
首先,about
这个词非常重要,就像the nth Fibonacci number is about 0.694n bits long
一样。其次,我认为作者的意思是n->infinity
。尝试一些大号并检查:)
答案 3 :(得分:0)
你不能说半个......必须舍入的位数
所以这意味着
number of bits = Math.ceil(Math.max(0.694*n,32));
因此,对于n&lt; 32
,其向上取整为n> 32和32用于32位系统
并且数字可能不准确
答案 4 :(得分:0)
我认为他只是使用Fibonacci数字来说明他的观点,即对于大数(> 32位)的加法不能再被认为是常数,因为它不仅仅涉及CPU上的单指令。
为什么公式失败?对于F3 = 2,二进制表示需要2位(3 * 0.694 = 2.082)取F50 = 12586269025,可以使用33位(50 * 0.694 = 35)表示,这仍然合理地接近真实值。
答案 5 :(得分:0)
N F(N) 0.694*N
1 0 1
2 1 1
3 1 1
4 2 2
5 3 2
6 5 3
7 8 4
8 13 4
等。这是我的解释。但是,这意味着你必须在超过32位之前得到f(47)= 1,836,311,903。
答案 6 :(得分:0)
作者基本上描述了大数字如何影响算法的性能。过于简单,处理器可以非常快速地添加寄存器大小的数量,如果数字超过寄存器大小,则需要执行更低级别的处理器指令。