183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh# Copyright 2007 Google, Inc. All Rights Reserved.
283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh# Licensed to PSF under a Contributor Agreement.
383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh"""Abstract Base Classes (ABCs) for numbers, according to PEP 3141.
583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew HsiehTODO: Fill out more detailed documentation on the operators."""
783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehfrom __future__ import division
983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehfrom abc import ABCMeta, abstractmethod, abstractproperty
1083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
1183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh__all__ = ["Number", "Complex", "Real", "Rational", "Integral"]
1283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
1383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass Number(object):
1483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """All numbers inherit from this class.
1583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
1683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    If you just want to check if an argument x is a number, without
1783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    caring what kind, use isinstance(x, Number).
1883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """
1983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    __metaclass__ = ABCMeta
2083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    __slots__ = ()
2183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
2283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # Concrete numeric types must provide their own hash implementation
2383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    __hash__ = None
2483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
2583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
2683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh## Notes on Decimal
2783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh## ----------------
2883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh## Decimal has all of the methods specified by the Real abc, but it should
2983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh## not be registered as a Real because decimals do not interoperate with
3083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh## binary floats (i.e.  Decimal('3.14') + 2.71828 is undefined).  But,
3183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh## abstract reals are expected to interoperate (i.e. R1 + R2 should be
3283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh## expected to work if R1 and R2 are both Reals).
3383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
3483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass Complex(Number):
3583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """Complex defines the operations that work on the builtin complex type.
3683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
3783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    In short, those are: a conversion to complex, .real, .imag, +, -,
3883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    *, /, abs(), .conjugate, ==, and !=.
3983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
4083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    If it is given heterogenous arguments, and doesn't have special
4183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    knowledge about them, it should fall back to the builtin complex
4283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    type as described below.
4383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """
4483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
4583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    __slots__ = ()
4683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
4783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @abstractmethod
4883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __complex__(self):
4983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """Return a builtin complex instance. Called for complex(self)."""
5083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
5183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # Will be __bool__ in 3.0.
5283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __nonzero__(self):
5383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """True if self != 0. Called for bool(self)."""
5483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return self != 0
5583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
5683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @abstractproperty
5783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def real(self):
5883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """Retrieve the real component of this number.
5983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
6083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        This should subclass Real.
6183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
6283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        raise NotImplementedError
6383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
6483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @abstractproperty
6583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def imag(self):
6683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """Retrieve the imaginary component of this number.
6783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
6883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        This should subclass Real.
6983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
7083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        raise NotImplementedError
7183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
7283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @abstractmethod
7383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __add__(self, other):
7483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """self + other"""
7583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        raise NotImplementedError
7683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
7783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @abstractmethod
7883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __radd__(self, other):
7983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """other + self"""
8083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        raise NotImplementedError
8183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
8283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @abstractmethod
8383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __neg__(self):
8483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """-self"""
8583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        raise NotImplementedError
8683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
8783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @abstractmethod
8883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __pos__(self):
8983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """+self"""
9083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        raise NotImplementedError
9183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
9283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __sub__(self, other):
9383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """self - other"""
9483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return self + -other
9583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
9683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __rsub__(self, other):
9783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """other - self"""
9883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return -self + other
9983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
10083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @abstractmethod
10183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __mul__(self, other):
10283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """self * other"""
10383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        raise NotImplementedError
10483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
10583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @abstractmethod
10683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __rmul__(self, other):
10783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """other * self"""
10883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        raise NotImplementedError
10983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
11083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @abstractmethod
11183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __div__(self, other):
11283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """self / other without __future__ division
11383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
11483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        May promote to float.
11583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
11683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        raise NotImplementedError
11783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
11883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @abstractmethod
11983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __rdiv__(self, other):
12083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """other / self without __future__ division"""
12183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        raise NotImplementedError
12283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
12383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @abstractmethod
12483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __truediv__(self, other):
12583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """self / other with __future__ division.
12683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
12783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        Should promote to float when necessary.
12883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
12983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        raise NotImplementedError
13083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
13183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @abstractmethod
13283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __rtruediv__(self, other):
13383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """other / self with __future__ division"""
13483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        raise NotImplementedError
13583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
13683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @abstractmethod
13783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __pow__(self, exponent):
13883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """self**exponent; should promote to float or complex when necessary."""
13983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        raise NotImplementedError
14083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
14183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @abstractmethod
14283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __rpow__(self, base):
14383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """base ** self"""
14483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        raise NotImplementedError
14583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
14683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @abstractmethod
14783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __abs__(self):
14883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """Returns the Real distance from 0. Called for abs(self)."""
14983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        raise NotImplementedError
15083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
15183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @abstractmethod
15283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def conjugate(self):
15383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """(x+y*i).conjugate() returns (x-y*i)."""
15483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        raise NotImplementedError
15583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
15683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @abstractmethod
15783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __eq__(self, other):
15883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """self == other"""
15983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        raise NotImplementedError
16083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
16183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __ne__(self, other):
16283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """self != other"""
16383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # The default __ne__ doesn't negate __eq__ until 3.0.
16483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return not (self == other)
16583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
16683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew HsiehComplex.register(complex)
16783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
16883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
16983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass Real(Complex):
17083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """To Complex, Real adds the operations that work on real numbers.
17183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
17283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    In short, those are: a conversion to float, trunc(), divmod,
17383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    %, <, <=, >, and >=.
17483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
17583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    Real also provides defaults for the derived operations.
17683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """
17783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
17883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    __slots__ = ()
17983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
18083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @abstractmethod
18183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __float__(self):
18283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """Any Real can be converted to a native float object.
18383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
18483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        Called for float(self)."""
18583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        raise NotImplementedError
18683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
18783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @abstractmethod
18883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __trunc__(self):
18983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """trunc(self): Truncates self to an Integral.
19083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
19183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        Returns an Integral i such that:
19283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh          * i>0 iff self>0;
19383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh          * abs(i) <= abs(self);
19483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh          * for any Integral j satisfying the first two conditions,
19583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            abs(i) >= abs(j) [i.e. i has "maximal" abs among those].
19683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        i.e. "truncate towards 0".
19783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
19883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        raise NotImplementedError
19983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
20083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __divmod__(self, other):
20183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """divmod(self, other): The pair (self // other, self % other).
20283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
20383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        Sometimes this can be computed faster than the pair of
20483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        operations.
20583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
20683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return (self // other, self % other)
20783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
20883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __rdivmod__(self, other):
20983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """divmod(other, self): The pair (self // other, self % other).
21083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
21183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        Sometimes this can be computed faster than the pair of
21283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        operations.
21383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
21483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return (other // self, other % self)
21583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
21683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @abstractmethod
21783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __floordiv__(self, other):
21883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """self // other: The floor() of self/other."""
21983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        raise NotImplementedError
22083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
22183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @abstractmethod
22283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __rfloordiv__(self, other):
22383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """other // self: The floor() of other/self."""
22483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        raise NotImplementedError
22583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
22683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @abstractmethod
22783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __mod__(self, other):
22883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """self % other"""
22983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        raise NotImplementedError
23083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
23183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @abstractmethod
23283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __rmod__(self, other):
23383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """other % self"""
23483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        raise NotImplementedError
23583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
23683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @abstractmethod
23783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __lt__(self, other):
23883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """self < other
23983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
24083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        < on Reals defines a total ordering, except perhaps for NaN."""
24183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        raise NotImplementedError
24283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
24383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @abstractmethod
24483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __le__(self, other):
24583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """self <= other"""
24683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        raise NotImplementedError
24783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
24883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # Concrete implementations of Complex abstract methods.
24983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __complex__(self):
25083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """complex(self) == complex(float(self), 0)"""
25183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return complex(float(self))
25283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
25383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @property
25483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def real(self):
25583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """Real numbers are their real component."""
25683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return +self
25783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
25883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @property
25983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def imag(self):
26083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """Real numbers have no imaginary component."""
26183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return 0
26283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
26383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def conjugate(self):
26483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """Conjugate is a no-op for Reals."""
26583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return +self
26683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
26783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew HsiehReal.register(float)
26883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
26983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
27083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass Rational(Real):
27183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """.numerator and .denominator should be in lowest terms."""
27283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
27383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    __slots__ = ()
27483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
27583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @abstractproperty
27683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def numerator(self):
27783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        raise NotImplementedError
27883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
27983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @abstractproperty
28083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def denominator(self):
28183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        raise NotImplementedError
28283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
28383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # Concrete implementation of Real's conversion to float.
28483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __float__(self):
28583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """float(self) = self.numerator / self.denominator
28683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
28783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        It's important that this conversion use the integer's "true"
28883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        division rather than casting one side to float before dividing
28983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        so that ratios of huge integers convert without overflowing.
29083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
29183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
29283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return self.numerator / self.denominator
29383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
29483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
29583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass Integral(Rational):
29683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """Integral adds a conversion to long and the bit-string operations."""
29783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
29883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    __slots__ = ()
29983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
30083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @abstractmethod
30183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __long__(self):
30283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """long(self)"""
30383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        raise NotImplementedError
30483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
30583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __index__(self):
30683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """Called whenever an index is needed, such as in slicing"""
30783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return long(self)
30883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
30983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @abstractmethod
31083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __pow__(self, exponent, modulus=None):
31183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """self ** exponent % modulus, but maybe faster.
31283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
31383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        Accept the modulus argument if you want to support the
31483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        3-argument version of pow(). Raise a TypeError if exponent < 0
31583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        or any argument isn't Integral. Otherwise, just implement the
31683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        2-argument version described in Complex.
31783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
31883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        raise NotImplementedError
31983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
32083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @abstractmethod
32183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __lshift__(self, other):
32283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """self << other"""
32383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        raise NotImplementedError
32483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
32583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @abstractmethod
32683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __rlshift__(self, other):
32783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """other << self"""
32883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        raise NotImplementedError
32983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
33083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @abstractmethod
33183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __rshift__(self, other):
33283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """self >> other"""
33383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        raise NotImplementedError
33483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
33583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @abstractmethod
33683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __rrshift__(self, other):
33783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """other >> self"""
33883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        raise NotImplementedError
33983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
34083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @abstractmethod
34183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __and__(self, other):
34283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """self & other"""
34383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        raise NotImplementedError
34483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
34583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @abstractmethod
34683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __rand__(self, other):
34783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """other & self"""
34883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        raise NotImplementedError
34983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
35083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @abstractmethod
35183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __xor__(self, other):
35283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """self ^ other"""
35383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        raise NotImplementedError
35483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
35583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @abstractmethod
35683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __rxor__(self, other):
35783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """other ^ self"""
35883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        raise NotImplementedError
35983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
36083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @abstractmethod
36183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __or__(self, other):
36283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """self | other"""
36383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        raise NotImplementedError
36483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
36583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @abstractmethod
36683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __ror__(self, other):
36783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """other | self"""
36883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        raise NotImplementedError
36983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
37083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @abstractmethod
37183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __invert__(self):
37283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """~self"""
37383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        raise NotImplementedError
37483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
37583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # Concrete implementations of Rational and Real abstract methods.
37683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __float__(self):
37783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """float(self) == float(long(self))"""
37883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return float(long(self))
37983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
38083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @property
38183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def numerator(self):
38283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """Integers are their own numerators."""
38383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return +self
38483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
38583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @property
38683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def denominator(self):
38783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """Integers have a denominator of 1."""
38883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return 1
38983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
39083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew HsiehIntegral.register(int)
39183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew HsiehIntegral.register(long)
392