Ë
    7^(h’Ÿ  ã                  óÌ   — d Z ddlmZ ddlmZ ddlmZ ddlmZm	Z	 ddl
mZ ddlmZ ddlmZ dd	lmZ dd
lmZmZmZ ddlmZmZ ddlmZ ddlmZ e G d„ d«      «       ZdgZy)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                  ó*  — e Zd ZU dZdZded<   	 dZded<   	 dZded<   	 dZ	 dZ		 dZ
	 dZ	 dxZZdxZZdxZZdxZZdxZZdxZZdxZZdxZZdxZZdxZZdxZ Z!dxZ"Z#dZ$d	Z%dZ&dZ'dZ(dZ)	 dZ*dZ+d
ed<   dZ,d
ed<   d„ Z-d„ Z.d„ Z/d„ Z0d„ Z1e2d„ «       Z3d„ Z4d„ Z5d„ Z6dfd„Z7d„ Z8d„ Z9d„ Z:d„ Z;d„ Z<d„ Z=d„ Z>d„ Z?d„ Z@d „ ZAd!„ ZBd"„ ZCd#„ ZDd$„ ZEd%„ ZFd&„ ZGd'„ ZHd(„ ZId)„ ZJd*„ ZKd+„ ZLd,„ ZMd-„ ZNd.„ ZOdfd/„ZPd0„ ZQd1„ ZRd2„ ZSd3„ ZTd4„ ZUd5„ ZVd6„ ZWeXd7œd8„ZYeXd7œd9„ZZd:„ Z[d;„ Z\dd<œd=„Z]dgd>„Z^dhd?„Z_d@„ Z`dA„ ZadB„ ZbdC„ ZcdD„ ZddE„ ZedF„ ZfdG„ ZgdH„ ZhdI„ ZidJ„ ZjdK„ ZkdL„ ZldM„ ZmdN„ ZndO„ ZodP„ ZpdQ„ ZqdR„ ZrdS„ ZsdT„ ZtdU„ ZudV„ ZvdW„ ZwdX„ ZxdY„ ZydZ„ Zzd[„ Z{d\„ Z|d]„ Z}d^„ Z~d_„ Zd`„ Z€dfda„Z�e�Z‚db„ Zƒdc„ Z„dfdd„Z…de„ Z†y)iÚDomainar  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                ó   — t         ‚©N©ÚNotImplementedError©Úselfs    úX/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/sympy/polys/domains/domain.pyÚ__init__zDomain.__init__g  s   € Ü!Ð!ó    c                ó   — | j                   S r   )r   r   s    r    Ú__str__zDomain.__str__j  s   € Ø�x‰xˆr"   c                ó   — t        | «      S r   )Ústrr   s    r    Ú__repr__zDomain.__repr__m  s   € Ü�4‹yÐr"   c                óX   — t        | j                  j                  | j                  f«      S r   )ÚhashÚ	__class__Ú__name__r   r   s    r    Ú__hash__zDomain.__hash__p  s    € Ü�T—^‘^×,Ñ,¨d¯j©jÐ9Ó:Ð:r"   c                ó    —  | j                   |Ž S r   ©r   ©r   Úargss     r    Únewz
Domain.news  ó   € Øˆt�z‰z˜4Ð Ð r"   c                ó   — | j                   S )z#Alias for :py:attr:`~.Domain.dtype`r.   r   s    r    Útpz	Domain.tpv  s   € ð �z‰zÐr"   c                ó    —  | j                   |Ž S )z7Construct an element of ``self`` domain from ``args``. )r1   r/   s     r    Ú__call__zDomain.__call__{  s   € àˆt�x‰x˜ˆÐr"   c                ó    —  | j                   |Ž S r   r.   r/   s     r    ÚnormalzDomain.normal  r2   r"   c           
     óâ   — |j                   �d|j                   z   }nd|j                  j                  z   }t        | |«      }|� |||«      }|�|S t	        d|›dt        |«      ›d|›d| ›�«      ‚)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_fromzDomain.convert_from‚  st   € à�:‰:Ð!Ø˜tŸz™zÑ)‰Fà˜tŸ~™~×6Ñ6Ñ6ˆFä˜4 Ó(ˆàÐÙ˜g tÓ,ˆFàÐ!Ø�åÊWÔVZÐ[bÕVcÒeiÑkoÐpÓqÐqr"   c                óÄ  — |�+t        |«      rt        d|z  «      ‚| j                  ||«      S | j                  |«      r|S t        |«      rt        d|z  «      ‚ddlm}m}m}m} |j                  |«      r| j                  ||«      S t        |t        «      r| j                   ||«      |«      S t        dk7  rPt        ||j                  «      r| j                  ||«      S t        ||j                  «      r| j                  ||«      S t        |t        «      r |«       }| j                   ||«      |«      S t        |t        «      r |«       }| j                   ||«      |«      S t        |«      j                   dk(  r |«       }| j                   ||«      |«      S t        |«      j                   dk(  r |«       }| j                   ||«      |«      S t        |t"        «      r | j                  ||j%                  «       «      S | j&                  r,t)        |dd«      r| j+                  |j-                  «       «      S t        |t.        «      r	 | j1                  |«      S t7        |«      s0	 t9        |d	¬
«      }t        |t.        «      r| j1                  |«      S 	 t        d|›dt        |«      ›d| ›�«      ‚# t2        t4        f$ r Y Œ.w xY w# t2        t4        f$ r Y ŒCw xY w)z'Convert ``element`` to ``self.dtype``. z%s is not in any domainr   )ÚZZÚQQÚ	RealFieldÚComplexFieldÚpythonÚmpfÚmpcÚ	is_groundFT)Ústrictr;   r<   r=   )r   r   rE   Úof_typeÚsympy.polys.domainsrG   rH   rI   rJ   Ú
isinstanceÚintr	   r4   ÚfloatÚcomplexr?   r+   r
   ÚparentÚis_Numericalr>   ÚconvertÚLCr   Ú
