§
    OŠtj^  ã                   óª   — d Z ddlmZ ddl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 e G d	„ d
e
ee¦  «        ¦   «         Z e¦   «         ZdS )z0Implementation of :class:`RationalField` class. é    ©ÚMPQ)ÚSymPyRationalÚ	is_squareÚsqrtrem)ÚCharacteristicZero)ÚField)ÚSimpleDomain)ÚCoercionFailed)Úpublicc                   ó
  — e Zd ZdZdZdZdxZZdZdZ	dZ
eZ ed¦  «        Z ed¦  «        Z ee¦  «        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S ) ÚRationalFieldaë  Abstract base class for the domain :ref:`QQ`.

    The :py:class:`RationalField` class represents the field of rational
    numbers $\mathbb{Q}$ as a :py:class:`~.Domain` in the domain system.
    :py:class:`RationalField` is a superclass of
    :py:class:`PythonRationalField` and :py:class:`GMPYRationalField` one of
    which will be the implementation for :ref:`QQ` depending on whether either
    of ``gmpy`` or ``gmpy2`` is installed or not.

    See also
    ========

    Domain
    ÚQQTr   é   c                 ó   — d S )N© ©Úselfs    ú_/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/sympy/polys/domains/rationalfield.pyÚ__init__zRationalField.__init__-   s   € Øˆó    c                 ó>   — t          |t          ¦  «        rdS t          S )z0Returns ``True`` if two domains are equivalent. T)Ú
isinstancer   ÚNotImplemented)r   Úothers     r   Ú__eq__zRationalField.__eq__0   s   € å�e�]Ñ+Ô+ð 	"Ø�4å!Ð!r   c                 ó    — t          d¦  «        S )zReturns hash code of ``self``. r   )Úhashr   s    r   Ú__hash__zRationalField.__hash__7   s   € å�D‰zŒzÐr   c                 ó   — ddl m} |S )z'Returns ring associated with ``self``. r   )ÚZZ)Úsympy.polys.domainsr!   )r   r!   s     r   Úget_ringzRationalField.get_ring;   s   € à*Ð*Ð*Ð*Ð*Ð*Øˆ	r   c                 ój   — t          t          |j        ¦  «        t          |j        ¦  «        ¦  «        S )z!Convert ``a`` to a SymPy object. )r   ÚintÚ	numeratorÚdenominator©r   Úas     r   Úto_sympyzRationalField.to_sympy@   s&   € å�S ¤Ñ-Ô-­s°1´=Ñ/AÔ/AÑBÔBÐBr   c                 óà   — |j         rt          |j        |j        ¦  «        S |j        r5ddlm} t          t          t          | 	                    |¦  «        ¦  «        Ž S t          d|z  ¦  «        ‚)z&Convert SymPy's Integer to ``dtype``. r   )ÚRRz"expected `Rational` object, got %s)Úis_Rationalr   ÚpÚqÚis_Floatr"   r,   Úmapr%   Úto_rationalr   )r   r)   r,   s      r   Ú
from_sympyzRationalField.from_sympyD   sq   € àŒ=ð 	KÝ�q”s˜AœC‘=”=Ð ØŒZð 	KØ.Ð.Ð.Ð.Ð.Ð.Ý��C §¢°Ñ!2Ô!2Ñ3Ô3Ð4Ð4å Ð!EÈÑ!IÑJÔJÐJr   N)Úaliasc                ó&   — ddl m}  || g|¢R 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 QQ, sqrt
        >>> QQ.algebraic_field(sqrt(2))
        QQ<sqrt(2)>
        r   )ÚAlgebraicFieldr4   )r"   r6   )r   r4   Ú	extensionr6   s       r   Úalgebraic_fieldzRationalField.algebraic_fieldN   s6   € ð6 	7Ð6Ð6Ð6Ð6Ð6Øˆ~˜dÐ< YÐ<Ð<Ð<°eÐ<Ð<Ð<r   c                 ón   — |j         r-|                      |                     ¦   «         |j        ¦  «        S dS )zbConvert a :py:class:`~.ANP` object to :ref:`QQ`.

        See :py:meth:`~.Domain.convert`
        N)Ú	is_groundÚconvertÚLCÚdom©ÚK1r)   ÚK0s      r   Úfrom_AlgebraicFieldz!RationalField.from_AlgebraicFieldl   s6   € ð
 Œ;ð 	.Ø—:’:˜aŸdšd™fœf b¤fÑ-Ô-Ð-ð	.ð 	.r   c                 ó    — t          |¦  «        S ©z.Convert a Python ``int`` object to ``dtype``. r   r>   s      r   Úfrom_ZZzRationalField.from_ZZt   ó   € å�1‰vŒvˆr   c                 ó    — t          |¦  «        S rC   r   r>   s      r   Úfrom_ZZ_pythonzRationalField.from_ZZ_pythonx   rE   r   c                 ó6   — t          |j        |j        ¦  «        S ©z3Convert a Python ``Fraction`` object to ``dtype``. ©r   r&   r'   r>   s      r   Úfrom_QQzRationalField.from_QQ|   ó   € å�1”; ¤Ñ.Ô.Ð.r   c                 ó6   — t          |j        |j        ¦  «        S rI   rJ   r>   s      r   Úfrom_QQ_pythonzRationalField.from_QQ_python€   rL   r   c                 ó    — t          |¦  «        S )z,Convert a GMPY ``mpz`` object to ``dtype``. r   r>   s      r   Úfrom_ZZ_gmpyzRationalField.from_ZZ_gmpy„   rE   r   c                 ó   — |S )z,Convert a GMPY ``mpq`` object to ``dtype``. r   r>   s      r   Úfrom_QQ_gmpyzRationalField.from_QQ_gmpyˆ   s   € àˆr   c                 óD   — |j         dk    rt          |j        ¦  «        S dS )z3Convert a ``GaussianElement`` object to ``dtype``. r   N)Úyr   Úxr>   s      r   Úfrom_GaussianRationalFieldz(RationalField.from_GaussianRationalFieldŒ   s!   € àŒ3�!Š8ˆ8Ý�q”s‘8”8ˆOð ˆ8r   c                 ó`   — t          t          t          |                     |¦  «        ¦  «        Ž S )z.Convert a mpmath ``mpf`` object to ``dtype``. )r   r1   r%   r2   r>   s      r   Úfrom_RealFieldzRationalField.from_RealField‘   s#   € å•C�˜RŸ^š^¨AÑ.Ô.Ñ/Ô/Ð0Ð0r   c                 ó@   — t          |¦  «        t          |¦  «        z  S )z=Exact quotient of ``a`` and ``b``, implies ``__truediv__``.  r   ©r   r)   Úbs      r   ÚexquozRationalField.exquo•   ó   € å�1‰vŒv�˜A™œ‰Ðr   c                 ó@   — t          |¦  «        t          |¦  «        z  S )z6Quotient of ``a`` and ``b``, implies ``__truediv__``. r   rZ   s      r   ÚquozRationalField.quo™   r]   r   c                 ó   — | j         S )z0Remainder of ``a`` and ``b``, implies nothing.  )ÚzerorZ   s      r   ÚremzRationalField.rem�   s
   € àŒyÐr   c                 óN   — t          |¦  «        t          |¦  «        z  | j        fS )z6Division of ``a`` and ``b``, implies ``__truediv__``. )r   ra   rZ   s      r   ÚdivzRationalField.div¡   s   € å�1‰vŒv�˜A™œ‰ ¤	Ð)Ð)r   c                 ó   — |j         S )zReturns numerator of ``a``. )r&   r(   s     r   ÚnumerzRationalField.numer¥   s
   € àŒ{Ðr   c                 ó   — |j         S )zReturns denominator of ``a``. )r'   r(   s     r   ÚdenomzRationalField.denom©   s
   € àŒ}Ðr   c                 óR   — t          |j        ¦  «        ot          |j        ¦  «        S )zÓReturn ``True`` if ``a`` is a square.

        Explanation
        ===========
        A rational number is a square if and only if there exists
        a rational number ``b`` such that ``b * b == a``.
        )r   r&   r'   r(   s     r   r   zRationalField.is_square­   s#   € õ ˜œÑ%Ô%ÐB­)°A´MÑ*BÔ*BÐBr   c                 ó¸   — |j         dk     rdS t          |j         ¦  «        \  }}|dk    rdS t          |j        ¦  «        \  }}|dk    rdS t          ||¦  «        S )zuNon-negative square root of ``a`` if ``a`` is a square.

        See also
        ========
        is_square
        r   N)r&   r   r'   r   )r   r)   Úp_sqrtÚp_remÚq_sqrtÚq_rems         r   ÚexsqrtzRationalField.exsqrt·   sf   € ð Œ;˜Š?ˆ?Ø�4Ý ¤Ñ,Ô,‰ˆ�Ø�AŠ:ˆ:Ø�4Ý ¤Ñ.Ô.‰ˆ�Ø�AŠ:ˆ:Ø�4Ý�6˜6Ñ"Ô"Ð"r   ))Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úrepr4   Úis_RationalFieldÚis_QQÚis_NumericalÚhas_assoc_RingÚhas_assoc_Fieldr   Údtypera   ÚoneÚtypeÚtpr   r   r   r#   r*   r3   r8   rA   rD   rG   rK   rN   rP   rR   rV   rX   r\   r_   rb   rd   rf   rh   r   ro   r   r   r   r   r      sð  € € € € € ðð ð €CØ€Eà#Ð#Ð�uØ€Là€NØ€Oà€EØˆ5�‰8Œ8€DØ
