
    sg                        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mZmZmZ d dlmZmZ d dlmZmZmZ d dlmZ d d	lmZ d d
l m!Z! d dl"m#Z#  G d de      Z$ G d de      Z% G d de      Z& G d de      Z' G d de      Z( G d de      Z) G d de      Z* G d de      Z+ G d de      Z, G d de      Z-d  Z. G d! d"e      Z/d(d#Z0d)d$Z1d(d%Z2d*d'Z3y&)+    )Tuple)SAddMulsympifySymbolDummyBasic)Expr)factor_terms)Function
DerivativeArgumentIndexErrorAppliedUndef
expand_mul)	fuzzy_notfuzzy_or)piIoo)Pow)Eq)sqrt)	Piecewisec                   j    e Zd ZU dZee   ed<   dZdZdZ	e
d        ZddZd Zd Zd Zd	 Zd
 Zd Zy)rea  
    Returns real part of expression. This function performs only
    elementary analysis and so it will fail to decompose properly
    more complicated expressions. If completely simplified result
    is needed then use ``Basic.as_real_imag()`` or perform complex
    expansion on instance of this function.

    Examples
    ========

    >>> from sympy import re, im, I, E, symbols
    >>> x, y = symbols('x y', real=True)
    >>> re(2*E)
    2*E
    >>> re(2*I + 17)
    17
    >>> re(2*I)
    0
    >>> re(im(x) + x*I + 2)
    2
    >>> re(5 + I + 2)
    7

    Parameters
    ==========

    arg : Expr
        Real or complex expression.

    Returns
    =======

    expr : Expr
        Real part of expression.

    See Also
    ========

    im
    argsTc                    |t         j                  u rt         j                  S |t         j                  u rt         j                  S |j                  r|S |j                  st
        |z  j                  rt         j                  S |j                  r|j                         d   S |j                  r(t        |t              rt        |j                  d         S g g g }}}t        j                  |      }|D ]  }|j!                  t
              }||j                  r'|j#                  |       9|j%                  t
              s|j                  r|j#                  |       l|j                  |      }|r|j#                  |d          |j#                  |        t'        |      t'        |      k7  r'd |||fD        \  }	}
} | |	      t)        |
      z
  |z   S y )Nr   ignorec              3   ,   K   | ]  }t        |   y wNr   .0xss     W/var/www/html/venv/lib/python3.12/site-packages/sympy/functions/elementary/complexes.py	<genexpr>zre.eval.<locals>.<genexpr>i        M38M   )r   NaNComplexInfinityis_extended_realis_imaginaryr   Zero	is_Matrixas_real_imagis_Function
isinstance	conjugater   r   r   	make_argsas_coefficientappendhaslenimclsargincludedrevertedexcludedr   termcoeff	real_imagabcs               r'   evalzre.evalD   s   !%%<55LA%%%55L!!J!C%!9!966M]]##%a((__C!;chhqk?" ,.r2hH==%D .++A.$ 11 .!)>)>OOD)
 !% 1 1 1 =I  	!5 -!.$ 4yCM)Mx8.LM1a1v1~)) *    c                 &    | t         j                  fS )zF
        Returns the real number with a zero imaginary part.

        r   r/   selfdeephintss      r'   r1   zre.as_real_imagm       
 aff~rH   c                 8   |j                   s| j                  d   j                   r$t        t        | j                  d   |d            S |j                  s| j                  d   j                  r,t
         t        t        | j                  d   |d            z  S y Nr   Tevaluate)r-   r   r   r   r.   r   r:   rL   xs     r'   _eval_derivativezre._eval_derivativet   }    1!>!>j1q4@AA>>TYYq\662Z		!a$?@A A 7rH   c                 `    | j                   d   t        t        | j                   d         z  z
  S Nr   )r   r   r:   rL   r=   kwargss      r'   _eval_rewrite_as_imzre._eval_rewrite_as_im{   s'    yy|a499Q< 0000rH   c                 4    | j                   d   j                  S rY   r   is_algebraicrL   s    r'   _eval_is_algebraiczre._eval_is_algebraic~       yy|(((rH   c                 x    t        | j                  d   j                  | j                  d   j                  g      S rY   )r   r   r.   is_zeror`   s    r'   _eval_is_zerozre._eval_is_zero   s.    122DIIaL4H4HIJJrH   c                 8    | j                   d   j                  ryy Nr   Tr   	is_finiter`   s    r'   _eval_is_finitezre._eval_is_finite       99Q<!! "rH   c                 8    | j                   d   j                  ryy rg   rh   r`   s    r'   _eval_is_complexzre._eval_is_complex   rk   rH   NT)__name__
__module____qualname____doc__tTupler   __annotations__r-   
unbranched_singularitiesclassmethodrG   r1   rV   r\   ra   re   rj   rm    rH   r'   r   r      s\    'R ,JN&* &*PA1)KrH   r   c                   j    e Zd ZU dZee   ed<   dZdZdZ	e
d        ZddZd Zd Zd Zd	 Zd
 Zd Zy)r:   a  
    Returns imaginary part of expression. This function performs only
    elementary analysis and so it will fail to decompose properly more
    complicated expressions. If completely simplified result is needed then
    use ``Basic.as_real_imag()`` or perform complex expansion on instance of
    this function.

    Examples
    ========

    >>> from sympy import re, im, E, I
    >>> from sympy.abc import x, y
    >>> im(2*E)
    0
    >>> im(2*I + 17)
    2
    >>> im(x*I)
    re(x)
    >>> im(re(x) + y)
    im(y)
    >>> im(2 + 3*I)
    3

    Parameters
    ==========

    arg : Expr
        Real or complex expression.

    Returns
    =======

    expr : Expr
        Imaginary part of expression.

    See Also
    ========

    re
    r   Tc                    |t         j                  u rt         j                  S |t         j                  u rt         j                  S |j                  rt         j                  S |j
                  st        |z  j                  r
