B
    [                 @   st  d dl mZmZ d dlmZmZmZ d dlmZ d dl	m
Z
mZmZ d dlmZ d dlmZmZ d dlmZmZ dd	 ZG d
d de
Zdd 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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!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*S )+    )print_functiondivision)Ssympifycacheit)Add)FunctionArgumentIndexError_coeff_isneg)sqrt)explog)	factorialRisingFactorialc             C   s&   t | } | tdd | tD S )Nc             S   s   g | ]}|| tfqS  )Zrewriter   ).0hr   r   Dlib/python3.7/site-packages/sympy/functions/elementary/hyperbolic.py
<listcomp>   s   z/_rewrite_hyperbolics_as_exp.<locals>.<listcomp>)r   ZxreplacedictZatomsHyperbolicFunction)exprr   r   r   _rewrite_hyperbolics_as_exp   s    r   c               @   s   e Zd ZdZdZdS )r   ze
    Base class for hyperbolic functions.

    See Also
    ========

    sinh, cosh, tanh, coth
    TN)__name__
__module____qualname____doc__Z
unbranchedr   r   r   r   r      s   r   c             C   s   x`t | D ]H}|tjtj kr*tj}P q|jr| \}}|tjtj kr|jrP qW | tj	fS |tj
 tj tj }|tj tj | }| | |fS )a  
    Split ARG into two parts, a "rest" and a multiple of I*pi/2.
    This assumes ARG to be an Add.
    The multiple of I*pi returned in the second position is always a Rational.

    Examples
    ========

    >>> from sympy.functions.elementary.hyperbolic import _peeloff_ipi as peel
    >>> from sympy import pi, I
    >>> from sympy.abc import x, y
    >>> peel(x + I*pi/2)
    (x, I*pi/2)
    >>> peel(x + I*2*pi/3 + I*pi*y)
    (x + I*pi*y + I*pi/6, I*pi/2)
    )r   Z	make_argsr   PiImaginaryUnitOneZis_Mulas_two_termsZis_RationalZeroHalf)argaKpZm1Zm2r   r   r   _peeloff_ipi$   s    
r'   c               @   s   e Zd ZdZd)ddZd*ddZedd Zee	d	d
 Z
dd Zd+ddZd,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(S ).sinhz
    The hyperbolic sine function, `\frac{e^x - e^{-x}}{2}`.

    * sinh(x) -> Returns the hyperbolic sine of x

    See Also
    ========

    cosh, tanh, asinh
       c             C   s$   |dkrt | jd S t| |dS )z@
        Returns the first derivative of this function.
        r)   r   N)coshargsr	   )selfargindexr   r   r   fdiffQ   s    z
sinh.fdiffc             C   s   t S )z7
        Returns the inverse of this function.
        )asinh)r,   r-   r   r   r   inverseZ   s    zsinh.inversec             C   s  ddl m} t|}|jrp|tjkr*tjS |tjkr:tjS |tjkrJtjS |tjkrZtjS |j	rl| |  S n|tj
krtjS |tj}|d k	rtj|| S t|r| |  S |jrt|\}}|rt|t| t|t|  S |jtkr|jd S |jtkr0|jd }t|d t|d  S |jtkrZ|jd }|td|d   S |jtkr|jd }dt|d t|d   S d S )Nr   )sinr)      )sympyr1   r   	is_Numberr   NaNInfinityNegativeInfinityr!   is_negativeComplexInfinityas_coefficientr   r
   is_Addr'   r(   r*   funcr/   r+   acoshr   atanhacoth)clsr#   r1   i_coeffxmr   r   r   eval`   sF    




 



z	sinh.evalc             G   sb   | dk s| d dkrt jS t|}t|dkrN|d }||d  | | d   S ||  t|  S dS )zG
        Returns the next term in the Taylor series expansion.
        r   r2   r)   N)r   r!   r   lenr   )nrB   previous_termsr&   r   r   r   taylor_term   s    zsinh.taylor_termc             C   s   |  | jd  S )Nr   )r<   r+   	conjugate)r,   r   r   r   _eval_conjugate   s    zsinh._eval_conjugateTc             K   s   ddl m}m} | jd jrF|r<d|d< | j|f|tjfS | tjfS |rh| jd j|f| \}}n| jd  \}}t	||| t
||| fS )z@
        Returns this function as a complex coordinate.
        r   )cosr1   Fcomplex)r3   rL   r1   r+   is_realexpandr   r!   as_real_imagr(   r*   )r,   deephintsrL   r1   reimr   r   r   rP      s    
