2017-01-27 13 views
4

Numpyのフィボナッチシーケンスの実装について、Q-Matrix methodを使って作業しています。結果はn = 47まで上がります。この時点で、matrix_power関数はincorrect resultsを返しています。なぜこれが起こっているのかについての説明はありますか?Numpyのmatrix_power関数が大きい指数に間違った結果を与える

import numpy 
def fibonacci(n): 
    qmatrix = numpy.matrix([[1, 1], [1, 0]]) 
    (a,b,c,d) = numpy.linalg.matrix_power(qmatrix,n).flatten().tolist()[0] 
    return b 
print fibonacci(47) # Outputs -1323752223 
+1

本当ですか?私は '2971215073'を得る。プラットフォーム上の問題の場合は、 'numpy.linalg.matrix_power(qmatrix、n).astype(numpy.uint64).flatten()。tolist()[0]' – alexpeits

+0

のような別の型に行列をキャストしてみてください。それはプラットフォームの問題のようです。 'n = 47'の場合、' numpy.uint32'へのキャストは結果を修正しますが、大きな値の場合には再び間違ってしまいます。私は前に鋳造する必要はありませんでしたが、これを稼働させるための最良のアプローチは何ですか? –

+0

[this](https://docs.scipy.org/doc/numpy/user/basics.types.html)で読むことができます。基本的に小さな整数は、4ビットと言うと、非常に大きな値を保持することはできません。表示するように頼むと変なことが起こるので、この問題を克服するために配列をキャストします。私が見ているところから、「uint64」は最大のものですが、私は専門家ではありません。 – alexpeits

答えて

4

あなたがフィボナッチ数で遊んでしようとしている場合、おそらく、いくつかの速度を犠牲にして、Pythonの任意の大きな整数を使用することが保証されています。行列のdtypeをobjectに設定することでそれを行うことができます。

実際にはnp.matrixオブジェクトを使用する必要はありません。ほとんどの場合、通常の配列を使用することをお勧めします。配列をリストに変換せずに関連項目を抽出することができます:

def fibonacci(n): 
    qmatrix = numpy.array([[1, 1], [1, 0]], dtype=object) 
    return numpy.linalg.matrix_power(qmatrix, n)[0, 1] 
+0

素晴らしいですが、これは完全に機能します。あなたのコードで必要な1つの編集は、Q行列の定理に従って、戻り値がインデックス[0,1]にあるはずです。それはちょうど1文字なので、私は編集することはできません:\ –

+1

ああ、あなたは正しいです!すでに修正済み。 – Jaime

+0

'cumprod'はこれらの' qmatrix'力の全範囲を取得するために使用できます( 'np.matrix'バージョンを使用)https://stackoverflow.com/a/47444215/901925 – hpaulj

関連する問題