Feat: fraction can be simplify
continuous-integration/drone/push Build is passing Details

This commit is contained in:
Bertrand Benjamin 2021-09-29 15:34:14 +02:00
parent 1347c30b92
commit d6e3f774fa
3 changed files with 54 additions and 12 deletions

View File

@ -309,15 +309,15 @@ class Expression(object):
comp_exp = opt_exp._compute()
if typed_exp == comp_exp:
typed_exp.set_ancestor(self._ancestor)
return typed_exp
else:
if typed_exp != comp_exp:
comp_exp.set_ancestor(self)
return comp_exp._simplify(optimize=optimize)
typed_exp.set_ancestor(self._ancestor)
return typed_exp
def simplify(self, optimize=True):
""" Compute as much as possible the expression
""" Simplify the expression, keep the history and factory child
:param optimize: bool to optimize tree when it's possible
:return: an expression

View File

@ -271,18 +271,19 @@ class Fraction(Token):
"""
return Decimal(self._mo._value)
@property
def simplified(self):
""" Get the irreductible version of self
:example:
>>> f = Fraction("3/4")
>>> f.simplified()
>>> f.simplified
<Fraction 3 / 4>
>>> f = Fraction("12/9")
>>> f.simplified()
>>> f.simplified
<Fraction 4 / 3>
>>> f = Fraction("12/4")
>>> f.simplified()
>>> f.simplified
<Integer 3>
"""
@ -293,6 +294,32 @@ class Fraction(Token):
return Fraction(simplified)
def simplify(self):
""" Itself or its simplified version
:example:
>>> f = Fraction("12/8")
>>> fs = f.simplify()
>>> for i in fs.explain():
... print(i)
12 / 8
3 / 2
>>> f = Fraction("5/8")
>>> fs = f.simplify()
>>> for i in fs.explain():
... print(i)
5 / 8
"""
simplified = self.simplified
try:
if self.numerator == simplified.numerator:
return self
except AttributeError:
pass
simplified._ancestor = self
return simplified

View File

@ -148,7 +148,11 @@ class Linear(Polynomial):
>>> P.differentiate()
<Integer 2>
>>> P.roots
[<Fraction - 2 / 1>]
[<Integer - 2>]
>>> for i in P.roots[0].explain():
... print(i)
- 2 / 1
- 2
"""
@ -190,9 +194,20 @@ class Linear(Polynomial):
>>> from ...core.MO.polynomial import MOpolynomial, MOMonomial
>>> P = Linear(MOpolynomial('x', [1, 2]))
>>> P.roots
[<Fraction - 2 / 1>]
>>> #P = Linear(MOpolynomial('x', [1, -2]))
>>> #P.roots
[<Integer - 2>]
>>> P = Linear(MOpolynomial('x', [2, 1]))
>>> P.roots
[<Fraction - 1 / 2>]
>>> for i in P.roots[0].explain():
... print(i)
- 1 / 2
>>> P = Linear(MOpolynomial('x', [10, 6]))
>>> P.roots
[<Fraction - 3 / 5>]
>>> for i in P.roots[0].explain():
... print(i)
- 6 / 10
- 3 / 5
"""
try: