o
    *ήc
]                     @   s  d Z ddlmZmZ ddlmZmZmZmZm	Z	m
Z
 ddlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ ddlmZ ddlm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z, ddlm-Z- ddl.m/Z/ dd	l0m1Z1 dd
l2m3Z3m4Z4m5Z5 ddl6m7Z7 ddl8m9Z9 ddl:m;Z; ddl<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZF dd ZGe=HeIedd ZJe=Heeeeeeeedd ZJe=Kedd ZJe=Hee	dd ZJe=Kedd ZJe=Ke dd ZJe=He3e7e5dd ZJe>Kedd ZJe>Kedd ZJe>Heeeeeeedd ZJe>Kedd ZJe>Heedd ZJe>Ke	d d ZJe>He#e$e%e+e,d!d ZJe>Ke'd"d ZJe>He"e&d#d ZJe>He!e)d$d ZJe?Ked%d ZJe?Ked&d ZJd'd( ZLe@He eeee(eee*e	d)d ZJe@Heeed*d ZJe@Ked+d ZJe@Ked,d ZJe@Ked-d ZJe@Ke	d.d ZJe@He%e+d/d ZJe@Ke'd0d ZJe@Ke)d1d ZJe@He3e7e5d2d ZJeAKeMd3d ZJeAHeed4d ZJeAHeee	d5d ZJeBKeMd6d ZJeBKed7d ZJeBKed8d ZJeBKe	d9d ZJeBHe%e+d:d ZJeBKe'd;d ZJeBKe4d<d ZJeCHe e%e'e(ee)eee*e+
d=d ZJeCHeed>d ZJeCKed?d ZJeCHeed@d ZJeCKe	dAd ZJeCHe3e7e5dBd ZJeCKedCd ZJdDdE ZNeDKedFd ZJeDKedGd ZJeDKedHd ZJeDKedId ZJeDKe	dJd ZJeDKe)dKd ZJeDKe'dLd ZJeDHeedMd ZJeDKedNd ZJeEKeMdOd ZJeEKedPd ZJeEKedQd ZJeEKe	dRd ZJeEKe4dSd ZJeFHeeeeedTd ZJeFHeeeeedUd ZJeFHeedVd ZJeFKe	dWd ZJeFKedXd ZJeFHe#e$e%e+e,dYd ZJeFKe'dZd ZJeFHe"e&d[d ZJeFHe!e)d\d ZJd]S )^zL
Handlers for predicates related to set membership: integer, rational, etc.
    )Qask)AddBasicExprMulPowS)AlgebraicNumberComplexInfinityExp1FloatGoldenRatioImaginaryUnitInfinityIntegerNaNNegativeInfinityNumberNumberSymbolPipiRationalTribonacciConstantE)
fuzzy_bool)Absacosacotasinatancoscotexpimlogresintan)I)Eq)	conjugate)Determinant
MatrixBaseTrace)MatrixElement)MDNotImplementedError   )test_closed_group   )
IntegerPredicateRationalPredicateIrrationalPredicateRealPredicateExtendedRealPredicateHermitianPredicateComplexPredicateImaginaryPredicateAntihermitianPredicateAlgebraicPredicatec                 C   s:   zt |  }| | dstW dS  ty   Y dS w )Nr   TF)introundequals	TypeErrorexprassumptionsi rF   F/tmp/pip-target-vg8gfxp4/lib/python/sympy/assumptions/handlers/sets.py_IntegerPredicate_number   s   rH   c                 C      dS NTrF   rC   rD   rF   rF   rG   _(      rL   c                 C   rI   NFrF   rK   rF   rF   rG   rL   ,      c                 C      | j }|d u r	t|S N)
is_integerr0   rC   rD   retrF   rF   rG   rL   1      c                 C      | j rt| |S t| |tjS )zw
    * Integer + Integer       -> Integer
    * Integer + !Integer      -> !Integer
    * !Integer + !Integer -> ?
    )	is_numberrH   r2   r   integerrK   rF   rF   rG   rL   8   s   
c                 C   s   | j rt| |S d}| jD ];}tt||sH|jr5|jdkr+ttd|  |  S |jd@  r4 dS qtt	||rE|rBd}q dS  dS q|S )z
    * Integer*Integer      -> Integer
    * Integer*Irrational   -> !Integer
    * Odd/Even             -> !Integer
    * Integer*Rational     -> ?
    Tr3   r1   NF)
rW   rH   argsr   r   rX   is_Rationalqeven
irrational)rC   rD   _outputargrF   rF   rG   rL   C   s$   


