B
    [U                 @   s|   d Z ddlmZmZ ddlmZ ddlmZ ddlm	Z	 ddl
mZmZ ddlmZ ddlmZ eG d	d
 d
ee	eZdS )z3Implementation of :class:`ExpressionDomain` class.     )print_functiondivision)Field)SimpleDomain)CharacteristicZero)sympifySympifyError)public)PicklableWithSlotsc               @   s   e Zd ZdZd ZZG dd deZeZedZ	edZ
d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/d0 Z!d1d2 Z"d3S )4ExpressionDomainz#A class for arbitrary expressions. Tc               @   s   e Zd ZdZdg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eZeZd+d, Zd-d. Zd/d0 ZeZd1d2 Zd3d4 Z d5S )6zExpressionDomain.ExpressionzAn arbitrary expression. exc             C   s$   t || jst|| _n|j| _d S )N)
isinstance	__class__r   r   )selfr    r   Clib/python3.7/site-packages/sympy/polys/domains/expressiondomain.py__init__   s    z$ExpressionDomain.Expression.__init__c             C   s   dt | j S )NzEX(%s))reprr   )fr   r   r   __repr__   s    z$ExpressionDomain.Expression.__repr__c             C   s   dt | j S )NzEX(%s))strr   )r   r   r   r   __str__!   s    z#ExpressionDomain.Expression.__str__c             C   s   t | jj| jfS )N)hashr   __name__r   )r   r   r   r   __hash__$   s    z$ExpressionDomain.Expression.__hash__c             C   s   | j S )N)r   )r   r   r   r   as_expr'   s    z#ExpressionDomain.Expression.as_exprc             C   s   |  | j d S )Nr   )r   r   as_numer_denom)r   r   r   r   numer*   s    z!ExpressionDomain.Expression.numerc             C   s   |  | j d S )N   )r   r   r   )r   r   r   r   denom-   s    z!ExpressionDomain.Expression.denomc             C   s   |  | S )N)r   Zcancel)r   r   r   r   r   simplify0   s    z$ExpressionDomain.Expression.simplifyc             C   s   |  t| jS )N)r   absr   )r   r   r   r   __abs__3   s    z#ExpressionDomain.Expression.__abs__c             C   s   |  | j S )N)r   r   )r   r   r   r   __neg__6   s    z#ExpressionDomain.Expression.__neg__c             C   s$   y
|  |S  tk
r   d S X d S )N)r   r   )r   gr   r   r   _to_ex9   s    
z"ExpressionDomain.Expression._to_exc             C   s,   |  |}|d k	r$| | j|j S tS d S )N)r%   r    r   NotImplemented)r   r$   r   r   r   __add__?   s    
z#ExpressionDomain.Expression.__add__c             C   s   |  | |j| j S )N)r    r   r   )r   r$   r   r   r   __radd__G   s    z$ExpressionDomain.Expression.__radd__c             C   s,   |  |}|d k	r$| | j|j S tS d S )N)r%   r    r   r&   )r   r$   r   r   r   __sub__J   s    
z#ExpressionDomain.Expression.__sub__c             C   s   |  | |j| j S )N)r    r   r   )r   r$   r   r   r   __rsub__R   s    z$ExpressionDomain.Expression.__rsub__c             C   s,   |  |}|d k	r$| | j|j S tS d S )N)r%   r    r   r&   )r   r$   r   r   r   __mul__U   s    
z#ExpressionDomain.Expression.__mul__c             C   s   |  | |j| j S )N)r    r   r   )r   r$   r   r   r   __rmul__]   s    z$ExpressionDomain.Expression.__rmul__c             C   s,   |  |}|d k	r$| | j|j S tS d S )N)r%   r    r   r&   )r   nr   r   r   __pow__`   s    
z#ExpressionDomain.Expression.__pow__c             C   s,   |  |}|d k	r$| | j|j S tS d S )N)r%   r    r   r&   )r   r$   r   r   r   __truediv__h   s    
z'ExpressionDomain.Expression.__truediv__c             C   s   |  | |j| j S )N)r    r   r   )r   r$   r   r   r   __rtruediv__p   s    z(ExpressionDomain.Expression.__rtruediv__c             C   s   | j | |j kS )N)r   r   )r   r$   r   r   r   __eq__v   s    z"ExpressionDomain.Expression.__eq__c             C   s
   | |k S )Nr   )r   r$   r   r   r   __ne__y   s    z"ExpressionDomain.Expression.__ne__c             C   s
   | j dkS )Nr   )r   )r   r   r   r   __nonzero__|   s    z'ExpressionDomain.Expression.__nonzero__c             C   s&   ddl m} | || j| |jS )Nr   )gcd)sympy.polysr4   r   r   )r   r$   r4   r   r   r   r4      s    zExpressionDomain.Expression.gcdc             C   s&   ddl m} | || j| |jS )Nr   )lcm)r5   r6   r   r   )r   r$   r6   r   r   r   r6      s    zExpressionDomain.Expression.lcmN)!r   
