blob: 79e83ff2c00d3bc9148673fc9ed5b73be6c2a1b4 [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 Dickinsond4d95f82009-04-24 14:06:19 +000073 def __new__(cls, numerator=0, denominator=None):
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)
Christian Heimesaf98da12008-01-27 15:18:18 +0000168 g = gcd(numerator, denominator)
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000169 self._numerator = numerator // g
170 self._denominator = denominator // g
Christian Heimes587c2bf2008-01-19 16:21:02 +0000171 return self
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000172
173 @classmethod
174 def from_float(cls, f):
Christian Heimes587c2bf2008-01-19 16:21:02 +0000175 """Converts a finite float to a rational number, exactly.
176
Christian Heimes3feef612008-02-11 06:19:17 +0000177 Beware that Fraction.from_float(0.3) != Fraction(3, 10).
Christian Heimes587c2bf2008-01-19 16:21:02 +0000178
179 """
Georg Brandl2ee470f2008-07-16 12:55:28 +0000180 if isinstance(f, numbers.Integral):
Georg Brandl3a9b0622009-01-03 22:07:57 +0000181 return cls(f)
Georg Brandl2ee470f2008-07-16 12:55:28 +0000182 elif not isinstance(f, float):
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000183 raise TypeError("%s.from_float() only takes floats, not %r (%s)" %
184 (cls.__name__, f, type(f).__name__))
Mark Dickinson73726aa2012-11-15 20:58:40 +0000185 if math.isnan(f):
186 raise ValueError("Cannot convert %r to %s." % (f, cls.__name__))
187 if math.isinf(f):
188 raise OverflowError("Cannot convert %r to %s." % (f, cls.__name__))
Christian Heimes26855632008-01-27 23:50:43 +0000189 return cls(*f.as_integer_ratio())
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000190
Christian Heimes587c2bf2008-01-19 16:21:02 +0000191 @classmethod
192 def from_decimal(cls, dec):
193 """Converts a finite Decimal instance to a rational number, exactly."""
194 from decimal import Decimal
Georg Brandl2ee470f2008-07-16 12:55:28 +0000195 if isinstance(dec, numbers.Integral):
196 dec = Decimal(int(dec))
197 elif not isinstance(dec, Decimal):
Christian Heimes587c2bf2008-01-19 16:21:02 +0000198 raise TypeError(
199 "%s.from_decimal() only takes Decimals, not %r (%s)" %
200 (cls.__name__, dec, type(dec).__name__))
Mark Dickinson73726aa2012-11-15 20:58:40 +0000201 if dec.is_infinite():
202 raise OverflowError(
203 "Cannot convert %s to %s." % (dec, cls.__name__))
204 if dec.is_nan():
205 raise ValueError("Cannot convert %s to %s." % (dec, cls.__name__))
Christian Heimes587c2bf2008-01-19 16:21:02 +0000206 sign, digits, exp = dec.as_tuple()
207 digits = int(''.join(map(str, digits)))
208 if sign:
209 digits = -digits
210 if exp >= 0:
211 return cls(digits * 10 ** exp)
212 else:
213 return cls(digits, 10 ** -exp)
214
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000215 def limit_denominator(self, max_denominator=1000000):
216 """Closest Fraction to self with denominator at most max_denominator.
Christian Heimesbbffeb62008-01-24 09:42:52 +0000217
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000218 >>> Fraction('3.141592653589793').limit_denominator(10)
219 Fraction(22, 7)
220 >>> Fraction('3.141592653589793').limit_denominator(100)
221 Fraction(311, 99)
Mark Dickinsondfb15622009-11-23 16:27:17 +0000222 >>> Fraction(4321, 8765).limit_denominator(10000)
223 Fraction(4321, 8765)
Christian Heimesbbffeb62008-01-24 09:42:52 +0000224
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000225 """
226 # Algorithm notes: For any real number x, define a *best upper
227 # approximation* to x to be a rational number p/q such that:
228 #
229 # (1) p/q >= x, and
230 # (2) if p/q > r/s >= x then s > q, for any rational r/s.
231 #
232 # Define *best lower approximation* similarly. Then it can be
233 # proved that a rational number is a best upper or lower
234 # approximation to x if, and only if, it is a convergent or
235 # semiconvergent of the (unique shortest) continued fraction
236 # associated to x.
237 #
238 # To find a best rational approximation with denominator <= M,
239 # we find the best upper and lower approximations with
240 # denominator <= M and take whichever of these is closer to x.
241 # In the event of a tie, the bound with smaller denominator is
242 # chosen. If both denominators are equal (which can happen
243 # only when max_denominator == 1 and self is midway between
244 # two integers) the lower bound---i.e., the floor of self, is
245 # taken.
246
247 if max_denominator < 1:
248 raise ValueError("max_denominator should be at least 1")
249 if self._denominator <= max_denominator:
250 return Fraction(self)
251
252 p0, q0, p1, q1 = 0, 1, 1, 0
253 n, d = self._numerator, self._denominator
254 while True:
255 a = n//d
256 q2 = q0+a*q1
257 if q2 > max_denominator:
Christian Heimesbbffeb62008-01-24 09:42:52 +0000258 break
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000259 p0, q0, p1, q1 = p1, q1, p0+a*p1, q2
260 n, d = d, n-a*d
261
262 k = (max_denominator-q0)//q1
263 bound1 = Fraction(p0+k*p1, q0+k*q1)
264 bound2 = Fraction(p1, q1)
265 if abs(bound2 - self) <= abs(bound1-self):
266 return bound2
267 else:
268 return bound1
Christian Heimesbbffeb62008-01-24 09:42:52 +0000269
Christian Heimes400adb02008-02-01 08:12:03 +0000270 @property
271 def numerator(a):
272 return a._numerator
273
274 @property
275 def denominator(a):
276 return a._denominator
277
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000278 def __repr__(self):
279 """repr(self)"""
Benjamin Peterson41181742008-07-02 20:22:54 +0000280 return ('Fraction(%s, %s)' % (self._numerator, self._denominator))
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000281
282 def __str__(self):
283 """str(self)"""
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000284 if self._denominator == 1:
285 return str(self._numerator)
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000286 else:
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000287 return '%s/%s' % (self._numerator, self._denominator)
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000288
289 def _operator_fallbacks(monomorphic_operator, fallback_operator):
290 """Generates forward and reverse operators given a purely-rational
291 operator and a function from the operator module.
292
293 Use this like:
294 __op__, __rop__ = _operator_fallbacks(just_rational_op, operator.op)
295
Christian Heimes7b3ce6a2008-01-31 14:31:45 +0000296 In general, we want to implement the arithmetic operations so
297 that mixed-mode operations either call an implementation whose
298 author knew about the types of both arguments, or convert both
299 to the nearest built in type and do the operation there. In
Christian Heimes3feef612008-02-11 06:19:17 +0000300 Fraction, that means that we define __add__ and __radd__ as:
Christian Heimes7b3ce6a2008-01-31 14:31:45 +0000301
302 def __add__(self, other):
Christian Heimes400adb02008-02-01 08:12:03 +0000303 # Both types have numerators/denominator attributes,
304 # so do the operation directly
Christian Heimes3feef612008-02-11 06:19:17 +0000305 if isinstance(other, (int, Fraction)):
306 return Fraction(self.numerator * other.denominator +
Christian Heimes7b3ce6a2008-01-31 14:31:45 +0000307 other.numerator * self.denominator,
308 self.denominator * other.denominator)
Christian Heimes400adb02008-02-01 08:12:03 +0000309 # float and complex don't have those operations, but we
310 # know about those types, so special case them.
Christian Heimes7b3ce6a2008-01-31 14:31:45 +0000311 elif isinstance(other, float):
312 return float(self) + other
313 elif isinstance(other, complex):
314 return complex(self) + other
Christian Heimes400adb02008-02-01 08:12:03 +0000315 # Let the other type take over.
316 return NotImplemented
Christian Heimes7b3ce6a2008-01-31 14:31:45 +0000317
318 def __radd__(self, other):
319 # radd handles more types than add because there's
320 # nothing left to fall back to.
Christian Heimes3feef612008-02-11 06:19:17 +0000321 if isinstance(other, numbers.Rational):
322 return Fraction(self.numerator * other.denominator +
Christian Heimes7b3ce6a2008-01-31 14:31:45 +0000323 other.numerator * self.denominator,
324 self.denominator * other.denominator)
325 elif isinstance(other, Real):
326 return float(other) + float(self)
327 elif isinstance(other, Complex):
328 return complex(other) + complex(self)
Christian Heimes400adb02008-02-01 08:12:03 +0000329 return NotImplemented
Christian Heimes7b3ce6a2008-01-31 14:31:45 +0000330
331
332 There are 5 different cases for a mixed-type addition on
Christian Heimes3feef612008-02-11 06:19:17 +0000333 Fraction. I'll refer to all of the above code that doesn't
334 refer to Fraction, float, or complex as "boilerplate". 'r'
335 will be an instance of Fraction, which is a subtype of
336 Rational (r : Fraction <: Rational), and b : B <:
Christian Heimes7b3ce6a2008-01-31 14:31:45 +0000337 Complex. The first three involve 'r + b':
338
Christian Heimes3feef612008-02-11 06:19:17 +0000339 1. If B <: Fraction, int, float, or complex, we handle
Christian Heimes7b3ce6a2008-01-31 14:31:45 +0000340 that specially, and all is well.
Christian Heimes3feef612008-02-11 06:19:17 +0000341 2. If Fraction falls back to the boilerplate code, and it
Christian Heimes7b3ce6a2008-01-31 14:31:45 +0000342 were to return a value from __add__, we'd miss the
343 possibility that B defines a more intelligent __radd__,
344 so the boilerplate should return NotImplemented from
Christian Heimes3feef612008-02-11 06:19:17 +0000345 __add__. In particular, we don't handle Rational
Christian Heimes7b3ce6a2008-01-31 14:31:45 +0000346 here, even though we could get an exact answer, in case
347 the other type wants to do something special.
Christian Heimes3feef612008-02-11 06:19:17 +0000348 3. If B <: Fraction, Python tries B.__radd__ before
349 Fraction.__add__. This is ok, because it was
350 implemented with knowledge of Fraction, so it can
Christian Heimes7b3ce6a2008-01-31 14:31:45 +0000351 handle those instances before delegating to Real or
352 Complex.
353
354 The next two situations describe 'b + r'. We assume that b
Christian Heimes3feef612008-02-11 06:19:17 +0000355 didn't know about Fraction in its implementation, and that it
Christian Heimes7b3ce6a2008-01-31 14:31:45 +0000356 uses similar boilerplate code:
357
Christian Heimes3feef612008-02-11 06:19:17 +0000358 4. If B <: Rational, then __radd_ converts both to the
Christian Heimes7b3ce6a2008-01-31 14:31:45 +0000359 builtin rational type (hey look, that's us) and
360 proceeds.
361 5. Otherwise, __radd__ tries to find the nearest common
362 base ABC, and fall back to its builtin type. Since this
363 class doesn't subclass a concrete type, there's no
364 implementation to fall back to, so we need to try as
365 hard as possible to return an actual value, or the user
366 will get a TypeError.
367
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000368 """
369 def forward(a, b):
Christian Heimes3feef612008-02-11 06:19:17 +0000370 if isinstance(b, (int, Fraction)):
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000371 return monomorphic_operator(a, b)
372 elif isinstance(b, float):
373 return fallback_operator(float(a), b)
374 elif isinstance(b, complex):
375 return fallback_operator(complex(a), b)
376 else:
377 return NotImplemented
378 forward.__name__ = '__' + fallback_operator.__name__ + '__'
379 forward.__doc__ = monomorphic_operator.__doc__
380
381 def reverse(b, a):
Christian Heimes3feef612008-02-11 06:19:17 +0000382 if isinstance(a, numbers.Rational):
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000383 # Includes ints.
384 return monomorphic_operator(a, b)
385 elif isinstance(a, numbers.Real):
386 return fallback_operator(float(a), float(b))
387 elif isinstance(a, numbers.Complex):
388 return fallback_operator(complex(a), complex(b))
389 else:
390 return NotImplemented
391 reverse.__name__ = '__r' + fallback_operator.__name__ + '__'
392 reverse.__doc__ = monomorphic_operator.__doc__
393
394 return forward, reverse
395
396 def _add(a, b):
397 """a + b"""
Christian Heimes3feef612008-02-11 06:19:17 +0000398 return Fraction(a.numerator * b.denominator +
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000399 b.numerator * a.denominator,
400 a.denominator * b.denominator)
401
402 __add__, __radd__ = _operator_fallbacks(_add, operator.add)
403
404 def _sub(a, b):
405 """a - b"""
Christian Heimes3feef612008-02-11 06:19:17 +0000406 return Fraction(a.numerator * b.denominator -
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000407 b.numerator * a.denominator,
408 a.denominator * b.denominator)
409
410 __sub__, __rsub__ = _operator_fallbacks(_sub, operator.sub)
411
412 def _mul(a, b):
413 """a * b"""
Christian Heimes3feef612008-02-11 06:19:17 +0000414 return Fraction(a.numerator * b.numerator, a.denominator * b.denominator)
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000415
416 __mul__, __rmul__ = _operator_fallbacks(_mul, operator.mul)
417
418 def _div(a, b):
419 """a / b"""
Christian Heimes3feef612008-02-11 06:19:17 +0000420 return Fraction(a.numerator * b.denominator,
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000421 a.denominator * b.numerator)
422
423 __truediv__, __rtruediv__ = _operator_fallbacks(_div, operator.truediv)
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000424
425 def __floordiv__(a, b):
426 """a // b"""
Jeffrey Yasskin9893de12008-01-17 07:36:30 +0000427 return math.floor(a / b)
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000428
429 def __rfloordiv__(b, a):
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
Christian Heimes969fe572008-01-25 11:23:10 +0000433 def __mod__(a, b):
434 """a % b"""
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000435 div = a // b
436 return a - b * div
437
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000438 def __rmod__(b, a):
439 """a % b"""
Christian Heimes969fe572008-01-25 11:23:10 +0000440 div = a // b
441 return a - b * div
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000442
443 def __pow__(a, b):
444 """a ** b
445
446 If b is not an integer, the result will be a float or complex
447 since roots are generally irrational. If b is an integer, the
448 result will be rational.
449
450 """
Christian Heimes3feef612008-02-11 06:19:17 +0000451 if isinstance(b, numbers.Rational):
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000452 if b.denominator == 1:
453 power = b.numerator
454 if power >= 0:
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000455 return Fraction(a._numerator ** power,
456 a._denominator ** power)
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000457 else:
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000458 return Fraction(a._denominator ** -power,
459 a._numerator ** -power)
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000460 else:
461 # A fractional power will generally produce an
462 # irrational number.
463 return float(a) ** float(b)
464 else:
465 return float(a) ** b
466
467 def __rpow__(b, a):
468 """a ** b"""
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000469 if b._denominator == 1 and b._numerator >= 0:
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000470 # If a is an int, keep it that way if possible.
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000471 return a ** b._numerator
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000472
Christian Heimes3feef612008-02-11 06:19:17 +0000473 if isinstance(a, numbers.Rational):
474 return Fraction(a.numerator, a.denominator) ** b
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000475
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000476 if b._denominator == 1:
477 return a ** b._numerator
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000478
479 return a ** float(b)
480
481 def __pos__(a):
Christian Heimes3feef612008-02-11 06:19:17 +0000482 """+a: Coerces a subclass instance to Fraction"""
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000483 return Fraction(a._numerator, a._denominator)
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000484
485 def __neg__(a):
486 """-a"""
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000487 return Fraction(-a._numerator, a._denominator)
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000488
489 def __abs__(a):
490 """abs(a)"""
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000491 return Fraction(abs(a._numerator), a._denominator)
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000492
493 def __trunc__(a):
494 """trunc(a)"""
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000495 if a._numerator < 0:
496 return -(-a._numerator // a._denominator)
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000497 else:
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000498 return a._numerator // a._denominator
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000499
500 def __floor__(a):
501 """Will be math.floor(a) in 3.0."""
502 return a.numerator // a.denominator
503
504 def __ceil__(a):
505 """Will be math.ceil(a) in 3.0."""
506 # The negations cleverly convince floordiv to return the ceiling.
507 return -(-a.numerator // a.denominator)
508
509 def __round__(self, ndigits=None):
510 """Will be round(self, ndigits) in 3.0.
511
512 Rounds half toward even.
513 """
514 if ndigits is None:
515 floor, remainder = divmod(self.numerator, self.denominator)
516 if remainder * 2 < self.denominator:
517 return floor
518 elif remainder * 2 > self.denominator:
519 return floor + 1
520 # Deal with the half case:
521 elif floor % 2 == 0:
522 return floor
523 else:
524 return floor + 1
525 shift = 10**abs(ndigits)
526 # See _operator_fallbacks.forward to check that the results of
Christian Heimes3feef612008-02-11 06:19:17 +0000527 # these operations will always be Fraction and therefore have
Jeffrey Yasskin9893de12008-01-17 07:36:30 +0000528 # round().
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000529 if ndigits > 0:
Christian Heimes3feef612008-02-11 06:19:17 +0000530 return Fraction(round(self * shift), shift)
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000531 else:
Christian Heimes3feef612008-02-11 06:19:17 +0000532 return Fraction(round(self / shift) * shift)
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000533
534 def __hash__(self):
Mark Dickinsonfec66202010-11-13 10:27:38 +0000535 """hash(self)"""
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000536
Christian Heimes969fe572008-01-25 11:23:10 +0000537 # XXX since this method is expensive, consider caching the result
Mark Dickinsondc787d22010-05-23 13:33:13 +0000538
539 # In order to make sure that the hash of a Fraction agrees
540 # with the hash of a numerically equal integer, float or
541 # Decimal instance, we follow the rules for numeric hashes
542 # outlined in the documentation. (See library docs, 'Built-in
543 # Types').
544
545 # dinv is the inverse of self._denominator modulo the prime
546 # _PyHASH_MODULUS, or 0 if self._denominator is divisible by
547 # _PyHASH_MODULUS.
548 dinv = pow(self._denominator, _PyHASH_MODULUS - 2, _PyHASH_MODULUS)
549 if not dinv:
550 hash_ = _PyHASH_INF
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000551 else:
Mark Dickinsondc787d22010-05-23 13:33:13 +0000552 hash_ = abs(self._numerator) * dinv % _PyHASH_MODULUS
Mark Dickinsonfec66202010-11-13 10:27:38 +0000553 result = hash_ if self >= 0 else -hash_
554 return -2 if result == -1 else result
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000555
556 def __eq__(a, b):
557 """a == b"""
Christian Heimes3feef612008-02-11 06:19:17 +0000558 if isinstance(b, numbers.Rational):
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000559 return (a._numerator == b.numerator and
560 a._denominator == b.denominator)
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000561 if isinstance(b, numbers.Complex) and b.imag == 0:
562 b = b.real
563 if isinstance(b, float):
Mark Dickinson85424c92009-07-18 14:41:42 +0000564 if math.isnan(b) or math.isinf(b):
565 # comparisons with an infinity or nan should behave in
566 # the same way for any finite a, so treat a as zero.
567 return 0.0 == b
568 else:
569 return a == a.from_float(b)
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000570 else:
Mark Dickinson85424c92009-07-18 14:41:42 +0000571 # Since a doesn't know how to compare with b, let's give b
572 # a chance to compare itself with a.
573 return NotImplemented
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000574
Mark Dickinson85424c92009-07-18 14:41:42 +0000575 def _richcmp(self, other, op):
576 """Helper for comparison operators, for internal use only.
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000577
Mark Dickinson85424c92009-07-18 14:41:42 +0000578 Implement comparison between a Rational instance `self`, and
579 either another Rational instance or a float `other`. If
580 `other` is not a Rational instance or a float, return
581 NotImplemented. `op` should be one of the six standard
582 comparison operators.
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000583
584 """
Mark Dickinson85424c92009-07-18 14:41:42 +0000585 # convert other to a Rational instance where reasonable.
586 if isinstance(other, numbers.Rational):
587 return op(self._numerator * other.denominator,
588 self._denominator * other.numerator)
Mark Dickinson85424c92009-07-18 14:41:42 +0000589 if isinstance(other, float):
590 if math.isnan(other) or math.isinf(other):
591 return op(0.0, other)
592 else:
593 return op(self, self.from_float(other))
594 else:
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000595 return NotImplemented
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000596
597 def __lt__(a, b):
598 """a < b"""
Mark Dickinson85424c92009-07-18 14:41:42 +0000599 return a._richcmp(b, operator.lt)
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000600
601 def __gt__(a, b):
602 """a > b"""
Mark Dickinson85424c92009-07-18 14:41:42 +0000603 return a._richcmp(b, operator.gt)
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000604
605 def __le__(a, b):
606 """a <= b"""
Mark Dickinson85424c92009-07-18 14:41:42 +0000607 return a._richcmp(b, operator.le)
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000608
609 def __ge__(a, b):
610 """a >= b"""
Mark Dickinson85424c92009-07-18 14:41:42 +0000611 return a._richcmp(b, operator.ge)
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000612
613 def __bool__(a):
614 """a != 0"""
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000615 return a._numerator != 0
Christian Heimes969fe572008-01-25 11:23:10 +0000616
617 # support for pickling, copy, and deepcopy
618
619 def __reduce__(self):
620 return (self.__class__, (str(self),))
621
622 def __copy__(self):
Christian Heimes3feef612008-02-11 06:19:17 +0000623 if type(self) == Fraction:
Christian Heimes969fe572008-01-25 11:23:10 +0000624 return self # I'm immutable; therefore I am my own clone
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000625 return self.__class__(self._numerator, self._denominator)
Christian Heimes969fe572008-01-25 11:23:10 +0000626
627 def __deepcopy__(self, memo):
Christian Heimes3feef612008-02-11 06:19:17 +0000628 if type(self) == Fraction:
Christian Heimes969fe572008-01-25 11:23:10 +0000629 return self # My components are also immutable
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000630 return self.__class__(self._numerator, self._denominator)