2017-07-26 8 views
4

私はPythonで2つの浮動小数点の最大公約数を決定する効率的な方法を探しています。ルーチンは、次のようなレイアウトpython:浮動小数点のための最大公約数(gcd)、好ましくはnumpy

gcd(a, b, rtol=1e-05, atol=1e-08) 
""" 
Returns the greatest common divisor of a and b 

Parameters 
---------- 
a,b : float 
    two floats for gcd 
rtol, atol : float, optional 
    relative and absolute tolerance 

Returns 
------- 
gcd : float 
    Greatest common divisor such that for x in [a,b]: 
    np.mod(x,gcd) < rtol*x + atol 

.. _PEP 484: 
    https://www.python.org/dev/peps/pep-0484/ 

""" 

例しておく必要があります

合理的かつ無理数のGCD gcd(1., np.pi, rtol=0, atol=1e-5)

In [1]: np.mod(np.pi,1e-5) 
Out[1]: 2.6535897928590063e-06 

In [2]: np.mod(1.,1e-5) 
Out[2]: 9.9999999999181978e-06 

として、私が使用することを好む、(およそ)1e-5を返す必要がありますライブラリの実装ではなく、自分で書くことができます。 fractions.gcd関数はここで私にとっては適切ではないようです。私は分数を扱いたくないし、公差パラメータも(明らかに)持たないからです。

+6

をあなたはフロートの最大公約数の意味を正確に定義することはできますか?整数の対のGCDはよく知られており、よく理解されています。定義は有理数に容易に拡張されるので、浮動小数点数は有理数として浮動小数点数に対して有効なGCDの定義を与える。しかしここにあなたの許容範囲を含めると、それはあなたが何をしているのか疑問です。いくつかの例が役に立ちます。 –

+1

例えば、1とpiのgcdは何ですか? – Gribouillis

+0

おそらく自分で実装する必要があります。あなたはscipy/numpyのメーリングリストでこのSOの質問を参考にして質問することができます。私の推測では、そこでもっと成功することができると思います。 –

答えて

4

あなただけの公差を含めるようにfractions.gcdのコードを修正することができるように思える:

def float_gcd(a, b, rtol = 1e-05, atol = 1e-08): 
    t = min(abs(a), abs(b)) 
    while abs(b) > rtol * t + atol: 
     a, b = b, a % b 
    return a 
+0

これはもはや元のものとは相対的ではないので、これが 'rtol'の要件を満たしているとは思わない – Eric

+0

ああ、そうです。私は編集します。 –

+0

比較演算子を変更しないでください - OPの定義が間違っていて、 '<='でなければなりません(元の '>'を正しくしてください) – Eric

関連する問題