关于算法:关于Fibonacci数所需的位数

about number of bits required for Fibonacci number

我在读S.Dasgupta的一本算法书。下面是文本中关于第n个斐波那契数所需位数的文本片段。

It is reasonable to treat addition as
a single computer step if small
numbers are being added, 32-bit
numbers say. But the nth Fibonacci
number is about
0.694n bits long, and this can far exceed 32 as n grows. Arithmetic
operations on arbitrarily large
numbers cannot possibly be performed
in a single, constant-time step.

我的问题是,例如,对于斐波那契数f1=1,f2=1,f3=2,依此类推。然后用上述公式中的"n"替换,即用0.694n替换f1约为1,用f2约为2位,但用f3等替换,则上述公式失败。我想我不太明白作者的意思,有人能帮我理解吗?

谢谢


好,

1
2
3
4
5
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
3
4
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它基于比奈公式。需要它:斐波那契序列二元图。参见:http://bigineges.blogspot.com/2012/09/fibonacci-sequence-binary-plot-edd-peg.html


首先,单词about非常重要,就像在the nth Fibonacci number is about 0.694n bits long中一样。其次,我认为作者的意思是当n->infinity时。尝试一些大数字并检查:)


作者基本上描述了大数字对算法性能的影响。要过于简单,处理器可以很快地添加寄存器大小的数字,如果数字超过寄存器大小,则需要执行更多的低级处理器指令。


1
2
3
4
5
6
7
8
9
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)=1836311903。


我认为他只是用斐波那契数来说明他的观点,对于大数字(>32位),加法不能再假定为常量,因为它涉及的不仅仅是CPU上的一条指令。

为什么这个公式会失败?对于f3=2,二进制表示需要2bits(3*0.694=2.082),取f50=12586269025,可以用33位(50*0.694=35)表示,该33位仍相当接近真值。


你不能说半句…位数必须四舍五入

所以它意味着

1
number of bits = Math.ceil(Math.max(0.694*n,32));

所以它的四舍五入为n>32,32为n<32

对于32位系统

数字可能不准确