§
    OŠtj  ã                   óÖ   — d Z ddlmZmZ ddlmZ ddlmZmZm	Z	m
Z
mZmZ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 dd
lZe G d„ deee¦  «        ¦   «         Z e¦   «         Zd
S )z.Implementation of :class:`IntegerRing` class. é    )ÚMPZÚGROUND_TYPES)Ú
int_valued)ÚSymPyIntegerÚ	factorialÚgcdexÚgcdÚlcmÚsqrtÚ	is_squareÚsqrtrem)ÚCharacteristicZero)ÚRing)ÚSimpleDomain)ÚCoercionFailed)ÚpublicNc                   ó&  — e Zd ZdZdZdZeZ ed¦  «        Z ed¦  «        Z	 e
e	¦  «        ZdxZZdZdZdZdZd„ Zd„ Zd„ Zd	„ Zd
„ Zd„ Zddœd„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z d„ Z!d„ Z"d„ Z#d„ Z$d„ Z%d„ Z&d„ Z'd„ Z(d„ Z)d „ Z*d!„ Z+d"„ Z,d#„ Z-dS )$ÚIntegerRingaÌ  The domain ``ZZ`` representing the integers `\mathbb{Z}`.

    The :py:class:`IntegerRing` class represents the ring of integers as a
    :py:class:`~.Domain` in the domain system. :py:class:`IntegerRing` is a
    super class of :py:class:`PythonIntegerRing` and
    :py:class:`GMPYIntegerRing` one of which will be the implementation for
    :ref:`ZZ` depending on whether or not ``gmpy`` or ``gmpy2`` is installed.

    See also
    ========

    Domain
    ÚZZr   é   Tc                 ó   — dS )z$Allow instantiation of this domain. N© ©Úselfs    ú]/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/sympy/polys/domains/integerring.pyÚ__init__zIntegerRing.__init__3   s   € € € ó    c                 ó>   — t          |t          ¦  «        rdS t          S )z0Returns ``True`` if two domains are equivalent. T)Ú
