#!/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