B
    [kn                 @   s(  d dl mZmZ d dlmZ d dlmZ d dlmZm	Z	m
Z
 d dlmZ d dlmZ d dlmZ d dlmZ 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 d dlmZm Z  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	Z&G dd de	Z'd dlm(Z( dS )    )print_functiondivision)sympify)Add)LambdaFunctionArgumentIndexError)cacheit)Integer)Pow)S)WildDummy)Mul)	fuzzy_not)	factorial)sqrt)multiplicityperfect_power)rangec               @   sf   e Zd Z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S )ExpBaseT   c             C   s   t S )z=
        Returns the inverse function of ``exp(x)``.
        )log)selfargindex r   Elib/python3.7/site-packages/sympy/functions/elementary/exponential.pyinverse#   s    zExpBase.inversec             C   s@   | j }|j}|s | js t|}|r6t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)
        )expis_negative_coeff_isnegr   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   )args)r   r   r   r   r   A   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_expH   s    zExpBase.as_base_expc             C   s   |  | jd  S )Nr   )r"   r$   	conjugate)r   r   r   r   _eval_conjugateN   s    zExpBase._eval_conjugatec             C   s2   | j d }|jr$|jrdS |jr$dS |jr.dS d S )Nr   TF)r$   Zis_infiniter   is_positive	is_finite)r   argr   r   r   _eval_is_finiteQ   s    
zExpBase._eval_is_finitec             C   sL   | j | j }|j | j krB|jtjkr(dS |jjrHt|jjrHdS n|jS d S )NTF)r"   r$   r   r   Zerois_rationalr   is_zero)r   sr   r   r   _eval_is_rational[   s    zExpBase._eval_is_rationalc             C   s   | j d tjkS )Nr   )r$   r   NegativeInfinity)r   r   r   r   _eval_is_zeroe   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   r   r4   h   s    zExpBase._eval_powerc             K   sF   | j d }|jr<|jr<d}x|j D ]}|| |9 }q"W |S | |S )Nr   r   )r$   is_AddZis_commutativer"   )r   hintsr*   exprxr   r   r   _eval_expand_power_expn   s    
zExpBase._eval_expand_power_expN)r   )__name__
__module____qualname__Z
unbranchedr   r#   propertyr   r%   r'   r+   r0   r2   r4   r<   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_polarao  
    Represent a 'polar number' (see g-function Sphinx documentation).

    ``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.

    >>> 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.simplify.powsimp
    sympy.functions.elementary.complexes.polar_lift
    sympy.functions.elementary.complexes.periodic_argument
    sympy.functions.elementary.complexes.principal_branch
    TFc             C   s   ddl m} t|| jd S )Nr   )re)Z$sympy.functions.elementary.complexesrB   r   r$   )r   rB   r   r   r   	_eval_Abs   s    zexp_polar._eval_Absc             C   s   ddl m}m}m} || jd }y|| kp4||k}W n tk
rP   d}Y nX |rZ| S t| jd |}|dkr||dk r||S |S )z. Careful! any evalf of polar numbers is flaky r   )impirB   T)sympyrD   rE   rB   r$   	TypeErrorr   _eval_evalf)r   ZprecrD   rE   rB   iZbadZresr   r   r   rH      s    
zexp_polar._eval_evalfc             C   s   |  | jd | S )Nr   )r"   r$   )r   r5   r   r   r   r4      s    zexp_polar._eval_powerc             C   s   | j d jrdS d S )Nr   T)r$   is_real)r   r   r   r   _eval_is_real   s    zexp_polar._eval_is_realc             C   s$   | j d dkr| tdfS t| S )Nr   r   )r$   r   r   r%   )r   r   r   r   r%      s    zexp_polar.as_base_expN)r=   r>   r?   __doc__is_polaris_comparablerC   rH   r4   rK   r%   r   r   r   r   rA   x   s   rA   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 Zdd Zdd Zd d! Zd"d# Zd$d% Zd&S ))r   zT
    The exponential function, :math:`e^x`.

    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   r   fdiff   s    z	exp.fdiffc             C   s   ddl m}m} | jd }|jrtjtj }||| gk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.assumptionsrP   rQ   r$   is_Mulr   ImaginaryUnitInfinityNaNas_coefficientPiintegerevenr!   oddNegativeOneHalf)r   ZassumptionsrP   rQ   r*   ZIoocoeffr   r   r   _eval_refine   s"    
