197 lines
5.5 KiB
Python
197 lines
5.5 KiB
Python
#!/usr/bin/env python
|
|
# encoding: utf-8
|
|
|
|
from calculus import isNumber
|
|
from arithmetic import gcd
|
|
|
|
class Fraction(object):
|
|
"""Fractions!"""
|
|
|
|
def __init__(self, num, denom = 1):
|
|
"""To initiate a fraction we need a numerator and a denominator
|
|
|
|
:param num: the numerator
|
|
:param denom: the denominator
|
|
|
|
"""
|
|
self._num = num
|
|
self._denom = denom
|
|
|
|
def simplify(self):
|
|
"""Simplify the fraction
|
|
|
|
:returns: steps to simplify the fraction or the fraction if there is nothing to do
|
|
"""
|
|
steps = [self]
|
|
|
|
if self._denom < 0:
|
|
self._num = - self._num
|
|
self._denom = - self._denom
|
|
steps += [self]
|
|
|
|
gcd_ = gcd(abs(self._num), abs(self._denom))
|
|
if self._num == self._denom:
|
|
self._num = 1
|
|
self._denom = 1
|
|
steps += [self]
|
|
|
|
elif gcd_ != 1:
|
|
self._num, self._denom = self._num // gcd_ , self._denom // gcd_
|
|
steps += ["( {reste1} * {gcd} ) / ( {reste2} * {gcd} )".format(reste1 = self._num, reste2 = self._denom, gcd = gcd_)]
|
|
|
|
# Certainement le truc le plus moche que j'ai jamais fait... On ne met que des strings dans steps puis au dernier moment on met une fraction. C'est moche de ma part
|
|
steps += [self]
|
|
|
|
return steps
|
|
|
|
def __str__(self):
|
|
if self._denom == 1:
|
|
return str(self._num)
|
|
else:
|
|
return str(self._num) + " / " + str(self._denom)
|
|
|
|
#def __repr__(self):
|
|
# return self.__str__()
|
|
|
|
def __add__(self, other):
|
|
if type(other) == Fraction:
|
|
#cool
|
|
number = other
|
|
else:
|
|
number = Fraction(other)
|
|
|
|
steps = ["{frac1} + {frac2}".format(frac1 = self, frac2 = number)]
|
|
|
|
if self._denom == number._denom:
|
|
com_denom = self._denom
|
|
num1 = self._num
|
|
num2 = number._num
|
|
|
|
else:
|
|
gcd_denom = gcd(self._denom, number._denom)
|
|
coef1 = number._denom // gcd_denom
|
|
coef2 = self._denom // gcd_denom
|
|
|
|
steps += ["( {num1} * {coef1} ) / ( {den1} * {coef1} ) + ( {num2} * {coef2} ) / ( {den2} * {coef2} )".format(num1 = self._num, den1 = self._denom, coef1 = coef1, num2 = number._num, den2 = number._denom, coef2 = coef2)]
|
|
|
|
com_denom = self._denom * coef1
|
|
num1 = self._num * coef1
|
|
num2 = number._num * coef2
|
|
|
|
steps += ["( {num1} + {num2} ) / {denom}".format(num1 = num1, num2 = num2, denom = com_denom)]
|
|
|
|
num = num1 + num2
|
|
|
|
ans_frac = Fraction(num, com_denom)
|
|
steps += ans_frac.simplify()
|
|
|
|
return steps
|
|
|
|
def __sub__(self, other):
|
|
if type(other) == Fraction:
|
|
#cool
|
|
number = other
|
|
else:
|
|
number = Fraction(other)
|
|
|
|
steps = ["{frac1} - {frac2}".format(frac1 = self, frac2 = number)]
|
|
|
|
if self._denom == number._denom:
|
|
com_denom = self._denom
|
|
num1 = self._num
|
|
num2 = number._num
|
|
|
|
else:
|
|
gcd_denom = gcd(self._denom, number._denom)
|
|
coef1 = number._denom // gcd_denom
|
|
coef2 = self._denom // gcd_denom
|
|
|
|
steps += ["( {num1} * {coef1} ) / ( {den1} * {coef1} ) - ( {num2} * {coef2} ) / ( {den2} * {coef2} )".format(num1 = self._num, den1 = self._denom, coef1 = coef1, num2 = number._num, den2 = number._denom, coef2 = coef2)]
|
|
|
|
com_denom = self._denom * coef1
|
|
num1 = self._num * coef1
|
|
num2 = number._num * coef2
|
|
|
|
steps += ["( {num1} - {num2} ) / {denom}".format(num1 = num1, num2 = num2, denom = com_denom)]
|
|
|
|
num = num1 - num2
|
|
|
|
ans_frac = Fraction(num, com_denom)
|
|
steps += ans_frac.simplify()
|
|
|
|
return steps
|
|
|
|
def __mul__(self, other):
|
|
if type(other) == Fraction:
|
|
#cool
|
|
number = other
|
|
else:
|
|
number = Fraction(other)
|
|
|
|
steps = ["( {frac1} ) * ( {frac2} )".format(frac1 = self, frac2 = number)]
|
|
steps += ["( {num1} * {num2} ) / ( {denom1} * {denom2} )".format(num1 = self._num, num2 = number._num, denom1 = self._denom, denom2 = number._denom)]
|
|
|
|
num = self._num * number._num
|
|
denom = self._denom * number._denom
|
|
|
|
ans_frac = Fraction(num, denom)
|
|
steps += ans_frac.simplify()
|
|
|
|
return steps
|
|
|
|
def __truediv__(self, other):
|
|
if type(other) == Fraction:
|
|
#cool
|
|
number = other
|
|
else:
|
|
number = Fraction(other)
|
|
|
|
steps = ["( {frac1} ) / ( {frac2} )".format(frac1 = self, frac2 = number)]
|
|
number = Fraction(number._denom, number._num)
|
|
steps += self * number
|
|
|
|
return steps
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
f = Fraction(34, 12)
|
|
g = Fraction(1,5)
|
|
h = Fraction(-1,5)
|
|
t = Fraction(-4,5)
|
|
print("---------")
|
|
for i in (f - 1):
|
|
print(i)
|
|
print("---------")
|
|
for i in (f + 1):
|
|
print(i)
|
|
print("---------")
|
|
for i in (f + g):
|
|
print(i)
|
|
print("---------")
|
|
for i in (f - g):
|
|
print(i)
|
|
print("---------")
|
|
for i in (f * g):
|
|
print(i)
|
|
print("---------")
|
|
for i in (h + t):
|
|
print(i)
|
|
print("---------")
|
|
for i in (h - t):
|
|
print(i)
|
|
print("---------")
|
|
for i in (h * t):
|
|
print(i)
|
|
print("---------")
|
|
for i in (h / t):
|
|
print(i)
|
|
|
|
#print(f.simplify())
|
|
|
|
# -----------------------------
|
|
# Reglages pour 'vim'
|
|
# vim:set autoindent expandtab tabstop=4 shiftwidth=4:
|
|
# cursor: 16 del
|