c                 C      t t| jd |S Nr   )r   r   rX   rY   rK   rF   rF   rG   rL   _      c                 C   r`   ra   )r   r   integer_elementsrY   rK   rF   rF   rG   rL   c   rb   c                 C   rI   rJ   rF   rK   rF   rF   rG   rL   j   rM   c                 C      d S rQ   rF   rK   rF   rF   rG   rL   n   rM   c                 C   rI   rN   rF   rK   rF   rF   rG   rL   r   rO   c                 C   rP   rQ   )is_rationalr0   rS   rF   rF   rG   rL   w   rU   c                 C   s$   | j r|  d rdS t| |tjS )z}
    * Rational + Rational     -> Rational
    * Rational + !Rational    -> !Rational
    * !Rational + !Rational   -> ?
    r1   F)rW   as_real_imagr2   r   rationalrK   rF   rF   rG   rL   ~   s   c                 C   s   | j tkr| j}tt||rtt| |S dS tt| j|r-tt| j |S tt| j|rAtt| j |rCdS dS dS )z
    * Rational ** Integer      -> Rational
    * Irrational ** Rational   -> Irrational
    * Rational ** Irrational   -> ?
    NF)	baser   r#   r   r   rg   nonzerorX   primerC   rD   xrF   rF   rG   rL      s   
c                 C   0   | j d }tt||rtt| |S d S ra   rY   r   r   rg   ri   rk   rF   rF   rG   rL         
c                 C   ,   | j }tt||rtt| |S d S rQ   )r#   r   r   rg   ri   rk   rF   rF   rG   rL         c                 C   "   | j d }tt||rdS d S Nr   F)rY   r   r   rg   rk   rF   rF   rG   rL         
c                 C   4   | j d }tt||rtt|d  |S d S Nr   r1   rn   rk   rF   rF   rG   rL         
c                 C   rP   rQ   )is_irrationalr0   rS   rF   rF   rG   rL      rU   c                 C   s:   t t| |}|rt t| |}|d u rd S | S |S rQ   )r   r   realrg   )rC   rD   _real	_rationalrF   rF   rG   rL      s   c                 C   s&   |   d d}|jdkr| S d S )Nr1   r3   rf   evalf_precrB   rF   rF   rG   _RealPredicate_number      
r   c                 C   rI   rJ   rF   rK   rF   rF   rG   rL      rO   c                 C   rI   rN   rF   rK   rF   rF   rG   rL      rM   c                 C   rP   rQ   )is_realr0   rS   rF   rF   rG   rL      rU   c                 C   rV   )zT
    * Real + Real              -> Real
    * Real + (Complex & !Real) -> !Real
    )rW   r   r2   r   ry   rK   rF   rF   rG   rL      s   
c                 C   sT   | j rt| |S d}| jD ]}tt||rqtt||r%|dA }q dS |S )zx
    * Real*Real               -> Real
    * Real*Imaginary          -> !Real
    * Imaginary*Imaginary     -> Real
    TN)rW   r   rY   r   r   ry   	imaginary)rC   rD   resultr_   rF   rF   rG   rL      s   


c                 C   s  | j rt| |S | jtkr tt| jt t	 t
| jB |S | jjtks0| jjrg| jjtkrgtt| jj|rEtt| j|rEdS | jjt t	 }ttd| |rett
tj| | j |S dS tt| j|rtt| j|rtt| j|}|dur| S dS tt| j|rttt| j|}|dur|S tt
| j|rtt
| j|r| jjrtt| jj|rtt| j|S tt| j|rdS tt| j|rdS tt| j|rdS dS dS dS )a  
    * Real**Integer              -> Real
    * Positive**Real             -> Real
    * Real**(Integer/Even)       -> Real if base is nonnegative
    * Real**(Integer/Odd)        -> Real
    * Imaginary**(Integer/Even)  -> Real
    * Imaginary**(Integer/Odd)   -> not Real
    * Imaginary**Real            -> ? since Real could be 0 (giving real)
                                    or 1 (giving imaginary)
    * b**Imaginary               -> Real if log(b) is imaginary and b != 0
                                    and exponent != integer multiple of
                                    I*pi/log(b)
    * Real**Real                 -> ? e.g. sqrt(-1) is imaginary and
                                    sqrt(2) is not
    Tr3   NF)rW   r   rh   r   r   r   rX   r#   r)   r   ry   funcis_Powr   r	   NegativeOneoddr%   rZ   r\   r[   positivenegative)rC   rD   rE   r   imlogrF   rF   rG   rL     sN   

  c                 C   s   t t| jd |rdS d S Nr   T)r   r   ry   rY   rK   rF   rF   rG   rL   D  s   c                 C   s&   t t| jt t t| jB |S rQ   )r   r   rX   r#   r)   r   ry   rK   rF   rF   rG   rL   I  s    c                 C   r`   ra   )r   r   r   rY   rK   rF   rF   rG   rL   O  rb   c                 C   r`   ra   )r   r   real_elementsrY   rK   rF   rF   rG   rL   S  rb   c                 C   s8   t t| t| B t| B t| B t| B |S rQ   )r   r   negative_infiniter   zeror   positive_infiniterK   rF   rF   rG   rL   Z  s   
c                 C   rI   rJ   rF   rK   rF   rF   rG   rL   c  rM   c                 C      t | |tjS rQ   )r2   r   extended_realrK   rF   rF   rG   rL   g     c                 C   s   t | trd S tt| |S rQ   )
isinstancer-   r   r   ry   rK   rF   rF   rG   rL   n  s   
c                 C      | j rtt| |tjS )zZ
    * Hermitian + Hermitian  -> Hermitian
    * Hermitian + !Hermitian -> !Hermitian
    )rW   r0   r2   r   	hermitianrK   rF   rF   rG   rL   t     c                 C   sz   | j rtd}d}| jD ].}tt||r|dA }ntt||s& dS tt| |r:|d7 }|dkr: dS q|S )z
    As long as there is at most only one noncommutative term:

    * Hermitian*Hermitian         -> Hermitian
    * Hermitian*Antihermitian     -> !Hermitian
    * Antihermitian*Antihermitian -> Hermitian
    r   Tr1   NrW   r0   rY   r   r   antihermitianr   commutativerC   rD   nccountr   r_   rF   rF   rG   rL   ~     	

c                 C   sZ   | j rt| jtkrtt| j|rdS ttt| j|r+tt| j|r+dS t)z+
    * Hermitian**Integer -> Hermitian
    T)	rW   r0   rh   r   r   r   r   r#   rX   rK   rF   rF   rG   rL     s   
c                 C   s   t t| jd |rdS tr   )r   r   r   rY   r0   rK   rF   rF   rG   rL     s   c                 C   s   t t| j|rdS trJ   )r   r   r   r#   r0   rK   rF   rF   rG   rL     s   c              	   C   sz   | j \}}d}t|D ])}t||D ]!}tt| ||f t| ||f }|d u r+d }|dkr3  dS qq|d u r;t|S NTFshaperanger   r*   r+   r0   matrD   rowscolsret_valrE   jcondrF   rF   rG   rL     s   
"c                 C   rI   rJ   rF   rK   rF   rF   rG   rL     rO   c                 C   rI   rN   rF   rK   rF   rF   rG   rL     rM   c                 C   rP   rQ   )
is_complexr0   rS   rF   rF   rG   rL     rU   c                 C   r   rQ   )r2   r   complexrK   rF   rF   rG   rL     r   c                 C   s   | j tkrdS t| |tjS rJ   )rh   r   r2   r   r   rK   rF   rF   rG   rL     s   
c                 C   r`   ra   )r   r   complex_elementsrY   rK   rF   rF   rG   rL     rb   c                 C   rd   rQ   rF   rK   rF   rF   rG   rL     rM   c                 C   s&   |   d d}|jdkr| S d S )Nr   r3   r1   r|   )rC   rD   rrF   rF   rG   _Imaginary_number  r   r   c                 C   rI   rJ   rF   rK   rF   rF   rG   rL     rM   c                 C   rP   rQ   )is_imaginaryr0   rS   rF   rF   rG   rL     rU   c                 C   sv   | j rt| |S d}| jD ]}tt||rqtt||r%|d7 }q dS |dkr.dS |dt| jfv r9dS dS )zy
    * Imaginary + Imaginary -> Imaginary
    * Imaginary + Complex   -> ?
    * Imaginary + Real      -> !Imaginary
    r   r1   TFNrW   r   rY   r   r   r   ry   len)rC   rD   realsr_   rF   rF   rG   rL     s   


