o
    8Va                     @   s@  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 d dlmZmZ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 d dlmZ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&e(dZ)dd Z*G dd deZ+G dd deZ,dS )    )sympify)Add)cacheit)FunctionArgumentIndexError_coeff_isneg
expand_mulFunctionClass	PoleError)	fuzzy_and	fuzzy_notfuzzy_or)Mul)IntegerRational)global_parameters)Pow)S)WildDummy)	factorial)sqrt)multiplicityperfect_powerc                   @   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    H/usr/lib/python3/dist-packages/sympy/functions/elementary/exponential.pyr   #   s   zExpBase.kind   c                 C      t S )z=
        Returns the inverse function of ``exp(x)``.
        logr   argindexr    r    r!   inverse'      zExpBase.inversec                 C   s@   | j }|j}|s| jst|}|rtj| | fS | tjfS )a7  
        Returns this with a positive exponent as a 2-tuple (a fraction).

        Examples
        ========

        >>> from sympy.functions 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_negativer   r   Onefunc)r   r   Zneg_expr    r    r!   as_numer_denom-   s   
zExpBase.as_numer_denomc                 C   s
   | j d S )z7
        Returns the exponent of the function.
        r   )argsr   r    r    r!   r   E   s   
zExpBase.expc                 C   s   |  dt| j fS )z7
        Returns the 2-tuple (base, exponent).
        r"   )r,   r   r.   r   r    r    r!   as_base_expL   s   zExpBase.as_base_expc                 C      |  | j S r   )r,   r   Zadjointr   r    r    r!   _eval_adjointR      zExpBase._eval_adjointc                 C   r0   r   )r,   r   	conjugater   r    r    r!   _eval_conjugateU   r2   zExpBase._eval_conjugatec                 C   r0   r   )r,   r   Z	transposer   r    r    r!   _eval_transposeX   r2   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   sJ   | j | j }|j | j kr"|jj}|rdS |jjrt|r dS d S d S |jS r6   )r,   r.   r   is_zerois_rationalr   )r   szr    r    r!   _eval_is_rationale   s   zExpBase._eval_is_rationalc                 C   s   | j tju S r   )r   r   NegativeInfinityr   r    r    r!   _eval_is_zerop      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    r!   rH   s   s   zExpBase._eval_powerc                    st   ddl m}m}  jd }|jr |jr t fdd|jD S t||r5|jr5| 	|j
g|jR  S  	|S )Nr   SumProductc                 3   s    | ]}  |V  qd S r   )r,   ).0xr   r    r!   	<genexpr>}   s    z1ExpBase._eval_expand_power_exp.<locals>.<genexpr>)sympyrM   rN   r.   is_AddZis_commutativer   Zfromiter
isinstancer,   functionlimits)r   hintsrM   rN   r<   r    r   r!   _eval_expand_power_expy   s   

zExpBase._eval_expand_power_expNr"   )__name__
__module____qualname__Z
unbranchedr   ComplexInfinity_singularitiespropertyr   r(   r-   r   r/   r1   r4   r5   r=   rB   rD   rH   rX   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   r.   )r   ra   r    r    r!   	_eval_Abs   s   zexp_polar._eval_Absc                 C   s   ddl m}m}m} || jd }z|| kp||k}W n ty'   d}Y nw |r,| S t| jd |}|dkrD||dk rD||S |S )z. Careful! any evalf of polar numbers is flaky r   )impira   T)rR   rd   re   ra   r.   	TypeErrorr   _eval_evalf)r   Zprecrd   re   ra   iZbadresr    r    r!   rg      s   zexp_polar._eval_evalfc                 C   s   |  | jd | S Nr   )r,   r.   )r   rI   r    r    r!   rH      s   zexp_polar._eval_powerc                 C   s   | j d jrdS d S )Nr   T)r.   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 rj   )r.   r   r+   r   r/   r   r    r    r!   r/      s   

zexp_polar.as_base_expN)rZ   r[   r\   __doc__is_polaris_comparablerc   rg   rH   rl   r/   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__rT   r   baser   Exp1)clsinstancer    r    r!   __instancecheck__   s   zExpMeta.__instancecheck__N)rZ   r[   r\   rw   r    r    r    r!   rp      s    rp   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   a\  
    The exponential function, :math:`e^x`.

    Examples
    ========

    >>> from sympy.functions import exp
    >>> from sympy.abc import x
    >>> from sympy import I, pi
    >>> 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 | |)z@
        Returns the first derivative of this function.
        r"   )r   r&   r    r    r!   fdiff   s   
z	exp.fdiffc                 C   s   ddl m}m} | jd }|jrctjtj }||| fv r tjS |	tj
tj }|re||d| rg|||r>tjS |||rHtjS |||tj rVtj S |||tj ritjS d S d S d S d S )Nr   )askQ   )Zsympy.assumptionsry   rz   r.   is_Mulr   ImaginaryUnitInfinityNaNas_coefficientPiZintegerZevenr+   ZoddNegativeOneHalf)r   Zassumptionsry   rz   r<   ZIoocoeffr    r    r!   _eval_refine   s*   
zexp._eval_refinec                 C   sx  ddl m} ddlm} ddlm} ddlm}m}m	} t
||r%| S tjr.ttj|S |jrY|tju r9tjS |jr?tjS |tju rGtjS |tju rOtjS |tju rWtjS nZ|tju ratjS t
|trk|jd S t
||r{|t|jt|jS t
||r|| S |jrY|tj tj! }|rd| j"r|j#rtjS |j$rtj%S |tj& j#rt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 r|
j)r|tju r|
 }
||
jr|
tjurtjS ||
j*r||
tjurtjS ||
j+rtjS d S |gd }}t,-|
D ](}||}t
|tr@|d u r=|jd }q% d S |j.rK|/| q% d S |rW|t,|  S d S |j0rg }g }d}|jD ]:}|tju ru|/| qf| |}t
|| r|jd |kr|/|jd  d	}qf|/| qf|/| qf|s|rt,| | t1| dd
 S |jrtjS d S )Nr   AccumBoundsSetExpr)
MatrixBase)rd   
logcombinera   r{   r"   FTrF   )2sympy.calculusr   sympy.sets.setexprr   Zsympy.matrices.matricesr   rR   rd   r   ra   rT   r   r   Z
exp_is_powr   r   rt   	is_Numberr   r>   r+   r~   rC   Zeror]   r%   r.   minmax
_eval_funcr|   r   r   r}   
is_integeris_evenZis_oddr   r   is_RationalZas_coeff_Mul	is_numberis_positiver*   r   	make_argsro   appendrS   r   )ru   r<   r   r   r   rd   r   ra   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   rt   r   r    r    r!   rs   x  s   zexp.basec                 G   sT   | dk rt jS | dkrt jS t|}|r"|d }|dur"|| |  S ||  t|  S )zJ
        Calculates the next term in the Taylor series expansion.
        r   N)r   r   r+   r   r   )nrP   previous_termspr    r    r!   taylor_term  s   zexp.taylor_termTc                 K   st   ddl m}m} | jd  \}}|r%|j|fi |}|j|fi |}||||}}t|| t|| fS )aq  
        Returns this function as a 2-tuple representing a complex number.

        Examples
        ========

        >>> from sympy import I
        >>> from sympy.abc import x
        >>> from sympy.functions import exp
        >>> 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   deeprW   r   r   ra   rd   r    r    r!   r     s   zexp.as_real_imagc                 C   s   |j rt|jt|j }n
|tju r|jrt}t|ts"|tju r1dd }t	|| |||S |tu rA|jsA|| j
|| S t	| ||S )Nc                 S   s&   | j st| trt|  ddiS | S )NrG   F)is_PowrT   r   r   r/   )r   r    r    r!   <lambda>  s
   z exp._eval_subs.<locals>.<lambda>)r   r   r%   rs   r   rt   Zis_FunctionrT   r   
_eval_subsZ_subsr   )r   oldnewfr    r    r!   r     s   zexp._eval_subsc                 C   sF   | j d jrdS | j d jr!td tj | j d  tj }|jS d S )Nr   Tr{   )r.   rk   is_imaginaryr   r}   r   r   r   Zarg2r    r    r!   rl     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_complexr8   r<   r    r    r!   complex_extended_negative  s   z7exp._eval_is_complex.<locals>.complex_extended_negativer   )r   r.   )r   r   r    r    r!   _eval_is_complex  s   zexp._eval_is_complexc                 C   sJ   | j tj tj jrdS t| j jr!| j jrdS | j tj jr#dS d S d S r6   )r   r   r   r}   r?   r   r>   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 rj   )	r   rk   r.   r   rC   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}m}m}m}m}	m}
 | j}|j|||d}|j	r"d| S ||
 |d}|tju r6||| |S |tju r=| S td}|}z||j||d| }W n ttfy^   d}Y nw |rk|dkrk||| }t|||}t|||||  }|r|dkr|||| | |||d |   7 }n|||| | |7 }| }||ddd	}d