zexp._eval_refinec             C   s  ddl m}m} ddlm} ddlm} ddlm} |j	r|t
jkrJt
jS |t
jkrZt
jS |t
jkrjt
jS |t
jkrzt
jS |t
jkrt
jS n6|t
jkrt
jS t|tr|jd S t||r|t|jt|jS t||r|| S |jr*|j s|jr|t
jt
j }|r||d| r|| |r@t
jS ||!|rVt
j"S || |t
j# rtt
j S ||!|t
j# rt
jS |$ \}}|t
jt
jgkrd S |gd  }	}
xTt%&|D ]F}t|tr|
d kr|jd }
nd S n|j'r
|	(| nd S qW |
r&|
t%|	  S d S |j)rg }g }xT|jD ]J}|t
jkr`|(| qB| |}t|| r|(| n
|(| qBW |rt%| | t*| dd S nt||r| S d S )	Nr   )rP   rQ   )AccumBounds)SetExpr)
MatrixBaserR   F)r3   )+rS   rP   rQ   sympy.calculusra   sympy.sets.setexprrb   Zsympy.matrices.matricesrc   	is_Numberr   rW   r,   r!   Exp1rV   r1   ComplexInfinity
isinstancer   r$   r   minmax
_eval_funcrT   	is_numberZ	is_Symbolr_   rY   rU   rZ   r[   r\   r]   r^   Zas_coeff_Mulr   Z	make_argsrN   appendr8   r   )clsr*   rP   rQ   ra   rb   rc   r_   ZtermsZcoeffsZlog_termZtermoutaddaZnewar   r   r   eval   s    














zexp.evalc             C   s   t jS )z?
        Returns the base of the exponential function.
        )r   rg   )r   r   r   r   base6  s    zexp.basec             G   sT   | dk rt jS | dkrt jS t|}|rD|d }|dk	rD|| |  S ||  t|  S )zJ
        Calculates the next term in the Taylor series expansion.
        r   N)r   r,   r!   r   r   )nr;   previous_termspr   r   r   taylor_term=  s    zexp.taylor_termTc             K   sh   ddl }| jd  \}}|r:|j|f|}|j|f|}|||| }}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   N)rF   r$   as_real_imagexpandcossinr   )r   deepr9   rF   rB   rD   r|   r}   r   r   r   rz   N  s    zexp.as_real_imagc             C   s   |j rt|jt|j }n|tjkr0|jr0t}t|tsD|tjkrbdd }t	|| |||S |tkr|js|| j
|| S t	| ||S )Nc             S   s&   | j st| tr"t|  ddiS | S )Nr3   F)is_Powri   r   r   r%   )rr   r   r   r   <lambda>v  s    z exp._eval_subs.<locals>.<lambda>)r   r   r   rt   r   rg   Zis_Functionri   r   
_eval_subsZ_subsr   )r   oldnewfr   r   r   r   o  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   TrR   )r$   rJ   is_imaginaryr   rU   rY   is_even)r   arg2r   r   r   rK   ~  s
     zexp._eval_is_realc             C   sN   | j | j }|j | j krDt| jjrJ| jjr0dS | jtj jrJdS n|jS d S )NF)	r"   r$   r   r   r.   is_algebraicr   rY   r-   )r   r/   r   r   r   _eval_is_algebraic  s    zexp._eval_is_algebraicc             C   sJ   | j d jr| j d tjk	S | j d jrFtj | j d  tj }|jS d S )Nr   )r$   rJ   r   r1   r   rU   rY   r   )r   r   r   r   r   _eval_is_positive  s
    zexp._eval_is_positivec             C   s   ddl m}m}m}m} | jd }|j|||d}	|	jr@d|	 S ||	 |d}
|
| |gkrb| S t	d}t
|||}| }| }t
|
|||	|
  }|||j||	|
 |7 }| }||dddS )	Nr   )limitooOrderpowsimp)rv   logxr   tTr   )r~   combine)rF   r   r   r   r   r$   _eval_nseriesis_OrderZremoveOr   r   _taylorZgetOZsubsr:   r{   )r   r;   rv   r   r   r   r   r   r*   Z
arg_seriesZarg0r   Z
exp_seriesorr   r   r   r     s     
zexp._eval_nseriesc             C   sh   ddl m} g }d }x<t|D ]0}| || jd |}|j||d}|| qW t| ||| | S )Nr   )r   )rv   )rF   r   r   ry   r$   nseriesrn   r   )r   r;   rv   r   lgrI   r   r   r   r     s    zexp._taylorc                sb   ddl m} | jd }|jr4t fdd|jD  S | jd  }|d |rZtjS t	|S )Nr   )r   c                s   g | ]}t | qS r   )r   as_leading_term).0r   )r;   r   r   
<listcomp>  s    z-exp._eval_as_leading_term.<locals>.<listcomp>r   )
rF   r   r$   r8   r   r   containsr   r!   r   )r   r;   r   r*   r   )r;   r   _eval_as_leading_term  s    
zexp._eval_as_leading_termc             C   s8   ddl m} tj}||| tjd  ||||   S )Nr   )r}   rR   )rF   r}   r   rU   rY   )r   r*   r}   Ir   r   r   _eval_rewrite_as_sin  s    zexp._eval_rewrite_as_sinc             C   s8   ddl m} tj}||| |||| tjd    S )Nr   )r|   rR   )rF   r|   r   rU   rY   )r   r*   r|   r   r   r   r   _eval_rewrite_as_cos  s    zexp._eval_rewrite_as_cosc             C   s,   ddl m} d||d  d||d   S )Nr   )tanhr   rR   )rF   r   )r   r*   r   r   r   r   _eval_rewrite_as_tanh  s    zexp._eval_rewrite_as_tanhc             C   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|   )
Z(sympy.functions.elementary.trigonometricr}   r|   rT   r_   r   rY   rU   rm   ri   )r   r*   r}   r|   r_   ZcosineZsiner   r   r   _eval_rewrite_as_sqrt  s    
zexp._eval_rewrite_as_sqrtN)r   )T)r=   r>   r?   rL   rO   r`   classmethodrs   r@   rt   staticmethodr	   ry   rz   r   rK   r   r   r   r   r   r   r   r   r   r   r   r   r   r      s&   
	R
