a
    <b                     @   s  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!m"Z"m#Z# d dl$m%Z% d dl&m'Z' d dl(m)Z) d dl*m+Z+m,Z, G dd deZ-G dd deZ.G dd deZ/G dd deZ0G dd deZ1G dd deZ2G dd deZ3G dd deZ4G dd  d eZ5G d!d" d"eZ6d#d$ Z7G d%d& d&eZ8d2d(d)Z9d3d+d,Z:d4d-d.Z;d5d0d1Z<d/S )6    )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)exp	exp_polarlog)ceiling)sqrt)	Piecewise)atanatan2c                   @   sp   e Zd ZU dZee ed< dZdZdZ	e
dd ZdddZdd	 Zd
d Zdd Zdd Zdd Zdd ZdS )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                 C   sJ  |t ju rt jS |t ju r t jS |jr*|S |js<t j| jrBt jS |jrT| d S |j	rrt
|trrt|jd S g g g   }}}t|}|D ]t}|t j}|d ur|js|| q|t js|jr|| q|j|d}| r||d  q|| qt|t|krFdd |||fD \}	}
}| |	t|
 | S d S )Nr   ignorec                 s   s   | ]}t | V  qd S Nr   .0xs r)   t/Users/vegardjervell/Documents/master/model/venv/lib/python3.9/site-packages/sympy/functions/elementary/complexes.py	<genexpr>l       zre.eval.<locals>.<genexpr>)r   NaNComplexInfinityis_extended_realis_imaginaryImaginaryUnitZero	is_Matrixas_real_imagis_Function
isinstance	conjugater    r!   r   	make_argsas_coefficientappendhaslenimclsargincludedZrevertedexcludedr!   ZtermZcoeffZ	real_imagabcr)   r)   r*   evalG   s8    


