a
    RG5di                     @   s  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 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 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.m/Z/m0Z0m1Z1m2Z2 d dl3m4Z4 d dl5m6Z6m7Z7 d dl8m9Z9 d dl: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<e>dZ?dd Z@G d d! d!eZAG d"d# d#eZBd$S )%    )product)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ImaginaryUnit)global_parameters)Pow)S)WildDummy)	factorial)arg
unpolarifyimreAbs)sqrt)multiplicityperfect_power)	factorint)cancelc                   @   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/   b/var/www/html/django/DPS/env/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/   r0   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_negativecould_extract_minus_signr   Onefunc)r.   r+   neg_expr/   r/   r0   as_numer_denom3   s    zExpBase.as_numer_denomc                 C   s
   | j d S )z7
        Returns the exponent of the function.
        r   )argsr-   r/   r/   r0   r+   K   s    zExpBase.expc                 C   s   |  dt| j fS )z7
        Returns the 2-tuple (base, exponent).
        r1   )r:   r   r=   r-   r/   r/   r0   as_base_expR   s    zExpBase.as_base_expc                 C   s   |  | j S r*   )r:   r+   adjointr-   r/   r/   r0   _eval_adjointX   s    zExpBase._eval_adjointc                 C   s   |  | j S r*   )r:   r+   	conjugater-   r/   r/   r0   _eval_conjugate[   s    zExpBase._eval_conjugatec                 C   s   |  | j S r*   )r:   r+   	transposer-   r/   r/   r0   _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.   r   r/   r/   r0   _eval_is_finitea   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 rE   )r:   r=   r+   is_zerois_rationalr   )r.   szr/   r/   r0   _eval_is_rationalk   s    zExpBase._eval_is_rationalc                 C   s   | j tju S r*   )r+   r   NegativeInfinityr-   r/   r/   r0   _eval_is_zerov   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)r>   r   _eval_power)r.   otherber/   r/   r0   rU   y   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*   )r:   ).0xr-   r/   r0   	<genexpr>       z1ExpBase._eval_expand_power_exp.<locals>.<genexpr>)sympy.concrete.productsrY   sympy.concrete.summationsrZ   r=   is_Addis_commutativer   fromiter
isinstancer:   functionlimits)r.   hintsrY   rZ   r   r/   r-   r0   _eval_expand_power_exp   s    
zExpBase._eval_expand_power_expN)r1   )__name__
__module____qualname__Z
unbranchedr   ComplexInfinity_singularitiespropertyr,   r6   r<   r+   r>   r@   rB   rD   rK   rP   rR   rU   rh   r/   r/   r/   r0   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 do not "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   t t| jd S Nr   )r+   r"   r=   r-   r/   r/   r0   	_eval_Abs   s    zexp_polar._eval_Absc                 C   sx   t | jd }z|t kp |tk}W n ty:   d}Y n0 |rD| S t| jd |}|dkrtt |dk rtt|S |S )z. Careful! any evalf of polar numbers is flaky r   T)r!   r=   r   	TypeErrorr+   _eval_evalfr"   )r.   precibadresr/   r/   r0   rs      s    
zexp_polar._eval_evalfc                 C   s   |  | jd | S rp   )r:   r=   )r.   rV   r/   r/   r0   rU      s    zexp_polar._eval_powerc                 C   s   | j d jrdS d S )Nr   T)r=   is_extended_realr-   r/   r/   r0   _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 rp   )r=   r   r9   r)   r>   r-   r/   r/   r0   r>      s    
zexp_polar.as_base_expN)ri   rj   rk   __doc__is_polaris_comparablerq   rs   rU   ry   r>   r/   r/   r/   r0   ro      s   %ro   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__rd   r   baser   Exp1)clsinstancer/   r/   r0   __instancecheck__   s    zExpMeta.__instancecheck__N)ri   rj   rk   r   r/   r/   r/   r0   r}      s   r}   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
    r1   c                 C   s   |dkr| S t | |dS )z@
        Returns the first derivative of this function.
        r1   N)r	   r4   r/   r/   r0   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   )sympy.assumptionsr   r   r=   is_Mulr   r   InfinityNaNas_coefficientPiintegerevenr9   oddNegativeOneHalf)r.   assumptionsr   r   r   Ioocoeffr/   r/   r0   _eval_refine   s"    