!

r   c               @   s   e Zd Zd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& ZdS ),r   a  
    The natural logarithm function `\ln(x)` or `\log(x)`.
    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)``.

    See Also
    ========

    exp
    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)r$   r   )r   r   r   r   r   rO     s    z	log.fdiffc             C   s   t S )zC
        Returns `e^x`, the inverse function of `\log(x)`.
        )r   )r   r   r   r   r   r     s    zlog.inverseNc       	      C   s  ddl m} ddlm} ddlm} t|}|d k	rt|}|dkrX|dkrRtjS tj	S ybt
||}|r|| }|jr|t|| t|  S |t|| t|  S nt|t| S W n tk
r   Y nX |tjk	r| || | S | |S |jrt|tjkrtj	S |tjkrtjS |tjkr0tjS |tjkrBtjS |tjkrTtjS |jrt|jdkrt| |j S |tj	krtj	S t|tr|jd jr|jd S t|tr||jS t||r|jjr|t|jt|jS d S nt||r|| S |j rR|j!r.tj"tj# | |  S |tj	kr@tj	S |tjkrRtjS |j$s|%tj#}|d k	r|tjkrtjS |tjkrtjS |jr|j&rtj"tj# tj' | | S tj" tj# tj' | |  S d S )Nr   )
unpolarify)ra   )rb   r   )(rF   r   rd   ra   re   rb   r   r   rW   rh   r   
is_Integerr   
ValueErrorrg   rf   r,   r!   rV   r1   is_Rationalrx   qri   r   r$   rJ   rA   rj   r(   rk   rl   rm   r   rY   rU   r8   rX   is_nonnegativer^   )	ro   r*   rt   r   ra   rb   rv   Zdenr_   r   r   r   rs     s    






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%   H  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k	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   ru   Nr   Tr   )r~   r   rR   )rF   r   r   r,   r   )rv   r;   rw   r   rx   r   r   r   ry   N  s     zlog.taylor_termTc             K   s.  ddl m}m} ddlm}m} |dd}t| jdkrP|| j	| j ||dS | jd }|j
rtt|}	|	dk	r|	d | 	|	d  S n|jrt|jt|j S |jr`g }
g }x|jD ]}|s|js|jr| 	|}t|tr|
| 	|jf | n
|
| q|jr>| 	| }|
| |tj q|| qW t|
 tt|  S |jstt|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f | S ||| S n,t||r$|j!jr$|t|j!f|j" S | 	|S )	Nr   )r   
expand_log)SumProductforceFrR   )r~   r   r   )#rF   r   r   Zsympy.concreter   r   getlenr$   r"   r   r   intr   r   rx   r   rT   r(   rM   ri   rn   _eval_expand_logr   r   r]   r   r   r   r   rJ   rt   is_nonpositiveZfunctionZlimits)r   r~   r9   r   r   r   r   r   r*   rx   r:   Znonposr;   rr   r6   r7   r   r   r   r   `  sP    


