Ë
    täi^  ã                   ó–   — 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y)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(y) Ú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                  ó   — y )N© ©Úselfs    úp/Volumes/fast/ai/experiments/MLX_z-image/.venv/lib/python3.12/site-packages/sympy/polys/domains/rationalfield.pyÚ__init__zRationalField.__init__-   s   € Øó    c                 ó0   — t        |t        «      ryt        S )z0Returns ``True`` if two domains are equivalent. T)Ú
isinstancer   ÚNotImplemented)r   Úothers     r   Ú__eq__zRationalField.__eq__0   s   € ä�eœ]Ô+Øä!Ð!r   c                 ó   — t        d«      S )zReturns hash code of ``self``. r   )Úhashr   s    r   Ú__hash__zRationalField.__hash__7   s   € ä�D‹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                 óf   — 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ÓBÐBr   c                 óä   — |j                   r t        |j                  |j                  «      S |j                  r+ddlm} t        t        t        |j                  |«      «      Ž 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   sS   € à�=Š=Ü�q—s‘s˜AŸC™C“=Ð Ø�ZŠZÝ.ÜœœC §¡°Ó!2Ó3Ð4Ð4ä Ð!EÈÑ!IÓJÐJr   N)Úaliasc                ó&   — ddl m}  || g|¢­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   s   € õ6 	7Ù˜dÐ< YÒ<°eÑ<Ð<r   c                 óp   — |j                   r*| j                  |j                  «       |j                  «      S y)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   s+   € ð
 �;Š;Ø—:‘:˜aŸd™d›f b§f¡fÓ-Ð-ð r   c                 ó   — t        |«      S ©z.Convert a Python ``int`` object to ``dtype``. r   r>   s      r   Úfrom_ZZzRationalField.from_ZZt   ó   € ä�1‹vˆr   c                 ó   — t        |«      S rC   r   r>   s      r   Úfrom_ZZ_pythonzRationalField.from_ZZ_pythonx   rE   r   c                 óB   — 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                 óB   — 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                 óL   — |j                   dk(  rt        |j                  «      S y)z3Convert a ``GaussianElement`` object to ``dtype``. r   N)Úyr   Úxr>   s      r   Úfrom_GaussianRationalFieldz(RationalField.from_GaussianRationalFieldŒ   s   € à�3‰3�!Š8Ü�q—s‘s“8ˆOð r   c                 óL   — t        t        t        |j                  |«      «      Ž 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                 ó0   — t        |«      t        |«      z  S )z=Exact quotient of ``a`` and ``b``, implies ``__truediv__``.  r   ©r   r)   Úbs      r   ÚexquozRationalField.exquo•   ó   € ä�1‹vœ˜A›‰Ðr   c                 ó0   — 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‰yÐr   c                 óH   — t        |«      t        |«      z  | j                  fS )z6Division of ``a`` and ``b``, implies ``__truediv__``. )r   ra   rZ   s      r   ÚdivzRationalField.div¡   s   € ä�1‹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                 óZ   — t        |j                  «      xr 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±MÓ*BÐBr   c                 ó²   — |j                   dk  ryt        |j                   «      \  }}|dk7  ryt        |j                  «      \  }}|dk7  ry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·   sW   € ð �;‰;˜Š?ØÜ §¡Ó,‰ˆ�Ø�AŠ:ØÜ §¡Ó.‰ˆ�Ø�AŠ:ØÜ�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Ù�‹8€DÙ
�‹(€CÙ	ˆc‹€Bòò"òòò
CòKð 15ô =ò<.òòò/ò/òòòò
1òòòò*òòò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…      sM   ðÙ 6õ $ç MÑ Må EÝ +Ý 9Ý 1Ý "àôw#�EÐ-¨|ó w#ó ðw#ñr ƒ_�r   