from_sympyÚ	TypeErrorÚ
ValueErrorr   r   )r   r@   rA   rG   rH   rI   rJ   rV   s           r    rX   zDomain.convert“  s‘  € ð ÐÜ˜GÔ$Ü$Ð%>ÀÑ%HÓIÐIØ×$Ñ$ W¨dÓ3Ð3à�<‰<˜Ô ØˆNä˜Ô Ü Ð!:¸WÑ!DÓEÐEçGÓGà�:‰:�gÔØ×$Ñ$ W¨bÓ1Ð1ä�gœsÔ#Ø×$Ñ$¡R¨£[°"Ó5Ð5ä˜8Ò#Ü˜' 2§5¡5Ô)Ø×(Ñ(¨°"Ó5Ð5Ü˜' 2§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¨g¯n©nÓ.>Ó?Ð?ð ×Ò¤¨°+¸uÔ!EØ—<‘< §
¡
£Ó-Ð-ä�gœuÔ%ðØ—‘ wÓ/Ð/ô ˜wÔ'ðÜ% g°dÔ;�GÜ! '¬5Ô1Ø#Ÿ™¨wÓ7Ð7ð 2õ
 ÂWÌdÐSZÍmÑ]aÐbÓcÐcøô œzÐ*ò Ùðûô "¤:Ð.ò Ùðús$   ÉJ8 É,-K Ê8K
Ë	K
ËKËKc                ó.   — t        || j                  «      S )z%Check if ``a`` is of type ``dtype``. )rR   r4   )r   r@   s     r    rP   zDomain.of_typeÖ  s   € ä˜' 4§7¡7Ó+Ð+r"   c                óh   — 	 t        |«      rt        ‚| j                  |«       y# t        $ r Y yw xY w)z'Check if ``a`` belongs to this domain. FT)r   r   rX   ©r   Úas     r    Ú__contains__zDomain.__contains__Ú  s8   € ð	Ü˜AŒÜ$Ð$Ø�L‰L˜ŒOð øô ò 	Ùð	ús   ‚"% ¥	1°1c                ó   — t         ‚)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   r_   s     r    Úto_sympyzDomain.to_sympyå  s   € ôv "Ð!r"   c                ó   — t         ‚)aê  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   r_   s     r    rZ   zDomain.from_sympyB  s
   € ô4 "Ð!r"   c                ó0   — t        || j                  ¬«      S )N)Ústart)Úsumr   r/   s     r    rg   z
