"""
def forward(a, b):
- if isinstance(b, (int, Fraction)):
+ if isinstance(b, Fraction):
return monomorphic_operator(a, b)
+ elif isinstance(b, int):
+ return monomorphic_operator(a, Fraction(b))
elif isinstance(b, float):
return fallback_operator(float(a), b)
elif isinstance(b, complex):
forward.__doc__ = monomorphic_operator.__doc__
def reverse(b, a):
- if isinstance(a, numbers.Rational):
- # Includes ints.
+ if isinstance(a, Fraction):
return monomorphic_operator(a, b)
+ elif isinstance(a, numbers.Integral):
+ return monomorphic_operator(Fraction(a), b)
elif isinstance(a, numbers.Real):
return fallback_operator(float(a), float(b))
elif isinstance(a, numbers.Complex):
# common factors are removed by g1 == gcd(na, db).
def _add_sub_(a, b, pm=int.__add__):
- na, da = a.numerator, a.denominator
- nb, db = b.numerator, b.denominator
+ na, da = a._numerator, a._denominator
+ nb, db = b._numerator, b._denominator
g = math.gcd(da, db)
if g == 1:
return Fraction(pm(na * db, da * nb), da * db, _normalize=False)
def _mul(a, b):
"""a * b"""
- na, da = a.numerator, a.denominator
- nb, db = b.numerator, b.denominator
+ na, da = a._numerator, a._denominator
+ nb, db = b._numerator, b._denominator
g1 = math.gcd(na, db)
g2 = math.gcd(nb, da)
return Fraction((na // g1) * (nb // g2),
def _div(a, b):
"""a / b"""
# Same as _mul(), with inversed b.
- na, da = a.numerator, a.denominator
- nb, db = b.numerator, b.denominator
+ na, da = a._numerator, a._denominator
+ nb, db = b._numerator, b._denominator
g1 = math.gcd(na, nb)
g2 = math.gcd(db, da)
n, d = (na // g1) * (db // g2), (nb // g1) * (da // g2)