zre.evalc                 K   s
   | t jfS )zF
        Returns the real number with a zero imaginary part.

        r   r2   selfdeephintsr)   r)   r*   r4   p   s    zre.as_real_imagc                 C   s`   |j s| jd j r*tt| jd |ddS |js<| jd jr\tj tt| jd |dd S d S Nr   Tevaluate)r/   r!   r    r   r0   r   r1   r=   rI   xr)   r)   r*   _eval_derivativew   s    zre._eval_derivativec                 K   s   | j d tjt| j d   S Nr   )r!   r   r1   r=   rI   r@   kwargsr)   r)   r*   _eval_rewrite_as_im~   s    zre._eval_rewrite_as_imc                 C   s   | j d jS rR   r!   Zis_algebraicrI   r)   r)   r*   _eval_is_algebraic   s    zre._eval_is_algebraicc                 C   s   t | jd j| jd jgS rR   )r   r!   r0   is_zerorW   r)   r)   r*   _eval_is_zero   s    zre._eval_is_zeroc                 C   s   | j d jrdS d S Nr   Tr!   	is_finiterW   r)   r)   r*   _eval_is_finite   s    zre._eval_is_finitec                 C   s   | j d jrdS d S r[   r\   rW   r)   r)   r*   _eval_is_complex   s    zre._eval_is_complexN)T)__name__
__module____qualname____doc__tTupler
   __annotations__r/   
unbranched_singularitiesclassmethodrF   r4   rQ   rU   rX   rZ   r^   r_   r)   r)   r)   r*   r       s   
)
(
r    c                   @   sp   e Zd ZU dZee ed< dZdZdZ	e
dd ZdddZdd	 Zd
d Zdd Zdd Zdd Zdd ZdS )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                 C   sT  |t ju rt jS |t ju r t jS |jr,t jS |js>t j| jrJt j | S |jr\| d S |j	r|t
|tr|t|jd  S g g g   }}}t|}|D ]t}|t j}|d ur|js|| n
|| q|t js|js|j|d}|r||d  q|| qt|t|krPdd |||fD \}	}
}| |	t|
 | S d S )N   r   r"   c                 s   s   | ]}t | V  qd S r$   r%   r&   r)   r)   r*   r+      r,   zim.eval.<locals>.<genexpr>)r   r-   r.   r/   r2   r0   r1   r3   r4   r5   r6   r7   r=   r!   r   r8   r9   r:   r;   r<   r    r>   r)   r)   r*   rF      s8    


zim.evalc                 K   s
   | t jfS )zC
        Return the imaginary part with a zero real part.

        rG   rH   r)   r)   r*   r4      s    zim.as_real_imagc                 C   s`   |j s| jd j r*tt| jd |ddS |js<| jd jr\tj tt| jd |dd S d S rL   )r/   r!   r=   r   r0   r   r1   r    rO   r)   r)   r*   rQ      s    zim._eval_derivativec                 K   s    t j | jd t| jd   S rR   )r   r1   r!   r    rS   r)   r)   r*   _eval_rewrite_as_re   s    zim._eval_rewrite_as_rec                 C   s   | j d jS rR   rV   rW   r)   r)   r*   rX      s    zim._eval_is_algebraicc                 C   s   | j d jS rR   r!   r/   rW   r)   r)   r*   rZ      s    zim._eval_is_zeroc                 C   s   | j d jrdS d S r[   r\   rW   r)   r)   r*   r^      s    zim._eval_is_finitec                 C   s   | j d jrdS d S r[   r\   rW   r)   r)   r*   r_     s    zim._eval_is_complexN)T)r`   ra   rb   rc   rd   r
   re   r/   rf   rg   rh   rF   r4   rQ   rj   rX   rZ   r^   r_   r)   r)   r)   r*   r=      s   
)
'
r=   c                       s   e Zd ZdZdZdZ fddZedd Zdd Z	d	d
 Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zd$ddZdd Zdd Zd d! Zd"d# Z  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                    s>   t   }|| kr:| jd jdu r:| jd t| jd  S |S )Nr   F)superdoitr!   rY   Abs)rI   rK   s	__class__r)   r*   rn   F  s    
z	sign.doitc           	      C   sJ  |j r| \}}g }t|}|D ]\}|jr4| }q"|jr<q"|jrtt|}|jrh|tj	9 }|jrr| }q~|
| q"|
| q"|tju rt|t|krd S || |j|  S |tju rtjS |jrtjS |jrtjS |jrtjS |jrt|tr|S |jrF|jr|jtju rtj	S tj	 | }|jr6tj	S |jrFtj	 S d S r$   )is_Mulas_coeff_mulrl   is_extended_negativeis_extended_positiver0   r=   is_comparabler   r1   r:   Oner<   Z_new_rawargsr-   rY   r2   NegativeOner5   r6   is_Powr   Half)	r?   r@   rE   r!   unkrp   rC   Zaiarg2r)   r)   r*   rF   L  sN    


z	sign.evalc                 C   s   t | jd jrtjS d S rR   )r   r!   rY   r   rx   rW   r)   r)   r*   	_eval_Abs~  s    zsign._eval_Absc                 C   s   t t| jd S rR   )rl   r7   r!   rW   r)   r)   r*   _eval_conjugate  s    zsign._eval_conjugatec                 C   s   | j d jr>ddlm} dt| j d |dd || j d  S | j d jrddlm} dt| j d |dd |tj | j d   S d S )Nr   )
DiracDelta   TrM   )r!   r/   'sympy.functions.special.delta_functionsr   r   r0   r   r1   )rI   rP   r   r)   r)   r*   rQ     s    zsign._eval_derivativec                 C   s   | j d jrdS d S r[   )r!   Zis_nonnegativerW   r)   r)   r*   _eval_is_nonnegative  s    zsign._eval_is_nonnegativec                 C   s   | j d jrdS d S r[   )r!   Zis_nonpositiverW   r)   r)   r*   _eval_is_nonpositive  s    zsign._eval_is_nonpositivec                 C   s   | j d jS rR   )r!   r0   rW   r)   r)   r*   _eval_is_imaginary  s    zsign._eval_is_imaginaryc                 C   s   | j d jS rR   rk   rW   r)   r)   r*   _eval_is_integer  s    zsign._eval_is_integerc                 C   s   | j d jS rR   )r!   rY   rW   r)   r)   r*   rZ     s    zsign._eval_is_zeroc                 C   s&   t | jd jr"|jr"|jr"tjS d S rR   )r   r!   rY   
is_integeris_evenr   rx   )rI   otherr)   r)   r*   _eval_power  s    zsign._eval_powerr   c                 C   sV   | j d }||d}|dkr(| |S |dkr<|||}t|dk rPtj S tjS rR   )r!   subsfuncdirr    r   rx   )rI   rP   nlogxcdirZarg0Zx0r)   r)   r*   _eval_nseries  s    

zsign._eval_nseriesc                 K   s&   |j r"td|dkfd|dk fdS d S )Nri   r   )r   T)r/   r   rS   r)   r)   r*   _eval_rewrite_as_Piecewise  s    zsign._eval_rewrite_as_Piecewisec                 K   s&   ddl m} |jr"||d d S d S )Nr   	Heavisider   ri   r   r   r/   rI   r@   rT   r   r)   r)   r*   _eval_rewrite_as_Heaviside  s    zsign._eval_rewrite_as_Heavisidec                 K   s    t dt|df|t| dfS r[   )r   r   ro   rS   r)   r)   r*   _eval_rewrite_as_Abs  s    zsign._eval_rewrite_as_Absc                 K   s   |  t| jd S rR   )r   r   r!   )rI   rT   r)   r)   r*   _eval_simplify  s    zsign._eval_simplify)r   )r`   ra   rb   rc   Z
is_complexrg   rn   rh   rF   r~   r   rQ   r   r   r   r   rZ   r   r   r   r   r   r   __classcell__r)   r)   rq   r*   rl     s(   6
1

	rl   c                   @   s   e Zd ZU dZee ed< dZdZdZ	dZ
dZd,ddZedd	 Zd
d Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd-dd Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+S ).ro   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!   TFri   c                 C   s$   |dkrt | jd S t| |dS )zE
        Get the first derivative of the argument to Abs().

        ri   r   N)rl   r!   r   )rI   Zargindexr)   r)   r*   fdiff  s    z	Abs.fdiffc                    s  ddl m} t dr*  }|d ur*|S t tsDtdt  | dd   \}}|j	rx|j	sx| || | S  j
r2g }g } jD ]v}|jr|jjr|jjr| |j}	t|	| r|| n|t|	|j q| |}
t|
| r|| q||
 qt| }|r$| t| ddntj}|| S  tju rDtjS  tju rVtjS  jr  \}}|jr|jr|jr S |tju rtjS t|| S |jr|t| S |j r| t| ttj! t"|  S d S |#t$st%|& \}}|t'|  }tt|| S t tr<tt jd S t t(rf j)rT S  jrb  S d S  j*r #tjtj+rt,dd  & D rtjS  j-rtj.S  jr S  j/rƈ  S  j0rtj1   }|jr|S  jrd S | 2 dd3t2 3t2 }|r8t4 fd	d|D r8d S  kr  kr 3t} 5d
d |D }dd |j	D }|rt4fdd|D st6t7  S d S )Nr   )signsimpr~   zBad argument type for Abs(): %sFrM   c                 s   s   | ]}|j V  qd S r$   )is_infiniter'   rC   r)   r)   r*   r+   Q  r,   zAbs.eval.<locals>.<genexpr>c                 3   s   | ]}  |jd  V  qdS )r   N)r;   r!   r'   ir@   r)   r*   r+   c  r,   c                 S   s   i | ]}|t d dqS )T)real)r   r   r)   r)   r*   
<dictcomp>g  r,   zAbs.eval.<locals>.<dictcomp>c                 S   s   g | ]}|j d u r|qS r$   )r/   r   r)   r)   r*   
<listcomp>h  r,   zAbs.eval.<locals>.<listcomp>c                 3   s   | ]}  t|V  qd S r$   )r;   r7   )r'   u)conjr)   r*   r+   i  r,   )8Zsympy.simplify.simplifyr   hasattrr~   r6   r
   	TypeErrortypeZas_numer_denomfree_symbolsrs   r!   rz   r   r   Zis_negativebaser:   r   r   r   rx   r-   r.   InfinityZas_base_expr/   r   ry   ro   is_extended_nonnegativer    ru   Pir=   r;   r   r   r4   r   r   is_positiveis_AddNegativeInfinityanyrY   r2   Zis_extended_nonpositiver0   r1   r7   atomsallZxreplacer   r   )r?   r@   r   objr   dZknownr|   tZbnewZtnewr   exponentrC   rD   zr}   Znew_conjr#   Zabs_free_argr)   )r@   r   r*   rF     s    





