# Source code for sympy.polys.domains.field

"""Implementation of :class:Field class. """

from __future__ import print_function, division

from sympy.polys.domains.ring import Ring
from sympy.polys.polyerrors import NotReversible, DomainError
from sympy.utilities import public

[docs]@public
class Field(Ring):
"""Represents a field domain. """

is_Field = True
is_PID = True

[docs]    def get_ring(self):
"""Returns a ring associated with self. """
raise DomainError('there is no ring associated with %s' % self)

[docs]    def get_field(self):
"""Returns a field associated with self. """
return self

[docs]    def exquo(self, a, b):
"""Exact quotient of a and b, implies __div__.  """
return a / b

[docs]    def quo(self, a, b):
"""Quotient of a and b, implies __div__. """
return a / b

[docs]    def rem(self, a, b):
"""Remainder of a and b, implies nothing.  """
return self.zero

[docs]    def div(self, a, b):
"""Division of a and b, implies __div__. """
return a / b, self.zero

[docs]    def gcd(self, a, b):
"""
Returns GCD of a and b.

This definition of GCD over fields allows to clear denominators
in primitive().

>>> 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

[docs]    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

[docs]    def revert(self, a):
"""Returns a**(-1) if possible. """
if a:
return 1/a
else:
raise NotReversible('zero is not reversible')