(

zlog._eval_expand_logc       	   	   C   s   ddl m}m}m} t| jdkr<|| j| j ||||dS | || jd ||||d}|rf||}||dd}t|| g|dS )Nr   )r   simplifyinversecombinerR   )ratiomeasurerationalr   T)r~   )key)Zsympy.simplify.simplifyr   r   r   r   r$   r"   rj   )	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} |rF|| jd j|f|}|| jd j|f|}n|| jd }|| jd }|ddrd|d< t|j|f||fS t||fS d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   )Absr*   r   FcomplexN)rF   r   r*   r$   r{   r   r   )r   r~   r9   r   r*   absr   r   r   rz     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)r"   r$   r.   r-   r   )r   r/   r   r   r   r0     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 )Nr   r   TF)r"   r$   r.   r   r   )r   r/   r   r   r   r     s    zlog._eval_is_algebraicc             C   s   | j d jS )Nr   )r$   r(   )r   r   r   r   rK     s    zlog._eval_is_realc             C   s   | j d }|jrdS |jS )Nr   F)r$   r.   r)   )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   r     s    zlog._eval_is_positivec             C   s   | j d d jS )Nr   r   )r$   r.   )r   r   r   r   r2     s    zlog._eval_is_zeroc             C   s   | j d d jS )Nr   r   )r$   r   )r   r   r   r   _eval_is_nonnegative  s    zlog._eval_is_nonnegativec             C   sz  ddl m}m} |st|}| jd |kr.|S | jd }tdtd }}||||  }	|	d k	r|	| |	|  }}|dkr||s||st|||  }	|	S | jd j|||d}
x(|
j	r|d7 }| jd j|||d}
qW |

|\}}||
|||   d }d }g }x>t|d D ].}t|||}|j|||d}|| q"W t|||  t|  ||| | S )Nr   )cancelr   kr   )rv   r   r   rR   )rF   r   r   r   r$   r   matchZhasr   r   Zleadtermr   ry   rn   r   )r   r;   rv   r   r   r   r*   r   r   r   r/   rr   r6   rx   r   rI   r   r   r   r     s4    
zlog._eval_nseriesc             C   s8   | j d |}|tjkr.| j d d |S | |S )Nr   r   )r$   r   r   r!   r"   )r   r;   r*   r   r   r   r     s    
zlog._eval_as_leading_term)r   )r   )N)T)T)r=   r>   r?   rL   rO   r   r   rs   r%   r   r	   ry   r   r   rz   r0   r   rK   r+   r   r2   r   r   r   r   r   r   r   r     s(   
	
T
/
!
 r   c               @   s8   e Zd ZdZedddZdddZdd	 Zd
d ZdS )LambertWa  
    The Lambert W function `W(z)` is defined as the inverse
    function of `w \exp(w)` [1]_.

    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] http://en.wikipedia.org/wiki/Lambert_W_function
    Nc             C   s  |t jkr| |S |d kr t j}|t jkr|t jkr:t jS |t jkrJt jS |dt j kr^t jS |td d krztd S |t jkrt jS t|jr|t jkrt j	S |t jkr|t j
 d krt j t j
 d S |dt j krt jS |dtd krtd S d S )Nru   rR   )r   r,   rg   r!   r]   r   rV   r   r.   r1   rY   rU   r   r
   )ro   r;   r   r   r   r   rs   +  s2    







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)r$   r   r   r   )r   r   r;   r   r   r   r   rO   I  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 )Nr   r   TF)r$   r   r   r,   r.   rg   r(   r   r   r   r   rJ   )r   r;   r   r   r   r   rK   Y  s"    


zLambertW._eval_is_realc             C   sD   | j | j }|j | j kr:t| jd jr@| jd jr@dS n|jS d S )Nr   F)r"   r$   r   r.   r   )r   r/   r   r   r   r   m  s
    zLambertW._eval_is_algebraic)N)r   )	r=   r>   r?   rL   r   rs   rO   rK   r   r   r   r   r   r   
  s   
r   )r    N))Z
__future__r   r   Z
sympy.corer   Zsympy.core.addr   Zsympy.core.functionr   r   r   Zsympy.core.cacher	   Zsympy.core.numbersr
   Zsympy.core.powerr   Zsympy.core.singletonr   Zsympy.core.symbolr   r   Zsympy.core.mulr   Zsympy.core.logicr   Z(sympy.functions.combinatorial.factorialsr   Z(sympy.functions.elementary.miscellaneousr   Zsympy.ntheoryr   r   Zsympy.core.compatibilityr   r   rA   r   r   r   r    r   r   r   r   <module>   s0   YE    5l