
    MZd                         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eee	             Z e       Zy)z3Implementation of :class:`ExpressionDomain` class.     )sympifySympifyError)CharacteristicZero)Field)SimpleDomain)PicklableWithSlots)publicFT)deepmul	power_exp
power_basebasicmultinomiallogc                       e Zd ZdZdxZZ G d de      ZeZ ed      Z	 ed      Z
dZdZdZd	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d Z"d Z#d Z$d  Z%d! Z&y")#ExpressionDomainz#A class for arbitrary expressions. Tc                       e Zd ZdZdZd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy)ExpressionDomain.ExpressionzAn arbitrary expression. exc                 t    t        || j                        st        |      | _        y |j                  | _        y N)
isinstance	__class__r   r   )selfr   s     F/usr/lib/python3/dist-packages/sympy/polys/domains/expressiondomain.py__init__z$ExpressionDomain.Expression.__init__   s&    b$..1!"+%%    c                 2    dt        | j                        z  S NzEX(%s))reprr   fs    r   __repr__z$ExpressionDomain.Expression.__repr__   s    d144j((r   c                 2    dt        | j                        z  S r    )strr   r"   s    r   __str__z#ExpressionDomain.Expression.__str__"   s    c!$$i''r   c                 X    t        | j                  j                  | j                  f      S r   )hashr   __name__r   r   s    r   __hash__z$ExpressionDomain.Expression.__hash__%   s     00$'':;;r   c                     | j                   S r   r   r"   s    r   as_exprz#ExpressionDomain.Expression.as_expr(   s    44Kr   c                 Z    | j                  | j                  j                         d         S )Nr   r   r   as_numer_denomr"   s    r   numerz!ExpressionDomain.Expression.numer+   #    ;;qtt224Q788r   c                 Z    | j                  | j                  j                         d         S N   r0   r"   s    r   denomz!ExpressionDomain.Expression.denom.   r3   r   c                 h    | j                   |j                         j                  di t              S )N )r   cancelexpandeflags)r#   r   s     r   simplifyz$ExpressionDomain.Expression.simplify1   s(    ;;1ryy{11;F;<<r   c                 J    | j                  t        | j                              S r   )r   absr   r"   s    r   __abs__z#ExpressionDomain.Expression.__abs__4   s    ;;s144y))r   c                 :    | j                  | j                         S r   )r   r   r"   s    r   __neg__z#ExpressionDomain.Expression.__neg__7   s    ;;u%%r   c                 D    	 | j                  |      S # t        $ r Y y w xY wr   )r   r   r#   gs     r   _to_exz"ExpressionDomain.Expression._to_ex:   s'    {{1~% s    	c                     | j                  |      }|t        S |t        j                  k(  r| S | t        j                  k(  r|S | j	                  | j
                  |j
                  z         S r   rF   NotImplementedEXzeror=   r   rD   s     r   __add__z#ExpressionDomain.Expression.__add__@   sU    Ay%%bggbggzz!$$+..r   c                 p    | j                  | j                  |      j                  | j                  z         S r   r=   r   r   rD   s     r   __radd__z$ExpressionDomain.Expression.__radd__L   (    ::akk!n//!$$677r   c                     | j                  |      }|t        S |t        j                  k(  r| S | t        j                  k(  r| S | j	                  | j
                  |j
                  z
        S r   rH   rD   s     r   __sub__z#ExpressionDomain.Expression.__sub__O   sW    Ay%%bggbggr	zz!$$+..r   c                 p    | j                  | j                  |      j                  | j                  z
        S r   rN   rD   s     r   __rsub__z$ExpressionDomain.Expression.__rsub__[   rP   r   c                 t   | j                  |      }|t        S t        j                  | |fv rt        j                  S | j                  j
                  r>|j                  j
                  r(| j                  | j                  |j                  z        S | j                  | j                  |j                  z        S r   )rF   rI   rJ   rK   r   	is_Numberr   r=   rD   s     r   __mul__z#ExpressionDomain.Expression.__mul__^   s~    Ay%%ww1a& wwADDNN{{1449--::add144i((r   c                 p    | j                  | j                  |      j                  | j                  z        S r   rN   rD   s     r   __rmul__z$ExpressionDomain.Expression.__rmul__k   (    ::akk!n//455r   c                     | j                  |      }|(| j                  | j                  |j                  z        S t        S r   rF   r=   r   rI   )r#   ns     r   __pow__z#ExpressionDomain.Expression.__pow__n   s5    A}zz!$$*--%%r   c                     | j                  |      }|(| j                  | j                  |j                  z        S t        S r   r\   rD   s     r   __truediv__z'ExpressionDomain.Expression.__truediv__v   s5    A}zz!$$qtt),,%%r   c                 p    | j                  | j                  |      j                  | j                  z        S r   rN   rD   s     r   __rtruediv__z(ExpressionDomain.Expression.__rtruediv__~   rZ   r   c                 R    | j                   | j                  |      j                   k(  S r   )r   r   rD   s     r   __eq__z"ExpressionDomain.Expression.__eq__   s    441;;q>,,,,r   c                     | |k(   S r   r9   rD   s     r   __ne__z"ExpressionDomain.Expression.__ne__   s    Av:r   c                 0    | j                   j                   S r   )r   is_zeror"   s    r   __bool__z$ExpressionDomain.Expression.__bool__   s    tt||##r   c                     ddl m} | j                   || j                  | j                  |      j                              S )Nr   )gcd)sympy.polysrk   r   r   )r#   rE   rk   s      r   rk   zExpressionDomain.Expression.gcd   -    ';;s144Q):):;<<r   c                     ddl m} | j                   || j                  | j                  |      j                              S )Nr   lcm)rl   rp   r   r   )r#   rE   rp   s      r   rp   zExpressionDomain.Expression.lcm   rm   r   N)r*   
