§
    OŠtjª.  ã            	      óÊ   — U d dl mZ d dlmZ d dl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lmZmZ dd„Zd	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ ZeeeeeeeedœZded<   dS )é    )Úannotations)ÚCallable)ÚSÚAddÚExprÚBasicÚMulÚPowÚRational)Ú	fuzzy_not)ÚBoolean)ÚaskÚQTc                óœ  ‡— t          | t          ¦  «        s| S | j        sˆfd„| j        D ¦   «         } | j        |Ž } t          | d¦  «        r|                      ‰¦  «        }|�|S | j        j        }t           
                    |d¦  «        }|€| S  || ‰¦  «        }|�| |k    r| S t          |t          ¦  «        s|S t          |‰¦  «        S )a  
    Simplify an expression using assumptions.

    Explanation
    ===========

    Unlike :func:`~.simplify` which performs structural simplification
    without any assumption, this function transforms the expression into
    the form which is only valid under certain assumptions. Note that
    ``simplify()`` is generally not done in refining process.

    Refining boolean expression involves reducing it to ``S.true`` or
    ``S.false``. Unlike :func:`~.ask`, the expression will not be reduced
    if the truth value cannot be determined.

    Examples
    ========

    >>> from sympy import refine, sqrt, Q
    >>> from sympy.abc import x
    >>> refine(sqrt(x**2), Q.real(x))
    Abs(x)
    >>> refine(sqrt(x**2), Q.positive(x))
    x

    >>> refine(Q.real(x), Q.positive(x))
    True
    >>> refine(Q.positive(x), Q.real(x))
    Q.positive(x)

    See Also
    ========

    sympy.simplify.simplify.simplify : Structural simplification without assumptions.
    sympy.assumptions.ask.ask : Query for boolean expressions using assumptions.
    c                ó0   •— g | ]}t          |‰¦  «        ‘ŒS © )Úrefine)Ú.0ÚargÚassumptionss     €úV/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/sympy/assumptions/refine.pyú
<listcomp>zrefine.<locals>.<listcomp>4   s#   ø€ Ð>Ð>Ð>¨S•�s˜KÑ(Ô(Ð>Ð>Ð>ó    Ú_eval_refineN)Ú
isinstancer   Úis_AtomÚargsÚfuncÚhasattrr   Ú	__class__Ú__name__Úhandlers_dictÚgetr   r   )Úexprr   r   Úref_exprÚnameÚhandlerÚnew_exprs    `     r   r   r      sö   ø€ õJ �d�EÑ"Ô"ð ØˆàŒ<ð  Ø>Ð>Ð>Ð>°D´IÐ>Ñ>Ô>ˆàˆtŒy˜$ÐˆÝˆt�^Ñ$Ô$ð Ø×$Ò$ [Ñ1Ô1ˆØÐØˆOØŒ>Ô"€DÝ×Ò  dÑ+Ô+€GØ€ØˆØˆw�t˜[Ñ)Ô)€HØÐ˜d hÒ.Ð.ØˆÝ�h¥Ñ%Ô%ð ØˆÝ�(˜KÑ(Ô(Ð(r   c                óD  ‡— ddl m} | j        d         }t          t	          j        |¦  «        ‰¦  «        r1t          t          t	          j        |¦  «        ‰¦  «        ¦  «        r|S t          t	          j        |¦  «        ‰¦  «        r| S t          |t          ¦  «        r~ˆfd„|j        D ¦   «         }g }g }|D ]H}t          ||¦  «        r!| 
                    |j        d         ¦  «         Œ3| 
                    |¦  «         ŒIt          |Ž  |t          |Ž ¦  «        z  S dS )aF  
    Handler for the absolute value.

    Examples
    ========

    >>> from sympy import Q, Abs
    >>> from sympy.assumptions.refine import refine_abs
    >>> from sympy.abc import x
    >>> refine_abs(Abs(x), Q.real(x))
    >>> refine_abs(Abs(x), Q.positive(x))
    x
    >>> refine_abs(Abs(x), Q.negative(x))
    -x

    r   ©ÚAbsc                óJ   •— g | ]}t          t          |¦  «        ‰¦  «        ‘Œ S r   )r   Úabs)r   Úar   s     €r   r   zrefine_abs.<locals>.<listcomp>b   s)   ø€ Ð;Ð;Ð;¨Q�V•C˜‘F”F˜KÑ(Ô(Ð;Ð;Ð;r   N)Ú$sympy.functions.elementary.complexesr+   r   r   r   Úrealr   Únegativer   r	   Úappend)r$   r   r+   r   ÚrÚnon_absÚin_absÚis    `      r   Ú
refine_absr7   G   s5  ø€ ð" 9Ð8Ð8Ð8Ð8Ð8Ø
Œ)�AŒ,€CÝ
�1Œ6�#‰;Œ;˜Ñ$Ô$ð Ý•c�!œ* S™/œ/¨;Ñ7Ô7Ñ8Ô8ðð ˆ
Ý
�1Œ:�c‰?Œ?˜KÑ(Ô(ð Øˆtˆå�#•sÑÔð 	1Ø;Ð;Ð;Ð;°#´(Ð;Ñ;Ô;ˆØˆØˆØð 	"ð 	"ˆAÝ˜!˜SÑ!Ô!ð "Ø—’˜aœf QœiÑ(Ô(Ð(Ð(à—’˜qÑ!Ô!Ð!Ð!Ý�Gˆ}˜s˜s¥3¨ <Ñ0Ô0Ñ0Ð0ð	1ð 	1r   c                ó¾  — ddl m} ddlm} t	          | j        |¦  «        rst          t          j        | j        j	        d         ¦  «        |¦  «        rAt          t          j
        | j        ¦  «        |¦  «        r| j        j	        d         | j        z  S t          t          j        | j        ¦  «        |¦  «        �rš| j        j        r—t          t          j
        | j        ¦  «        |¦  «        rt          | j        ¦  «        | j        z  S t          t          j        | j        ¦  «        |¦  «        r- || j        ¦  «        t          | j        ¦  «        | j        z  z  S t	          | j        t          ¦  «        rHt	          | j        t           ¦  «        r.t          | j        j        ¦  «        | j        j        | j        z  z  S | j        t"          j        u �rƒ| j        j        �rx| }| j                             ¦   «         \  }}t+          |¦  «        }t+          ¦   «         }t+          ¦   «         }t-          |¦  «        }	|D ]q}
t          t          j
        |
¦  «        |¦  «        r|                     |
¦  «         Œ:t          t          j        |
¦  «        |¦  «        r|                     |
¦  «         Œr||z  }t-          |¦  «        dz  r||z  }|t"          j        z   dz  }n
||z  }|dz  }||k    st-          |¦  «        |	k     r&|                     |¦  «         | j        t3          |Ž z  } d| j        z  }t          t          j
        |¦  «        |¦  «        r|                     ¦   «         r
|| j        z  }|j        r×|                     ¦   «         \  }}|j        r¹|j        t"          j        u r¦t          t          j        |j        ¦  «        |¦  «        r|dz   dz  }t          t          j
        |¦  «        |¦  «        r| j        |j        z  S t          t          j        |¦  «        |¦  «        r| j        |j        dz   z  S | j        |j        |z   z  S || k    r| S dS dS dS dS )as  
    Handler for instances of Pow.

    Examples
    ========

    >>> from sympy import Q
    >>> from sympy.assumptions.refine import refine_Pow
    >>> from sympy.abc import x,y,z
    >>> refine_Pow((-1)**x, Q.real(x))
    >>> refine_Pow((-1)**x, Q.even(x))
    1
    >>> refine_Pow((-1)**x, Q.odd(x))
    -1

    For powers of -1, even parts of the exponent can be simplified:

    >>> refine_Pow((-1)**(x+y), Q.even(x))
    (-1)**y
    >>> refine_Pow((-1)**(x+y+z), Q.odd(x) & Q.odd(z))
    (-1)**y
    >>> refine_Pow((-1)**(x+y+2), Q.odd(x))
    (-1)**(y + 1)
    >>> refine_Pow((-1)**(x+3), True)
    (-1)**(x + 1)

    r   r*   )Úsigné   é   N)r/   r+   Úsympy.functionsr9   r   Úbaser   r   r0   r   ÚevenÚexpÚ	is_numberr-   Úoddr   r
   r   ÚNegativeOneÚis_AddÚas_coeff_addÚsetÚlenÚaddÚOner   Úcould_extract_minus_signÚas_two_termsÚis_PowÚinteger)r$   r   r+   r9   ÚoldÚcoeffÚtermsÚ
even_termsÚ	odd_termsÚinitial_number_of_termsÚtÚ	new_coeffÚe2r6   Úps                  r   Ú
refine_PowrW   m   s  € ð8 9Ð8Ð8Ð8Ð8Ð8Ø$Ð$Ð$Ð$Ð$Ð$Ý�$”)˜SÑ!Ô!ð 1Ý�qŒv�d”i”n QÔ'Ñ(Ô(¨+Ñ6Ô6ð 	1Ý•A”F˜4œ8Ñ$Ô$ kÑ2Ô2ð	1à”9”> !Ô$¨¬Ñ0Ð0Ý
�1Œ6�$”)ÑÔ˜kÑ*Ô*ñ ? ØŒ9Ôð 	DÝ•1”6˜$œ(Ñ#Ô# [Ñ1Ô1ð 2Ý˜4œ9‘~”~¨¬Ñ1Ð1Ý•1”5˜œ‘?”? KÑ0Ô0ð DØ�t˜DœI‘”­¨T¬Y©¬¸4¼8Ñ)CÑCÐCÝ�d”h¥Ñ)Ô)ð 	IÝ˜$œ)¥SÑ)Ô)ð IÝ˜4œ9œ>Ñ*Ô*¨t¬y¬}¸t¼xÑ/GÑHÐHàŒ9�œÐ%Ñ%ØŒxŒñ 4 à�ð  $œx×4Ò4Ñ6Ô6‘��uÝ˜E™
œ
�Ý ™UœU�
Ý™EœE�	Ý*-¨e©*¬*Ð'àð )ð )�AÝ�1œ6 !™9œ9 kÑ2Ô2ð )Ø"Ÿš qÑ)Ô)Ð)Ð)Ý�QœU 1™XœX {Ñ3Ô3ð )Ø!Ÿš aÑ(Ô(Ð(øà˜Ñ#�Ý�y‘>”> AÑ%ð *Ø˜YÑ&�EØ!&­¬¡°!Ñ 3�I�Ià˜YÑ&�EØ %¨¡	�Ià Ò%Ð%­¨U©¬Ð6MÒ)MÐ)MØ—I’I˜iÑ(Ô(Ð(Øœ9¥s¨E {Ñ3�Dð �t”x‘Z�Ý•q”v˜b‘z”z ;Ñ/Ô/ð (Ø×2Ò2Ñ4Ô4ð (Ø˜dœi™˜Ø”9ð 
>ØŸ?š?Ñ,Ô,‘D�A�qØ”xð > A¤F­a¬mÐ$;Ð$;Ý�qœy¨¬Ñ/Ô/°Ñ=Ô=ð >Ø!" Q¡¨¡	˜AÝ"¥1¤6¨!¡9¤9¨kÑ:Ô:ð >Ø'+¤y°!´%Ñ'7Ð 7Ý!$¥Q¤U¨1¡X¤X¨{Ñ!;Ô!;ð >Ø'+¤y°1´5¸1±9Ñ'=Ð =à'+¤y°1´5¸1±9Ñ'=Ð =à˜$’;�;Ø�Kð? ð ? ð &Ð%ð4 ð 4 ðf �;r   c                ó  — ddl m} | j        \  }}t          t	          j        |¦  «        t	          j        |¦  «        z  |¦  «        r |||z  ¦  «        S t          t	          j        |¦  «        t	          j        |¦  «        z  |¦  «        r |||z  ¦  «        t          j	        z
  S t          t	          j        |¦  «        t	          j        |¦  «        z  |¦  «        r |||z  ¦  «        t          j	        z   S t          t	          j
        |¦  «        t	          j        |¦  «        z  |¦  «        rt          j	        S t          t	          j        |¦  «        t	          j
        |¦  «        z  |¦  «        rt          j	        dz  S t          t	          j        |¦  «        t	          j
        |¦  «        z  |¦  «        rt          j	         dz  S t          t	          j
        |¦  «        t	          j
        |¦  «        z  |¦  «        rt          j        S | S )aÃ  
    Handler for the atan2 function.

    Examples
    ========

    >>> from sympy import Q, atan2
    >>> from sympy.assumptions.refine import refine_atan2
    >>> from sympy.abc import x, y
    >>> refine_atan2(atan2(y,x), Q.real(y) & Q.positive(x))
    atan(y/x)
    >>> refine_atan2(atan2(y,x), Q.negative(y) & Q.negative(x))
    atan(y/x) - pi
    >>> refine_atan2(atan2(y,x), Q.positive(y) & Q.negative(x))
    atan(y/x) + pi
    >>> refine_atan2(atan2(y,x), Q.zero(y) & Q.negative(x))
    pi
    >>> refine_atan2(atan2(y,x), Q.positive(y) & Q.zero(x))
    pi/2
    >>> refine_atan2(atan2(y,x), Q.negative(y) & Q.zero(x))
    -pi/2
    >>> refine_atan2(atan2(y,x), Q.zero(y) & Q.zero(x))
    nan
    r   )Úatanr:   )Ú(sympy.functions.elementary.trigonometricrY   r   r   r   r0   Úpositiver1   r   ÚPiÚzeroÚNaN)r$   r   rY   ÚyÚxs        r   Úrefine_atan2ra   Ñ   s¡  € ð2 >Ð=Ð=Ð=Ð=Ð=ØŒ9�D€A€qÝ
�1Œ6�!‰9Œ9•q”z !‘}”}Ñ$ kÑ2Ô2ð Øˆt�A˜‘E‰{Œ{ÐÝ	�QŒZ˜‰]Œ]�QœZ¨™]œ]Ñ*¨KÑ	8Ô	8ð Øˆt�A˜‘E‰{Œ{�QœTÑ!Ð!Ý	�QŒZ˜‰]Œ]�QœZ¨™]œ]Ñ*¨KÑ	8Ô	8ð Øˆt�A˜‘E‰{Œ{�QœTÑ!Ð!Ý	�QŒV�A‰YŒY�œ A™œÑ&¨Ñ	4Ô	4ð 	ÝŒtˆÝ	�QŒZ˜‰]Œ]�QœV A™YœYÑ&¨Ñ	4Ô	4ð ÝŒt�A‰vˆÝ	�QŒZ˜‰]Œ]�QœV A™YœYÑ&¨Ñ	4Ô	4ð Ý”ˆu�Q‰wˆÝ	�QŒV�A‰YŒY�œ ™œÑ" KÑ	0Ô	0ð ÝŒuˆàˆr   c                óà   — | j         d         }t          t          j        |¦  «        |¦  «        r|S t          t          j        |¦  «        |¦  «        rt
          j        S t          | |¦  «        S )a  
    Handler for real part.

    Examples
    ========

    >>> from sympy.assumptions.refine import refine_re
    >>> from sympy import Q, re
    >>> from sympy.abc import x
    >>> refine_re(re(x), Q.real(x))
    x
    >>> refine_re(re(x), Q.imaginary(x))
    0
    r   )r   r   r   r0   Ú	imaginaryr   ÚZeroÚ_refine_reim©r$   r   r   s      r   Ú	refine_rerg   þ   sa   € ð Œ)�AŒ,€CÝ
�1Œ6�#‰;Œ;˜Ñ$Ô$ð Øˆ
Ý
�1Œ;�sÑÔ˜[Ñ)Ô)ð ÝŒvˆÝ˜˜kÑ*Ô*Ð*r   c                óü   — | j         d         }t          t          j        |¦  «        |¦  «        rt          j        S t          t          j        |¦  «        |¦  «        rt          j         |z  S t          | |¦  «        S )a  
    Handler for imaginary part.

    Explanation
    ===========

    >>> from sympy.assumptions.refine import refine_im
    >>> from sympy import Q, im
    >>> from sympy.abc import x
    >>> refine_im(im(x), Q.real(x))
    0
    >>> refine_im(im(x), Q.imaginary(x))
    -I*x
    r   )	r   r   r   r0   r   rd   rc   ÚImaginaryUnitre   rf   s      r   Ú	refine_imrj     sl   € ð Œ)�AŒ,€CÝ
�1Œ6�#‰;Œ;˜Ñ$Ô$ð ÝŒvˆÝ
�1Œ;�sÑÔ˜[Ñ)Ô)ð 'Ý”Ð  3Ñ&Ð&Ý˜˜kÑ*Ô*Ð*r   c                óØ   — | j         d         }t          t          j        |¦  «        |¦  «        rt          j        S t          t          j        |¦  «        |¦  «        rt          j        S dS )a"  
    Handler for complex argument

    Explanation
    ===========

    >>> from sympy.assumptions.refine import refine_arg
    >>> from sympy import Q, arg
    >>> from sympy.abc import x
    >>> refine_arg(arg(x), Q.positive(x))
    0
    >>> refine_arg(arg(x), Q.negative(x))
    pi
    r   N)r   r   r   r[   r   rd   r1   r\   )r$   r   Úrgs      r   Ú
refine_argrm   +  sV   € ð 
Œ�1Œ€BÝ
�1Œ:�b‰>Œ>˜;Ñ'Ô'ð ÝŒvˆÝ
�1Œ:�b‰>Œ>˜;Ñ'Ô'ð ÝŒtˆØˆ4r   c                ón   — |                       d¬¦  «        }|| k    rt          ||¦  «        }||k    r|S d S )NT)Úcomplex)Úexpandr   )r$   r   ÚexpandedÚrefineds       r   re   re   B  sD   € à�{Š{ Tˆ{Ñ*Ô*€HØ�4ÒÐÝ˜ ;Ñ/Ô/ˆØ�hÒÐØˆNàˆ4r   c                ó   — | j         d         }t          t          j        |¦  «        |¦  «        rt          j        S t          t          j        |¦  «        ¦  «        r\t          t          j        |¦  «        |¦  «        rt          j        S t          t          j	        |¦  «        |¦  «        rt          j
        S t          t          j        |¦  «        ¦  «        rt|                     ¦   «         \  }}t          t          j        |¦  «        |¦  «        rt          j        S t          t          j	        |¦  «        |¦  «        rt          j         S | S )a*  
    Handler for sign.

    Examples
    ========

    >>> from sympy.assumptions.refine import refine_sign
    >>> from sympy import Symbol, Q, sign, im
    >>> x = Symbol('x', real = True)
    >>> expr = sign(x)
    >>> refine_sign(expr, Q.positive(x) & Q.nonzero(x))
    1
    >>> refine_sign(expr, Q.negative(x) & Q.nonzero(x))
    -1
    >>> refine_sign(expr, Q.zero(x))
    0
    >>> y = Symbol('y', imaginary = True)
    >>> expr = sign(y)
    >>> refine_sign(expr, Q.positive(im(y)))
    I
    >>> refine_sign(expr, Q.negative(im(y)))
    -I
    r   )r   r   r   r]   r   rd   r0   r[   rH   r1   rB   rc   Úas_real_imagri   )r$   r   r   Úarg_reÚarg_ims        r   Úrefine_signrw   M  s
  € ð0 Œ)�AŒ,€CÝ
�1Œ6�#‰;Œ;˜Ñ$Ô$ð ÝŒvˆÝ
�1Œ6�#‰;Œ;ÑÔð !Ý�qŒz˜#‰Œ Ñ,Ô,ð 	Ý”5ˆLÝ�qŒz˜#‰Œ Ñ,Ô,ð 	!Ý”=Ð Ý
�1Œ;�sÑÔÑÔð $Ø×)Ò)Ñ+Ô+‰ˆ�Ý�qŒz˜&Ñ!Ô! ;Ñ/Ô/ð 	#Ý”?Ð"Ý�qŒz˜&Ñ!Ô! ;Ñ/Ô/ð 	$Ý”OÐ#Ð#Ø€Kr   c                ó¸   — ddl m} | j        \  }}}t          t	          j        |¦  «        |¦  «        r&||z
                       ¦   «         r| S  ||||¦  «        S dS )aU  
    Handler for symmetric part.

    Examples
    ========

    >>> from sympy.assumptions.refine import refine_matrixelement
    >>> from sympy import MatrixSymbol, Q
    >>> X = MatrixSymbol('X', 3, 3)
    >>> refine_matrixelement(X[0, 1], Q.symmetric(X))
    X[0, 1]
    >>> refine_matrixelement(X[1, 0], Q.symmetric(X))
    X[0, 1]
    r   )ÚMatrixElementN)Ú"sympy.matrices.expressions.matexprry   r   r   r   Ú	symmetricrI   )r$   r   ry   Úmatrixr6   Újs         r   Úrefine_matrixelementr~   v  s{   € ð AÐ@Ð@Ð@Ð@Ð@Ø”9�L€FˆAˆqÝ
�1Œ;�vÑÔ Ñ,Ô,ð +Ø�‰E×+Ò+Ñ-Ô-ð 	ØˆKØˆ}˜V Q¨Ñ*Ô*Ð*ð+ð +r   )r+   r
   Úatan2ÚreÚimr   r9   ry   z*dict[str, Callable[[Expr, Boolean], Expr]]r"   N)T)Ú
__future__r   Útypingr   Ú
sympy.corer   r   r   r   r	   r
   r   Úsympy.core.logicr   Úsympy.logic.boolalgr   Úsympy.assumptionsr   r   r   r7   rW   ra   rg   rj   rm   re   rw   r~   r"   Ú__annotations__r   r   r   ú<module>r‰      s…  ðØ "Ð "Ð "Ð "Ð "Ð "Ð "Ø Ð Ð Ð Ð Ð à >Ð >Ð >Ð >Ð >Ð >Ð >Ð >Ð >Ð >Ð >Ð >Ð >Ð >Ð >Ð >Ð >Ð >Ø &Ð &Ð &Ð &Ð &Ð &Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'à $Ð $Ð $Ð $Ð $Ð $Ð $Ð $ð9)ð 9)ð 9)ð 9)ðx#1ð #1ð #1ðLa ð a ð a ðH*ð *ð *ðZ+ð +ð +ð.+ð +ð +ð,ð ð ð.ð ð ð&ð &ð &ðR+ð +ð +ð. ØØØ
Ø
ØØØ)ð	=ð 	=€ð 	ð 	ð 	ñ 	ð 	ð 	r   