"
zAbs.evalc                 C   s   | j d jrdS d S r[   r\   rW   r)   r)   r*   _eval_is_reall  s    zAbs._eval_is_realc                 C   s   | j d jr| j d jS d S rR   )r!   r/   r   rW   r)   r)   r*   r   p  s    zAbs._eval_is_integerc                 C   s   t | jd jS rR   )r   _argsrY   rW   r)   r)   r*   _eval_is_extended_nonzerot  s    zAbs._eval_is_extended_nonzeroc                 C   s   | j d jS rR   )r   rY   rW   r)   r)   r*   rZ   w  s    zAbs._eval_is_zeroc                 C   s   | j }|d ur| S d S r$   )rY   )rI   Zis_zr)   r)   r*   _eval_is_extended_positivez  s    zAbs._eval_is_extended_positivec                 C   s   | j d jr| j d jS d S rR   )r!   r/   Zis_rationalrW   r)   r)   r*   _eval_is_rational  s    zAbs._eval_is_rationalc                 C   s   | j d jr| j d jS d S rR   )r!   r/   r   rW   r)   r)   r*   _eval_is_even  s    zAbs._eval_is_evenc                 C   s   | j d jr| j d jS d S rR   )r!   r/   Zis_oddrW   r)   r)   r*   _eval_is_odd  s    zAbs._eval_is_oddc                 C   s   | j d jS rR   rV   rW   r)   r)   r*   rX     s    zAbs._eval_is_algebraicc                 C   sP   | j d jrL|jrL|jr&| j d | S |tjurL|jrL| j d |d  |  S d S Nr   ri   )r!   r/   r   r   r   ry   Z
is_Integer)rI   r   r)   r)   r*   r     s    zAbs._eval_powerr   c                 C   sX   | j d |d }|t|r2|t||}| j d j|||d}t||  S )Nr   )r   r   )r!   Zleadtermr;   r   r   r   rl   expand)rI   rP   r   r   r   	directionrp   r)   r)   r*   r     s
    zAbs._eval_nseriesc                 C   s   | j d js| j d jr>t| j d |ddtt| j d  S t| j d tt| j d |dd t| j d tt| j d |dd  t| j d  }|	tS rL   )
r!   r/   r0   r   rl   r7   r    r=   ro   Zrewrite)rI   rP   rvr)   r)   r*   rQ     s    zAbs._eval_derivativec                 K   s,   ddl m} |jr(|||||   S d S )Nr   r   r   r   r)   r)   r*   r     s    zAbs._eval_rewrite_as_Heavisidec                 K   sL   |j rt||dkf| dfS |jrHtt| t| dkft | dfS d S r[   )r/   r   r0   r   rS   r)   r)   r*   r     s    zAbs._eval_rewrite_as_Piecewisec                 K   s   |t | S r$   rl   rS   r)   r)   r*   _eval_rewrite_as_sign  s    zAbs._eval_rewrite_as_signc                 K   s   |t | tj S r$   )r7   r   r{   rS   r)   r)   r*   _eval_rewrite_as_conjugate  s    zAbs._eval_rewrite_as_conjugateN)ri   )r   )r`   ra   rb   rc   rd   r
   re   r/   ru   r   rf   rg   r   rh   rF   r   r   r   rZ   r   r   r   r   rX   r   r   rQ   r   r   r   r   r)   r)   r)   r*   ro     s4   
9


^
	ro   c                   @   s<   e Zd ZdZdZdZdZdZedd Z	dd Z
dd Zd	S )
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           	      C   s   |}t dD ]6}t|| r&|jd }q|dkr>|jr>tj  S  qJqtjS t|tr^t|tS |j	st
| \}}|jrtdd |jD  }t|| }n|}tdd |tD rd S | \}}t||}|jr|S ||kr| |dd	S d S )
N   r   r   c                 S   s$   g | ]}t |d vr|nt |qS ))r   ri   r   r   r)   r)   r*   r      s   zarg.eval.<locals>.<listcomp>c                 s   s   | ]}|j d u V  qd S r$   )rv   r   r)   r)   r*   r+     r,   zarg.eval.<locals>.<genexpr>FrM   )ranger6   r!   r/   r   r-   r   periodic_argumentr   is_Atomr   Zas_coeff_Mulrs   r   rl   r   r   r   r4   r   	is_number)	r?   r@   rC   r   rE   Zarg_rP   yr   r)   r)   r*   rF     s4    




zarg.evalc                 C   sF   | j d  \}}|t||dd |t||dd  |d |d   S )Nr   TrM   r   )r!   r4   r   )rI   r   rP   r   r)   r)   r*   rQ     s    zarg._eval_derivativec                 K   s   | j d  \}}t||S rR   )r!   r4   r   )rI   r@   rT   rP   r   r)   r)   r*   _eval_rewrite_as_atan2  s    zarg._eval_rewrite_as_atan2N)r`   ra   rb   rc   r/   is_realr]   rg   rh   rF   rQ   r   r)   r)   r)   r*   r@     s   /
r@   c                   @   sX   e Zd ZdZdZedd Zdd Zdd Zd	d
 Z	dd Z