zexp._eval_refinec                 C   s  ddl m} ddlm} ddlm} ddlm} t||rB|	 S t
jrTttj|S |jr|tju rjtjS |jrvt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||r|| S |jr|tjtj }|rd| j rz|j!r@tjS |j"rNtj#S |tj$ j!rdt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 rH|j'rD|tju r| }t(|jr|tjurtjS t(|j)r2t*|tjur2tjS t(|j+rDt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 q^|
r|
t,|	  S d S |j0rxg }g }d}|jD ]p}|tju r |/| q| |}t|| rF|jd |kr:|/|jd  d	}n
|/| n
|/| q|s`|rxt,| | t1| dd
 S |jrtjS d S )Nr   AccumBounds)
MatrixBaseSetExpr
logcombiner   r1   FTrS   )2sympy.calculusr   sympy.matrices.matricesr   sympy.sets.setexprr   sympy.simplify.simplifyr   rd   r+   r   
exp_is_powr   r   r   	is_Numberr   rL   r9   r   rQ   Zerorl   r3   r=   minmax
_eval_funcr   r   r   r   
is_integeris_evenis_oddr   r   is_Rationalas_coeff_Mul	is_numberr"   is_positiver!   r7   r   	make_argsr|   appendra   r   )r   r   r   r   r   r   r   ncoefftermscoeffslog_termtermZterm_outadd
argchangedanewar/   r/   r0   eval  s    















zexp.evalc                 C   s   t jS )z?
        Returns the base of the exponential function.
        )r   r   r-   r/   r/   r0   r   |  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   r9   r   r   )nr\   previous_termspr/   r/   r0   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   r=   as_real_imagexpandr+   )r.   deeprg   r   r   r"   r!   r/   r/   r0   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 )NrT   F)is_Powrd   r+   r   r>   )r   r/   r/   r0   <lambda>  s
    z exp._eval_subs.<locals>.<lambda>)r   r+   r3   r   r   r   is_Functionrd   r   
_eval_subs_subsr   )r.   oldnewfr/   r/   r0   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   )r=   rx   is_imaginaryr   r   r   r   r.   arg2r/   r/   r0   ry     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_complexrG   r   r/   r/   r0   complex_extended_negative  s    z7exp._eval_is_complex.<locals>.complex_extended_negativer   )r   r=   )r.   r   r/   r/   r0   _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 rE   )r+   r   r   r   rM   r   rL   is_algebraicr-   r/   r/   r0   _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 rp   )	r+   rx   r=   r   rQ   r   r   r   r   r   r/   r/   r0   _eval_is_extended_positive  s
    zexp._eval_is_extended_positiver   c              	      s  ddl m  ddlm} ddlm} ddlm} ddlm	} | j
}	|	j|||d}
|
jr`d|
 S ||
 |d}|tju r||| |S |tju r| S t fd	d
|jD r| S td}|}z||	j||d| }W n ttfy   d}Y n0 |r|dkr||| }t
|||}t
||||
|  }||t|| krT|S |r|dkr|||
| | |||d |   7 }n|||
| | |7 }| }||ddd}dd }td|gd}|tj| ttj| }|S )Nr   signceiling)limitOrderpowsimpr   logxr1   c                 3   s   | ]}t | tfV  qd S r*   )rd   r   )r[   r   r   r/   r0   r]     r^   z$exp._eval_nseries.<locals>.<genexpr>tr   Tr+   r   combinec                 S   s   | j o| jdv S )N)         )r   q)r\   r/   r/   r0   r     r^   z#exp._eval_nseries.<locals>.<lambda>w)
properties) $sympy.functions.elementary.complexesr   #sympy.functions.elementary.integersr   sympy.series.limitsr   sympy.series.orderr   sympy.simplify.powsimpr   r+   _eval_nseriesis_OrderremoveOr   rQ   r   anyr=   r   as_leading_termgetnNotImplementedErrorr   _taylorsubsr3   r   r   replacer   r   )r.   r\   r   r   cdirr   r   r   r   r   Z
arg_seriesarg0r   ntermscf
exp_seriesrZ	simpleratr   r/   r   r0   r     sJ    