t         |z  S |j                  r|j                         d   S |j                  r)t        |t              rt        |j                  d          S g g g }}}t        j                  |      }|D ]  }|j!                  t              }|0|j                  s|j#                  |       8|j#                  |       J|j%                  t              s|j                  rl|j                  |      }|r|j#                  |d          |j#                  |        t'        |      t'        |      k7  r'd |||fD        \  }	}
} | |	      t)        |
      z   |z   S y )N   r   r   c              3   ,   K   | ]  }t        |   y wr"   r#   r$   s     r'   r(   zim.eval.<locals>.<genexpr>   r)   r*   )r   r+   r,   r-   r/   r.   r   r0   r1   r2   r3   r4   r:   r   r   r5   r6   r7   r8   r9   r   r;   s               r'   rG   zim.eval   s   !%%<55LA%%%55L!!66M!C%!9!928O]]##%a((__C!;sxx{O##+-r2hH==%D .++A.$ 11 . .XXa[(=(= !% 1 1 1 =I  	!5 -!.$ 4yCM)Mx8.LM1a1v1~)) *rH   c                 &    | t         j                  fS )zC
        Return the imaginary part with a zero real part.

        rJ   rK   s      r'   r1   zim.as_real_imag   rO   rH   c                 8   |j                   s| j                  d   j                   r$t        t        | j                  d   |d            S |j                  s| j                  d   j                  r,t
         t        t        | j                  d   |d            z  S y rQ   )r-   r   r:   r   r.   r   r   rT   s     r'   rV   zim._eval_derivative   rW   rH   c                 b    t          | j                  d   t        | j                  d         z
  z  S rY   )r   r   r   rZ   s      r'   _eval_rewrite_as_rezim._eval_rewrite_as_re   s)    r499Q<"TYYq\"2233rH   c                 4    | j                   d   j                  S rY   r^   r`   s    r'   ra   zim._eval_is_algebraic   rb   rH   c                 4    | j                   d   j                  S rY   r   r-   r`   s    r'   re   zim._eval_is_zero       yy|,,,rH   c                 8    | j                   d   j                  ryy rg   rh   r`   s    r'   rj   zim._eval_is_finite   rk   rH   c                 8    | j                   d   j                  ryy rg   rh   r`   s    r'   rm   zim._eval_is_complex  rk   rH   Nrn   )ro   rp   rq   rr   rs   r   rt   r-   ru   rv   rw   rG   r1   rV   r   ra   re   rj   rm   rx   rH   r'   r:   r:      s[    'R ,JN%* %*NA4)-rH   r:   c                        e Zd ZdZdZdZ fdZed        Zd Z	d Z
d Zd Zd	 Zd
 Zd Zd Zd ZddZd Zd Zd Zd Z xZS )signa  
    Returns the complex sign of an expression:

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

    If the expression is real the sign will be:

        * $1$ if expression is positive
        * $0$ if expression is equal to zero
        * $-1$ if expression is negative

    If the expression is imaginary the sign will be:

        * $I$ if im(expression) is positive
        * $-I$ if im(expression) is negative

    Otherwise an unevaluated expression will be returned. When evaluated, the
    result (in general) will be ``cos(arg(expr)) + I*sin(arg(expr))``.

    Examples
    ========

    >>> from sympy import sign, I

    >>> sign(-1)
    -1
    >>> sign(0)
    0
    >>> sign(-3*I)
    -I
    >>> sign(1 + I)
    sign(1 + I)
    >>> _.evalf()
    0.707106781186548 + 0.707106781186548*I

    Parameters
    ==========

    arg : Expr
        Real or imaginary expression.

    Returns
    =======

    expr : Expr
        Complex sign of expression.

    See Also
    ========

    Abs, conjugate
    Tc                     t         |          }|| k(  rC| j                  d   j                  du r(| j                  d   t	        | j                  d         z  S |S )Nr   F)superdoitr   rd   Abs)rL   rN   s	__class__s      r'   r   z	sign.doitC  sO    GLN91--699Q<#diil"333rH   c                    |j                   r|j                         \  }}g }t        |      }|D ]  }|j                  r| }|j                  r |j
                  rCt        |      }|j                  r|t        z  }|j                  sY| }]|j                  |       o|j                  |        |t        j                  u rt        |      t        |      k(  ry | |  |j                  |       z  S |t        j                  u rt        j                  S |j                  rt        j                   S |j                  rt        j                  S |j                  rt        j"                  S |j$                  rt'        |t              r|S |j
                  r^|j(                  r"|j*                  t        j,                  u rt        S t         |z  }|j                  rt        S |j                  rt         S y y r"   )is_Mulas_coeff_mulr   is_extended_negativeis_extended_positiver.   r:   is_comparabler   r7   r   Oner9   _new_rawargsr+   rd   r/   NegativeOner2   r3   is_PowexpHalf)	r<   r=   rF   r   unkr   rD   aiarg2s	            r'   rG   z	sign.evalI  s    ::&&(GAtCQA &))A++~~U++FA!66 &'BJJqM

1#&$ AEEzc#h#d)3s+3++S1222!%%<55L;;66M##55L##== ??#t$
zzcgg/ 28D((((r	 ) rH   c                 h    t        | j                  d   j                        rt        j                  S y rY   )r   r   rd   r   r   r`   s    r'   	_eval_Abszsign._eval_Abs{  s&    TYYq\))*55L +rH   c                 D    t        t        | j                  d               S rY   )r   r4   r   r`   s    r'   _eval_conjugatezsign._eval_conjugate  s    Idiil+,,rH   c                 `   | j                   d   j                  r:ddlm} dt	        | j                   d   |d      z   || j                   d         z  S | j                   d   j
                  rBddlm} dt	        | j                   d   |d      z   |t         | j                   d   z        z  S y )Nr   )
DiracDelta   TrR   )r   r-   'sympy.functions.special.delta_functionsr   r   r.   r   )rL   rU   r   s      r'   rV   zsign._eval_derivative  s    99Q<((Jz$))A,DAATYYq\*+ +YYq\&&Jz$))A,DAAaR$))A,./0 0 'rH   c                 8    | j                   d   j                  ryy rg   )r   is_nonnegativer`   s    r'   _eval_is_nonnegativezsign._eval_is_nonnegative      99Q<&& 'rH   c                 8    | j                   d   j                  ryy rg   )r   is_nonpositiver`   s    r'   _eval_is_nonpositivezsign._eval_is_nonpositive  r   rH   c                 4    | j                   d   j                  S rY   )r   r.   r`   s    r'   _eval_is_imaginaryzsign._eval_is_imaginary  rb   rH   c                 4    | j                   d   j                  S rY   r   r`   s    r'   _eval_is_integerzsign._eval_is_integer  r   rH   c                 4    | j                   d   j                  S rY   )r   rd   r`   s    r'   re   zsign._eval_is_zero  s    yy|###rH   c                     t        | j                  d   j                        r*|j                  r|j                  rt
        j                  S y y y rY   )r   r   rd   
