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

92 python之后的斐波那契序列否定回答,python,numpy,fibonacci,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:

我试图创建一个函数,它给出任意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]   
我认为这与整数溢出有关,与矩阵库的限制有关。我不知道如何修理它。请帮帮我。我更愿意改进这个算法

使用的算法:

听起来您好像遇到了浮点精度问题

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

从functools导入lru\U缓存
@lru_缓存()
def纤维(n):

如果n您应该设置一个显式的
dtype
,以允许矩阵中有更大的数字:

G = np.matrix([[1,1],[1,0]], dtype=np.uint64)
但是,这只会稍微提高条数(如果您的系统甚至没有将其作为默认值使用),并且很快也会溢出,而且您甚至不会很容易地注意到它,因为数字不会变为负数


工作得更好。

您应该允许大整数,否则您将被限制为默认的63位(+符号位)或仅大1位的
np.uint64

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]

您在这里使用的算法是什么?@AKX在问题中添加了算法您是否尝试为矩阵设置显式
dtype
?顺便说一句,得到的是
TypeError:“int”对象不是可下标的
。。我没有得到像类型错误这样的任何类型的错误。我没有尝试过做数据类型-如何做?32位整数溢出:
2^31+62465836587674878=12200160415121876738
如果我的当前算法是固定的,我会更喜欢-我已经在编辑中添加了它。OP算法接受基本操作的O(logn)并使用O(1)对象,而记忆是基本操作的O(N)并使用O(N)第一次调用fib(N)的对象。事实上,因为这些都是大整数,所以复杂度是O((logn)**2)vs.O(nlogn)!只是澄清一下-这是否会将整数从32位增加到64位?谢谢您的帮助。有没有办法提高限额?我想画一张图,直到n=15000谢谢!这适用于n的任何值。你能描述一下dtype=object是什么意思吗?只是把int转换成Bigint?@UtsoRoy阅读这里:
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]