Advertisement
Guest User

Ryan

a guest
Nov 18th, 2008
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.87 KB | None | 0 0
  1. class Fraction:
  2.     __metaclass__ = dbc.DbcMeta
  3.  
  4.     @dbc.contract
  5.     def __init__(self, numerator, denominator=1):
  6.         self.numerator = numerator
  7.         self.denominator = denominator
  8.         self._cancel_down()
  9.  
  10.     @__init__.ensure
  11.     def __init__(returned, self, numerator, denominator=1):
  12.         assert (self.numerator / self.denominator) == (numerator / denominator), \
  13.             "%s != %s" % (self.numerator/self.denominator, numerator/denominator)
  14.  
  15.  
  16.     def __str__(self):
  17.         return str(self.numerator) + '/' + str(self.denominator)
  18.  
  19.     def __repr__(self):
  20.         return str(self)
  21.  
  22.     def __eq__(self, other):
  23.         return (self.numerator/self.denominator) == other
  24.  
  25.     @dbc.contract
  26.     def reciprocal(self):
  27.         return Fraction(self.denominator, self.numerator)
  28.  
  29.     @reciprocal.require
  30.     def reciprocal(self):
  31.         assert self.numerator != 0, "Numerator cannot be 0"
  32.  
  33.     @reciprocal.ensure
  34.     def reciprocal(returned, self):
  35.         assert returned * self == 1, "self * returned != 1"
  36.  
  37.     @dbc.contract
  38.     def __neg__(self):
  39.         return Fraction(-self.numerator, self.denominator)
  40.  
  41.     @__neg__.ensure
  42.     def __neg__(returned, self):
  43.         assert returned.numerator == -self.numerator
  44.         assert returned.denominator == self.denominator
  45.  
  46.     def __pos__(self):
  47.         return self
  48.  
  49.     def __add__(self, other):
  50.         return Fraction(self.numerator*other.denominator +
  51.                         other.numerator*self.denominator,
  52.                         self.denominator*self.denominator)
  53.  
  54.     def __sub__(self, other):
  55.         return self + (-other)
  56.  
  57.     def __mul__(self, other):
  58.         return Fraction(self.numerator*other.numerator,
  59.                         self.denominator*other.denominator)
  60.  
  61.     def __div__(self, other):
  62.         return self * other.reciprocal()
  63.  
  64.     def _cancel_down(self):
  65.         sign = 1
  66.         if self.denominator < 0:
  67.             sign = -sign
  68.             self.denominator = abs(self.denominator)
  69.         if self.numerator < 0:
  70.             sign = -sign
  71.             self.numerator = abs(self.numerator)
  72.  
  73.         divisor = self.gcd(self.numerator, self.denominator)
  74.         self.numerator = sign * (self.numerator // divisor)
  75.         self.denominator = self.denominator // divisor
  76.  
  77.     @dbc.contract
  78.     def gcd(self, x, y):
  79.         v = y
  80.         result = x
  81.         while v != 0:
  82.             remainder = result % v
  83.             result = v
  84.             v = remainder
  85.         return result or 1
  86.  
  87.     @gcd.require
  88.     def gcd(self, x, y):
  89.         assert x >= 0, "x should be nonnegative"
  90.         assert y >= 0, "y should be nonnegative"
  91.  
  92.     @gcd.ensure
  93.     def gcd(returned, self, x,y):
  94.         assert returned == self.gcd.method(self, y,x)
  95.  
  96.     def invariant(self):
  97.         assert self.denominator != 0
  98.         assert self == self
  99.         assert self - self == 0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement