a
    <b                     @   st  d dl mZ d dlmZ d dl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mZmZmZ d dlmZmZmZ d dlmZ d d	lmZ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' d dl(m)Z) d dl*m+Z+ d dl,m-Z-m.Z. d dl/m0Z0 G dd deZ1G dd de1Z2G dd deZ3G dd de1e3dZ4dd Z5G dd deZ6G dd  d eZ7d!S )"    )Tuple)Expr)sympify)Add)cacheit)FunctionArgumentIndexError
expand_log
expand_mulFunctionClass	PoleErrorexpand_multinomialexpand_complex)	fuzzy_and	fuzzy_notfuzzy_or)Mul)IntegerRationalpiI)global_parameters)Pow)S)WildDummy)	factorial)sqrt)multiplicityperfect_power)SetExprc                   @   s   e Zd ZdZejfZedd ZdddZ	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S )ExpBaseTc                 C   s   | j jS N)expkindself r'   v/Users/vegardjervell/Documents/master/model/venv/lib/python3.9/site-packages/sympy/functions/elementary/exponential.pyr$   &   s    zExpBase.kind   c                 C   s   t S )z=
        Returns the inverse function of ``exp(x)``.
        logr&   argindexr'   r'   r(   inverse*   s    zExpBase.inversec                 C   s@   | j }|j}|s | js | }|r6tj| | fS | tjfS )a-  
        Returns this with a positive exponent as a 2-tuple (a fraction).

        Examples
        ========

        >>> from sympy import exp
        >>> from sympy.abc import x
        >>> exp(-x).as_numer_denom()
        (1, exp(x))
        >>> exp(x).as_numer_denom()
        (exp(x), 1)
        )r#   is_negativeZcould_extract_minus_signr   Onefunc)r&   r#   Zneg_expr'   r'   r(   as_numer_denom0   s    zExpBase.as_numer_denomc                 C   s
   | j d S )z7
        Returns the exponent of the function.
        r   )argsr%   r'   r'   r(   r#   H   s    zExpBase.expc                 C   s   |  dt| j fS )z7
        Returns the 2-tuple (base, exponent).
        r)   )r1   r   r3   r%   r'   r'   r(   as_base_expO   s    zExpBase.as_base_expc                 C   s   |  | j S r"   )r1   r#   Zadjointr%   r'   r'   r(   _eval_adjointU   s    zExpBase._eval_adjointc                 C   s   |  | j S r"   )r1   r#   	conjugater%   r'   r'   r(   _eval_conjugateX   s    zExpBase._eval_conjugatec                 C   s   |  | j S r"   )r1   r#   Z	transposer%   r'   r'   r(   _eval_transpose[   s    zExpBase._eval_transposec                 C   s.   | j }|jr |jrdS |jr dS |jr*dS d S NTF)r#   is_infiniteis_extended_negativeis_extended_positive	is_finiter&   argr'   r'   r(   _eval_is_finite^   s    zExpBase._eval_is_finitec                 C   sH   | j | j }|j | j kr>|jj}|r(dS |jjrDt|rDdS n|jS d S r9   )r1   r3   r#   is_zerois_rationalr   )r&   szr'   r'   r(   _eval_is_rationalh   s    zExpBase._eval_is_rationalc                 C   s   | j tju S r"   )r#   r   NegativeInfinityr%   r'   r'   r(   _eval_is_zeros   s    zExpBase._eval_is_zeroc                 C   s"   |   \}}tt||dd|S )z;exp(arg)**e -> exp(arg*e) if assumptions allow it.
        Fevaluate)r4   r   _eval_power)r&   otherber'   r'   r(   rJ   v   s    zExpBase._eval_powerc                    s|   ddl m} ddlm}  jd }|jrH|jrHt fdd|jD S t	||rr|jrr| 
|jg|jR  S  
|S )Nr   )Product)Sumc                 3   s   | ]}  |V  qd S r"   )r1   ).0xr%   r'   r(   	<genexpr>       z1ExpBase._eval_expand_power_exp.<locals>.<genexpr>)Zsympy.concrete.productsrN   Zsympy.concrete.summationsrO   r3   is_AddZis_commutativer   Zfromiter
isinstancer1   functionlimits)r&   hintsrN   rO   r?   r'   r%   r(   _eval_expand_power_exp|   s    
zExpBase._eval_expand_power_expN)r)   )__name__
__module____qualname__Z
unbranchedr   ComplexInfinity_singularitiespropertyr$   r.   r2   r#   r4   r5   r7   r8   r@   rE   rG   rJ   rY   r'   r'   r'   r(   r!   !   s"   



r!   c                   @   s@   e Zd ZdZdZdZdd Zdd Zdd	 Zd
d Z	dd Z
dS )	exp_polara;  
    Represent a *polar number* (see g-function Sphinx documentation).

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

    ``exp_polar`` represents the function
    `Exp: \mathbb{C} \rightarrow \mathcal{S}`, sending the complex number
    `z = a + bi` to the polar number `r = exp(a), \theta = b`. It is one of
    the main functions to construct polar numbers.

    Examples
    ========

    >>> from sympy import exp_polar, pi, I, exp

    The main difference is that polar numbers don't "wrap around" at `2 \pi`:

    >>> exp(2*pi*I)
    1
    >>> exp_polar(2*pi*I)
    exp_polar(2*I*pi)

    apart from that they behave mostly like classical complex numbers:

    >>> exp_polar(2)*exp_polar(3)
    exp_polar(5)

    See Also
    ========

    sympy.simplify.powsimp.powsimp
    polar_lift
    periodic_argument
    principal_branch
    TFc                 C   s   ddl m} t|| jd S )Nr   )re)$sympy.functions.elementary.complexesra   r#   r3   )r&   ra   r'   r'   r(   	_eval_Abs   s    zexp_polar._eval_Absc                 C   s   ddl m}m} || jd }z|t kp0|tk}W n tyJ   d}Y n0 |rT| S t| jd |}|dkr||dk r||S |S )z. Careful! any evalf of polar numbers is flaky r   imra   T)rb   re   ra   r3   r   	TypeErrorr#   _eval_evalf)r&   precre   ra   ibadresr'   r'   r(   rg      s    
zexp_polar._eval_evalfc                 C   s   |  | jd | S Nr   )r1   r3   )r&   rK   r'   r'   r(   rJ      s    zexp_polar._eval_powerc                 C   s   | j d jrdS d S )Nr   T)r3   is_extended_realr%   r'   r'   r(   _eval_is_extended_real   s    z exp_polar._eval_is_extended_realc                 C   s"   | j d dkr| tjfS t| S rl   )r3   r   r0   r!   r4   r%   r'   r'   r(   r4      s    
zexp_polar.as_base_expN)rZ   r[   r\   __doc__is_polaris_comparablerc   rg   rJ   rn   r4   r'   r'   r'   r(   r`      s   %r`   c                   @   s   e Zd Zdd ZdS )ExpMetac                 C   s&   t |jjv rdS t|to$|jtju S )NT)r#   	__class____mro__rU   r   baser   Exp1)clsinstancer'   r'   r(   __instancecheck__   s    zExpMeta.__instancecheck__N)rZ   r[   r\   ry   r'   r'   r'   r(   rr      s   rr   c                   @   s   e Zd ZdZd,ddZdd Zedd Zed	d
 Z	e
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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 )0r#   a9  
    The exponential function, :math:`e^x`.

    Examples
    ========

    >>> from sympy import exp, I, pi
    >>> from sympy.abc import x
    >>> exp(x)
    exp(x)
    >>> exp(x).diff(x)
    exp(x)
    >>> exp(I*pi)
    -1

    Parameters
    ==========

    arg : Expr

    See Also
    ========

    log
    r)   c                 C   s   |dkr| S t | |dS )z@
        Returns the first derivative of this function.
        r)   N)r   r,   r'   r'   r(   fdiff   s    z	exp.fdiffc                 C   s   ddl m}m} | jd }|jrtjtj }||| fv r@tjS |	tj
tj }|r||d| r|||r|tjS |||rtjS |||tj rtj S |||tj rtjS d S )Nr   )askQ   )Zsympy.assumptionsr{   r|   r3   is_Mulr   ImaginaryUnitInfinityNaNas_coefficientPiintegerZevenr0   ZoddNegativeOneHalf)r&   Zassumptionsr{   r|   r?   ZIoocoeffr'   r'   r(   _eval_refine   s"    
zexp._eval_refinec                 C   s  ddl m} ddlm} ddlm}m} ddlm} t	||rF|
 S tjrXttj|S |jr|tju rntjS |jrztjS |tju rtjS |tju rtjS |tju rtjS n|tju rtjS t	|tr|jd S t	|| r|t