Domain.sum^  s   € Ü�4˜tŸy™yÔ)Ð)r"   c                 ó   — y©z.Convert ``ModularInteger(int)`` to ``dtype``. N© ©ÚK1r`   ÚK0s      r    Úfrom_FFzDomain.from_FFa  ó   € àr"   c                 ó   — yri   rj   rk   s      r    Úfrom_FF_pythonzDomain.from_FF_pythone  ro   r"   c                 ó   — y)z.Convert a Python ``int`` object to ``dtype``. Nrj   rk   s      r    Úfrom_ZZ_pythonzDomain.from_ZZ_pythoni  ro   r"   c                 ó   — y)z3Convert a Python ``Fraction`` object to ``dtype``. Nrj   rk   s      r    Úfrom_QQ_pythonzDomain.from_QQ_pythonm  ro   r"   c                 ó   — y)z.Convert ``ModularInteger(mpz)`` to ``dtype``. Nrj   rk   s      r    Úfrom_FF_gmpyzDomain.from_FF_gmpyq  ro   r"   c                 ó   — y)z,Convert a GMPY ``mpz`` object to ``dtype``. Nrj   rk   s      r    Úfrom_ZZ_gmpyzDomain.from_ZZ_gmpyu  ro   r"   c                 ó   — y)z,Convert a GMPY ``mpq`` object to ``dtype``. Nrj   rk   s      r    Úfrom_QQ_gmpyzDomain.from_QQ_gmpyy  ro   r"   c                 ó   — y)z,Convert a real element object to ``dtype``. Nrj   rk   s      r    Úfrom_RealFieldzDomain.from_RealField}  ro   r"   c                 ó   — y)z(Convert a complex element to ``dtype``. Nrj   rk   s      r    Úfrom_ComplexFieldzDomain.from_ComplexField�  ro   r"   c                 ó   — y)z*Convert an algebraic number to ``dtype``. Nrj   rk   s      r    Úfrom_AlgebraicFieldzDomain.from_AlgebraicField…  ro   r"   c                óh   — |j                   r&| j                  |j                  |j                  «      S y)ú#Convert a polynomial to ``dtype``. N)rN   rX   rY   Údomrk   s      r    Úfrom_PolynomialRingzDomain.from_PolynomialRing‰  s'   € à�;Š;Ø—:‘:˜aŸd™d B§F¡FÓ+Ð+ð r"   c                 ó   — y)z*Convert a rational function to ``dtype``. Nrj   rk   s      r    Úfrom_FractionFieldzDomain.from_FractionFieldŽ  ro   r"   c                óN   — | j                  |j                  |j                  «      S )z.Convert an ``ExtensionElement`` to ``dtype``. )rE   r   Úringrk   s      r    Úfrom_MonogenicFiniteExtensionz$Domain.from_MonogenicFiniteExtension’  s   € à�‰˜qŸu™u b§g¡gÓ.Ð.r"   c                ó8   — | j                  |j                  «      S ©z&Convert a ``EX`` object to ``dtype``. )rZ   Úexrk   s      r    Úfrom_ExpressionDomainzDomain.from_ExpressionDomain–  s   € à�}‰}˜QŸT™TÓ"Ð"r"   c                ó$   — | j                  |«      S rŒ   )rZ   rk   s      r    Úfrom_ExpressionRawDomainzDomain.from_ExpressionRawDomainš  s   € à�}‰}˜QÓÐr"   c                ó~   — |j                  «       dk  r*| j                  |j                  «       |j                  «      S y)rƒ   r   N)ÚdegreerX   rY   r„   rk   s      r    Úfrom_GlobalPolynomialRingz Domain.from_GlobalPolynomialRingž  s/   € à�8‰8‹:˜Š?Ø—:‘:˜aŸd™d›f b§f¡fÓ-Ð-ð r"   c                ó&   — | j                  ||«      S r   )r‡   rk   s      r    Úfrom_GeneralizedPolynomialRingz%Domain.from_GeneralizedPolynomialRing£  s   € Ø×$Ñ$ Q¨Ó+Ð+r"   c           
     ó  — | j                   r!t        | j                  «      t        |«      z  s-|j                   r?t        |j                  «      t        |«      z  rt        d| ›d|›dt	        |«      ›d�«      ‚| j                  |«      S )NúCannot unify ú with z, given z generators)Úis_CompositeÚsetÚsymbolsr   ÚtupleÚunify)rm   rl   r›   s      r    Úunify_with_symbolsz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                ó  — | j                   r| j                  n| }|j                   r|j                  n|}| j                   r| j                  nd}|j                   r|j                  nd}|j                  |«      }t	        ||«      }| j                   r| j
                  n|j
                  }| j                  r|j                  s|j                  rL| j                  r@|j                  r|j                  s(|j                  r|j                  r|j                  «       }| j                   r1|j                   r| j                  s|j                  r| j                  }	n|j                  }	ddlm}
 |	|