(zexp._eval_nseriesc                 C   sN   g }d }t |D ]4}| || jd |}|j||d}||  qt| S )Nr   r   )ranger   r=   nseriesr   r   r   )r.   r\   r   lgru   r/   r/   r0   r     s    zexp._taylorNc                 C   s   ddl m} | jd  j||d}||d}|tju r@tjS t||rjt	|tj
k rbt| S t|S |tju r||d}|jdu rt|S td|  d S )Nr   r   r   FCannot expand %s around 0)sympy.calculus.utilr   r=   r(   r   r   r   r   rd   r"   r   r+   r   rF   r   )r.   r\   r   r   r   r   r   r/   r/   r0   _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/   r0   _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/   r0   _eval_rewrite_as_cos/  s    zexp._eval_rewrite_as_cosc                 K   s,   ddl m} d||d  d||d   S )Nr   )tanhr1   r   )%sympy.functions.elementary.hyperbolicr  )r.   r   r  r  r/   r/   r0   _eval_rewrite_as_tanh4  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   rd   )r.   r   r  r   r   r   cosinesiner/   r/   r0   _eval_rewrite_as_sqrt8  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 )r1   )rd   r3   lenr=   )r[   r   r/   r/   r0   
<listcomp>C  r^   z,exp._eval_rewrite_as_Pow.<locals>.<listcomp>r   )r   r=   r   r   )r.   r   r  logsr/   r/   r0   _eval_rewrite_as_PowA  s    zexp._eval_rewrite_as_Pow)r1   )T)r   )Nr   )ri   rj   rk   rz   r   r   classmethodr   rn   r   staticmethodr   r   r   r   ry   r   r   r   r   r   r  r  r  r  r  r  r/   r/   r/   r0   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as_Addr   )NNN)as_independentr   r   is_realr   )exprr_i_r/   r/   r0   match_real_imagH  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 )2r3   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

    r=   r1   c                 C   s$   |dkrd| j d  S t| |dS )z?
        Returns the first derivative of the function.
        r1   r   N)r=   r	   r4   r/   r/   r0   r     s    z	log.fdiffc                 C   s   t S )zC
        Returns `e^x`, the inverse function of `\log(x)`.
        )r+   r4   r/   r/   r0   r6     s    zlog.inverseNc              )   C   s6  ddl m} ddlm} t|}|d urt|}|dkrL|dkrFtjS tjS zBt||}|rz|t	|||  t	|  W S t	|t	| W S W n t
y   Y n0 |tjur| || | S | |S |jr>|jrtjS |tju rtjS |tju  rtjS |tju rtjS |tju rtjS |jr>|jdkr>| |j S |jrd|jtju rd|jjrd|jS tj}t|tr|jjr|jS t|tr|jjrt|j\}}|rr|jrr|dtj ; }|tjkr|dtj 8 }|t|| dd S n|t|t rt!|jS t||r\|j"j#r8|t	|j"t	|j$S |j"jrT|tjt	|j$S tjS nt||rr|%| S |jr|j&rtj| | |  S |tju rtjS |tju rtjS |jrtjS |j'sL|(|}	|	d urL|	tju rtjS |	tju rtjS |	jrL|	j)r0tj| tj* | |	 S tj | tj* | |	  S |jr2|j+r2|j,|dd\}	}
|	j&r|	d	9 }	|
d	9 }
t|
dd}
|
j,|d
d\}}|(|}|	j-r2|r2|j-r2|j-r2|jr$|j#rtj| tj* | |	|  S |j&r2tj | tj* | |	|   S nddl.m/} || 0 }| 0 }t1dtjd dtjd t1ddt1d  tjd t1dt1dt1d  dt1d  tjd t1ddt1d  tjt2dd t1dt1t1dd  d	t1d  tjt2dd t1dd tjd t1dd tjd t1dt1d t1t1dd  tjd t1dd tjt2dd t1t1dd t1dt1d  tjt2dd t1ddt1d d  tjd t1d t1d dt1t1dd   tjd t1ddt1d d  tjt2dd t1dt1d dt1dt1d   tjt2dd dt1d tjd d	t1d dt1d  tjd dt1d tjt2dd dt1d d	t1d  tjt2dd i}||v r||	t3|
 }|j#r| ||||   S | |||| tj   S nR||v r2||	t3|
 }|j#r| ||||    S | ||tj||    S d S )Nr   r   r   r1   r   Fr   r  r   T)ratsimpr   r      r      
      )4r   r   r   r   r   r   r   rl   r%   r3   
ValueErrorr   r   rL   r9   r   r   rQ   r   r   r   r   r   r+   rx   r   rd   r   r#  r|   r   r   ro   r    r   r   r   r   r7   ra   r   is_nonnegativer   r   r  r  sympy.simplifyr%  r(   r$   r   r#   )r   r   r   r   r   r   r   r!  r"  r   arg_r%  r   t1Z
atan_tablemodulusr/   r/   r0   r     s    


 






$

* 0&,,$0$