|jt
|jS t	|tr
|| S |jr|tj tj! }|rd| j"r~|j#rDtjS |j$rRtj%S |tj& j#rhtj! S |tj& j$rtj!S n@|j'r|d }|dkr|d8 }||kr| |tj  tj! S |( \}}	|tjtjfv rL|	j)rH|tju r|	 }	||	jr|	tjurtjS ||	j*r6||	tjur6tjS ||	j+rHtjS d S |gd  }
}t,-|	D ]R}||}t	|tr|d u r|jd }n d S n|j.r|
/| n d S qb|r|t,|
  S d S |j0r|g }g }d}|jD ]p}|tju r|/| q| |}t	|| rJ|jd |kr>|/|jd  d	}n
|/| n
|/| q|sd|r|t,| | t1| dd
 S |jrtjS d S )Nr   AccumBounds)
MatrixBaserd   
logcombiner}   r)   FTrH   )2sympy.calculusr   Zsympy.matrices.matricesr   rb   re   ra   sympy.simplify.simplifyr   rU   r#   r   Z
exp_is_powr   r   rv   	is_Numberr   rA   r0   r   rF   Zeror]   r+   r3   minmaxr    
_eval_funcr~   r   r   r   
is_integeris_evenZis_oddr   r   is_RationalZas_coeff_Mul	is_numberis_positiver/   r   	make_argsrq   appendrT   r   )rw   r?   r   r   re   ra   r   r   ZncoefftermsZcoeffsZlog_termtermZterm_outaddZ
argchangedaZnewar'   r'   r(   eval  s    















zexp.evalc                 C   s   t jS )z?
        Returns the base of the exponential function.
        )r   rv   r%   r'   r'   r(   ru   {  s    zexp.basec                 G   sT   | dk rt jS | dkrt jS t|}|rD|d }|durD|| |  S ||  t|  S )zJ
        Calculates the next term in the Taylor series expansion.
        r   N)r   r   r0   r   r   )nrQ   previous_termspr'   r'   r(   taylor_term  s    zexp.taylor_termTc                 K   st   ddl m}m} | jd  \}}|rJ|j|fi |}|j|fi |}|||| }}t|| t|| fS )aJ  
        Returns this function as a 2-tuple representing a complex number.

        Examples
        ========

        >>> from sympy import exp, I
        >>> from sympy.abc import x
        >>> exp(x).as_real_imag()
        (exp(re(x))*cos(im(x)), exp(re(x))*sin(im(x)))
        >>> exp(1).as_real_imag()
        (E, 0)
        >>> exp(I).as_real_imag()
        (cos(1), sin(1))
        >>> exp(1+I).as_real_imag()
        (E*cos(1), E*sin(1))

        See Also
        ========

        sympy.functions.elementary.complexes.re
        sympy.functions.elementary.complexes.im
        r   )cossin)(sympy.functions.elementary.trigonometricr   r   r3   as_real_imagexpandr#   )r&   deeprX   r   r   ra   re   r'   r'   r(   r     s    zexp.as_real_imagc                 C   s   |j rt|jt|j }n|tju r0|jr0t}t|tsD|tju rbdd }t	|| |||S |tu r|js|| j
|| S t	| ||S )Nc                 S   s&   | j st| tr"t|  ddiS | S )NrI   F)is_PowrU   r#   r   r4   )r   r'   r'   r(   <lambda>  s
    z exp._eval_subs.<locals>.<lambda>)r   r#   r+   ru   r   rv   Zis_FunctionrU   r   
_eval_subs_subsr   )r&   oldnewfr'   r'   r(   r     s    zexp._eval_subsc                 C   sF   | j d jrdS | j d jrBtd tj | j d  tj }|jS d S )Nr   Tr}   )r3   rm   is_imaginaryr   r   r   r   r&   Zarg2r'   r'   r(   rn     s
     zexp._eval_is_extended_realc                 C   s   dd }t || jd S )Nc                 s   s   | j V  | jV  d S r"   )
is_complexr;   r?   r'   r'   r(   complex_extended_negative  s    z7exp._eval_is_complex.<locals>.complex_extended_negativer   )r   r3   )r&   r   r'   r'   r(   _eval_is_complex  s    zexp._eval_is_complexc                 C   sF   | j tj tj jrdS t| j jrB| j jr0dS | j tj jrBdS d S r9   )r#   r   r   r   rB   r   rA   is_algebraicr%   r'   r'   r(   _eval_is_algebraic  s    zexp._eval_is_algebraicc                 C   sB   | j jr| jd tjuS | j jr>tj | jd  tj }|jS d S rl   )	r#   rm   r3   r   rF   r   r   r   r   r   r'   r'   r(   _eval_is_extended_positive  s
    zexp._eval_is_extended_positiver   c              	   C   s  ddl m} ddlm} ddlm} ddlm} | j}	|	j	|||d}
|
j
rTd|
 S ||
 |d}|tju r|||| |S |tju r| S td}|}z||	j||d	| }W n ttfy   d}Y n0 |r|dkr||| }t|||}t||||
|  }|rF|dkrF|||
| | |||d |   7 }n|||
| | |7 }| }||d
dd}dd }td|gd}|tj| ttj| }|S )Nr   ceiling)limitOrderpowsimpr   logxr)   tr   Tr#   r   combinec                 S   s   | j o| jdv S )N)         )r   q)rQ   r'   r'   r(   r      rS   z#exp._eval_nseries.<locals>.<lambda>w)Z
properties)#sympy.functions.elementary.integersr   Zsympy.series.limitsr   sympy.series.orderr   sympy.simplify.powsimpr   r#   _eval_nseriesis_OrderremoveOr   rF   r   r   as_leading_termgetnNotImplementedErrorr   _taylorsubsr   r   replacer   r   )r&   rQ   r   r   cdirr   r   r   r   r?   Z
arg_seriesarg0r   ZntermscfZ
exp_seriesrZ	simpleratr   r'   r'   r(   r     s@    


(zexp._eval_nseriesc                 C   sN   g }d }t |D ]4}| || jd |}|j||d}||  qt| S )Nr   )r   )ranger   r3   nseriesr   r   r   )r&   rQ   r   lgri   r'   r'   r(   r     s    zexp._taylorNc                 C   s\   | j d  j||d}||d}|tju r:||d}|jdu rLt|S t	d|  d S )Nr   r   FCannot expand %s around 0)
r3   cancelr   r   r   r   r   r:   r#   r   r&   rQ   r   r   r?   r   r'   r'   r(   _eval_as_leading_term  s    

zexp._eval_as_leading_termc                 K   s8   ddl m} tj}||| tjd  ||||   S )Nr   )r   r}   )r   r   r   r   r   )r&   r?   kwargsr   r   r'   r'   r(   _eval_rewrite_as_sin  s    zexp._eval_rewrite_as_sinc                 K   s8   ddl m} tj}||| |||| tjd    S )Nr   )r   r}   )r   r   r   r   r   )r&   r?   r   r   r   r'   r'   r(   _eval_rewrite_as_cos  s    zexp._eval_rewrite_as_cosc                 K   s,   ddl m} d||d  d||d   S )Nr   )tanhr)   r}   )Z%sympy.functions.elementary.hyperbolicr   )r&   r?   r   r   r'   r'   r(   _eval_rewrite_as_tanh!  s    zexp._eval_rewrite_as_tanhc                 K   sv   ddl m}m} |jrr|tjtj }|rr|jrr|tj| |tj|  }}t	||srt	||sr|tj|  S d S )Nr   )r   r   )
r   r   r   r~   r   r   r   r   r   rU   )r&   r?   r   r   r   r   ZcosineZsiner'   r'   r(   _eval_rewrite_as_sqrt%  s    
zexp._eval_rewrite_as_sqrtc                 K   s<   |j r8dd |jD }|r8t|d jd ||d S d S )Nc                 S   s(   g | ] }t |trt|jd kr|qS )r)   )rU   r+   lenr3   )rP   r   r'   r'   r(   
<listcomp>0  rS   z,exp._eval_rewrite_as_Pow.<locals>.<listcomp>r   )r~   r3   r   r   )r&   r?   r   Zlogsr'   r'   r(   _eval_rewrite_as_Pow.  s    zexp._eval_rewrite_as_Pow)r)   )T)r   )Nr   )rZ   r[   r\   ro   rz   r   classmethodr   r_   ru   staticmethodr   r   r   r   rn   r   r   r   r   r   r   r   r   r   r   r   r'   r'   r'   r(   r#      s0   
	
i

 	
&	
		r#   )	metaclassc                 C   sV   | j tjdd\}}|dkr*|jr*||fS |tj}|rN|jrN|jrN||fS dS dS )a  
    Try to match expr with $a + Ib$ for real $a$ and $b$.

    ``match_real_imag`` returns a tuple containing the real and imaginary
    parts of expr or ``(None, None)`` if direct matching is not possible. Contrary
    to :func:`~.re()`, :func:`~.im()``, and ``as_real_imag()``, this helper will not force things
    by returning expressions themselves containing ``re()`` or ``im()`` and it
    does not expand its argument either.

    TZas_Addr   )NNN)as_independentr   r   is_realr   )exprr_i_r'   r'   r(   match_real_imag5  s    r   c                   @   s   e Zd ZU dZee ed< ejej	fZ
d+ddZd,ddZed-d	d
Zdd Zeedd Zd.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 d! Zd"d# Zd$d% Zd0d'd(Zd1d)d*ZdS )2r+   a  
    The natural logarithm function `\ln(x)` or `\log(x)`.

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

    Logarithms are taken with the natural base, `e`. To get
    a logarithm of a different base ``b``, use ``log(x, b)``,
    which is essentially short-hand for ``log(x)/log(b)``.

    ``log`` represents the principal branch of the natural
    logarithm. As such it has a branch cut along the negative
    real axis and returns values having a complex argument in
    `(-\pi, \pi]`.

    Examples
    ========

    >>> from sympy import log, sqrt, S, I
    >>> log(8, 2)
    3
    >>> log(S(8)/3, 2)
    -log(3)/log(2) + 3
    >>> log(-1 + I*sqrt(3))
    log(2) + 2*I*pi/3

    See Also
    ========

    exp

    r3   r)   c                 C   s$   |dkrd| j d  S t| |dS )z?
        Returns the first derivative of the function.
        r)   r   N)r3   r   r,   r'   r'   r(   rz   p  s    z	log.fdiffc                 C   s   t S )zC
        Returns `e^x`, the inverse function of `\log(x)`.
        )r#   r,   r'   r'   r(   r.   y  s    zlog.inverseNc              )   C   s$  ddl m} ddlm} ddl m} t|}|d urt|}|dkrX|dkrRtjS tjS zBt	||}|r|t
|||  t
|  W S t
|t
| W S W n ty   Y n0 |tjur| || | S | |S |jrJ|jrtjS |tju rtjS |tju rtjS |tju rtjS |tju r*tjS |jrJ|jdkrJ| |j S |jrp|jtju rp|jjrp|jS tj}t|tr|jjr|jS t|tr|jjrt|j\}}	|	r`|	jr`|	dtj ; }	|	tjkr|	dtj 8 }	|t |	| dd S n^t|t!r||jS t||rJ|j"j#rD|t
|j"t
|j$S d S nt|t%r`|&| S |jr|j'rtj| | |  S |tju rtjS |tju rtjS |jrtjS |j(s:|)|}
|
d ur:|
tju rtjS |
tju rtjS |
jr:|
j*rtj| tj+ | |
 S tj | tj+ | |
  S |jr |j,r |j-|dd	\}
}|
j'rt|
d
9 }
|d
9 }t |dd}|j-|dd	\}}	|	)|}	|
j.r |	r |	j.r |j.r |jr|	j#rtj| tj+ | |
|	  S |	j'r tj | tj+ | |
|	   S nddl/m0} |	| 1 }| 1 }t2dtjd dtjd t2ddt2d  tjd t2dt2dt2d  dt2d  tjd t2ddt2d  tjt3dd t2dt2t2dd  d
t2d  tjt3dd t2dd tjd t2dd tjd t2dt2d t2t2dd  tjd t2dd tjt3dd t2t2dd t2dt2d  tjt3dd t2ddt2d d  tjd t2d t2d dt2t2dd   tjd t2ddt2d d  tjt3dd t2dt2d dt2dt2d   tjt3dd dt2d tjd d
t2d dt2d  tjd dt2d tjt3dd dt2d d
t2d  tjt3dd i}||v r||
|| }|j#r| ||||   S | |||| tj   S nR||v r ||
|| }|j#r| ||||    S | ||tj||    S d S )Nr   
unpolarifyr   )Absr)   r}   Fr   r   r   T)ratsimpr   r      r      
      )4rb   r   r   r   r   r   r   r   r]   r   r+   
