92 python之后的斐波那契序列否定答案

时间:2019-03-04 08:56:06

标签: python numpy fibonacci

我正在尝试创建一个函数,该函数为n的任何值提供斐波那契数列。但是,在n = 92之后,我得到了不正确的答案。

eg. For n = 93
Expected output = 12200160415121876738
Actual Output = -6246583658587674878

我的代码如下:

import numpy as np
def Power(M, n):
         if not n:
                 return 1
         elif n % 2:
                 return M*Power(M, n-1)
         else:
                 sqrt = Power(M, n//2)
                 return sqrt**2

  def _fib(n):
     G = np.matrix([[1,1],[1,0]])
     F = Power(G, n)
     return F[0,1]   

我认为这与与矩阵库的限制有关的整数溢出有关。我不确定该如何解决。请帮帮我。我希望对这种算法进行改进。

使用的算法: enter image description here

3 个答案:

答案 0 :(得分:3)

您应该设置一个明确的dtype,以允许在矩阵中使用更大的数字:

G = np.matrix([[1,1],[1,0]], dtype=np.uint64)

但是,这只会稍微提高一下门限(如果您的系统甚至没有使用它作为默认值),并且很快也会溢出,并且您甚至不会轻易注意到它,因为数字不会变为负数。

@Michael's answer工作得更好。

答案 1 :(得分:2)

听起来像是遇到浮点精度问题。

Python 3的整数是任意精度的,因此您可以使用它们和lru_cache进行记忆:

from functools import lru_cache


@lru_cache()
def fib(n):
    if n <= 1:
        return 1
    return fib(n - 2) + fib(n - 1)


for x in range(1, 95):
    print(x, fib(x - 1))

输出

1 1
2 1
3 2
4 3
5 5
6 8
7 13
8 21
9 34
10 55
11 89
12 144
13 233
14 377
15 610
16 987
...
92 7540113804746346429
93 12200160415121876738
94 19740274219868223167

答案 2 :(得分:2)

您应该允许使用大整数,否则将受到默认63位(+符号位)或np.uint64的限制,后者仅大1位:

import numpy as np
def Power(M, n):
   if not n:
      # Original 'return 1' does not work with n=0
      return np.identity(2, dtype=object)
   elif n % 2:
      return M*Power(M, n-1)
   else:
      sqrt = Power(M, n//2)
      return sqrt**2

def fib(n):
     # This allows for big-int
     G = np.matrix([[1,1],[1,0]], dtype=object)
     F = Power(G, n)
     return F[0,1]