U
    me9                     @   sR   d Z ddlmZ ddlmZ ddlmZmZ ddlm	Z	 e	G dd deeZ
dS )	z0Implementation of :class:`FractionField` class.     )CompositeDomain)Field)CoercionFailedGeneratorsError)publicc                   @   s:  e Zd ZdZd ZZdZdZdFddZdd Z	e
dd	 Ze
d
d Ze
dd Ze
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d0d1 Zd2d3 Z d4d5 Z!d6d7 Z"d8d9 Z#d:d; Z$d<d= Z%d>d? Z&d@dA Z'dBdC Z(dDdE Z)dS )GFractionFieldz@A class for representing multivariate rational function fields. TNc                 C   sr   ddl m} t||r,|d kr,|d kr,|}n||||}|| _|j| _|j| _|j| _|j| _|j| _| j| _	d S )Nr   )	FracField)
Zsympy.polys.fieldsr   
isinstancefielddtypeZgensZngenssymbolsdomaindom)selfZdomain_or_fieldr   orderr   r
    r   E/tmp/pip-unpacked-wheel-rdz2gdd2/sympy/polys/domains/fractionfield.py__init__   s    zFractionField.__init__c                 C   s   | j |S N)r
   Z	field_new)r   elementr   r   r   new%   s    zFractionField.newc                 C   s   | j jS r   )r
   zeror   r   r   r   r   (   s    zFractionField.zeroc                 C   s   | j jS r   )r
   oner   r   r   r   r   ,   s    zFractionField.onec                 C   s   | j jS r   )r
   r   r   r   r   r   r   0   s    zFractionField.orderc                 C   s   | j jS r   )r   is_Exactr   r   r   r   r   4   s    zFractionField.is_Exactc                 C   s   t | j | jS r   )r   r   	get_exactr   r   r   r   r   r   8   s    zFractionField.get_exactc                 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| jfS r   )hash	__class____name__r   r
   r   r   r   r   r   r   __hash__>   s    zFractionField.__hash__c                 C   s.   t |to,| jj| j| jf|jj|j|jfkS )z0Returns ``True`` if two domains are equivalent. )r	   r   r   r
   r   r   )r   otherr   r   r   __eq__A   s
    
zFractionField.__eq__c                 C   s   |  S )z!Convert ``a`` to a SymPy object. )Zas_exprr   ar   r   r   to_sympyG   s    zFractionField.to_sympyc                 C   s   | j |S )z)Convert SymPy's expression to ``dtype``. )r
   Z	from_exprr)   r   r   r   
from_sympyK   s    zFractionField.from_sympyc                 C   s   | | j ||S z.Convert a Python ``int`` object to ``dtype``. r   convertK1r*   K0r   r   r   from_ZZO   s    zFractionField.from_ZZc                 C   s   | | j ||S r-   r.   r0   r   r   r   from_ZZ_pythonS   s    zFractionField.from_ZZ_pythonc                 C   sL   | j }|j}|jr:| ||||| |||| S | |||S dS )3Convert a Python ``Fraction`` object to ``dtype``. N)r   convert_fromZis_ZZnumerdenom)r1   r*   r2   r   convr   r   r   from_QQW   s
    (zFractionField.from_QQc                 C   s   | | j ||S )r5   r.   r0   r   r   r   from_QQ_python`   s    zFractionField.from_QQ_pythonc                 C   s   | | j ||S )z,Convert a GMPY ``mpz`` object to ``dtype``. r.   r0   r   r   r   from_ZZ_gmpyd   s    zFractionField.from_ZZ_gmpyc                 C   s   | | j ||S )z,Convert a GMPY ``mpq`` object to ``dtype``. r.   r0   r   r   r   from_QQ_gmpyh   s    zFractionField.from_QQ_gmpyc                 C   s   | | j ||S )z4Convert a ``GaussianRational`` object to ``dtype``. r.   r0   r   r   r   from_GaussianRationalFieldl   s    z(FractionField.from_GaussianRationalFieldc                 C   s   | | j ||S )z3Convert a ``GaussianInteger`` object to ``dtype``. r.   r0   r   r   r   from_GaussianIntegerRingp   s    z&FractionField.from_GaussianIntegerRingc                 C   s   | | j ||S z.Convert a mpmath ``mpf`` object to ``dtype``. r.   r0   r   r   r   from_RealFieldt   s    zFractionField.from_RealFieldc                 C   s   | | j ||S r@   r.   r0   r   r   r   from_ComplexFieldx   s    zFractionField.from_ComplexFieldc                 C   s.   | j |kr| j ||}|dk	r*| |S dS )z*Convert an algebraic number to ``dtype``. N)r   r6   r   r0   r   r   r   from_AlgebraicField|   s    
z!FractionField.from_AlgebraicFieldc                 C   s|   |j r| |d|jS z| || jjW S  tt	fk
rv   z| |W  Y S  tt	fk
rp   Y Y dS X Y nX dS )z#Convert a polynomial to ``dtype``.    N)
Z	is_groundr6   Zcoeffr   r   Zset_ringr
   Zringr   r   r0   r   r   r   from_PolynomialRing   s    z!FractionField.from_PolynomialRingc              	   C   s.   z| | jW S  ttfk
r(   Y dS X dS )z*Convert a rational function to ``dtype``. N)Z	set_fieldr
   r   r   r0   r   r   r   from_FractionField   s    z FractionField.from_FractionFieldc                 C   s   | j   S )z*Returns a field associated with ``self``. )r
   Zto_ringZ	to_domainr   r   r   r   get_ring   s    zFractionField.get_ringc                 C   s   | j |jjS )z'Returns True if ``LC(a)`` is positive. )r   is_positiver7   LCr)   r   r   r   rH      s    zFractionField.is_positivec                 C   s   | j |jjS )z'Returns True if ``LC(a)`` is negative. )r   is_negativer7   rI   r)   r   r   r   rJ      s    zFractionField.is_negativec                 C   s   | j |jjS )z+Returns True if ``LC(a)`` is non-positive. )r   is_nonpositiver7   rI   r)   r   r   r   rK      s    zFractionField.is_nonpositivec                 C   s   | j |jjS )z+Returns True if ``LC(a)`` is non-negative. )r   is_nonnegativer7   rI   r)   r   r   r   rL      s    zFractionField.is_nonnegativec                 C   s   |j S )zReturns numerator of ``a``. )r7   r)   r   r   r   r7      s    zFractionField.numerc                 C   s   |j S )zReturns denominator of ``a``. )r8   r)   r   r   r   r8      s    zFractionField.denomc                 C   s   |  | j|S )zReturns factorial of ``a``. )r   r   	factorialr)   r   r   r   rM      s    zFractionField.factorial)NN)*r%   
__module____qualname____doc__Zis_FractionFieldZis_FracZhas_assoc_RingZhas_assoc_Fieldr   r   propertyr   r   r   r   r   r"   r&   r(   r+   r,   r3   r4   r:   r;   r<   r=   r>   r?   rA   rB   rC   rE   rF   rG   rH   rJ   rK   rL   r7   r8   rM   r   r   r   r   r   	   sR   




	r   N)rP   Z#sympy.polys.domains.compositedomainr   Zsympy.polys.domains.fieldr   Zsympy.polys.polyerrorsr   r   Zsympy.utilitiesr   r   r   r   r   r   <module>   s   