ValueErrorrv   r   rA   r0   r   r   rF   r   r   r   r   ru   r#   rm   r   rU   r   r   rq   r   r
   r`   r   r   r   r    r   r/   rT   r   is_nonnegativer   r   r   r   Zsympy.simplifyr   r   r   r   )rw   r?   ru   r   r   r   r   r   r   r   r   Zarg_r   r   t1Z
atan_tablemodulusr'   r'   r(   r     s    


 





$

* 0&,,$0$

zlog.evalc                 C   s
   | t jfS )zE
        Returns this function in the form (base, exponent).
        )r   r0   r%   r'   r'   r(   r4     s    zlog.as_base_expc                 G   s   ddl m} | dk rtjS t|}| dkr.|S |rb|d }|durb||  | | | d  dddS dd	| d	   || d   | d  S )
zV
        Returns the next term in the Taylor series expansion of `\log(1+x)`.
        r   r   r   Nr)   Tr#   r   r}   )r   r   r   r   r   )r   rQ   r   r   r   r'   r'   r(   r     s     zlog.taylor_termTc                 K   s  ddl m} ddlm} ddlm}m} |dd}|dd}t| j	dkrdt
| j| j	 ||d	S | j	d }	|	jrt|	}
d }d
}|
dur|
\}	}| |	}|r||	}
|	|
 vrtdd |
 D }|d ur|| S n|	jrt|	jt|	j S |	jrg }g }|	j	D ]}|s*|js*|jrj| |}t|tr^|| |jf i | n
|| n6|jr| | }|| |tj n
|| qt| tt|  S |	j st|	t!rT|s|	j!j"r|	j#js|	j!d
 jr|	j!d
 j$s|	j#jr|	j#}|	j!}| |}t|trF|||jf i | S ||| S n4t|	|r|sp|	j%jr|t|	j%g|	j&R  S | |	S )Nr   r   )	factorint)rO   rN   forceFfactorr}   )r   r  r)   c                 s   s   | ]\}}|t | V  qd S r"   r*   )rP   valr   r'   r'   r(   rR   ?  rS   z'log._eval_expand_log.<locals>.<genexpr>)'rb   r   Zsympy.ntheory.factor_r  Zsympy.concreterO   rN   getr   r3   r	   r1   Z
is_Integerr   keyssumitemsr   r+   r   r   r~   r   rp   rU   r   _eval_expand_logr/   r   r   r   r   r   r#   rm   ru   is_nonpositiverV   rW   )r&   r   rX   r   r  rO   rN   r  r	  r?   r   Zlogargr   r   ZnonposrQ   r   rL   rM   r'   r'   r(   r  *  sl    




(

zlog._eval_expand_logc                 K   s   ddl m}m}m} t| jdkr:|| j| j fi |S | || jd fi |}|d rf||}||dd}t|| g|d dS )	Nr   )r	   simplifyinversecombiner}   r.   Tr   Zmeasure)key)r   r	   r  r  r   r3   r1   r   )r&   r   r	   r  r  r   r'   r'   r(   _eval_simplifye  s    zlog._eval_simplifyc                 K   s   ddl m}m} | jd }|r6| jd j|fi |}||}||krP| tjfS ||}|ddrd|d< t|j|fi ||fS t||fS dS )a  
        Returns this function as a complex coordinate.

        Examples
        ========

        >>> from sympy import I, log
        >>> from sympy.abc import x
        >>> log(x).as_real_imag()
        (log(Abs(x)), arg(x))
        >>> log(I).as_real_imag()
        (0, pi/2)
        >>> log(1 + I).as_real_imag()
        (log(sqrt(2)), pi/4)
        >>> log(I*x).as_real_imag()
        (log(Abs(x)), arg(I*x))

        r   )r   r?   r+   FcomplexN)	rb   r   r?   r3   r   r   r   r  r+   )r&   r   rX   r   r?   Zsargabsr'   r'   r(   r   p  s    

zlog.as_real_imagc                 C   s\   | j | j }|j | j krR| jd d jr,dS |jd jrXt| jd d jrXdS n|jS d S Nr   r)   TF)r1   r3   rA   rB   r   r&   rC   r'   r'   r(   rE     s     zlog._eval_is_rationalc                 C   s\   | j | j }|j | j krR| jd d jr,dS t| jd d jrX| jd jrXdS n|jS d S r  )r1   r3   rA   r   r   r  r'   r'   r(   r     s    zlog._eval_is_algebraicc                 C   s   | j d jS rl   r3   r<   r%   r'   r'   r(   rn     s    zlog._eval_is_extended_realc                 C   s   | j d }t|jt|jgS rl   )r3   r   r   r   rA   )r&   rD   r'   r'   r(   r     s    
zlog._eval_is_complexc                 C   s   | j d }|jrdS |jS Nr   F)r3   rA   r=   r>   r'   r'   r(   r@     s    
zlog._eval_is_finitec                 C   s   | j d d jS Nr   r)   r  r%   r'   r'   r(   r     s    zlog._eval_is_extended_positivec                 C   s   | j d d jS r  )r3   rA   r%   r'   r'   r(   rG     s    zlog._eval_is_zeroc                 C   s   | j d d jS r  )r3   Zis_extended_nonnegativer%   r'   r'   r(   _eval_is_extended_nonnegative  s    z!log._eval_is_extended_nonnegativer   c              
      s&  ddl m} ddlm} ddlm} ddlm} ddlm	 |sHt
|}| jd |krZ|S | jd }	tdtd }
}|	|
||  }|d ur||
 ||  }
}|dkr||s|
|st
|
||  }|S d	d
 }z&|	|\}}|	j| | |d}W nN tttfyN   |	j| |d}|jrJ d7  |	j| |d}q&Y n0 | |\}}|||||   d   }|tr||}t||r|  |||\}}|jst
|||  ||  | S  fdd}i }t|D ].}|||\}}||tj |  ||< qtj!}
i }|}|
|  k rtj"|
  |
 }|D ]$}||tj |||   ||< qZ|||}|
tj!7 }
q8t
|||  }|D ]}||| ||  7 }q|dkr| jd #||}|j$r|j%r||dk r|dt& tj' 8 }|||  | S )Nr   )re   )r   r   r   )productkr   c              	   S   s   t jt j }}t| D ]^}||rn| \}}||krvz| |W   S  tyj   | t jf Y   S 0 q||9 }q||fS r"   )	r   r0   r   r   r   hasr4   leadtermr  )r   rQ   r   r#   r	  ru   r'   r'   r(   	coeff_exp  s    

z$log._eval_nseries.<locals>.coeff_expr   r)   c                    sN   i }| |D ]:\}}|| }| k r| |tj| | ||   ||< q|S r"   )r  r   r   )Zd1Zd2rk   e1e2exr   r  r'   r(   mul  s    $zlog._eval_nseries.<locals>.mulr}   )(rb   re   Zsympy.polys.polytoolsr   r   r   r   r   	itertoolsr  r+   r3   r   matchr  r   r   r  r   r   r   r   r   r   r#   rU   r   r   r   r   r  r   r   r0   r   dirr   r/   r   r   )r&   rQ   r   r   r   re   r   r   r   r?   r  r   r   r!  r   rL   rC   r   _dr&  Zptermsr   Zco1r"  r   pkr   r$  rk   r'   r%  r(   r     sr    
 "

zlog._eval_nseriesc           	      C   s   ddl m}m} | jd  }|j||d}||d}|tju rh|d u rh|j	|d||j
r`dndd}|tjtjfv rtd|  |dkr|tj |S |dkr|||}|jr|j
r||j
r| |d	t tj  S | |S )
Nr   rd   )r   -+)r)  r   r)   r}   )rb   re   ra   r3   Ztogetherr   r   r   r   r   r/   rF   r   r   r0   r)  r   r1   r   r   )	r&   rQ   r   r   re   ra   r   r?   Zx0r'   r'   r(   r     s    zlog._eval_as_leading_term)r)   )r)   )N)T)T)r   )Nr   ) rZ   r[   r\   ro   tTupler   __annotations__r   r   r]   r^   rz   r.   r   r   r4   r   r   r   r  r  r   rE   r   rn   r   r@   r   rG   r  r   r   r'   r'   r'   r(   r+   J  s2   
!
	
 
;
!