dd Zdd Zdd ZdS )r7   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                 C   s   |  }|d ur|S d S r$   )r   r?   r@   r   r)   r)   r*   rF   F  s    zconjugate.evalc                 C   s   t S r$   )r7   rW   r)   r)   r*   inverseL  s    zconjugate.inversec                 C   s   t | jd ddS rL   ro   r!   rW   r)   r)   r*   r~   O  s    zconjugate._eval_Absc                 C   s   t | jd S rR   	transposer!   rW   r)   r)   r*   _eval_adjointR  s    zconjugate._eval_adjointc                 C   s
   | j d S rR   r!   rW   r)   r)   r*   r   U  s    zconjugate._eval_conjugatec                 C   sB   |j rtt| jd |ddS |jr>tt| jd |dd S d S rL   )r   r7   r   r!   r0   rO   r)   r)   r*   rQ   X  s    zconjugate._eval_derivativec                 C   s   t | jd S rR   adjointr!   rW   r)   r)   r*   _eval_transpose^  s    zconjugate._eval_transposec                 C   s   | j d jS rR   rV   rW   r)   r)   r*   rX   a  s    zconjugate._eval_is_algebraicN)r`   ra   rb   rc   rg   rh   rF   r   r~   r   r   rQ   r   rX   r)   r)   r)   r*   r7     s   +
r7   c                   @   s4   e Zd ZdZedd Zdd Zdd Zdd	 Zd
S )r   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                 C   s   |  }|d ur|S d S r$   )r   r   r)   r)   r*   rF     s    ztranspose.evalc                 C   s   t | jd S rR   r7   r!   rW   r)   r)   r*   r     s    ztranspose._eval_adjointc                 C   s   t | jd S rR   r   rW   r)   r)   r*   r     s    ztranspose._eval_conjugatec                 C   s
   | j d S rR   r   rW   r)   r)   r*   r     s    ztranspose._eval_transposeN)	r`   ra   rb   rc   rh   rF   r   r   r   r)   r)   r)   r*   r   e  s   (
r   c                   @   sF   e Zd ZdZedd Zdd Zdd Zdd	 ZdddZ	dd Z
d
S )r   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                 C   s0   |  }|d ur|S | }|d ur,t|S d S r$   )r   r   r7   r   r)   r)   r*   rF     s    zadjoint.evalc                 C   s
   | j d S rR   r   rW   r)   r)   r*   r     s    zadjoint._eval_adjointc                 C   s   t | jd S rR   r   rW   r)   r)   r*   r     s    zadjoint._eval_conjugatec                 C   s   t | jd S rR   r   rW   r)   r)   r*   r     s    zadjoint._eval_transposeNc                 G   s,   | | jd }d| }|r(d||f }|S )Nr   z%s^{\dagger}z\left(%s\right)^{%s})_printr!   )rI   printerr   r!   r@   Ztexr)   r)   r*   _latex  s
    zadjoint._latexc                 G   sH   ddl m} |j| jd g|R  }|jr8||d }n||d }|S )Nr   )
