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