is_integeris_evenr   r   )rL   others     r'   _eval_powerzsign._eval_power  s@    diil**+MM55L   ,rH   c                     | j                   d   }|j                  |d      }|dk7  r| j                  |      S |dk7  r|j                  ||      }t	        |      dk  rt
        j                   S t
        j                  S rY   )r   subsfuncdirr   r   r   )rL   rU   nlogxcdirarg0x0s          r'   _eval_nserieszsign._eval_nseries  si    yy|YYq!_799R= 1988At$DDAv01550rH   c                 J    |j                   rt        d|dkD  fd|dk  fd      S y )Nr{   r   )r   T)r-   r   rZ   s      r'   _eval_rewrite_as_Piecewisezsign._eval_rewrite_as_Piecewise  s/    aq\Ba=)DD  rH   c                 D    ddl m} |j                  r ||      dz  dz
  S y )Nr   	Heavisider   r{   r   r   r-   rL   r=   r[   r   s       r'   _eval_rewrite_as_Heavisidezsign._eval_rewrite_as_Heaviside  s'    ES>A%))  rH   c                 N    t        dt        |d      f|t        |      z  df      S rg   )r   r   r   rZ   s      r'   _eval_rewrite_as_Abszsign._eval_rewrite_as_Abs  s&    !RQZ3S>4*@AArH   c                 P    | j                  t        | j                  d               S rY   )r   r   r   )rL   r[   s     r'   _eval_simplifyzsign._eval_simplify  s    yydiil344rH   r   )ro   rp   rq   rr   
is_complexrv   r   rw   rG   r   r   rV   r   r   r   r   re   r   r   r   r   r   r   __classcell__)r   s   @r'   r   r   	  sw    4l JN / /b-0)-$1E*
B5rH   r   c                       e Zd ZU dZee   ed<   dZdZdZ	dZ
dZd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dZd Zd Zd Zd Zd Zy)r   ab  
    Return the absolute value of the argument.

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

    This is an extension of the built-in function ``abs()`` to accept symbolic
    values.  If you pass a SymPy expression to the built-in ``abs()``, it will
    pass it automatically to ``Abs()``.

    Examples
    ========

    >>> from sympy import Abs, Symbol, S, I
    >>> Abs(-1)
    1
    >>> x = Symbol('x', real=True)
    >>> Abs(-x)
    Abs(x)
    >>> Abs(x**2)
    x**2
    >>> abs(-x) # The Python built-in
    Abs(x)
    >>> Abs(3*x + 2*I)
    sqrt(9*x**2 + 4)
    >>> Abs(8*I)
    8

    Note that the Python built-in will return either an Expr or int depending on
    the argument::

        >>> type(abs(-1))
        <... 'int'>
        >>> type(abs(S.NegativeOne))
        <class 'sympy.core.numbers.One'>

    Abs will always return a SymPy object.

    Parameters
    ==========

    arg : Expr
        Real or complex expression.

    Returns
    =======

    expr : Expr
        Absolute value returned can be an expression or integer depending on
        input arg.

    See Also
    ========

    sign, conjugate
    r   TFc                 T    |dk(  rt        | j                  d         S t        | |      )zE
        Get the first derivative of the argument to Abs().

        r{   r   )r   r   r   )rL   argindexs     r'   fdiffz	Abs.fdiff   s+    
 q=		!%%$T844rH   c           	      <
   ddl m} t        d      rj                         }||S t	        t
              st        dt              z         |d      j                         \  }}|j                  r|j                  s | |       | |      z  S j                  r	g }g }j                  D ]  }|j                  r|j                  j                  rl|j                  j                  rV | |j                         }	t	        |	|       r|j#                  |       k|j#                  t%        |	|j                                | |      }
