<s> import operator <EOL> import sys <EOL> from . libmp import int_types , mpf_hash , bitcount , from_man_exp , HASH_MODULUS <EOL> new = object . __new__ <EOL> def create_reduced ( p , q , _cache = { } ) : <EOL> key = p , q <EOL> if key in _cache : <EOL> return _cache [ key ] <EOL> x , y = p , q <EOL> while y : <EOL> x , y = y , x % y <EOL> if x != <NUM_LIT:1> : <EOL> p //= x <EOL> q //= x <EOL> v = new ( mpq ) <EOL> v . _mpq_ = p , q <EOL> if q <= <NUM_LIT:4> and abs ( key [ <NUM_LIT:0> ] ) < <NUM_LIT:100> : <EOL> _cache [ key ] = v <EOL> return v <EOL> class mpq ( object ) : <EOL> """<STR_LIT>""" <EOL> __slots__ = [ "<STR_LIT>" ] <EOL> def __new__ ( cls , p , q = <NUM_LIT:1> ) : <EOL> if type ( p ) is tuple : <EOL> p , q = p <EOL> elif hasattr ( p , '<STR_LIT>' ) : <EOL> p , q = p . _mpq_ <EOL> return create_reduced ( p , q ) <EOL> def __repr__ ( s ) : <EOL> return "<STR_LIT>" % s . _mpq_ <EOL> def __str__ ( s ) : <EOL> return "<STR_LIT>" % s . _mpq_ <EOL> def __int__ ( s ) : <EOL> a , b = s . _mpq_ <EOL> return a // b <EOL> def __nonzero__ ( s ) : <EOL> return bool ( s . _mpq_ [ <NUM_LIT:0> ] ) <EOL> __bool__ = __nonzero__ <EOL> def __hash__ ( s ) : <EOL> a , b = s . _mpq_ <EOL> if sys . version >= "<STR_LIT>" : <EOL> inverse = pow ( b , HASH_MODULUS - <NUM_LIT:2> , HASH_MODULUS ) <EOL> if not inverse : <EOL> h = sys . hash_info . inf <EOL> else : <EOL> h = ( abs ( a ) * inverse ) % HASH_MODULUS <EOL> if a < <NUM_LIT:0> : h = - h <EOL> if h == - <NUM_LIT:1> : h = - <NUM_LIT:2> <EOL> return h <EOL> else : <EOL> if b == <NUM_LIT:1> : <EOL> return hash ( a ) <EOL> if not ( b & ( b - <NUM_LIT:1> ) ) : <EOL> return mpf_hash ( from_man_exp ( a , <NUM_LIT:1> - bitcount ( b ) ) ) <EOL> return hash ( ( a , b ) ) <EOL> def __eq__ ( s , t ) : <EOL> ttype = type ( t ) <EOL> if ttype is mpq : <EOL> return s . _mpq_ == t . _mpq_ <EOL> if ttype in int_types : <EOL> a , b = s . _mpq_ <EOL> if b != <NUM_LIT:1> : <EOL> return False <EOL> return a == t <EOL> return NotImplemented <EOL> def __ne__ ( s , t ) : <EOL> ttype = type ( t ) <EOL> if ttype is mpq : <EOL> return s . _mpq_ != t . _mpq_ <EOL> if ttype in int_types : <EOL> a , b = s . _mpq_ <EOL> if b != <NUM_LIT:1> : <EOL> return True <EOL> return a != t <EOL> return NotImplemented <EOL> def _cmp ( s , t , op ) : <EOL> ttype = type ( t ) <EOL> if ttype in int_types : <EOL> a , b = s . _mpq_ <EOL> return op ( a , t * b ) <EOL> if ttype is mpq : <EOL> a , b = s . _mpq_ <EOL> c , d = t . _mpq_ <EOL> return op ( a * d , b * c ) <EOL> return NotImplementedError <EOL> def __lt__ ( s , t ) : return s . _cmp ( t , operator . lt ) <EOL> def __le__ ( s , t ) : return s . _cmp ( t , operator . le ) <EOL> def __gt__ ( s , t ) : return s . _cmp ( t , operator . gt ) <EOL> def __ge__ ( s , t ) : return s . _cmp ( t , operator . ge ) <EOL> def __abs__ ( s ) : <EOL> a , b = s . _mpq_ <EOL> if a >= <NUM_LIT:0> : <EOL> return s <EOL> v = new ( mpq ) <EOL> v . _mpq_ = - a , b <EOL> return v <EOL> def __neg__ ( s ) : <EOL> a , b = s . _mpq_ <EOL> v = new ( mpq ) <EOL> v . _mpq_ = - a , b <EOL> return v <EOL> def __pos__ ( s ) : <EOL> return s <EOL> def __add__ ( s , t ) : <EOL> ttype = type ( t ) <EOL> if ttype is mpq : <EOL> a , b = s . _mpq_ <EOL> c , d = t . _mpq_ <EOL> return create_reduced ( a * d + b * c , b * d ) <EOL> if ttype in int_types : <EOL> a , b = s . _mpq_ <EOL> v = new ( mpq ) <EOL> v . _mpq_ = a + b * t , b <EOL> return v <EOL> return NotImplemented <EOL> __radd__ = __add__ <EOL> def __sub__ ( s , t ) : <EOL> ttype = type ( t ) <EOL> if ttype is mpq : <EOL> a , b = s . _mpq_ <EOL> c , d = t . _mpq_ <EOL> return create_reduced ( a * d - b * c , b * d ) <EOL> if ttype in int_types : <EOL> a , b = s . _mpq_ <EOL> v = new ( mpq ) <EOL> v . _mpq_ = a - b * t , b <EOL> return v <EOL> return NotImplemented <EOL> def __rsub__ ( s , t ) : <EOL> ttype = type ( t ) <EOL> if ttype is mpq : <EOL> a , b = s . _mpq_ <EOL> c , d = t . _mpq_ <EOL> return create_reduced ( b * c - a * d , b * d ) <EOL> if ttype in int_types : <EOL> a , b = s . _mpq_ <EOL> v = new ( mpq ) <EOL> v . _mpq_ = b * t - a , b <EOL> return v <EOL> return NotImplemented <EOL> def __mul__ ( s , t ) : <EOL> ttype = type ( t ) <EOL> if ttype is mpq : <EOL> a , b = s . _mpq_ <EOL> c , d = t . _mpq_ <EOL> return create_reduced ( a * c , b * d ) <EOL> if ttype in int_types : <EOL> a , b = s . _mpq_ <EOL> return create_reduced ( a * t , b ) <EOL> return NotImplemented <EOL> __rmul__ = __mul__ <EOL> def __div__ ( s , t ) : <EOL> ttype = type ( t ) <EOL> if ttype is mpq : <EOL> a , b = s . _mpq_ <EOL> c , d = t . _mpq_ <EOL> return create_reduced ( a * d , b * c ) <EOL> if ttype in int_types : <EOL> a , b = s . _mpq_ <EOL> return create_reduced ( a , b * t ) <EOL> return NotImplemented <EOL> def __rdiv__ ( s , t ) : <EOL> ttype = type ( t ) <EOL> if ttype is mpq : <EOL> a , b = s . _mpq_ <EOL> c , d = t . _mpq_ <EOL> return create_reduced ( b * c , a * d ) <EOL> if ttype in int_types : <EOL> a , b = s . _mpq_ <EOL> return create_reduced ( b * t , a ) <EOL> return NotImplemented <EOL> def __pow__ ( s , t ) : <EOL> ttype = type ( t ) <EOL> if ttype in int_types : <EOL> a , b = s . _mpq_ <EOL> if t : <EOL> if t < <NUM_LIT:0> : <EOL> a , b , t = b , a , - t <EOL> v = new ( mpq ) <EOL> v . _mpq_ = a ** t , b ** t <EOL> return v <EOL> raise ZeroDivisionError <EOL> return NotImplemented <EOL> mpq_1 = mpq ( ( <NUM_LIT:1> , <NUM_LIT:1> ) ) <EOL> mpq_0 = mpq ( ( <NUM_LIT:0> , <NUM_LIT:1> ) ) <EOL> mpq_1_2 = mpq ( ( <NUM_LIT:1> , <NUM_LIT:2> ) ) <EOL> mpq_3_2 = mpq ( ( <NUM_LIT:3> , <NUM_LIT:2> ) ) <EOL> mpq_1_4 = mpq ( ( <NUM_LIT:1> , <NUM_LIT:4> ) ) <EOL> mpq_1_16 = mpq ( ( <NUM_LIT:1> , <NUM_LIT:16> ) ) <EOL> mpq_3_16 = mpq ( ( <NUM_LIT:3> , <NUM_LIT:16> ) ) <EOL> mpq_5_2 = mpq ( ( <NUM_LIT:5> , <NUM_LIT:2> ) ) <EOL> mpq_3_4 = mpq ( ( <NUM_LIT:3> , <NUM_LIT:4> ) ) <EOL> mpq_7_4 = mpq ( ( <NUM_LIT:7> , <NUM_LIT:4> ) ) <EOL> mpq_5_4 = mpq ( ( <NUM_LIT:5> , <NUM_LIT:4> ) ) <EOL> try : <EOL> import numbers <EOL> numbers . Rational . register ( mpq ) <EOL> except ImportError : <EOL> pass </s>