zsinh.as_real_imagc             K   s&   | j f d|i|\}}||tj  S )NrQ   )rP   r   r   )r,   rQ   rR   re_partim_partr   r   r   _eval_expand_complex   s    zsinh._eval_expand_complexc             K   s   |r| j d j|f|}n
| j d }d }|jr<| \}}n:|jdd\}}|tjk	rv|jrv|tjk	rv|}|d | }|d k	rt|t	| t|t	|  jddS t|S )Nr   T)rationalr)   )trig)
r+   rO   r;   r    as_coeff_Mulr   r   
is_Integerr(   r*   )r,   rQ   rR   r#   rB   ycoefftermsr   r   r   _eval_expand_trig   s    
(zsinh._eval_expand_trigc             C   s   t |t |  d S )Nr2   )r   )r,   r#   r   r   r   _eval_rewrite_as_tractable   s    zsinh._eval_rewrite_as_tractablec             C   s   t |t |  d S )Nr2   )r   )r,   r#   r   r   r   _eval_rewrite_as_exp   s    zsinh._eval_rewrite_as_expc             C   s    t j t|t jt j d   S )Nr2   )r   r   r*   r   )r,   r#   r   r   r   _eval_rewrite_as_cosh   s    zsinh._eval_rewrite_as_coshc             C   s"   t tj| }d| d|d   S )Nr2   r)   )tanhr   r"   )r,   r#   	tanh_halfr   r   r   _eval_rewrite_as_tanh   s    zsinh._eval_rewrite_as_tanhc             C   s"   t tj| }d| |d d  S )Nr2   r)   )cothr   r"   )r,   r#   	coth_halfr   r   r   _eval_rewrite_as_coth   s    zsinh._eval_rewrite_as_cothc             C   sH   ddl m} | jd |}||jkr:|d||r:|S | |S d S )Nr   )Orderr)   )r3   ri   r+   as_leading_termfree_symbolscontainsr<   )r,   rB   ri   r#   r   r   r   _eval_as_leading_term   s
    zsinh._eval_as_leading_termc             C   s   | j d jrdS d S )Nr   T)r+   rN   )r,   r   r   r   _eval_is_real   s    zsinh._eval_is_realc             C   s   | j d jr| j d jS d S )Nr   )r+   rN   is_positive)r,   r   r   r   _eval_is_positive   s    zsinh._eval_is_positivec             C   s   | j d jr| j d jS d S )Nr   )r+   rN   r8   )r,   r   r   r   _eval_is_negative   s    zsinh._eval_is_negativec             C   s   | j d }|jrdS d S )Nr   T)r+   is_imaginary)r,   r#   r   r   r   _eval_is_finite   s    
zsinh._eval_is_finiteN)r)   )r)   )T)T)T)r   r   r   r   r.   r0   classmethodrD   staticmethodr   rI   rK   rP   rW   r_   r`   ra   rb   re   rh   rm   rn   rp   rq   rs   r   r   r   r   r(   E   s(   

	
1


	r(   c               @   s   e Zd ZdZd#ddZedd Zeedd Z	d	d
 Z
d$ddZd%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"S )'r*   z
    The hyperbolic cosine function, `\frac{e^x + e^{-x}}{2}`.

    * cosh(x) -> Returns the hyperbolic cosine of x

    See Also
    ========

    sinh, tanh, acosh
    r)   c             C   s$   |dkrt | jd S t| |d S )Nr)   r   )r(   r+   r	   )r,   r-   r   r   r   r.     s    z
cosh.fdiffc             C   sv  ddl m} t|}|jrn|tjkr*tjS |tjkr:tjS |tjkrJtjS |tjkrZtj	S |j
rj| | S n|tjkr~tjS |tj}|d k	r||S t|r| | S |jrt|\}}|rt|t| t|t|  S |jtkrtd|jd d  S |jtkr|jd S |jtkr@dtd|jd d   S |jtkrr|jd }|t|d t|d   S d S )Nr   )rL   r)   r2   )r3   rL   r   r4   r   r5   r6   r7   r!   r   r8   r9   r:   r   r
   r;   r'   r*   r(   r<   r/   r   r+   r=   r>   r?   )r@   r#   rL   rA   rB   rC   r   r   r   rD   	  sB    





 

z	cosh.evalc             G   sb   | dk s| d dkrt jS t|}t|dkrN|d }||d  | | d   S ||  t|  S d S )Nr   r2   r)   rE   )r   r!   r   rF   r   )rG   rB   rH   r&   r   r   r   rI   7  s    zcosh.taylor_termc             C   s   |  | jd  S )Nr   )r<   r+   rJ   )r,   r   r   r   rK   E  s    zcosh._eval_conjugateTc             K   s   ddl m}m} | jd jrF|r<d|d< | j|f|tjfS | tjfS |rh| jd j|f| \}}n| jd  \}}t	||| t
||| fS )Nr   )rL   r1   FrM   )r3   rL   r1   r+   rN   rO   r   r!   rP   r*   r(   )r,   rQ   rR   rL   r1   rS   rT   r   r   r   rP   H  s    
zcosh.as_real_imagc             K   s&   | j f d|i|\}}||tj  S )NrQ   )rP   r   r   )r,   rQ   rR   rU   rV   r   r   r   rW   W  s    zcosh._eval_expand_complexc             K   s   |r| j d j|f|}n
| j d }d }|jr<| \}}n:|jdd\}}|tjk	rv|jrv|tjk	rv|}|d | }|d k	rt|t| t	|t	|  jddS t|S )Nr   T)rX   r)   )rY   )
r+   rO   r;   r    rZ   r   r   r[   r*   r(   )r,   rQ   rR   r#   rB   r\   r]   r^   r   r   r   r_   [  s    
(zcosh._eval_expand_trigc             C   s   t |t |  d S )Nr2   )r   )r,   r#   r   r   r   r`   l  s    zcosh._eval_rewrite_as_tractablec             C   s   t |t |  d S )Nr2   )r   )r,   r#   r   r   r   ra   o  s    zcosh._eval_rewrite_as_expc             C   s    t j t|t jt j d   S )Nr2   )r   r   r(   r   )r,   r#   r   r   r   _eval_rewrite_as_sinhr  s    zcosh._eval_rewrite_as_sinhc             C   s"   t tj| d }d| d|  S )Nr2   r)   )rc   r   r"   )r,   r#   rd   r   r   r   re   u  s    zcosh._eval_rewrite_as_tanhc             C   s"   t tj| d }|d |d  S )Nr2   r)   )rf   r   r"   )r,   r#   rg   r   r   r   rh   y  s    zcosh._eval_rewrite_as_cothc             C   sJ   ddl m} | jd |}||jkr<|d||r<tjS | |S d S )Nr   )ri   r)   )	r3   ri   r+   rj   rk   rl   r   r   r<   )r,   rB   ri   r#   r   r   r   rm   }  s
    zcosh._eval_as_leading_termc             C   s   | j d jrdS d S )Nr   T)r+   rN   )r,   r   r   r   rp     s    zcosh._eval_is_positivec             C   s   | j d }|jrdS d S )Nr   T)r+   rr   )r,   r#   r   r   r   rs     s    
