123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- """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)
|