o
    à8Va|Z  ã                   @   sÂ  d Z ddlmZmZ ddl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-m.Z.m/Z/ ddl0m1Z1m2Z2m3Z3 dd	l4m5Z5 dd
l6m7Z7 ddl8m9Z9 ddl:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZD dd„ ZEe; FeGe¡dd„ ƒZHe; Feeeeeeee¡dd„ ƒZHe; Ie¡dd„ ƒZHe; Fee	¡dd„ ƒZHe; Ie¡dd„ ƒZHe; Ie¡dd„ ƒZHe; Fe1e5e3¡dd„ ƒZHe< Ie¡dd„ ƒZHe< Ie¡dd„ ƒZHe< Feeeeeee¡dd„ ƒZHe< Ie¡dd„ ƒZHe< Fee¡dd„ ƒZHe< Ie	¡dd„ ƒZHe< Fe"e#e$e*e+¡dd„ ƒZHe< Ie&¡d d„ ƒZHe< Fe!e%¡d!d„ ƒZHe< Fe e(¡d"d„ ƒZHe= Ie¡d#d„ ƒZHe= Ie¡d$d„ ƒZHd%d&„ ZJe> Feeeee'eee)e¡	d'd„ ƒZHe> Feee¡d(d„ ƒZHe> Ie¡d)d„ ƒZHe> Ie¡d*d„ ƒZHe> Ie¡d+d„ ƒZHe> Ie	¡d,d„ ƒZHe> Fe$e*¡d-d„ ƒZHe> Ie&¡d.d„ ƒZHe> Ie(¡d/d„ ƒZHe> Fe1e5e3¡d0d„ ƒZHe? IeK¡d1d„ ƒZHe? Fee¡d2d„ ƒZHe? Feee	¡d3d„ ƒZHe@ IeK¡d4d„ ƒZHe@ Ie¡d5d„ ƒZHe@ Ie¡d6d„ ƒZHe@ Ie	¡d7d„ ƒZHe@ Fe$e*¡d8d„ ƒZHe@ Ie&¡d9d„ ƒZHe@ Ie2¡d:d„ ƒZHeA Fee$e&e'ee(eee)e*¡
d;d„ ƒZHeA Fee¡d<d„ ƒZHeA Ie¡d=d„ ƒZHeA Fee¡d>d„ ƒZHeA Ie	¡d?d„ ƒZHeA Fe1e5e3¡d@d„ ƒZHeA Ie¡dAd„ ƒZHdBdC„ ZLeB Ie¡dDd„ ƒZHeB Ie¡dEd„ ƒZHeB Ie¡dFd„ ƒZHeB Ie¡dGd„ ƒZHeB Ie	¡dHd„ ƒZHeB Ie(¡dId„ ƒZHeB Ie&¡dJd„ ƒZHeB Fee¡dKd„ ƒZHeB Ie¡dLd„ ƒZHeC IeK¡dMd„ ƒZHeC Ie¡dNd„ ƒZHeC Ie¡dOd„ ƒZHeC Ie	¡dPd„ ƒZHeC Ie2¡dQd„ ƒZHeD Feeeee¡dRd„ ƒZHeD Feeeee¡dSd„ ƒZHeD Fee¡dTd„ ƒZHeD Ie	¡dUd„ ƒZHeD Ie¡dVd„ ƒZHeD Fe"e#e$e*e+¡dWd„ ƒZHeD Ie&¡dXd„ ƒZHeD Fe!e%¡dYd„ ƒZHeD Fe e(¡dZd„ ƒZHd[S )\zL
Handlers for predicates related to set membership: integer, rational, etc.
é    )ÚQÚask)ÚAddÚBasicÚExprÚMulÚPow)Ú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ÚroundZequalsÚ	TypeError©ÚexprÚassumptionsÚi© rD   úA/usr/lib/python3/dist-packages/sympy/assumptions/handlers/sets.pyÚ_IntegerPredicate_number   s   ÿrF   c                 C   ó   dS ©NTrD   ©rA   rB   rD   rD   rE   Ú_&   ó   rJ   c                 C   rG   ©NFrD   rI   rD   rD   rE   rJ   *   ó   c                 C   ó   | j }|d u r	t‚|S ©N)Ú
is_integerr/   ©rA   rB   ÚretrD   rD   rE   rJ   /   ó   c                 C   ó   | j rt| |ƒS t| |tjƒS )zw
    * Integer + Integer       -> Integer
    * Integer + !Integer      -> !Integer
    * !Integer + !Integer -> ?
    )Ú	is_numberrF   r1   r   ÚintegerrI   rD   rD   rE   rJ   6   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     -> ?
    Tr2   r0   NF)