d }|	d|gd}|d| |
d| }|S )Nr   )ceilinglimitOrderpowsimpr   expand_complexr   logxr"   tr   Tr   r   Zcombinec                 S   s   | j o| jdv S )N)         )r   q)rP   r    r    r!   r     s    z#exp._eval_nseries.<locals>.<lambda>w)Z
propertiesr   )rR   r   r   r   r   r   r   r   _eval_nseriesis_OrderremoveOr   rC   r~   r   as_leading_termgetnNotImplementedErrorr
   _taylorsubsr   replace)r   rP   r   r   cdirr   r   r   r   r   r   r<   Z
arg_seriesarg0r   ZntermsZcfZ
exp_seriesrZ	simpleratr   r    r    r!   r     s<    

(zexp._eval_nseriesc                 C   sN   g }d }t |D ]}| || jd |}|j||d}||  qt| S )Nr   )r   )ranger   r.   nseriesr   r   r   )r   rP   r   lgrh   r    r    r!   r      s   zexp._taylorNc                 C   sX   | j d  j||d}||d}|tju r||d}|jdu r&t|S t	d|  )Nr   r   FCannot expand %s around 0)
r.   cancelr   r   r   r   r   r7   r   r
   r   rP   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{   )rR   r   r   r}   r   )r   r<   kwargsr   Ir    r    r!   _eval_rewrite_as_sin     &zexp._eval_rewrite_as_sinc                 K   s8   ddl m} tj}||| |||| tjd    S )Nr   )r   r{   )rR   r   r   r}   r   )r   r<   r   r   r   r    r    r!   _eval_rewrite_as_cos  r   zexp._eval_rewrite_as_cosc                 K   s,   ddl m} d||d  d||d   S )Nr   )tanhr"   r{   )rR   r   )r   r<   r   r   r    r    r!   _eval_rewrite_as_tanh  s    zexp._eval_rewrite_as_tanhc                 K   s   ddl m}m} |jr9|tjtj }|r;|jr=|tj| |tj| }}t	||s?t	||sA|tj|  S d S d S d S d S d S )Nr   )r   r   )
r   r   r   r|   r   r   r   r}   r   rT   )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 rdd |jD }|rt|d jd ||d S d S d S )Nc                 S   s(   g | ]}t |trt|jd kr|qS rY   )rT   r%   lenr.   )rO   r   r    r    r!   
<listcomp>+  s   ( z,exp._eval_rewrite_as_Pow.<locals>.<listcomp>r   )r|   r.   r   r   )r   r<   r   Zlogsr    r    r!   _eval_rewrite_as_Pow)  s   zexp._eval_rewrite_as_PowrY   Tr   rj   )rZ   r[   r\   rm   rx   r   classmethodr   r_   rs   staticmethodr   r   r   r   rl   r   r   r   r   r   r   r   r   r   r   r   r    r    r    r!   r      s2    
	
i

!	
#
			r   )	metaclassc                 C   sR   | j tjdd\}}|dkr|jr||fS |tj}|r'|jr'|jr'||fS dS )a  
    Try to match expr with a + b*I 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 ``re()``, ``im()``, ``as_real_imag()``, this helper won't force things
    by returning expressions themselves containing ``re()`` or ``im()`` and it
    doesn't expand its argument either.

    TZas_Addr   )NN)as_independentr   r}   is_realr   )exprr_i_r    r    r!   match_real_imag0  s   r   c                   @   s   e Zd ZdZ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d-d&d'Zd.d(d)ZdS )/r%   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"   c                 C   s    |dkrd| j d  S t| |)z?
        Returns the first derivative of the function.
        r"   r   )r.   r   r&   r    r    r!   rx   h  s   
