【发布时间】:2016-09-20 19:32:29
【问题描述】:
我想在斐波那契问题中使用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 之后都是阴性的,它是随机发生的。
Edit2:我尝试使用@AlbertoGarcia-Raboso 建议的方法。它解决了负数问题,但出现了另一个问题。它给出了-5.168070885485832e+19 的答案,我需要-51680708854858323072L。所以我尝试使用int(),将其转换为L,但现在由于精度损失,答案似乎不正确。
【问题讨论】:
-
@mgilson 我用了
numpy.__version__,它给了1.11.1 -
听起来你有一个 32 位版本的 NumPy。
fib(47)应该是 2971215073,这对于带符号的 32 位整数来说有点太大了。 -
@ajcr 我用这个stackoverflow.com/questions/33553549/… 来检查我的
NumPy。它说 64 位。 -
@Rockybilly:你当然可以用 NumPy 来做,只是如果你计算大值,你必须使用 Python 的内置整数类型来计算矩阵(这种类型比机器慢-宽度整数)。只需使用
(np.matrix("1 1; 1 0", dtype=np.object)**n).item(1)(即声明矩阵应使用“对象”类型)。 -
@ajcr 您能否将其添加为您解释
np.object的答案?
标签: python numpy matrix fibonacci exponentiation