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