92 python之后的斐波那契序列否定回答
我试图创建一个函数,它给出任意n值的斐波那契序列。然而,在n=92之后,我得到了错误的答案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:
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]