Raymond Hettinger <[email protected]> added the comment:
Here's some code to try out:
from math import gcd
from fractions import Fraction
import operator
import math
class Henrici(Fraction):
'Reformulate _mul to reduce the size of intermediate products'
# Original has 2 multiplications, 1 gcd calls, and 2 divisions
# This one has 2 multiplications, 2 gcd calls, and 4 divisions
def _mul(a, b):
a_n, a_d = a.numerator, a.denominator
b_n, b_d = b.numerator, b.denominator
d1 = math.gcd(a_n, b_d)
a_n //= d1
b_d //= d1
d2 = math.gcd(b_n, a_d)
b_n //= d2
a_d //= d2
result = Fraction(a_n * b_n, a_d * b_d, _normalize=False)
assert math.gcd(a_n * b_n, a_d * b_d) == 1 and a_d * b_d >= 0
return result
__mul__, __rmul__ = Fraction._operator_fallbacks(_mul, operator.mul)
assert Henrici(10, 3) * Henrici(6, 5) == Henrici(4, 1)
----------
nosy: +rhettinger
_______________________________________
Python tracker <[email protected]>
<https://bugs.python.org/issue43420>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com