zcosh._eval_is_finiteN)r)   )T)T)T)r   r   r   r   r.   rt   rD   ru   r   rI   rK   rP   rW   r_   r`   ra   rv   re   rh   rm   rp   rs   r   r   r   r   r*      s"   

.


	r*   c               @   s   e Zd ZdZd%ddZd&ddZedd Zee	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"d# Zd$S )(rc   z
    The hyperbolic tangent function, `\frac{\sinh(x)}{\cosh(x)}`.

    * tanh(x) -> Returns the hyperbolic tangent of x

    See Also
    ========

    sinh, cosh, atanh
    r)   c             C   s.   |dkr t jt| jd d  S t| |d S )Nr)   r   r2   )r   r   rc   r+   r	   )r,   r-   r   r   r   r.     s    z
tanh.fdiffc             C   s   t S )z7
        Returns the inverse of this function.
        )r>   )r,   r-   r   r   r   r0     s    ztanh.inversec             C   s  ddl m} t|}|jrp|tjkr*tjS |tjkr:tjS |tjkrJtj	S |tj
krZtj
S |jrl| |  S n*|tjkrtjS |tj}|d k	rt|rtj ||  S tj|| S t|r| |  S |jrt|\}}|rt|}|tjkrt|S t|S |jtkr8|jd }|td|d   S |jtkrj|jd }t|d t|d  | S |jtkr|jd S |jtkrd|jd  S d S )Nr   )tanr)   r2   )r3   rw   r   r4   r   r5   r6   r   r7   NegativeOner!   r8   r9   r:   r   r
   r;   r'   rc   rf   r<   r/   r+   r   r=   r>   r?   )r@   r#   rw   rA   rB   rC   Ztanhmr   r   r   rD     sN    







z	tanh.evalc             G   sr   ddl m} | dk s | d dkr&tjS t|}d| d  }|| d }t| d }||d  | | ||   S d S )Nr   )	bernoullir2   r)   )r3   ry   r   r!   r   r   )rG   rB   rH   ry   r$   BFr   r   r   rI     s    ztanh.taylor_termc             C   s   |  | jd  S )Nr   )r<   r+   rJ   )r,   r   r   r   rK     s    ztanh._eval_conjugateTc             K   s   ddl m}m} | jd jrF|r<d|d< | j|f|tjfS | tjfS |rh| jd j|f| \}}n| jd  \}}t	|d ||d  }t	|t
| | |||| | fS )Nr   )rL   r1   FrM   r2   )r3   rL   r1   r+   rN   rO   r   r!   rP   r(   r*   )r,   rQ   rR   rL   r1   rS   rT   denomr   r   r   rP     s    
ztanh.as_real_imagc             C   s$   t | t | }}|| ||  S )N)r   )r,   r#   neg_exppos_expr   r   r   r`     s    ztanh._eval_rewrite_as_tractablec             C   s$   t | t | }}|| ||  S )N)r   )r,   r#   r}   r~   r   r   r   ra     s    ztanh._eval_rewrite_as_expc             C   s&   t jt| tt jt j d |  S )Nr2   )r   r   r(   r   )r,   r#   r   r   r   rv     s    ztanh._eval_rewrite_as_sinhc             C   s&   t jtt jt j d |  t| S )Nr2   )r   r   r*   r   )r,   r#   r   r   r   rb   
  s    ztanh._eval_rewrite_as_coshc             C   s   dt | S )Nr)   )rf   )r,   r#   r   r   r   rh     s    ztanh._eval_rewrite_as_cothc             C   sH   ddl m} | jd |}||jkr:|d||r:|S | |S d S )Nr   )ri   r)   )r3   ri   r+   rj   rk   rl   r<   )r,   rB   ri   r#   r   r   r   rm     s
    ztanh._eval_as_leading_termc             C   s   | j d jrdS d S )Nr   T)r+   rN   )r,   r   r   r   rn     s    ztanh._eval_is_realc             C   s   | j d jr| j d jS d S )Nr   )r+   rN   ro   )r,   r   r   r   rp     s    ztanh._eval_is_positivec             C   s   | j d jr| j d jS d S )Nr   )r+   rN   r8   )r,   r   r   r   rq   !  s    ztanh._eval_is_negativec             C   s   | j d }|jrdS d S )Nr   T)r+   rN   )r,   r#   r   r   r   rs   %  s    
