o
    jgR                     @   sn   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	 d	eeZd
S )z0Implementation of :class:`FractionField` class.     )Field)CompositeDomain)DMF)GeneratorsNeeded)dict_from_basicbasic_from_dict_dict_reorder)publicc                   @   s   e Zd ZdZeZd ZZdZdZ	dd Z
dd Zdd Zd	d
 Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Z d1d2 Z!d3d4 Z"d5d6 Z#d7S )8FractionFieldz3A class for representing rational function fields. Tc                 G   s^   |st dt|d }t|| _| j||| _| j||| _| | _| _| | _| _	d S )Nzgenerators not specified   )
r   lenngensdtypezeroonedomaindomsymbolsgens)selfr   r   lev r   ]/var/www/html/zoom/venv/lib/python3.10/site-packages/sympy/polys/domains/old_fractionfield.py__init__   s   
zFractionField.__init__c                 C   s   | j |g| jR  S )z-Make a new fraction field with given domain. )	__class__r   )r   r   r   r   r   
set_domain"      zFractionField.set_domainc                 C   s   |  || jt| jd S )Nr   )r   r   r   r   )r   elementr   r   r   new&      zFractionField.newc                 C   s$   t | jd dtt | j d S )N(,))strr   joinmapr   r   r   r   r   __str__)   s   $zFractionField.__str__c                 C   s   t | jj| j| j| jfS )N)hashr   __name__r   r   r   r&   r   r   r   __hash__,   r   zFractionField.__hash__c                 C   s.   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   otherr   r   r   __eq__/   s   



zFractionField.__eq__c                 C   s4   t |  g| jR  t |  g| jR   S )z!Convert ``a`` to a SymPy object. )r   numerto_sympy_dictr   denomr   ar   r   r   to_sympy4   s   zFractionField.to_sympyc           	      C   s   |  \}}t|| jd\}}t|| jd\}}| D ]\}}| j|||< q| D ]\}}| j|||< q-| ||f S )z)Convert SymPy's expression to ``dtype``. )r   )as_numer_denomr   r   itemsr   
from_sympycancel)	r   r2   pqnum_denkvr   r   r   r6   9   s   zFractionField.from_sympyc                 C      | | j ||S z.Convert a Python ``int`` object to ``dtype``. r   convertK1r2   K0r   r   r   from_ZZH      zFractionField.from_ZZc                 C   r?   r@   rA   rC   r   r   r   from_ZZ_pythonL   rG   zFractionField.from_ZZ_pythonc                 C   r?   )z3Convert a Python ``Fraction`` object to ``dtype``. rA   rC   r   r   r   from_QQ_pythonP   rG   zFractionField.from_QQ_pythonc                 C   r?   )z,Convert a GMPY ``mpz`` object to ``dtype``. rA   rC   r   r   r   from_ZZ_gmpyT   rG   zFractionField.from_ZZ_gmpyc                 C   r?   )z,Convert a GMPY ``mpq`` object to ``dtype``. rA   rC   r   r   r   from_QQ_gmpyX   rG   zFractionField.from_QQ_gmpyc                 C   r?   )z.Convert a mpmath ``mpf`` object to ``dtype``. rA   rC   r   r   r   from_RealField\   rG   zFractionField.from_RealFieldc                    s   j  j krj jkr| S |j S t|  j j \}}j jkr8 fdd|D }tt||S )z'Convert a ``DMF`` object to ``dtype``. c                       g | ]
}j | j qS r   rA   .0crE   rD   r   r   
<listcomp>k       z;FractionField.from_GlobalPolynomialRing.<locals>.<listcomp>)r   r   to_listrB   r   to_dictdictzip)rD   r2   rE   monomscoeffsr   rQ   r   from_GlobalPolynomialRing`   s   z'FractionField.from_GlobalPolynomialRingc                    s   j  j kr$j jkr|S | j | j fS t j j rst| 	  j j \}}t| 	  j j \}}j jkrc fdd|D } fd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)
        DMF([1, 2], [1, 1], QQ)

        c                    rM   r   rA   rN   rQ   r   r   rR      rS   z4FractionField.from_FractionField.<locals>.<listcomp>c                    rM   r   rA   rN   rQ   r   r   rR      rS   N)r   r   r.   rB   rT   r0   setissubsetr   rU   rV   rW   )rD   r2   rE   nmonomsncoeffsdmonomsdcoeffsr   rQ   r   from_FractionFieldo   s$    z FractionField.from_FractionFieldc                 C   s    ddl m} || jg| jR  S )z)Returns a ring associated with ``self``. r   )PolynomialRing)sympy.polys.domainsrb   r   r   )r   rb   r   r   r   get_ring   s   zFractionField.get_ringc                 G      t d)z(Returns a polynomial ring, i.e. `K[X]`. nested domains not allowedNotImplementedErrorr   r   r   r   r   	poly_ring      zFractionField.poly_ringc                 G   re   )z'Returns a fraction field, i.e. `K(X)`. rf   rg   ri   r   r   r   
frac_field   rk   zFractionField.frac_fieldc                 C      | j |  S )z#Returns True if ``a`` is positive. )r   is_positiver.   LCr1   r   r   r   rn      r   zFractionField.is_positivec                 C   rm   )z#Returns True if ``a`` is negative. )r   is_negativer.   ro   r1   r   r   r   rp      r   zFractionField.is_negativec                 C   rm   )z'Returns True if ``a`` is non-positive. )r   is_nonpositiver.   ro   r1   r   r   r   rq      r   zFractionField.is_nonpositivec                 C   rm   )z'Returns True if ``a`` is non-negative. )r   is_nonnegativer.   ro   r1   r   r   r   rr      r   zFractionField.is_nonnegativec                 C      |  S )zReturns numerator of ``a``. )r.   r1   r   r   r   r.      rk   zFractionField.numerc                 C   rs   )zReturns denominator of ``a``. )r0   r1   r   r   r   r0      rk   zFractionField.denomc                 C   s   |  | j|S )zReturns factorial of ``a``. )r   r   	factorialr1   r   r   r   rt      rG   zFractionField.factorialN)$r)   
__module____qualname____doc__r   r   is_FractionFieldis_Frachas_assoc_Ringhas_assoc_Fieldr   r   r   r'   r*   r-   r3   r6   rF   rH   rI   rJ   rK   rL   rZ   ra   rd   rj   rl   rn   rp   rq   rr   r.   r0   rt   r   r   r   r   r
      s@    &r
   N)rw   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   r   <module>   s    