t	        |
|       r|j#                  |       |j#                  |
        t'        | }|r | t'        | d      nt(        j*                  }||z  S t(        j,                  u rt(        j,                  S t(        j.                  u rt0        S ddlm}m} j                  rj7                         \  }}|j8                  r|j                  r>|j:                  rS |t(        j<                  u rt(        j*                  S t?        |      |z  S |j@                  r|tC        |      z  S |jD                  r)| tC        |      z   |tF         tI        |      z        z  S y |jK                  tL              s9 ||      jO                         \  }}|tP        |z  z   } |tC        ||z              S t	        |      r |tC        j                  d               S t	        tR              rjT                  rS j                  r S y jV                  rJjK                  t0        t(        jX                        r&t[        d jO                         D              rt0        S j\                  rt(        j^                  S j@                  rS j`                  r S jb                  rtP         z  }|j@                  r|S j8                  ry  |je                         d      jg                  td              jg                  td              z
  }|rti        fd	|D              ry k7  r k7  rjg                  t>              }jk                  |D ci c]  }|tm        d
       c}      }|j                  D cg c]  }|j8                  | }}|rti        fd|D              sto        tq        z              S y y y c c}w c c}w )Nr   )signsimpr   zBad argument type for Abs(): %sFrR   )r   logc              3   4   K   | ]  }|j                     y wr"   )is_infinite)r%   rD   s     r'   r(   zAbs.eval.<locals>.<genexpr>P  s     =Q1===s   c              3   Z   K   | ]"  }j                  |j                  d           $ yw)r   N)r8   r   )r%   ir=   s     r'   r(   zAbs.eval.<locals>.<genexpr>b  s"     A1CGGAFF1I.As   (+T)realc              3   R   K   | ]  }j                  t        |               y wr"   )r8   r4   )r%   uconjs     r'   r(   zAbs.eval.<locals>.<genexpr>h  s     !FQ$((9Q<"8!Fs   $')9sympy.simplify.simplifyr   hasattrr   r3   r   	TypeErrortypeas_numer_denomfree_symbolsr   r   r   r   r   is_negativebaser7   r   r   r   r   r+   r,   r   &sympy.functions.elementary.exponentialr   as_base_expr-   r   r   r   is_extended_nonnegativer   r   r   r:   r8   r   r1   r   r   is_positiveis_AddNegativeInfinityanyrd   r/   is_extended_nonpositiver.   r4   atomsallxreplacer	   r   r   )r<   r=   r   objr   dknownr   tbnewtnewr   r   r   exponentrD   rE   zr   new_conjr    r   abs_free_argr   s    `                     @r'   rG   zAbs.eval
  s   43$--/C
#t$=S	IJJ sU+!!#1>>!..q6#a&= ::ECXX +88 0 0QUU5F5Fqvv;D!$,

1Squu%56q6D!$,

1T*+ KE47#c3i%0QUUC9!%%<55L!###IC:: __.ND($$&&''"
q}}, uut9h..//H--,,!EBxL0bSH5E1FFFXXf%4y--/1!G2hqj>**c3r#((1+''c<(
t::#''"a&8&89=#*:*:*<==	;;66M&&J&&4K28D++ %8::i(399Y+??AAA$;34%<YYs^F<<f(MEt,<)<(MNL*77V1;M;M;U1VCVc!F#!FFJs4x011 G	 (;(MVs   #TTTc                 8    | j                   d   j                  ryy rg   rh   r`   s    r'   _eval_is_realzAbs._eval_is_realk  rk   rH   c                 h    | j                   d   j                  r| j                   d   j                  S y rY   )r   r-   r   r`   s    r'   r   zAbs._eval_is_integero  s,    99Q<((99Q<*** )rH   c                 F    t        | j                  d   j                        S rY   r   _argsrd   r`   s    r'   _eval_is_extended_nonzerozAbs._eval_is_extended_nonzeros      A..//rH   c                 4    | j                   d   j                  S rY   )r  rd   r`   s    r'   re   zAbs._eval_is_zerov  s    zz!}$$$rH   c                 F    t        | j                  d   j                        S rY   r  r`   s    r'   _eval_is_extended_positivezAbs._eval_is_extended_positivey  r  rH   c                 h    | j                   d   j                  r| j                   d   j                  S y rY   )r   r-   is_rationalr`   s    r'   _eval_is_rationalzAbs._eval_is_rational|  s,    99Q<((99Q<+++ )rH   c                 h    | j                   d   j                  r| j                   d   j                  S y rY   )r   r-   r   r`   s    r'   _eval_is_evenzAbs._eval_is_even  s,    99Q<((99Q<''' )rH   c                 h    | j                   d   j                  r| j                   d   j                  S y rY   )r   r-   is_oddr`   s    r'   _eval_is_oddzAbs._eval_is_odd  s,    99Q<((99Q<&&& )rH   c                 4    | j                   d   j                  S rY   r^   r`   s    r'   ra   zAbs._eval_is_algebraic  rb   rH   c                     | j                   d   j                  r`|j                  rT|j                  r| j                   d   |z  S |t        j
                  ur$|j                  r| j                   d   |dz
  z  | z  S y )Nr   r{   )r   r-   r   r   r   r   
is_Integer)rL   r   s     r'   r   zAbs._eval_power  sj    99Q<((X-@-@yy|X--.83F3Fyy|hl3D88rH   c                 (   ddl m} | j                  d   j                  |      d   }|j	                   ||            r|j                   ||      |      }| j                  d   j                  |||      }t        |      |z  j                         S )Nr   )r   )r   r   )	r   r   r   leadtermr8   r   r   r   expand)rL   rU   r   r   r   r   	directionr   s           r'   r   zAbs._eval_nseries  s}    >IIaL))!,Q/	==Q !s1vt4IIIaL&&qAD&9Y!))++rH   c                 2   | j                   d   j                  s| j                   d   j                  r=t        | j                   d   |d      t	        t        | j                   d               z  S t        | j                   d         t        t        | j                   d         |d      z  t        | j                   d         t        t        | j                   d         |d      z  z   t        | j                   d         z  }|j                  t              S rQ   )
r   r-   r.   r   r   r4   r   r:   r   rewrite)rL   rU   rvs      r'   rV   zAbs._eval_derivative  s    99Q<((DIIaL,E,EdiilA=y1./0 01Btyy|,<a" 		!-
2diil;KD1" ""%(1%67 zz$rH   c                 R    ddl m} |j                  r| ||       ||       z
  z  S y )Nr   r   r   r   s       r'   r   zAbs._eval_rewrite_as_Heaviside  s0     	F	#C4899  rH   c                     |j                   rt        ||dk\  f| df      S |j                  r)t        t        |z  t        |z  dk\  ft         |z  df      S y rg   )r-   r   r.   r   rZ   s      r'   r   zAbs._eval_rewrite_as_Piecewise  s\    c3!8_tTl;;aeQsUaZ0A2c64.AA rH   c                     |t        |      z  S r"   )r   rZ   s      r'   _eval_rewrite_as_signzAbs._eval_rewrite_as_sign  s    49}rH   c                 0    t        |t        |      z        S r"   )r   r4   rZ   s      r'   _eval_rewrite_as_conjugatezAbs._eval_rewrite_as_conjugate  s    C	#&''rH   N)r{   r   )ro   rp   rq   rr   rs   r   rt   r-   r   r   ru   rv   r   rw   rG   r   r   r  re   r  r
  r  r  ra   r   r   rV   r   r   r  r  rx   rH   r'   r   r     s    7r , "JN5 ^2 ^2@+0%0,('), :B(rH   r   c                   <    e Zd ZdZdZdZdZdZed        Z	d Z
d Zy)r=   a  
    Returns the argument (in radians) of a complex number. The argument is
    evaluated in consistent convention with ``atan2`` where the branch-cut is
    taken along the negative real axis and ``arg(z)`` is in the interval
    $(-\pi,\pi]$. For a positive number, the argument is always 0; the
    argument of a negative number is $\pi$; and the argument of 0
    is undefined and returns ``nan``. So the ``arg`` function will never nest
    greater than 3 levels since at the 4th application, the result must be
    nan; for a real number, nan is returned on the 3rd application.

    Examples
    ========

    >>> from sympy import arg, I, sqrt, Dummy
    >>> from sympy.abc import x
    >>> arg(2.0)
    0
    >>> arg(I)
    pi/2
    >>> arg(sqrt(2) + I*sqrt(2))
    pi/4
    >>> arg(sqrt(3)/2 + I/2)
    pi/6
    >>> arg(4 + 3*I)
    atan(3/4)
    >>> arg(0.8 + 0.6*I)
    0.643501108793284
    >>> arg(arg(arg(arg(x))))
    nan
    >>> real = Dummy(real=True)
    >>> arg(arg(arg(real)))
    nan

    Parameters
    ==========

    arg : Expr
        Real or complex expression.

    Returns
    =======

    value : Expr
        Returns arc tangent of arg measured in radians.

    Tc                    |}t        d      D ]B  }t        ||       r|j                  d   }|dk(  r|j                  rt        j
                  c S  n t        j
                  S ddlm}m} t        ||      rt        |t              S t        ||      ret        |j                  d         }|j                  rA|dt        j                  z  z  }|t        j                  kD  r|dt        j                  z  z  }|S |j                  sot        |      j!                         \  }}|j"                  r8t%        |j                  D cg c]  }t'        |      dvr|n
t'        |       c} }t'        |      |z  }n|}t)        d |j+                  t,              D              ry ddlm}	 |j3                         \  }
} |	||
      }|j4                  r|S ||k7  r
 | |d	      S y c c}w )
N   r   r   r   	exp_polar)r   r{   c              3   8   K   | ]  }|j                   d u   y wr"   )r   )r%   r   s     r'   r(   zarg.eval.<locals>.<genexpr>  s     P!q%%-Ps   atan2FrR   )ranger3   r   r-   r   r+   r   r   r$  periodic_argumentr   r:   r   Piis_Atomr   as_coeff_Mulr   r   r   r   r   r   (sympy.functions.elementary.trigonometricr'  r1   	is_number)r<   r=   rD   r   r   r$  i_rF   arg_r'  rU   yr  s                r'   rG   zarg.eval  s   q 	A!S!FF1I6a0055L	 55LIc9%$S"--S!CHHQKBaf9!ADD&LB	{{"3'446GAt{{%)YY0 ! $(7'#9QG 0 174<DDPtzz,7OPPB  "11a[<<I3;te,, 0s   ?!Gc                     | j                   d   j                         \  }}|t        ||d      z  |t        ||d      z  z
  |dz  |dz  z   z  S )Nr   TrR   r   )r   r1   r   )rL   r   rU   r1  s       r'   rV   zarg._eval_derivative  s`    yy|((*1Jq!d33aq!d374 4891q!tE 	ErH   c                 `    ddl m} | j                  d   j                         \  }} |||      S )Nr   r&  )r-  r'  r   r1   )rL   r=   r[   r'  rU   r1  s         r'   _eval_rewrite_as_atan2zarg._eval_rewrite_as_atan2  s+    Byy|((*1Q{rH   N)ro   rp   rq   rr   r-   is_realri   rv   rw   rG   rV   r4  rx   rH   r'   r=   r=     s=    -^ GIN&- &-PE
rH   r=   c                   N    e Zd ZdZdZed        Zd Zd Zd Z	d Z
d Zd	 Zd
 Zy)r4   a>  
    Returns the *complex conjugate* [1]_ of an argument.
    In mathematics, the complex conjugate of a complex number
    is given by changing the sign of the imaginary part.

    Thus, the conjugate of the complex number
    :math:`a + ib` (where $a$ and $b$ are real numbers) is :math:`a - ib`

    Examples
    ========

    >>> from sympy import conjugate, I
    >>> conjugate(2)
    2
    >>> conjugate(I)
    -I
    >>> conjugate(3 + 2*I)
    3 - 2*I
    >>> conjugate(5 - I)
    5 + I

    Parameters
    ==========

    arg : Expr
        Real or complex expression.

    Returns
    =======

    arg : Expr
        Complex conjugate of arg as real, imaginary or mixed expression.

    See Also
    ========

    sign, Abs

    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Complex_conjugation
    Tc                 ,    |j                         }||S y r"   )r   r<   r=   r   s      r'   rG   zconjugate.evalO      !!#?J rH   c                     t         S r"   )r4   r`   s    r'   inversezconjugate.inverseU  s    rH   c                 6    t        | j                  d   d      S rQ   r   r   r`   s    r'   r   zconjugate._eval_AbsX      499Q<$//rH   c                 2    t        | j                  d         S rY   	transposer   r`   s    r'   _eval_adjointzconjugate._eval_adjoint[      1&&rH   c                      | j                   d   S rY   r   r`   s    r'   r   zconjugate._eval_conjugate^      yy|rH   c                     |j                   r$t        t        | j                  d   |d            S |j                  r%t        t        | j                  d   |d             S y rQ   )r5  r4   r   r   r.   rT   s     r'   rV   zconjugate._eval_derivativea  sP    99Z		!a$GHH^^j1q4HIII rH   c                 2    t        | j                  d         S rY   adjointr   r`   s    r'   _eval_transposezconjugate._eval_transposeg      tyy|$$rH   c                 4    | j                   d   j                  S rY   r^   r`   s    r'   ra   zconjugate._eval_is_algebraicj  rb   rH   N)ro   rp   rq   rr   rv   rw   rG   r;  r   rB  r   rV   rK  ra   rx   rH   r'   r4   r4   !  sE    *V N 
0'J%)rH   r4   c                   2    e Zd ZdZed        Zd Zd Zd Zy)rA  a  
    Linear map transposition.

    Examples
    ========

    >>> from sympy import transpose, Matrix, MatrixSymbol
    >>> A = MatrixSymbol('A', 25, 9)
    >>> transpose(A)
    A.T
    >>> B = MatrixSymbol('B', 9, 22)
    >>> transpose(B)
    B.T
    >>> transpose(A*B)
    B.T*A.T
    >>> M = Matrix([[4, 5], [2, 1], [90, 12]])
    >>> M
    Matrix([
    [ 4,  5],
    [ 2,  1],
    [90, 12]])
    >>> transpose(M)
    Matrix([
    [4, 2, 90],
    [5, 1, 12]])

    Parameters
    ==========

    arg : Matrix
         Matrix or matrix expression to take the transpose of.

    Returns
    =======

    value : Matrix
        Transpose of arg.

    c                 ,    |j                         }||S y r"   )rK  r8  s      r'   rG   ztranspose.eval  r9  rH   c                 2    t        | j                  d         S rY   r4   r   r`   s    r'   rB  ztranspose._eval_adjoint  rC  rH   c                 2    t        | j                  d         S rY   rI  r`   s    r'   r   ztranspose._eval_conjugate  rL  rH   c                      | j                   d   S rY   rE  r`   s    r'   rK  ztranspose._eval_transpose  rF  rH   N)	ro   rp   rq   rr   rw   rG   rB  r   rK  rx   rH   r'   rA  rA  n  s+    &P  
