From 50f77c4d6021b44344f13663b7acebd11404845a Mon Sep 17 00:00:00 2001 From: Bertrand Benjamin Date: Mon, 15 Jul 2019 11:59:28 +0200 Subject: [PATCH] Feat: coefficients, delta and some roots for polynomial, Linear and Quadratic --- mapytex/calculus/API/tokens/polynomial.py | 142 +++++++++++++++++++++- 1 file changed, 137 insertions(+), 5 deletions(-) diff --git a/mapytex/calculus/API/tokens/polynomial.py b/mapytex/calculus/API/tokens/polynomial.py index e765a5e..020e47f 100644 --- a/mapytex/calculus/API/tokens/polynomial.py +++ b/mapytex/calculus/API/tokens/polynomial.py @@ -31,6 +31,7 @@ class Polynomial(Token): """ def __init__(self, a, name="", ancestor=None): + """ Initiate Polynomial with a MO""" if not isinstance(a, MO): if isinstance(a, str): raise TypeError @@ -47,17 +48,37 @@ class Polynomial(Token): return cls(mo, name, ancestor) + @classmethod + def from_coefficients(cls, coefficients): + """ Initiate polynomial from list of coefficients """ + pass + @classmethod def random(cls): raise NotImplemented def __setitem__(self, key, item): """ Use Polynomial like if they were a dictionnary to set coefficients """ - pass + raise NotImplemented("Can't set coefficient of a polynomial") def __getitem__(self, key): - """ Use Polynomial like if they were a dictionnary to get coefficients """ - pass + """ Use Polynomial like if they were a dictionnary to get coefficients + + :examples: + >>> from ...core.MO.polynomial import MOpolynomial + >>> P = Polynomial(MOpolynomial('x', [1, 2, 3])) + >>> P[0] + + >>> P[1] + + >>> P[2] + + >>> P[3] + Traceback (most recent call last): + ... + KeyError: 3 + """ + return self._mo.coefficients[key] def __call__(self, value): """ Call a Polynomial to evaluate itself on value @@ -80,14 +101,42 @@ class Polynomial(Token): tree = tree.map_on_leaf(replace_var) return Expression(tree).simplify() + @property + def roots(self): + """ Get roots of the Polynomial """ + raise NotImplemented("Can't compute roots not specific polynomial") class Linear(Polynomial): - """ Token representing a linear """ + """ Token representing a linear ax + b + + :examples: + >>> from ...core.MO.polynomial import MOpolynomial, MOMonomial + >>> P = Linear(MOpolynomial('x', [1, 2])) + >>> P + + >>> P.a + + >>> P.b + + >>> P.roots + [] + + """ def __init__(self, mo, name="", ancestor=None): + """ Initiate Linear with MO + :examples: + >>> from ...core.MO.polynomial import MOpolynomial, MOMonomial + >>> P = Linear(MOpolynomial('x', [1, 2])) + >>> P + + >>> Q = Linear(MOMonomial(3, 'x', 1)) + >>> Q + + """ Polynomial.__init__(self, mo, name, ancestor) self._mathtype = "affine" @@ -95,12 +144,69 @@ class Linear(Polynomial): def random(cls): raise NotImplemented + @property + def a(self): + return self[1] + + @property + def b(self): + return self[0] + + @property + def roots(self): + """ Get the root of the polynomial + + :examples: + >>> from ...core.MO.polynomial import MOpolynomial, MOMonomial + >>> P = Linear(MOpolynomial('x', [1, 2])) + >>> P.roots + [] + >>> #P = Linear(MOpolynomial('x', [1, -2])) + >>> #P.roots + """ + + try: + return [Expression.from_str(f"-{self.a}/{self.b}").simplify()] + except AttributeError: + return [Expression.from_str(f"-{self.a}/{self.b}")] + class Quadratic(Polynomial): - """ Token representing a quadratic """ + """ Token representing a quadratic ax^2 + bx + c + + :examples: + >>> from ...core.MO.polynomial import MOpolynomial + >>> P = Quadratic(MOpolynomial('x', [1, 2, 3])) + >>> P + + >>> P.a + + >>> P.b + + >>> P.c + + >>> P.delta + + >>> for s in P.delta.explain(): + ... print(s) + 2^2 - 4 * 3 * 1 + 4 - 12 * 1 + 4 - 12 + - 8 + >>> P.roots + [] + + """ def __init__(self, mo, name="", ancestor=None): + """ Initiate Quadratic from MO + + >>> from ...core.MO.polynomial import MOpolynomial + >>> P = Quadratic(MOpolynomial('x', [1, 2, 3])) + >>> P + + """ Polynomial.__init__(self, mo, name, ancestor) self._mathtype = "polynome du 2nd degré" @@ -109,6 +215,32 @@ class Quadratic(Polynomial): def random(cls): raise NotImplemented + @property + def a(self): + return self[2] + + @property + def b(self): + return self[1] + + @property + def c(self): + return self[0] + + @property + def delta(self): + return Expression.from_str(f"{self.b}^2-4*{self.a}*{self.c}").simplify() + + @property + def roots(self): + if self.delta._mo < 0: + return [] + elif self.delta._mo == 0: + return [Expression.from_str(f"-{self.b}/(2*{self.a})").simplify()] + else: + raise NotImplemented("Todo!") + + def extract_variable(leaf): try: