ó
    Š*£h’Ÿ  ã                  óÌ   • S r SSKJr  SSKJr  SSKJr  SSKJrJ	r	  SSK
Jr  SSKJr  SSKJr  SS	KJr  SS
KJrJrJr  SSKJrJr  SSKJr  SSKJr  \ " S S5      5       rS/rg)z)Implementation of :class:`Domain` class. é    )Úannotations)ÚAny)ÚAlgebraicNumber)ÚBasicÚsympify)Úordered)ÚGROUND_TYPES)ÚDomainElement)Úlex)ÚUnificationFailedÚCoercionFailedÚDomainError)Ú_unify_gensÚ_not_a_coeff)Úpublic)Úis_sequencec                  óD  • \ rS rSr% SrSrS\S'    SrS\S'    SrS\S'    S	r	 S	r
 S	r S	r S	=rrS	=rrS	=rrS	=rrS	=rrS	=rrS	=rrS	=rrS	=rrS	=rr S	=r!r"S	=r#r$S	r%S
r&S	r'S	r(S	r)S	r* S	r+Sr,S\S'   Sr-S\S'   S r.S r/S r0S r1S r2\3S 5       r4S r5S r6S r7ShS jr8S r9S r:S r;S r<S r=S r>S r?S r@S  rAS! rBS" rCS# rDS$ rES% rFS& rGS' rHS( rIS) rJS* rKS+ rLS, rMS- rNS. rOS/ rPShS0 jrQS1 rRS2 rSS3 rTS4 rUS5 rVS6 rWS7 rX\YS8.S9 jrZ\YS8.S: jr[S; r\S< r]SS=.S> jr^SiS? jr_SjS@ jr`SA raSB rbSC rcSD rdSE reSF rfSG rgSH rhSI riSJ rjSK rkSL rlSM rmSN rnSO roSP rpSQ rqSR rrSS rsST rtSU ruSV rvSW rwSX rxSY rySZ rzS[ r{S\ r|S] r}S^ r~S_ rS` r€Sa r�ShSb jr‚\‚rƒSc r„Sd r…ShSe jr†Sf r‡Sgrˆg)kÚDomainé   a*  Superclass for all domains in the polys domains system.

See :ref:`polys-domainsintro` for an introductory explanation of the
domains system.

The :py:class:`~.Domain` class is an abstract base class for all of the
concrete domain types. There are many different :py:class:`~.Domain`
subclasses each of which has an associated ``dtype`` which is a class
representing the elements of the domain. The coefficients of a
:py:class:`~.Poly` are elements of a domain which must be a subclass of
:py:class:`~.Domain`.

Examples
========

The most common example domains are the integers :ref:`ZZ` and the
rationals :ref:`QQ`.

>>> from sympy import Poly, symbols, Domain
>>> x, y = symbols('x, y')
>>> p = Poly(x**2 + y)
>>> p
Poly(x**2 + y, x, y, domain='ZZ')
>>> p.domain
ZZ
>>> isinstance(p.domain, Domain)
True
>>> Poly(x**2 + y/2)
Poly(x**2 + 1/2*y, x, y, domain='QQ')

The domains can be used directly in which case the domain object e.g.
(:ref:`ZZ` or :ref:`QQ`) can be used as a constructor for elements of
``dtype``.

>>> from sympy import ZZ, QQ
>>> ZZ(2)
2
>>> ZZ.dtype  # doctest: +SKIP
<class 'int'>
>>> type(ZZ(2))  # doctest: +SKIP
<class 'int'>
>>> QQ(1, 2)
1/2
>>> type(QQ(1, 2))  # doctest: +SKIP
<class 'sympy.polys.domains.pythonrational.PythonRational'>

The corresponding domain elements can be used with the arithmetic
operations ``+,-,*,**`` and depending on the domain some combination of
``/,//,%`` might be usable. For example in :ref:`ZZ` both ``//`` (floor
division) and ``%`` (modulo division) can be used but ``/`` (true
division) cannot. Since :ref:`QQ` is a :py:class:`~.Field` its elements
can be used with ``/`` but ``//`` and ``%`` should not be used. Some
domains have a :py:meth:`~.Domain.gcd` method.

>>> ZZ(2) + ZZ(3)
5
>>> ZZ(5) // ZZ(2)
2
>>> ZZ(5) % ZZ(2)
1
>>> QQ(1, 2) / QQ(2, 3)
3/4
>>> ZZ.gcd(ZZ(4), ZZ(2))
2
>>> QQ.gcd(QQ(2,7), QQ(5,3))
1/21
>>> ZZ.is_Field
False
>>> QQ.is_Field
True

There are also many other domains including:

    1. :ref:`GF(p)` for finite fields of prime order.
    2. :ref:`RR` for real (floating point) numbers.
    3. :ref:`CC` for complex (floating point) numbers.
    4. :ref:`QQ(a)` for algebraic number fields.
    5. :ref:`K[x]` for polynomial rings.
    6. :ref:`K(x)` for rational function fields.
    7. :ref:`EX` for arbitrary expressions.

Each domain is represented by a domain object and also an implementation
class (``dtype``) for the elements of the domain. For example the
:ref:`K[x]` domains are represented by a domain object which is an
instance of :py:class:`~.PolynomialRing` and the elements are always
instances of :py:class:`~.PolyElement`. The implementation class
represents particular types of mathematical expressions in a way that is
more efficient than a normal SymPy expression which is of type
:py:class:`~.Expr`. The domain methods :py:meth:`~.Domain.from_sympy` and
:py:meth:`~.Domain.to_sympy` are used to convert from :py:class:`~.Expr`
to a domain element and vice versa.

>>> from sympy import Symbol, ZZ, Expr
>>> x = Symbol('x')
>>> K = ZZ[x]           # polynomial ring domain
>>> K
ZZ[x]
>>> type(K)             # class of the domain
<class 'sympy.polys.domains.polynomialring.PolynomialRing'>
>>> K.dtype             # doctest: +SKIP
<class 'sympy.polys.rings.PolyElement'>
>>> p_expr = x**2 + 1   # Expr
>>> p_expr
x**2 + 1
>>> type(p_expr)
<class 'sympy.core.add.Add'>
>>> isinstance(p_expr, Expr)
True
>>> p_domain = K.from_sympy(p_expr)
>>> p_domain            # domain element
x**2 + 1
>>> type(p_domain)
<class 'sympy.polys.rings.PolyElement'>
>>> K.to_sympy(p_domain) == p_expr
True

The :py:meth:`~.Domain.convert_from` method is used to convert domain
elements from one domain to another.

>>> from sympy import ZZ, QQ
>>> ez = ZZ(2)
>>> eq = QQ.convert_from(ez, ZZ)
>>> type(ez)  # doctest: +SKIP
<class 'int'>
>>> type(eq)  # doctest: +SKIP
<class 'sympy.polys.domains.pythonrational.PythonRational'>

Elements from different domains should not be mixed in arithmetic or other
operations: they should be converted to a common domain first.  The domain
method :py:meth:`~.Domain.unify` is used to find a domain that can
represent all the elements of two given domains.

>>> from sympy import ZZ, QQ, symbols
>>> x, y = symbols('x, y')
>>> ZZ.unify(QQ)
QQ
>>> ZZ[x].unify(QQ)
QQ[x]
>>> ZZ[x].unify(QQ[y])
QQ[x,y]

If a domain is a :py:class:`~.Ring` then is might have an associated
:py:class:`~.Field` and vice versa. The :py:meth:`~.Domain.get_field` and
:py:meth:`~.Domain.get_ring` methods will find or create the associated
domain.

>>> from sympy import ZZ, QQ, Symbol
>>> x = Symbol('x')
>>> ZZ.has_assoc_Field
True
>>> ZZ.get_field()
QQ
>>> QQ.has_assoc_Ring
True
>>> QQ.get_ring()
ZZ
>>> K = QQ[x]
>>> K
QQ[x]
>>> K.get_field()
QQ(x)

See also
========

DomainElement: abstract base class for domain elements
construct_domain: construct a minimal domain for some expressions

Nztype | NoneÚdtyper   ÚzeroÚoneFTz
str | NoneÚrepÚaliasc                ó   • [         e©N©ÚNotImplementedError©Úselfs    ÚW/home/mande/repo/quber/.venv/lib/python3.13/site-packages/sympy/polys/domains/domain.pyÚ__init__ÚDomain.__init__g  s   € Ü!Ð!ó    c                ó   • U R                   $ r   )r   r   s    r!   Ú__str__ÚDomain.__str__j  s   € Ø�x‰xˆr$   c                ó   • [        U 5      $ r   )Ústrr   s    r!   Ú__repr__ÚDomain.__repr__m  s   € Ü�4‹yÐr$   c                óX   • [        U R                  R                  U R                  45      $ r   )ÚhashÚ	__class__Ú__name__r   r   s    r!   Ú__hash__ÚDomain.__hash__p  s    € Ü�T—^‘^×,Ñ,¨d¯j©jÐ9Ó:Ð:r$   c                ó    • U R                   " U6 $ r   ©r   ©r    Úargss     r!   ÚnewÚ
Domain.news  ó   € Ø�zŠz˜4Ð Ð r$   c                ó   • U R                   $ )z#Alias for :py:attr:`~.Domain.dtype`r3   r   s    r!   ÚtpÚ	Domain.tpv  s   € ð �z‰zÐr$   c                ó    • U R                   " U6 $ )z7Construct an element of ``self`` domain from ``args``. )r6   r4   s     r!   Ú__call__ÚDomain.__call__{  s   € à�xŠx˜ˆÐr$   c                ó    • U R                   " U6 $ r   r3   r4   s     r!   ÚnormalÚDomain.normal  r8   r$   c           
     óì   • UR                   b  SUR                   -   nOSUR                  R                  -   n[        X5      nUb  U" X5      nUb  U$ [	        SU< S[        U5      < SU< SU < 35      e)z=Convert ``element`` to ``self.dtype`` given the base domain. Úfrom_úCannot convert ú	 of type z from ú to )r   r.   r/   Úgetattrr   Útype)r    ÚelementÚbaseÚmethodÚ_convertÚresults         r!   Úconvert_fromÚDomain.convert_from‚  sp   € à�:‰:Ñ!Ø˜tŸz™zÑ)‰Fà˜tŸ~™~×6Ñ6Ñ6ˆFä˜4Ó(ˆàÑÙ˜gÓ,ˆFàÑ!Ø�åËWÔVZÐ[bÖVcÓeiÒkoÐpÓqÐqr$   c                óX  • Ub/  [        U5      (       a  [        SU-  5      eU R                  X5      $ U R                  U5      (       a  U$ [        U5      (       a  [        SU-  5      eSSKJnJnJnJn  UR                  U5      (       a  U R                  X5      $ [        U[        5      (       a  U R                  U" U5      U5      $ [        S:w  aV  [        XR                  5      (       a  U R                  X5      $ [        XR                  5      (       a  U R                  X5      $ [        U[        5      (       a  U" 5       nU R                  U" U5      U5      $ [        U[        5      (       a  U" 5       nU R                  U" U5      U5      $ [        U5      R                   S:X  a  U" 5       nU R                  U" U5      U5      $ [        U5      R                   S:X  a  U" 5       nU R                  U" U5      U5      $ [        U["        5      (       a  U R                  XR%                  5       5      $ U R&                  (       a1  [)        USS5      (       a  U R+                  UR-                  5       5      $ [        U[.        5      (       a   U R1                  U5      $ [7        U5      (       d2   [9        US	S
9n[        U[.        5      (       a  U R1                  U5      $  [        SU< S[        U5      < SU < 35      e! [2        [4        4 a     N2f = f! [2        [4        4 a     NHf = f)z'Convert ``element`` to ``self.dtype``. z%s is not in any domainr   )ÚZZÚQQÚ	RealFieldÚComplexFieldÚpythonÚmpfÚmpcÚ	is_groundFT)ÚstrictrD   rE   rF   )r   r   rN   Úof_typeÚsympy.polys.domainsrQ   rR   rS   rT   Ú
isinstanceÚintr	   r:   ÚfloatÚcomplexrH   r/   r
   ÚparentÚis_NumericalrG   ÚconvertÚLCr   Ú
from_sympyÚ	TypeErrorÚ
ValueErrorr   r   )r    rI   rJ   rQ   rR   rS   rT   r`   s           r!   rb   ÚDomain.convert“  s­  € ð ÑÜ˜G×$Ñ$Ü$Ð%>ÀÑ%HÓIÐIØ×$Ñ$ WÓ3Ð3à�<‰<˜× Ñ ØˆNä˜× Ñ Ü Ð!:¸WÑ!DÓEÐEçGÓGà�:‰:�g×ÑØ×$Ñ$ WÓ1Ð1ä�gœs×#Ñ#Ø×$Ñ$¡R¨£[°"Ó5Ð5ä˜8Ó#Ü˜'§5¡5×)Ñ)Ø×(Ñ(¨Ó5Ð5Ü˜'§5¡5×)Ñ)Ø×(Ñ(¨Ó5Ð5ä�gœu×%Ñ%Ù“[ˆFØ×$Ñ$¡V¨G£_°fÓ=Ð=ä�gœw×'Ñ'Ù!“^ˆFØ×$Ñ$¡V¨G£_°fÓ=Ð=ä�‹=×!Ñ! UÓ*Ù“[ˆFØ×$Ñ$¡V¨G£_°fÓ=Ð=ä�‹=×!Ñ! UÓ*Ù!“^ˆFØ×$Ñ$¡V¨G£_°fÓ=Ð=ä�gœ}×-Ñ-Ø×$Ñ$ W¯n©nÓ.>Ó?Ð?ð ××¤¨°+¸u×!EÑ!EØ—<‘< §
¡
£Ó-Ð-ä�gœu×%Ñ%ðØ—‘ wÓ/Ð/ô ˜w×'Ñ'ðÜ% g°dÑ;�GÜ! '¬5×1Ñ1Ø#Ÿ™¨wÓ7Ð7ð 2õ
 ÃWÌdÐSZÎmÒ]aÐbÓcÐcøô œzÐ*ó Ùðûô "¤:Ð.ó Ùðús$   ÊL  Ê//L Ì LÌLÌL)Ì(L)c                ó,   • [        XR                  5      $ )z%Check if ``a`` is of type ``dtype``. )r\   r:   )r    rI   s     r!   rZ   ÚDomain.of_typeÖ  s   € ä˜'§7¡7Ó+Ð+r$   c                ót   •  [        U5      (       a  [        eU R                  U5        g! [         a     gf = f)z'Check if ``a`` belongs to this domain. FT)r   r   rb   ©r    Úas     r!   Ú__contains__ÚDomain.__contains__Ú  s:   € ð	Ü˜A�‰Ü$Ð$Ø�L‰L˜ŒOð øô ó 	Ùð	ús   ‚'* ª
7¶7c                ó   • [         e)aÆ  Convert domain element *a* to a SymPy expression (Expr).

Explanation
===========

Convert a :py:class:`~.Domain` element *a* to :py:class:`~.Expr`. Most
public SymPy functions work with objects of type :py:class:`~.Expr`.
The elements of a :py:class:`~.Domain` have a different internal
representation. It is not possible to mix domain elements with
:py:class:`~.Expr` so each domain has :py:meth:`~.Domain.to_sympy` and
:py:meth:`~.Domain.from_sympy` methods to convert its domain elements
to and from :py:class:`~.Expr`.

Parameters
==========

a: domain element
    An element of this :py:class:`~.Domain`.

Returns
=======

expr: Expr
    A normal SymPy expression of type :py:class:`~.Expr`.

Examples
========

Construct an element of the :ref:`QQ` domain and then convert it to
:py:class:`~.Expr`.

>>> from sympy import QQ, Expr
>>> q_domain = QQ(2)
>>> q_domain
2
>>> q_expr = QQ.to_sympy(q_domain)
>>> q_expr
2

Although the printed forms look similar these objects are not of the
same type.

>>> isinstance(q_domain, Expr)
False
>>> isinstance(q_expr, Expr)
True

Construct an element of :ref:`K[x]` and convert to
:py:class:`~.Expr`.

>>> from sympy import Symbol
>>> x = Symbol('x')
>>> K = QQ[x]
>>> x_domain = K.gens[0]  # generator x as a domain element
>>> p_domain = x_domain**2/3 + 1
>>> p_domain
1/3*x**2 + 1
>>> p_expr = K.to_sympy(p_domain)
>>> p_expr
x**2/3 + 1

The :py:meth:`~.Domain.from_sympy` method is used for the opposite
conversion from a normal SymPy expression to a domain element.

>>> p_domain == p_expr
False
>>> K.from_sympy(p_expr) == p_domain
True
>>> K.to_sympy(p_domain) == p_expr
True
>>> K.from_sympy(K.to_sympy(p_domain)) == p_domain
True
>>> K.to_sympy(K.from_sympy(p_expr)) == p_expr
True

The :py:meth:`~.Domain.from_sympy` method makes it easier to construct
domain elements interactively.

>>> from sympy import Symbol
>>> x = Symbol('x')
>>> K = QQ[x]
>>> K.from_sympy(x**2/3 + 1)
1/3*x**2 + 1

See also
========

from_sympy
convert_from
r   rk   s     r!   Úto_sympyÚDomain.to_sympyå  s   € ôv "Ð!r$   c                ó   • [         e)aj  Convert a SymPy expression to an element of this domain.

Explanation
===========

See :py:meth:`~.Domain.to_sympy` for explanation and examples.

Parameters
==========

expr: Expr
    A normal SymPy expression of type :py:class:`~.Expr`.

Returns
=======

a: domain element
    An element of this :py:class:`~.Domain`.

See also
========

to_sympy
convert_from
r   rk   s     r!   rd   ÚDomain.from_sympyB  s
   € ô4 "Ð!r$   c                ó(   • [        XR                  S9$ )N)Ústart)Úsumr   r4   s     r!   rv   Ú
Domain.sum^  s   € Ü�4Ÿy™yÑ)Ð)r$   c                ó   • g©z.Convert ``ModularInteger(int)`` to ``dtype``. N© ©ÚK1rl   ÚK0s      r!   Úfrom_FFÚDomain.from_FFa  ó   € àr$   c                ó   • gry   rz   r{   s      r!   Úfrom_FF_pythonÚDomain.from_FF_pythone  r€   r$   c                ó   • g)z.Convert a Python ``int`` object to ``dtype``. Nrz   r{   s      r!   Úfrom_ZZ_pythonÚDomain.from_ZZ_pythoni  r€   r$   c                ó   • g)z3Convert a Python ``Fraction`` object to ``dtype``. Nrz   r{   s      r!   Úfrom_QQ_pythonÚDomain.from_QQ_pythonm  r€   r$   c                ó   • g)z.Convert ``ModularInteger(mpz)`` to ``dtype``. Nrz   r{   s      r!   Úfrom_FF_gmpyÚDomain.from_FF_gmpyq  r€   r$   c                ó   • g)z,Convert a GMPY ``mpz`` object to ``dtype``. Nrz   r{   s      r!   Úfrom_ZZ_gmpyÚDomain.from_ZZ_gmpyu  r€   r$   c                ó   • g)z,Convert a GMPY ``mpq`` object to ``dtype``. Nrz   r{   s      r!   Úfrom_QQ_gmpyÚDomain.from_QQ_gmpyy  r€   r$   c                ó   • g)z,Convert a real element object to ``dtype``. Nrz   r{   s      r!   Úfrom_RealFieldÚDomain.from_RealField}  r€   r$   c                ó   • g)z(Convert a complex element to ``dtype``. Nrz   r{   s      r!   Úfrom_ComplexFieldÚDomain.from_ComplexField�  r€   r$   c                ó   • g)z*Convert an algebraic number to ``dtype``. Nrz   r{   s      r!   Úfrom_AlgebraicFieldÚDomain.from_AlgebraicField…  r€   r$   c                ór   • UR                   (       a&  U R                  UR                  UR                  5      $ g)ú#Convert a polynomial to ``dtype``. N)rX   rb   rc   Údomr{   s      r!   Úfrom_PolynomialRingÚDomain.from_PolynomialRing‰  s'   € à�;�;Ø—:‘:˜aŸd™d B§F¡FÓ+Ð+ð r$   c                ó   • g)z*Convert a rational function to ``dtype``. Nrz   r{   s      r!   Úfrom_FractionFieldÚDomain.from_FractionFieldŽ  r€   r$   c                óN   • U R                  UR                  UR                  5      $ )z.Convert an ``ExtensionElement`` to ``dtype``. )rN   r   Úringr{   s      r!   Úfrom_MonogenicFiniteExtensionÚ$Domain.from_MonogenicFiniteExtension’  s   € à�‰˜qŸu™u b§g¡gÓ.Ð.r$   c                ó8   • U R                  UR                  5      $ ©z&Convert a ``EX`` object to ``dtype``. )rd   Úexr{   s      r!   Úfrom_ExpressionDomainÚDomain.from_ExpressionDomain–  s   € à�}‰}˜QŸT™TÓ"Ð"r$   c                ó$   • U R                  U5      $ r©   )rd   r{   s      r!   Úfrom_ExpressionRawDomainÚDomain.from_ExpressionRawDomainš  s   € à�}‰}˜QÓÐr$   c                ó€   • UR                  5       S::  a*  U R                  UR                  5       UR                  5      $ g)r�   r   N)Údegreerb   rc   rž   r{   s      r!   Úfrom_GlobalPolynomialRingÚ Domain.from_GlobalPolynomialRingž  s/   € à�8‰8‹:˜‹?Ø—:‘:˜aŸd™d›f b§f¡fÓ-Ð-ð r$   c                ó$   • U R                  X5      $ r   )r¢   r{   s      r!   Úfrom_GeneralizedPolynomialRingÚ%Domain.from_GeneralizedPolynomialRing£  s   € Ø×$Ñ$ QÓ+Ð+r$   c           
     óB  • U R                   (       a&  [        U R                  5      [        U5      -  (       d7  UR                   (       aG  [        UR                  5      [        U5      -  (       a!  [        SU < SU< S[	        U5      < S35      eU R                  U5      $ )NúCannot unify ú with z, given z generators)Úis_CompositeÚsetÚsymbolsr   ÚtupleÚunify)r}   r|   r¼   s      r!   Úunify_with_symbolsÚDomain.unify_with_symbols¦  sf   € Ø�O�O¤ R§Z¡Z£´3°w³<×!?ÀbÇoÇoÔ[^Ð_a×_iÑ_iÓ[jÔmpÐqxÓmy×[yÝ#ÓVXÓZ\Ô^cÐdkÖ^lÐ$mÓnÐnà�x‰x˜‹|Ðr$   c                ó¦  • U R                   (       a  U R                  OU nUR                   (       a  UR                  OUnU R                   (       a  U R                  OSnUR                   (       a  UR                  OSnUR                  U5      n[	        XE5      nU R                   (       a  U R
                  OUR
                  nU R                  (       a  UR                  (       d"  UR                  (       ae  U R                  (       aT  UR                  (       a  UR                  (       d2  UR                  (       a!  UR                  (       a  UR                  5       nU R                   (       a@  UR                   (       a"  U R                  (       d  UR                  (       a  U R                  n	OUR                  n	SSKJn
  Xš:X  a  U	" Xg5      $ U	" XgU5      $ )z2Unify two domains where at least one is composite.rz   r   )ÚGlobalPolynomialRing)rº   rž   r¼   r¾   r   ÚorderÚis_FractionFieldÚis_PolynomialRingÚis_FieldÚhas_assoc_RingÚget_ringr.   Ú&sympy.polys.domains.old_polynomialringrÂ   )r}   r|   Ú	K0_groundÚ	K1_groundÚ
K0_symbolsÚ
K1_symbolsÚdomainr¼   rÃ   ÚclsrÂ   s              r!   Úunify_compositeÚDomain.unify_composite¬  s  € à ŸoŸo�B—F’F°2ˆ	Ø ŸoŸo�B—F’F°2ˆ	à#%§?§?�R—Z’Z¸ˆ
Ø#%§?§?�R—Z’Z¸ˆ
à—‘ Ó+ˆÜ˜jÓ5ˆØŸOŸO�—’°·±ˆð × ×  R×%9×%9Ø× ×  R×%9×%9Ø×$×$¨I×,>×,>ÀFÇOÇOØ×&×&Ø—_‘_Ó&ˆFà�?�? B§O§O°r×7J×7JÈb×Nb×NbØ—,‘,‰Cà—,‘,ˆCõ
 	PØÓ&Ù�vÓ'Ð'á�6 EÓ*Ð*r$   c                ó(	  • Ub  U R                  X5      $ X:X  a  U $ U R                  (       a  UR                  (       dF  U R                  5       UR                  5       :w  a  [        SU < SU< 35      eU R	                  U5      $ U R
                  (       a  U $ UR
                  (       a  U$ U R                  (       a  U $ UR                  (       a  U$ U R                  (       d  UR                  (       a¹  UR                  (       a  XpUR                  (       aN  [        [        U R                  UR                  /5      5      S   U R                  :X  a  XpUR                  U 5      $ UR                  U R                  5      nU R                  R                  U5      nU R                  U5      $ U R                   (       d  UR                   (       a  U R	                  U5      $ UR"                  (       a  XpU R"                  (       aV  UR"                  (       d  UR$                  (       a2  U R&                  UR&                  :¼  a  U $ SSKJn  U" UR&                  S9$ U $ UR$                  (       a  XpU R$                  (       ai  UR$                  (       a  U R&                  UR&                  :¼  a  U $ U$ UR,                  (       d  UR.                  (       a  SSKJn  U" U R&                  S9$ U $ UR0                  (       a  XpU R0                  (       a©  UR,                  (       a  UR3                  5       nUR.                  (       a  UR5                  5       nUR0                  (       aT  U R6                  " U R8                  R                  UR8                  5      /[;        U R<                  UR<                  5      Q76 $ U $ U R.                  (       a  U $ UR.                  (       a  U$ U R,                  (       a#  UR>                  (       a  U R3                  5       n U $ UR,                  (       a#  U R>                  (       a  UR3                  5       nU$ U R>                  (       a  U $ UR>                  (       a  U$ U R@                  (       a  U $ UR@                  (       a  U$ SSK!J"n  U$ )zú
Construct a minimal domain that contains elements of ``K0`` and ``K1``.

Known domains (from smallest to largest):

- ``GF(p)``
- ``ZZ``
- ``QQ``
- ``RR(prec, tol)``
- ``CC(prec, tol)``
- ``ALG(a, b, c)``
- ``K[x, y, z]``
- ``K(x, y, z)``
- ``EX``

r¸   r¹   é   r   )rT   )Úprec)ÚEX)#r¿   Úhas_CharacteristicZeroÚcharacteristicr   rÐ   Úis_EXRAWÚis_EXÚis_FiniteExtensionÚlistr   ÚmodulusÚ
set_domainÚdropÚsymbolrÎ   r¾   rº   Úis_ComplexFieldÚis_RealFieldÚ	precisionÚ sympy.polys.domains.complexfieldrT   Úis_GaussianRingÚis_GaussianFieldÚis_AlgebraicFieldÚ	get_fieldÚas_AlgebraicFieldr.   rž   r   Úorig_extÚis_RationalFieldÚis_IntegerRingr[   rÕ   )r}   r|   r¼   rT   rÕ   s        r!   r¾   ÚDomain.unifyÍ  s3  € ð" ÑØ×(Ñ(¨Ó5Ð5à‹8ØˆIà×)×)¨b×.G×.Gà× Ñ Ó" b×&7Ñ&7Ó&9Ó9Ý'ÃRÊÐ(LÓMÐMð
 ×%Ñ% bÓ)Ð)ð
 �;�;ØˆIØ�;�;ØˆIà�8�8ØˆIØ�8�8ØˆIà× ×  B×$9×$9Ø×$×$Ø�BØ×$×$ô œ §¡¨R¯Z©ZÐ 8Ó9Ó:¸1Ñ=ÀÇÁÓKØ˜Ø—}‘} RÓ(Ð(ð —W‘W˜RŸY™YÓ'�Ø—Y‘Y—_‘_ RÓ(�Ø—}‘} RÓ(Ð(à�?�?˜bŸoŸoØ×%Ñ% bÓ)Ð)à××Ø�Ø××Ø×!×! R§_§_Ø—<‘< 2§<¡<Ó/Ø�IåMÙ'¨R¯\©\Ñ:Ð:à�	à�?�?Ø�Ø�?�?Ø��Ø—<‘< 2§<¡<Ó/Ø�Ià�IØ×#×# r×':×':ÝIÙ#¨¯©Ñ6Ð6à�	à××Ø�Ø××Ø×!×!Ø—\‘\“^�Ø×"×"Ø×)Ñ)Ó+�Ø×#×#Ø—|’| B§F¡F§L¡L°·±Ó$8Ða¼;ÀrÇ{Á{ÐTV×T_ÑT_Ó;`ÒaÐaà�	à××ØˆIØ××ØˆIà××Ø×"×"Ø—\‘\“^�ØˆIØ××Ø×"×"Ø—\‘\“^�ØˆIà××ØˆIØ××ØˆIà××ØˆIØ××ØˆIå*Øˆ	r$   c                ób   • [        U[        5      =(       a    U R                  UR                  :H  $ )z0Returns ``True`` if two domains are equivalent. )r\   r   r   ©r    Úothers     r!   Ú__eq__ÚDomain.__eq__N  s#   € ô ˜%¤Ó(×F¨T¯Z©Z¸5¿;¹;Ñ-FÐFr$   c                ó   • X:X  + $ )z1Returns ``False`` if two domains are equivalent. rz   rî   s     r!   Ú__ne__ÚDomain.__ne__S  s   € àÒ Ð r$   c                ó¸   • / nU HQ  n[        U[        5      (       a"  UR                  U R                  U5      5        M:  UR                  U " U5      5        MS     U$ )z5Rersively apply ``self`` to all elements of ``seq``. )r\   rÛ   ÚappendÚmap)r    ÚseqrM   Úelts       r!   r÷   Ú
Domain.mapW  sI   € àˆãˆCÜ˜#œt×$Ñ$Ø—‘˜dŸh™h s›mÖ,à—‘™d 3›iÖ(ñ	 ð ˆr$   c                ó   • [        SU -  5      e)z)Returns a ring associated with ``self``. z#there is no ring associated with %s©r   r   s    r!   rÈ   ÚDomain.get_ringc  s   € äÐ?À$ÑFÓGÐGr$   c                ó   • [        SU -  5      e)z*Returns a field associated with ``self``. z$there is no field associated with %srü   r   s    r!   rç   ÚDomain.get_fieldg  s   € äÐ@À4ÑGÓHÐHr$   c                ó   • U $ )z2Returns an exact domain associated with ``self``. rz   r   s    r!   Ú	get_exactÚDomain.get_exactk  s   € àˆr$   c                ód   • [        US5      (       a  U R                  " U6 $ U R                  U5      $ )z0The mathematical way to make a polynomial ring. Ú__iter__)ÚhasattrÚ	poly_ring©r    r¼   s     r!   Ú__getitem__ÚDomain.__getitem__o  s-   € ä�7˜J×'Ñ'Ø—>’> 7Ð+Ð+à—>‘> 'Ó*Ð*r$   )rÃ   c               ó    • SSK Jn  U" XU5      $ ©z(Returns a polynomial ring, i.e. `K[X]`. r   )ÚPolynomialRing)Ú"sympy.polys.domains.polynomialringr  )r    rÃ   r¼   r  s       r!   r  ÚDomain.poly_ringv  s   € åEÙ˜d¨UÓ3Ð3r$   c               ó    • SSK Jn  U" XU5      $ ©z'Returns a fraction field, i.e. `K(X)`. r   )ÚFractionField)Ú!sympy.polys.domains.fractionfieldr  )r    rÃ   r¼   r  s       r!   Ú
frac_fieldÚDomain.frac_field{  s   € åCÙ˜T¨EÓ2Ð2r$   c                ó&   • SSK Jn  U" U /UQ70 UD6$ r  )rÉ   r  )r    r¼   Úkwargsr  s       r!   Úold_poly_ringÚDomain.old_poly_ring€  s   € åIÙ˜dÐ7 WÒ7°Ñ7Ð7r$   c                ó&   • SSK Jn  U" U /UQ70 UD6$ r  )Ú%sympy.polys.domains.old_fractionfieldr  )r    r¼   r  r  s       r!   Úold_frac_fieldÚDomain.old_frac_field…  s   € åGÙ˜TÐ6 GÒ6¨vÑ6Ð6r$   ©r   c               ó   • [        SU -  5      e)z6Returns an algebraic field, i.e. `K(\alpha, \ldots)`. z%Cannot create algebraic field over %srü   )r    r   Ú	extensions      r!   Úalgebraic_fieldÚDomain.algebraic_fieldŠ  s   € äÐAÀDÑHÓIÐIr$   c                óN   • SSK Jn  U" X5      n[        XRS9nU R                  XbS9$ )aÿ  
Convenience method to construct an algebraic extension on a root of a
polynomial, chosen by root index.

Parameters
==========

poly : :py:class:`~.Poly`
    The polynomial whose root generates the extension.
alias : str, optional (default=None)
    Symbol name for the generator of the extension.
    E.g. "alpha" or "theta".
root_index : int, optional (default=-1)
    Specifies which root of the polynomial is desired. The ordering is
    as defined by the :py:class:`~.ComplexRootOf` class. The default of
    ``-1`` selects the most natural choice in the common cases of
    quadratic and cyclotomic fields (the square root on the positive
    real or imaginary axis, resp. $\mathrm{e}^{2\pi i/n}$).

Examples
========

>>> from sympy import QQ, Poly
>>> from sympy.abc import x
>>> f = Poly(x**2 - 2)
>>> K = QQ.alg_field_from_poly(f)
>>> K.ext.minpoly == f
True
>>> g = Poly(8*x**3 - 6*x - 1)
>>> L = QQ.alg_field_from_poly(g, "alpha")
>>> L.ext.minpoly == g
True
>>> L.to_sympy(L([1, 1, 1]))
alpha**2 + alpha + 1

r   )ÚCRootOfr  )Úsympy.polys.rootoftoolsr#  r   r   )r    Úpolyr   Ú
root_indexr#  ÚrootÚalphas          r!   Úalg_field_from_polyÚDomain.alg_field_from_polyŽ  s0   € õJ 	4Ù�tÓ(ˆÜ Ñ2ˆØ×#Ñ# EÐ#Ð7Ð7r$   c                óf   • SSK Jn  U(       a  U[        U5      -  nU R                  U" X5      UUS9$ )aº  
Convenience method to construct a cyclotomic field.

Parameters
==========

n : int
    Construct the nth cyclotomic field.
ss : boolean, optional (default=False)
    If True, append *n* as a subscript on the alias string.
alias : str, optional (default="zeta")
    Symbol name for the generator.
gen : :py:class:`~.Symbol`, optional (default=None)
    Desired variable for the cyclotomic polynomial that defines the
    field. If ``None``, a dummy variable will be used.
root_index : int, optional (default=-1)
    Specifies which root of the polynomial is desired. The ordering is
    as defined by the :py:class:`~.ComplexRootOf` class. The default of
    ``-1`` selects the root $\mathrm{e}^{2\pi i/n}$.

Examples
========

>>> from sympy import QQ, latex
>>> K = QQ.cyclotomic_field(5)
>>> K.to_sympy(K([-1, 1]))
1 - zeta
>>> L = QQ.cyclotomic_field(7, True)
>>> a = L.to_sympy(L([-1, 1]))
>>> print(a)
1 - zeta7
>>> print(latex(a))
1 - \zeta_{7}

r   )Úcyclotomic_poly)r   r&  )Úsympy.polys.specialpolysr,  r)   r)  )r    ÚnÚssr   Úgenr&  r,  s          r!   Úcyclotomic_fieldÚDomain.cyclotomic_field¸  s<   € õH 	=ÞØ”S˜“V‰OˆEØ×'Ñ'©¸Ó(?ÀuØ3=ð (ð ?ð 	?r$   c                ó   • [         e)z$Inject generators into this domain. r   r  s     r!   ÚinjectÚDomain.injectâ  ó   € ä!Ð!r$   c                ó4   • U R                   (       a  U $ [        e)z"Drop generators from this domain. )Ú	is_Simpler   r  s     r!   rÞ   ÚDomain.dropæ  s   € à�>�>ØˆKÜ!Ð!r$   c                ó   • U(       + $ )zReturns True if ``a`` is zero. rz   rk   s     r!   Úis_zeroÚDomain.is_zeroì  s	   € àŒuˆr$   c                ó   • XR                   :H  $ )zReturns True if ``a`` is one. )r   rk   s     r!   Úis_oneÚDomain.is_oneð  s   € à—H‘H‰}Ðr$   c                ó   • US:„  $ )z#Returns True if ``a`` is positive. r   rz   rk   s     r!   Úis_positiveÚDomain.is_positiveô  ó   € à�1‰uˆr$   c                ó   • US:  $ )z#Returns True if ``a`` is negative. r   rz   rk   s     r!   Úis_negativeÚDomain.is_negativeø  rC  r$   c                ó   • US:*  $ )z'Returns True if ``a`` is non-positive. r   rz   rk   s     r!   Úis_nonpositiveÚDomain.is_nonpositiveü  ó   € à�A‰vˆr$   c                ó   • US:¬  $ )z'Returns True if ``a`` is non-negative. r   rz   rk   s     r!   Úis_nonnegativeÚDomain.is_nonnegative   rJ  r$   c                ó`   • U R                  U5      (       a  U R                  * $ U R                  $ r   )rE  r   rk   s     r!   Úcanonical_unitÚDomain.canonical_unit  s(   € Ø×Ñ˜A×ÑØ—H‘H�9Ðà—8‘8ˆOr$   c                ó   • [        U5      $ )z.Absolute value of ``a``, implies ``__abs__``. )Úabsrk   s     r!   rR  Ú
Domain.abs
  s   € ä�1‹vˆr$   c                ó   • U* $ )z,Returns ``a`` negated, implies ``__neg__``. rz   rk   s     r!   ÚnegÚ
Domain.neg  ó	   € àˆrˆ	r$   c                ó   • U7$ )z-Returns ``a`` positive, implies ``__pos__``. rz   rk   s     r!   ÚposÚ
Domain.pos  rW  r$   c                ó
   • X-   $ )z.Sum of ``a`` and ``b``, implies ``__add__``.  rz   ©r    rl   Úbs      r!   ÚaddÚ
Domain.add  ó	   € à‰uˆr$   c                ó
   • X-
  $ )z5Difference of ``a`` and ``b``, implies ``__sub__``.  rz   r\  s      r!   ÚsubÚ
Domain.sub  r`  r$   c                ó
   • X-  $ )z2Product of ``a`` and ``b``, implies ``__mul__``.  rz   r\  s      r!   ÚmulÚ
Domain.mul  r`  r$   c                ó
   • X-  $ )z2Raise ``a`` to power ``b``, implies ``__pow__``.  rz   r\  s      r!   ÚpowÚ
Domain.pow"  ó	   € à‰vˆr$   c                ó   • [         e)a  Exact quotient of *a* and *b*. Analogue of ``a / b``.

Explanation
===========

This is essentially the same as ``a / b`` except that an error will be
raised if the division is inexact (if there is any remainder) and the
result will always be a domain element. When working in a
:py:class:`~.Domain` that is not a :py:class:`~.Field` (e.g. :ref:`ZZ`
or :ref:`K[x]`) ``exquo`` should be used instead of ``/``.

The key invariant is that if ``q = K.exquo(a, b)`` (and ``exquo`` does
not raise an exception) then ``a == b*q``.

Examples
========

We can use ``K.exquo`` instead of ``/`` for exact division.

>>> from sympy import ZZ
>>> ZZ.exquo(ZZ(4), ZZ(2))
2
>>> ZZ.exquo(ZZ(5), ZZ(2))
Traceback (most recent call last):
    ...
ExactQuotientFailed: 2 does not divide 5 in ZZ

Over a :py:class:`~.Field` such as :ref:`QQ`, division (with nonzero
divisor) is always exact so in that case ``/`` can be used instead of
:py:meth:`~.Domain.exquo`.

>>> from sympy import QQ
>>> QQ.exquo(QQ(5), QQ(2))
5/2
>>> QQ(5) / QQ(2)
5/2

Parameters
==========

a: domain element
    The dividend
b: domain element
    The divisor

Returns
=======

q: domain element
    The exact quotient

Raises
======

ExactQuotientFailed: if exact division is not possible.
ZeroDivisionError: when the divisor is zero.

See also
========

quo: Analogue of ``a // b``
rem: Analogue of ``a % b``
div: Analogue of ``divmod(a, b)``

Notes
=====

Since the default :py:attr:`~.Domain.dtype` for :ref:`ZZ` is ``int``
(or ``mpz``) division as ``a / b`` should not be used as it would give
a ``float`` which is not a domain element.

>>> ZZ(4) / ZZ(2) # doctest: +SKIP
2.0
>>> ZZ(5) / ZZ(2) # doctest: +SKIP
2.5

On the other hand with `SYMPY_GROUND_TYPES=flint` elements of :ref:`ZZ`
are ``flint.fmpz`` and division would raise an exception:

>>> ZZ(4) / ZZ(2) # doctest: +SKIP
Traceback (most recent call last):
...
TypeError: unsupported operand type(s) for /: 'fmpz' and 'fmpz'

Using ``/`` with :ref:`ZZ` will lead to incorrect results so
:py:meth:`~.Domain.exquo` should be used instead.

r   r\  s      r!   ÚexquoÚDomain.exquo&  s   € ôr "Ð!r$   c                ó   • [         e)a  Quotient of *a* and *b*. Analogue of ``a // b``.

``K.quo(a, b)`` is equivalent to ``K.div(a, b)[0]``. See
:py:meth:`~.Domain.div` for more explanation.

See also
========

rem: Analogue of ``a % b``
div: Analogue of ``divmod(a, b)``
exquo: Analogue of ``a / b``
r   r\  s      r!   ÚquoÚ
Domain.quo�  ó
   € ô "Ð!r$   c                ó   • [         e)a  Modulo division of *a* and *b*. Analogue of ``a % b``.

``K.rem(a, b)`` is equivalent to ``K.div(a, b)[1]``. See
:py:meth:`~.Domain.div` for more explanation.

See also
========

quo: Analogue of ``a // b``
div: Analogue of ``divmod(a, b)``
exquo: Analogue of ``a / b``
r   r\  s      r!   ÚremÚ
Domain.rem�  rq  r$   c                ó   • [         e)a{  Quotient and remainder for *a* and *b*. Analogue of ``divmod(a, b)``

Explanation
===========

This is essentially the same as ``divmod(a, b)`` except that is more
consistent when working over some :py:class:`~.Field` domains such as
:ref:`QQ`. When working over an arbitrary :py:class:`~.Domain` the
:py:meth:`~.Domain.div` method should be used instead of ``divmod``.

The key invariant is that if ``q, r = K.div(a, b)`` then
``a == b*q + r``.

The result of ``K.div(a, b)`` is the same as the tuple
``(K.quo(a, b), K.rem(a, b))`` except that if both quotient and
remainder are needed then it is more efficient to use
:py:meth:`~.Domain.div`.

Examples
========

We can use ``K.div`` instead of ``divmod`` for floor division and
remainder.

>>> from sympy import ZZ, QQ
>>> ZZ.div(ZZ(5), ZZ(2))
(2, 1)

If ``K`` is a :py:class:`~.Field` then the division is always exact
with a remainder of :py:attr:`~.Domain.zero`.

>>> QQ.div(QQ(5), QQ(2))
(5/2, 0)

Parameters
==========

a: domain element
    The dividend
b: domain element
    The divisor

Returns
=======

(q, r): tuple of domain elements
    The quotient and remainder

Raises
======

ZeroDivisionError: when the divisor is zero.

See also
========

quo: Analogue of ``a // b``
rem: Analogue of ``a % b``
exquo: Analogue of ``a / b``

Notes
=====

If ``gmpy`` is installed then the ``gmpy.mpq`` type will be used as
the :py:attr:`~.Domain.dtype` for :ref:`QQ`. The ``gmpy.mpq`` type
defines ``divmod`` in a way that is undesirable so
:py:meth:`~.Domain.div` should be used instead of ``divmod``.

>>> a = QQ(1)
>>> b = QQ(3, 2)
>>> a               # doctest: +SKIP
mpq(1,1)
>>> b               # doctest: +SKIP
mpq(3,2)
>>> divmod(a, b)    # doctest: +SKIP
(mpz(0), mpq(1,1))
>>> QQ.div(a, b)    # doctest: +SKIP
(mpq(2,3), mpq(0,1))

Using ``//`` or ``%`` with :ref:`QQ` will lead to incorrect results so
:py:meth:`~.Domain.div` should be used instead.

r   r\  s      r!   ÚdivÚ
Domain.divŸ  s   € ôh "Ð!r$   c                ó   • [         e)z5Returns inversion of ``a mod b``, implies something. r   r\  s      r!   ÚinvertÚDomain.invertõ  r6  r$   c                ó   • [         e)z!Returns ``a**(-1)`` if possible. r   rk   s     r!   ÚrevertÚDomain.revertù  r6  r$   c                ó   • [         e)zReturns numerator of ``a``. r   rk   s     r!   ÚnumerÚDomain.numerý  r6  r$   c                ó   • [         e)zReturns denominator of ``a``. r   rk   s     r!   ÚdenomÚDomain.denom  r6  r$   c                ó0   • U R                  X5      u  p4nX54$ )z&Half extended GCD of ``a`` and ``b``. )Úgcdex)r    rl   r]  ÚsÚtÚhs         r!   Ú
half_gcdexÚDomain.half_gcdex  s   € à—*‘*˜QÓ"‰ˆˆaØˆtˆr$   c                ó   • [         e)z!Extended GCD of ``a`` and ``b``. r   r\  s      r!   r…  ÚDomain.gcdex
  r6  r$   c                óp   • U R                  X5      nU R                  X5      nU R                  X#5      nX4U4$ )z.Returns GCD and cofactors of ``a`` and ``b``. )Úgcdro  )r    rl   r]  rŽ  ÚcfaÚcfbs         r!   Ú	cofactorsÚDomain.cofactors  s5   € à�h‰h�q‹nˆØ�h‰h�qÓˆØ�h‰h�qÓˆØ˜ˆ}Ðr$   c                ó   • [         e)z Returns GCD of ``a`` and ``b``. r   r\  s      r!   rŽ  Ú
Domain.gcd  r6  r$   c                ó   • [         e)z Returns LCM of ``a`` and ``b``. r   r\  s      r!   ÚlcmÚ
Domain.lcm  r6  r$   c                ó   • [         e)z#Returns b-base logarithm of ``a``. r   r\  s      r!   ÚlogÚ
Domain.log  r6  r$   c                ó   • [         e)a  Returns a (possibly inexact) square root of ``a``.

Explanation
===========
There is no universal definition of "inexact square root" for all
domains. It is not recommended to implement this method for domains
other then :ref:`ZZ`.

See also
========
exsqrt
r   rk   s     r!   ÚsqrtÚDomain.sqrt!  rq  r$   c                ó   • [         e)a>  Returns whether ``a`` is a square in the domain.

Explanation
===========
Returns ``True`` if there is an element ``b`` in the domain such that
``b * b == a``, otherwise returns ``False``. For inexact domains like
:ref:`RR` and :ref:`CC`, a tiny difference in this equality can be
tolerated.

See also
========
exsqrt
r   rk   s     r!   Ú	is_squareÚDomain.is_square0  s
   € ô "Ð!r$   c                ó   • [         e)aÏ  Principal square root of a within the domain if ``a`` is square.

Explanation
===========
The implementation of this method should return an element ``b`` in the
domain such that ``b * b == a``, or ``None`` if there is no such ``b``.
For inexact domains like :ref:`RR` and :ref:`CC`, a tiny difference in
this equality can be tolerated. The choice of a "principal" square root
should follow a consistent rule whenever possible.

See also
========
sqrt, is_square
r   rk   s     r!   ÚexsqrtÚDomain.exsqrt@  s
   € ô "Ð!r$   c                óF   • U R                  U5      R                  " U40 UD6$ )z*Returns numerical approximation of ``a``. )rp   Úevalf)r    rl   rÔ   Úoptionss       r!   r¥  ÚDomain.evalfQ  s!   € à�}‰}˜QÓ×%Ò% dÑ6¨gÑ6Ð6r$   c                ó   • U$ r   rz   rk   s     r!   ÚrealÚDomain.realW  s   € Øˆr$   c                ó   • U R                   $ r   )r   rk   s     r!   ÚimagÚDomain.imagZ  s   € Ø�y‰yÐr$   c                ó
   • X:H  $ )z+Check if ``a`` and ``b`` are almost equal. rz   )r    rl   r]  Ú	tolerances       r!   ÚalmosteqÚDomain.almosteq]  rj  r$   c                ó   • [        S5      e)z*Return the characteristic of this domain. zcharacteristic()r   r   s    r!   r×   ÚDomain.characteristica  s   € ä!Ð"4Ó5Ð5r$   rz   r   )Néÿÿÿÿ)FÚzetaNr´  )‰r/   Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   Ú__annotations__r   r   Úis_RingrÆ   rÇ   Úhas_assoc_FieldÚis_FiniteFieldÚis_FFrë   Úis_ZZrê   Úis_QQrä   Úis_ZZ_Irå   Úis_QQ_Irá   Úis_RRrà   Úis_CCræ   Úis_AlgebraicrÅ   Úis_PolyrÄ   Úis_FracÚis_SymbolicDomainrÙ   Úis_SymbolicRawDomainrØ   rÚ   Úis_Exactra   r8  rº   Úis_PIDrÖ   r   r   r"   r&   r*   r0   r6   Úpropertyr:   r=   r@   rN   rb   rZ   rm   rp   rd   rv   r~   r‚   r…   rˆ   r‹   rŽ   r‘   r”   r—   rš   rŸ   r¢   r¦   r«   r®   r²   rµ   r¿   rÐ   r¾   rð   ró   r÷   rÈ   rç   r  r  r   r  r  r  r  r   r)  r1  r4  rÞ   r;  r>  rA  rE  rH  rL  rO  rR  rU  rY  r^  rb  re  rh  rl  ro  rs  rv  ry  r|  r  r‚  r‰  r…  r‘  rŽ  r–  r™  rœ  rŸ  r¢  r¥  r.  r©  r¬  r°  r×   Ú__static_attributes__rz   r$   r!   r   r      s  ‡ ñhðT €Eˆ;Óðð, €Dˆ#Óðð €CˆƒOðð €Gðð$ €Hðð" €Nðð  €Oðð  #Ð"€N�UØ"Ð"€N�UØ$Ð$Ð�uØ %Ð%€O�gØ!&Ð&Ð�wØ Ð €L�5Ø#Ð#€O�eØ',Ð,Ð˜Ø"'Ð'Ð˜Ø!&Ð&Ð�wØ %Ð%Ð˜Ø&+Ð+Ð˜8ØÐà€HØ€Là€IØ€Là€Fðð" #Ðà€CˆÓØ€Eˆ:Óò"òòò;ò!ð ñó ðòò!òrô"AdòF,ò	ò["òz"ò8*òòòòòòòòòòò,ò
ò/ò#ò ò.ò
,òò+ôBòBGò
!ò
òHòIòò+ð ),õ 4ð
 *-õ 3ò
8ò
7ð
 15õ Jô(8ôT(?òT"ò"òòòòòòòòòòòòòòòY"òv"ò"òT"òl"ò"ò"ò"òò
"òò"ò"ò"ò"ò"ò "ô"7ð 	€Aòòôõ6r$   r   N)r¹  Ú
__future__r   Útypingr   Úsympy.core.numbersr   Ú
sympy.corer   r   Úsympy.core.sortingr   Úsympy.external.gmpyr	   Ú!sympy.polys.domains.domainelementr
   Úsympy.polys.orderingsr   Úsympy.polys.polyerrorsr   r   r   Úsympy.polys.polyutilsr   r   Úsympy.utilitiesr   Úsympy.utilities.iterablesr   r   Ú__all__rz   r$   r!   Ú<module>rÛ     sU   ðÙ /å "Ý å .ß %Ý &Ý ,Ý ;Ý %ß QÑ Qß ;Ý "Ý 1ð ÷P6ð P6ó ðP6ðf* ˆ*�r$   