__module____qualname____doc__	__slots__r   r   r   r   r   r   r   r    r"   r#   r%   r'   r(   r)   r*   r+   r,   r.   r/   r0   Z__div__Z__rdiv__r1   r2   r3   __bool__r4   r6   r   r   r   r   
Expression   s<   r<   r   r   ZEXFc             C   s   d S )Nr   )r   r   r   r   r      s    zExpressionDomain.__init__c             C   s   |  S )z!Convert ``a`` to a SymPy object. )r   )r   ar   r   r   to_sympy   s    zExpressionDomain.to_sympyc             C   s
   |  |S )z)Convert SymPy's expression to ``dtype``. )dtype)r   r=   r   r   r   
from_sympy   s    zExpressionDomain.from_sympyc             C   s   | | |S )z.Convert a Python ``int`` object to ``dtype``. )r>   )K1r=   K0r   r   r   from_ZZ_python   s    zExpressionDomain.from_ZZ_pythonc             C   s   | | |S )z3Convert a Python ``Fraction`` object to ``dtype``. )r>   )rA   r=   rB   r   r   r   from_QQ_python   s    zExpressionDomain.from_QQ_pythonc             C   s   | | |S )z,Convert a GMPY ``mpz`` object to ``dtype``. )r>   )rA   r=   rB   r   r   r   from_ZZ_gmpy   s    zExpressionDomain.from_ZZ_gmpyc             C   s   | | |S )z,Convert a GMPY ``mpq`` object to ``dtype``. )r>   )rA   r=   rB   r   r   r   from_QQ_gmpy   s    zExpressionDomain.from_QQ_gmpyc             C   s   | | |S )z.Convert a mpmath ``mpf`` object to ``dtype``. )r>   )rA   r=   rB   r   r   r   from_RealField   s    zExpressionDomain.from_RealFieldc             C   s   | | |S )z'Convert a ``DMP`` object to ``dtype``. )r>   )rA   r=   rB   r   r   r   from_PolynomialRing   s    z$ExpressionDomain.from_PolynomialRingc             C   s   | | |S )z'Convert a ``DMF`` object to ``dtype``. )r>   )rA   r=   rB   r   r   r   from_FractionField   s    z#ExpressionDomain.from_FractionFieldc             C   s   |S )z&Convert a ``EX`` object to ``dtype``. r   )rA   r=   rB   r   r   r   from_ExpressionDomain   s    z&ExpressionDomain.from_ExpressionDomainc             C   s   | S )z)Returns a ring associated with ``self``. r   )r   r   r   r   get_ring   s    zExpressionDomain.get_ringc             C   s   | S )z*Returns a field associated with ``self``. r   )r   r   r   r   	get_field   s    zExpressionDomain.get_fieldc             C   s   |j  d jS )z#Returns True if ``a`` is positive. r   )r   as_coeff_mulis_positive)r   r=   r   r   r   rN      s    zExpressionDomain.is_positivec             C   s   |j  d jS )z#Returns True if ``a`` is negative. r   )r   rM   is_negative)r   r=   r   r   r   rO      s    zExpressionDomain.is_negativec             C   s   |j  d jS )z'Returns True if ``a`` is non-positive. r   )r   rM   is_nonpositive)r   r=   r   r   r   rP      s    zExpressionDomain.is_nonpositivec             C   s   |j  d jS )z'Returns True if ``a`` is non-negative. r   )r   rM   is_nonnegative)r   r=   r   r   r   rQ      s    zExpressionDomain.is_nonnegativec             C   s   |  S )zReturns numerator of ``a``. )r   )r   r=   r   r   r   r      s    zExpressionDomain.numerc             C   s   |  S )zReturns denominator of ``a``. )r   )r   r=   r   r   r   r      s    zExpressionDomain.denomc             C   s
   | |S )N)r4   )r   r=   br   r   r   r4      s    zExpressionDomain.gcdc             C   s
   | |S )N)r6   )r   r=   rR   r   r   r   r6      s    zExpressionDomain.lcmN)#r   r7   r8   r9   Zis_SymbolicDomainZis_EXr
   r<   r?   ZzeroZoneZrepZhas_assoc_RingZhas_assoc_Fieldr   r>   r@   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rN   rO   rP   rQ   r   r   r4   r6   r   r   r   r   r      s<   vr   N)r9   Z
__future__r   r   Zsympy.polys.domains.fieldr   Z sympy.polys.domains.simpledomainr   Z&sympy.polys.domains.characteristiczeror   Z
sympy.corer   r   Zsympy.utilitiesr	   Zsympy.polys.polyutilsr
   r   r   r   r   r   <module>   s   