Python中不准确的大型Fibonacci数

时间:2017-01-03 19:12:25

标签: python fibonacci

我目前正在实现这个简单的代码,试图使用Python 2.7找到Fibonacci序列的第n个元素:

import numpy as np

def fib(n):
        F = np.empty(n+2) 
        F[1] = 1
        F[0] = 0
        for i in range(2,n+1):
            F[i]=F[i-1]+F[i-2]
        return int(F[n])

这适用于F< 79,但之后我得错了号码。例如,根据wolfram alpha F79应该等于14472334024676221,但是fib(100)给了我14472334024676220。我认为这可能是由python处理整数的方式引起的,但我不知道究竟是什么问题。非常感谢任何帮助!

4 个答案:

答案 0 :(得分:11)

numpy数组的默认数据类型是depending on architecture 64(或32)位int。

纯python会让你有任意长整数; numpy没有。

所以numpy处理整数的方式更多;纯python会做得很好。

答案 1 :(得分:2)

Python将完全处理整数。的确,这就是python的 beauty 。另一方面,numpy引入了丑陋,恰好完全没必要,并且可能会减慢你的速度。您的实现还需要更多空间。 Python允许您编写漂亮,可读的代码。这是Raymond Hettinger在Python中迭代的fibonacci的规范实现:

def fib(n):
    x, y = 0, 1
    for _ in range(n):
        x, y = y, x + y
    return x

那是O(n)时间和恒定空间。它美观,可读,简洁。只要您有内存将数字存储在您的计算机上,它也会为您提供正确的整数。如果它是合适的工具,请学会使用numpy,并且重要的是,学会在不合适时使用它。

答案 2 :(得分:0)

作为 hiro主角之前回答的补充说明,请注意,如果要求使用Numpy,您可以通过替换来轻松解决您的问题:

F = np.empty(n+2)

F = np.empty(n+2, dtype=object)

但除了将计算转回纯Python之外,它不会做任何事情。

答案 3 :(得分:0)

除非你想生成一个包含所有斐波那契数字的列表,直到Fn,不需要使用list,numpy或其他类似的东西,一个简单的循环和2个变量就足够了,因为你真的只需要知道之前的两个值

def fib(n):
   Fk, Fk1 = 0, 1
   for _ in range(n):
      Fk, Fk1 = Fk1, Fk+Fk1
   return Fk

当然,有更好的方法可以使用Fibonacci数字的数学属性来实现,我们知道有matrix可以给我们正确的结果

import numpy

def fib_matrix(n):
    mat = numpy.matrix( [[1,1],[1,0]], dtype=object) ** n
    return mat[0,1]

我认为他们有一个优化的矩阵exponentiation,使其比以前的方法更有效。

使用底层Lucas sequence的属性可以在没有matriz的情况下使用它,并且通过平方和与另一个相同数量的变量同样有效地取幂,但这有点难以理解乍一看不像第一个例子,因为除了第二个例子,它需要更多的数学。

封闭形式,具有黄金比例的形式,将更快地给你结果,但由于使用浮点运算,因此存在不准确的风险。