z	log.fdiffc                 C   r#   )zC
        Returns `e^x`, the inverse function of `\log(x)`.
        )r   r&   r    r    r!   r(   q  r)   zlog.inverseNc                 C   sD  ddl m} ddlm} ddlm} ddlm} t|}|d urlt|}|dkr2|dkr/t	j
S t	jS zt||}|rI|t|||  t|  W S t|t| W S  tyZ   Y nw |t	jurh| || | S | |S |jr|jrut	jS |t	ju r}t	jS |t	ju rt	jS |t	ju rt	jS |t	j
u rt	j
S |jr|jdkr| |j S |jr|jt	ju r|jjr|jS t	j}t|tr|jjr|jS t|tr|jjrt |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||r|j%j&r|t|j%t|j'S d S t||r"|(| S |jrF|j)r4t	j"| | |  S |t	ju r=t	jS |t	ju rFt	jS |jrMt	jS |j*s|+|}|d ur|t	ju rdt	jS |t	ju rmt	jS |jr|j,rt	j"| t	j- | | S t	j" | t	j- | |  S |jr|j.r|j/|dd
\}}|j)r|d9 }|d9 }t#|dd	}|j/|dd
\}	}
|
+|}
|j0r|
r|
j0r|	j0r|	jr|
j&rt	j"| t	j- | ||
  S |
j)rt	j" | t	j- | ||
   S d S ddl1m2} |
|	 3 }| 3 }i t4dt	j"d dt	j"d t4ddt4d  t	j"d t4dt4dt4d  dt4d  t	j"d t4ddt4d  t	j"t5dd t4dt4t4dd  dt4d  t	j"t5dd t4dd t	j"d t4dd t	j"d t4dt4d t4t4dd  t	j"d t4dd t	j"t5dd t4t4dd t4dt4d  t	j"t5dd t4ddt4d d  t	j"d t4d t4d dt4t4dd   t	j"d t4ddt4d d  t	j"t5dd t4dt4d dt4dt4d   t	j"t5dd dt4d t	j"d dt4d dt4d  t	j"d dt4d t	j"t5dd dt4d dt4d  t	j"t5dd i}||v rk|||| }|	j&r^| ||||   S | |||| t	j"   S ||v r|||| }|	j&r| ||||    S | ||t	j"||    S d S d S d S d S d S d S d S )Nr   )
unpolarifyr   r   )Absr"   r{   Fr   r   r   T)ratsimpr   r      r      
      )6rR   r   r   r   r   r   rb   r   r   r   r   r]   r   r%   
