
    MZd"                         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y)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"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   ring)
r   lenngensdtypezeroonedomaindomsymbolsgens)selfr   r   levs       G/usr/lib/python3/dist-packages/sympy/polys/domains/old_fractionfield.py__init__zFractionField.__init__   sy    "#=>>$i!mY
JJOOC4O8	::>>#s>6!$$dh#''ty    c                 l    | j                  || j                  t        | j                        dz
  |       S )Nr   r   )r   r   r   r   )r   elements     r   newzFractionField.new#   s*    zz'488S^a-?dzKKr   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)hash	__class____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_sympy1   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   r:   pqnum_denkvs	            r   r?   zFractionField.from_sympy6   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K1r:   K0s      r   from_ZZzFractionField.from_ZZE       "&&..B'((r   c                 F     | | j                   j                  ||            S rI   rJ   rL   s      r   from_ZZ_pythonzFractionField.from_ZZ_pythonI   rP   r   c                 F     | | j                   j                  ||            S )z3Convert a Python ``Fraction`` object to ``dtype``. rJ   rL   s      r   from_QQ_pythonzFractionField.from_QQ_pythonM   rP   r   c                 F     | | 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                 F     | | 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                 F     | | 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(  rV| 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   reprK   r
   to_dictdictzip)rM   r:   rN   monomscoeffscs         r   from_GlobalPolynomialRingz'FractionField.from_GlobalPolynomialRing]   s    77bggvv!%%y !))BFF+//00*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)
        (x + 2)/(x + 1)

        N)r   r   r6   rK   r\   r8   setissubsetr
   r]   r^   r_   )rM   r:   rN   nmonomsncoeffsdmonomsdcoeffsrb   s           r   from_FractionFieldz FractionField.from_FractionFieldl   s~   ( 77bggvv1779,,RVV488779,,RVV488: ; ;\""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   --H  -Hc                 H    ddl m}  || j                  g| j                   S )z)Returns a ring associated with ``self``. r   )PolynomialRing)sympy.polys.domainsrm   r   r   )r   rm   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)`. rq   rr   rt   s     r   
frac_fieldzFractionField.frac_field   rv   r   c                 p    | j                   j                  |j                         j                               S )z#Returns True if ``a`` is positive. )r   is_positiver6   LCr9   s     r   rz   zFractionField.is_positive   #    xx##AGGILLN33r   c                 p    | j                   j                  |j                         j                               S )z#Returns True if ``a`` is negative. )r   is_negativer6   r{   r9   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_nonpositiver6   r{   r9   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_nonnegativer6   r{   r9   s     r   r   zFractionField.is_nonnegative   r   r   c                 "    |j                         S )zReturns numerator of ``a``. )r6   r9   s     r   r6   zFractionField.numer       wwyr   c                 "    |j                         S )zReturns denominator of ``a``. )r8   r9   s     r   r8   zFractionField.denom   r   r   c                 V    | j                  | j                  j                  |            S )zReturns factorial of ``a``. )r   r   	factorialr9   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+   r0   r4   r;   r?   rO   rR   rT   rV   rX   rZ   rc   rk   ro   ru   rx   rz   r~   r   r   r6   r8   r    r   r   r   r      s    =E!%%wNO(L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.domains.characteristiczeror   sympy.polys.polyclassesr   sympy.polys.polyerrorsr   sympy.polys.polyutilsr   r	   r
   sympy.utilitiesr   r   r   r   r   <module>r      sC    6 , ? E ' 3 Q Q "l1E- l1 l1r   