
    Rie"                         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
 ddlmZmZmZ ddlmZ e G d	 d
eee                      ZdS )z0Implementation of :class:`FractionField` class.     )Field)CompositeDomain)CharacteristicZero)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S )FractionFieldz3A class for representing rational function fields. Tc                 4   |st          d          t          |          dz
  }t          |          | _        | j                            |||           | _        | j                            |||           | _        |x| _        | _        |x| _        | _	        d S )Nzgenerators not specified   ring)
r   lenngensdtypezeroonedomaindomsymbolsgens)selfr   r   levs       Elib/python3.11/site-packages/sympy/polys/domains/old_fractionfield.py__init__zFractionField.__init__   s     	?"#=>>>$ii!mYY
JOOC4O88	:>>#s>66!$$dh#''tyyy    c                 h    |                      || j        t          | j                  dz
  |           S )Nr   r   )r   r   r   r   )r   elements     r   newzFractionField.new#   s+    zz'48S^^a-?dzKKKr   c                     t          | j                  dz   d                    t          t           | j                            z   dz   S )N(,))strr   joinmapr   r   s    r   __str__zFractionField.__str__&   s7    48}}s"SXXc#ty.A.A%B%BBSHHr   c                 Z    t          | j        j        | j        | j        | j        f          S )N)hash	__class____name__r   r   r   r*   s    r   __hash__zFractionField.__hash__)   s$    T^,dj$(DINOOOr   c                     t          |t                    o/| j        |j        k    o| j        |j        k    o| j        |j        k    S )z0Returns ``True`` if two domains are equivalent. )