ˆ%�‰(Œ(€CØ	ˆˆc‰Œ€Bðð ð ð"ð "ð "ðð ð ðð ð ð
Cð Cð CðKð Kð Kð 15ð =ð =ð =ð =ð =ð<.ð .ð .ðð ð ðð ð ð/ð /ð /ð/ð /ð /ðð ð ðð ð ðð ð ð
1ð 1ð 1ðð ð ðð ð ðð ð ð*ð *ð *ðð ð ðð ð ðCð Cð Cð#ð #ð #ð #ð #r   r   N)rs   Úsympy.external.gmpyr   Úsympy.polys.domains.groundtypesr   r   r   Ú&sympy.polys.domains.characteristiczeror   Úsympy.polys.domains.fieldr	   Ú sympy.polys.domains.simpledomainr
   Úsympy.polys.polyerrorsr   Úsympy.utilitiesr   r   r   r   r   r   ú<module>r…      sê   ðØ 6Ð 6ð $Ð #Ð #Ð #Ð #Ð #à MÐ MÐ MÐ MÐ MÐ MÐ MÐ MÐ MÐ Mà EÐ EÐ EÐ EÐ EÐ EØ +Ð +Ð +Ð +Ð +Ð +Ø 9Ð 9Ð 9Ð 9Ð 9Ð 9Ø 1Ð 1Ð 1Ð 1Ð 1Ð 1Ø "Ð "Ð "Ð "Ð "Ð "àðw#ð w#ð w#ð w#ð w#�EÐ-¨|ñ w#ô w#ñ „ðw#ðr €]�_„_€€€r   