【问题标题】:fibonacci sequence negative answer after 92 python92 python 之后的斐波那契数列否定答案
【发布时间】:2019-03-04 08:56:05
【问题描述】:

我正在尝试创建一个函数,它可以为我提供任何 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]   

我认为这与矩阵库的限制有关的整数溢出有关。我不知道如何解决它。请帮帮我。如果这个算法得到改进,我会更喜欢。

使用的算法:

【问题讨论】:

  • 你在这里使用的算法是什么?
  • @AKX 在问题中添加了算法
  • 您是否尝试为矩阵设置显式dtype?顺便说一句,取而代之的是TypeError: 'int' object is not subscriptable...
  • 我没有收到任何类型的此错误,例如 Type Error 。我没有尝试做 dtype - 怎么做?
  • 32 位整数溢出:2^31 + 6246583658587674878 = 12200160415121876738

标签: python numpy fibonacci


【解决方案1】:

您应该设置一个明确的dtype 以允许您的矩阵中包含更大的数字:

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

但是,这只会稍微提高标准(如果您的系统甚至没有将其用作默认设置)并且很快也会溢出,您甚至不会像数字不会变成负数那样容易注意到它。 .

@Michael's answer 效果更好。

【讨论】:

  • 谢谢你!只是澄清一下 - 这是否会将整数从 32 位增加到 64 位?
  • 感谢您的帮助。有没有办法提高限额?我想做一个图表直到 n=15,000
【解决方案2】:

您应该允许 big-int 数字,否则您将受限于默认的 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]

【讨论】:

【解决方案3】:

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

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

【讨论】:

  • 如果我当前的算法是固定的,我会更喜欢 - 我已经在编辑中添加了它。
  • OP算法需要O(log N)个基本操作并使用O(1)个对象,而memoization是O(N)个基本操作并使用O(N)个对象进行第一次调用纤维(N)。实际上,由于这些都是大整数,所以复杂度是 O((log N)**2) 与 O(N log N)。
猜你喜欢
  • 1970-01-01
  • 2013-08-03
  • 2013-02-24
  • 1970-01-01
  • 2021-05-17
  • 2014-05-23
  • 1970-01-01
  • 2015-06-05
相关资源
最近更新 更多