o
    h                     @   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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)DomainElement)CharacteristicZero)Field)SimpleDomain)PicklableWithSlots)publicFT)deepmul	power_exp
power_basebasicmultinomiallogc                   @   s2  e Zd ZdZd ZZG dd de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;d< Z(d=d> Z)d?d@ Z*dAdB Z+dCS )D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d5d6 Zd7d8 Zd9S ):zExpressionDomain.ExpressionzAn arbitrary expression. exc                 C   s&   t || jst|| _d S |j| _d S N)
isinstance	__class__r   r   )selfr    r   Z/var/www/html/ai/venv/lib/python3.10/site-packages/sympy/polys/domains/expressiondomain.py__init__   s   z$ExpressionDomain.Expression.__init__c                 C      dt | j S NzEX(%s))reprr   fr   r   r   __repr__       z$ExpressionDomain.Expression.__repr__c                 C   r   r   )strr   r   r   r   r   __str__#   r!   z#ExpressionDomain.Expression.__str__c                 C   s   t | jj| jfS r   )hashr   __name__r   r   r   r   r   __hash__&      z$ExpressionDomain.Expression.__hash__c                 C   s   t S r   )EXr&   r   r   r   parent)      z"ExpressionDomain.Expression.parentc                 C   s   | j S r   r   r   r   r   r   as_expr,   s   z#ExpressionDomain.Expression.as_exprc                 C      |  | j d S )Nr   r   r   as_numer_denomr   r   r   r   numer/      z!ExpressionDomain.Expression.numerc                 C   r-   N   r.   r   r   r   r   denom2   r1   z!ExpressionDomain.Expression.denomc                 C   s   |  | jdi tS )Nr   )r   cancelexpandeflags)r   r   r   r   r   simplify5   s   z$ExpressionDomain.Expression.simplifyc                 C   s   |  t| jS r   )r   absr   r   r   r   r   __abs__8   s   z#ExpressionDomain.Expression.__abs__c                 C   s   |  | j S r   )r   r   r   r   r   r   __neg__;   r!   z#ExpressionDomain.Expression.__neg__c                 C   s"   z|  |W S  ty   Y d S w r   )r   r   r   gr   r   r   _to_ex>   s
   z"ExpressionDomain.Expression._to_exc                 C   s   | j  |j  k S r   )r   sort_keyr<   r   r   r   __lt__D   r1   z"ExpressionDomain.Expression.__lt__c                 C   sD   |  |}|d u rtS |tjkr| S | tjkr|S | | j|j S r   r>   NotImplementedr)   zeror8   r   r<   r   r   r   __add__G   s   


z#ExpressionDomain.Expression.__add__c                 C   s   |  | |j| j S r   r8   r   r   r<   r   r   r   __radd__S      z$ExpressionDomain.Expression.__radd__c                 C   sF   |  |}|d u rtS |tjkr| S | tjkr| S | | j|j S r   rA   r<   r   r   r   __sub__V   s   


z#ExpressionDomain.Expression.__sub__c                 C   s   |  | |j| j S r   rE   r<   r   r   r   __rsub__b   rG   z$ExpressionDomain.Expression.__rsub__c                 C   s^   |  |}|d u rtS tj| |fv rtjS | jjr&|jjr&| | j|j S | | j|j S r   )r>   rB   r)   rC   r   	is_Numberr   r8   r<   r   r   r   __mul__e   s   
z#ExpressionDomain.Expression.__mul__c                 C   s   |  | |j| j S r   rE   r<   r   r   r   __rmul__r   rG   z$ExpressionDomain.Expression.__rmul__c                 C   s(   |  |}|d ur| | j|j S tS r   r>   r8   r   rB   )r   nr   r   r   __pow__u      
z#ExpressionDomain.Expression.__pow__c                 C   s(   |  |}|d ur| | j|j S tS r   rM   r<   r   r   r   __truediv__}   rP   z'ExpressionDomain.Expression.__truediv__c                 C   s   |  | |j| j S r   rE   r<   r   r   r   __rtruediv__   rG   z(ExpressionDomain.Expression.__rtruediv__c                 C   s   | j | |j kS r   )r   r   r<   r   r   r   __eq__   r(   z"ExpressionDomain.Expression.__eq__c                 C   s
   | |k S r   r   r<   r   r   r   __ne__      
z"ExpressionDomain.Expression.__ne__c                 C   s
   | j j S r   )r   is_zeror   r   r   r   __bool__   rU   z$ExpressionDomain.Expression.__bool__c                 C   &   ddl m} | || j| |jS )Nr   )gcd)sympy.polysrY   r   r   )r   r=   rY   r   r   r   rY         zExpressionDomain.Expression.gcdc                 C   rX   )Nr   lcm)rZ   r]   r   r   )r   r=   r]   r   r   r   r]      r[   zExpressionDomain.Expression.lcmN) r%   