isinstancer   r   r   r   )r   others     r   __eq__zFractionField.__eq__,   sM    %// \J%+%\*.(ei*?\DHIQVQ[D[	\r   c                     t          |                                                                g| j        R  t          |                                                                g| j        R  z  S )z!Convert ``a`` to a SymPy object. )r	   numerto_sympy_dictr   denomr   as     r   to_sympyzFractionField.to_sympy1   s`    		 7 7 9 9FDIFFF		 7 7 9 9FDIFFFG 	Hr   c                    |                                 \  }}t          || j                  \  }}t          || j                  \  }}|                                D ]"\  }}| j                            |          ||<   #|                                D ]"\  }}| j                            |          ||<   # | ||f                                          S )z)Convert SymPy's expression to ``dtype``. )r   )as_numer_denomr   r   itemsr   
from_sympycancel)	r   r:   pqnum_denkvs	            r   r?   zFractionField.from_sympy6   s    !!1 333Q 333QIIKK 	, 	,DAqX((++CFFIIKK 	, 	,DAqX((++CFFtS#J&&(((r   c                 J     | | j                             ||                    S z.Convert a Python ``int`` object to ``dtype``. r   convertK1r:   K0s      r   from_ZZzFractionField.from_ZZE   "    r"&..B''(((r   c                 J     | | j                             ||                    S rI   rJ   rL   s      r   from_ZZ_pythonzFractionField.from_ZZ_pythonI   rP   r   c                 J     | | j                             ||                    S )z3Convert a Python ``Fraction`` object to ``dtype``. rJ   rL   s      r   from_QQ_pythonzFractionField.from_QQ_pythonM   rP   r   c                 J     | | j                             ||                    S )z,Convert a GMPY ``mpz`` object to ``dtype``. rJ   rL   s      r   from_ZZ_gmpyzFractionField.from_ZZ_gmpyQ   rP   r   c                 J     | | j                             ||                    S )z,Convert a GMPY ``mpq`` object to ``dtype``. rJ   rL   s      r   from_QQ_gmpyzFractionField.from_QQ_gmpyU   rP   r   c                 J     | | j                             ||                    S )z.Convert a mpmath ``mpf`` object to ``dtype``. rJ   rL   s      r   from_RealFieldzFractionField.from_RealFieldY   rP   r   c                      j         j         k    rH j        j        k    r  |j                  S   |                     j                  j                  S t	          |                                j          j                   \  }} j        j        k    r fd|D             }  t          t          ||                              S )z'Convert a ``DMF`` object to ``dtype``. c                 P    g | ]"}j                             |j                   #S  rJ   .0crN   rM   s     r   
<listcomp>z;FractionField.from_GlobalPolynomialRing.<locals>.<listcomp>h   s+    FFF26>>!RV44FFFr   )r   r   reprK   r
   to_dictdictzip)rM   r:   rN   monomscoeffss   ` `  r   from_GlobalPolynomialRingz'FractionField.from_GlobalPolynomialRing]   s    7bgvr!%yy r!))BF++/000*199;;IINFFvFFFFFfFFF2d3vv..//000r   c           	      f     j         j         k    r} j        j        k    r|S   |                                                     j                  j        |                                                     j                  j        f          S t          j                                        j                   rt          |                                	                                j          j                   \  }}t          |                                	                                j          j                   \  }} j        j        k    r fd|D             } fd|D             }  t          t          ||                    t          t          ||                    f          S dS )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)
        (x + 2)/(x + 1)

        c                 P    g | ]"}j                             |j                   #S r]   rJ   r^   s     r   ra   z4FractionField.from_FractionField.<locals>.<listcomp>   +    HHH!BFNN1bf55HHHr   c                 P    g | ]"}j                             |j                   #S r]   rJ   r^   s     r   ra   z4FractionField.from_FractionField.<locals>.<listcomp>   rk   r   N)r   r   r6   rK   rb   r8   setissubsetr
   rc   rd   re   )rM   r:   rN   nmonomsncoeffsdmonomsdcoeffss   ` `    r   from_FractionFieldz FractionField.from_FractionFieldl   s   ( 7bgvr17799,,RV4487799,,RV448: ; ; ;\\""27++ 
	R,		!!##RWbg 7  7GW,		!!##RWbg 7  7GW vHHHHHwHHHHHHHHwHHH2tC1122DWg9N9N4O4OPQQQ
	R 
	Rr   c                 4    ddl m}  || j        g| j        R  S )z)Returns a ring associated with ``self``. r   )PolynomialRing)sympy.polys.domainsru   r   r   )r   ru   s     r   get_ringzFractionField.get_ring   s0    666666~dh33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)`. ry   rz   r|   s     r   
frac_fieldzFractionField.frac_field   r~   r   c                 ~    | j                             |                                                                          S )z#Returns True if ``a`` is positive. )r   is_positiver6   LCr9   s     r   r   zFractionField.is_positive   (    x##AGGIILLNN333r   c                 ~    | j                             |                                                                          S )z#Returns True if ``a`` is negative. )r   is_negativer6   r   r9   s     r   r   zFractionField.is_negative   r   r   c                 ~    | j                             |                                                                          S )z'Returns True if ``a`` is non-positive. )r   is_nonpositiver6   r   r9   s     r   r   zFractionField.is_nonpositive   (    x&&qwwyy||~~666r   c                 ~    | j                             |                                                                          S )z'Returns True if ``a`` is non-negative. )r   is_nonnegativer6   r   r9   s     r   r   zFractionField.is_nonnegative   r   r   c                 *    |                                 S )zReturns numerator of ``a``. )r6   r9   s     r   r6   zFractionField.numer       wwyyr   c                 *    |                                 S )zReturns denominator of ``a``. )r8   r9   s     r   r8   zFractionField.denom   r   r   c                 \    |                      | j                            |                    S )zReturns factorial of ``a``. )r   r   	factorialr9   s     r   r   zFractionField.factorial   s$    zz$(,,Q//000r   N)#r/   
__module____qualname____doc__r   r   is_FractionFieldis_Frachas_assoc_Ringhas_assoc_Fieldr   r"   r+   r0   r4   r;   r?   rO   rR   rT   rV   rX   rZ   rh   rs   rw   r}   r   r   r   r   r   r6   r8   r   r]   r   r   r   r      s       ==E!%%wNO( ( (L L LI I IP P P\ \ \
H H H
) ) )) ) )) ) )) ) )) ) )) ) )) ) )1 1 1$R $R $RL4 4 4
@ @ @@ @ @4 4 44 4 47 7 77 7 7    1 1 1 1 1r   r   N)r   sympy.polys.domains.fieldr   #sympy.polys.domains.compositedomainr   &sympy.polys.domains.characteristiczeror   sympy.polys.polyclassesr   sympy.polys.polyerrorsr   sympy.polys.polyutilsr   r	   r
   sympy.utilitiesr   r   r]   r   r   <module>r      s    6 6 , + + + + + ? ? ? ? ? ? E E E E E E ' ' ' ' ' ' 3 3 3 3 3 3 Q Q Q Q Q Q Q Q Q Q " " " " " "l1 l1 l1 l1 l1E- l1 l1 l1 l1 l1r   