ztanh._eval_is_finiteN)r)   )r)   )T)r   r   r   r   r.   r0   rt   rD   ru   r   rI   rK   rP   r`   ra   rv   rb   rh   rm   rn   rp   rq   rs   r   r   r   r   rc     s$   


5
	rc   c               @   s   e Zd ZdZd!ddZd"ddZedd Zee	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 S )$rf   z
    The hyperbolic cotangent function, `\frac{\cosh(x)}{\sinh(x)}`.

    * coth(x) -> Returns the hyperbolic cotangent of x
    r)   c             C   s,   |dkrdt | jd d  S t| |d S )Nr)   r   r2   )r(   r+   r	   )r,   r-   r   r   r   r.   2  s    z
coth.fdiffc             C   s   t S )z7
        Returns the inverse of this function.
        )r?   )r,   r-   r   r   r   r0   8  s    zcoth.inversec             C   s  ddl m} t|}|jrp|tjkr*tjS |tjkr:tjS |tjkrJtj	S |tj
krZtjS |jrl| |  S n*|tjkrtjS |tj}|d k	rt|rtj||  S tj || S t|r| |  S |jrt|\}}|rt|}|tjkrt|S t|S |jtkr8|jd }td|d  | S |jtkrj|jd }|t|d t|d   S |jtkrd|jd  S |jtkr|jd S d S )Nr   )cotr)   r2   )r3   r   r   r4   r   r5   r6   r   r7   rx   r!   r9   r8   r:   r   r
   r;   r'   rf   rc   r<   r/   r+   r   r=   r>   r?   )r@   r#   r   rA   rB   rC   Zcothmr   r   r   rD   >  sN    






z	coth.evalc             G   sz   ddl m} | dkr dt| S | dk s4| d dkr:tjS t|}|| d }t| d }d| d  | | ||   S d S )Nr   )ry   r)   r2   )r3   ry   r   r   r!   r   )rG   rB   rH   ry   rz   r{   r   r   r   rI   s  s    zcoth.taylor_termc             C   s   |  | jd  S )Nr   )r<   r+   rJ   )r,   r   r   r   rK     s    zcoth._eval_conjugateTc             K   s   ddl m}m} | jd jrF|r<d|d< | j|f|tjfS | tjfS |rh| jd j|f| \}}n| jd  \}}t	|d ||d  }t	|t
| | || || | fS )Nr   )rL   r1   FrM   r2   )r3   rL   r1   r+   rN   rO   r   r!   rP   r(   r*   )r,   rQ   rR   rL   r1   rS   rT   r|   r   r   r   rP     s    
zcoth.as_real_imagc             C   s$   t | t | }}|| ||  S )N)r   )r,   r#   r}   r~   r   r   r   r`     s    zcoth._eval_rewrite_as_tractablec             C   s$   t | t | }}|| ||  S )N)r   )r,   r#   r}   r~   r   r   r   ra     s    zcoth._eval_rewrite_as_expc             C   s(   t j tt jt j d |  t| S )Nr2   )r   r   r(   r   )r,   r#   r   r   r   rv     s    zcoth._eval_rewrite_as_sinhc             C   s(   t j t| tt jt j d |  S )Nr2   )r   r   r*   r   )r,   r#   r   r   r   rb     s    zcoth._eval_rewrite_as_coshc             C   s   dt | S )Nr)   )rc   )r,   r#   r   r   r   re     s    zcoth._eval_rewrite_as_tanhc             C   s   | j d jr| j d jS d S )Nr   )r+   rN   ro   )r,   r   r   r   rp     s    zcoth._eval_is_positivec             C   s   | j d jr| j d jS d S )Nr   )r+   rN   r8   )r,   r   r   r   rq     s    zcoth._eval_is_negativec             C   sL   ddl m} | jd |}||jkr>|d||r>d| S | |S d S )Nr   )ri   r)   )r3   ri   r+   rj   rk   rl   r<   )r,   rB   ri   r#   r   r   r   rm     s
    zcoth._eval_as_leading_termN)r)   )r)   )T)r   r   r   r   r.   r0   rt   rD   ru   r   rI   rK   rP   r`   ra   rv   rb   re   rp   rq   rm   r   r   r   r   rf   +  s    

5
rf   c               @   s   e Zd ZdZdZdZdZedd Zdd Z	dd Z
d	d
 Zdd Zdd Zdd Zdd Zd ddZdd Zd!ddZdd Zdd Zdd ZdS )"ReciprocalHyperbolicFunctionz=Base class for reciprocal functions of hyperbolic functions. Nc             C   sj   |  r*| jr| | S | jr*| |  S | j|}t|drV| | krV|jd S |d krfd| S |S )Nr0   r   r)   )Zcould_extract_minus_sign_is_even_is_odd_reciprocal_ofrD   hasattrr0   r+   )r@   r#   tr   r   r   rD     s    

z!ReciprocalHyperbolicFunction.evalc             O   s    |  | jd }t||||S )Nr   )r   r+   getattr)r,   method_namer+   kwargsor   r   r   _call_reciprocal  s    z-ReciprocalHyperbolicFunction._call_reciprocalc             O   s&   | j |f||}|d kr"d| S |S )Nr)   )r   )r,   r   r+   r   r   r   r   r   _calculate_reciprocal  s    z2ReciprocalHyperbolicFunction._calculate_reciprocalc             C   s.   |  ||}|d kr*|| |kr*d| S d S )Nr)   )r   r   )r,   r   r#   r   r   r   r   _rewrite_reciprocal  s    z0ReciprocalHyperbolicFunction._rewrite_reciprocalc             C   s   |  d|S )Nra   )r   )r,   r#   r   r   r   ra     s    z1ReciprocalHyperbolicFunction._eval_rewrite_as_expc             C   s   |  d|S )Nr`   )r   )r,   r#   r   r   r   r`     s    z7ReciprocalHyperbolicFunction._eval_rewrite_as_tractablec             C   s   |  d|S )Nre   )r   )r,   r#   r   r   r   re     s    z2ReciprocalHyperbolicFunction._eval_rewrite_as_tanhc             C   s   |  d|S )Nrh   )r   )r,   r#   r   r   r   rh     s    z2ReciprocalHyperbolicFunction._eval_rewrite_as_cothTc             K   s   d|  | jd  j|f|S )Nr)   r   )r   r+   rP   )r,   rQ   rR   r   r   r   rP     s    z)ReciprocalHyperbolicFunction.as_real_imagc             C   s   |  | jd  S )Nr   )r<   r+   rJ   )r,   r   r   r   rK     s    z,ReciprocalHyperbolicFunction._eval_conjugatec             K   s&   | j f ddi|\}}|tj|  S )NrQ   T)rP   r   r   )r,   rQ   rR   rU   rV   r   r   r   rW     s    z1ReciprocalHyperbolicFunction._eval_expand_complexc             C   s   d|  | jd  |S )Nr)   r   )r   r+   rm   )r,   rB   r   r   r   rm     s    z2ReciprocalHyperbolicFunction._eval_as_leading_termc             C   s   |  | jd jS )Nr   )r   r+   rN   )r,   r   r   r   rn     s    z*ReciprocalHyperbolicFunction._eval_is_realc             C   s   d|  | jd  jS )Nr)   r   )r   r+   Z	is_finite)r,   r   r   r   rs     s    z,ReciprocalHyperbolicFunction._eval_is_finite)T)T)r   r   r   r   r   r   r   rt   rD   r   r   r   ra   r`   re   rh   rP   rK   rW   rm   rn   rs   r   r   r   r   r     s$   

