Mapytex/mapytex/calculus/core/typing/add.py

154 lines
3.9 KiB
Python

#! /usr/bin/env python
# -*- coding: utf-8 -*-
# vim:fenc=utf-8
#
# Copyright © 2017 lafrite <lafrite@Poivre>
#
# Distributed under terms of the MIT license.
"""
Add MO with typing
"""
from multipledispatch import Dispatcher
from ..tree import Tree
from ..MO.mo import MO, MOnumber, MOstr
from ..MO.monomial import MOstrPower, MOMonomial
from ..MO.polynomial import MOpolynomial
from ..MO.fraction import MOFraction
add_doc = """ Add MOs
:param left: left MO
:param right: right MO
:returns: Tree or MO
"""
add = Dispatcher("add", doc=add_doc)
@add.register((MOnumber, MOFraction), MOstr)
def moscalar_mostr(left, right):
""" add a scalar with a letter to create a MOpolynomial
>>> a = MOnumber(2)
>>> b = MOstr('x')
>>> add(a, b)
<MOpolynomial x + 2>
>>> a = MOFraction(1, 5)
>>> add(a, b)
<MOpolynomial x + 1 / 5>
"""
return MOpolynomial(right, [left, 1])
@add.register(MOstr, (MOnumber, MOFraction))
def moscalar_mostr(left, right):
""" add a scalar with a letter to create a MOpolynomial
>>> a = MOstr('x')
>>> b = MOnumber(2)
>>> add(a, b)
<MOpolynomial x + 2>
>>> b = MOFraction(1, 5)
>>> add(a, b)
<MOpolynomial x + 1 / 5>
"""
return MOpolynomial(left, [right, 1])
@add.register((MOnumber, MOFraction), MOstrPower)
def moscalar_mostr(left, right):
""" add a scalar with a letter to create a MOpolynomial
>>> a = MOnumber(2)
>>> b = MOstrPower('x', 3)
>>> add(a, b)
<MOpolynomial x^3 + 2>
>>> a = MOFraction(1, 5)
>>> add(a, b)
<MOpolynomial x^3 + 1 / 5>
"""
return MOpolynomial(right.variable, {0: left, right.power: 1})
@add.register(MOstrPower, (MOnumber, MOFraction))
def moscalar_mostr(left, right):
""" add a scalar with a letter to create a MOpolynomial
>>> a = MOstrPower('x', 3)
>>> b = MOnumber(2)
>>> add(a, b)
<MOpolynomial x^3 + 2>
>>> b = MOFraction(1, 5)
>>> add(a, b)
<MOpolynomial x^3 + 1 / 5>
"""
return MOpolynomial(left.variable, {0: right, left.power: 1})
@add.register((MOnumber, MOFraction), MOMonomial)
def moscalar_mostr(left, right):
""" add a scalar with a MOMonomial to create a MOpolynomial
>>> a = MOnumber(2)
>>> b = MOMonomial(3, 'x', 4)
>>> add(a, b)
<MOpolynomial 3x^4 + 2>
>>> a = MOFraction(1, 5)
>>> add(a, b)
<MOpolynomial 3x^4 + 1 / 5>
"""
return MOpolynomial(right.variable,
{0: left, right.power: right.coefficient}
)
@add.register(MOMonomial, (MOnumber, MOFraction))
def moscalar_mostr(left, right):
""" add a scalar with a letter to create a MOpolynomial
>>> a = MOMonomial(3, 'x', 4)
>>> b = MOnumber(2)
>>> add(a, b)
<MOpolynomial 3x^4 + 2>
>>> b = MOFraction(1, 5)
>>> add(a, b)
<MOpolynomial 3x^4 + 1 / 5>
"""
return MOpolynomial(left.variable,
{0: right, left.power: left.coeffient}
)
@add.register(MOstr, MOstrPower)
def moscalar_mostr(left, right):
""" add a scalar with a letter to create a MOpolynomial
>>> a = MOstr('x')
>>> b = MOstrPower('x', 3)
>>> add(a, b)
<MOpolynomial x^3 + x>
>>> b = MOstrPower('x', 2)
>>> add(a, b)
<MOpolynomial x^2 + x>
"""
if left != right.variable:
raise
return MOpolynomial(left , {1: 1, right.power: 1})
@add.register(MOstrPower, MOstr)
def moscalar_mostr(left, right):
""" add a scalar with a letter to create a MOpolynomial
>>> a = MOstrPower('x', 3)
>>> b = MOstr('x')
>>> add(a, b)
<MOpolynomial x^3 + x>
>>> a = MOstrPower('x', 2)
>>> add(a, b)
<MOpolynomial x^2 + x>
"""
if right != left.variable:
raise
return MOpolynomial(right , {1: 1, left.power: 1})
# -----------------------------
# Reglages pour 'vim'
# vim:set autoindent expandtab tabstop=4 shiftwidth=4:
# cursor: 16 del