74 lines
2.2 KiB
Python
74 lines
2.2 KiB
Python
"""Implementation of :class:`PythonRationalField` class. """
|
|
|
|
|
|
from sympy.polys.domains.groundtypes import PythonInteger, PythonRational, SymPyRational
|
|
from sympy.polys.domains.rationalfield import RationalField
|
|
from sympy.polys.polyerrors import CoercionFailed
|
|
from sympy.utilities import public
|
|
|
|
@public
|
|
class PythonRationalField(RationalField):
|
|
"""Rational field based on :ref:`MPQ`.
|
|
|
|
This will be used as :ref:`QQ` if ``gmpy`` and ``gmpy2`` are not
|
|
installed. Elements are instances of :ref:`MPQ`.
|
|
"""
|
|
|
|
dtype = PythonRational
|
|
zero = dtype(0)
|
|
one = dtype(1)
|
|
alias = 'QQ_python'
|
|
|
|
def __init__(self):
|
|
pass
|
|
|
|
def get_ring(self):
|
|
"""Returns ring associated with ``self``. """
|
|
from sympy.polys.domains import PythonIntegerRing
|
|
return PythonIntegerRing()
|
|
|
|
def to_sympy(self, a):
|
|
"""Convert `a` to a SymPy object. """
|
|
return SymPyRational(a.numerator, a.denominator)
|
|
|
|
def from_sympy(self, a):
|
|
"""Convert SymPy's Rational to `dtype`. """
|
|
if a.is_Rational:
|
|
return PythonRational(a.p, a.q)
|
|
elif a.is_Float:
|
|
from sympy.polys.domains import RR
|
|
p, q = RR.to_rational(a)
|
|
return PythonRational(int(p), int(q))
|
|
else:
|
|
raise CoercionFailed("expected `Rational` object, got %s" % a)
|
|
|
|
def from_ZZ_python(K1, a, K0):
|
|
"""Convert a Python `int` object to `dtype`. """
|
|
return PythonRational(a)
|
|
|
|
def from_QQ_python(K1, a, K0):
|
|
"""Convert a Python `Fraction` object to `dtype`. """
|
|
return a
|
|
|
|
def from_ZZ_gmpy(K1, a, K0):
|
|
"""Convert a GMPY `mpz` object to `dtype`. """
|
|
return PythonRational(PythonInteger(a))
|
|
|
|
def from_QQ_gmpy(K1, a, K0):
|
|
"""Convert a GMPY `mpq` object to `dtype`. """
|
|
return PythonRational(PythonInteger(a.numer()),
|
|
PythonInteger(a.denom()))
|
|
|
|
def from_RealField(K1, a, K0):
|
|
"""Convert a mpmath `mpf` object to `dtype`. """
|
|
p, q = K0.to_rational(a)
|
|
return PythonRational(int(p), int(q))
|
|
|
|
def numer(self, a):
|
|
"""Returns numerator of `a`. """
|
|
return a.numerator
|
|
|
|
def denom(self, a):
|
|
"""Returns denominator of `a`. """
|
|
return a.denominator
|