'%rH   rA  c                   @    e Zd ZdZed        Zd Zd Zd Zd	dZ	d Z
y)
rJ  a  
    Conjugate transpose or Hermite conjugation.

    Examples
    ========

    >>> from sympy import adjoint, MatrixSymbol
    >>> A = MatrixSymbol('A', 10, 5)
    >>> adjoint(A)
    Adjoint(A)

    Parameters
    ==========

    arg : Matrix
        Matrix or matrix expression to take the adjoint of.

    Returns
    =======

    value : Matrix
        Represents the conjugate transpose or Hermite
        conjugation of arg.

    c                 f    |j                         }||S |j                         }|t        |      S y r"   )rB  rK  r4   r8  s      r'   rG   zadjoint.eval  s<    !?J!!#?S>! rH   c                      | j                   d   S rY   rE  r`   s    r'   rB  zadjoint._eval_adjoint  rF  rH   c                 2    t        | j                  d         S rY   r@  r`   s    r'   r   zadjoint._eval_conjugate  rC  rH   c                 2    t        | j                  d         S rY   rQ  r`   s    r'   rK  zadjoint._eval_transpose  rC  rH   Nc                 b    |j                  | j                  d         }d|z  }|r	d|d|d}|S )Nr   z%s^{\dagger}z\left(z	\right)^{})_printr   )rL   printerr   r   r=   texs         r'   _latexzadjoint._latex  s4    nnTYYq\*#-0#6C
rH   c                     ddl m}  |j                  | j                  d   g| }|j                  r| |d      z  }|S | |d      z  }|S )Nr   )
prettyFormu   †+) sympy.printing.pretty.stringpictr`  r[  r   _use_unicode)rL   r\  r   r`  pforms        r'   _prettyzadjoint._pretty  sV    ?tyy|3d3:l33E  :c?*ErH   r"   )ro   rp   rq   rr   rw   rG   rB  r   rK  r^  re  rx   rH   r'   rJ  rJ    s4    4 " "''rH   rJ  c                   4    e Zd ZdZdZdZed        Zd Zd Z	y)
polar_lifta  
    Lift argument to the Riemann surface of the logarithm, using the
    standard branch.

    Examples
    ========

    >>> from sympy import Symbol, polar_lift, I
    >>> p = Symbol('p', polar=True)
    >>> x = Symbol('x')
    >>> polar_lift(4)
    4*exp_polar(0)
    >>> polar_lift(-4)
    4*exp_polar(I*pi)
    >>> polar_lift(-I)
    exp_polar(-I*pi/2)
    >>> polar_lift(I + 2)
    polar_lift(2 + I)

    >>> polar_lift(4*x)
    4*polar_lift(x)
    >>> polar_lift(4*p)
    4*p

    Parameters
    ==========

    arg : Expr
        Real or complex expression.

    See Also
    ========

    sympy.functions.elementary.exponential.exp_polar
    periodic_argument
    TFc                    ddl m} |j                  rD ||      }|dt        dz  t         dz  t        fv r!ddlm}  |t        |z        t        |      z  S |j                  r|j                  }n|g}g }g }g }|D ].  }|j                  r||gz  }|j                  r||gz  })||gz  }0 t        |      t        |      k  rC|rt        ||z    t        t        |       z  S |rt        ||z    S ddlm} t        |  |d      z  S y )Nr   r=   r   r$  )$sympy.functions.elementary.complexesr=   r.  r   r   r$  r   absr   r   is_polarr   r9   r   rg  )	r<   r=   argumentarr$  r   r>   r@   positives	            r'   rG   zpolar_lift.eval  s   H==#B
 aAs1ub))L 2s3x//::88D5D 	"C||SE!SE!SE!	" x=3t9$X02:c8n3MMMX022LH~il22 %rH   c                 >    | j                   d   j                  |      S )z. Careful! any evalf of polar numbers is flaky r   )r   _eval_evalf)rL   precs     r'   rr  zpolar_lift._eval_evalf6  s    yy|''--rH   c                 6    t        | j                  d   d      S rQ   r=  r`   s    r'   r   zpolar_lift._eval_Abs:  r>  rH   N)
ro   rp   rq   rr   rm  r   rw   rG   rr  r   rx   rH   r'   rg  rg    s1    #J HM!3 !3F.0rH   rg  c                   6    e Zd ZdZed        Zed        Zd Zy)r)  a  
    Represent the argument on a quotient of the Riemann surface of the
    logarithm. That is, given a period $P$, always return a value in
    $(-P/2, P/2]$, by using $\exp(PI) = 1$.

    Examples
    ========

    >>> from sympy import exp_polar, periodic_argument
    >>> from sympy import I, pi
    >>> periodic_argument(exp_polar(10*I*pi), 2*pi)
    0
    >>> periodic_argument(exp_polar(5*I*pi), 4*pi)
    pi
    >>> from sympy import exp_polar, periodic_argument
    >>> from sympy import I, pi
    >>> periodic_argument(exp_polar(5*I*pi), 2*pi)
    pi
    >>> periodic_argument(exp_polar(5*I*pi), 3*pi)
    -pi
    >>> periodic_argument(exp_polar(5*I*pi), pi)
    0

    Parameters
    ==========

    ar : Expr
        A polar number.

    period : Expr
        The period $P$.

    See Also
    ========

    sympy.functions.elementary.exponential.exp_polar
    polar_lift : Lift argument to the Riemann surface of the logarithm
    principal_branch
    c           	         ddl m}m} |j                  r|j                  }n|g}d}|D ]  }|j
                  s|t        |      z  }t        ||      r!||j                  j                         d   z  }K|j                  rX|j                  j                         \  }}||t        |j                        z  | |t        |j                              z  z   z  }t        |t              r|t        |j                  d         z  } y  |S )Nr   )r$  r   r{   )r   r$  r   r   r   rm  r=   r3   r   r1   r   unbranched_argumentr   rl  rg  )	r<   ro  r$  r   r   ru   rD   r   r:   s	            r'   _getunbranchedz periodic_argument._getunbranchedg  s    I9977D4D
 	A::c!f$
