U
    9%e"                     @   s|   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
 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                   @   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"d5S )6FractionFieldz3A class for representing rational function fields. Tc                 G   sf   |st dt|d }t|| _| jj||| d| _| jj||| d| _| | _| _| | _| _	d S )Nzgenerators not specified   ring)
r   lenZngensdtypezeroonedomaindomsymbolsgens)selfr   r   Zlev r   d/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/sympy/polys/domains/old_fractionfield.py__init__   s    
zFractionField.__init__c                 C   s   | j || jt| jd | dS )Nr   r   )r   r   r   r   )r   elementr   r   r   new#   s    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)hash	__class____name__r   r   r   r#   r   r   r   __hash__)   s    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   s0   t |  f| j t |  f| j  S )z!Convert ``a`` to a SymPy object. )r   numerZto_sympy_dictr   denomr   ar   r   r   to_sympy1   s    zFractionField.to_sympyc           	      C   s   |  \}}t|| jd\}}t|| jd\}}| D ]\}}| j|||< q8| D ]\}}| j|||< qZ| ||f S )z)Convert SymPy's expression to ``dtype``. )r   )Zas_numer_denomr   r   itemsr   
from_sympycancel)	r   r/   pqnum_Zdenkvr   r   r   r2   6   s    zFractionField.from_sympyc                 C   s   | | j ||S z.Convert a Python ``int`` object to ``dtype``. r   convertK1r/   K0r   r   r   from_ZZE   s    zFractionField.from_ZZc                 C   s   | | j ||S r:   r;   r=   r   r   r   from_ZZ_pythonI   s    zFractionField.from_ZZ_pythonc                 C   s   | | j ||S )z3Convert a Python ``Fraction`` object to ``dtype``. r;   r=   r   r   r   from_QQ_pythonM   s    zFractionField.from_QQ_pythonc                 C   s   | | j ||S )z,Convert a GMPY ``mpz`` object to ``dtype``. r;   r=   r   r   r   from_ZZ_gmpyQ   s    zFractionField.from_ZZ_gmpyc                 C   s   | | j ||S )z,Convert a GMPY ``mpq`` object to ``dtype``. r;   r=   r   r   r   from_QQ_gmpyU   s    zFractionField.from_QQ_gmpyc                 C   s   | | j ||S )z.Convert a mpmath ``mpf`` object to ``dtype``. r;   r=   r   r   r   from_RealFieldY   s    zFractionField.from_RealFieldc                    s   j  j kr6j jkr"|jS |jjS nJt|  j j \}}j jkrn fdd|D }tt||S dS )z'Convert a ``DMF`` object to ``dtype``. c                    s   g | ]}j | j qS r   r;   .0cr?   r>   r   r   
<listcomp>h   s     z;FractionField.from_GlobalPolynomialRing.<locals>.<listcomp>N)r   r   repr<   r	   to_dictdictzip)r>   r/   r?   ZmonomsZcoeffsr   rI   r   from_GlobalPolynomialRing]   s    
z'FractionField.from_GlobalPolynomialRingc                    s   j  j krFj jkr|S | jj| jjfS nt j j rt| 	  j j \}}t| 	  j j \}}j jkrć 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)
        (x + 2)/(x + 1)

        c                    s   g | ]}j | j qS r   r;   rF   rI   r   r   rJ      s     z4FractionField.from_FractionField.<locals>.<listcomp>c                    s   g | ]}j | j qS r   r;   rF   rI   r   r   rJ      s     N)r   r   r,   r<   rK   r-   setissubsetr	   rL   rM   rN   )r>   r/   r?   ZnmonomsZncoeffsZdmonomsZdcoeffsr   rI   r   from_FractionFieldl   s*    
  
  z FractionField.from_FractionFieldc                 C   s   ddl m} || jf| j S )z)Returns a ring associated with ``self``. r   )PolynomialRing)Zsympy.polys.domainsrS   r   r   )r   rS   r   r   r   get_ring   s    zFractionField.get_ringc                 G   s   t ddS )z(Returns a polynomial ring, i.e. `K[X]`. nested domains not allowedNNotImplementedErrorr   r   r   r   r   	poly_ring   s    zFractionField.poly_ringc                 G   s   t ddS )z'Returns a fraction field, i.e. `K(X)`. rU   NrV   rX   r   r   r   
frac_field   s    zFractionField.frac_fieldc                 C   s   | j |  S )z#Returns True if ``a`` is positive. )r   is_positiver,   LCr.   r   r   r   r[      s    zFractionField.is_positivec                 C   s   | j |  S )z#Returns True if ``a`` is negative. )r   is_negativer,   r\   r.   r   r   r   r]      s    zFractionField.is_negativec                 C   s   | j |  S )z'Returns True if ``a`` is non-positive. )r   is_nonpositiver,   r\   r.   r   r   r   r^      s    zFractionField.is_nonpositivec                 C   s   | j |  S )z'Returns True if ``a`` is non-negative. )r   is_nonnegativer,   r\   r.   r   r   r   r_      s    zFractionField.is_nonnegativec                 C   s   |  S )zReturns numerator of ``a``. )r,   r.   r   r   r   r,      s    zFractionField.numerc                 C   s   |  S )zReturns denominator of ``a``. )r-   r.   r   r   r   r-      s    zFractionField.denomc                 C   s   |  | j|S )zReturns factorial of ``a``. )r   r   	factorialr.   r   r   r   r`      s    zFractionField.factorialN)#r'   
__module____qualname____doc__r   r   Zis_FractionFieldZis_FracZhas_assoc_RingZhas_assoc_Fieldr   r   r$   r(   r+   r0   r2   r@   rA   rB   rC   rD   rE   rO   rR   rT   rY   rZ   r[   r]   r^   r_   r,   r-   r`   r   r   r   r   r      s<   &r   N)rc   Zsympy.polys.domains.fieldr   Z#sympy.polys.domains.compositedomainr   Z&sympy.polys.domains.characteristiczeror   Zsympy.polys.polyclassesr   Zsympy.polys.polyerrorsr   Zsympy.polys.polyutilsr   r   r	   Zsympy.utilitiesr
   r   r   r   r   r   <module>   s   