__module____qualname____doc__	__slots__r   r$   r'   r,   r.   r2   r7   r=   r@   rB   rF   rL   rO   rR   rT   rW   rY   r^   r`   rb   rd   rf   ri   rk   rp   r9   r   r   
Expressionr      s    '		 	)	(	<		9	9	=	*	&	
	/	8
	/	8	)	6	&	&	6	-		$	=	=r   ru   r   r6   rJ   Fc                      y r   r9   r+   s    r   r   zExpressionDomain.__init__   s    r   c                 "    |j                         S )z!Convert ``a`` to a SymPy object. )r.   r   as     r   to_sympyzExpressionDomain.to_sympy   s    yy{r   c                 $    | j                  |      S )z)Convert SymPy's expression to ``dtype``. )dtyperx   s     r   
from_sympyzExpressionDomain.from_sympy   s    zz!}r   c                 0     | |j                  |            S z.Convert a Python ``int`` object to ``dtype``. rz   K1ry   K0s      r   from_ZZzExpressionDomain.from_ZZ       "++a.!!r   c                 0     | |j                  |            S r   r   r   s      r   from_ZZ_pythonzExpressionDomain.from_ZZ_python   r   r   c                 0     | |j                  |            S z3Convert a Python ``Fraction`` object to ``dtype``. r   r   s      r   from_QQzExpressionDomain.from_QQ   r   r   c                 0     | |j                  |            S r   r   r   s      r   from_QQ_pythonzExpressionDomain.from_QQ_python   r   r   c                 0     | |j                  |            S )z,Convert a GMPY ``mpz`` object to ``dtype``. r   r   s      r   from_ZZ_gmpyzExpressionDomain.from_ZZ_gmpy   r   r   c                 0     | |j                  |            S )z,Convert a GMPY ``mpq`` object to ``dtype``. r   r   s      r   from_QQ_gmpyzExpressionDomain.from_QQ_gmpy   r   r   c                 0     | |j                  |            S z4Convert a ``GaussianRational`` object to ``dtype``. r   r   s      r   from_GaussianIntegerRingz)ExpressionDomain.from_GaussianIntegerRing   r   r   c                 0     | |j                  |            S r   r   r   s      r   from_GaussianRationalFieldz+ExpressionDomain.from_GaussianRationalField   r   r   c                 0     | |j                  |            S )z.Convert a mpmath ``mpf`` object to ``dtype``. r   r   s      r   from_RealFieldzExpressionDomain.from_RealField   r   r   c                 0     | |j                  |            S )z'Convert a ``DMP`` object to ``dtype``. r   r   s      r   from_PolynomialRingz$ExpressionDomain.from_PolynomialRing   r   r   c                 0     | |j                  |            S )z'Convert a ``DMF`` object to ``dtype``. r   r   s      r   from_FractionFieldz#ExpressionDomain.from_FractionField   r   r   c                     |S )z&Convert a ``EX`` object to ``dtype``. r9   r   s      r   from_ExpressionDomainz&ExpressionDomain.from_ExpressionDomain   s    r   c                     | S )z)Returns a ring associated with ``self``. r9   r+   s    r   get_ringzExpressionDomain.get_ring       r   c                     | S )z*Returns a field associated with ``self``. r9   r+   s    r   	get_fieldzExpressionDomain.get_field   r   r   c                 P    |j                   j                         d   j                  S )z#Returns True if ``a`` is positive. r   )r   as_coeff_mulis_positiverx   s     r   r   zExpressionDomain.is_positive   s     tt  "1%111r   c                 6    |j                   j                         S )z#Returns True if ``a`` is negative. )r   could_extract_minus_signrx   s     r   is_negativezExpressionDomain.is_negative   s    tt,,..r   c                 P    |j                   j                         d   j                  S )z'Returns True if ``a`` is non-positive. r   )r   r   is_nonpositiverx   s     r   r   zExpressionDomain.is_nonpositive        tt  "1%444r   c                 P    |j                   j                         d   j                  S )z'Returns True if ``a`` is non-negative. r   )r   r   is_nonnegativerx   s     r   r   zExpressionDomain.is_nonnegative   r   r   c                 "    |j                         S )zReturns numerator of ``a``. )r2   rx   s     r   r2   zExpressionDomain.numer       wwyr   c                 "    |j                         S )zReturns denominator of ``a``. )r7   rx   s     r   r7   zExpressionDomain.denom   r   r   c                      | d      S r5   r9   r   ry   bs      r   rk   zExpressionDomain.gcd   s    Awr   c                 $    |j                  |      S r   ro   r   s      r   rp   zExpressionDomain.lcm   s    uuQxr   N)'r*   rq   rr   rs   is_SymbolicDomainis_EXr   ru   r|   rK   onerephas_assoc_Ringhas_assoc_Fieldr   rz   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r2   r7   rk   rp   r9   r   r   r   r      s    - $$|=' |=| Ea=D
Q-C
CNO"""""""""""2/55r   r   N)rs   
sympy.corer   r   &sympy.polys.domains.characteristiczeror   sympy.polys.domains.fieldr    sympy.polys.domains.simpledomainr   sympy.polys.polyutilsr   sympy.utilitiesr	   r<   r   rJ   r9   r   r   <module>r      sb    9 - E + 9 4 "5U5
B lu0, l l^ r   