14710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Copyright 2007 Google, Inc. All Rights Reserved. 24710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Licensed to PSF under a Contributor Agreement. 34710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 44710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"""Abstract Base Classes (ABCs) for numbers, according to PEP 3141. 54710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 64710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmTODO: Fill out more detailed documentation on the operators.""" 74710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 84710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom __future__ import division 94710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom abc import ABCMeta, abstractmethod, abstractproperty 104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm__all__ = ["Number", "Complex", "Real", "Rational", "Integral"] 124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass Number(object): 144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """All numbers inherit from this class. 154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm If you just want to check if an argument x is a number, without 174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm caring what kind, use isinstance(x, Number). 184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm __metaclass__ = ABCMeta 204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm __slots__ = () 214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Concrete numeric types must provide their own hash implementation 234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm __hash__ = None 244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm## Notes on Decimal 274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm## ---------------- 284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm## Decimal has all of the methods specified by the Real abc, but it should 294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm## not be registered as a Real because decimals do not interoperate with 304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm## binary floats (i.e. Decimal('3.14') + 2.71828 is undefined). But, 314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm## abstract reals are expected to interoperate (i.e. R1 + R2 should be 324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm## expected to work if R1 and R2 are both Reals). 334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass Complex(Number): 354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Complex defines the operations that work on the builtin complex type. 364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm In short, those are: a conversion to complex, .real, .imag, +, -, 384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *, /, abs(), .conjugate, ==, and !=. 394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm If it is given heterogenous arguments, and doesn't have special 414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm knowledge about them, it should fall back to the builtin complex 424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm type as described below. 434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm __slots__ = () 464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @abstractmethod 484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __complex__(self): 494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Return a builtin complex instance. Called for complex(self).""" 504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Will be __bool__ in 3.0. 524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __nonzero__(self): 534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """True if self != 0. Called for bool(self).""" 544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self != 0 554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @abstractproperty 574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def real(self): 584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Retrieve the real component of this number. 594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm This should subclass Real. 614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise NotImplementedError 634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @abstractproperty 654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def imag(self): 664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Retrieve the imaginary component of this number. 674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm This should subclass Real. 694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise NotImplementedError 714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @abstractmethod 734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __add__(self, other): 744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """self + other""" 754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise NotImplementedError 764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @abstractmethod 784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __radd__(self, other): 794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """other + self""" 804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise NotImplementedError 814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @abstractmethod 834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __neg__(self): 844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """-self""" 854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise NotImplementedError 864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @abstractmethod 884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __pos__(self): 894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """+self""" 904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise NotImplementedError 914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __sub__(self, other): 934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """self - other""" 944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self + -other 954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __rsub__(self, other): 974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """other - self""" 984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -self + other 994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @abstractmethod 1014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __mul__(self, other): 1024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """self * other""" 1034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise NotImplementedError 1044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @abstractmethod 1064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __rmul__(self, other): 1074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """other * self""" 1084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise NotImplementedError 1094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @abstractmethod 1114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __div__(self, other): 1124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """self / other without __future__ division 1134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm May promote to float. 1154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 1164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise NotImplementedError 1174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @abstractmethod 1194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __rdiv__(self, other): 1204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """other / self without __future__ division""" 1214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise NotImplementedError 1224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @abstractmethod 1244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __truediv__(self, other): 1254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """self / other with __future__ division. 1264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Should promote to float when necessary. 1284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 1294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise NotImplementedError 1304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @abstractmethod 1324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __rtruediv__(self, other): 1334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """other / self with __future__ division""" 1344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise NotImplementedError 1354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @abstractmethod 1374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __pow__(self, exponent): 1384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """self**exponent; should promote to float or complex when necessary.""" 1394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise NotImplementedError 1404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @abstractmethod 1424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __rpow__(self, base): 1434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """base ** self""" 1444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise NotImplementedError 1454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @abstractmethod 1474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __abs__(self): 1484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Returns the Real distance from 0. Called for abs(self).""" 1494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise NotImplementedError 1504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @abstractmethod 1524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def conjugate(self): 1534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """(x+y*i).conjugate() returns (x-y*i).""" 1544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise NotImplementedError 1554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @abstractmethod 1574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __eq__(self, other): 1584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """self == other""" 1594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise NotImplementedError 1604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __ne__(self, other): 1624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """self != other""" 1634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # The default __ne__ doesn't negate __eq__ until 3.0. 1644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return not (self == other) 1654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmComplex.register(complex) 1674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass Real(Complex): 1704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """To Complex, Real adds the operations that work on real numbers. 1714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm In short, those are: a conversion to float, trunc(), divmod, 1734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm %, <, <=, >, and >=. 1744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Real also provides defaults for the derived operations. 1764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 1774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm __slots__ = () 1794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @abstractmethod 1814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __float__(self): 1824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Any Real can be converted to a native float object. 1834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Called for float(self).""" 1854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise NotImplementedError 1864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @abstractmethod 1884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __trunc__(self): 1894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """trunc(self): Truncates self to an Integral. 1904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Returns an Integral i such that: 1924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * i>0 iff self>0; 1934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * abs(i) <= abs(self); 1944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * for any Integral j satisfying the first two conditions, 1954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm abs(i) >= abs(j) [i.e. i has "maximal" abs among those]. 1964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm i.e. "truncate towards 0". 1974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 1984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise NotImplementedError 1994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __divmod__(self, other): 2014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """divmod(self, other): The pair (self // other, self % other). 2024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Sometimes this can be computed faster than the pair of 2044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm operations. 2054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 2064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return (self // other, self % other) 2074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __rdivmod__(self, other): 2094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """divmod(other, self): The pair (self // other, self % other). 2104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Sometimes this can be computed faster than the pair of 2124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm operations. 2134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 2144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return (other // self, other % self) 2154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @abstractmethod 2174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __floordiv__(self, other): 2184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """self // other: The floor() of self/other.""" 2194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise NotImplementedError 2204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @abstractmethod 2224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __rfloordiv__(self, other): 2234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """other // self: The floor() of other/self.""" 2244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise NotImplementedError 2254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @abstractmethod 2274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __mod__(self, other): 2284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """self % other""" 2294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise NotImplementedError 2304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @abstractmethod 2324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __rmod__(self, other): 2334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """other % self""" 2344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise NotImplementedError 2354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @abstractmethod 2374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __lt__(self, other): 2384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """self < other 2394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm < on Reals defines a total ordering, except perhaps for NaN.""" 2414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise NotImplementedError 2424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @abstractmethod 2444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __le__(self, other): 2454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """self <= other""" 2464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise NotImplementedError 2474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Concrete implementations of Complex abstract methods. 2494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __complex__(self): 2504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """complex(self) == complex(float(self), 0)""" 2514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return complex(float(self)) 2524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @property 2544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def real(self): 2554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Real numbers are their real component.""" 2564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return +self 2574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @property 2594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def imag(self): 2604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Real numbers have no imaginary component.""" 2614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0 2624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def conjugate(self): 2644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Conjugate is a no-op for Reals.""" 2654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return +self 2664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmReal.register(float) 2684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass Rational(Real): 2714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """.numerator and .denominator should be in lowest terms.""" 2724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm __slots__ = () 2744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @abstractproperty 2764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def numerator(self): 2774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise NotImplementedError 2784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @abstractproperty 2804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def denominator(self): 2814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise NotImplementedError 2824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Concrete implementation of Real's conversion to float. 2844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __float__(self): 2854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """float(self) = self.numerator / self.denominator 2864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm It's important that this conversion use the integer's "true" 2884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm division rather than casting one side to float before dividing 2894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm so that ratios of huge integers convert without overflowing. 2904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 2924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.numerator / self.denominator 2934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass Integral(Rational): 2964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Integral adds a conversion to long and the bit-string operations.""" 2974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm __slots__ = () 2994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @abstractmethod 3014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __long__(self): 3024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """long(self)""" 3034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise NotImplementedError 3044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __index__(self): 3064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """index(self)""" 3074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return long(self) 3084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @abstractmethod 3104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __pow__(self, exponent, modulus=None): 3114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """self ** exponent % modulus, but maybe faster. 3124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Accept the modulus argument if you want to support the 3144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3-argument version of pow(). Raise a TypeError if exponent < 0 3154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm or any argument isn't Integral. Otherwise, just implement the 3164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2-argument version described in Complex. 3174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 3184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise NotImplementedError 3194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @abstractmethod 3214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __lshift__(self, other): 3224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """self << other""" 3234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise NotImplementedError 3244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @abstractmethod 3264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __rlshift__(self, other): 3274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """other << self""" 3284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise NotImplementedError 3294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @abstractmethod 3314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __rshift__(self, other): 3324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """self >> other""" 3334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise NotImplementedError 3344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @abstractmethod 3364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __rrshift__(self, other): 3374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """other >> self""" 3384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise NotImplementedError 3394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @abstractmethod 3414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __and__(self, other): 3424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """self & other""" 3434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise NotImplementedError 3444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @abstractmethod 3464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __rand__(self, other): 3474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """other & self""" 3484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise NotImplementedError 3494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @abstractmethod 3514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __xor__(self, other): 3524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """self ^ other""" 3534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise NotImplementedError 3544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @abstractmethod 3564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __rxor__(self, other): 3574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """other ^ self""" 3584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise NotImplementedError 3594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @abstractmethod 3614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __or__(self, other): 3624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """self | other""" 3634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise NotImplementedError 3644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @abstractmethod 3664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __ror__(self, other): 3674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """other | self""" 3684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise NotImplementedError 3694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @abstractmethod 3714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __invert__(self): 3724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """~self""" 3734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise NotImplementedError 3744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Concrete implementations of Rational and Real abstract methods. 3764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __float__(self): 3774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """float(self) == float(long(self))""" 3784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return float(long(self)) 3794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @property 3814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def numerator(self): 3824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Integers are their own numerators.""" 3834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return +self 3844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @property 3864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def denominator(self): 3874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Integers have a denominator of 1.""" 3884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 1 3894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmIntegral.register(int) 3914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmIntegral.register(long) 392