c                 C   sj   | j rt| |S d}d}| jD ]}tt||r|dA }qtt||s) dS q|t| jkr3dS |S )zN
    * Real*Imaginary      -> Imaginary
    * Imaginary*Imaginary -> Real
    Fr   TNr   )rC   rD   r   r   r_   rF   rF   rG   rL     s   


c                 C   s  | j rt| |S | jtkr$| jt t }tt	d| t	| @ |S | jj
tks4| jjri| jjtkritt| jj|ritt| j|rIdS | jjt t }tt	d| |ritttj| | j |S tt| j|rtt	| j|rtt| j|}|dur|S dS tt| j|rttt| j|}|durdS tt| jt| j@ |rtt| j|rdS tt| j|}|s|S tt	| j|rdS tt	d| j |}|rtt| j|S |S dS )a  
    * Imaginary**Odd        -> Imaginary
    * Imaginary**Even       -> Real
    * b**Imaginary          -> !Imaginary if exponent is an integer
                               multiple of I*pi/log(b)
    * Imaginary**Real       -> ?
    * Positive**Real        -> Real
    * Negative**Integer     -> Real
    * Negative**(Integer/2) -> Imaginary
    * Negative**Real        -> not Imaginary if exponent is not Rational
    r3   FN)rW   r   rh   r   r#   r)   r   r   r   rX   r   r   r   r	   r   r   r%   ry   r   rg   r   )rC   rD   arE   r   r   rathalfrF   rF   rG   rL   +  sF   

  c                 C   s   t t| jd |rt t| jd |rdS d S | jd jtks0| jd jr=| jd jt	kr=| jd jt
