U
    ZÊ¹jR  ã                   @   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   ÚlenZngensÚdtypeÚzeroÚoneÚdomainÚdomÚsymbolsÚgens)Úselfr   r   Zlev© r   úd/var/www/html/bwave/python/venv/lib/python3.8/site-packages/sympy/polys/domains/old_fractionfield.pyÚ__init__   s    
zFractionField.__init__c                 C   s   | j |f| jžŽ S )z-Make a new fraction field with given domain. )Ú	__class__r   )r   r   r   r   r   Ú
set_domain"   s    zFractionField.set_domainc                 C   s   |   || jt| jƒd ¡S )Nr   )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)Úhashr   Ú__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_sympy4   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   r0   9   s    zFractionField.from_sympyc                 C   s   | | j  ||¡ƒS ©z.Convert a Python ``int`` object to ``dtype``. ©r   Úconvert©ÚK1r-   ÚK0r   r   r   Úfrom_ZZH   s    zFractionField.from_ZZc                 C   s   | | j  ||¡ƒS r8   r9   r;   r   r   r   Úfrom_ZZ_pythonL   s    zFractionField.from_ZZ_pythonc                 C   s   | | j  ||¡ƒS )z3Convert a Python ``Fraction`` object to ``dtype``. r9   r;   r   r   r   Úfrom_QQ_pythonP   s    zFractionField.from_QQ_pythonc                 C   s   | | j  ||¡ƒS )z,Convert a GMPY ``mpz`` object to ``dtype``. r9   r;   r   r   r   Úfrom_ZZ_gmpyT   s    zFractionField.from_ZZ_gmpyc                 C   s   | | j  ||¡ƒS )z,Convert a GMPY ``mpq`` object to ``dtype``. r9   r;   r   r   r   Úfrom_QQ_gmpyX   s    zFractionField.from_QQ_gmpyc                 C   s   | | j  ||¡ƒS )z.Convert a mpmath ``mpf`` object to ``dtype``. r9   r;   r   r   r   Úfrom_RealField\   s    zFractionField.from_RealFieldc                    sˆ   ˆj ˆ j kr:ˆjˆ jkr$ˆ| ¡ ƒS ˆ| ˆj¡ ¡ ƒS nJt| ¡ ˆ j ˆj ƒ\}}ˆjˆ jkrr‡ ‡fdd„|D ƒ}ˆtt||ƒƒƒS dS )z'Convert a ``DMF`` object to ``dtype``. c                    s   g | ]}ˆj  |ˆ j ¡‘qS r   r9   ©Ú.0Úc©r=   r<   r   r   Ú
<listcomp>k   s     z;FractionField.from_GlobalPolynomialRing.<locals>.<listcomp>N)r   r   Úto_listr:   r   Úto_dictÚdictÚzip)r<   r-   r=   ZmonomsZcoeffsr   rG   r   Úfrom_GlobalPolynomialRing`   s    z'FractionField.from_GlobalPolynomialRingc                    sì   ˆj ˆ j krJˆjˆ jkr|S ˆ| ¡  ˆj¡ ¡ | ¡  ˆj¡ ¡ fƒS nžtˆ j ƒ ˆj ¡rèt| ¡  	¡ ˆ 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)
        DMF([1, 2], [1, 1], QQ)

        c                    s   g | ]}ˆj  |ˆ j ¡‘qS r   r9   rD   rG   r   r   rH   �   s     z4FractionField.from_FractionField.<locals>.<listcomp>c                    s   g | ]}ˆj  |ˆ j ¡‘qS r   r9   rD   rG   r   r   rH   ‘   s     N)r   r   r*   r:   rI   r+   ÚsetÚissubsetr   rJ   rK   rL   )r<   r-   r=   ZnmonomsZncoeffsZdmonomsZdcoeffsr   rG   r   Úfrom_FractionFieldo   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.domainsrQ   r   r   )r   rQ   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)`. rS   NrT   rV   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   rY   ¢   s    zFractionField.is_positivec                 C   s   | j  | ¡  ¡ ¡S )z#Returns True if ``a`` is negative. )r   Úis_negativer*   rZ   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*   rZ   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*   rZ   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&   r)   r.   r0   r>   r?   r@   rA   rB   rC   rM   rP   rR   rW   rX   rY   r[   r\   r]   r*   r+   r^   r   r   r   r   r
      s>   &r
   N)ra   Zsympy.polys.domains.fieldr   Z#sympy.polys.domains.compositedomainr   Zsympy.polys.polyclassesr   Zsympy.polys.polyerrorsr   Zsympy.polys.polyutilsr   r   r   Zsympy.utilitiesr	   r
   r   r   r   r   Ú<module>   s   