k(  r	 |	||«      S  |	|||«      S )z2Unify two domains where at least one is composite.rj   r   )ÚGlobalPolynomialRing)r™   r„   r›   r�   r   ÚorderÚis_FractionFieldÚis_PolynomialRingÚis_FieldÚhas_assoc_RingÚget_ringr*   Ú&sympy.polys.domains.old_polynomialringr    )rm   rl   Ú	K0_groundÚ	K1_groundÚ
K0_symbolsÚ
K1_symbolsÚdomainr›   r¡   Úclsr    s              r    Úunify_compositez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˜wÓ'Ð'á�6˜7 EÓ*Ð*r"   c                óÔ  — |�| j                  ||«      S | |k(  r| S | j                  r|j                  sC| j                  «       |j                  «       k7  rt        d| ›d|›�«      ‚| j	                  |«      S | j
                  r| S |j
                  r|S | j                  r| S |j                  r|S | j                  s|j                  r²|j                  r|| }} |j                  rOt        t        | j                  |j                  g«      «      d   | j                  k(  r|| }} |j                  | «      S |j                  | j                  «      }| j                  j                  |«      }| j                  |«      S | j                   s|j                   r| j	                  |«      S |j"                  r|| }} | j"                  rN|j"                  s|j$                  r4| j&                  |j&                  k\  r| S ddlm}  ||j&                  ¬«      S | S |j$                  r|| }} | j$                  r\|j$                  r| j&                  |j&                  k\  r| S |S |j,                  s|j.                  rddlm}  || j&                  ¬«      S | S |j0                  r|| }} | j0                  rš|j,                  r|j3                  «       }|j.                  r|j5                  «       }|j0                  rT | j6                  | j8                  j                  |j8                  «      gt;        | j<                  |j<                  «      ¢­Ž S | S | j.                  r| S |j.                  r|S | j,                  r|j>                  r| j3                  «       } | S |j,                  r| j>                  r|j3                  «       }|S | j>                  r| S |j>                  r|S | j@                  r| S |j@                  r|S ddl!m"} |S )aZ  
        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   )rJ   )Ú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.complexfieldrJ   Úis_GaussianRingÚis_GaussianFieldÚis_AlgebraicFieldÚ	get_fieldÚas_AlgebraicFieldr*   r„   r   Úorig_extÚis_RationalFieldÚis_IntegerRingrQ   r²   )rm   rl   r›   rJ   r²   s        r    r�   zDomain.unifyÍ  sM  € ð" ÐØ×(Ñ(¨¨WÓ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Ø×$Ò$Ø˜R�B�Ø×$Ò$ô œ §¡¨R¯Z©ZÐ 8Ó9Ó:¸1Ñ=ÀÇÁÒKØ ˜�BØ—}‘} RÓ(Ð(ð —W‘W˜RŸY™YÓ'�Ø—Y‘Y—_‘_ RÓ(�Ø—}‘} RÓ(Ð(à�?Š?˜bŸošoØ×%Ñ% bÓ)Ð)à×ÒØ˜�ˆBØ×ÒØ×!Ò! R§_¢_Ø—<‘< 2§<¡<Ò/Ø�IåMÙ'¨R¯\©\Ô:Ð:à�	à�?Š?Ø˜�ˆBØ�?Š?Ø�ŠØ—<‘< 2§<¡<Ò/Ø�Ià�IØ×#Ò# r×':Ò':ÝIÙ#¨¯©Ô6Ð6à�	à×ÒØ˜�ˆBØ×ÒØ×!Ò!Ø—\‘\“^�Ø×"Ò"Ø×)Ñ)Ó+�Ø×#Ò#Ø#�r—|‘| B§F¡F§L¡L°·±Ó$8Ða¼;ÀrÇ{Á{ÐTV×T_ÑT_Ó;`ÒaÐaà�	à×ÒØˆIØ×ÒØˆIà×ÒØ×"Ò"Ø—\‘\“^�ØˆIØ×ÒØ×"Ò"Ø—\‘\“^�ØˆIà×ÒØˆIØ×ÒØˆIà×ÒØˆIØ×ÒØˆIå*Øˆ	r"   c                óX   — t        |t        «      xr | j                  |j                  k(  S )z0Returns ``True`` if two domains are equivalent. )rR   r   r   ©r   Úothers     r    Ú__eq__zDomain.__eq__N  s#   € ô ˜%¤Ó(ÒF¨T¯Z©Z¸5¿;¹;Ñ-FÐFr"   c                ó   — | |k(   S )z1Returns ``False`` if two domains are equivalent. rj   rÊ   s     r    Ú__ne__zDomain.__ne__S  s   € à˜5‘=Ð Ð r"   c                ó¨   — g }|D ]J  }t        |t        «      r!|j                  | j                  |«      «       Œ4|j                   | |«      «       ŒL |S )z5Rersively apply ``self`` to all elements of ``seq``. )rR   r¸   ÚappendÚmap)r   ÚseqrD   Úelts       r    rÑ   z