rU   rF   Úargsr   r   rV   Úis_RationalÚqÚevenZ
irrational)rA   rB   Z_outputÚargrD   rD   rE   rJ   A   s$   


ÿôc                 C   ó   t t | jd ¡|ƒS ©Nr   )r   r   rV   rW   rI   rD   rD   rE   rJ   ]   ó   c                 C   r\   r]   )r   r   Zinteger_elementsrW   rI   rD   rD   rE   rJ   a   r^   c                 C   rG   rH   rD   rI   rD   rD   rE   rJ   h   rK   c                 C   ó   d S rO   rD   rI   rD   rD   rE   rJ   l   rK   c                 C   rG   rL   rD   rI   rD   rD   rE   rJ   p   rM   c                 C   rN   rO   )Zis_rationalr/   rQ   rD   rD   rE   rJ   u   rS   c                 C   s$   | j r|  ¡ d rdS t| |tjƒS )z}
    * Rational + Rational     -> Rational
    * Rational + !Rational    -> !Rational
    * !Rational + !Rational   -> ?
    r0   F)rU   Úas_real_imagr1   r   ÚrationalrI   rD   rD   rE   rJ   |   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   ra   ÚnonzerorV   Zprime©rA   rB   ÚxrD   rD   rE   rJ   ˆ   s   