__module____qualname____doc__	__slots__r   r    r#   r'   r*   r,   r0   r4   r8   r:   r;   r>   r@   rD   rF   rH   rI   rK   rL   rO   rQ   rR   rS   rT   rW   rY   r]   r   r   r   r   
Expression   s<    rb   r   r3   r)   Fc                 C   s   d S r   r   r&   r   r   r   r      r+   zExpressionDomain.__init__c                 C   s   t |trdS tS )NT)r   r   rB   )r   otherr   r   r   rS      s   
zExpressionDomain.__eq__c                 C   s   t dS )Nr)   )r$   r&   r   r   r   r'         zExpressionDomain.__hash__c                 C      |  S )z!Convert ``a`` to a SymPy object. )r,   r   ar   r   r   to_sympy      zExpressionDomain.to_sympyc                 C   s
   |  |S )z)Convert SymPy's expression to ``dtype``. )dtyperf   r   r   r   
from_sympy      
zExpressionDomain.from_sympyc                 C      | | |S z.Convert a Python ``int`` object to ``dtype``. rh   K1rg   K0r   r   r   from_ZZ      zExpressionDomain.from_ZZc                 C   rm   rn   ro   rp   r   r   r   from_ZZ_python   rt   zExpressionDomain.from_ZZ_pythonc                 C   rm   z3Convert a Python ``Fraction`` object to ``dtype``. ro   rp   r   r   r   from_QQ   rt   zExpressionDomain.from_QQc                 C   rm   rv   ro   rp   r   r   r   from_QQ_python   rt   zExpressionDomain.from_QQ_pythonc                 C   rm   )z,Convert a GMPY ``mpz`` object to ``dtype``. ro   rp   r   r   r   from_ZZ_gmpy   rt   zExpressionDomain.from_ZZ_gmpyc                 C   rm   )z,Convert a GMPY ``mpq`` object to ``dtype``. ro   rp   r   r   r   from_QQ_gmpy   rt   zExpressionDomain.from_QQ_gmpyc                 C   rm   z4Convert a ``GaussianRational`` object to ``dtype``. ro   rp   r   r   r   from_GaussianIntegerRing   rt   z)ExpressionDomain.from_GaussianIntegerRingc                 C   rm   r{   ro   rp   r   r   r   from_GaussianRationalField   rt   z+ExpressionDomain.from_GaussianRationalFieldc                 C   rm   )z(Convert an ``ANP`` object to ``dtype``. ro   rp   r   r   r   from_AlgebraicField   rt   z$ExpressionDomain.from_AlgebraicFieldc                 C   rm   )z.Convert a mpmath ``mpf`` object to ``dtype``. ro   rp   r   r   r   from_RealField   rt   zExpressionDomain.from_RealFieldc                 C   rm   )z.Convert a mpmath ``mpc`` object to ``dtype``. ro   rp   r   r   r   from_ComplexField   rt   z"ExpressionDomain.from_ComplexFieldc                 C   rm   )z'Convert a ``DMP`` object to ``dtype``. ro   rp   r   r   r   from_PolynomialRing   rt   z$ExpressionDomain.from_PolynomialRingc                 C   rm   )z'Convert a ``DMF`` object to ``dtype``. ro   rp   r   r   r   from_FractionField   rt   z#ExpressionDomain.from_FractionFieldc                 C   s   |S )z&Convert a ``EX`` object to ``dtype``. r   rp   r   r   r   from_ExpressionDomain      z&ExpressionDomain.from_ExpressionDomainc                 C      | S )z)Returns a ring associated with ``self``. r   r&   r   r   r   get_ring   r   zExpressionDomain.get_ringc                 C   r   )z*Returns a field associated with ``self``. r   r&   r   r   r   	get_field   r   zExpressionDomain.get_fieldc                 C      |j  d jS )z#Returns True if ``a`` is positive. r   )r   as_coeff_mulis_positiverf   r   r   r   r         zExpressionDomain.is_positivec                 C   s
   |j  S )z#Returns True if ``a`` is negative. )r   could_extract_minus_signrf   r   r   r   is_negative   rl   zExpressionDomain.is_negativec                 C   r   )z'Returns True if ``a`` is non-positive. r   )r   r   is_nonpositiverf   r   r   r   r      r   zExpressionDomain.is_nonpositivec                 C   r   )z'Returns True if ``a`` is non-negative. r   )r   r   is_nonnegativerf   r   r   r   r     r   zExpressionDomain.is_nonnegativec                 C   re   )zReturns numerator of ``a``. )r0   rf   r   r   r   r0     ri   zExpressionDomain.numerc                 C   re   )zReturns denominator of ``a``. )r4   rf   r   r   r   r4     ri   zExpressionDomain.denomc                 C   s   | dS r2   r   r   rg   br   r   r   rY     rd   zExpressionDomain.gcdc                 C   s
   | |S r   r\   r   r   r   r   r]     rU   zExpressionDomain.lcmN),r%   r^   r_   r`   is_SymbolicDomainis_EXr   r   rb   rj   rC   onerephas_assoc_Ringhas_assoc_Fieldr   rS   r'   rh   rk   rs   ru   rw   rx   ry   rz   r|   r}   r~   r   r   r   r   r   r   r   r   r   r   r   r0   r4   rY   r]   r   r   r   r   r      sP     r   N)r`   
sympy.corer   r   !sympy.polys.domains.domainelementr   &sympy.polys.domains.characteristiczeror   sympy.polys.domains.fieldr    sympy.polys.domains.simpledomainr   sympy.polys.polyutilsr   sympy.utilitiesr	   r7   r   r)   r   r   r   r   <module>   s       
