我想在一个斐波那契问题中使用NumPy
,因为它在矩阵乘法方面很有效率。你知道有一种方法可以使用矩阵[[1, 1], [1, 0]]
来找到斐波那契数。
我写了一些非常简单的代码,但是在增加n
之后,矩阵开始出现负数。
import numpy
def fib(n):
return (numpy.matrix("1 1; 1 0")**n).item(1)
print fib(90)
# Gives -1581614984
这可能的原因是什么?
注意:`linalg.matrix_power` 也会给出负值。
注意2:我尝试了从0到100的数字。在47之后,它开始给出负值。这是否是一个大整数问题,因为NumPy是用C编码的?如果是这样,我该如何解决?
编辑:使用带有 `linalg.matrix_power` 的常规Python `list` 矩阵也给出了负结果。还要补充一点,不是所有的结果在47之后都是负数,它们是随机出现的。
编辑2:我尝试使用 @AlbertoGarcia-Raboso 建议的方法。它解决了负数问题,但出现了另外一个问题。它将答案作为 `-5.168070885485832e+19` 给出,而我需要的是 `-51680708854858323072L`。所以我尝试使用 `int()`,它将其转换为了 `L`,但现在似乎由于精度损失,答案是不正确的。
numpy.__version__
,它返回了1.11.1
。 - Rockybillyfib(47)
应该是2971215073,这个数字略大于有符号32位整数的最大值。 - Alex RileyNumPy
。它显示是 64 位的。 - Rockybilly(np.matrix("1 1; 1 0", dtype=np.object)**n).item(1)
(即声明矩阵应使用“object”类型)。 - Alex Rileynp.object
的含义? - Rockybilly