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来自这样一个事实:
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
首先,单词
作者基本上描述了大数字对算法性能的影响。要过于简单,处理器可以很快地添加寄存器大小的数字,如果数字超过寄存器大小,则需要执行更多的低级处理器指令。
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位系统
数字可能不准确