Yr+   c                       s|   e Zd ZdZeejddd ejfZe	dddZ
dd	d
Zdd Zdd Zdd ZdddZd fdd	Zdd Z  ZS )LambertWa  
    The Lambert W function $W(z)$ is defined as the inverse
    function of $w \exp(w)$ [1]_.

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

    In other words, the value of $W(z)$ is such that $z = W(z) \exp(W(z))$
    for any complex number $z$.  The Lambert W function is a multivalued
    function with infinitely many branches $W_k(z)$, indexed by
    $k \in \mathbb{Z}$.  Each branch gives a different solution $w$
    of the equation $z = w \exp(w)$.

    The Lambert W function has two partially real branches: the
    principal branch ($k = 0$) is real for real $z > -1/e$, and the
    $k = -1$ branch is real for $-1/e < z < 0$. All branches except
    $k = 0$ have a logarithmic singularity at $z = 0$.

    Examples
    ========

    >>> from sympy import LambertW
    >>> LambertW(1.2)
    0.635564016364870
    >>> LambertW(1.2, -1).n()
    -1.34747534407696 - 4.41624341514535*I
    >>> LambertW(-1).is_real
    False

    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Lambert_W_function
    r   FrH   Nc                 C   sZ  |t jkr| |S |d u r t j}|jr|jr2t jS |t ju rBt jS |dt j krVt jS |td d krrtd S |dtd krtdS |t j d krt jt j d S |t	dt j krt jS |t j
