105 lines
2.5 KiB
Python
105 lines
2.5 KiB
Python
|
"""Implementation of :class:`Field` class. """
|
||
|
|
||
|
|
||
|
from sympy.polys.domains.ring import Ring
|
||
|
from sympy.polys.polyerrors import NotReversible, DomainError
|
||
|
from sympy.utilities import public
|
||
|
|
||
|
@public
|
||
|
class Field(Ring):
|
||
|
"""Represents a field domain. """
|
||
|
|
||
|
is_Field = True
|
||
|
is_PID = True
|
||
|
|
||
|
def get_ring(self):
|
||
|
"""Returns a ring associated with ``self``. """
|
||
|
raise DomainError('there is no ring associated with %s' % self)
|
||
|
|
||
|
def get_field(self):
|
||
|
"""Returns a field associated with ``self``. """
|
||
|
return self
|
||
|
|
||
|
def exquo(self, a, b):
|
||
|
"""Exact quotient of ``a`` and ``b``, implies ``__truediv__``. """
|
||
|
return a / b
|
||
|
|
||
|
def quo(self, a, b):
|
||
|
"""Quotient of ``a`` and ``b``, implies ``__truediv__``. """
|
||
|
return a / b
|
||
|
|
||
|
def rem(self, a, b):
|
||
|
"""Remainder of ``a`` and ``b``, implies nothing. """
|
||
|
return self.zero
|
||
|
|
||
|
def div(self, a, b):
|
||
|
"""Division of ``a`` and ``b``, implies ``__truediv__``. """
|
||
|
return a / b, self.zero
|
||
|
|
||
|
def gcd(self, a, b):
|
||
|
"""
|
||
|
Returns GCD of ``a`` and ``b``.
|
||
|
|
||
|
This definition of GCD over fields allows to clear denominators
|
||
|
in `primitive()`.
|
||
|
|
||
|
Examples
|
||
|
========
|
||
|
|
||
|
>>> from sympy.polys.domains import QQ
|
||
|
>>> from sympy import S, gcd, primitive
|
||
|
>>> from sympy.abc import x
|
||
|
|
||
|
>>> QQ.gcd(QQ(2, 3), QQ(4, 9))
|
||
|
2/9
|
||
|
>>> gcd(S(2)/3, S(4)/9)
|
||
|
2/9
|
||
|
>>> primitive(2*x/3 + S(4)/9)
|
||
|
(2/9, 3*x + 2)
|
||
|
|
||
|
"""
|
||
|
try:
|
||
|
ring = self.get_ring()
|
||
|
except DomainError:
|
||
|
return self.one
|
||
|
|
||
|
p = ring.gcd(self.numer(a), self.numer(b))
|
||
|
q = ring.lcm(self.denom(a), self.denom(b))
|
||
|
|
||
|
return self.convert(p, ring)/q
|
||
|
|
||
|
def lcm(self, a, b):
|
||
|
"""
|
||
|
Returns LCM of ``a`` and ``b``.
|
||
|
|
||
|
>>> from sympy.polys.domains import QQ
|
||
|
>>> from sympy import S, lcm
|
||
|
|
||
|
>>> QQ.lcm(QQ(2, 3), QQ(4, 9))
|
||
|
4/3
|
||
|
>>> lcm(S(2)/3, S(4)/9)
|
||
|
4/3
|
||
|
|
||
|
"""
|
||
|
|
||
|
try:
|
||
|
ring = self.get_ring()
|
||
|
except DomainError:
|
||
|
return a*b
|
||
|
|
||
|
p = ring.lcm(self.numer(a), self.numer(b))
|
||
|
q = ring.gcd(self.denom(a), self.denom(b))
|
||
|
|
||
|
return self.convert(p, ring)/q
|
||
|
|
||
|
def revert(self, a):
|
||
|
"""Returns ``a**(-1)`` if possible. """
|
||
|
if a:
|
||
|
return 1/a
|
||
|
else:
|
||
|
raise NotReversible('zero is not reversible')
|
||
|
|
||
|
def is_unit(self, a):
|
||
|
"""Return true if ``a`` is a invertible"""
|
||
|
return bool(a)
|