Domain.mapW  sK   € àˆàò 	)ˆCÜ˜#œtÔ$Ø—‘˜dŸh™h s›mÕ,à—‘™d 3›iÕ(ð		)ð ˆr"   c                ó   — t        d| z  «      ‚)z)Returns a ring associated with ``self``. z#there is no ring associated with %s©r   r   s    r    r¦   zDomain.get_ringc  s   € äÐ?À$ÑFÓGÐGr"   c                ó   — t        d| z  «      ‚)z*Returns a field associated with ``self``. z$there is no field associated with %srÕ   r   s    r    rÄ   zDomain.get_fieldg  s   € äÐ@À4ÑGÓHÐHr"   c                ó   — | S )z2Returns an exact domain associated with ``self``. rj   r   s    r    Ú	get_exactzDomain.get_exactk  s   € àˆr"   c                óZ   — t        |d«      r | j                  |Ž S | j                  |«      S )z0The mathematical way to make a polynomial ring. Ú__iter__)ÚhasattrÚ	poly_ring©r   r›   s     r    Ú__getitem__zDomain.__getitem__o  s,   € ä�7˜JÔ'Ø!�4—>‘> 7Ð+Ð+à—>‘> 'Ó*Ð*r"   )r¡   c               ó"   — ddl m}  || ||«      S ©z(Returns a polynomial ring, i.e. `K[X]`. r   )ÚPolynomialRing)Ú"sympy.polys.domains.polynomialringrá   )r   r¡   r›   rá   s       r    rÜ   zDomain.poly_ringv  s   € åEÙ˜d G¨UÓ3Ð3r"   c               ó"   — ddl m}  || ||«      S ©z'Returns a fraction field, i.e. `K(X)`. r   )ÚFractionField)Ú!sympy.polys.domains.fractionfieldrå   )r   r¡   r›   rå   s       r    Ú
frac_fieldzDomain.frac_field{  s   € åCÙ˜T 7¨EÓ2Ð2r"   c                ó&   — ddl m}  || g|¢­i |¤ŽS rà   )r§   rá   )r   r›   Úkwargsrá   s       r    Úold_poly_ringzDomain.old_poly_ring€  s   € åIÙ˜dÐ7 WÒ7°Ñ7Ð7r"   c                ó&   — ddl m}  || g|¢­i |¤ŽS rä   )Ú%sympy.polys.domains.old_fractionfieldrå   )r   r›   ré   rå   s       r    Úold_frac_fieldzDomain.old_frac_field…  s   € åGÙ˜TÐ6 GÒ6¨vÑ6Ð6r"   ©r   c               ó   — t        d| z  «      ‚)z6Returns an algebraic field, i.e. `K(\alpha, \ldots)`. z%Cannot create algebraic field over %srÕ   )r   r   Ú	extensions      r    Úalgebraic_fieldzDomain.algebraic_fieldŠ  s   € äÐAÀDÑHÓIÐIr"   c                ó`   — ddl m}  |||«      }t        ||¬«      }| j                  ||¬«      S )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_polyzDomain.alg_field_from_polyŽ  s6   € õJ 	4Ù�t˜ZÓ(ˆÜ ¨EÔ2ˆØ×#Ñ# E°Ð#Ó7Ð7r"   c                ód   — ddl m} |r|t        |«      z  }| j                   |||«      ||¬«      S )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_fieldzDomain.cyclotomic_field¸  s>   € õH 	=ÙØ”S˜“V‰OˆEØ×'Ñ'©¸¸3Ó(?ÀuØ3=ð (ó ?ð 	?r"   c                ó   — t         ‚)z$Inject generators into this domain. r   rÝ   s     r    ÚinjectzDomain.injectâ  ó   € ä!Ð!r"   c                ó*   — | j                   r| S t        ‚)z"Drop generators from this domain. )Ú	is_Simpler   rÝ   s     r    r»   zDomain.dropæ  s   € à�>Š>ØˆKÜ!Ð!r"   c                ó   — | S )zReturns True if ``a`` is zero. rj   r_   s     r    Úis_zerozDomain.is_zeroì  s	   € àˆuˆr"   c                ó    — || j                   k(  S )zReturns True if ``a`` is one. )r   r_   s     r    Úis_onezDomain.is_oneð  s   € à�D—H‘H‰}Ðr"   c                ó   — |dkD  S )z#Returns True if ``a`` is positive. r   rj   r_   s     r    Úis_positivezDomain.is_positiveô  ó   € à�1‰uˆr"   c                ó   — |dk  S )z#Returns True if ``a`` is negative. r   rj   r_   s     r    Úis_negativezDomain.is_negativeø  r  r"   c                ó   — |dk  S )z'Returns True if ``a`` is non-positive. r   rj   r_   s     r    Úis_nonpositivezDomain.is_nonpositiveü  ó   € à�A‰vˆr"   c                ó   — |dk\  S )z'Returns True if ``a`` is non-negative. r   rj   r_   s     r    Úis_nonnegativezDomain.is_nonnegative   r  r"   c                óV   — | j                  |«      r| j                   S | j                  S r   )r  r   r_   s     r    Úcanonical_unitzDomain.canonical_unit  s%   € Ø×Ñ˜AÔØ—H‘H�9Ðà—8‘8ˆOr"   c                ó   — t        |«      S )z.Absolute value of ``a``, implies ``__abs__``. )Úabsr_   s     r    r  z
Domain.abs
  s   € ä�1‹vˆr"   c                ó   — | S )z,Returns ``a`` negated, implies ``__neg__``. rj   r_   s     r    Únegz
Domain.neg  ó	   € àˆrˆ	r"   c                ó   — |­S )z-Returns ``a`` positive, implies ``__pos__``. rj   r_   s     r    Úposz
Domain.pos  r  r"   c                ó   — ||z   S )z.Sum of ``a`` and ``b``, implies ``__add__``.  rj   ©r   r`   Úbs      r    Úaddz
Domain.add  r  r"   c                ó   — ||z
  S )z5Difference of ``a`` and ``b``, implies ``__sub__``.  rj   r  s      r    Úsubz
