Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 替换已弃用的`fractions.gcd()`函数?_Python_Python 3.x_Fractions - Fatal编程技术网

Python 替换已弃用的`fractions.gcd()`函数?

Python 替换已弃用的`fractions.gcd()`函数?,python,python-3.x,fractions,Python,Python 3.x,Fractions,我想计算两个有理数的最大公约数,这两个有理数被实现为分数.Fraction实例。尽管打印了弃用警告,但它仍按预期工作: In [1]: gcd(Fraction(2, 3), Fraction(2, 3)) /usr/local/bin/ipython:1: DeprecationWarning: fractions.gcd() is deprecated. Use math.gcd() instead. #!/usr/local/opt/python3/bin/python3.6 Out[

我想计算两个有理数的最大公约数,这两个有理数被实现为
分数.Fraction
实例。尽管打印了弃用警告,但它仍按预期工作:

In [1]: gcd(Fraction(2, 3), Fraction(2, 3))
/usr/local/bin/ipython:1: DeprecationWarning: fractions.gcd() is deprecated. Use math.gcd() instead.
  #!/usr/local/opt/python3/bin/python3.6
Out[1]: Fraction(1, 6)
通过查看,我可以看到
fracts.gcd()
确实不受欢迎,用户被邀请使用
math.gcd()
。问题在于后者不支持有理数:

In [2]: gcd(Fraction(2, 3), Fraction(2, 3))
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-2-c3ad2389f290> in <module>()
----> 1 gcd(Fraction(2, 3), Fraction(2, 3))

TypeError: 'Fraction' object cannot be interpreted as an integer

公式在这里推导和解释:。

您可能需要编写一个公式
gcd(a/b,c/d)=gcd(a,c)/lcm(b,d)
,所以这并不太糟糕
math
不提供
lcm
,因此我使用的是编写的


由于您似乎正在使用未记录的
分数.gcd()
(文档中说“返回整数a和b的最大公约数”),因此可能没有公约数。您是对的,我错过了!从我在实际实现()中看到的情况来看,这绝对不是预期的行为。。。谢谢我会考虑<代码>分数。GCd()/Cord>将分数作为预期行为……你的公式没有意义;code>denom_lcm是一个元组
def gcd(numbers):
"""Compute Greastest Common Divisor of rational numbers.

Args:
    numbers: list of rational numbers.

Returns:
    Greatest Common Divisor of rational numbers.
"""
# Treat the two-number case and reduce
def _gcd(a, b):
    if b == 0:
        return a
    if isinstance(a, int) and isinstance(b, int):
        _gcd(b, a % b)
    a = Fraction(a)
    b = Fraction(b)
    return Fraction(gcd([a.numerator, b.numerator]), lcm([a.denominator, b.denominator]))

return reduce(_gcd, numbers)

def lcm(numbers):
    """Compute Least Common Multiple of rational numbers.

    Args:
        numbers: list of rational numbers.

    Returns:
        Least Common Multiple of rational numbers.
    """
    # Treat the two-number case and reduce
    def _lcm(a, b):
        if b == 0:
            return a
        if isinstance(a, int) and isinstance(b, int):
            return a * b // gcd([a, b])
        a = Fraction(a)
        b = Fraction(b)
        return Fraction(lcm([a.numerator, b.numerator]), gcd([a.denominator, b.denominator]))

    return reduce(_lcm, numbers)
from fractions import Fraction
from math import gcd

def lcm(a, b):
    """Return lowest common multiple."""
    return a * b // gcd(a, b)

def fraction_gcd(x, y):
    a = x.numerator
    b = x.denominator
    c = y.numerator
    d = y.denominator
    return Fraction(gcd(a, c), lcm(b, d))

print(fraction_gcd(Fraction(2, 3), Fraction(2, 3)))
# 2/3