Ay)aee002155
++-Bb!4FF"  S[!112 2
Az*c!&&)n,
	 rH   c                    |j                   sy |t        k(  r"t        |t              rt	        |j
                   S t        |t              r%|dt        z  k\  rt	        |j
                  d   |      S |j                  rY|j
                  D cg c]  }|j                  r| }}t        |      t        |j
                        k7  rt	        t        | |      S | j                  |      }|y ddlm}m} |j!                  t        ||      ry |t        k(  r|S |t        k7  r<ddlm}  |||z  t&        j(                  z
        |z  }	|	j!                  |      s||	z
  S y y c c}w )Nr   r   )atanr'  ceiling)r   r   r3   principal_branchr)  r   rg  r   r   r   r9   r   rx  r-  rz  r'  r8   #sympy.functions.elementary.integersr|  r   r   )
r<   ro  periodrU   newargsru   rz  r'  r|  r   s
             r'   rG   zperiodic_argument.eval~  s+    **R<Jr+;<$bgg..b*%&AbD.$RWWQZ8899"$''?Qq?G?7|s277|+(g??''+
H>>+UD9R<R<C
6)AFF23F:A55>!A~% "  @s   EEc                 2   | j                   \  }}|t        k(  r*t        j                  |      }|| S |j	                  |      S t        |t              j	                  |      }ddlm} | |||z  t        j                  z
        |z  z
  j	                  |      S )Nr   r{  )	r   r   r)  rx  rr  r~  r|  r   r   )rL   rs  r   r  ru   ubr|  s          r'   rr  zperiodic_argument._eval_evalf  s    II	6R<*99!<J!))$//q"%11$7?WRY/077DDTJJrH   N)ro   rp   rq   rr   rw   rx  rG   rr  rx   rH   r'   r)  r)  >  s6    &P  , & &:	KrH   r)  c                 "    t        | t              S )a\  
    Returns periodic argument of arg with period as infinity.

    Examples
    ========

    >>> from sympy import exp_polar, unbranched_argument
    >>> from sympy import I, pi
    >>> unbranched_argument(exp_polar(15*I*pi))
    15*pi
    >>> unbranched_argument(exp_polar(7*I*pi))
    7*pi

    See also
    ========

    periodic_argument
    )r)  r   ri  s    r'   rw  rw    s    & S"%%rH   c                   .    e Zd ZdZdZdZed        Zd Zy)r}  a  
    Represent a polar number reduced to its principal branch on a quotient
    of the Riemann surface of the logarithm.

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

    This is a function of two arguments. The first argument is a polar
    number `z`, and the second one a positive real number or infinity, `p`.
    The result is ``z mod exp_polar(I*p)``.

    Examples
    ========

    >>> from sympy import exp_polar, principal_branch, oo, I, pi
    >>> from sympy.abc import z
    >>> principal_branch(z, oo)
    z
    >>> principal_branch(exp_polar(2*pi*I)*3, 2*pi)
    3*exp_polar(0)
    >>> principal_branch(exp_polar(2*pi*I)*3*z, 2*pi)
    3*principal_branch(z, 2*pi)

    Parameters
    ==========

    x : Expr
        A polar number.

    period : Expr
        Positive real number or infinity.

    See Also
    ========

    sympy.functions.elementary.exponential.exp_polar
    polar_lift : Lift argument to the Riemann surface of the logarithm
    periodic_argument
    TFc                    ddl m} t        |t              rt	        |j
                  d   |      S |t        k(  r|S t        |t              }t        ||      }||k7  r|j                  t              s|j                  t              st        |      }d }|j                  t        |      }t        |t              }|j                  t              sG||k7  r |t        ||z
  z        |z  }n|}|j                  s|j                  |      s| |d      z  }|S |j                  s|d}
}	n |j                  |j                   \  }	}
g }|
D ]  }|j                  r|	|z  }	||gz  } t        |      }
t        |	|      }|j                  t              ry |j                   rnt#        |	      |k7  s|dk(  r[|
dk7  rV|	dk7  rQ|dk(  rt%        |	      t	        t'        |
 |      z  S t	         |t        |z        t'        |
 z  |      t%        |	      z  S |j                   r>t%        |      |dz  k  dk(  s||dz  k(  r!|
dk(  r ||t        z        t%        |	      z  S y y y )Nr   rj  c                 <    t        | t              st        |       S | S r"   )r3   r   rg  )exprs    r'   mrz!principal_branch.eval.<locals>.mr  s    !$/%d++rH   rx   r{   r   T)r   r$  r3   rg  r}  r   r   r)  r8   replacer   rm  r   r   r   tupler.  rw  rl  r   )rL   rU   r  r$  r  bargplr  resrF   mothersr1  r=   s                 r'   rG   zprincipal_branch.eval  s)   Da$#AFF1Iv66R<Hq"% F+:bff%67!23AB J+B"2r*B66*%:#AtbyM225CC||CGGI,>9Q<'C
~~bqA!1>>1>>2DAq 	A}}Q1#		
 &M6*77$%==1!4;"axAGQax1v.sAw???#Iae$4S!W$<fEc!fLL==s3x&(2t;sfQhGSU#CF**  @O=rH   c                     | j                   \  }}t        ||      j                  |      }t        |      t        kD  s
|t         k(  r| S ddlm} t        |       |t        |z        z  j                  |      S )Nr   )r   )r   r)  rr  rl  r   r   r   r   )rL   rs  r   r  pr   s         r'   rr  zprincipal_branch._eval_evalf  sb    II	6a(44T:q6B;!s(K>As1Q3x,,T22rH   N)	ro   rp   rq   rr   rm  r   rw   rG   rr  rx   rH   r'   r}  r}    s,    &P HM1+ 1+f3rH   r}  c           
      <   ddl m} | j                  r| S | j                  r|st	        |       S t        | t              r|s|rt	        |       S | j                  r| S | j                  rB | j                  | j                  D cg c]  }t        ||d       c} }|rt	        |      S |S | j                  rS| j                  t        j                  k(  r6| j                  t        j                  t        | j                   |d            S | j"                  r3 | j                  | j                  D cg c]  }t        ||d       c} S t        | |      rwt        | j$                  ||      }g }| j                  dd  D ]9  }t        |d   d|      }	t        |dd  ||      }
|j'                  |	f|
z          ;  ||ft)        |      z    S  | j                  | j                  D cg c]"  }t        |t*              rt        |||      n|$ c} S c c}w c c}w c c}w )Nr   )IntegralT)pauseFr{   )liftr  )sympy.integrals.integralsr  rm  r.  rg  r3   r   r+  r   r   r   	_polarifyr   r   r   Exp1r   r2   functionr7   r  r   )eqr  r  r  r=   rr   limitslimitvarrests              r'   r  r  '  s   2	{{		||E"~"fe"~			BGG"''J3iT6JKa= 	rww!&&(wwqvvyUCDD	rwwbggNs3E:NOO	B	!d%8WWQR[ 	)EE!H5>CU12YT?DMM3&4-(	) 4'E&M133rwwFHggO?BJsD1 #3E:7:; O P 	P% K OOs   H.H$'Hc                    |rd}t        t        |       |      } |s| S | j                  D ci c]  }|t        |j                  d       }}| j                  |      } | |j                         D ci c]  \  }}||
 c}}fS c c}w c c}}w )a  
    Turn all numbers in eq into their polar equivalents (under the standard
    choice of argument).

    Note that no attempt is made to guess a formal convention of adding
    polar numbers, expressions like $1 + x$ will generally not be altered.

    Note also that this function does not promote ``exp(x)`` to ``exp_polar(x)``.

    If ``subs`` is ``True``, all symbols which are not already polar will be
    substituted for polar dummies; in this case the function behaves much
    like :func:`~.posify`.

    If ``lift`` is ``True``, both addition statements and non-polar symbols are
    changed to their ``polar_lift()``ed versions.
    Note that ``lift=True`` implies ``subs=False``.

    Examples
    ========

    >>> from sympy import polarify, sin, I
    >>> from sympy.abc import x, y
    >>> expr = (-x)**y
    >>> expr.expand()
    (-x)**y
    >>> polarify(expr)
    ((_x*exp_polar(I*pi))**_y, {_x: x, _y: y})
    >>> polarify(expr)[0].expand()
    _x**_y*exp_polar(_y*I*pi)
    >>> polarify(x, lift=True)
    polar_lift(x)
    >>> polarify(x*(1+y), lift=True)
    polar_lift(x)*polar_lift(y + 1)

    Adds are treated carefully:

    >>> polarify(1 + sin((1 + I)*x))
    (sin(_x*polar_lift(1 + I)) + 1, {_x: x})
    FT)polar)r  r   r   r	   namer   items)r  r   r  r   repsr  s         r'   polarifyr  H  s    P 	72;	%B	24//BQAuQVV4((BDB	B.A1... C.s   B2B	c           
      X   t        | t              r| j                  r| S |s&ddlm}m} t        | |      r |t        | j                  |            S t        | t              r2| j                  d   dt        z  k(  rt        | j                  d   |      S | j                  sN| j                  sB| j                  s6| j                  r[| j                  dv rd| j                  v s| j                  dvr1 | j                  | j                  D cg c]  }t        ||       c} S t        | t               rt        | j                  d   |      S | j"                  rBt        | j                  |      }t        | j$                  ||j&                  xr |        }||z  S | j(                  rIt+        | j                  dd      r2 | j                  | j                  D cg c]  }t        |||       c} S  | j                  | j                  D cg c]  }t        ||d       c} S c c}w c c}w c c}w )	Nr   r#  r{   r   )z==z!=ru   FT)r3   r
   r+  r   r   r$  _unpolarifyr}  r   r   r   r   