zlog.evalc                 C   s
   | t jfS )zE
        Returns this function in the form (base, exponent).
        )r   r9   r-   r/   r/   r0   r>   &  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   Nr1   Tr+   r   r   )r   r   r   r   r   )r   r\   r   r   r   r/   r/   r0   r   ,  s     zlog.taylor_termTc                 K   sx  ddl m}m} |dd}|dd}t| jdkrLt| j| j ||dS | jd }|jrt	|}d }	d}
|dur|\}}
| |}	|rt
|}|| 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rR| |}t|trF|| |jf i | n
|| q|jr~| | }|| |tj q|| qt| tt|  S |jst|tr:|s|jjr|j js|jd jr|jd j!s|j jrn|j }|j}| |}t|tr,t"||jf i | S t"|| S n4t||rn|sV|j#jrn|t|j#g|j$R  S | |S )Nr   )rZ   rY   forceFfactorr   )r   r0  r1   c                 s   s   | ]\}}|t | V  qd S r*   r2   )r[   valr   r/   r/   r0   r]   Q  r^   z'log._eval_expand_log.<locals>.<genexpr>)%Zsympy.concreterZ   rY   getr  r=   r
   r:   
is_Integerr&   r'   keyssumitemsr   r3   r   r   r   r   r{   rd   r   _eval_expand_logr7   r   r   r   r   r   r+   rx   r   is_nonpositiver    re   rf   )r.   r   rg   rZ   rY   r0  r1  r   r   Zlogargr   r   nonposr\   r   rW   rX   r/   r/   r0   r8  >  sh    




(

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   r6   Tr$  measure)key)r   r
   r;  r<  r  r=   r:   r   )r.   r  r
   r;  r<  r   r/   r/   r0   _eval_simplifyw  s    zlog._eval_simplifyc                 K   s   | j d }|r&| j d j|fi |}t|}||kr@| tjfS t|}|ddrvd|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   r3   FcomplexN)r=   r   r#   r   r   r   r3  r3   )r.   r   rg   ZsargZsarg_absZsarg_argr/   r/   r0   r     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   r1   TF)r:   r=   rL   rM   r   r.   rN   r/   r/   r0   rP     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 rA  )r:   r=   rL   r   r   rB  r/   r/   r0   r     s    zlog._eval_is_algebraicc                 C   s   | j d jS rp   r=   rH   r-   r/   r/   r0   ry     s    zlog._eval_is_extended_realc                 C   s   | j d }t|jt|jgS rp   )r=   r   r   r   rL   )r.   rO   r/   r/   r0   r     s    
zlog._eval_is_complexc                 C   s   | j d }|jrdS |jS Nr   F)r=   rL   rI   rJ   r/   r/   r0   rK     s    
zlog._eval_is_finitec                 C   s   | j d d jS Nr   r1   rC  r-   r/   r/   r0   r     s    zlog._eval_is_extended_positivec                 C   s   | j d d jS rE  )r=   rL   r-   r/   r/   r0   rR     s    zlog._eval_is_zeroc                 C   s   | j d d jS rE  )r=   is_extended_nonnegativer-   r/   r/   r0   _eval_is_extended_nonnegative  s    z!log._eval_is_extended_nonnegativer   c                     s  ddl m} ddlm} |}|s(t|}| jd |kr:|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y.   |j
| |d}|jr* d	7  |j
| |d}qY n0 |rZ||rZ|j||d
tj }}nHz| 	|\}}W n0 tttfy   | |tj }}Y n0 t||||   d	   }|tr||}t||r|  |||\}}|jst|||  }|}tdddddddddd	}| jf i |}| st| rt|| t| jf i |}n||t|jf i |}||kr|S |||  | S  fdd}i }t|D ].}|||\}}||tj|  ||< qtj }	i }|}|	|  k rhtj!|	  |	 }|D ]$}||tj|||   ||< q*|||}|	tj 7 }	qt|||  }|D ]}||| ||  7 }q||dkr| jd "||}|j#r|j$rt%|dk r|dt& tj' 8 }|||  | S )Nr   r   r   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   r9   r   r   r   hasr>   leadtermr*  )r   r\   r   r+   r1  r   r/   r/   r0   	coeff_exp  s    