r   c               @   sR   e Zd ZdZeZdZdddZee	dd Z
dd	 Zd
d Zdd Zdd ZdS )cschz
    The hyperbolic cosecant function, `\frac{2}{e^x - e^{-x}}`

    * csch(x) -> Returns the hyperbolic cosecant of x

    See Also
    ========

    sinh, cosh, tanh, sech, asinh, acosh
    Tr)   c             C   s4   |dkr&t | jd  t| jd  S t| |dS )z?
        Returns the first derivative of this function
        r)   r   N)rf   r+   r   r	   )r,   r-   r   r   r   r.     s    z
csch.fdiffc             G   s~   ddl m} | dkr dt| S | dk s4| d dkr:tjS t|}|| d }t| d }ddd|    | | ||   S dS )zF
        Returns the next term in the Taylor series expansion
        r   )ry   r)   r2   N)r3   ry   r   r   r!   r   )rG   rB   rH   ry   rz   r{   r   r   r   rI     s    zcsch.taylor_termc             C   s   t jt|t jt j d   S )Nr2   )r   r   r*   r   )r,   r#   r   r   r   rb   *  s    zcsch._eval_rewrite_as_coshc             C   s   | j d jr| j d jS d S )Nr   )r+   rN   ro   )r,   r   r   r   rp   -  s    zcsch._eval_is_positivec             C   s   | j d jr| j d jS d S )Nr   )r+   rN   r8   )r,   r   r   r   rq   1  s    zcsch._eval_is_negativec             C   s    dd l m} || jd  S )Nr   )sage.allallr   r+   _sage_)r,   sager   r   r   r   5  s    zcsch._sage_N)r)   )r   r   r   r   r(   r   r   r.   ru   r   rI   rb   rp   rq   r   r   r   r   r   r     s   

	r   c               @   sJ   e Zd ZdZeZdZdddZee	dd Z
dd	 Zd
d Zdd ZdS )sechz
    The hyperbolic secant function, `\frac{2}{e^x + e^{-x}}`

    * sech(x) -> Returns the hyperbolic secant of x

    See Also
    ========

    sinh, cosh, tanh, coth, csch, asinh, acosh
    Tr)   c             C   s4   |dkr&t | jd  t| jd  S t| |d S )Nr)   r   )rc   r+   r   r	   )r,   r-   r   r   r   r.   I  s    z
