Multiply and divide are ok for MOnumber and MOFraction

This commit is contained in:
Bertrand Benjamin 2018-03-13 17:12:41 +03:00
parent e4efa1028e
commit 3c133250ec
2 changed files with 187 additions and 1 deletions

View File

@ -0,0 +1,158 @@
#! /usr/bin/env python
# -*- coding: utf-8 -*-
# vim:fenc=utf-8
#
# Copyright © 2017 lafrite <lafrite@Poivre>
#
# Distributed under terms of the MIT license.
"""
Divide MO
"""
from ..tree import Tree
from ..MO.mo import MO, MOnumber
from ..MO.fraction import MOFraction
from .exceptions import DivideError
def divide(left, right):
""" Perform the addition of left and right
:param left: left MO
:param right: right MO
:returns: Tree or MO
>>> a = MOnumber(4)
>>> b = MOnumber(6)
>>> divide(a, b)
<MOFraction 4 / 6>
>>> b = MOnumber(0)
>>> divide(a, b)
Traceback (most recent call last):
...
mapytex.calculus.core.compute.exceptions.DivideError: Division by zero
"""
try:
right.value
except AttributeError:
pass
else:
if right.value == 0:
raise DivideError("Division by zero")
if right.value == 1:
return left
return MULFUNCTIONS[(type(left), type(right))](left, right)
def monumber_monumber(left, right):
""" Divide 2 monumbers
:param left: left MOnumber
:param right: right MOnumber
:returns: MONumber
>>> a = MOnumber(4)
>>> b = MOnumber(6)
>>> monumber_monumber(a, b)
<MOFraction 4 / 6>
"""
return MOFraction(left, right)
def monumber_mofraction(left, right):
""" Divide a monumber and a mofraction
:param left: a monumber
:param right: a mofraction
:returns: Tree with the multiplication on the numerator
>>> a = MOnumber(4)
>>> b = MOFraction(6, 5)
>>> print(monumber_mofraction(a, b))
*
> 4
> /
| > 5
| > 6
>>> b = MOFraction(6, 5, True)
>>> print(monumber_mofraction(a, b))
*
> 4
> -
| > None
| > /
| | > 5
| | > 6
"""
if not isinstance(left, MOnumber) or not isinstance(right, MOFraction):
raise DivideError(f"Wrong type for left (got {left.__class__.__name__}) \
or right (got {right.__class__.__name__})")
return Tree("*", left, right.inverse())
def mofraction_monumber(left, right):
""" Divide a monumber and a mofraction
:param left: a mofraction
:param right: a monumber
:returns: Tree with a new calculus
>>> a = MOFraction(6, 5)
>>> b = MOnumber(4)
>>> print(mofraction_monumber(a, b))
*
> /
| > 6
| > 5
> /
| > 1
| > 4
"""
if not isinstance(left, MOFraction) or not isinstance(right, MOnumber):
raise DivideError(f"Wrong type for left (got {left.__class__.__name__})"
f"or right (got {right.__class__.__name__})")
right_fraction = MOFraction(1, right)
return Tree("*", left, right_fraction)
def mofraction_mofraction(left, right):
""" Divide two mofractions
:param left: a mofraction
:param right: a mofraction
:returns: Tree with a new calculus
>>> a = MOFraction(1, 5)
>>> b = MOFraction(4, 5)
>>> print(mofraction_mofraction(a, b))
*
> /
| > 1
| > 5
> /
| > 5
| > 4
"""
if not isinstance(left, MOFraction) or not isinstance(right, MOFraction):
raise AddError(f"Wrong type for left (got {left.__class__.__name__})"
f"or right (got {right.__class__.__name__})")
return Tree("*", left, right.inverse())
# TODO: Faire un décorateur pour un enregistrement automatique |dim. mars 11 18:24:32 EAT 2018
MULFUNCTIONS = {
(MOnumber, MOnumber): monumber_monumber,
(MOnumber, MOFraction): monumber_mofraction,
(MOFraction, MOnumber): mofraction_monumber,
(MOFraction, MOFraction): mofraction_mofraction,
}
# -----------------------------
# Reglages pour 'vim'
# vim:set autoindent expandtab tabstop=4 shiftwidth=4:
# cursor: 16 del

View File

@ -90,7 +90,7 @@ def monumber_mofraction(left, right):
return Tree("/", num, right._denominator) return Tree("/", num, right._denominator)
def mofraction_monumber(left, right): def mofraction_monumber(left, right):
""" Adding a monumber and a mofraction """ Multiply a monumber and a mofraction
:param left: a mofraction :param left: a mofraction
:param right: a monumber :param right: a monumber
@ -113,11 +113,39 @@ def mofraction_monumber(left, right):
num = Tree("*", left.numerator, right) num = Tree("*", left.numerator, right)
return Tree("/", num, left._denominator) return Tree("/", num, left._denominator)
def mofraction_mofraction(left, right):
""" Multiply two mofractions
:param left: a mofraction
:param right: a mofraction
:returns: Tree with a new calculus
>>> a = MOFraction(1, 5)
>>> b = MOFraction(4, 5)
>>> print(mofraction_mofraction(a, b))
/
> *
| > 1
| > 4
> *
| > 5
| > 5
"""
if not isinstance(left, MOFraction) or not isinstance(right, MOFraction):
raise AddError(f"Wrong type for left (got {left.__class__.__name__})"
f"or right (got {right.__class__.__name__})")
num = Tree("*", left.numerator, right.numerator)
denom = Tree("*", left.denominator, right.denominator)
return Tree("/", num, denom)
# TODO: Faire un décorateur pour un enregistrement automatique |dim. mars 11 18:24:32 EAT 2018 # TODO: Faire un décorateur pour un enregistrement automatique |dim. mars 11 18:24:32 EAT 2018
MULFUNCTIONS = { MULFUNCTIONS = {
(MOnumber, MOnumber): monumber_monumber, (MOnumber, MOnumber): monumber_monumber,
(MOnumber, MOFraction): monumber_mofraction, (MOnumber, MOFraction): monumber_mofraction,
(MOFraction, MOnumber): mofraction_monumber, (MOFraction, MOnumber): mofraction_monumber,
(MOFraction, MOFraction): mofraction_mofraction,
} }
# ----------------------------- # -----------------------------