þc                 C   ó0   | j d }tt |¡|ƒrtt |¡ |ƒS d S r]   ©rW   r   r   ra   rc   rd   rD   rD   rE   rJ   ›   ó   
ÿc                 C   ó,   | j }tt |¡|ƒrtt |¡ |ƒS d S rO   )r"   r   r   ra   rc   rd   rD   rD   rE   rJ   ¡   ó   ÿc                 C   ó"   | j d }tt |¡|ƒrdS d S ©Nr   F)rW   r   r   ra   rd   rD   rD   rE   rJ   §   ó   
ÿc                 C   ó4   | j d }tt |¡|ƒrtt |d ¡ |ƒS d S ©Nr   r0   rg   rd   rD   rD   rE   rJ   ­   ó   
ÿc                 C   rN   rO   )Zis_irrationalr/   rQ   rD   rD   rE   rJ   ¶   rS   c                 C   s:   t t | ¡|ƒ}|rt t | ¡|ƒ}|d u rd S | S |S rO   )r   r   Úrealra   )rA   rB   Z_realZ	_rationalrD   rD   rE   rJ   ½   s   c                 C   s&   |   ¡ d  d¡}|jdkr| S d S )Nr0   r2   ©r`   ZevalfZ_precr@   rD   rD   rE   Ú_RealPredicate_numberË   ó   
ÿrs   c                 C   rG   rH   rD   rI   rD   rD   rE   rJ   Ô   rM   c                 C   rG   rL   rD   rI   rD   rD   rE   rJ   Ù   rK   c                 C   rN   rO   )Zis_realr/   rQ   rD   rD   rE   rJ   Ý   rS   c                 C   rT   )zT
    * Real + Real              -> Real
    * Real + (Complex & !Real) -> !Real
    )rU   rs   r1   r   rq   rI   rD   rD   rE   rJ   ä   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)rU   rs   rW   r   r   rq   Ú	imaginary)rA   rB   Úresultr[   rD   rD   rE   rJ   î   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rf| jjtkrftt | jj¡|ƒrEtt | j¡|ƒrEdS | jjt t	 }tt d| ¡|ƒrdtt 
d| | j ¡|ƒS dS tt | j¡|ƒrŠtt | j¡|ƒrŠtt | j¡|ƒ}|durˆ| S dS tt | j¡|ƒr¤tt t| jƒ¡|ƒ}|dur¤|S tt 
| j¡|ƒrîtt 
| j¡|ƒrð| jjrÍtt | jj¡|ƒrÍtt | j¡|ƒS tt | j¡|ƒrØdS tt | j¡|ƒrãdS tt | j¡|ƒròd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
    Tr2   éÿÿÿÿNF)rU   rs   rb   r   r   r   rV   r"   r(   r   rq   ÚfuncÚis_Powru   Úoddr$   rX   rZ   rY   ÚpositiveÚnegative)rA   rB   rC   rz   ÚimlogrD   rD   rE   rJ     sN   

 ÿ ÿöc                 C   s   t t | jd ¡|ƒrdS d S ©Nr   T)r   r   rq   rW   rI   rD   rD   rE   rJ   B  s   ÿc                 C   s&   t t | jt t ¡t | j¡B |ƒS rO   )r   r   rV   r"   r(   r   rq   rI   rD   rD   rE   rJ   G  s    ÿc                 C   r\   r]   )r   r   r{   rW   rI   rD   rD   rE   rJ   M  r^   c                 C   r\   r]   )r   r   Zreal_elementsrW   rI   rD   rD   rE   rJ   Q  r^   c                 C   s8   t t | ¡t | ¡B t | ¡B t | ¡B t | ¡B |ƒS rO   )r   r   Znegative_infiniter|   Úzeror{   Zpositive_infiniterI   rD   rD   rE   rJ   X  s   
ÿþýüûc                 C   rG   rH   rD   rI   rD   rD   rE   rJ   a  rK   c                 C   ó   t | |tjƒS rO   )r1   r   Zextended_realrI   rD   rD   rE   rJ   e  ó   c                 C   s   t | tƒrd S tt | ¡|ƒS rO   )Ú
isinstancer,   r   r   rq   rI   rD   rD   rE   rJ   l  s   
c                 C   ó   | j rt‚t| |tjƒS )zZ
    * Hermitian + Hermitian  -> Hermitian
    * Hermitian + !Hermitian -> !Hermitian
    )rU   r/   r1   r   Ú	hermitianrI   rD   rD   rE   rJ   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         -> Hermitian
    * Hermitian*Antihermitian     -> !Hermitian
    * Antihermitian*Antihermitian -> Hermitian
    r   Tr0   N©rU   r/   rW   r   r   Úantihermitianr„   Zcommutative©rA   rB   Znccountrv   r[   rD   rD   rE   rJ   |  ó   	

€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)	rU   r/   rb   r   r   r   r„   r"   rV   rI   rD   rD   rE   rJ   •  s   
c                 C   s   t t | jd ¡|ƒrdS t‚r~   )r   r   r„   rW   r/   rI   rD   rD   rE   rJ   ¥  s   c                 C   s   t t | j¡|ƒrdS t‚rH   )r   r   r„   r"   r/   rI   rD   rD   rE   rJ   «  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*   r/   ©ZmatrB   ZrowsZcolsZret_valrC   ÚjZcondrD   rD   rE   rJ   ±  s   
"ÿüc                 C   rG   rH   rD   rI   rD   rD   rE   rJ   Ã  rM   c                 C   rG   rL   rD   rI   rD   rD   rE   rJ   È  rK   c                 C   rN   rO   )Z
is_complexr/   rQ   rD   rD   rE   rJ   Ì  rS   c                 C   r€   rO   )r1   r   ÚcomplexrI   rD   rD   rE   rJ   Ó  r   c                 C   s   | j tkrdS t| |tjƒS rH   )rb   r   r1   r   r   rI   rD   rD   rE   rJ   ×  s   
c                 C   r\   r]   )r   r   Zcomplex_elementsrW   rI   rD   rD   rE   rJ   Ý  r^   c                 C   r_   rO   rD   rI   rD   rD   rE   rJ   á  rK   c                 C   s&   |   ¡ d  d¡}|jdkr| S d S )Nr   r2   r0   rr   )rA   rB   ÚrrD   rD   rE   Ú_Imaginary_numberè  rt   r’   c                 C   rG   rH   rD   rI   rD   rD   rE   rJ   ñ  rK   c                 C   rN   rO   )Zis_imaginaryr/   rQ   rD   rD   rE   rJ   õ  rS   c                 C   sz   | 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ks9t| jƒ|kr;dS dS )zy
    * Imaginary + Imaginary -> Imaginary
    * Imaginary + Complex   -> ?
    * Imaginary + Real      -> !Imaginary
    r   r0   TFN©rU   r’   rW   r   r   ru   rq   Úlen)rA   rB   Úrealsr[   rD   rD   rE   rJ   ü  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“   )rA   rB   rv   r•   r[   rD   rD   rE   rJ     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rh| jjtkrhtt | jj¡|ƒrhtt | j¡|ƒrIdS | jjt t }tt 	d| ¡|ƒrhtt d| | j ¡|ƒS tt | j¡|ƒr‹tt 	| j¡|ƒr‹tt | j¡|ƒ}|dur‰|S dS tt | j¡|ƒr¥tt t| jƒ¡|ƒ}|dur¥dS tt | j¡t | j¡@ |ƒrïtt | j¡|ƒr¿dS tt | j¡|ƒ}|sÌ|S tt 	| j¡|ƒr×dS tt 	d| j ¡|ƒ}|rít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
    r2   Frw   N)rU   r’   rb   r   r"   r(   r   r   r   rV   rx   ry   ru   rz   r$   rq   r{   ra   r|   )rA   rB   ÚarC   rz   r}   ZratZhalfrD   rD   rE   rJ   )  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   rq   rW   r{   rx   r"   ry   rb   r   r(   ru   )rA   rB   r#   rD   rD   rE   rJ   a  s   ,ÿc                 C   s.   | j t t }tt d| ¡t |¡ @ |ƒS )Nr2   )r"   r(   r   r   r   rV   )rA   rB   r–   rD   rD   rE   rJ   r  s    c                 C   s   |   ¡ d dk S )Nr0   r   )r`   rI   rD   rD   rE   rJ   w  s   c                 C   r_   rO   rD   rI   rD   rD   rE   rJ   {  rK   c                 C   s2   t | tƒrd S tt | ¡|ƒrdS tt | ¡|ƒS rH   )r‚   r,   r   r   r   ru   rI   rD   rD   rE   rJ   ‚  s
   