ValueErrorrt   r   r>   r+   r   r~   rC   r   r   r   r   rs   r   rk   r}   rT   r   r   ro   r   r   r`   r   r   r   r   r*   rS   r   is_nonnegativer   r   r   r   Zsympy.simplifyr   r   r   r   )ru   r<   rs   r   r   r   r   r   r   r   r   r   Zarg_r   r   t1Z
atan_tablemodulusr    r    r!   r   w  s"  














 

* 0	&
,,$0$

	'zlog.evalc                 C   s
   | t jfS )zE
        Returns this function in the form (base, exponent).
        )r   r+   r   r    r    r!   r/     s   
zlog.as_base_expc                 G   s   ddl m} | dk rtjS t|}| dkr|S |r1|d }|dur1||  | | | 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{   )rR   r   r   r   r   )r   rP   r   r   r   r    r    r!   r     s    $zlog.taylor_termTc                 K   sr  ddl m}m}m} ddlm}m} |dd}|dd}	t| j	dkr0|| j
| j	 ||dS | j	d }
|
jrmt|
}d }d	}|durM|\}
}| 
|
}|	rd||
}|
| vrdtd
d | D }|d url|| S n|
jrzt|
jt|
j S |
jrg }g }|
j	D ]C}|s|js|jr| 
|}t|tr|| 
|jdi | q|| 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r|
j"}|
j }| 
|}t|tr|||jdi | S ||| S nt|
|r4|s(|
j$jr4|t|
j$g|
j%R  S | 
|
S )Nr   )r   
expand_log	factorintrL   forceFfactorr{   )r   r  r"   c                 s   s     | ]\}}|t | V  qd S r   r$   )rO   valr   r    r    r!   rQ   7  s    z'log._eval_expand_log.<locals>.<genexpr>r    )&rR   r   r   r  Zsympy.concreterM   rN   getr   r.   r,   Z
is_Integerr   keyssumitemsr   r%   r   r   r|   r   rn   rT   r   _eval_expand_logr*   r   r   r   r   r   r   rk   rs   is_nonpositiverU   rV   )r   r   rW   r   r   r  rM   rN   r  r  r<   r   Zlogargr   r   ZnonposrP   r   rJ   rK   r    r    r!   r	  #  sr   







	
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 r3||}||dd}t|| g|d dS )	Nr   )r   simplifyinversecombiner{   r(   Tr   Zmeasure)key)Zsympy.simplify.simplifyr   r  r  r   r.   r,   r   )r   r   r   r  r  r   r    r    r!   _eval_simplify]  s   zlog._eval_simplifyc                 K   s   ddl m}m} | jd }|r| jd j|fi |}||}||kr(| tjfS ||}|ddrCd|d< t|j|fi ||fS t||fS )a  
        Returns this function as a complex coordinate.

        Examples
        ========

        >>> from sympy import I
        >>> from sympy.abc import x
        >>> from sympy.functions import log
        >>> 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complex)	rR   r   r<   r.   r   r   r   r  r%   )r   r   rW   r   r<   Zsargabsr    r    r!   r   h  s   

zlog.as_real_imagc                 C   s^   | j | j }|j | j kr,| jd d jrdS |jd jr(t| jd d jr*dS d S d S |jS Nr   r"   TF)r,   r.   r>   r?   r   r   r@   r    r    r!   rB     s    zlog._eval_is_rationalc                 C   s^   | j | j }|j | j kr,| jd d jrdS t| jd d jr(| jd jr*dS d S d S |jS r  )r,   r.   r>   r   r   r  r    r    r!   r     s   zlog._eval_is_algebraicc                 C      | j d jS rj   r.   r9   r   r    r    r!   rl     rE   zlog._eval_is_extended_realc                 C   s   | j d }t|jt|jgS rj   )r.   r   r   r   r>   )r   rA   r    r    r!   r     s   
zlog._eval_is_complexc                 C   s   | j d }|jr
dS |jS Nr   F)r.   r>   r:   r;   r    r    r!   r=     s   
zlog._eval_is_finitec                 C      | j d d jS Nr   r"   r  r   r    r    r!   r     r2   zlog._eval_is_extended_positivec                 C   r  r  )r.   r>   r   r    r    r!   rD     r2   zlog._eval_is_zeroc                 C   r  r  )r.   Zis_extended_nonnegativer   r    r    r!   _eval_is_extended_nonnegative  r2   z!log._eval_is_extended_nonnegativer   c              
      s  ddl m}m}m}m}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_||s_t|||  }|S dd }z|
|\}}|
j| | |d}W n& tttfy   |
j| |d}|jr d	7  |
j| |d}|jsY nw | |\}}|||||   d	   }|tr|	|}t||r|  |||\}}|jst|||  ||  | S  fd
d}i }t|D ]}|||\}}||tj|  ||< qtj}i }|}||  k rAd|  | }|D ]}||tj|||   ||< q|||}|tj7 }||  k st|||  }|D ]}||| ||  7 }qK|dkrg| j	d  ||}|j!r|j"r||dk r|d| tj# 8 }|||  | S )Nr   )rd   r   r   r   r   )productkr   c              	   S   s   t jt j}}t| D ]/}||r7| \}}||kr6z| |W   S  ty5   | t jf Y   S w q||9 }q||fS r   )	r   r+   r   r   r   hasr/   leadtermr   )r   rP   r   r   r  rs   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d2ri   e1Ze2exr   r  r    r!   mul  s   "zlog._eval_nseries.<locals>.mulr   r{   )$rR   rd   r   r   r   r   	itertoolsr  r%   r.   r   matchr  r  r   r   r   r
   r   r   r   r   r   rT   r   r   r   r   r  r   r   r+   dirr   r*   r   )r   rP   r   r   r   rd   r   r   r   r   r<   r  r   r   r  r   rJ   r@   r   _dr!  Zptermsr   Zco1r  r   Zpkr   r  ri   r    r   r!   r     st   
 

"


zlog._eval_nseriesc           
      C   s   ddl m}m}m} | jd  }|j||d}||d}	|	tj	u r6|d u r6|j
|d||jr2dndd}	|	tjtjfv rDtd|  |	dkrP|tj |S |dkrZ|||}|	jrq|	jrq||jrq| |	d	| tj  S | |S )
Nr   )r   rd   ra   )r   -+)r$  r   r"   r{   )rR   r   rd   ra   r.   Ztogetherr   r   r   r   r   r*   rC   r~   r
   r+   r$  r   r,   r   )
r   rP   r   r   r   rd   ra   r   r<   Zx0r    r    r!   r     s   
zlog._eval_as_leading_termrY   r   r   r   rj   )rZ   r[   r\   rm   r   r   r]   r^   rx   r(   r   r   r/   r   r   r   r	  r  r   rB   r   rl   r   r=   r   rD   r  r   r   r    r    r    r!   r%   E  s2     

	 
:
"

Vr%   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   FrF   Nc                 C   sV  |t jkr	| |S |d u rt j}|jro|jrt jS |t ju r!t jS |dt j kr+t jS |td d kr9td S |dtd krEtdS |t j d krUt jt j d S |t	dt j krat jS |t j
u rit j
S |jrot jS t|jrz|jrzt jS |t ju r|t j d krt j t j d S |dt j krt jS |dt	d krtd S d S d S )Nr   r{   r"   )r   r   r>   rt   r+   r   r%   r   r}   r   r~   r   rC   r   )ru   rP   r  r    r    r!   r   C  sF   






zLambertW.evalr"   c                 C   sr   | j d }t| j dkr|dkrt||dt|   S n| j d }|dkr4t|||dt||   S t| |)z?
        Return the first derivative of this function.
        r   r"   )r.   r   r)  r   )r   r'   rP   r  r    r    r!   rx   i  s   


zLambertW.fdiffc                 C   s   | j d }t| j dkrtj}n| j d }|jr.|dtj  jr"dS |dtj  jr,dS d S |d jrO|jr@|dtj  jr@dS |jsK|dtj  j	rMdS d S t
|jr`t
|d jrb|jrddS d S d S d S r  )r.   r   r   r   r>   rt   r   r
  r*   r   r   rk   r   rP   r  r    r    r!   rl   y  s*   


