
    sg                         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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)DomainElement)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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'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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     W/var/www/html/venv/lib/python3.12/site-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                     t         S r   )EXr,   s    r   parentz"ExpressionDomain.Expression.parent)   s    Ir   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   r4   r#   s    r   denomz!ExpressionDomain.Expression.denom2   r7   r   c                 h    | j                   |j                         j                  di t              S )N )r   cancelexpandeflags)r$   r   s     r   simplifyz$ExpressionDomain.Expression.simplify5   s(    ;;1ryy{11;F;<<r   c                 J    | j                  t        | j                              S r   )r   absr   r#   s    r   __abs__z#ExpressionDomain.Expression.__abs__8   s    ;;s144y))r   c                 :    | j                  | j                         S r   )r   r   r#   s    r   __neg__z#ExpressionDomain.Expression.__neg__;   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                 l    | j                   j                         |j                   j                         k  S r   )r   sort_keyrH   s     r   __lt__z"ExpressionDomain.Expression.__lt__D   s!    44==?QTT]]_44r   c                     | j                  |      }|t        S |t        j                  k(  r| S | t        j                  k(  r|S | j	                  | j
                  |j
                  z         S r   rJ   NotImplementedr/   zerorA   r   rH   s     r   __add__z#ExpressionDomain.Expression.__add__G   sU    Ay%%bggbggzz!$$+..r   c                 p    | j                  | j                  |      j                  | j                  z         S r   rA   r   r   rH   s     r   __radd__z$ExpressionDomain.Expression.__radd__S   (    ::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   rO   rH   s     r   __sub__z#ExpressionDomain.Expression.__sub__V   sW    Ay%%bggbggr	zz!$$+..r   c                 p    | j                  | j                  |      j                  | j                  z
        S r   rT   rH   s     r   __rsub__z$ExpressionDomain.Expression.__rsub__b   rV   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   )rJ   rP   r/   rQ   r   	is_Numberr   rA   rH   s     r   __mul__z#ExpressionDomain.Expression.__mul__e   s~    Ay%%ww1a& wwADDNN{{1449--::add144i((r   c                 p    | j                  | j                  |      j                  | j                  z        S r   rT   rH   s     r   __rmul__z$ExpressionDomain.Expression.__rmul__r   (    ::akk!n//455r   c                     | j                  |      }|(| j                  | j                  |j                  z        S t        S r   rJ   rA   r   rP   )r$   ns     r   __pow__z#ExpressionDomain.Expression.__pow__u   s5    A}zz!$$*--%%r   c                     | j                  |      }|(| j                  | j                  |j                  z        S t        S r   rb   rH   s     r   __truediv__z'ExpressionDomain.Expression.__truediv__}   s5    A}zz!$$qtt),,%%r   c                 p    | j                  | j                  |      j                  | j                  z        S r   rT   rH   s     r   __rtruediv__z(ExpressionDomain.Expression.__rtruediv__   r`   r   c                 R    | j                   | j                  |      j                   k(  S r   )r   r   rH   s     r   __eq__z"ExpressionDomain.Expression.__eq__   s    441;;q>,,,,r   c                     | |k(   S r   r=   rH   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.polysrq   r   r   )r$   rI   rq   s      r   rq   zExpressionDomain.Expression.gcd   -    ';;s144Q):):;<<r   c                     ddl m} | j                   || j                  | j                  |      j                              S )Nr   lcm)rr   rv   r   r   )r$   rI   rv   s      r   rv   zExpressionDomain.Expression.lcm   rs   r   N) r+   
__module____qualname____doc__	__slots__r   r%   r(   r-   r0   r2   r6   r;   rA   rD   rF   rJ   rM   rR   rU   rX   rZ   r]   r_   rd   rf   rh   rj   rl   ro   rq   rv   r=   r   r   
Expressionr      s    '		 	)	(	<			9	9	=	*	&		5
	/	8
	/	8	)	6	&	&	6	-		$	=	=r   r{   r   r:   r/   Fc                      y r   r=   r,   s    r   r   zExpressionDomain.__init__   s    r   c                 0    t        |t              ryt        S )NT)r   r   rP   )r   others     r   rj   zExpressionDomain.__eq__   s    e-.!!r   c                     t        d      S )Nr/   )r*   r,   s    r   r-   zExpressionDomain.__hash__   s    Dzr   c                 "    |j                         S )z!Convert ``a`` to a SymPy object. )r2   r   as     r   to_sympyzExpressionDomain.to_sympy   s    yy{r   c                 $    | j                  |      S )z)Convert SymPy's expression to ``dtype``. )dtyper   s     r   
from_sympyzExpressionDomain.from_sympy   s    zz!}r   c                 0     | |j                  |            S z.Convert a Python ``int`` object to ``dtype``. r   K1r   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 an ``ANP`` object to ``dtype``. r   r   s      r   from_AlgebraicFieldz$ExpressionDomain.from_AlgebraicField   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 mpmath ``mpc`` object to ``dtype``. r   r   s      r   from_ComplexFieldz"ExpressionDomain.from_ComplexField   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``. r=   r   s      r   from_ExpressionDomainz&ExpressionDomain.from_ExpressionDomain   s    r   c                     | S )z)Returns a ring associated with ``self``. r=   r,   s    r   get_ringzExpressionDomain.get_ring       r   c                     | S )z*Returns a field associated with ``self``. r=   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_positiver   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_signr   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_nonpositiver   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_nonnegativer   s     r   r   zExpressionDomain.is_nonnegative  r   r   c                 "    |j                         S )zReturns numerator of ``a``. )r6   r   s     r   r6   zExpressionDomain.numer      wwyr   c                 "    |j                         S )zReturns denominator of ``a``. )r;   r   s     r   r;   zExpressionDomain.denom  r   r   c                      | d      S r9   r=   r   r   bs      r   rq   zExpressionDomain.gcd  s    Awr   c                 $    |j                  |      S r   ru   r   s      r   rv   zExpressionDomain.lcm  s    uuQxr   N),r+   rw   rx   ry   is_SymbolicDomainis_EXr   r	   r{   r   rQ   onerephas_assoc_Ringhas_assoc_Fieldr   rj   r-   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r6   r;   rq   rv   r=   r   r   r   r      s    - $$B=]$6 B=H Ea=D
Q-C
CNO""""""""""""""2/55r   r   N)ry   
sympy.corer   r   !sympy.polys.domains.domainelementr   &sympy.polys.domains.characteristiczeror   sympy.polys.domains.fieldr    sympy.polys.domains.simpledomainr   sympy.polys.polyutilsr	   sympy.utilitiesr
   r@   r   r/   r=   r   r   <module>r      se    9 - ; E + 9 4 "5U5
B Cu0, C CL r   