Multiply with MOnumber and MOFraction

This commit is contained in:
Bertrand Benjamin 2018-03-11 20:05:17 +03:00
parent 9baf6c5dbd
commit 5f5fcc5a79
2 changed files with 138 additions and 0 deletions

View File

@ -16,6 +16,9 @@ class ComputeError(Exception):
class AddError(ComputeError): class AddError(ComputeError):
pass pass
class MultiplyError(ComputeError):
pass
# ----------------------------- # -----------------------------
# Reglages pour 'vim' # Reglages pour 'vim'

View File

@ -0,0 +1,135 @@
#! /usr/bin/env python
# -*- coding: utf-8 -*-
# vim:fenc=utf-8
#
# Copyright © 2017 lafrite <lafrite@Poivre>
#
# Distributed under terms of the MIT license.
"""
Multiply MO
"""
from ..tree import Tree
from ..operator import OPERATORS
from ..MO.mo import MO, MOnumber, MOstr
from ..MO.fraction import MOFraction
from .exceptions import MultiplyError
def multiply(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)
>>> multiply(a, b)
<MOnumber 24>
>>> b = MOnumber(0)
>>> multiply(a, b)
<MOnumber 0>
"""
if left.value == 0 or right.value == 0:
return MOnumber(0)
elif left.value == 1:
return right
elif right.value == 1:
return left
return MULFUNCTIONS[(type(left), type(right))](left, right)
def monumber_monumber(left, right):
""" Multiply 2 monumbers
:param left: left MOnumber
:param right: right MOnumber
:returns: MONumber
>>> a = MOnumber(4)
>>> b = MOnumber(6)
>>> monumber_monumber(a, b)
<MOnumber 24>
"""
return MO.factory(left.value * right.value)
def monumber_mofraction(left, right):
""" Multiply 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
| > 6
> 5
>>> b = MOFraction(6, 5, True)
>>> print(monumber_mofraction(a, b))
-
> None
> /
| > *
| | > 4
| | > 6
| > 5
"""
if not isinstance(left, MOnumber) or not isinstance(right, MOFraction):
raise MultiplyError(f"Wrong type for left (got {left.__class__.__name__}) \
or right (got {right.__class__.__name__})")
num = Tree("*", left, right._numerator)
frac = Tree("/", num, right._denominator)
if right.negative:
return Tree("-", None, frac)
return frac
def mofraction_monumber(left, right):
""" Adding a monumber and a mofraction
:param left: a mofraction
:param right: a monumber
:returns: Tree with the number converted into a mofraction
>>> a = MOFraction(6, 5)
>>> b = MOnumber(4)
>>> print(mofraction_monumber(a, b))
/
> *
| > 6
| > 4
> 5
"""
if not isinstance(left, MOFraction) or not isinstance(right, MOnumber):
raise MultiplyError(f"Wrong type for left (got {left.__class__.__name__})"
f"or right (got {right.__class__.__name__})")
num = Tree("*", left._numerator, right)
frac = Tree("/", num, left._denominator)
if left.negative:
return Tree("-", None, frac)
return frac
# 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,
}
# -----------------------------
# Reglages pour 'vim'
# vim:set autoindent expandtab tabstop=4 shiftwidth=4:
# cursor: 16 del