sech.fdiffc             G   sJ   ddl m} | dk s | d dkr&tjS t|}|| t|  ||   S d S )Nr   )eulerr2   r)   )Z%sympy.functions.combinatorial.numbersr   r   r!   r   r   )rG   rB   rH   r   r   r   r   rI   O  s
    zsech.taylor_termc             C   s   t jt|t jt j d   S )Nr2   )r   r   r(   r   )r,   r#   r   r   r   rv   Y  s    zsech._eval_rewrite_as_sinhc             C   s   | j d jrdS d S )Nr   T)r+   rN   )r,   r   r   r   rp   \  s    zsech._eval_is_positivec             C   s    dd l m} || jd  S )Nr   )r   r   r   r+   r   )r,   r   r   r   r   r   `  s    zsech._sage_N)r)   )r   r   r   r   r*   r   r   r.   ru   r   rI   rv   rp   r   r   r   r   r   r   :  s   

	r   c               @   s   e Zd ZdZdS )InverseHyperbolicFunctionz,Base class for inverse hyperbolic functions.N)r   r   r   r   r   r   r   r   r   j  s   r   c               @   sP   e Zd ZdZdddZedd Zeedd Z	d	d
 Z
dd ZdddZdS )r/   z
    The inverse hyperbolic sine function.

    * asinh(x) -> Returns the inverse hyperbolic sine of x

    See Also
    ========

    acosh, atanh, sinh
    r)   c             C   s0   |dkr"dt | jd d d  S t| |d S )Nr)   r   r2   )r   r+   r	   )r,   r-   r   r   r   r.   |  s    zasinh.fdiffc             C   s   ddl m} t|}|jr|tjkr*tjS |tjkr:tjS |tjkrJtjS |tjkrZtjS |tj	krtt
tdd S |tjkrt
tdd S |jr| |  S nF|tjkrtjS |tj}|d k	rtj|| S t|r| |  S d S )Nr   )asinr2   r)   )r3   r   r   r4   r   r5   r6   r7   r!   r   r   r   rx   r8   r9   r:   r   r
   )r@   r#   r   rA   r   r   r   rD     s0    






z
asinh.evalc             G   s   | dk s| d dkrt jS t|}t|dkrd| dkrd|d }| | d d  | | d   |d  S | d d }tt j|}t|}d| | | ||   |  S d S )Nr   r2   rE   r)   r   )r   r!   r   rF   r   r"   r   )rG   rB   rH   r&   kRr{   r   r   r   rI     s    &zasinh.taylor_termc             C   sH   ddl m} | jd |}||jkr:|d||r:|S | |S d S )Nr   )ri   r)   )r3   ri   r+   rj   rk   rl   r<   )r,   rB   ri   r#   r   r   r   rm     s
    zasinh._eval_as_leading_termc             C   s   t |t|d d  S )Nr2   r)   )r   r   )r,   rB   r   r   r   _eval_rewrite_as_log  s    zasinh._eval_rewrite_as_logc             C   s   t S )z7
        Returns the inverse of this function.
        )r(   )r,   r-   r   r   r   r0     s    zasinh.inverseN)r)   )r)   )r   r   r   r   r.   rt   rD   ru   r   rI   rm   r   r0   r   r   r   r   r/   p  s   

 	r/   c               @   sP   e Zd ZdZdddZedd Zeedd Z	d	d
 Z
dd ZdddZdS )r=   z
    The inverse hyperbolic cosine function.

    * acosh(x) -> Returns the inverse hyperbolic cosine of x

    See Also
    ========

    asinh, atanh, cosh
    r)   c             C   s0   |dkr"dt | jd d d  S t| |d S )Nr)   r   r2   )r   r+   r	   )r,   r-   r   r   r   r.     s    zacosh.fdiffc          )   C   s  t |}|jr~|tjkrtjS |tjkr.tjS |tjkr>tjS |tjkrXtjtj d S |tj	krhtjS |tj
kr~tjtj S |jrtjttjdtd  tj ttj dtd  tjtjd tj dtj d tdd tjd td d dtj d dtd tjd dtd dtj d tdd tjd td d dtj d tdd td dtj d	 tdd  td d
tj d	 tdtd d tjd tdtd  d d
tj d tdtd d dtj d tdtd  d dtj d dtd dtd  tjd	 dtd  dtd  dtj d	 tdd d tjd tdd  d dtj d i}||kr|jr|| tj S || S |tjkrtjS |tjtj krtjtjtj d  S |tj tj krtjtjtj d  S d S )Nr2   r)         r                     )r   r4   r   r5   r6   r7   r!   r   r   r   rx   	is_numberr   r   r"   rN   r9   )r@   r#   	cst_tabler   r   r   rD     sZ    





   $ 
z
acosh.evalc             G   s   | dkrt jt j d S | dk s,| d dkr2t jS t|}t|dkrz| dkrz|d }|| d d  | | d   |d  S | d d }tt j|}t|}| | t j ||   |  S d S )Nr   r2   rE   r)   )	r   r   r   r!   r   rF   r   r"   r   )rG   rB   rH   r&   r   r   r{   r   r   r   rI     s    $zacosh.taylor_termc             C   sT   ddl m} | jd |}||jkrF|d||rFtjtj d S | 	|S d S )Nr   )ri   r)   r2   )
r3   ri   r+   rj   rk   rl   r   r   r   r<   )r,   rB   ri   r#   r   r   r   rm     s
    zacosh._eval_as_leading_termc             C   s    t |t|d t|d   S )Nr)   )r   r   )r,   rB   r   r   r   r   (  s    zacosh._eval_rewrite_as_logc             C   s   t S )z7
        Returns the inverse of this function.
        )r*   )r,   r-   r   r   r   r0   +  s    zacosh.inverseN)r)   )r)   )r   r   r   r   r.   rt   rD   ru   r   rI   rm   r   r0   r   r   r   r   r=     s   