c                 C   rƒ   )zr
    * Antihermitian + Antihermitian  -> Antihermitian
    * Antihermitian + !Antihermitian -> !Antihermitian
    )rU   r/   r1   r   r‡   rI   rD   rD   rE   rJ   Š  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   FTr0   Nr†   rˆ   rD   rD   rE   rJ   ”  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)rU   r/   r   r   r„   rb   rV   r"   r‡   rZ   rz   rI   rD   rD   rE   rJ   ­  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Ž   rD   rD   rE   rJ   À  s   
$ÿüc                 C   rG   rH   rD   rI   rD   rD   rE   rJ   Ò  rM   c                 C   rG   rL   rD   rI   rD   rD   rE   rJ   ×  rM   c                 C   r€   rO   )r1   r   Ú	algebraicrI   rD   rD   rE   rJ   Ü  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 rO   )rb   r   r   r   r—   r"   rc   rX   rI   rD   rD   rE   rJ   à  s
   
c                 C   s
   | j dkS r]   )rY   rI   rD   rD   rE   rJ   è  s   
c                 C   rf   r]   ©rW   r   r   r—   rc   rd   rD   rD   rE   rJ   ì  rh   c                 C   ri   rO   )r"   r   r   r—   rc   rd   rD   rD   rE   rJ   ò  rj   c                 C   rk   rl   )rW   r   r   r—   rd   rD   rD   rE   rJ   ø  rm   c                 C   rn   ro   r˜   rd   rD   rD   rE   rJ   þ  rp   N)MÚ__doc__Zsympy.assumptionsr   r   Z
sympy.corer   r   r   r   r   Zsympy.core.numbersr	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Zsympy.core.logicr   Zsympy.functionsr   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   Zsympyr(   r)   r*   Zsympy.matricesr+   r,   r-   Z"sympy.matrices.expressions.matexprr.   Zsympy.multipledispatchr/   Úcommonr1   Zpredicates.setsr3   r4   r5   r6   r7   r8   r9   r:   r;   r<   rF   Zregister_manyr=   rJ   Úregisterrs   Úobjectr’   rD   rD   rD   rE   Ú<module>   sJ   L<0


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

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