prettyFormu   †+)Z sympy.printing.pretty.stringpictr   r   r!   Z_use_unicode)rI   r   r!   r   Zpformr)   r)   r*   _pretty  s    zadjoint._pretty)N)r`   ra   rb   rc   rh   rF   r   r   r   r   r   r)   r)   r)   r*   r     s   

r   c                   @   s4   e Zd ZdZdZdZedd Zdd Zdd	 Z	d
S )
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                 C   s   ddl m} |jrH||}|dtd t d tfv rHtt| t| S |jrV|j}n|g}g }g }g }|D ]2}|j	r||g7 }ql|j
r||g7 }ql||g7 }qlt|t|k r|rt||  tt|  S |rt||  S t| td S d S )Nr   r   r   )Z$sympy.functions.elementary.complexesr@   r   r   r   r   absrs   r!   is_polarr   r<   r   r   )r?   r@   Zargumentarr!   rA   rB   Zpositiver)   r)   r*   rF   	  s.    zpolar_lift.evalc                 C   s   | j d |S )z. Careful! any evalf of polar numbers is flaky r   )r!   _eval_evalf)rI   precr)   r)   r*   r   +  s    zpolar_lift._eval_evalfc                 C   s   t | jd ddS rL   r   rW   r)   r)   r*   r~   /  s    zpolar_lift._eval_AbsN)
r`   ra   rb   rc   r   rw   rh   rF   r   r~   r)   r)   r)   r*   r     s   %
!r   c                   @   s0   e Zd ZdZedd Zedd Zdd ZdS )	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                 C   s   |j r|j}n|g}d}|D ]}|js4|t|7 }qt|trR||j d 7 }q|jr|j \}}||t	|j
 |tt|j
  7 }qt|tr|t|jd 7 }q d S q|S r   )rs   r!   r   r@   r6   r   r   r4   rz   unbranched_argumentr   r   r   r   )r?   r   r!   rf   rC   r    r=   r)   r)   r*   _getunbranched\  s(    

z periodic_argument._getunbranchedc                 C   s   |j s
d S |tkr&t|tr&t|j S t|trL|dt krLt|jd |S |jrdd |jD }t	|t	|jkrtt
| |S | |}|d u rd S |tttrd S |tkr|S |tkrt|| tj | }|ts|| S d S )Nr   r   c                 S   s   g | ]}|j s|qS r)   )r   r'   rP   r)   r)   r*   r     r,   z*periodic_argument.eval.<locals>.<listcomp>)rv   r   r6   principal_branchr   r!   r   r   rs   r<   r   r   r;   r   r   r   r   r{   )r?   r   periodZnewargsrf   r   r)   r)   r*   rF   r  s*    


zperiodic_argument.evalc                 C   sb   | j \}}|tkr2t|}|d u r(| S ||S t|t|}|t|| tj |  |S r$   )r!   r   r   r   r   r   r   r{   )rI   r   r   r   rf   ubr)   r)   r*   r     s    


