U
    me                     @   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 ddlmZ dd	dddddd
ZeG dd deee	Ze ZdS )z3Implementation of :class:`ExpressionDomain` class.     )sympifySympifyError)CharacteristicZero)Field)SimpleDomain)PicklableWithSlots)publicFT)deepmulZ	power_expZ
power_basebasicZmultinomiallogc                   @   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"d3d4 Z#d5d6 Z$d7d8 Z%d9d: Z&d;S )<ExpressionDomainz#A class for arbitrary expressions. Tc                   @   s   e 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)d* Zd+d, Zd-d. Zd/d0 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   H/tmp/pip-unpacked-wheel-rdz2gdd2/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 r   )strr   r   r   r   r   __str__"   s    z#ExpressionDomain.Expression.__str__c                 C   s   t | jj| jfS r   )hashr   __name__r   r   r   r   r   __hash__%   s    z$ExpressionDomain.Expression.__hash__c                 C   s   | j S r   r   r   r   r   r   as_expr(   s    z#ExpressionDomain.Expression.as_exprc                 C   s   |  | j d S )Nr   r   r   Zas_numer_denomr   r   r   r   numer+   s    z!ExpressionDomain.Expression.numerc                 C   s   |  | j d S N   r#   r   r   r   r   denom.   s    z!ExpressionDomain.Expression.denomc                 C   s   |  | jf tS r   )r   cancelexpandeflags)r   r   r   r   r   simplify1   s    z$ExpressionDomain.Expression.simplifyc                 C   s   |  t| jS r   )r   absr   r   r   r   r   __abs__4   s    z#ExpressionDomain.Expression.__abs__c                 C   s   |  | j S r   )r   r   r   r   r   r   __neg__7   s    z#ExpressionDomain.Expression.__neg__c                 C   s(   z|  |W S  tk
r"   Y d S X d S r   )r   r   r   gr   r   r   _to_ex:   s    z"ExpressionDomain.Expression._to_exc                 C   sH   |  |}|d krtS |tjkr$| S | tjkr2|S | | j|j S d S r   r1   NotImplementedEXzeror+   r   r/   r   r   r   __add__@   s    


z#ExpressionDomain.Expression.__add__c                 C   s   |  | |j| j S r   r+   r   r   r/   r   r   r   __radd__L   s    z$ExpressionDomain.Expression.__radd__c                 C   sJ   |  |}|d krtS |tjkr$| S | tjkr4| S | | j|j S d S r   r2   r/   r   r   r   __sub__O   s    


z#ExpressionDomain.Expression.__sub__c                 C   s   |  | |j| j S r   r7   r/   r   r   r   __rsub__[   s    z$ExpressionDomain.Expression.__rsub__c                 C   s^   |  |}|d krtS tj| |fkr*tjS | jjrL|jjrL| | j|j S | | j|j S r   )r1   r3   r4   r5   r   Z	is_Numberr   r+   r/   r   r   r   __mul__^   s    
z#ExpressionDomain.Expression.__mul__c                 C   s   |  | |j| j S r   r7   r/   r   r   r   __rmul__k   s    z$ExpressionDomain.Expression.__rmul__c                 C   s,   |  |}|d k	r$| | j|j S tS d S r   r1   r+   r   r3   )r   nr   r   r   __pow__n   s    
z#ExpressionDomain.Expression.__pow__c                 C   s,   |  |}|d k	r$| | j|j S tS d S r   r=   r/   r   r   r   __truediv__v   s    
z'ExpressionDomain.Expression.__truediv__c                 C   s   |  | |j| j S r   r7   r/   r   r   r   __rtruediv__~   s    z(ExpressionDomain.Expression.__rtruediv__c                 C   s   | j | |j kS r   )r   r   r/   r   r   r   __eq__   s    z"ExpressionDomain.Expression.__eq__c                 C   s
   | |k S r   r   r/   r   r   r   __ne__   s    z"ExpressionDomain.Expression.__ne__c                 C   s
   | j j S r   )r   is_zeror   r   r   r   __bool__   s    z$ExpressionDomain.Expression.__bool__c                 C   s&   ddl m} | || j| |jS )Nr   )gcd)sympy.polysrF   r   r   )r   r0   rF   r   r   r   rF      s    zExpressionDomain.Expression.gcdc                 C   s&   ddl m} | || j| |jS )Nr   lcm)rG   rI   r   r   )r   r0   rI   r   r   r   rI      s    zExpressionDomain.Expression.lcmN)r   