isinstancer   ÚNotImplemented)r   Úothers     r   Ú__eq__zIntegerRing.__eq__6   s   € å�e�[Ñ)Ô)ð 	"Ø�4å!Ð!r   c                 ó    — t          d¦  «        S )z&Compute a hash value for this domain. r   )Úhashr   s    r   Ú__hash__zIntegerRing.__hash__=   s   € å�D‰zŒzÐr   c                 ó:   — t          t          |¦  «        ¦  «        S )z!Convert ``a`` to a SymPy object. )r   Úint©r   Úas     r   Úto_sympyzIntegerRing.to_sympyA   s   € å�C ™FœFÑ#Ô#Ð#r   c                 ó²   — |j         rt          |j        ¦  «        S t          |¦  «        rt          t	          |¦  «        ¦  «        S t          d|z  ¦  «        ‚)z&Convert SymPy's Integer to ``dtype``. zexpected an integer, got %s)Ú
is_Integerr   Úpr   r'   r   r(   s     r   Ú
from_sympyzIntegerRing.from_sympyE   sO   € àŒ<ð 	DÝ�q”s‘8”8ˆOÝ˜‰]Œ]ð 	DÝ•s˜1‘v”v‘;”;Ðå Ð!>ÀÑ!BÑCÔCÐCr   c                 ó   — ddl m} |S )as  Return the associated field of fractions :ref:`QQ`

        Returns
        =======

        :ref:`QQ`:
            The associated field of fractions :ref:`QQ`, a
            :py:class:`~.Domain` representing the rational numbers
            `\mathbb{Q}`.

        Examples
        ========

        >>> from sympy import ZZ
        >>> ZZ.get_field()
        QQ
        r   )ÚQQ)Úsympy.polys.domainsr0   )r   r0   s     r   Ú	get_fieldzIntegerRing.get_fieldN   s   € ð$ 	+Ð*Ð*Ð*Ð*Ð*Øˆ	r   N)Úaliasc                ó@   —  |                       ¦   «         j        |d|iŽS )a  Returns an algebraic field, i.e. `\mathbb{Q}(\alpha, \ldots)`.

        Parameters
        ==========

        *extension : One or more :py:class:`~.Expr`.
            Generators of the extension. These should be expressions that are
            algebraic over `\mathbb{Q}`.

        alias : str, :py:class:`~.Symbol`, None, optional (default=None)
            If provided, this will be used as the alias symbol for the
            primitive element of the returned :py:class:`~.AlgebraicField`.

        Returns
        =======

        :py:class:`~.AlgebraicField`
            A :py:class:`~.Domain` representing the algebraic field extension.

        Examples
        ========

        >>> from sympy import ZZ, sqrt
        >>> ZZ.algebraic_field(sqrt(2))
        QQ<sqrt(2)>
        r3   )r2   Úalgebraic_field)r   r3   Ú	extensions      r   r5   zIntegerRing.algebraic_fieldc   s&   € ð6 0ˆt�~Š~ÑÔÔ/°ÐHÀ%ÐHÐHÐHr   c                 ón   — |j         r-|                      |                     ¦   «         |j        ¦  «        S dS )zcConvert a :py:class:`~.ANP` object to :ref:`ZZ`.

        See :py:meth:`~.Domain.convert`.
        N)Ú	is_groundÚconvertÚLCÚdom©ÚK1r)   ÚK0s      r   Úfrom_AlgebraicFieldzIntegerRing.from_AlgebraicField€   s6   € ð
 Œ;ð 	.Ø—:’:˜aŸdšd™fœf b¤fÑ-Ô-Ð-ð	.ð 	.r   c           	      ó†   — |                       t          t          j        t          |¦  «        |¦  «        ¦  «        ¦  «        S )a*  Logarithm of *a* to the base *b*.

        Parameters
        ==========

        a: number
        b: number

        Returns
        =======

        $\\lfloor\log(a, b)\\rfloor$:
            Floor of the logarithm of *a* to the base *b*

        Examples
        ========

        >>> from sympy import ZZ
        >>> ZZ.log(ZZ(8), ZZ(2))
        3
        >>> ZZ.log(ZZ(9), ZZ(2))
        3

        Notes
        =====

        This function uses ``math.log`` which is based on ``float`` so it will
        fail for large integer arguments.
        )Údtyper'   ÚmathÚlog©r   r)   Úbs      r   rC   zIntegerRing.logˆ   s0   € ð< �zŠz�#�dœh¥s¨1¡v¤v¨qÑ1Ô1Ñ2Ô2Ñ3Ô3Ð3r   c                 óF   — t          |                     |¦  «        ¦  «        S ©z3Convert ``ModularInteger(int)`` to GMPY's ``mpz``. ©r   Úto_intr<   s      r   Úfrom_FFzIntegerRing.from_FF¨   ó   € å�2—9’9˜Q‘<”<Ñ Ô Ð r   c                 óF   — t          |                     |¦  «        ¦  «        S rG   rH   r<   s      r   Úfrom_FF_pythonzIntegerRing.from_FF_python¬   rK   r   c                 ó    — t          |¦  «        S ©z,Convert Python's ``int`` to GMPY's ``mpz``. ©r   r<   s      r   Úfrom_ZZzIntegerRing.from_ZZ°   ó   € å�1‰vŒvˆr   c                 ó    — t          |¦  «        S rO   rP   r<   s      r   Úfrom_ZZ_pythonzIntegerRing.from_ZZ_python´   rR   r   c                 óD   — |j         dk    rt          |j        ¦  «        S dS ©z1Convert Python's ``Fraction`` to GMPY's ``mpz``. r   N©Údenominatorr   Ú	numeratorr<   s      r   Úfrom_QQzIntegerRing.from_QQ¸   ó'   € àŒ=˜AÒÐÝ�q”{Ñ#Ô#Ð#ð Ðr   c                 óD   — |j         dk    rt          |j        ¦  «        S dS rV   rW   r<   s      r   Úfrom_QQ_pythonzIntegerRing.from_QQ_python½   r[   r   c                 óF   — t          |                     |¦  «        ¦  «        S )z3Convert ``ModularInteger(mpz)`` to GMPY's ``mpz``. rH   r<   s      r   Úfrom_FF_gmpyzIntegerRing.from_FF_gmpyÂ   rK   r   c                 ó   — |S )z*Convert GMPY's ``mpz`` to GMPY's ``mpz``. r   r<   s      r   Úfrom_ZZ_gmpyzIntegerRing.from_ZZ_gmpyÆ   s   € àˆr   c                 ó*   — |j         dk    r|j        S dS )z(Convert GMPY ``mpq`` to GMPY's ``mpz``. r   N)rX   rY   r<   s      r   Úfrom_QQ_gmpyzIntegerRing.from_QQ_gmpyÊ   s   € àŒ=˜AÒÐØ”;Ðð Ðr   c                 óz   — |                      |¦  «        \  }}|dk    rt          t          |¦  «        ¦  «        S dS )z,Convert mpmath's ``mpf`` to GMPY's ``mpz``. r   N)Úto_rationalr   r'   )r=   r)   r>   r-   Úqs        r   Úfrom_RealFieldzIntegerRing.from_RealFieldÏ   s;   € à�~Š~˜aÑ Ô ‰ˆˆ1à�Š6ˆ6õ •s˜1‘v”v‘;”;Ðð	 ˆ6r   c                 ó*   — |j         dk    r|j        S d S )Nr   )ÚyÚxr<   s      r   Úfrom_GaussianIntegerRingz$IntegerRing.from_GaussianIntegerRingÙ   s   € ØŒ3�!Š8ˆ8Ø”3ˆJð ˆ8r   c                 ó>   — |j         r|                      |¦  «        S dS )z*Convert ``Expression`` to GMPY's ``mpz``. N)r,   r.   r<   s      r   Úfrom_EXzIntegerRing.from_EXÝ   s(   € àŒ<ð 	$Ø—=’= Ñ#Ô#Ð#ð	$ð 	$r   c                 óT   — t          ||¦  «        \  }}}t          dk    r|||fS |||fS )z)Compute extended GCD of ``a`` and ``b``. Úgmpy)r   r   )r   r)   rE   ÚhÚsÚts         r   r   zIntegerRing.gcdexâ   s6   € å˜˜1‘+”+‰ˆˆ1ˆaå˜6Ò!Ð!Ø�a˜�7ˆNà�a˜�7ˆNr   c                 ó"   — t          ||¦  «        S )z Compute GCD of ``a`` and ``b``. )r	   rD   s      r   r	   zIntegerRing.gcdë   ó   € å�1�a‰yŒyÐr   c                 ó"   — t          ||¦  «        S )z Compute LCM of ``a`` and ``b``. )r
   rD   s      r   r
   zIntegerRing.lcmï   rt   r   c                 ó    — t          |¦  «        S )zCompute square root of ``a``. )r   r(   s     r   r   zIntegerRing.sqrtó   s   € å�A‰wŒwˆr   c                 ó    — t          |¦  «        S )zÅReturn ``True`` if ``a`` is a square.

        Explanation
        ===========
        An integer is a square if and only if there exists an integer
        ``b`` such that ``b * b == a``.
        )r   r(   s     r   r   zIntegerRing.is_square÷   s   € õ ˜‰|Œ|Ðr   c                 óJ   — |dk     rdS t          |¦  «        \  }}|dk    rdS |S )zuNon-negative square root of ``a`` if ``a`` is a square.

        See also
        ========
        is_square
        r   N)r   )r   r)   ÚrootÚrems       r   ÚexsqrtzIntegerRing.exsqrt  s4   € ð ˆqŠ5ˆ5Ø�4Ý˜A‘J”J‰	ˆˆcØ�!Š8ˆ8Ø�4Øˆr   c                 ó    — t          |¦  «        S )zCompute factorial of ``a``. )r   r(   s     r   r   zIntegerRing.factorial  s   € å˜‰|Œ|Ðr   ).Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úrepr3   r   rA   ÚzeroÚoneÚtypeÚtpÚis_IntegerRingÚis_ZZÚis_NumericalÚis_PIDÚhas_assoc_RingÚhas_assoc_Fieldr   r"   r%   r*   r.   r2   r5   r?   rC   rJ   rM   rQ   rT   rZ   r]   r_   ra   rc   rg   rk   rm   r   r	   r
   r   r   r{   r   r   r   r   r   r      s2  € € € € € ðð ð €CØ€EØ€EØˆ5�‰8Œ8€DØ
ˆ%�‰(Œ(€CØ	ˆˆc‰Œ€Bð "Ð!€N�UØ€LØ€Fà€NØ€Oð3ð 3ð 3ð"ð "ð "ðð ð ð$ð $ð $ðDð Dð Dðð ð ð* 15ð Ið Ið Ið Ið Ið:.ð .ð .ð4ð 4ð 4ð@!ð !ð !ð!ð !ð !ðð ð ðð ð ð$ð $ð $ð
$ð $ð $ð
!ð !ð !ðð ð ðð ð ð
ð ð ðð ð ð$ð $ð $ð
ð ð ðð ð ðð ð ðð ð ðð ð ðð ð ðð ð ð ð r   r   )r€   Úsympy.external.gmpyr   r   Úsympy.core.numbersr   Úsympy.polys.domains.groundtypesr   r   r   r	   r
   r   r   r   Ú&sympy.polys.domains.characteristiczeror   Úsympy.polys.domains.ringr   Ú sympy.polys.domains.simpledomainr   Úsympy.polys.polyerrorsr   Úsympy.utilitiesr   rB   r   r   r   r   r   ú<module>r”      sR  ðØ 4Ð 4à 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1à )Ð )Ð )Ð )Ð )Ð )ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð FÐ EÐ EÐ EÐ EÐ EØ )Ð )Ð )Ð )Ð )Ð )Ø 9Ð 9Ð 9Ð 9Ð 9Ð 9Ø 1Ð 1Ð 1Ð 1Ð 1Ð 1Ø "Ð "Ð "Ð "Ð "Ð "à €€€àð|ð |ð |ð |ð |�$Ð*¨Lñ |ô |ñ „ð|ð~ €[�]„]€€€r   