我已经使用从矩阵求幂算法派生的算法快速加倍编写了一个非常标准的斐波那契函数,该算法应该在 O(log(n)) 时间和调用中运行,但在超过 1,000,000 时停止 - 即使这应该只是大约 25 个电话。
代码:
"""
O(log(n)) time fibonacci algorithm using fast doubling derived from the matrix
squaring algorithm for the same thing.
"""
def fibonacci(num):
"O(log(n)) implementation of fibonacci using fast doubling."
if num >= 0:
return fib_helper(num)[0]
def fib_helper(num):
"Helper function for fibonacci()."
if num == 0:
return (0, 1)
elif num == 1:
return (1, 1)
else:
f_k, f_k_1 = fib_helper(num // 2)
f_k_even = f_k * (2 * f_k_1 - f_k)
f_k_odd = f_k_1 * f_k_1 + f_k * f_k
return (f_k_even, f_k_odd) if num % 2 == 0 else (f_k_odd, f_k_even +
f_k_odd)
此代码应仅生成对 fib_helper 的 log(n) 调用和对 fibonacci 的一次调用。对于大于 1,000,000 的数字,它只会停止并且不会返回。
我已经尝试实现一个基本的装饰器来计算函数调用,它告诉我它只运行 32 次调用 2^32,但它最终仍然停滞不前。
为什么这会在大整数上停止?