# 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

@public
[docs]class Field(Ring): """Represents a field domain. """ has_Field = 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')