zLambertW._eval_is_extended_realc                 C   r  rj   )r.   r:   r   r    r    r!   r=     rE   zLambertW._eval_is_finitec                 C   sF   | j | j }|j | j kr t| jd jr| jd jrdS d S d S |jS r  )r,   r.   r   r>   r   r  r    r    r!   r     s   zLambertW._eval_is_algebraicr   c                 C   sF   t | jdkr!| jd }||d }|js| |S ||S d S )Nr"   r   )r   r.   r   r   r>   r,   r   r   r    r    r!   r     s   


zLambertW._eval_as_leading_termc                    s   t | jdkrVddlm}m}m} | jd j|||d  j||d}d}	|jr+|j	}	|||	 dkrJt
 fddtd|||	 D  }
||
}
ntj}
|
||| | S t |||S )Nr"   r   )r   r   expand_multinomialr   r   c                    s@   g | ]}t j |d   t||d   t|d    |  qS )r"   r{   )r   r+   r   r   )rO   r  r   r    r!   r     s    
z*LambertW._eval_nseries.<locals>.<listcomp>)r   r.   rR   r   r   r,  r   Zcompute_leading_termr   r   r   r   r   r   superr   )r   rP   r   r   r   r   r   r,  ltZlter@   rq   r   r!   r     s   
zLambertW._eval_nseriesc                 C   sB   | j d }t| j dkrtj}n| j d }|jr|jrdS d S d S )Nr   r"   T)r.   r   r   r   r>   r+  r    r    r!   rD     s   

zLambertW._eval_is_zeror   rY   rj   r   )rZ   r[   r\   rm   r   r   rt   r]   r^   r   r   rx   rl   r=   r   r   r   rD   __classcell__r    r    r/  r!   r)    s    "
%
r)  N)-Z
sympy.corer   Zsympy.core.addr   Zsympy.core.cacher   Zsympy.core.functionr   r   r   r   r	   r
   Zsympy.core.logicr   r   r   Zsympy.core.mulr   Zsympy.core.numbersr   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   r   r`   rp   r   r   r%   r)  r    r    r    r!   <module>   s4     eK  ]   \