6	r=   c               @   sP   e Zd ZdZdddZedd Zeedd Z	d	d
 Z
dd ZdddZdS )r>   z
    The inverse hyperbolic tangent function.

    * atanh(x) -> Returns the inverse hyperbolic tangent of x

    See Also
    ========

    asinh, acosh, tanh
    r)   c             C   s,   |dkrdd| j d d   S t| |d S )Nr)   r   r2   )r+   r	   )r,   r-   r   r   r   r.   >  s    zatanh.fdiffc             C   s  ddl m} t|}|jr|tjkr*tjS |tjkr:tjS |tjkrJtjS |tj	krZtj
S |tjkrttj || S |tj
krtj||  S |jr| |  S nn|tjkrddlm} tj|tj d tjd  S |tj}|d k	 rtj|| S t|r| |  S d S )Nr   )atan)AccumBoundsr2   )r3   r   r   r4   r   r5   r!   r   r6   rx   r7   r   r8   r9   sympy.calculus.utilr   r   r:   r
   )r@   r#   r   r   rA   r   r   r   rD   D  s2    








z
atanh.evalc             G   s2   | dk s| d dkrt jS t|}||  |  S d S )Nr   r2   )r   r!   r   )rG   rB   rH   r   r   r   rI   e  s    zatanh.taylor_termc             C   sH   ddl m} | jd |}||jkr:|d||r:|S | |S d S )Nr   )ri   r)   )r3   ri   r+   rj   rk   rl   r<   )r,   rB   ri   r#   r   r   r   rm   n  s
    zatanh._eval_as_leading_termc             C   s   t d| t d|  d S )Nr)   r2   )r   )r,   rB   r   r   r   r   w  s    zatanh._eval_rewrite_as_logc             C   s   t S )z7
        Returns the inverse of this function.
        )rc   )r,   r-   r   r   r   r0   z  s    zatanh.inverseN)r)   )r)   )r   r   r   r   r.   rt   rD   ru   r   rI   rm   r   r0   r   r   r   r   r>   2  s   

!	r>   c               @   sP   e Zd ZdZdddZedd Zeedd Z	d	d
 Z
dd ZdddZdS )r?   zu
    The inverse hyperbolic cotangent function.

    * acoth(x) -> Returns the inverse hyperbolic cotangent of x
    r)   c             C   s,   |dkrdd| j d d   S t| |d S )Nr)   r   r2   )r+   r	   )r,   r-   r   r   r   r.     s    zacoth.fdiffc             C   s   ddl m} t|}|jr|tjkr*tjS |tjkr:tjS |tjkrJtjS |tjkrdtj	tj
 d S |tjkrttjS |tjkrtjS |jr| |  S nH|tjkrtjS |tj
}|d k	rtj
 || S t|r| |  S d S )Nr   )acotr2   )r3   r   r   r4   r   r5   r6   r!   r7   r   r   r   rx   r8   r9   r:   r
   )r@   r#   r   rA   r   r   r   rD     s0    






z
acoth.evalc             G   sJ   | dkrt jt j d S | dk s,| d dkr2t jS t|}||  |  S d S )Nr   r2   )r   r   r   r!   r   )rG   rB   rH   r   r   r   rI     s    zacoth.taylor_termc             C   sT   ddl m} | jd |}||jkrF|d||rFtjtj d S | 	|S d S )Nr   )ri   r)   r2   )
r3   ri   r+   rj   rk   rl   r   r   r   r<   )r,   rB   ri   r#   r   r   r   rm     s
    zacoth._eval_as_leading_termc             C   s$   t dd|  t dd|   d S )Nr)   r2   )r   )r,   rB   r   r   r   r     s    zacoth._eval_rewrite_as_logc             C   s   t S )z7
        Returns the inverse of this function.
        )rf   )r,   r-   r   r   r   r0     s    zacoth.inverseN)r)   )r)   )r   r   r   r   r.   rt   rD   ru   r   rI   rm   r   r0   r   r   r   r   r?     s   
 
	r?   c               @   sH   e Zd ZdZdddZedd Zeedd Z	dd	d
Z
dd ZdS )asecha  
    The inverse hyperbolic secant function.

    * asech(x) -> Returns the inverse hyperbolic secant of x

    Examples
    ========

    >>> from sympy import asech, sqrt, S
    >>> from sympy.abc import x
    >>> asech(x).diff(x)
    -1/(x*sqrt(-x**2 + 1))
    >>> asech(1).diff(x)
    0
    >>> asech(1)
    0
    >>> asech(S(2))
    I*pi/3
    >>> asech(-sqrt(2))
    3*I*pi/4
    >>> asech((sqrt(6) - sqrt(2)))
    I*pi/12

    See Also
    ========

    asinh, atanh, cosh, acoth

    References
    ==========

    .. [1] http://en.wikipedia.org/wiki/Hyperbolic_function
    .. [2] http://dlmf.nist.gov/4.37
    .. [3] http://functions.wolfram.com/ElementaryFunctions/ArcSech/

    r)   c             C   s8   |dkr*| j d }d|td|d    S t| |d S )Nr)   r   r   r2   )r+   r   r	   )r,   r-   zr   r   r   r.     s    