zperiodic_argument._eval_evalfN)r`   ra   rb   rc   rh   r   rF   r   r)   r)   r)   r*   r   3  s   (

r   c                 C   s
   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   r   r)   r)   r*   r     s    r   c                   @   s,   e Zd ZdZdZdZedd Zdd ZdS )	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                 C   s  t |trt|jd |S |tkr&|S t|t}t||}||kr|ts|tst|}dd }|t|}t|t}|ts||krtt	||  | }n|}|j
s|ts|td9 }|S |js|d }}	n|j|j \}}	g }
|	D ] }|jr||9 }q|
|g7 }
qt|
}	t||}|tr6d S |jrt||ksj|dkr|	dkr|dkr|dkrt|tt|	 | S ttt	| t|	  |t| S |jrt||d k dks||d kr|	dkrt|t	 t| S d S )Nr   c                 S   s   t | tst| S | S r$   )r6   r   r   )exprr)   r)   r*   mr  s    
z!principal_branch.eval.<locals>.mrr)   ri   r   T)r6   r   r   r!   r   r   r;   replacer   r   r   r   rt   r   tupler   r   r   r   )rI   rP   r   r   Zbargplr   resrE   mZothersr   r@   r)   r)   r*   rF     s\    







",zprincipal_branch.evalc                 C   sN   | j \}}t|||}t|tks0|t kr4| S t|tt|  |S r$   )r!   r   r   r   r   r   r   )rI   r   r   r   pr)   r)   r*   r     s
    
zprincipal_branch._eval_evalfN)	r`   ra   rb   rc   r   rw   rh   rF   r   r)   r)   r)   r*   r     s   (
2r   Fc           
         sh  ddl m} | jr| S | jr(s(t| S t| trBsB rBt| S | jrL| S | jr|| j	 fdd| j
D  } rxt|S |S | jr| jtjkr| 	tjt| j ddS | jr| j	 fdd| j
D  S t| |rHt| j d}g }| j
dd  D ]>}t|d dd	}t|dd   d	}	||f|	   q||ft|  S | j	 fd
d| j
D  S d S )Nr   )Integralc                    s   g | ]}t | d dqS )Tpause	_polarifyr'   r@   liftr)   r*   r   !  r,   z_polarify.<locals>.<listcomp>Fr   c                    s   g | ]}t | d dqS )Fr   r   r   r   r)   r*   r   (  r,   ri   r   r   c                    s(   g | ] }t |tr t| d n|qS )r   )r6   r
   r   r   r   r)   r*   r   3  s   
)Zsympy.integrals.integralsr   r   r   r   r6   r   r   r   r   r!   rz   r   r   ZExp1r   r   r5   functionr:   r   )
eqr   r   r   rr   Zlimitslimitvarrestr)   r   r*   r     s:    
r   Tc                 C   sN   |rd}t t| |} |s| S dd | jD }| |} | dd | D fS )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})
    Fc                 S   s   i | ]}|t |jd dqS )T)Zpolar)r   name)r'   rp   r)   r)   r*   r   d  r,   zpolarify.<locals>.<dictcomp>c                 S   s   i | ]\}}||qS r)   r)   )r'   rp   r  r)   r)   r*   r   f  r,   )r   r   r   r   items)r   r   r   Zrepsr)   r)   r*   polarify7  s    (
r  c                    sF  t | tr| jr| S |st | tr2tt| j S t | tr^| jd dt kr^t| jd  S | j	s| j
s| js| jr| jdv rd| jv s| jdvr| j fdd| jD  S t | trt| jd  S | jrt| j }t| j |jo|  }|| S | jr,t| jddr,| j fd	d| jD  S | j fd
d| jD  S )Nri   r   r   )z==z!=c                    s   g | ]}t | qS r)   _unpolarifyr   exponents_onlyr)   r*   r   x  r,   z_unpolarify.<locals>.<listcomp>rf   Fc                    s   g | ]}t |  qS r)   r  r   r
  r)   r*   r     s   c                    s   g | ]}t | d qS )Tr  r   r
  r)   r*   r     r,   )r6   r	   r   r   r   r	  r   r!   r   r   rs   Z
is_BooleanZis_RelationalZrel_opr   r   rz   r   r   r5   getattr)r   r  r   Zexpor   r)   r
  r*   r	  i  sF    

r	  Nc                 C   s   t | tr| S t| } |dur,t| |S d}d}|r<d}|rpd}t| ||}|| kr`d}|} t |tr<|S q<|t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)
    NTFr   ri   )r6   boolr   
unpolarifyr   r	  r   r   )r   r   r  changedr   r   r)   r)   r*   r    s$    

r  )F)TF)F)NF)=typingr   rd   Z
sympy.corer   r   r   r   r   r   r	   Zsympy.core.exprr
   Zsympy.core.exprtoolsr   Zsympy.core.functionr   r   r   r   r   Zsympy.core.logicr   r   Zsympy.core.numbersr   r   r   Zsympy.core.powerr   Zsympy.core.relationalr   Z&sympy.functions.elementary.exponentialr   r   r   Z#sympy.functions.elementary.integersr   Z(sympy.functions.elementary.miscellaneousr   Z$sympy.functions.elementary.piecewiser   Z(sympy.functions.elementary.trigonometricr   r   r    r=   rl   ro   r@   r7   r   r   r   r   r   r   r   r  r	  r  r)   r)   r)   r*   <module>   s>   $z{ 6 z^M9BSfg
!
2
 