blob: 9aabab3e3ba983f867d208e27e69d7ed22a8b13a [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 """
Serhiy Storchaka48e47aa2015-05-13 00:19:51 +030023 import warnings
24 warnings.warn('fractions.gcd() is deprecated. Use math.gcd() instead.',
25 DeprecationWarning, 2)
26 if type(a) is int is type(b):
27 if (b or a) < 0:
28 return -math.gcd(a, b)
29 return math.gcd(a, b)
30 return _gcd(a, b)
31
32def _gcd(a, b):
33 # Supports non-integers for backward compatibility.
Guido van Rossum7736b5b2008-01-15 21:44:53 +000034 while b:
35 a, b = b, a%b
36 return a
37
Mark Dickinsondc787d22010-05-23 13:33:13 +000038# Constants related to the hash implementation; hash(x) is based
39# on the reduction of x modulo the prime _PyHASH_MODULUS.
40_PyHASH_MODULUS = sys.hash_info.modulus
41# Value to be used for rationals that reduce to infinity modulo
42# _PyHASH_MODULUS.
43_PyHASH_INF = sys.hash_info.inf
Guido van Rossum7736b5b2008-01-15 21:44:53 +000044
Christian Heimes292d3512008-02-03 16:51:08 +000045_RATIONAL_FORMAT = re.compile(r"""
46 \A\s* # optional whitespace at the start, then
47 (?P<sign>[-+]?) # an optional sign, then
48 (?=\d|\.\d) # lookahead for digit or .digit
49 (?P<num>\d*) # numerator (possibly empty)
Mark Dickinsoncf63f2f2009-04-22 17:50:21 +000050 (?: # followed by
51 (?:/(?P<denom>\d+))? # an optional denominator
Christian Heimes292d3512008-02-03 16:51:08 +000052 | # or
Mark Dickinsoncf63f2f2009-04-22 17:50:21 +000053 (?:\.(?P<decimal>\d*))? # an optional fractional part
54 (?:E(?P<exp>[-+]?\d+))? # and optional exponent
55 )
Christian Heimes292d3512008-02-03 16:51:08 +000056 \s*\Z # and optional whitespace to finish
Mark Dickinsoncf63f2f2009-04-22 17:50:21 +000057""", re.VERBOSE | re.IGNORECASE)
Christian Heimes587c2bf2008-01-19 16:21:02 +000058
59
Christian Heimes3feef612008-02-11 06:19:17 +000060class Fraction(numbers.Rational):
Guido van Rossum7736b5b2008-01-15 21:44:53 +000061 """This class implements rational numbers.
62
Mark Dickinson98127c32010-04-03 11:18:52 +000063 In the two-argument form of the constructor, Fraction(8, 6) will
64 produce a rational number equivalent to 4/3. Both arguments must
65 be Rational. The numerator defaults to 0 and the denominator
66 defaults to 1 so that Fraction(3) == 3 and Fraction() == 0.
Guido van Rossum7736b5b2008-01-15 21:44:53 +000067
Mark Dickinson98127c32010-04-03 11:18:52 +000068 Fractions can also be constructed from:
69
70 - numeric strings similar to those accepted by the
71 float constructor (for example, '-2.3' or '1e10')
72
73 - strings of the form '123/456'
74
75 - float and Decimal instances
76
77 - other Rational instances (including integers)
Christian Heimes587c2bf2008-01-19 16:21:02 +000078
Guido van Rossum7736b5b2008-01-15 21:44:53 +000079 """
80
Christian Heimes400adb02008-02-01 08:12:03 +000081 __slots__ = ('_numerator', '_denominator')
Guido van Rossum7736b5b2008-01-15 21:44:53 +000082
Christian Heimes587c2bf2008-01-19 16:21:02 +000083 # We're immutable, so use __new__ not __init__
Mark Dickinson3c286e22014-04-05 09:29:00 +010084 def __new__(cls, numerator=0, denominator=None, _normalize=True):
Christian Heimes587c2bf2008-01-19 16:21:02 +000085 """Constructs a Rational.
86
Mark Dickinson98127c32010-04-03 11:18:52 +000087 Takes a string like '3/2' or '1.5', another Rational instance, a
88 numerator/denominator pair, or a float.
89
90 Examples
91 --------
92
93 >>> Fraction(10, -8)
94 Fraction(-5, 4)
95 >>> Fraction(Fraction(1, 7), 5)
96 Fraction(1, 35)
97 >>> Fraction(Fraction(1, 7), Fraction(2, 3))
98 Fraction(3, 14)
99 >>> Fraction('314')
100 Fraction(314, 1)
101 >>> Fraction('-35/4')
102 Fraction(-35, 4)
103 >>> Fraction('3.1415') # conversion from numeric string
104 Fraction(6283, 2000)
105 >>> Fraction('-47e-2') # string may include a decimal exponent
106 Fraction(-47, 100)
107 >>> Fraction(1.47) # direct construction from float (exact conversion)
108 Fraction(6620291452234629, 4503599627370496)
109 >>> Fraction(2.25)
110 Fraction(9, 4)
111 >>> Fraction(Decimal('1.47'))
112 Fraction(147, 100)
Christian Heimes587c2bf2008-01-19 16:21:02 +0000113
114 """
Christian Heimes3feef612008-02-11 06:19:17 +0000115 self = super(Fraction, cls).__new__(cls)
Christian Heimes587c2bf2008-01-19 16:21:02 +0000116
Mark Dickinsond4d95f82009-04-24 14:06:19 +0000117 if denominator is None:
Georg Brandl40f97352014-09-24 08:37:55 +0200118 if type(numerator) is int:
119 self._numerator = numerator
120 self._denominator = 1
121 return self
122
123 elif isinstance(numerator, numbers.Rational):
Mark Dickinsond4d95f82009-04-24 14:06:19 +0000124 self._numerator = numerator.numerator
125 self._denominator = numerator.denominator
126 return self
127
Mark Dickinson98127c32010-04-03 11:18:52 +0000128 elif isinstance(numerator, float):
129 # Exact conversion from float
130 value = Fraction.from_float(numerator)
131 self._numerator = value._numerator
132 self._denominator = value._denominator
133 return self
134
135 elif isinstance(numerator, Decimal):
136 value = Fraction.from_decimal(numerator)
137 self._numerator = value._numerator
138 self._denominator = value._denominator
139 return self
140
Mark Dickinsond4d95f82009-04-24 14:06:19 +0000141 elif isinstance(numerator, str):
Christian Heimes587c2bf2008-01-19 16:21:02 +0000142 # Handle construction from strings.
Mark Dickinsoncf63f2f2009-04-22 17:50:21 +0000143 m = _RATIONAL_FORMAT.match(numerator)
Christian Heimes587c2bf2008-01-19 16:21:02 +0000144 if m is None:
Mark Dickinsoncf63f2f2009-04-22 17:50:21 +0000145 raise ValueError('Invalid literal for Fraction: %r' %
146 numerator)
147 numerator = int(m.group('num') or '0')
148 denom = m.group('denom')
149 if denom:
150 denominator = int(denom)
Christian Heimesaf98da12008-01-27 15:18:18 +0000151 else:
Mark Dickinsoncf63f2f2009-04-22 17:50:21 +0000152 denominator = 1
153 decimal = m.group('decimal')
154 if decimal:
155 scale = 10**len(decimal)
156 numerator = numerator * scale + int(decimal)
157 denominator *= scale
158 exp = m.group('exp')
159 if exp:
160 exp = int(exp)
161 if exp >= 0:
162 numerator *= 10**exp
163 else:
164 denominator *= 10**-exp
Christian Heimes587c2bf2008-01-19 16:21:02 +0000165 if m.group('sign') == '-':
166 numerator = -numerator
167
Mark Dickinsond4d95f82009-04-24 14:06:19 +0000168 else:
169 raise TypeError("argument should be a string "
170 "or a Rational instance")
171
Georg Brandl40f97352014-09-24 08:37:55 +0200172 elif type(numerator) is int is type(denominator):
Serhiy Storchaka48e47aa2015-05-13 00:19:51 +0300173 pass # *very* normal case
Georg Brandl40f97352014-09-24 08:37:55 +0200174
Mark Dickinsond4d95f82009-04-24 14:06:19 +0000175 elif (isinstance(numerator, numbers.Rational) and
176 isinstance(denominator, numbers.Rational)):
177 numerator, denominator = (
178 numerator.numerator * denominator.denominator,
179 denominator.numerator * numerator.denominator
180 )
181 else:
182 raise TypeError("both arguments should be "
183 "Rational instances")
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000184
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000185 if denominator == 0:
Christian Heimes3feef612008-02-11 06:19:17 +0000186 raise ZeroDivisionError('Fraction(%s, 0)' % numerator)
Mark Dickinson3c286e22014-04-05 09:29:00 +0100187 if _normalize:
Serhiy Storchaka48e47aa2015-05-13 00:19:51 +0300188 if type(numerator) is int is type(denominator):
189 # *very* normal case
190 g = math.gcd(numerator, denominator)
191 if denominator < 0:
192 g = -g
193 else:
194 g = _gcd(numerator, denominator)
Mark Dickinson3c286e22014-04-05 09:29:00 +0100195 numerator //= g
196 denominator //= g
197 self._numerator = numerator
198 self._denominator = denominator
Christian Heimes587c2bf2008-01-19 16:21:02 +0000199 return self
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000200
201 @classmethod
202 def from_float(cls, f):
Christian Heimes587c2bf2008-01-19 16:21:02 +0000203 """Converts a finite float to a rational number, exactly.
204
Christian Heimes3feef612008-02-11 06:19:17 +0000205 Beware that Fraction.from_float(0.3) != Fraction(3, 10).
Christian Heimes587c2bf2008-01-19 16:21:02 +0000206
207 """
Georg Brandl2ee470f2008-07-16 12:55:28 +0000208 if isinstance(f, numbers.Integral):
Georg Brandl3a9b0622009-01-03 22:07:57 +0000209 return cls(f)
Georg Brandl2ee470f2008-07-16 12:55:28 +0000210 elif not isinstance(f, float):
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000211 raise TypeError("%s.from_float() only takes floats, not %r (%s)" %
212 (cls.__name__, f, type(f).__name__))
Mark Dickinson73726aa2012-11-15 20:58:40 +0000213 if math.isnan(f):
214 raise ValueError("Cannot convert %r to %s." % (f, cls.__name__))
215 if math.isinf(f):
216 raise OverflowError("Cannot convert %r to %s." % (f, cls.__name__))
Christian Heimes26855632008-01-27 23:50:43 +0000217 return cls(*f.as_integer_ratio())
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000218
Christian Heimes587c2bf2008-01-19 16:21:02 +0000219 @classmethod
220 def from_decimal(cls, dec):
221 """Converts a finite Decimal instance to a rational number, exactly."""
222 from decimal import Decimal
Georg Brandl2ee470f2008-07-16 12:55:28 +0000223 if isinstance(dec, numbers.Integral):
224 dec = Decimal(int(dec))
225 elif not isinstance(dec, Decimal):
Christian Heimes587c2bf2008-01-19 16:21:02 +0000226 raise TypeError(
227 "%s.from_decimal() only takes Decimals, not %r (%s)" %
228 (cls.__name__, dec, type(dec).__name__))
Mark Dickinson73726aa2012-11-15 20:58:40 +0000229 if dec.is_infinite():
230 raise OverflowError(
231 "Cannot convert %s to %s." % (dec, cls.__name__))
232 if dec.is_nan():
233 raise ValueError("Cannot convert %s to %s." % (dec, cls.__name__))
Christian Heimes587c2bf2008-01-19 16:21:02 +0000234 sign, digits, exp = dec.as_tuple()
235 digits = int(''.join(map(str, digits)))
236 if sign:
237 digits = -digits
238 if exp >= 0:
239 return cls(digits * 10 ** exp)
240 else:
241 return cls(digits, 10 ** -exp)
242
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000243 def limit_denominator(self, max_denominator=1000000):
244 """Closest Fraction to self with denominator at most max_denominator.
Christian Heimesbbffeb62008-01-24 09:42:52 +0000245
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000246 >>> Fraction('3.141592653589793').limit_denominator(10)
247 Fraction(22, 7)
248 >>> Fraction('3.141592653589793').limit_denominator(100)
249 Fraction(311, 99)
Mark Dickinsondfb15622009-11-23 16:27:17 +0000250 >>> Fraction(4321, 8765).limit_denominator(10000)
251 Fraction(4321, 8765)
Christian Heimesbbffeb62008-01-24 09:42:52 +0000252
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000253 """
254 # Algorithm notes: For any real number x, define a *best upper
255 # approximation* to x to be a rational number p/q such that:
256 #
257 # (1) p/q >= x, and
258 # (2) if p/q > r/s >= x then s > q, for any rational r/s.
259 #
260 # Define *best lower approximation* similarly. Then it can be
261 # proved that a rational number is a best upper or lower
262 # approximation to x if, and only if, it is a convergent or
263 # semiconvergent of the (unique shortest) continued fraction
264 # associated to x.
265 #
266 # To find a best rational approximation with denominator <= M,
267 # we find the best upper and lower approximations with
268 # denominator <= M and take whichever of these is closer to x.
269 # In the event of a tie, the bound with smaller denominator is
270 # chosen. If both denominators are equal (which can happen
271 # only when max_denominator == 1 and self is midway between
272 # two integers) the lower bound---i.e., the floor of self, is
273 # taken.
274
275 if max_denominator < 1:
276 raise ValueError("max_denominator should be at least 1")
277 if self._denominator <= max_denominator:
278 return Fraction(self)
279
280 p0, q0, p1, q1 = 0, 1, 1, 0
281 n, d = self._numerator, self._denominator
282 while True:
283 a = n//d
284 q2 = q0+a*q1
285 if q2 > max_denominator:
Christian Heimesbbffeb62008-01-24 09:42:52 +0000286 break
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000287 p0, q0, p1, q1 = p1, q1, p0+a*p1, q2
288 n, d = d, n-a*d
289
290 k = (max_denominator-q0)//q1
291 bound1 = Fraction(p0+k*p1, q0+k*q1)
292 bound2 = Fraction(p1, q1)
293 if abs(bound2 - self) <= abs(bound1-self):
294 return bound2
295 else:
296 return bound1
Christian Heimesbbffeb62008-01-24 09:42:52 +0000297
Christian Heimes400adb02008-02-01 08:12:03 +0000298 @property
299 def numerator(a):
300 return a._numerator
301
302 @property
303 def denominator(a):
304 return a._denominator
305
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000306 def __repr__(self):
307 """repr(self)"""
Serhiy Storchaka465e60e2014-07-25 23:36:00 +0300308 return '%s(%s, %s)' % (self.__class__.__name__,
309 self._numerator, self._denominator)
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000310
311 def __str__(self):
312 """str(self)"""
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000313 if self._denominator == 1:
314 return str(self._numerator)
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000315 else:
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000316 return '%s/%s' % (self._numerator, self._denominator)
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000317
318 def _operator_fallbacks(monomorphic_operator, fallback_operator):
319 """Generates forward and reverse operators given a purely-rational
320 operator and a function from the operator module.
321
322 Use this like:
323 __op__, __rop__ = _operator_fallbacks(just_rational_op, operator.op)
324
Christian Heimes7b3ce6a2008-01-31 14:31:45 +0000325 In general, we want to implement the arithmetic operations so
326 that mixed-mode operations either call an implementation whose
327 author knew about the types of both arguments, or convert both
328 to the nearest built in type and do the operation there. In
Christian Heimes3feef612008-02-11 06:19:17 +0000329 Fraction, that means that we define __add__ and __radd__ as:
Christian Heimes7b3ce6a2008-01-31 14:31:45 +0000330
331 def __add__(self, other):
Christian Heimes400adb02008-02-01 08:12:03 +0000332 # Both types have numerators/denominator attributes,
333 # so do the operation directly
Christian Heimes3feef612008-02-11 06:19:17 +0000334 if isinstance(other, (int, Fraction)):
335 return Fraction(self.numerator * other.denominator +
Christian Heimes7b3ce6a2008-01-31 14:31:45 +0000336 other.numerator * self.denominator,
337 self.denominator * other.denominator)
Christian Heimes400adb02008-02-01 08:12:03 +0000338 # float and complex don't have those operations, but we
339 # know about those types, so special case them.
Christian Heimes7b3ce6a2008-01-31 14:31:45 +0000340 elif isinstance(other, float):
341 return float(self) + other
342 elif isinstance(other, complex):
343 return complex(self) + other
Christian Heimes400adb02008-02-01 08:12:03 +0000344 # Let the other type take over.
345 return NotImplemented
Christian Heimes7b3ce6a2008-01-31 14:31:45 +0000346
347 def __radd__(self, other):
348 # radd handles more types than add because there's
349 # nothing left to fall back to.
Christian Heimes3feef612008-02-11 06:19:17 +0000350 if isinstance(other, numbers.Rational):
351 return Fraction(self.numerator * other.denominator +
Christian Heimes7b3ce6a2008-01-31 14:31:45 +0000352 other.numerator * self.denominator,
353 self.denominator * other.denominator)
354 elif isinstance(other, Real):
355 return float(other) + float(self)
356 elif isinstance(other, Complex):
357 return complex(other) + complex(self)
Christian Heimes400adb02008-02-01 08:12:03 +0000358 return NotImplemented
Christian Heimes7b3ce6a2008-01-31 14:31:45 +0000359
360
361 There are 5 different cases for a mixed-type addition on
Christian Heimes3feef612008-02-11 06:19:17 +0000362 Fraction. I'll refer to all of the above code that doesn't
363 refer to Fraction, float, or complex as "boilerplate". 'r'
364 will be an instance of Fraction, which is a subtype of
365 Rational (r : Fraction <: Rational), and b : B <:
Christian Heimes7b3ce6a2008-01-31 14:31:45 +0000366 Complex. The first three involve 'r + b':
367
Christian Heimes3feef612008-02-11 06:19:17 +0000368 1. If B <: Fraction, int, float, or complex, we handle
Christian Heimes7b3ce6a2008-01-31 14:31:45 +0000369 that specially, and all is well.
Christian Heimes3feef612008-02-11 06:19:17 +0000370 2. If Fraction falls back to the boilerplate code, and it
Christian Heimes7b3ce6a2008-01-31 14:31:45 +0000371 were to return a value from __add__, we'd miss the
372 possibility that B defines a more intelligent __radd__,
373 so the boilerplate should return NotImplemented from
Christian Heimes3feef612008-02-11 06:19:17 +0000374 __add__. In particular, we don't handle Rational
Christian Heimes7b3ce6a2008-01-31 14:31:45 +0000375 here, even though we could get an exact answer, in case
376 the other type wants to do something special.
Christian Heimes3feef612008-02-11 06:19:17 +0000377 3. If B <: Fraction, Python tries B.__radd__ before
378 Fraction.__add__. This is ok, because it was
379 implemented with knowledge of Fraction, so it can
Christian Heimes7b3ce6a2008-01-31 14:31:45 +0000380 handle those instances before delegating to Real or
381 Complex.
382
383 The next two situations describe 'b + r'. We assume that b
Christian Heimes3feef612008-02-11 06:19:17 +0000384 didn't know about Fraction in its implementation, and that it
Christian Heimes7b3ce6a2008-01-31 14:31:45 +0000385 uses similar boilerplate code:
386
Christian Heimes3feef612008-02-11 06:19:17 +0000387 4. If B <: Rational, then __radd_ converts both to the
Christian Heimes7b3ce6a2008-01-31 14:31:45 +0000388 builtin rational type (hey look, that's us) and
389 proceeds.
390 5. Otherwise, __radd__ tries to find the nearest common
391 base ABC, and fall back to its builtin type. Since this
392 class doesn't subclass a concrete type, there's no
393 implementation to fall back to, so we need to try as
394 hard as possible to return an actual value, or the user
395 will get a TypeError.
396
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000397 """
398 def forward(a, b):
Christian Heimes3feef612008-02-11 06:19:17 +0000399 if isinstance(b, (int, Fraction)):
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000400 return monomorphic_operator(a, b)
401 elif isinstance(b, float):
402 return fallback_operator(float(a), b)
403 elif isinstance(b, complex):
404 return fallback_operator(complex(a), b)
405 else:
406 return NotImplemented
407 forward.__name__ = '__' + fallback_operator.__name__ + '__'
408 forward.__doc__ = monomorphic_operator.__doc__
409
410 def reverse(b, a):
Christian Heimes3feef612008-02-11 06:19:17 +0000411 if isinstance(a, numbers.Rational):
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000412 # Includes ints.
413 return monomorphic_operator(a, b)
414 elif isinstance(a, numbers.Real):
415 return fallback_operator(float(a), float(b))
416 elif isinstance(a, numbers.Complex):
417 return fallback_operator(complex(a), complex(b))
418 else:
419 return NotImplemented
420 reverse.__name__ = '__r' + fallback_operator.__name__ + '__'
421 reverse.__doc__ = monomorphic_operator.__doc__
422
423 return forward, reverse
424
425 def _add(a, b):
426 """a + b"""
Georg Brandl40f97352014-09-24 08:37:55 +0200427 da, db = a.denominator, b.denominator
428 return Fraction(a.numerator * db + b.numerator * da,
429 da * db)
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000430
431 __add__, __radd__ = _operator_fallbacks(_add, operator.add)
432
433 def _sub(a, b):
434 """a - b"""
Georg Brandl40f97352014-09-24 08:37:55 +0200435 da, db = a.denominator, b.denominator
436 return Fraction(a.numerator * db - b.numerator * da,
437 da * db)
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000438
439 __sub__, __rsub__ = _operator_fallbacks(_sub, operator.sub)
440
441 def _mul(a, b):
442 """a * b"""
Christian Heimes3feef612008-02-11 06:19:17 +0000443 return Fraction(a.numerator * b.numerator, a.denominator * b.denominator)
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000444
445 __mul__, __rmul__ = _operator_fallbacks(_mul, operator.mul)
446
447 def _div(a, b):
448 """a / b"""
Christian Heimes3feef612008-02-11 06:19:17 +0000449 return Fraction(a.numerator * b.denominator,
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000450 a.denominator * b.numerator)
451
452 __truediv__, __rtruediv__ = _operator_fallbacks(_div, operator.truediv)
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000453
454 def __floordiv__(a, b):
455 """a // b"""
Jeffrey Yasskin9893de12008-01-17 07:36:30 +0000456 return math.floor(a / b)
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000457
458 def __rfloordiv__(b, a):
459 """a // b"""
Jeffrey Yasskin9893de12008-01-17 07:36:30 +0000460 return math.floor(a / b)
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000461
Christian Heimes969fe572008-01-25 11:23:10 +0000462 def __mod__(a, b):
463 """a % b"""
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000464 div = a // b
465 return a - b * div
466
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000467 def __rmod__(b, a):
468 """a % b"""
Christian Heimes969fe572008-01-25 11:23:10 +0000469 div = a // b
470 return a - b * div
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000471
472 def __pow__(a, b):
473 """a ** b
474
475 If b is not an integer, the result will be a float or complex
476 since roots are generally irrational. If b is an integer, the
477 result will be rational.
478
479 """
Christian Heimes3feef612008-02-11 06:19:17 +0000480 if isinstance(b, numbers.Rational):
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000481 if b.denominator == 1:
482 power = b.numerator
483 if power >= 0:
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000484 return Fraction(a._numerator ** power,
Mark Dickinson3c286e22014-04-05 09:29:00 +0100485 a._denominator ** power,
486 _normalize=False)
Mark Dickinson84479652016-08-22 10:50:53 +0100487 elif a._numerator >= 0:
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000488 return Fraction(a._denominator ** -power,
Mark Dickinson3c286e22014-04-05 09:29:00 +0100489 a._numerator ** -power,
490 _normalize=False)
Mark Dickinson84479652016-08-22 10:50:53 +0100491 else:
492 return Fraction((-a._denominator) ** -power,
493 (-a._numerator) ** -power,
494 _normalize=False)
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000495 else:
496 # A fractional power will generally produce an
497 # irrational number.
498 return float(a) ** float(b)
499 else:
500 return float(a) ** b
501
502 def __rpow__(b, a):
503 """a ** b"""
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000504 if b._denominator == 1 and b._numerator >= 0:
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000505 # If a is an int, keep it that way if possible.
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000506 return a ** b._numerator
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000507
Christian Heimes3feef612008-02-11 06:19:17 +0000508 if isinstance(a, numbers.Rational):
509 return Fraction(a.numerator, a.denominator) ** b
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000510
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000511 if b._denominator == 1:
512 return a ** b._numerator
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000513
514 return a ** float(b)
515
516 def __pos__(a):
Christian Heimes3feef612008-02-11 06:19:17 +0000517 """+a: Coerces a subclass instance to Fraction"""
Mark Dickinson3c286e22014-04-05 09:29:00 +0100518 return Fraction(a._numerator, a._denominator, _normalize=False)
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000519
520 def __neg__(a):
521 """-a"""
Mark Dickinson3c286e22014-04-05 09:29:00 +0100522 return Fraction(-a._numerator, a._denominator, _normalize=False)
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000523
524 def __abs__(a):
525 """abs(a)"""
Mark Dickinson3c286e22014-04-05 09:29:00 +0100526 return Fraction(abs(a._numerator), a._denominator, _normalize=False)
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000527
528 def __trunc__(a):
529 """trunc(a)"""
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000530 if a._numerator < 0:
531 return -(-a._numerator // a._denominator)
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000532 else:
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000533 return a._numerator // a._denominator
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000534
535 def __floor__(a):
536 """Will be math.floor(a) in 3.0."""
537 return a.numerator // a.denominator
538
539 def __ceil__(a):
540 """Will be math.ceil(a) in 3.0."""
541 # The negations cleverly convince floordiv to return the ceiling.
542 return -(-a.numerator // a.denominator)
543
544 def __round__(self, ndigits=None):
545 """Will be round(self, ndigits) in 3.0.
546
547 Rounds half toward even.
548 """
549 if ndigits is None:
550 floor, remainder = divmod(self.numerator, self.denominator)
551 if remainder * 2 < self.denominator:
552 return floor
553 elif remainder * 2 > self.denominator:
554 return floor + 1
555 # Deal with the half case:
556 elif floor % 2 == 0:
557 return floor
558 else:
559 return floor + 1
560 shift = 10**abs(ndigits)
561 # See _operator_fallbacks.forward to check that the results of
Christian Heimes3feef612008-02-11 06:19:17 +0000562 # these operations will always be Fraction and therefore have
Jeffrey Yasskin9893de12008-01-17 07:36:30 +0000563 # round().
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000564 if ndigits > 0:
Christian Heimes3feef612008-02-11 06:19:17 +0000565 return Fraction(round(self * shift), shift)
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000566 else:
Christian Heimes3feef612008-02-11 06:19:17 +0000567 return Fraction(round(self / shift) * shift)
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000568
569 def __hash__(self):
Mark Dickinsonfec66202010-11-13 10:27:38 +0000570 """hash(self)"""
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000571
Christian Heimes969fe572008-01-25 11:23:10 +0000572 # XXX since this method is expensive, consider caching the result
Mark Dickinsondc787d22010-05-23 13:33:13 +0000573
574 # In order to make sure that the hash of a Fraction agrees
575 # with the hash of a numerically equal integer, float or
576 # Decimal instance, we follow the rules for numeric hashes
577 # outlined in the documentation. (See library docs, 'Built-in
578 # Types').
579
580 # dinv is the inverse of self._denominator modulo the prime
581 # _PyHASH_MODULUS, or 0 if self._denominator is divisible by
582 # _PyHASH_MODULUS.
583 dinv = pow(self._denominator, _PyHASH_MODULUS - 2, _PyHASH_MODULUS)
584 if not dinv:
585 hash_ = _PyHASH_INF
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000586 else:
Mark Dickinsondc787d22010-05-23 13:33:13 +0000587 hash_ = abs(self._numerator) * dinv % _PyHASH_MODULUS
Mark Dickinsonfec66202010-11-13 10:27:38 +0000588 result = hash_ if self >= 0 else -hash_
589 return -2 if result == -1 else result
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000590
591 def __eq__(a, b):
592 """a == b"""
Georg Brandl40f97352014-09-24 08:37:55 +0200593 if type(b) is int:
594 return a._numerator == b and a._denominator == 1
Christian Heimes3feef612008-02-11 06:19:17 +0000595 if isinstance(b, numbers.Rational):
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000596 return (a._numerator == b.numerator and
597 a._denominator == b.denominator)
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000598 if isinstance(b, numbers.Complex) and b.imag == 0:
599 b = b.real
600 if isinstance(b, float):
Mark Dickinson85424c92009-07-18 14:41:42 +0000601 if math.isnan(b) or math.isinf(b):
602 # comparisons with an infinity or nan should behave in
603 # the same way for any finite a, so treat a as zero.
604 return 0.0 == b
605 else:
606 return a == a.from_float(b)
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000607 else:
Mark Dickinson85424c92009-07-18 14:41:42 +0000608 # Since a doesn't know how to compare with b, let's give b
609 # a chance to compare itself with a.
610 return NotImplemented
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000611
Mark Dickinson85424c92009-07-18 14:41:42 +0000612 def _richcmp(self, other, op):
613 """Helper for comparison operators, for internal use only.
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000614
Mark Dickinson85424c92009-07-18 14:41:42 +0000615 Implement comparison between a Rational instance `self`, and
616 either another Rational instance or a float `other`. If
617 `other` is not a Rational instance or a float, return
618 NotImplemented. `op` should be one of the six standard
619 comparison operators.
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000620
621 """
Mark Dickinson85424c92009-07-18 14:41:42 +0000622 # convert other to a Rational instance where reasonable.
623 if isinstance(other, numbers.Rational):
624 return op(self._numerator * other.denominator,
625 self._denominator * other.numerator)
Mark Dickinson85424c92009-07-18 14:41:42 +0000626 if isinstance(other, float):
627 if math.isnan(other) or math.isinf(other):
628 return op(0.0, other)
629 else:
630 return op(self, self.from_float(other))
631 else:
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000632 return NotImplemented
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000633
634 def __lt__(a, b):
635 """a < b"""
Mark Dickinson85424c92009-07-18 14:41:42 +0000636 return a._richcmp(b, operator.lt)
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000637
638 def __gt__(a, b):
639 """a > b"""
Mark Dickinson85424c92009-07-18 14:41:42 +0000640 return a._richcmp(b, operator.gt)
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000641
642 def __le__(a, b):
643 """a <= b"""
Mark Dickinson85424c92009-07-18 14:41:42 +0000644 return a._richcmp(b, operator.le)
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000645
646 def __ge__(a, b):
647 """a >= b"""
Mark Dickinson85424c92009-07-18 14:41:42 +0000648 return a._richcmp(b, operator.ge)
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000649
650 def __bool__(a):
651 """a != 0"""
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000652 return a._numerator != 0
Christian Heimes969fe572008-01-25 11:23:10 +0000653
654 # support for pickling, copy, and deepcopy
655
656 def __reduce__(self):
657 return (self.__class__, (str(self),))
658
659 def __copy__(self):
Christian Heimes3feef612008-02-11 06:19:17 +0000660 if type(self) == Fraction:
Christian Heimes969fe572008-01-25 11:23:10 +0000661 return self # I'm immutable; therefore I am my own clone
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000662 return self.__class__(self._numerator, self._denominator)
Christian Heimes969fe572008-01-25 11:23:10 +0000663
664 def __deepcopy__(self, memo):
Christian Heimes3feef612008-02-11 06:19:17 +0000665 if type(self) == Fraction:
Christian Heimes969fe572008-01-25 11:23:10 +0000666 return self # My components are also immutable
Christian Heimes68f5fbe2008-02-14 08:27:37 +0000667 return self.__class__(self._numerator, self._denominator)