Domain.sub  r  r"   c                ó   — ||z  S )z2Product of ``a`` and ``b``, implies ``__mul__``.  rj   r  s      r    Úmulz
Domain.mul  r  r"   c                ó   — ||z  S )z2Raise ``a`` to power ``b``, implies ``__pow__``.  rj   r  s      r    Úpowz
Domain.pow"  r  r"   c                ó   — t         ‚)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    ÚexquozDomain.exquo&  s   € ôr "Ð!r"   c                ó   — t         ‚)aG  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    Úquoz
Domain.quo�  ó
   € ô "Ð!r"   c                ó   — t         ‚)aN  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    Úremz
Domain.rem�  r+  r"   c                ó   — t         ‚)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    Údivz
Domain.divŸ  s   € ôh "Ð!r"   c                ó   — t         ‚)z5Returns inversion of ``a mod b``, implies something. r   r  s      r    ÚinvertzDomain.invertõ  r  r"   c                ó   — t         ‚)z!Returns ``a**(-1)`` if possible. r   r_   s     r    ÚrevertzDomain.revertù  r  r"   c                ó   — t         ‚)zReturns numerator of ``a``. r   r_   s     r    ÚnumerzDomain.numerý  r  r"   c                ó   — t         ‚)zReturns denominator of ``a``. r   r_   s     r    ÚdenomzDomain.denom  r  r"   c                ó6   — | j                  ||«      \  }}}||fS )z&Half extended GCD of ``a`` and ``b``. )Úgcdex)r   r`   r  ÚsÚtÚhs         r    Ú
half_gcdexzDomain.half_gcdex  s!   € à—*‘*˜Q Ó"‰ˆˆ1ˆaØ�!ˆtˆr"   c                ó   — t         ‚)z!Extended GCD of ``a`` and ``b``. r   r  s      r    r9  zDomain.gcdex
  r  r"   c                óx   — | j                  ||«      }| j                  ||«      }| j                  ||«      }|||fS )z.Returns GCD and cofactors of ``a`` and ``b``. )Úgcdr*  )r   r`   r  r@  ÚcfaÚcfbs         r    Ú	cofactorszDomain.cofactors  s=   € à�h‰h�q˜!‹nˆØ�h‰h�q˜#ÓˆØ�h‰h�q˜#ÓˆØ�C˜ˆ}Ðr"   c                ó   — t         ‚)z Returns GCD of ``a`` and ``b``. r   r  s      r    r@  z