z$log._eval_nseries.<locals>.coeff_expr   r1   r   TF)	r   r3   mul	power_exp
power_basemultinomialbasicr0  r1  c                    sN   i }t | |D ]:\}}|| }| k r||tj| | ||   ||< q|S r*   )r   r3  r   r   )d1d2rw   e1e2exr  r/   r0   rL    s    $zlog._eval_nseries.<locals>.mulr   )(r   r   r   r   r3   r=   r   matchrI  rJ  r  r*  r   r   r   r   r   r   r   r(   r   r   r+   rd   r   r   dictr8   r   r   r   r3  r9   r   dirr  r7   r!   r   r   ) r.   r\   r   r   r   r   r   _logxr   rH  r  r  rK  r   rW   rN   r   _drw   _reslogflagsr   rL  Zptermsr   co1rS  r   pkr   rU  r/   r  r0   r     s    
 

"
"

zlog._eval_nseriesc                 C   s  | j d  }tdddd}|dkr(d}|||| }z|j||dd\}}W n* tyz   |j|||d}	t|	 Y S 0 ||r|||| }|dkrt	d|  t|S |t
jkr|t
jkr|t
j j||dS t||t|  }
|d u r t|n|}|
|| 7 }
|jrt|dkrdd	lm} t||D ]"\}}|jrZ|d
kr@ qdq@|d
k r||\}}|
dt t
j |t| d 7 }
|
S )Nr   r   T)realpositiver1   )r   r   r	  r   )	Heavisider&  )r=   togetherr   r   rJ  r*  r   r3   rI  r   r   r9   r   r7   r!   'sympy.functions.special.delta_functionsrb  	enumeratelseriesr  as_coeff_exponentr   r   )r.   r\   r   r   r   r   rO   crX   r   rw   rb  ru   r   r   rZ  r/   r/   r0   r  7  s:    


"zlog._eval_as_leading_term)r1   )r1   )N)T)T)r   )Nr   ) ri   rj   rk   rz   tTupler   __annotations__r   r   rl   rm   r   r6   r  r   r>   r  r   r   r8  r?  r   rP   r   ry   r   rK   r   rR   rG  r   r  r/   r/   r/   r0   r3   ]  s2   
!
	
 
9
 

jr3   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   FrS   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   r1   rc  )r   r   rL   r   r9   r   r3   r   r   r+   r   r   rQ   r   )r   r\   rH  r/   r/   r0   r     sB    




zLambertW.evalr1   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   r1   N)r=   r  rl  r	   )r.   r5   r\   rH  r/   r/   r0   r     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 rA  )r=   r  r   r   rL   r   r   r9  r7   r+  r   rx   )r.   r\   rH  r/   r/   r0   ry     s"    


zLambertW._eval_is_extended_realc                 C   s   | j d jS rp   )r=   rI   r-   r/   r/   r0   rK     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 rD  )r:   r=   r   rL   r   rB  r/   r/   r0   r     s
    zLambertW._eval_is_algebraicr   c                 C   sF   t | jdkrB| jd }||d }|js8| |S ||S d S )Nr1   r   )r  r=   r   r(   rL   r:   r   )r.   r\   r   r   r   r   r/   r/   r0   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 )	Nr1   r   r   r   r   r   c                    s@   g | ]8}t j |d   t||d   t|d    |  qS )r1   r   )r   r9   r   r   )r[   rH  r   r/   r0   r    s   
z*LambertW._eval_nseries.<locals>.<listcomp>)r  r=   r   r   r   r   r  compute_leading_termr   r+   r   r  r   r   r   superr   )
r.   r\   r   r   r   r   r   ltlterN   r~   r   r0   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 rE  )r=   r  rL   r   )r.   r\   r/   r/   r0   rR     s    
zLambertW._eval_is_zero)N)r1   )Nr   )r   )ri   rj   rk   rz   r   r   r   rl   rm   r  r   r   ry   rK   r   r  r   rR   __classcell__r/   r/   rq  r0   rl  d  s   "%

rl  N)C	itertoolsr   typingr   rj  sympy.core.exprr   
sympy.corer   Zsympy.core.addr   sympy.core.cacher   sympy.core.functionr   r	   r
   r   r   r   r   r   sympy.core.logicr   r   r   sympy.core.mulr   sympy.core.numbersr   r   r   r   r   Zsympy.core.parametersr   sympy.core.powerr   sympy.core.singletonr   sympy.core.symbolr   r   (sympy.functions.combinatorial.factorialsr   r   r   r    r!   r"   r#   (sympy.functions.elementary.miscellaneousr$   sympy.ntheoryr%   r&   sympy.ntheory.factor_r'   sympy.polys.polytoolsr(   r)   ro   r}   r+   r#  r3   rl  r/   r/   r/   r0   <module>   s@   (fI  p    