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 つの呼び出しのみを生成する必要があります。1,000,000 を超える数値の場合は、失速して戻りません。
関数呼び出しをカウントするための基本的なデコレータを実装しようとしましたが、2^32 に対して 32 回の呼び出ししか実行していないことがわかりますが、最後に停止します。
これが大きな整数で停止するのはなぜですか?