Domain.gcd  r  r"   c                ó   — t         ‚)z Returns LCM of ``a`` and ``b``. r   r  s      r    Úlcmz
Domain.lcm  r  r"   c                ó   — t         ‚)z#Returns b-base logarithm of ``a``. r   r  s      r    Úlogz
Domain.log  r  r"   c                ó   — t         ‚)aJ  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   r_   s     r    ÚsqrtzDomain.sqrt!  r+  r"   c                ó   — t         ‚)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   r_   s     r    Ú	is_squarezDomain.is_square0  s
   € ô "Ð!r"   c                ó   — t         ‚)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   r_   s     r    ÚexsqrtzDomain.exsqrt@  s
   € ô "Ð!r"   c                óF   —  | j                  |«      j                  |fi |¤ŽS )z*Returns numerical approximation of ``a``. )rc   Úevalf)r   r`   r±   Úoptionss       r    rP  zDomain.evalfQ  s#   € à%ˆt�}‰}˜QÓ×%Ñ% dÑ6¨gÑ6Ð6r"   c                ó   — |S r   rj   r_   s     r    ÚrealzDomain.realW  s   € Øˆr"   c                ó   — | j                   S r   )r   r_   s     r    ÚimagzDomain.imagZ  s   € Ø�y‰yÐr"   c                ó   — ||k(  S )z+Check if ``a`` and ``b`` are almost equal. rj   )r   r`   r  Ú	tolerances       r    ÚalmosteqzDomain.almosteq]  r  r"   c                ó   — t        d«      ‚)z*Return the characteristic of this domain. zcharacteristic()r   r   s    r    r´   zDomain.characteristica  s   € ä!Ð"4Ó5Ð5r"   r   )Néÿÿÿÿ)FÚzetaNrZ  )‡r+   Ú
__module__Ú__qualname__Ú__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_ExactrW   r  r™   Úis_PIDr³   r   r   r!   r$   r'   r,   r1   Úpropertyr4   r6   r8   rE   rX   rP   ra   rc   rZ   rg   rn   rq   rs   ru   rw   ry   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  r  r  r  r  r  r  r  r   r"  r$  r&  r(  r*  r-  r/  r1  r3  r5  r7  r=  r9  rC  r@  rF  rH  rJ  rL  rN  rP  rý   rS  rU  rX  r´   rj   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__rj   r"   r    ú<module>r     sU   ðÙ /å "Ý å .ß %Ý &Ý ,Ý ;Ý %ß QÑ Qß ;Ý "Ý 1ð ÷P6ð P6ó ðP6ðf* ˆ*�r"   