is_Booleanis_Relationalrel_opr   rg  r   r   r   r2   getattr)r  exponents_onlyr  r   r$  rU   expor   s           r'   r  r  z  s   b% BJJ	Ib)${266>:;;b*+
ad0Brwwqz>::IIbmm		\)a277l		-277RWWM[N;MNNb*%rwwqz>::	yy266>2277N.Y/1Tz	~~'"''<?rwwWW %QG   	 277277Ka[ND9KLL N Ls   HH"H'Nc                 6   t        | t              r| S t        |       } |t        | j	                  |            S d}d}|rd}|r-d}t        | ||      }|| k7  rd}|} t        |t              r|S |r-ddlm} j	                   |d      dt        d      di      S )a  
    If `p` denotes the projection from the Riemann surface of the logarithm to
    the complex line, return a simplified version `eq'` of `eq` such that
    `p(eq') = p(eq)`.
    Also apply the substitution subs in the end. (This is a convenience, since
    ``unpolarify``, in a certain sense, undoes :func:`polarify`.)

    Examples
    ========

    >>> from sympy import unpolarify, polar_lift, sin, I
    >>> unpolarify(polar_lift(I + 2))
    2 + I
    >>> unpolarify(sin(polar_lift(I + 7)))
    sin(7 + I)
    TFr   rj  r{   )	r3   boolr   
unpolarifyr   r  r   r$  rg  )r  r   r  changedr  r  r$  s          r'   r  r    s    " "d		B"''$-((GE
"ne4"9GBc4 J  A88Yq\1jmQ788rH   )F)TF)NF)4typingr   rs   
sympy.corer   r   r   r   r   r	   r
   sympy.core.exprr   sympy.core.exprtoolsr   sympy.core.functionr   r   r   r   r   sympy.core.logicr   r   sympy.core.numbersr   r   r   sympy.core.powerr   sympy.core.relationalr   (sympy.functions.elementary.miscellaneousr   $sympy.functions.elementary.piecewiser   r   r:   r   r   r=   r4   rA  rJ  rg  r)  rw  r}  r  r  r  r  rx   rH   r'   <module>r     s    " A A A   -  0 ( (   $ 9 :w wtu uvr58 r5jw(( w(tf( fRJ) J)Z6 6r;h ;DR0 R0jgK gKT&,f3x f3RPB//dMB&9rH   