2

ベネットのアルゴリズムを使用してフィボナッチ数を計算しようとしている以前の質問を続けようとしています。任意の精度で作業するには、mpmath. ただし、実装は特定の値を超えると失敗するようです。たとえば、99 番目の値は次のようになります。

218922995834555891712

これは ( ref )である必要があります。

218922995834555169026

これが私のコードです:

mpmath インポートから *

デフォルトファイ():
    リターン (1 + sqrt(5)) / 2

デフファイ():
    リターン (1 - sqrt(5)) / 2

デフォルト F(n):
    return (power(Phi(), n) - power(phi(), n)) / sqrt(5)

開始 = 99
終了 = 100

範囲内の x の場合 (開始、終了):
    print(x, int(F(x)))
4

3 に答える 3

3

mpmath は任意精度の計算を行います。デフォルトの動作ではなく、任意精度の計算モジュールを使用している場合は、(前述のように) 任意の精度まで正確に計算します。

mpmath には、結果の精度と速度を決定する複数のモジュールがあり (必要に応じて選択する必要があります)、デフォルトでは Python フロートを使用します。

mp.dps を十分に高く設定して mpmath の fib( ) を呼び出すと、上記のように正しい答えが得られます。

>>> from mpmath import mp
>>> mp.dps = 25
>>> mp.nprint( mp.fib( 99 ), 25 )
218922995834555169026.0
>>> mp.nprint( mpmath.fib( 99 ), 25 )
218922995834555169026.0

一方、mp モジュールを使用しない場合は、Python の double と同じくらい正確な結果しか得られません。

>>> import mpmath
>>> mpmath.dps = 25
>>> mpmath.nprint( mpmath.fib( 99 ), 25
218922995834555170816.0
于 2016-08-16T16:32:52.183 に答える
1

実際、mpmath のデフォルトの精度は 15 であり、最大 21 桁の精度の結果を取得したい場合には十分ではないと思います。

できることの 1 つは、精度をより高い値に設定し、加算、減算などに mpmath の定義済み算術関数を使用することです。

    from mpmath import mp
    mp.dps = 50
    sqrt5 = mp.sqrt(5)
    def Phi():
        return 0.5*mp.fadd(1, sqrt5)

    def phi():
        return 0.5*mp.fsub(1, sqrt5)

    def F(n):
        return mp.fdiv(mp.power(Phi(), n) - mp.power(phi(), n), sqrt5)

    print int(F(99))

これにより、

    218922995834555169026L
于 2016-08-22T01:51:48.733 に答える