blob: 57bf7f50431ef7476b6544bdccb4f2232269b47f [file] [log] [blame]
Guido van Rossum7736b5b2008-01-15 21:44:53 +00001# Originally contributed by Sjoerd Mullender.
2# Significantly modified by Jeffrey Yasskin <jyasskin at gmail.com>.
3
Christian Heimes3feef612008-02-11 06:19:17 +00004"""Fraction, infinite-precision, real numbers."""
Guido van Rossum7736b5b2008-01-15 21:44:53 +00005
Mark Dickinson98127c32010-04-03 11:18:52 +00006from decimal import Decimal
Guido van Rossum7736b5b2008-01-15 21:44:53 +00007import math
8import numbers
9import operator
Christian Heimes587c2bf2008-01-19 16:21:02 +000010import re
Mark Dickinsondc787d22010-05-23 13:33:13 +000011import sys
Guido van Rossum7736b5b2008-01-15 21:44:53 +000012
Raymond Hettingere580f5c2008-05-08 16:03:04 +000013__all__ = ['Fraction', 'gcd']
Guido van Rossum7736b5b2008-01-15 21:44:53 +000014
Guido van Rossum7736b5b2008-01-15 21:44:53 +000015
16
Christian Heimesaf98da12008-01-27 15:18:18 +000017def gcd(a, b):
18 """Calculate the Greatest Common Divisor of a and b.
Guido van Rossum7736b5b2008-01-15 21:44:53 +000019
20 Unless b==0, the result will have the same sign as b (so that when
21 b is divided by it, the result comes out positive).
22 """
23 while b:
24 a, b = b, a%b
25 return a
26
Mark Dickinsondc787d22010-05-23 13:33:13 +000027# Constants related to the hash implementation; hash(x) is based
28# on the reduction of x modulo the prime _PyHASH_MODULUS.
29_PyHASH_MODULUS = sys.hash_info.modulus
30# Value to be used for rationals that reduce to infinity modulo
31# _PyHASH_MODULUS.
32_PyHASH_INF = sys.hash_info.inf
Guido van Rossum7736b5b2008-01-15 21:44:53 +000033
Christian Heimes292d3512008-02-03 16:51:08 +000034_RATIONAL_FORMAT = re.compile(r"""
35 \A\s* # optional whitespace at the start, then
36 (?P<sign>[-+]?) # an optional sign, then
37 (?=\d|\.\d) # lookahead for digit or .digit
38 (?P<num>\d*) # numerator (possibly empty)
Mark Dickinsoncf63f2f2009-04-22 17:50:21 +000039 (?: # followed by
40 (?:/(?P<denom>\d+))? # an optional denominator
Christian Heimes292d3512008-02-03 16:51:08 +000041 | # or
Mark Dickinsoncf63f2f2009-04-22 17:50:21 +000042 (?:\.(?P<decimal>\d*))? # an optional fractional part
43 (?:E(?P<exp>[-+]?\d+))? # and optional exponent
44 )
Christian Heimes292d3512008-02-03 16:51:08 +000045 \s*\Z # and optional whitespace to finish
Mark Dickinsoncf63f2f2009-04-22 17:50:21 +000046""", re.VERBOSE | re.IGNORECASE)
Christian Heimes587c2bf2008-01-19 16:21:02 +000047
48
Christian Heimes3feef612008-02-11 06:19:17 +000049class Fraction(numbers.Rational):
Guido van Rossum7736b5b2008-01-15 21:44:53 +000050 """This class implements rational numbers.
51
Mark Dickinson98127c32010-04-03 11:18:52 +000052 In the two-argument form of the constructor, Fraction(8, 6) will
53 produce a rational number equivalent to 4/3. Both arguments must
54 be Rational. The numerator defaults to 0 and the denominator
55 defaults to 1 so that Fraction(3) == 3 and Fraction() == 0.
Guido van Rossum7736b5b2008-01-15 21:44:53 +000056
Mark Dickinson98127c32010-04-03 11:18:52 +000057 Fractions can also be constructed from:
58
59 - numeric strings similar to those accepted by the
60 float constructor (for example, '-2.3' or '1e10')
61
62 - strings of the form '123/456'
63
64 - float and Decimal instances
65
66 - other Rational instances (including integers)
Christian Heimes587c2bf2008-01-19 16:21:02 +000067
Guido van Rossum7736b5b2008-01-15 21:44:53 +000068 """
69
Christian Heimes400adb02008-02-01 08:12:03 +000070 __slots__ = ('_numerator', '_denominator')
Guido van Rossum7736b5b2008-01-15 21:44:53 +000071
Christian Heimes587c2bf2008-01-19 16:21:02 +000072 # We're immutable, so use __new__ not __init__
Mark Dickinson3c286e22014-04-05 09:29:00 +010073 def __new__(cls, numerator=0, denominator=None, _normalize=True):
Christian Heimes587c2bf2008-01-19 16:21:02 +000074 """Constructs a Rational.
75
Mark Dickinson98127c32010-04-03 11:18:52 +000076 Takes a string like '3/2' or '1.5', another Rational instance, a
77 numerator/denominator pair, or a float.
78
79 Examples
80 --------
81
82 >>> Fraction(10, -8)
83 Fraction(-5, 4)
84 >>> Fraction(Fraction(1, 7), 5)
85 Fraction(1, 35)
86 >>> Fraction(Fraction(1, 7), Fraction(2, 3))
87 Fraction(3, 14)
88 >>> Fraction('314')
89 Fraction(314, 1)
90 >>> Fraction('-35/4')
91 Fraction(-35, 4)
92 >>> Fraction('3.1415') # conversion from numeric string
93 Fraction(6283, 2000)
94 >>> Fraction('-47e-2') # string may include a decimal exponent
95 Fraction(-47, 100)
96 >>> Fraction(1.47) # direct construction from float (exact conversion)
97 Fraction(6620291452234629, 4503599627370496)
98 >>> Fraction(2.25)
99 Fraction(9, 4)
100 >>> Fraction(Decimal('1.47'))
101 Fraction(147, 100)
Christian Heimes587c2bf2008-01-19 16:21:02 +0000102
103 """
Christian Heimes3feef612008-02-11 06:19:17 +0000104 self = super(Fraction, cls).__new__(cls)
Christian Heimes587c2bf2008-01-19 16:21:02 +0000105
Mark Dickinsond4d95f82009-04-24 14:06:19 +0000106 if denominator is None:
107 if isinstance(numerator, numbers.Rational):
108 self._numerator = numerator.numerator
109 self._denominator = numerator.denominator
110 return self
111
Mark Dickinson98127c32010-04-03 11:18:52 +0000112 elif isinstance(numerator, float):
113 # Exact conversion from float
114 value = Fraction.from_float(numerator)
115 self._numerator = value._numerator
116 self._denominator = value._denominator
117 return self
118
119 elif isinstance(numerator, Decimal):
120 value = Fraction.from_decimal(numerator)
121 self._numerator = value._numerator
122 self._denominator = value._denominator
123 return self
124
Mark Dickinsond4d95f82009-04-24 14:06:19 +0000125 elif isinstance(numerator, str):
Christian Heimes587c2bf2008-01-19 16:21:02 +0000126 # Handle construction from strings.
Mark Dickinsoncf63f2f2009-04-22 17:50:21 +0000127 m = _RATIONAL_FORMAT.match(numerator)
Christian Heimes587c2bf2008-01-19 16:21:02 +0000128 if m is None:
Mark Dickinsoncf63f2f2009-04-22 17:50:21 +0000129 raise ValueError('Invalid literal for Fraction: %r' %
130 numerator)
131 numerator = int(m.group('num') or '0')
132 denom = m.group('denom')
133 if denom:
134 denominator = int(denom)
Christian Heimesaf98da12008-01-27 15:18:18 +0000135 else:
Mark Dickinsoncf63f2f2009-04-22 17:50:21 +0000136 denominator = 1
137 decimal = m.group('decimal')
138 if decimal:
139 scale = 10**len(decimal)
140 numerator = numerator * scale + int(decimal)
141 denominator *= scale
142 exp = m.group('exp')
143 if exp:
144 exp = int(exp)
145 if exp >= 0:
146 numerator *= 10**exp
147 else:
148 denominator *= 10**-exp
Christian Heimes587c2bf2008-01-19 16:21:02 +0000149 if m.group('sign') == '-':
150 numerator = -numerator
151
Mark Dickinsond4d95f82009-04-24 14:06:19 +0000152 else:
153 raise TypeError("argument should be a string "
154 "or a Rational instance")
155
156 elif (isinstance(numerator, numbers.Rational) and
157 isinstance(denominator, numbers.Rational)):
158 numerator, denominator = (
159 numerator.numerator * denominator.denominator,
160 denominator.numerator * numerator.denominator
161 )
162 else:
163 raise TypeError("both arguments should be "
164 "Rational instances")
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000165
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000166 if denominator == 0:
Christian Heimes3feef612008-02-11 06:19:17 +0000167 raise ZeroDivisionError('Fraction(%s, 0)' % numerator)
Mark Dickinson3c286e22014-04-05 09:29:00 +0100168 if _normalize:
169 g = gcd(numerator, denominator)
170 numerator //= g
171 denominator //= g
172 self._numerator = numerator
173 self._denominator = denominator
Christian Heimes587c2bf2008-01-19 16:21:02 +0000174 return self
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000175
176 @classmethod
177 def from_float(cls, f):
Christian Heimes587c2bf2008-01-19 16:21:02 +0000178 """Converts a finite float to a rational number, exactly.
179
Christian Heimes3feef612008-02-11 06:19:17 +0000180 Beware that Fraction.from_float(0.3) != Fraction(3, 10).
Christian Heimes587c2bf2008-01-19 16:21:02 +0000181
182 """
Georg Brandl2ee470f2008-07-16 12:55:28 +0000183 if isinstance(f, numbers.Integral):
Georg Brandl3a9b0622009-01-03 22:07:57 +0000184 return cls(f)
Georg Brandl2ee470f2008-07-16 12:55:28 +0000185 elif not isinstance(f, float):
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000186 raise TypeError("%s.from_float() only takes floats, not %r (%s)" %
187 (cls.__name__, f, type(f).__name__))
Mark Dickinson73726aa2012-11-15 20:58:40 +0000188 if math.isnan(f):
189 raise ValueError("Cannot convert %r to %s." % (f, cls.__name__))
190 if math.isinf(f):
191 raise OverflowError("Cannot convert %r to %s." % (f, cls.__name__))
Christian Heimes26855632008-01-27 23:50:43 +0000192 return cls(*f.as_integer_ratio())
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000193
Christian Heimes587c2bf2008-01-19 16:21:02 +0000194 @classmethod
195 def from_decimal(cls, dec):
196 """Converts a finite Decimal instance to a rational number, exactly."""
197 from decimal import Decimal
Georg Brandl2ee470f2008-07-16 12:55:28 +0000198 if isinstance(dec, numbers.Integral):
199 dec = Decimal(int(dec))
200 elif not isinstance(dec, Decimal):
Christian Heimes587c2bf2008-01-19 16:21:02 +0000201 raise TypeError(
202 "%s.from_decimal() only takes Decimals, not %r (%s)" %
203 (cls.__name__, dec, type(dec).__name__))
Mark Dickinson73726aa2012-11-15 20:58:40 +0000204 if dec.is_infinite():
205 raise OverflowError(
206 "Cannot convert %s to %s." % (dec, cls.__name__))
207 if dec.is_nan():
208 raise ValueError("Cannot convert %s to %s." % (dec, cls.__name__))
Christian Heimes587c2bf2008-01-19 16:21:02 +0000209 sign, digits, exp = dec.as_tuple()
210 digits = int(''.join(map(str, digits)))
211 if sign:
212 digits = -digits
213 if exp >= 0:
214 return cls(digits * 10 ** exp)
215 else:
216 return cls(digits, 10 ** -exp)
217
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000218 def limit_denominator(self, max_denominator=1000000):
219 """Closest Fraction to self with denominator at most max_denominator.
Christian Heimesbbffeb62008-01-24 09:42:52 +0000220
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000221 >>> Fraction('3.141592653589793').limit_denominator(10)
222 Fraction(22, 7)
223 >>> Fraction('3.141592653589793').limit_denominator(100)
224 Fraction(311, 99)
Mark Dickinsondfb15622009-11-23 16:27:17 +0000225 >>> Fraction(4321, 8765).limit_denominator(10000)
226 Fraction(4321, 8765)
Christian Heimesbbffeb62008-01-24 09:42:52 +0000227
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000228 """
229 # Algorithm notes: For any real number x, define a *best upper
230 # approximation* to x to be a rational number p/q such that:
231 #
232 # (1) p/q >= x, and
233 # (2) if p/q > r/s >= x then s > q, for any rational r/s.
234 #
235 # Define *best lower approximation* similarly. Then it can be
236 # proved that a rational number is a best upper or lower
237 # approximation to x if, and only if, it is a convergent or
238 # semiconvergent of the (unique shortest) continued fraction
239 # associated to x.
240 #
241 # To find a best rational approximation with denominator <= M,
242 # we find the best upper and lower approximations with
243 # denominator <= M and take whichever of these is closer to x.
244 # In the event of a tie, the bound with smaller denominator is
245 # chosen. If both denominators are equal (which can happen
246 # only when max_denominator == 1 and self is midway between
247 # two integers) the lower bound---i.e., the floor of self, is
248 # taken.
249
250 if max_denominator < 1:
251 raise ValueError("max_denominator should be at least 1")
252 if self._denominator <= max_denominator:
253 return Fraction(self)
254
255 p0, q0, p1, q1 = 0, 1, 1, 0
256 n, d = self._numerator, self._denominator
257 while True:
258 a = n//d
259 q2 = q0+a*q1
260 if q2 > max_denominator:
Christian Heimesbbffeb62008-01-24 09:42:52 +0000261 break
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000262 p0, q0, p1, q1 = p1, q1, p0+a*p1, q2
263 n, d = d, n-a*d
264
265 k = (max_denominator-q0)//q1
266 bound1 = Fraction(p0+k*p1, q0+k*q1)
267 bound2 = Fraction(p1, q1)
268 if abs(bound2 - self) <= abs(bound1-self):
269 return bound2
270 else:
271 return bound1
Christian Heimesbbffeb62008-01-24 09:42:52 +0000272
Christian Heimes400adb02008-02-01 08:12:03 +0000273 @property
274 def numerator(a):
275 return a._numerator
276
277 @property
278 def denominator(a):
279 return a._denominator
280
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000281 def __repr__(self):
282 """repr(self)"""
Serhiy Storchaka465e60e2014-07-25 23:36:00 +0300283 return '%s(%s, %s)' % (self.__class__.__name__,
284 self._numerator, self._denominator)
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000285
286 def __str__(self):
287 """str(self)"""
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000288 if self._denominator == 1:
289 return str(self._numerator)
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000290 else:
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000291 return '%s/%s' % (self._numerator, self._denominator)
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000292
293 def _operator_fallbacks(monomorphic_operator, fallback_operator):
294 """Generates forward and reverse operators given a purely-rational
295 operator and a function from the operator module.
296
297 Use this like:
298 __op__, __rop__ = _operator_fallbacks(just_rational_op, operator.op)
299
Christian Heimes7b3ce6a2008-01-31 14:31:45 +0000300 In general, we want to implement the arithmetic operations so
301 that mixed-mode operations either call an implementation whose
302 author knew about the types of both arguments, or convert both
303 to the nearest built in type and do the operation there. In
Christian Heimes3feef612008-02-11 06:19:17 +0000304 Fraction, that means that we define __add__ and __radd__ as:
Christian Heimes7b3ce6a2008-01-31 14:31:45 +0000305
306 def __add__(self, other):
Christian Heimes400adb02008-02-01 08:12:03 +0000307 # Both types have numerators/denominator attributes,
308 # so do the operation directly
Christian Heimes3feef612008-02-11 06:19:17 +0000309 if isinstance(other, (int, Fraction)):
310 return Fraction(self.numerator * other.denominator +
Christian Heimes7b3ce6a2008-01-31 14:31:45 +0000311 other.numerator * self.denominator,
312 self.denominator * other.denominator)
Christian Heimes400adb02008-02-01 08:12:03 +0000313 # float and complex don't have those operations, but we
314 # know about those types, so special case them.
Christian Heimes7b3ce6a2008-01-31 14:31:45 +0000315 elif isinstance(other, float):
316 return float(self) + other
317 elif isinstance(other, complex):
318 return complex(self) + other
Christian Heimes400adb02008-02-01 08:12:03 +0000319 # Let the other type take over.
320 return NotImplemented
Christian Heimes7b3ce6a2008-01-31 14:31:45 +0000321
322 def __radd__(self, other):
323 # radd handles more types than add because there's
324 # nothing left to fall back to.
Christian Heimes3feef612008-02-11 06:19:17 +0000325 if isinstance(other, numbers.Rational):
326 return Fraction(self.numerator * other.denominator +
Christian Heimes7b3ce6a2008-01-31 14:31:45 +0000327 other.numerator * self.denominator,
328 self.denominator * other.denominator)
329 elif isinstance(other, Real):
330 return float(other) + float(self)
331 elif isinstance(other, Complex):
332 return complex(other) + complex(self)
Christian Heimes400adb02008-02-01 08:12:03 +0000333 return NotImplemented
Christian Heimes7b3ce6a2008-01-31 14:31:45 +0000334
335
336 There are 5 different cases for a mixed-type addition on
Christian Heimes3feef612008-02-11 06:19:17 +0000337 Fraction. I'll refer to all of the above code that doesn't
338 refer to Fraction, float, or complex as "boilerplate". 'r'
339 will be an instance of Fraction, which is a subtype of
340 Rational (r : Fraction <: Rational), and b : B <:
Christian Heimes7b3ce6a2008-01-31 14:31:45 +0000341 Complex. The first three involve 'r + b':
342
Christian Heimes3feef612008-02-11 06:19:17 +0000343 1. If B <: Fraction, int, float, or complex, we handle
Christian Heimes7b3ce6a2008-01-31 14:31:45 +0000344 that specially, and all is well.
Christian Heimes3feef612008-02-11 06:19:17 +0000345 2. If Fraction falls back to the boilerplate code, and it
Christian Heimes7b3ce6a2008-01-31 14:31:45 +0000346 were to return a value from __add__, we'd miss the
347 possibility that B defines a more intelligent __radd__,
348 so the boilerplate should return NotImplemented from
Christian Heimes3feef612008-02-11 06:19:17 +0000349 __add__. In particular, we don't handle Rational
Christian Heimes7b3ce6a2008-01-31 14:31:45 +0000350 here, even though we could get an exact answer, in case
351 the other type wants to do something special.
Christian Heimes3feef612008-02-11 06:19:17 +0000352 3. If B <: Fraction, Python tries B.__radd__ before
353 Fraction.__add__. This is ok, because it was
354 implemented with knowledge of Fraction, so it can
Christian Heimes7b3ce6a2008-01-31 14:31:45 +0000355 handle those instances before delegating to Real or
356 Complex.
357
358 The next two situations describe 'b + r'. We assume that b
Christian Heimes3feef612008-02-11 06:19:17 +0000359 didn't know about Fraction in its implementation, and that it
Christian Heimes7b3ce6a2008-01-31 14:31:45 +0000360 uses similar boilerplate code:
361
Christian Heimes3feef612008-02-11 06:19:17 +0000362 4. If B <: Rational, then __radd_ converts both to the
Christian Heimes7b3ce6a2008-01-31 14:31:45 +0000363 builtin rational type (hey look, that's us) and
364 proceeds.
365 5. Otherwise, __radd__ tries to find the nearest common
366 base ABC, and fall back to its builtin type. Since this
367 class doesn't subclass a concrete type, there's no
368 implementation to fall back to, so we need to try as
369 hard as possible to return an actual value, or the user
370 will get a TypeError.
371
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000372 """
373 def forward(a, b):
Christian Heimes3feef612008-02-11 06:19:17 +0000374 if isinstance(b, (int, Fraction)):
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000375 return monomorphic_operator(a, b)
376 elif isinstance(b, float):
377 return fallback_operator(float(a), b)
378 elif isinstance(b, complex):
379 return fallback_operator(complex(a), b)
380 else:
381 return NotImplemented
382 forward.__name__ = '__' + fallback_operator.__name__ + '__'
383 forward.__doc__ = monomorphic_operator.__doc__
384
385 def reverse(b, a):
Christian Heimes3feef612008-02-11 06:19:17 +0000386 if isinstance(a, numbers.Rational):
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000387 # Includes ints.
388 return monomorphic_operator(a, b)
389 elif isinstance(a, numbers.Real):
390 return fallback_operator(float(a), float(b))
391 elif isinstance(a, numbers.Complex):
392 return fallback_operator(complex(a), complex(b))
393 else:
394 return NotImplemented
395 reverse.__name__ = '__r' + fallback_operator.__name__ + '__'
396 reverse.__doc__ = monomorphic_operator.__doc__
397
398 return forward, reverse
399
400 def _add(a, b):
401 """a + b"""
Christian Heimes3feef612008-02-11 06:19:17 +0000402 return Fraction(a.numerator * b.denominator +
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000403 b.numerator * a.denominator,
404 a.denominator * b.denominator)
405
406 __add__, __radd__ = _operator_fallbacks(_add, operator.add)
407
408 def _sub(a, b):
409 """a - b"""
Christian Heimes3feef612008-02-11 06:19:17 +0000410 return Fraction(a.numerator * b.denominator -
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000411 b.numerator * a.denominator,
412 a.denominator * b.denominator)
413
414 __sub__, __rsub__ = _operator_fallbacks(_sub, operator.sub)
415
416 def _mul(a, b):
417 """a * b"""
Christian Heimes3feef612008-02-11 06:19:17 +0000418 return Fraction(a.numerator * b.numerator, a.denominator * b.denominator)
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000419
420 __mul__, __rmul__ = _operator_fallbacks(_mul, operator.mul)
421
422 def _div(a, b):
423 """a / b"""
Christian Heimes3feef612008-02-11 06:19:17 +0000424 return Fraction(a.numerator * b.denominator,
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000425 a.denominator * b.numerator)
426
427 __truediv__, __rtruediv__ = _operator_fallbacks(_div, operator.truediv)
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000428
429 def __floordiv__(a, b):
430 """a // b"""
Jeffrey Yasskin9893de12008-01-17 07:36:30 +0000431 return math.floor(a / b)
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000432
433 def __rfloordiv__(b, a):
434 """a // b"""
Jeffrey Yasskin9893de12008-01-17 07:36:30 +0000435 return math.floor(a / b)
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000436
Christian Heimes969fe572008-01-25 11:23:10 +0000437 def __mod__(a, b):
438 """a % b"""
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000439 div = a // b
440 return a - b * div
441
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000442 def __rmod__(b, a):
443 """a % b"""
Christian Heimes969fe572008-01-25 11:23:10 +0000444 div = a // b
445 return a - b * div
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000446
447 def __pow__(a, b):
448 """a ** b
449
450 If b is not an integer, the result will be a float or complex
451 since roots are generally irrational. If b is an integer, the
452 result will be rational.
453
454 """
Christian Heimes3feef612008-02-11 06:19:17 +0000455 if isinstance(b, numbers.Rational):
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000456 if b.denominator == 1:
457 power = b.numerator
458 if power >= 0:
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000459 return Fraction(a._numerator ** power,
Mark Dickinson3c286e22014-04-05 09:29:00 +0100460 a._denominator ** power,
461 _normalize=False)
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000462 else:
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000463 return Fraction(a._denominator ** -power,
Mark Dickinson3c286e22014-04-05 09:29:00 +0100464 a._numerator ** -power,
465 _normalize=False)
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000466 else:
467 # A fractional power will generally produce an
468 # irrational number.
469 return float(a) ** float(b)
470 else:
471 return float(a) ** b
472
473 def __rpow__(b, a):
474 """a ** b"""
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000475 if b._denominator == 1 and b._numerator >= 0:
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000476 # If a is an int, keep it that way if possible.
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000477 return a ** b._numerator
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000478
Christian Heimes3feef612008-02-11 06:19:17 +0000479 if isinstance(a, numbers.Rational):
480 return Fraction(a.numerator, a.denominator) ** b
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000481
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000482 if b._denominator == 1:
483 return a ** b._numerator
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000484
485 return a ** float(b)
486
487 def __pos__(a):
Christian Heimes3feef612008-02-11 06:19:17 +0000488 """+a: Coerces a subclass instance to Fraction"""
Mark Dickinson3c286e22014-04-05 09:29:00 +0100489 return Fraction(a._numerator, a._denominator, _normalize=False)
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000490
491 def __neg__(a):
492 """-a"""
Mark Dickinson3c286e22014-04-05 09:29:00 +0100493 return Fraction(-a._numerator, a._denominator, _normalize=False)
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000494
495 def __abs__(a):
496 """abs(a)"""
Mark Dickinson3c286e22014-04-05 09:29:00 +0100497 return Fraction(abs(a._numerator), a._denominator, _normalize=False)
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000498
499 def __trunc__(a):
500 """trunc(a)"""
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000501 if a._numerator < 0:
502 return -(-a._numerator // a._denominator)
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000503 else:
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000504 return a._numerator // a._denominator
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000505
506 def __floor__(a):
507 """Will be math.floor(a) in 3.0."""
508 return a.numerator // a.denominator
509
510 def __ceil__(a):
511 """Will be math.ceil(a) in 3.0."""
512 # The negations cleverly convince floordiv to return the ceiling.
513 return -(-a.numerator // a.denominator)
514
515 def __round__(self, ndigits=None):
516 """Will be round(self, ndigits) in 3.0.
517
518 Rounds half toward even.
519 """
520 if ndigits is None:
521 floor, remainder = divmod(self.numerator, self.denominator)
522 if remainder * 2 < self.denominator:
523 return floor
524 elif remainder * 2 > self.denominator:
525 return floor + 1
526 # Deal with the half case:
527 elif floor % 2 == 0:
528 return floor
529 else:
530 return floor + 1
531 shift = 10**abs(ndigits)
532 # See _operator_fallbacks.forward to check that the results of
Christian Heimes3feef612008-02-11 06:19:17 +0000533 # these operations will always be Fraction and therefore have
Jeffrey Yasskin9893de12008-01-17 07:36:30 +0000534 # round().
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000535 if ndigits > 0:
Christian Heimes3feef612008-02-11 06:19:17 +0000536 return Fraction(round(self * shift), shift)
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000537 else:
Christian Heimes3feef612008-02-11 06:19:17 +0000538 return Fraction(round(self / shift) * shift)
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000539
540 def __hash__(self):
Mark Dickinsonfec66202010-11-13 10:27:38 +0000541 """hash(self)"""
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000542
Christian Heimes969fe572008-01-25 11:23:10 +0000543 # XXX since this method is expensive, consider caching the result
Mark Dickinsondc787d22010-05-23 13:33:13 +0000544
545 # In order to make sure that the hash of a Fraction agrees
546 # with the hash of a numerically equal integer, float or
547 # Decimal instance, we follow the rules for numeric hashes
548 # outlined in the documentation. (See library docs, 'Built-in
549 # Types').
550
551 # dinv is the inverse of self._denominator modulo the prime
552 # _PyHASH_MODULUS, or 0 if self._denominator is divisible by
553 # _PyHASH_MODULUS.
554 dinv = pow(self._denominator, _PyHASH_MODULUS - 2, _PyHASH_MODULUS)
555 if not dinv:
556 hash_ = _PyHASH_INF
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000557 else:
Mark Dickinsondc787d22010-05-23 13:33:13 +0000558 hash_ = abs(self._numerator) * dinv % _PyHASH_MODULUS
Mark Dickinsonfec66202010-11-13 10:27:38 +0000559 result = hash_ if self >= 0 else -hash_
560 return -2 if result == -1 else result
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000561
562 def __eq__(a, b):
563 """a == b"""
Christian Heimes3feef612008-02-11 06:19:17 +0000564 if isinstance(b, numbers.Rational):
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000565 return (a._numerator == b.numerator and
566 a._denominator == b.denominator)
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000567 if isinstance(b, numbers.Complex) and b.imag == 0:
568 b = b.real
569 if isinstance(b, float):
Mark Dickinson85424c92009-07-18 14:41:42 +0000570 if math.isnan(b) or math.isinf(b):
571 # comparisons with an infinity or nan should behave in
572 # the same way for any finite a, so treat a as zero.
573 return 0.0 == b
574 else:
575 return a == a.from_float(b)
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000576 else:
Mark Dickinson85424c92009-07-18 14:41:42 +0000577 # Since a doesn't know how to compare with b, let's give b
578 # a chance to compare itself with a.
579 return NotImplemented
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000580
Mark Dickinson85424c92009-07-18 14:41:42 +0000581 def _richcmp(self, other, op):
582 """Helper for comparison operators, for internal use only.
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000583
Mark Dickinson85424c92009-07-18 14:41:42 +0000584 Implement comparison between a Rational instance `self`, and
585 either another Rational instance or a float `other`. If
586 `other` is not a Rational instance or a float, return
587 NotImplemented. `op` should be one of the six standard
588 comparison operators.
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000589
590 """
Mark Dickinson85424c92009-07-18 14:41:42 +0000591 # convert other to a Rational instance where reasonable.
592 if isinstance(other, numbers.Rational):
593 return op(self._numerator * other.denominator,
594 self._denominator * other.numerator)
Mark Dickinson85424c92009-07-18 14:41:42 +0000595 if isinstance(other, float):
596 if math.isnan(other) or math.isinf(other):
597 return op(0.0, other)
598 else:
599 return op(self, self.from_float(other))
600 else:
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000601 return NotImplemented
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000602
603 def __lt__(a, b):
604 """a < b"""
Mark Dickinson85424c92009-07-18 14:41:42 +0000605 return a._richcmp(b, operator.lt)
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000606
607 def __gt__(a, b):
608 """a > b"""
Mark Dickinson85424c92009-07-18 14:41:42 +0000609 return a._richcmp(b, operator.gt)
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000610
611 def __le__(a, b):
612 """a <= b"""
Mark Dickinson85424c92009-07-18 14:41:42 +0000613 return a._richcmp(b, operator.le)
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000614
615 def __ge__(a, b):
616 """a >= b"""
Mark Dickinson85424c92009-07-18 14:41:42 +0000617 return a._richcmp(b, operator.ge)
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000618
619 def __bool__(a):
620 """a != 0"""
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000621 return a._numerator != 0
Christian Heimes969fe572008-01-25 11:23:10 +0000622
623 # support for pickling, copy, and deepcopy
624
625 def __reduce__(self):
626 return (self.__class__, (str(self),))
627
628 def __copy__(self):
Christian Heimes3feef612008-02-11 06:19:17 +0000629 if type(self) == Fraction:
Christian Heimes969fe572008-01-25 11:23:10 +0000630 return self # I'm immutable; therefore I am my own clone
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000631 return self.__class__(self._numerator, self._denominator)
Christian Heimes969fe572008-01-25 11:23:10 +0000632
633 def __deepcopy__(self, memo):
Christian Heimes3feef612008-02-11 06:19:17 +0000634 if type(self) == Fraction:
Christian Heimes969fe572008-01-25 11:23:10 +0000635 return self # My components are also immutable
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000636 return self.__class__(self._numerator, self._denominator)