
    sgR                     z    d 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 e G d d	ee             Zy
)z0Implementation of :class:`FractionField` class.     )Field)CompositeDomain)DMF)GeneratorsNeeded)dict_from_basicbasic_from_dict_dict_reorder)publicc                       e Zd ZdZ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 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)FractionFieldz3A class for representing rational function fields. Tc                    |st        d      t        |      dz
  }t        |      | _        | j                  j	                  ||      | _        | j                  j                  ||      | _        |x| _        | _        |x| _        | _	        y )Nzgenerators not specified   )
r   lenngensdtypezeroonedomaindomsymbolsgens)selfr   r   levs       X/var/www/html/venv/lib/python3.12/site-packages/sympy/polys/domains/old_fractionfield.py__init__zFractionField.__init__   sq    "#=>>$i!mY
JJOOC-	::>>#s+!$$dh#''ty    c                 <     | j                   |g| j                   S )z-Make a new fraction field with given domain. )	__class__r   )r   r   s     r   
set_domainzFractionField.set_domain"   s    t~~c.DII..r   c                 h    | j                  || j                  t        | j                        dz
        S )Nr   )r   r   r   r   )r   elements     r   newzFractionField.new&   s&    zz'488S^a-?@@r   c                     t        | j                        dz   dj                  t        t         | j                              z   dz   S )N(,))strr   joinmapr   r   s    r   __str__zFractionField.__str__)   s3    488}s"SXXc#tyy.A%BBSHHr   c                     t        | j                  j                  | j                  | j                  | j
                  f      S )N)hashr   __name__r   r   r   r*   s    r   __hash__zFractionField.__hash__,   s,    T^^,,djj$((DIINOOr   c                     t        |t              xrO | j                  |j                  k(  xr4 | j                  |j                  k(  xr | j                  |j                  k(  S )z0Returns ``True`` if two domains are equivalent. )
isinstancer   r   r   r   )r   others     r   __eq__zFractionField.__eq__/   sW    %/ \JJ%++%\*.((eii*?\DHIIQVQ[Q[D[	\r   c                     t        |j                         j                         g| j                   t        |j	                         j                         g| j                   z  S )z!Convert ``a`` to a SymPy object. )r   numerto_sympy_dictr   denomr   as     r   to_sympyzFractionField.to_sympy4   sN    	 7 7 9FDIIF	 7 7 9FDIIFG 	Hr   c                    |j                         \  }}t        || j                        \  }}t        || j                        \  }}|j                         D ]#  \  }}| j                  j                  |      ||<   % |j                         D ]#  \  }}| j                  j                  |      ||<   %  | ||f      j                         S )z)Convert SymPy's expression to ``dtype``. )r   )as_numer_denomr   r   itemsr   
from_sympycancel)	r   r9   pqnum_denkvs	            r   r>   zFractionField.from_sympy9   s    !1 3Q 3QIIK 	,DAqXX((+CF	, IIK 	,DAqXX((+CF	, S#J&&((r   c                 F     | | j                   j                  ||            S z.Convert a Python ``int`` object to ``dtype``. r   convertK1r9   K0s      r   from_ZZzFractionField.from_ZZH       "&&..B'((r   c                 F     | | j                   j                  ||            S rH   rI   rK   s      r   from_ZZ_pythonzFractionField.from_ZZ_pythonL   rO   r   c                 F     | | j                   j                  ||            S )z3Convert a Python ``Fraction`` object to ``dtype``. rI   rK   s      r   from_QQ_pythonzFractionField.from_QQ_pythonP   rO   r   c                 F     | | j                   j                  ||            S )z,Convert a GMPY ``mpz`` object to ``dtype``. rI   rK   s      r   from_ZZ_gmpyzFractionField.from_ZZ_gmpyT   rO   r   c                 F     | | j                   j                  ||            S )z,Convert a GMPY ``mpq`` object to ``dtype``. rI   rK   s      r   from_QQ_gmpyzFractionField.from_QQ_gmpyX   rO   r   c                 F     | | j                   j                  ||            S )z.Convert a mpmath ``mpf`` object to ``dtype``. rI   rK   s      r   from_RealFieldzFractionField.from_RealField\   rO   r   c                 ,   | j                   |j                   k(  r^| j                  |j                  k(  r | |j                               S  | |j                  | j                        j                               S t	        |j                         |j                   | j                         \  }}| j                  |j                  k7  r3|D cg c](  }| j                  j                  ||j                        * }} | t        t        ||                  S c c}w )z'Convert a ``DMF`` object to ``dtype``. )r   r   to_listrJ   r	   to_dictdictzip)rL   r9   rM   monomscoeffscs         r   from_GlobalPolynomialRingz'FractionField.from_GlobalPolynomialRing`   s    77bggvv!))+&!))BFF+33566*199;INFFvv>DF266>>!RVV4FFd3vv./00 Gs   -Dc           	      $   | j                   |j                   k(  r| j                  |j                  k(  r|S  | |j                         j                  | j                        j	                         |j                         j                  | j                        j	                         f      S t        |j                         j                  | j                         r/t        |j                         j                         |j                   | j                         \  }}t        |j                         j                         |j                   | j                         \  }}| j                  |j                  k7  rf|D cg c](  }| j                  j                  ||j                        * }}|D cg c](  }| j                  j                  ||j                        * }} | t        t        ||            t        t        ||            f      S yc c}w c c}w )a  
        Convert a fraction field element to another fraction field.

        Examples
        ========

        >>> from sympy.polys.polyclasses import DMF
        >>> from sympy.polys.domains import ZZ, QQ
        >>> from sympy.abc import x

        >>> f = DMF(([ZZ(1), ZZ(2)], [ZZ(1), ZZ(1)]), ZZ)

        >>> QQx = QQ.old_frac_field(x)
        >>> ZZx = ZZ.old_frac_field(x)

        >>> QQx.from_FractionField(f, ZZx)
        DMF([1, 2], [1, 1], QQ)

        N)r   r   r5   rJ   r[   r7   setissubsetr	   r\   r]   r^   )rL   r9   rM   nmonomsncoeffsdmonomsdcoeffsra   s           r   from_FractionFieldz FractionField.from_FractionFieldo   s   ( 77bggvv1779,,RVV4<<>779,,RVV4<<>@ A A\""277+,	!!#RWWbgg 7GW,	!!#RWWbgg 7GW vv?FH!BFFNN1bff5HH?FH!BFFNN1bff5HHtC12DWg9N4OPQQ , IHs   5-H(-Hc                 H    ddl m}  || j                  g| j                   S )z)Returns a ring associated with ``self``. r   )PolynomialRing)sympy.polys.domainsrl   r   r   )r   rl   s     r   get_ringzFractionField.get_ring   s    6dhh333r   c                     t        d      )z(Returns a polynomial ring, i.e. `K[X]`. nested domains not allowedNotImplementedErrorr   r   s     r   	poly_ringzFractionField.poly_ring       !">??r   c                     t        d      )z'Returns a fraction field, i.e. `K(X)`. rp   rq   rs   s     r   
frac_fieldzFractionField.frac_field   ru   r   c                 p    | j                   j                  |j                         j                               S )z#Returns True if ``a`` is positive. )r   is_positiver5   LCr8   s     r   ry   zFractionField.is_positive   #    xx##AGGILLN33r   c                 p    | j                   j                  |j                         j                               S )z#Returns True if ``a`` is negative. )r   is_negativer5   rz   r8   s     r   r}   zFractionField.is_negative   r{   r   c                 p    | j                   j                  |j                         j                               S )z'Returns True if ``a`` is non-positive. )r   is_nonpositiver5   rz   r8   s     r   r   zFractionField.is_nonpositive   #    xx&&qwwy||~66r   c                 p    | j                   j                  |j                         j                               S )z'Returns True if ``a`` is non-negative. )r   is_nonnegativer5   rz   r8   s     r   r   zFractionField.is_nonnegative   r   r   c                 "    |j                         S )zReturns numerator of ``a``. )r5   r8   s     r   r5   zFractionField.numer       wwyr   c                 "    |j                         S )zReturns denominator of ``a``. )r7   r8   s     r   r7   zFractionField.denom   r   r   c                 V    | j                  | j                  j                  |            S )zReturns factorial of ``a``. )r   r   	factorialr8   s     r   r   zFractionField.factorial   s     zz$((,,Q/00r   N)$r.   
__module____qualname____doc__r   r   is_FractionFieldis_Frachas_assoc_Ringhas_assoc_Fieldr   r   r"   r+   r/   r3   r:   r>   rN   rQ   rS   rU   rW   rY   rb   rj   rn   rt   rw   ry   r}   r   r   r5   r7   r    r   r   r   r      s    =E!%%wNO(/AIP\
H
)))))))1$RL4
@@44771r   r   N)r   sympy.polys.domains.fieldr   #sympy.polys.domains.compositedomainr   sympy.polys.polyclassesr   sympy.polys.polyerrorsr   sympy.polys.polyutilsr   r   r	   sympy.utilitiesr
   r   r   r   r   <module>r      s=    6 , ? ' 3 Q Q "p1E? p1 p1r   