U
    ;qLe  ã                   @   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ÚmulÚ	power_expÚ
power_baseÚbasicÚ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   ú{/home/p21-0144/sympy/latex2sympy2solve-back-end/sympyEq/lib/python3.8/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 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   Ú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   ©r5   ÚNotImplementedÚEXÚzeror/   r   r3   r   r   r   Ú__add__@   s    


z#ExpressionDomain.Expression.__add__c                 C   s   |   |  |¡j| j ¡S r   ©r/   r   r   r3   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   r6   r3   r   r   r   Ú__sub__O   s    


z#ExpressionDomain.Expression.__sub__c                 C   s   |   |  |¡j| j ¡S r   r;   r3   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   )r5   r7   r8   r9   r   Ú	is_Numberr   r/   r3   r   r   r   Ú__mul__^   s    
z#ExpressionDomain.Expression.__mul__c                 C   s   |   |  |¡j| j ¡S r   r;   r3   r   r   r   Ú__rmul__k   s    z$ExpressionDomain.Expression.__rmul__c                 C   s,   |   |¡}|d k	r$|  | j|j ¡S tS d S r   ©r5   r/   r   r7   )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   rB   r3   r   r   r   Ú__truediv__v   s    
z'ExpressionDomain.Expression.__truediv__c                 C   s   |   |  |¡j| j ¡S r   r;   r3   r   r   r   Ú__rtruediv__~   s    z(ExpressionDomain.Expression.__rtruediv__c                 C   s   | j |  |¡j kS r   )r   r   r3   r   r   r   Ú__eq__   s    z"ExpressionDomain.Expression.__eq__c                 C   s
   | |k S r   r   r3   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.polysrK   r   r   )r   r4   rK   r   r   r   rK   Š   s    zExpressionDomain.Expression.gcdc                 C   s&   ddl m} |  || j|  |¡jƒ¡S )Nr   ©Úlcm)rL   rN   r   r   )r   r4   rN   r   r   r   rN   Ž   s    zExpressionDomain.Expression.lcmN)r"   Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__r   r   r    r$   r%   r(   r+   r/   r1   r2   r5   r:   r<   r=   r>   r@   rA   rD   rE   rF   rG   rH   rJ   rK   rN   r   r   r   r   Ú
Expression   s6   rS   r   r*   r8   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``. )ÚdtyperT   r   r   r   Ú
from_sympy£   s    zExpressionDomain.from_sympyc                 C   s   | |  |¡ƒS ©z.Convert a Python ``int`` object to ``dtype``. ©rV   ©ÚK1rU   ÚK0r   r   r   Úfrom_ZZ§   s    zExpressionDomain.from_ZZc                 C   s   | |  |¡ƒS rY   rZ   r[   r   r   r   Úfrom_ZZ_python«   s    zExpressionDomain.from_ZZ_pythonc                 C   s   | |  |¡ƒS ©z3Convert a Python ``Fraction`` object to ``dtype``. rZ   r[   r   r   r   Úfrom_QQ¯   s    zExpressionDomain.from_QQc                 C   s   | |  |¡ƒS r`   rZ   r[   r   r   r   Úfrom_QQ_python³   s    zExpressionDomain.from_QQ_pythonc                 C   s   | |  |¡ƒS )z,Convert a GMPY ``mpz`` object to ``dtype``. rZ   r[   r   r   r   Úfrom_ZZ_gmpy·   s    zExpressionDomain.from_ZZ_gmpyc                 C   s   | |  |¡ƒS )z,Convert a GMPY ``mpq`` object to ``dtype``. rZ   r[   r   r   r   Úfrom_QQ_gmpy»   s    zExpressionDomain.from_QQ_gmpyc                 C   s   | |  |¡ƒS ©z4Convert a ``GaussianRational`` object to ``dtype``. rZ   r[   r   r   r   Úfrom_GaussianIntegerRing¿   s    z)ExpressionDomain.from_GaussianIntegerRingc                 C   s   | |  |¡ƒS re   rZ   r[   r   r   r   Úfrom_GaussianRationalFieldÃ   s    z+ExpressionDomain.from_GaussianRationalFieldc                 C   s   | |  |¡ƒS )z.Convert a mpmath ``mpf`` object to ``dtype``. rZ   r[   r   r   r   Úfrom_RealFieldÇ   s    zExpressionDomain.from_RealFieldc                 C   s   | |  |¡ƒS )z'Convert a ``DMP`` object to ``dtype``. rZ   r[   r   r   r   Úfrom_PolynomialRingË   s    z$ExpressionDomain.from_PolynomialRingc                 C   s   | |  |¡ƒS )z'Convert a ``DMF`` object to ``dtype``. rZ   r[   r   r   r   Úfrom_FractionFieldÏ   s    z#ExpressionDomain.from_FractionFieldc                 C   s   |S )z&Convert a ``EX`` object to ``dtype``. r   r[   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_positiverT   r   r   r   ro   ß   s    zExpressionDomain.is_positivec                 C   s
   |j  ¡ S )z#Returns True if ``a`` is negative. )r   Úcould_extract_minus_signrT   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   rn   Úis_nonpositiverT   r   r   r   rr   ç   s    zExpressionDomain.is_nonpositivec                 C   s   |j  ¡ d jS )z'Returns True if ``a`` is non-negative. r   )r   rn   Úis_nonnegativerT   r   r   r   rs   ë   s    zExpressionDomain.is_nonnegativec                 C   s   |  ¡ S )zReturns numerator of ``a``. )r(   rT   r   r   r   r(   ï   s    zExpressionDomain.numerc                 C   s   |  ¡ S )zReturns denominator of ``a``. )r+   rT   r   r   r   r+   ó   s    zExpressionDomain.denomc                 C   s   | dƒS r)   r   ©r   rU   Úbr   r   r   rK   ÷   s    zExpressionDomain.gcdc                 C   s
   |  |¡S r   rM   rt   r   r   r   rN   ú   s    zExpressionDomain.lcmN)'r"   rO   rP   rQ   Úis_SymbolicDomainÚis_EXr   rS   rW   r9   ÚoneÚrepÚhas_assoc_RingÚhas_assoc_Fieldr   rV   rX   r^   r_   ra   rb   rc   rd   rf   rg   rh   ri   rj   rk   rl   rm   ro   rq   rr   rs   r(   r+   rK   rN   r   r   r   r   r      sD   ~r   N)rQ   Ú
sympy.corer   r   Ú&sympy.polys.domains.characteristiczeror   Úsympy.polys.domains.fieldr   Ú sympy.polys.domains.simpledomainr   Úsympy.polys.polyutilsr   Úsympy.utilitiesr   r.   r   r8   r   r   r   r   Ú<module>   s     ÿ p