u rt j
S |jrt jS t|jr|jrt jS |t ju rV|t j d kr$t j t j d S |dt j kr:t jS |dt	d krVtd S d S )Nr   r}   r)   )r   r   rA   rv   r0   r   r+   r   r   r#   r   r   rF   r   )rw   rQ   r  r'   r'   r(   r   M  sB    




zLambertW.evalr)   c                 C   sv   | j d }t| j dkr:|dkrht||dt|   S n.| j d }|dkrht|||dt||   S t| |dS )z?
        Return the first derivative of this function.
        r   r)   N)r3   r   r1  r   )r&   r-   rQ   r  r'   r'   r(   rz   s  s    

zLambertW.fdiffc                 C   s   | j d }t| j dkr tj}n
| j d }|jrZ|dtj  jrDdS |dtj  jrdS nb|d jr|jr~|dtj  jr~dS |js|dtj  j	rdS n"t
|jrt
|d jr|jrdS d S r  )r3   r   r   r   rA   rv   r   r  r/   r  r   rm   )r&   rQ   r  r'   r'   r(   rn     s"    


zLambertW._eval_is_extended_realc                 C   s   | j d jS rl   )r3   r=   r%   r'   r'   r(   r@     s    zLambertW._eval_is_finitec                 C   sD   | j | j }|j | j kr:t| jd jr@| jd jr@dS n|jS d S r  )r1   r3   r   rA   r   r  r'   r'   r(   r     s
    zLambertW._eval_is_algebraicr   c                 C   sF   t | jdkrB| jd }||d }|js8| |S ||S d S )Nr)   r   )r   r3   r   r   rA   r1   r   r   r'   r'   r(   r     s    

zLambertW._eval_as_leading_termc           
         s   t | jdkrddlm} ddlm} | jd j|||d  j||d}d}|jrZ|j	}||| dkrt
 fddtd||| D  }	t|	}	ntj}	|	||| | S t |||S )	Nr)   r   r   r   r   r   c                    s@   g | ]8}t j |d   t||d   t|d    |  qS )r)   r}   )r   r0   r   r   )rP   r  r   r'   r(   r     s   
z*LambertW._eval_nseries.<locals>.<listcomp>)r   r3   r   r   r   r   r   Zcompute_leading_termr   r#   r   r   r   r   r   superr   )
r&   rQ   r   r   r   r   r   ltZlterC   rs   r   r(   r     s     
zLambertW._eval_nseriesc                 C   s8   | j d }t| j dkr|jS t|j| j d jgS d S r  )r3   r   rA   r   )r&   rQ   r'   r'   r(   rG     s    
zLambertW._eval_is_zero)N)r)   )Nr   )r   )rZ   r[   r\   ro   r   r   rv   r]   r^   r   r   rz   rn   r@   r   r   r   rG   __classcell__r'   r'   r5  r(   r1  (  s   "%

r1  N)8typingr   r/  Zsympy.core.exprr   Z
sympy.corer   Zsympy.core.addr   Zsympy.core.cacher   Zsympy.core.functionr   r   r	   r
   r   r   r   r   Zsympy.core.logicr   r   r   Zsympy.core.mulr   Zsympy.core.numbersr   r   r   r   Zsympy.core.parametersr   Zsympy.core.powerr   Zsympy.core.singletonr   Zsympy.core.symbolr   r   Z(sympy.functions.combinatorial.factorialsr   Z(sympy.functions.elementary.miscellaneousr   Zsympy.ntheoryr   r   Zsympy.sets.setexprr    r!   r`   rr   r#   r   r+   r1  r'   r'   r'   r(   <module>   s8   (fK  ^   a