zasech.fdiffc          1   C   sR  t |}|jr|tjkrtjS |tjkr8tjtj d S |tjkrRtjtj d S |tjkrbtjS |tj	krrtjS |tj
krtjtj S |jrtjtjtj d  tdtd  tj tjtj d tdtd  tdtd tjd tdtd dtj d tddtd  tjd tddtd   dtj d dtdtd  tjd	 d
tdtd  dtj d	 dtd tjd d
td dtj d tdd tjd dtd dtj d tdtjd td dtj d tddtd  dtj d tddtd   dtj d tdtjd td dtj d tddtd  dtj d	 tddtd   dtj d	 dtd dtj d dtd dtj d tdtd dtj d td td dtj d i}||kr|jr|| tj S || S |tjkrNddlm} tj|tj d tjd  S d S )Nr2   r)   r   r   r   r   
   	   r   rE   r   r   r   r   r   )r   )r   r4   r   r5   r6   r   r   r7   r!   r   rx   r   r   r   rN   r9   r   r   )r@   r#   r   r   r   r   r   rD     s\    





$$    
z
asech.evalc             G   s   | dkrt d| S | dk s(| d dkr.tjS t|}t|dkrz| dkrz|d }|| d d  | d d  |d  d S | d }ttj||  }t||  d |  d }d| | ||   d S d S )Nr   r2   r)   rE   r   r   )r   r   r!   r   rF   r   r"   r   )rG   rB   rH   r&   r   r   r{   r   r   r   expansion_term0  s    (zasech.expansion_termc             C   s   t S )z7
        Returns the inverse of this function.
        )r   )r,   r-   r   r   r   r0   B  s    zasech.inversec             C   s,   t d| td| d td| d   S )Nr)   )r   r   )r,   r#   r   r   r   r   H  s    zasech._eval_rewrite_as_logN)r)   )r)   )r   r   r   r   r.   rt   rD   ru   r   r   r0   r   r   r   r   r   r     s   $
7
r   c               @   s8   e Zd ZdZdddZedd ZdddZd	d
 ZdS )acscha  
    The inverse hyperbolic cosecant function.

    * acsch(x) -> Returns the inverse hyperbolic cosecant of x

    Examples
    ========

    >>> from sympy import acsch, sqrt, S
    >>> from sympy.abc import x
    >>> acsch(x).diff(x)
    -1/(x**2*sqrt(1 + x**(-2)))
    >>> acsch(1).diff(x)
    0
    >>> acsch(1)
    log(1 + sqrt(2))
    >>> acsch(S.ImaginaryUnit)
    -I*pi/2
    >>> acsch(-2*S.ImaginaryUnit)
    I*pi/6
    >>> acsch(S.ImaginaryUnit*(sqrt(6) - sqrt(2)))
    -5*I*pi/12

    References
    ==========

    .. [1] http://en.wikipedia.org/wiki/Hyperbolic_function
    .. [2] http://dlmf.nist.gov/4.37
    .. [3] http://functions.wolfram.com/ElementaryFunctions/ArcCsch/

    r)   c             C   s@   |dkr2| j d }d|d tdd|d     S t| |d S )Nr)   r   r   r2   )r+   r   r	   )r,   r-   r   r   r   r   r.   m  s    
 zacsch.fdiffc             C   sD  t |}|jr|tjkrtjS |tjkr.tjS |tjkr>tjS |tjkrNtjS |tjkrht	dt
d S |tjkrt	dt
d  S |jrtjtj d tjt
dt
d  tj d tjdt
d  tj d tjd t
dt
d  tj d tjd tj d tjt
ddt
d   tj d tjt
d tj d tjt
dd  d	tj d tjd t
d
 tj d
 tjd t
dt
d  d	tj d tjt
ddt
d   dtj d tjt
dt
d  dtj d tdtj t	dt
d d  i}||kr|| tj S |tjkr*tjS t|r@| |  S d S )Nr)   r2   r   r   r   r   r   r   r   rE   )r   r4   r   r5   r6   r!   r7   r9   r   r   r   rx   r   r   r   r
   )r@   r#   r   r   r   r   rD   t  sD    





""$$ $

z
acsch.evalc             C   s   t S )z7
        Returns the inverse of this function.
        )r   )r,   r-   r   r   r   r0     s    zacsch.inversec             C   s    t d| td|d  d  S )Nr)   r2   )r   r   )r,   r#   r   r   r   r     s    zacsch._eval_rewrite_as_logN)r)   )r)   )	r   r   r   r   r.   rt   rD   r0   r   r   r   r   r   r   L  s
   
,
r   N)&Z
__future__r   r   Z
sympy.corer   r   r   Zsympy.core.addr   Zsympy.core.functionr   r	   r
   Z(sympy.functions.elementary.miscellaneousr   Z&sympy.functions.elementary.exponentialr   r   Z(sympy.functions.combinatorial.factorialsr   r   r   r   r'   r(   r*   rc   rf   r   r   r   r   r/   r=   r>   r?   r   r   r   r   r   r   <module>   s8   ! 3   G;0UmOK 