t
 fv r=dS t t| jd |}|du rNdS d S )Nr   FT)r   r   ry   rY   r   r   r#   r   rh   r   r)   r   )rC   rD   r$   rF   rF   rG   rL   c  s   ,c                 C   s.   | j t t }ttd| t| @ |S )Nr3   )r#   r)   r   r   r   rX   )rC   rD   r   rF   rF   rG   rL   t  s    c                 C   s   |   d dk S )Nr1   r   )rf   rK   rF   rF   rG   rL   y  s   c                 C   rd   rQ   rF   rK   rF   rF   rG   rL   }  rM   c                 C   s2   t | trd S tt| |rdS tt| |S rJ   )r   r-   r   r   r   r   rK   rF   rF   rG   rL     s
   
c                 C   r   )zr
    * Antihermitian + Antihermitian  -> Antihermitian
    * Antihermitian + !Antihermitian -> !Antihermitian
    )rW   r0   r2   r   r   rK   rF   rF   rG   rL     r   c                 C   sz   | j rtd}d}| jD ].}tt||r|dA }ntt||s& dS tt| |r:|d7 }|dkr: dS q|S )z
    As long as there is at most only one noncommutative term:

    * Hermitian*Hermitian         -> !Antihermitian
    * Hermitian*Antihermitian     -> Antihermitian
    * Antihermitian*Antihermitian -> !Antihermitian
    r   FTr1   Nr   r   rF   rF   rG   rL     r   c                 C   sx   | j rttt| j|rtt| j|rdS ttt| j|r:tt	| j|r/dS tt
| j|r:dS t)z
    * Hermitian**Integer  -> !Antihermitian
    * Antihermitian**Even -> !Antihermitian
    * Antihermitian**Odd  -> Antihermitian
    FT)rW   r0   r   r   r   rh   rX   r#   r   r\   r   rK   rF   rF   rG   rL     s   c              	   C   s|   | j \}}d}t|D ]*}t||D ]"}tt| ||f t| ||f  }|d u r,d }|dkr4  dS qq|d u r<t|S r   r   r   rF   rF   rG   rL     s   
$c                 C   rI   rJ   rF   rK   rF   rF   rG   rL     rO   c                 C   rI   rN   rF   rK   rF   rF   rG   rL     rO   c                 C   r   rQ   )r2   r   	algebraicrK   rF   rF   rG   rL     r   c                 C   sN   | j tkrtt| j|rtt| j |S d S | jjo&tt| j |S rQ   )rh   r   r   r   r   r#   ri   rZ   rK   rF   rF   rG   rL     s
   
c                 C   s
   | j dkS ra   )r[   rK   rF   rF   rG   rL     s   
c                 C   rm   ra   rY   r   r   r   ri   rk   rF   rF   rG   rL     ro   c                 C   rp   rQ   )r#   r   r   r   ri   rk   rF   rF   rG   rL     rq   c                 C   rr   rs   )rY   r   r   r   rk   rF   rF   rG   rL     rt   c                 C   ru   rv   r   rk   rF   rF   rG   rL      rw   N)O__doc__sympy.assumptionsr   r   
sympy.corer   r   r   r   r   r	   sympy.core.numbersr
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   sympy.core.logicr   sympy.functionsr   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   sympy.core.relationalr*   $sympy.functions.elementary.complexesr+   sympy.matricesr,   r-   r.   "sympy.matrices.expressions.matexprr/   sympy.multipledispatchr0   commonr2   predicates.setsr4   r5   r6   r7   r8   r9   r:   r;   r<   r=   rH   register_manyr>   rL   registerr   objectr   rF   rF   rF   rG   <module>   sN    L<0

























	



	


?









	














	




7






	















