2017-07-26 211 views
4

我正在尋找一種有效的方法來確定兩個浮點數與python的最大公約數。該程序應具有以下佈局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)應返回(大約)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 

我寧願使用一個庫的實現,而不是自己寫的。 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

不要更改你的比較操作符--OPs定義不正確,應該是<='(使你的原始'>'正確) – Eric