__module____qualname____doc__	__slots__r   r   r   r!   r"   r$   r'   r+   r-   r.   r1   r6   r8   r9   r:   r;   r<   r?   r@   rA   rB   rC   rE   rF   rI   r   r   r   r   
Expression   s6   rN   r   r&   r4   Fc                 C   s   d S r   r   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``. )dtyperO   r   r   r   
from_sympy   s    zExpressionDomain.from_sympyc                 C   s   | | |S z.Convert a Python ``int`` object to ``dtype``. rQ   ZK1rP   ZK0r   r   r   from_ZZ   s    zExpressionDomain.from_ZZc                 C   s   | | |S rT   rU   rV   r   r   r   from_ZZ_python   s    zExpressionDomain.from_ZZ_pythonc                 C   s   | | |S z3Convert a Python ``Fraction`` object to ``dtype``. rU   rV   r   r   r   from_QQ   s    zExpressionDomain.from_QQc                 C   s   | | |S rY   rU   rV   r   r   r   from_QQ_python   s    zExpressionDomain.from_QQ_pythonc                 C   s   | | |S )z,Convert a GMPY ``mpz`` object to ``dtype``. rU   rV   r   r   r   from_ZZ_gmpy   s    zExpressionDomain.from_ZZ_gmpyc                 C   s   | | |S )z,Convert a GMPY ``mpq`` object to ``dtype``. rU   rV   r   r   r   from_QQ_gmpy   s    zExpressionDomain.from_QQ_gmpyc                 C   s   | | |S z4Convert a ``GaussianRational`` object to ``dtype``. rU   rV   r   r   r   from_GaussianIntegerRing   s    z)ExpressionDomain.from_GaussianIntegerRingc                 C   s   | | |S r^   rU   rV   r   r   r   from_GaussianRationalField   s    z+ExpressionDomain.from_GaussianRationalFieldc                 C   s   | | |S )z.Convert a mpmath ``mpf`` object to ``dtype``. rU   rV   r   r   r   from_RealField   s    zExpressionDomain.from_RealFieldc                 C   s   | | |S )z'Convert a ``DMP`` object to ``dtype``. rU   rV   r   r   r   from_PolynomialRing   s    z$ExpressionDomain.from_PolynomialRingc                 C   s   | | |S )z'Convert a ``DMF`` object to ``dtype``. rU   rV   r   r   r   from_FractionField   s    z#ExpressionDomain.from_FractionFieldc                 C   s   |S )z&Convert a ``EX`` object to ``dtype``. r   rV   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_positiverO   r   r   r   rh      s    zExpressionDomain.is_positivec                 C   s
   |j  S )z#Returns True if ``a`` is negative. )r   Zcould_extract_minus_signrO   r   r   r   is_negative   s    zExpressionDomain.is_negativec                 C   s   |j  d jS )z'Returns True if ``a`` is non-positive. r   )r   rg   is_nonpositiverO   r   r   r   rj      s    zExpressionDomain.is_nonpositivec                 C   s   |j  d jS )z'Returns True if ``a`` is non-negative. r   )r   rg   is_nonnegativerO   r   r   r   rk      s    zExpressionDomain.is_nonnegativec                 C   s   |  S )zReturns numerator of ``a``. )r$   rO   r   r   r   r$      s    zExpressionDomain.numerc                 C   s   |  S )zReturns denominator of ``a``. )r'   rO   r   r   r   r'      s    zExpressionDomain.denomc                 C   s   | dS r%   r   r   rP   br   r   r   rF      s    zExpressionDomain.gcdc                 C   s
   | |S r   rH   rl   r   r   r   rI      s    zExpressionDomain.lcmN)'r   rJ   rK   rL   Zis_SymbolicDomainZis_EXr   rN   rR   r5   ZonerepZhas_assoc_RingZhas_assoc_Fieldr   rQ   rS   rW   rX   rZ   r[   r\   r]   r_   r`   ra   rb   rc   rd   re   rf   rh   ri   rj   rk   r$   r'   rF   rI   r   r   r   r   r      sD   ~r   N)rL   Z
sympy.corer   r   Z&sympy.polys.domains.characteristiczeror   Zsympy.polys.domains.fieldr   Z sympy.polys.domains.simpledomainr   Zsympy.polys.polyutilsr   Zsympy.utilitiesr   r*   r   r4   r   r   r   r   <module>   s      p