o
    *ήc                    @   s  d dl mZ d dlmZ d dlmZmZ d dlm	Z	 d dl
mZmZmZmZ d dlmZmZmZmZ d dlmZ d dlmZmZmZmZmZ d d	lmZmZ d d
lm Z  d dl!m"Z"m#Z# d dl$m%Z%m&Z& d dl'm(Z(m)Z) d dl*m+Z,m-Z-m.Z. d dl/m0Z0m1Z1 d dl2m3Z3 d dl4m5Z5m6Z6m7Z7 d dl8m9Z9 d dl:m;Z; d dl<m=Z= d dl>m?Z? d dl@mAZA dd ZBG dd deZCdd ZDdAddZEG d d! d!eCZFG d"d# d#eCZGG d$d% d%eCZHG d&d' d'eCZIG d(d) d)eCZJG d*d+ d+eJZKG d,d- d-eJZLG d.d/ d/eZMG d0d1 d1eZNG d2d3 d3eNZOG d4d5 d5eNZPG d6d7 d7eNZQG d8d9 d9eNZRG d:d; d;eNZSG d<d= d=eNZTG d>d? d?eNZUd@S )B    )Tuple)Add)sympifycacheit)Expr)FunctionArgumentIndexError	PoleError
expand_mul)	fuzzy_notfuzzy_or	FuzzyBool	fuzzy_and)Mod)igcdexRationalpiIntegerFloat)NeEq)S)SymbolDummy)	factorialRisingFactorial)	bernoullieuler)argimre)logexp)floor)sqrtMinMax)	Piecewise)And)	factorint)symmetric_poly)numbered_symbolsc                 C   s   t | trdS | tjS )z; Helper to extract symbolic coefficient for imaginary unit N)
isinstancer   as_coefficientr   ImaginaryUnit)r    r/   O/tmp/pip-target-vg8gfxp4/lib/python/sympy/functions/elementary/trigonometric.py_imaginary_unit_as_coefficient   s   
r1   c                   @   sJ   e Zd ZdZdZejfZdd Zdd Z	dddZ
dd	d
ZdddZdS )TrigonometricFunctionz(Base class for trigonometric functions. Tc                 C   sF   | j | j }|j | j kr |jd jrt|jd jrdS d S d S |jS Nr   F)funcargsis_rationalr   is_zeroselfsr/   r/   r0   _eval_is_rational1   s   z'TrigonometricFunction._eval_is_rationalc                 C   sf   | j | j }|j | j kr0t| jd jr| jd jrdS t| jd }|d ur,|jr.dS d S d S |jS Nr   FT)r4   r5   r   r7   is_algebraic	_pi_coeffr6   )r9   r:   pi_coeffr/   r/   r0   _eval_is_algebraic9   s   z(TrigonometricFunction._eval_is_algebraicc                 K   s&   | j dd|i|\}}||tj  S )Ndeepr/   )as_real_imagr   r.   )r9   rA   hintsre_partim_partr/   r/   r0   _eval_expand_complexD   s   z*TrigonometricFunction._eval_expand_complexc                 K   s   | j d jr#|rd|d< | j d j|fi |tjfS | j d tjfS |r9| j d j|fi | \}}||fS | j d  \}}||fS )Nr   Fcomplex)r5   is_extended_realexpandr   ZerorB   )r9   rA   rC   r    r   r/   r/   r0   _as_real_imagH   s    z#TrigonometricFunction._as_real_imagNc                 C   s   t | jd }|d u rt|jd }||stjS ||kr |S ||jv rV|jr9||\}}||kr9|t	| S |j
rV||\}}|j|dd\}}||krV|t	| S td)Nr   F)as_Addz%Use the periodicity function instead.)r
   r5   tuplefree_symbolshasr   rJ   is_Mulas_independentabsis_AddNotImplementedError)r9   general_periodsymbolfghar/   r/   r0   _periodU   s$   

zTrigonometricFunction._periodTN)__name__
__module____qualname____doc__
unbranchedr   ComplexInfinity_singularitiesr;   r@   rF   rK   r[   r/   r/   r/   r0   r2   +   s    

r2   c                 C   s   t j}g }t| D ]}|t}|r|jr||7 }q
|| q
|t ju r+| t jfS |t j }|| }|j	sAd| j	rL|j
du rLt||t g  |fS | t jfS )a  
    Split ARG into two parts, a "rest" and a multiple of $\pi$.
    This assumes ARG to be an Add.
    The multiple of $\pi$ returned in the second position is always a Rational.

    Examples
    ========

    >>> from sympy.functions.elementary.trigonometric import _peeloff_pi
    >>> from sympy import pi
    >>> from sympy.abc import x, y
    >>> _peeloff_pi(x + pi/2)
    (x, 1/2)
    >>> _peeloff_pi(x + 2*pi/3 + pi*y)
    (x + pi*y + pi/6, 1/2)

       F)r   rJ   r   	make_argscoeffr   r6   appendHalf
is_integeris_even)r   r?   
rest_termsrZ   Km1m2r/   r/   r0   _peeloff_pio   s   






rp      c                 C   s  | t u rtjS | stjS | jr|| t }|rz| \}}|jrYt|d }|dkrOt	t
t|d  }d| }|| }t	|}	|	|krNt|	|}|| }n
tt	|}|| }|jrx|d }
|
dkrf|S |
st|jdurptjS tdS |
| S |S dS | jrtjS dS )a6  
    When arg is a Number times $\pi$ (e.g. $3\pi/2$) then return the Number
    normalized to be in the range $[0, 2]$, else `None`.

    When an even multiple of $\pi$ is encountered, if it is multiplying
    something with known parity then the multiple is returned as 0 otherwise
    as 2.

    Examples
    ========

    >>> from sympy.functions.elementary.trigonometric import _pi_coeff
    >>> from sympy import pi, Dummy
    >>> from sympy.abc import x
    >>> _pi_coeff(3*x*pi)
    3*x
    >>> _pi_coeff(11*pi/7)
    11/7
    >>> _pi_coeff(-11*pi/7)
    3/7
    >>> _pi_coeff(4*pi)
    0
    >>> _pi_coeff(5*pi)
    1
    >>> _pi_coeff(5.0*pi)
    1
    >>> _pi_coeff(5.5*pi)
    3/2
    >>> _pi_coeff(2 + pi)

    >>> _pi_coeff(2*Dummy(integer=True)*pi)
    2
    >>> _pi_coeff(2*Dummy(even=True)*pi)
    0

    rq   r   re   N)r   r   OnerJ   rP   rg   as_coeff_Mulis_FloatrR   introundr!   evalfr   rj   rk   r   r7   )r   cyclescxcxrW   pmcmic2r/   r/   r0   r>      sF   %


r>   c                   @   s   e Zd ZdZd6ddZd7ddZedd	 Zee	d
d Z
d8d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%d& Zd9d(d)Zd*d+ Zd:d,d-Zd.d/ Zd0d1 Zd2d3 Zd4d5 ZdS );sina  
    The sine function.

    Returns the sine of x (measured in radians).

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

    This function will evaluate automatically in the
    case $x/\pi$ is some rational number [4]_.  For example,
    if $x$ is a multiple of $\pi$, $\pi/2$, $\pi/3$, $\pi/4$, and $\pi/6$.

    Examples
    ========

    >>> from sympy import sin, pi
    >>> from sympy.abc import x
    >>> sin(x**2).diff(x)
    2*x*cos(x**2)
    >>> sin(1).diff(x)
    0
    >>> sin(pi)
    0
    >>> sin(pi/2)
    1
    >>> sin(pi/6)
    1/2
    >>> sin(pi/12)
    -sqrt(2)/4 + sqrt(6)/4


    See Also
    ========

    csc, cos, sec, tan, cot
    asin, acsc, acos, asec, atan, acot, atan2

    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Trigonometric_functions
    .. [2] http://dlmf.nist.gov/4.14
    .. [3] http://functions.wolfram.com/ElementaryFunctions/Sin
    .. [4] http://mathworld.wolfram.com/TrigonometryAngles.html

    Nc                 C      |  dt |S Nre   r[   r   r9   rV   r/   r/   r0   period     z
sin.periodrq   c                 C   s    |dkrt | jd S t| |Nrq   r   )cosr5   r   r9   argindexr/   r/   r0   fdiff     
z	sin.fdiffc                 C   s  ddl m} ddlm} |jr*|tju rtjS |jrtjS |tj	tj
fv r*|ddS |tju r2tjS t||rddlm} |j|j}}t|dt  }|tj
urY||d t  }|tj	urf||d t  }||||td ttdd tjur||||ttd	d ttd
d tjur|ddS ||||td ttdd tjur|tt|t|dS ||||ttd	d ttdd tjur|dtt|t|S |tt|t|tt|t|S t||r|| S | r| |  S t|}|d urddlm}	 tj|	| S t|}
|
d ur|
j r+tjS d|
 j r?|
j!du r?tj"|
tj#  S |
j$sR|
t }||krP| |S d S |
j$r|
d }|dkrh| |d t  S d| dkrw| d| t S |
td	d d t }t%|}t|t%s|S |
t |kr| |
t S d S |j&rt'|\}}|r|t }t|t%| t%|t|  S |jrtjS t|t(r|j)d S t|t*r|j)d }|t+d|d   S t|t,r|j)\}}|t+|d |d   S t|t-r|j)d }t+d|d  S t|t.r(|j)d }dt+dd|d   |  S t|t/r7|j)d }d| S t|t0rL|j)d }t+dd|d   S d S )Nr   AccumBoundsSetExprrq   	FiniteSetre               )sinhF)1!sympy.calculus.accumulationboundsr   sympy.sets.setexprr   	is_Numberr   NaNr7   rJ   InfinityNegativeInfinityrc   r,   sympy.sets.setsr   minmaxr#   r   intersectionr   EmptySetr%   r   r&   
_eval_funccould_extract_minus_signr1   %sympy.functions.elementary.hyperbolicr   r.   r>   rj   rk   NegativeOneri   is_Rationalr   rS   rp   asinr5   atanr$   atan2acosacotacscasec)clsr   r   r   r   r   r   di_coeffr   r?   nargr{   resultr}   yr/   r/   r0   eval  s   





"
"(






 






zsin.evalc                 G   sn   | dk s
| d dkrt jS t|}t|dkr(|d }| |d  | | d   S t j| d  ||   t|  S Nr   re   rq   r   rJ   r   lenr   r   nr{   previous_termsr|   r/   r/   r0   taylor_term     zsin.taylor_termr   c                 C   Z   | j d }|d ur|t||}||dtjtjr#td|  tj	| ||||dS Nr   zCannot expand %s around 0)r   logxcdir
r5   subsr!   rO   r   r   rc   r	   r   _eval_nseriesr9   r{   r   r   r   r   r/   r/   r0   r        
zsin._eval_nseriesc                 K   sX   ddl m} tj}t|t|fr||jd t	}t	|| t	| |  d|  S Nr   HyperbolicFunctionre   
r   r   r   r.   r,   r2   r4   r5   rewriter"   )r9   r   kwargsr   Ir/   r/   r0   _eval_rewrite_as_exp  s
   "zsin._eval_rewrite_as_expc                 K   s@   t |trtj}|jd }|||   d |||  d  S d S Nr   re   r,   r!   r   r.   r5   r9   r   r   r   r{   r/   r/   r0   _eval_rewrite_as_Pow  s
   

"zsin._eval_rewrite_as_Powc                 K   s   t |td  ddS Nre   Fevaluater   r   r9   r   r   r/   r/   r0   _eval_rewrite_as_cos     zsin._eval_rewrite_as_cosc                 K   s"   t tj| }d| d|d   S Nre   rq   tanr   ri   r9   r   r   tan_halfr/   r/   r0   _eval_rewrite_as_tan  s   zsin._eval_rewrite_as_tanc                 K   s   t |t| t| S r]   r   r   r   r/   r/   r0   _eval_rewrite_as_sincos     zsin._eval_rewrite_as_sincosc                 K   sL   t tj| }tdttt|dtt|tdfd| d|d   dfS )Nr   re   rq   T	cotr   ri   r'   r(   r   r   r   r   r9   r   r   cot_halfr/   r/   r0   _eval_rewrite_as_cot  s   $zsin._eval_rewrite_as_cotc                 K      |  t tS r]   )r   r   powr   r/   r/   r0   _eval_rewrite_as_pow  r   zsin._eval_rewrite_as_powc                 K   r   r]   )r   r   r$   r   r/   r/   r0   _eval_rewrite_as_sqrt  r   zsin._eval_rewrite_as_sqrtc                 K      dt | S Nrq   cscr   r/   r/   r0   _eval_rewrite_as_csc     zsin._eval_rewrite_as_cscc                 K   s   dt |td  dd S )Nrq   re   Fr   secr   r   r/   r/   r0   _eval_rewrite_as_sec  r   zsin._eval_rewrite_as_secc                 K   s   |t | S r]   )sincr   r/   r/   r0   _eval_rewrite_as_sinc  r   zsin._eval_rewrite_as_sincc                 C      |  | jd  S Nr   r4   r5   	conjugater9   r/   r/   r0   _eval_conjugate  r   zsin._eval_conjugateTc                 K   sH   ddl m}m} | jdd|i|\}}t||| t||| fS Nr   coshr   rA   r/   )r   r  r   rK   r   r   r9   rA   rC   r  r   r    r   r/   r/   r0   rB     s    zsin.as_real_imagc                 K   s  ddl m}m} | jd }d }|jr@| \}}t|dd }t|dd }t|dd }	t|dd }
||
 ||	  S |j	r|j
dd\}}|jr{|jratj|d d  ||t| S ttj|d d  t| ||d t| dd	S t|}|d ur|jr| tS t|S )
Nr   )
chebyshevt
chebyshevuFr   Trationalrq   re   )rA   )#sympy.functions.special.polynomialsr  r  r5   rS   as_two_termsr   _eval_expand_trigr   rP   rs   
is_Integeris_oddr   r   r
   r>   r   r   r$   )r9   rC   r  r  r   r{   r   sxsyry   cyr   r?   r/   r/   r0   r
    s2   
 
zsin._eval_expand_trigc           	      C   s   ddl m} | jd }||d }|t }|jr*||t  |}tj	| | S |tj
u r>|j|dt|jr:dndd}|tjtjfv rK|ddS |jrS| |S | S )Nr   r   -+dirr   rq   r   r   r5   r   cancelr   rj   as_leading_termr   r   rc   limitr    is_negativer   r   	is_finiter4   	r9   r{   r   r   r   r   x0r   ltr/   r/   r0   _eval_as_leading_term  s   


zsin._eval_as_leading_termc                 C      | j d jrdS d S Nr   Tr5   rH   r   r/   r/   r0   _eval_is_extended_real      zsin._eval_is_extended_realc                 C      | j d }|jr
dS d S r  r   r9   r   r/   r/   r0   _eval_is_finite  s   
zsin._eval_is_finitec                 C   "   t | jd \}}|jr|jS d S r   rp   r5   r7   rj   r9   restpi_multr/   r/   r0   _eval_is_zero	     zsin._eval_is_zeroc                 C       | j d js| j d jrdS d S r  r5   rH   
is_complexr   r/   r/   r0   _eval_is_complex  
   
zsin._eval_is_complexr]   rq   r   r\   r   )r^   r_   r`   ra   r   r   classmethodr   staticmethodr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rB   r
  r  r!  r%  r+  r0  r/   r/   r/   r0   r      s:    
/

t


r   c                   @   s   e Zd ZdZd4ddZd5ddZedd	 Zee	d
d Z
d6d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d7d&d'Zd(d) Zd8d*d+Zd,d- Zd.d/ Zd0d1 Zd2d3 ZdS )9r   a  
    The cosine function.

    Returns the cosine of x (measured in radians).

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

    See :func:`sin` for notes about automatic evaluation.

    Examples
    ========

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

    See Also
    ========

    sin, csc, sec, tan, cot
    asin, acsc, acos, asec, atan, acot, atan2

    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Trigonometric_functions
    .. [2] http://dlmf.nist.gov/4.14
    .. [3] http://functions.wolfram.com/ElementaryFunctions/Cos

    Nc                 C   r   r   r   r   r/   r/   r0   r   @  r   z
cos.periodrq   c                 C   s"   |dkrt | jd  S t| |r   )r   r5   r   r   r/   r/   r0   r   C  s   
z	cos.fdiffc              	   C   s`  ddl m} ddlm} ddlm} |jr0|tju rtjS |j	r#tj
S |tjtjfv r0|ddS |tju r8tjS t||rEt|td  S t||rO|| S |jr\|jdu r\|ddS | re| | S t|}|d urwdd	lm} ||S t|}|d ur|jrtj| S d| jr|jdu rtjS |js|t }||kr| |S d S tjtd
d d d}	|jr|j }
|j!d|
  }||
kr|d t }| | S d| |
krd| t }| | S ddddddddd}|
|v r+|t ||
 d  |t ||
 d  }}| || |}}d ||fv rd S || | td | | td |   S |
dkr2d S |
|	v rD|	|j  }||j!|" S d|
d kr|d t }| |}d |kr\d S d| d d }d|dk rldndt#t$|  }|td| d  S d S |j%rt&|\}}|r|t }t'|t'| t|t|  S |j	rtj
S t|t(r|j)d S t|t*r|j)d }dtd|d   S t|t+r|j)\}}|t|d |d   S t|t,r|j)d }td|d  S t|t-r
|j)d }dtdd|d    S t|t.r|j)d }tdd|d   S t|t/r.|j)d }d| S d S )Nr   r  r   r   r   rq   re   F)r  r      )r   r   r   r7  r7  r   r      r;  
   r;  r   r   r=        (   <      rA  rB        rD  rE  x   rG  )0r  r  r   r   r   r   r   r   r   r7   rr   r   r   rc   r,   r   r   r   rH   r  r   r1   r   r  r>   rj   r   rk   rJ   r   ri   r$   qr|   rI   ru   rR   rS   rp   r   r   r5   r   r   r   r   r   r   )r   r   r  r   r   r   r  r?   r   cst_table_somerK  r|   table2rZ   bnvalanvalbctsnvalr{   sign_cosr}   r   r/   r/   r0   r   I  s   
















*(



" 






zcos.evalc                 G   sn   | dk s
| d dkrt jS t|}t|dkr(|d }| |d  | | d   S t j| d  ||   t|  S )Nr   re   rq   r   r   r   r/   r/   r0   r     r   zcos.taylor_termr   c                 C   r   r   r   r   r/   r/   r0   r     r   zcos._eval_nseriesc                 K   sT   t j}ddlm} t|t|fr||jd t	}t	|| t	| |  d S r   
r   r.   r   r   r,   r2   r4   r5   r   r"   )r9   r   r   r   r   r/   r/   r0   r     s
   zcos._eval_rewrite_as_expc                 K   s8   t |trtj}|jd }|| d ||  d  S d S r   r   r   r/   r/   r0   r     s
   

zcos._eval_rewrite_as_Powc                 K   s   t |td  ddS r   )r   r   r   r/   r/   r0   _eval_rewrite_as_sin   r   zcos._eval_rewrite_as_sinc                 K   s"   t tj| d }d| d|  S r   r   r   r/   r/   r0   r     s   zcos._eval_rewrite_as_tanc                 K   s   t |t| t | S r]   r   r   r/   r/   r0   r     r   zcos._eval_rewrite_as_sincosc              	   K   sP   t tj| d }tdttt|dtt|dt df|d |d  dfS )Nre   rq   r   Tr   r   r/   r/   r0   r   
  s   (zcos._eval_rewrite_as_cotc                 K   
   |  |S r]   )r   r   r/   r/   r0   r        
zcos._eval_rewrite_as_powc                    s*  ddl m} fdddfdd	}t|}|d u rd S |jr'| |t S |js,d S dd }tjt	d	d
 d t	dt	d d t	dt	dt	d t	t	ddt	dt	d  d
t	d t	dt	d    dt	d  d   d  | d  fdd}|j
 v r||j |j
 }|j
dk r| }|S |j
d s|d }	t|	t t	}
|	d
 d }t|d rdnd
}|t	d
|
 d  S ||j
}|r|||}dd t|tdD }ttdd |D  |}|t	S ||}dd t|tdD }ttdd |D  |}|S )Nr   r6  c                    s   t | dkrd| d fS t | dkrt| d | d S | dd  }t| d |d \} }t|g fdd|dd D  |g S )Nrq   r   re   r   c                    s   g | ]} | qS r/   r/   .0r   vr/   r0   
<listcomp>"      z>cos._eval_rewrite_as_sqrt.<locals>.migcdex.<locals>.<listcomp>)r   r   rM   )r{   rX   urY   migcdexrZ  r0   r`    s   *z*cos._eval_rewrite_as_sqrt.<locals>.migcdexc                    s   t trS t tstdj djj krjS d |kr1 fddtj D }n	 fdd|D }t|dkrCgS |}fddt|d d |D }t	|ks_J |S )	Nzr is not rationalre   c                    s   g | ]
\}} ||  qS r/   r/   )rY  r{   r   r   r/   r0   r\  .  s    z@cos._eval_rewrite_as_sqrt.<locals>.ipartfrac.<locals>.<listcomp>c                    s   g | ]} | qS r/   r/   rY  r{   ra  r/   r0   r\  0  r]  rq   c                    s&   g | ]\}} j t||  j qS r/   )r|   r   rK  )rY  r   j)rr/   r0   r\  4  s   & r   )
r,   ru   r   	TypeErrorrK  r)   itemsr   zipsum)rd  factorsrZ   rY   ansr_  )r   rd  r0   	ipartfrac$  s    

 z,cos._eval_rewrite_as_sqrt.<locals>.ipartfracc            )      S   s  dd } dd }| dd\}}| |d\}}| |d\}}| |dd	| d
|   \}}	| |dd	| d
|   \}
}| |dd	| d
|   \}}| |dd	| d
|   \}}| |d|| | d
|
   \}}| |d|| | d
|   \}}| |d|| |	 d
|   \}}| |d|| |
 d
|   \}}| |	d||	 | d
|   \}}| |
d||
 | d
|   \}}| |d|| | d
|   \}}| |d|| | d
|	   \}}||d|| | |  } ||d|| | |  }!||d|| | |  }"||d|| | |  }#||d|| | |  }$||d|| | |  }%||  d|!|"   }&||# d|$|%   }'d||& d|'  }(t t d
t |(d  d tj S )a2   Express cos(pi/257) explicitly as a function of radicals
                Based upon the equations in
                http://math.stackexchange.com/questions/516142/how-does-cos2-pi-257-look-like-in-real-radicals
                See also http://www.susqu.edu/brakke/constructions/257-gon.m.txt
            c                 S   s0   | t | d |  d | t | d |  d fS r   r$   rZ   rN  r/   r/   r0   f1H     0z8cos._eval_rewrite_as_sqrt.<locals>._cospi257.<locals>.f1c                 S   s   | t | d |  d S r   rl  rm  r/   r/   r0   f2K  r   z8cos._eval_rewrite_as_sqrt.<locals>._cospi257.<locals>.f2r      @   r7  r   re   r   r   )r$   r   ri   ))rn  rp  t1t2z1z3z2z4y1y5y6y2y3y7y8y4x1x9x2x10x3x11x4x12x5x13x6x14x15x7x8x16v1v2v3v4v5v6u1u2w1r/   r/   r0   	_cospi257B  s6   """""""""z,cos._eval_rewrite_as_sqrt.<locals>._cospi257r   rq   r7  rH         re   ir;  "   )r   r   r    c                    sJ   g } D ]}t | |\}}|dkr"|} || | dkr"t|  S qdS )Nr   rq   F)divmodrh   rM   )r   primesp_iquotient	remainder)rL  r/   r0   _fermatCoordst  s   
z0cos._eval_rewrite_as_sqrt.<locals>._fermatCoordsr  r   c                 S       g | ]}|d  |d t  fqS rq   r   r   rb  r/   r/   r0   r\         z-cos._eval_rewrite_as_sqrt.<locals>.<listcomp>zc                 S      g | ]}|d  qS r3  r/   rb  r/   r/   r0   r\    r]  c                 S   r  r  r  rb  r/   r/   r0   r\    r  c                 S   r  r3  r/   rb  r/   r/   r0   r\    r]  r]   )r  r  r>   rj   r4   r   r   r   ri   r$   rK  r|   rI   r   r   ru   rg  r+   rh  r
  r   )r9   r   r   r  rk  r?   r  r  rvpico2rR  r{   rS  FCdecompXpclsr/   )rL  r`  r0   r     s`   '$$





 
 zcos._eval_rewrite_as_sqrtc                 K   r   r   r   r   r/   r/   r0   r     r   zcos._eval_rewrite_as_secc                 K      dt |t S r   )r   r   r   r   r/   r/   r0   r        zcos._eval_rewrite_as_cscc                 C   r   r   r   r   r/   r/   r0   r     r   zcos._eval_conjugateTc                 K   sJ   ddl m}m} | jdd|i|\}}t||| t| || fS r   )r   r  r   rK   r   r   r  r/   r/   r0   rB     s   "zcos.as_real_imagc                 K   s   ddl m} | jd }d }|jr>| \}}t|dd }t|dd }t|dd }t|dd }	||	 ||  S |jrc|j	dd\}
}|
j
rS||
t|S t|}|d urc|jrc| tS t|S )Nr   r6  Fr   Tr  )r  r  r5   rS   r	  r   r
  r   rP   rs   r  r>   r   r   r$   )r9   rC   r  r   r{   r   r  r  ry   r  rg   termsr?   r/   r/   r0   r
    s&   

zcos._eval_expand_trigc           	      C   s   ddl m} | jd }||d }|td  t }|jr2||t  td  |}tj	| | S |tj
u rF|j|dt|jrBdndd}|tjtjfv rS|ddS |jr[| |S | S )	Nr   r   re   r  r  r  r   rq   r  r  r/   r/   r0   r    s   


zcos._eval_as_leading_termc                 C   r  r  r   r   r/   r/   r0   r!    r"  zcos._eval_is_extended_realc                 C   r#  r  r   r$  r/   r/   r0   r%    s   
zcos._eval_is_finitec                 C   r-  r  r.  r   r/   r/   r0   r0    r1  zcos._eval_is_complexc                 C   s2   t | jd \}}|rt|tj j|jgS |jS r   )rp   r5   r   r   ri   rj   r7   r(  r/   r/   r0   r+    s   zcos._eval_is_zeror]   r2  r3  r\   r   )r^   r_   r`   ra   r   r   r4  r   r5  r   r   r   r   r   rU  r   r   r   r   r   r   r   r   rB   r
  r  r!  r%  r0  r+  r/   r/   r/   r0   r     s<    
+

 
 


r   c                   @   s   e Zd ZdZd8ddZd9ddZd9dd	Zed
d Ze	e
dd Zd:ddZ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<d,d-Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 ZdS )=r   a  
    The tangent function.

    Returns the tangent of x (measured in radians).

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

    See :class:`sin` for notes about automatic evaluation.

    Examples
    ========

    >>> from sympy import tan, pi
    >>> from sympy.abc import x
    >>> tan(x**2).diff(x)
    2*x*(tan(x**2)**2 + 1)
    >>> tan(1).diff(x)
    0
    >>> tan(pi/8).expand()
    -1 + sqrt(2)

    See Also
    ========

    sin, csc, cos, sec, cot
    asin, acsc, acos, asec, atan, acot, atan2

    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Trigonometric_functions
    .. [2] http://dlmf.nist.gov/4.14
    .. [3] http://functions.wolfram.com/ElementaryFunctions/Tan

    Nc                 C      |  t|S r]   r   r   r/   r/   r0   r   	  r   z
tan.periodrq   c                 C   s    |dkrt j| d  S t| |Nrq   re   )r   rr   r   r   r/   r/   r0   r     r   z	tan.fdiffc                 C      t S z7
        Returns the inverse of this function.
        r   r   r/   r/   r0   inverse     ztan.inversec              	   C   s  ddl m} |jr&|tju rtjS |jrtjS |tjtjfv r&|tjtjS |tj	u r.tjS t
||r~|j|j}}t|t }|tjurK||t  }|tjurV||t  }ddlm} ||||td ttdd ru|tjtjS |t|t|S | r| |  S t|}|d urddlm} tj|| S t|d}	|	d ur|	jrtjS |	js|	t }
|
|kr| |
S d S |	jr|	j}|	j| }tddtd d  tddtd  tddtd d  tddtd  d	}|d
v rd| | }|dkrd| }||  S || S |	jd sG|	t d }
t|
t|
td  }}t
|tsGt
|tsG|dkr?tj	S d| ||  S ddddddddd}||v r| |t || d  | |t || d  }}d ||fv ryd S || d||   S |	tj  d tj  t }
t|
t|
td  }}t
|tst
|ts|dkrtj	S || S |
|kr| |
S |j!rt"|\}}|rt|t }|tj	u rt#| S t|S |jrtjS t
|t$r|j%d S t
|t&r |j%\}}|| S t
|t'r|j%d }|td|d   S t
|t(r*|j%d }td|d  | S t
|t)r9|j%d }d| S t
|t*rR|j%d }dtdd|d   |  S t
|t+ri|j%d }tdd|d   | S d S )Nr   r   r   re   r   )tanhrq   r   )rq   re   r   r7  r   r=  r=  r8  r9  r:  r<  r>  r?  r@  rC  rF  ),r   r   r   r   r   r7   rJ   r   r   rc   r,   r   r   r#   r   r   r   r   r   r   r   r1   r   r  r.   r>   rj   r   rK  r|   r$   r   ri   rS   rp   r   r   r5   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r  r?   r   rK  r|   table10r   cresultsresultrM  rO  rP  r{   r}   tanmr   r/   r/   r0   r     s   




$








2









ztan.evalc                 G   sz   | dk s
| d dkrt jS t|}| d d d| d  }}t| d }t| d }t j| | |d  | | ||   S Nr   re   rq   )r   rJ   r   r   r   r   )r   r{   r   rZ   rN  BFr/   r/   r0   r     s   &ztan.taylor_termr   c                 C   sL   | j d |dd t }|r|jr| tj|||dS tj| |||dS )Nr   re   r   r   )r5   r  r   r  r   r   r   r   r9   r{   r   r   r   r   r/   r/   r0   r     s   
ztan._eval_nseriesc                 K   sF   t |tr!tj}|jd }|||  ||   ||  ||   S d S r   r   r   r/   r/   r0   r     s
   

(ztan._eval_rewrite_as_Powc                 C   r   r   r   r   r/   r/   r0   r     r   ztan._eval_conjugateTc                 K   st   | j dd|i|\}}|r2ddlm}m} td| |d|  }td| | |d| | fS | |tjfS NrA   r   r  re   r/   	rK   r   r  r   r   r   r4   r   rJ   r9   rA   rC   r    r   r  r   denomr/   r/   r0   rB     s    ztan.as_real_imagc                    s@  | j d }d }|jrgt|j }g }|j D ]}t|dd }|| qtd  fddt|D }ddg}t|d D ]}	|d|	d    t|	|d	|	d
 d   7  < q=|d |d  	t
t||S |jr|jdd\}
}|
jr|
dkrtj}tddd}d||  |
  }t|t| 	|t|fgS t|S )Nr   Fr   Yc                       g | ]}t  qS r/   nextrX  Ygr/   r0   r\    r]  z)tan._eval_expand_trig.<locals>.<listcomp>rq   re   r   r7  Tr  dummyreal)r5   rS   r   r   r
  rh   r+   ranger*   r   listrg  rP   rs   r  r   r.   r   rI   r   r    )r9   rC   r   r{   r   TXtxr  r|   r   rg   r  r   r  Pr/   r  r0   r
    s,   


0  ztan._eval_expand_trigc                 K   sf   t j}ddlm} t|t|fr||jd t	}t	| | t	|| }}|||  ||  S Nr   r   rT  )r9   r   r   r   r   neg_exppos_expr/   r/   r0   r     s   ztan._eval_rewrite_as_expc                 K   s   dt |d  t d|  S r   r   r9   r{   r   r/   r/   r0   rU       ztan._eval_rewrite_as_sinc                 K   s   t |td  ddt | S r   r   r  r/   r/   r0   r     r  ztan._eval_rewrite_as_cosc                 K      t |t| S r]   r   r   r/   r/   r0   r     r   ztan._eval_rewrite_as_sincosc                 K   r   r   r   r   r/   r/   r0   r     r   ztan._eval_rewrite_as_cotc                 K   $   t |t}t|t}|| S r]   )r   r   r   r   )r9   r   r   sin_in_sec_formcos_in_sec_formr/   r/   r0   r        ztan._eval_rewrite_as_secc                 K   r  r]   )r   r   r   r   )r9   r   r   sin_in_csc_formcos_in_csc_formr/   r/   r0   r     r  ztan._eval_rewrite_as_cscc                 K   "   |  t t}|trd S |S r]   r   r   r   rO   r9   r   r   r   r/   r/   r0   r        
ztan._eval_rewrite_as_powc                 K   r  r]   r   r   r$   rO   r  r/   r/   r0   r     r  ztan._eval_rewrite_as_sqrtc           
      C   s   ddl m} ddlm} | jd }||d }d| t }|jr6||t d  	|}	|j
r2|	S d|	 S |tju rJ|j|d||jrFdndd}|tjtjfv rY|tjtjS |jra| |S | S )	Nr   r   r    re   r   r  r  r  r   r   $sympy.functions.elementary.complexesr    r5   r   r  r   rj   r  rk   r   rc   r  r  r   r   r  r4   
r9   r{   r   r   r   r    r   r  r   r  r/   r/   r0   r    s   

ztan._eval_as_leading_termc                 C      | j d jS r   r   r   r/   r/   r0   r!    s   ztan._eval_is_extended_realc                 C   0   | j d }|jr|t tj jdu rdS d S d S r<   r5   is_realr   r   ri   rj   r$  r/   r/   r0   _eval_is_real   s   
ztan._eval_is_realc                 C   s6   | j d }|jr|t tj jdu rdS |jrdS d S r<   )r5   r  r   r   ri   rj   is_imaginaryr$  r/   r/   r0   r%  %  s   
ztan._eval_is_finitec                 C   r&  r   r'  r(  r/   r/   r0   r+  .  r,  ztan._eval_is_zeroc                 C   r  r<   r  r$  r/   r/   r0   r0  3     
ztan._eval_is_complexr]   r2  r3  r\   r   ) r^   r_   r`   ra   r   r   r  r4  r   r5  r   r   r   r   r   rB   r
  r   rU  r   r   r   r   r   r   r   r  r!  r  r%  r+  r0  r/   r/   r/   r0   r     s>    
%


 	

	
	r   c                   @   s   e Zd ZdZd:ddZd;ddZd;dd	Ze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(d) Zd>d*d+Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Z dS )?r   a  
    The cotangent function.

    Returns the cotangent of x (measured in radians).

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

    See :class:`sin` for notes about automatic evaluation.

    Examples
    ========

    >>> from sympy import cot, pi
    >>> from sympy.abc import x
    >>> cot(x**2).diff(x)
    2*x*(-cot(x**2)**2 - 1)
    >>> cot(1).diff(x)
    0
    >>> cot(pi/12)
    sqrt(3) + 2

    See Also
    ========

    sin, csc, cos, sec, tan
    asin, acsc, acos, asec, atan, acot, atan2

    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Trigonometric_functions
    .. [2] http://dlmf.nist.gov/4.14
    .. [3] http://functions.wolfram.com/ElementaryFunctions/Cot

    Nc                 C   r  r]   r   r   r/   r/   r0   r   `  r   z
cot.periodrq   c                 C   s    |dkrt j| d  S t| |r  )r   r   r   r   r/   r/   r0   r   c  r   z	cot.fdiffc                 C   r  r  r   r   r/   r/   r0   r  i  r  zcot.inversec              	   C   s  ddl m} |jr&|tju rtjS |jrtjS |tjtjfv r&|tjtjS |tju r.tjS t	||r<t
|td   S | rF| |  S t|}|d ur\ddlm} tj || S t|d}|d ur9|jrltjS |js}|t }||kr{| |S d S |jr9|jdv rt
td | S |jdkr|jd s|t d }t|t|td  }}t	|tst	|tsd| ||  S ddd	d
ddddd}	|j}
|j|
 }|
|	v r| |t |	|
 d  | |t |	|
 d  }}d ||fv rd S d||  ||  S |tj d tj t }t|t|td  }}t	|ts0t	|ts0|dkr,tjS || S ||kr9| |S |jr[t|\}}|r[t|t }|tju rVt|S t
| S |jrbtjS t	|trm|jd S t	|tr||jd }d| S t	|tr|j\}}|| S t	|tr|jd }t d|d  | S t	|t!r|jd }|t d|d   S t	|t"r|jd }t dd|d   | S t	|t#r|jd }dt dd|d   |  S d S )Nr   r   re   )cothr  rq   r8  r9  r:  r<  r>  r?  r@  rC  rF  )$r   r   r   r   r   r7   rc   r   r   r,   r   r   r   r1   r   r  r.   r>   rj   r   rK  r   r|   ri   rS   rp   r   r   r5   r   r   r   r$   r   r   r   )r   r   r   r   r  r?   r   r  r  rM  rK  r|   rO  rP  r{   r}   cotmr   r/   r/   r0   r   o  s   








2









zcot.evalc                 G   s|   | dkr
dt | S | dk s| d dkrtjS t |}t| d }t| d }tj| d d  d| d   | | ||   S Nr   rq   re   )r   r   rJ   r   r   r   )r   r{   r   r  r  r/   r/   r0   r     s   .zcot.taylor_termr   c                 C   sL   | j d |dt }|r|jr| tj|||dS | tj|||dS Nr   r  )r5   r  r   r  r   r   r   r   r  r/   r/   r0   r     s   
zcot._eval_nseriesc                 C   r   r   r   r   r/   r/   r0   r     r   zcot._eval_conjugateTc                 K   sv   | j dd|i|\}}|r3ddlm}m} td| |d|  }td|  | |d| | fS | |tjfS r  r  r  r/   r/   r0   rB     s   "zcot.as_real_imagc                 K   sf   ddl m} tj}t|t|fr||jd t	}t	| | t	|| }}|||  ||  S r  r   )r9   r   r   r   r   r  r  r/   r/   r0   r     s   zcot._eval_rewrite_as_expc                 K   sH   t |tr"tj}|jd }| ||  ||   ||  ||   S d S r   r   r   r/   r/   r0   r   	  s
   

*zcot._eval_rewrite_as_Powc                 K   s   t d| dt |d   S r   r  r  r/   r/   r0   rU    r  zcot._eval_rewrite_as_sinc                 K   s   t |t |td  dd S r   r   r  r/   r/   r0   r     r  zcot._eval_rewrite_as_cosc                 K   r  r]   r   r   r   r/   r/   r0   r     r   zcot._eval_rewrite_as_sincosc                 K   r   r   r   r   r/   r/   r0   r     r   zcot._eval_rewrite_as_tanc                 K   r  r]   )r   r   r   r   )r9   r   r   r  r  r/   r/   r0   r     r  zcot._eval_rewrite_as_secc                 K   r  r]   )r   r   r   r   )r9   r   r   r  r  r/   r/   r0   r      r  zcot._eval_rewrite_as_cscc                 K   r  r]   r  r  r/   r/   r0   r   %  r  zcot._eval_rewrite_as_powc                 K   r  r]   r  r  r/   r/   r0   r   +  r  zcot._eval_rewrite_as_sqrtc           
      C   s   ddl m} ddlm} | jd }||d }d| t }|jr7||t d  	|}	|j
r4d|	 S |	 S |tju rK|j|d||jrGdndd}|tjtjfv rZ|tjtjS |jrb| |S | S )	Nr   r   r  re   rq   r  r  r  r  r  r/   r/   r0   r  1  s   

zcot._eval_as_leading_termc                 C   r  r   r   r   r/   r/   r0   r!  @  r   zcot._eval_is_extended_realc                    s@  | j d }d }|jrit|j }g }|j D ]}t|dd }|| qtd  fddt|D }ddg}t|ddD ]}	|||	 d   t|	|d||	 d	 d   7  < q=|d |d
  	t
t||S |jr|jdd\}
}|
jr|
d
krtj}tddd}|| |
  }t|t| 	|t|fgS t|S )Nr   Fr   r  c                    r  r/   r  rX  r  r/   r0   r\  N  r]  z)cot._eval_expand_trig.<locals>.<listcomp>r   re   r7  rq   Tr  r  r  )r5   rS   r   r   r
  rh   r+   r  r*   r   r  rg  rP   rs   r  r   r.   r   rI   r    r   )r9   rC   r   r{   r   CXry   r  r|   r   rg   r  r   r  r  r/   r  r0   r
  C  s,   


4  zcot._eval_expand_trigc                 C   s0   | j d }|jr|t jdu rdS |jrdS d S r<   )r5   r  r   rj   r  r$  r/   r/   r0   r%  ]  s   
zcot._eval_is_finitec                 C   *   | j d }|jr|t jdu rdS d S d S r<   r5   r  r   rj   r$  r/   r/   r0   r  d     
zcot._eval_is_realc                 C   r   r<   r  r$  r/   r/   r0   r0  i  r  zcot._eval_is_complexc                 C   s0   t | jd \}}|r|jr|tj jS d S d S r   )rp   r5   r7   r   ri   rj   )r9   r)  pimultr/   r/   r0   r+  n  s   
zcot._eval_is_zeroc                 C   s6   | j d }|||}||kr|t jrtjS t|S r   )r5   r   r   rj   r   rc   r   )r9   oldnewr   argnewr/   r/   r0   
_eval_subss  s
   
zcot._eval_subsr]   r2  r3  r\   r   )!r^   r_   r`   ra   r   r   r  r4  r   r5  r   r   r   r   rB   r   r   rU  r   r   r   r   r   r   r   r  r!  r
  r%  r  r0  r+  r  r/   r/   r/   r0   r   :  s>    
%


p

	
r   c                   @   s   e Zd ZdZdZejfZdZdZ	e
dd Zdd Zdd Z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$ Zd%d& Zd0d(d)Zd*d+ Zd1d,d-ZdS )2ReciprocalTrigonometricFunctionz@Base class for reciprocal functions of trigonometric functions. Nc                 C   s>  |  r| jr| | S | jr| |  S t|}|d urYd| jsY|jrY|j}|jd|  }||kr>|d t }| | S d| |krYd| t }| jrQ| |S | jrY| | S t	|dri|
 | kri|jd S | j|}|d u ru|S tdd || fD rd| tS tdd || fD rd| tS d| S )Nre   rq   r  r   c                 s       | ]}t |tV  qd S r]   )r,   r   rX  r/   r/   r0   	<genexpr>      z7ReciprocalTrigonometricFunction.eval.<locals>.<genexpr>c                 s   r	  r]   )r,   r   rX  r/   r/   r0   r
    r  )r   _is_even_is_oddr>   rj   r   rK  r|   r   hasattrr  r5   _reciprocal_ofr   anyr   r   r   )r   r   r?   rK  r|   r   tr/   r/   r0   r     s@   



z$ReciprocalTrigonometricFunction.evalc                 O   s$   |  | jd }t|||i |S r   )r  r5   getattr)r9   method_namer5   r   or/   r/   r0   _call_reciprocal  s   z0ReciprocalTrigonometricFunction._call_reciprocalc                 O   s,   | j |g|R i |}|d urd| S |S r   )r  )r9   r  r5   r   r  r/   r/   r0   _calculate_reciprocal  s   z5ReciprocalTrigonometricFunction._calculate_reciprocalc                 C   s2   |  ||}|d ur|| |krd| S d S d S r   )r  r  )r9   r  r   r  r/   r/   r0   _rewrite_reciprocal  s   z3ReciprocalTrigonometricFunction._rewrite_reciprocalc                 C   s   t | jd }| ||S r   )r
   r5   r  r   )r9   rV   rW   r/   r/   r0   r[     s   z'ReciprocalTrigonometricFunction._periodrq   c                 C   s   |  d| | d  S )Nr   re   r  r   r/   r/   r0   r        z%ReciprocalTrigonometricFunction.fdiffc                 K      |  d|S )Nr   r  r   r/   r/   r0   r     r   z4ReciprocalTrigonometricFunction._eval_rewrite_as_expc                 K   r  )Nr   r  r   r/   r/   r0   r     r   z4ReciprocalTrigonometricFunction._eval_rewrite_as_Powc                 K   r  )NrU  r  r   r/   r/   r0   rU    r   z4ReciprocalTrigonometricFunction._eval_rewrite_as_sinc                 K   r  )Nr   r  r   r/   r/   r0   r     r   z4ReciprocalTrigonometricFunction._eval_rewrite_as_cosc                 K   r  )Nr   r  r   r/   r/   r0   r     r   z4ReciprocalTrigonometricFunction._eval_rewrite_as_tanc                 K   r  )Nr   r  r   r/   r/   r0   r     r   z4ReciprocalTrigonometricFunction._eval_rewrite_as_powc                 K   r  )Nr   r  r   r/   r/   r0   r     r   z5ReciprocalTrigonometricFunction._eval_rewrite_as_sqrtc                 C   r   r   r   r   r/   r/   r0   r     r   z/ReciprocalTrigonometricFunction._eval_conjugateTc                 K   s"   d|  | jd  j|fi |S r   )r  r5   rB   )r9   rA   rC   r/   r/   r0   rB     s   z,ReciprocalTrigonometricFunction.as_real_imagc                 K   s   | j di |S )Nr
  )r
  r  )r9   rC   r/   r/   r0   r
    r   z1ReciprocalTrigonometricFunction._eval_expand_trigc                 C   s   |  | jd  S r   )r  r5   r!  r   r/   r/   r0   r!    r   z6ReciprocalTrigonometricFunction._eval_is_extended_realr   c                 C   s   d|  | jd  |S r   )r  r5   r  )r9   r{   r   r   r/   r/   r0   r    s   z5ReciprocalTrigonometricFunction._eval_as_leading_termc                 C   s   d|  | jd  jS r   )r  r5   r  r   r/   r/   r0   r%    r  z/ReciprocalTrigonometricFunction._eval_is_finitec                 C   s   d|  | jd  |||S r   )r  r5   r   r9   r{   r   r   r   r/   r/   r0   r     s   z-ReciprocalTrigonometricFunction._eval_nseriesr2  r\   r   r3  )r^   r_   r`   ra   r  r   rc   rd   r  r  r4  r   r  r  r  r[   r   r   r   rU  r   r   r   r   r   rB   r
  r!  r  r%  r   r/   r/   r/   r0   r  {  s6    
$


r  c                   @   ~   e Zd ZdZeZ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dZdd Zeedd ZdddZdS )r   a  
    The secant function.

    Returns the secant of x (measured in radians).

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

    See :class:`sin` for notes about automatic evaluation.

    Examples
    ========

    >>> from sympy import sec
    >>> from sympy.abc import x
    >>> sec(x**2).diff(x)
    2*x*tan(x**2)*sec(x**2)
    >>> sec(1).diff(x)
    0

    See Also
    ========

    sin, csc, cos, tan, cot
    asin, acsc, acos, asec, atan, acot, atan2

    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Trigonometric_functions
    .. [2] http://dlmf.nist.gov/4.14
    .. [3] http://functions.wolfram.com/ElementaryFunctions/Sec

    TNc                 C   rV  r]   r[   r   r/   r/   r0   r     rW  z
sec.periodc                 K   s    t |d d }|d |d  S r   r  )r9   r   r   cot_half_sqr/   r/   r0   r     s   zsec._eval_rewrite_as_cotc                 K   r   r   r   r   r/   r/   r0   r   !  r   zsec._eval_rewrite_as_cosc                 K      t |t|t |  S r]   r   r   r/   r/   r0   r   $  r   zsec._eval_rewrite_as_sincosc                 K   r  r   )r   r   r   r   r/   r/   r0   rU  '  r  zsec._eval_rewrite_as_sinc                 K   r  r   )r   r   r   r   r/   r/   r0   r   *  r  zsec._eval_rewrite_as_tanc                 K      t td | ddS r   )r   r   r   r/   r/   r0   r   -  r   zsec._eval_rewrite_as_cscrq   c                 C   s.   |dkrt | jd t| jd  S t| |r   )r   r5   r   r   r   r/   r/   r0   r   0  s   
z	sec.fdiffc                 C   r  r<   )r5   r/  r   r   ri   rj   r$  r/   r/   r0   r0  6  r  zsec._eval_is_complexc                 G   sX   | dk s
| d dkrt jS t|}| d }t j| td|  td|  |d|   S r  )r   rJ   r   r   r   r   r   r{   r   kr/   r/   r0   r   <  s
   .zsec.taylor_termr   c           
      C   s   ddl m} ddlm} | jd }||d }|td  t }|jr8||t  td  	|}	t
j| |	 S |t
ju rL|j|d||jrHdndd}|t
jt
jfv r[|t
jt
jS |jrc| |S | S )Nr   r   r  re   r  r  r  r   r   r  r    r5   r   r  r   rj   r  r   r   rc   r  r  r   r   r  r4   r  r/   r/   r0   r  H  s   

zsec._eval_as_leading_termr]   r2  r   )r^   r_   r`   ra   r   r  r  r   r   r   r   rU  r   r   r   r0  r5  r   r   r  r/   r/   r/   r0   r     s"    #


r   c                   @   r  )r   a  
    The cosecant function.

    Returns the cosecant of x (measured in radians).

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

    See :func:`sin` for notes about automatic evaluation.

    Examples
    ========

    >>> from sympy import csc
    >>> from sympy.abc import x
    >>> csc(x**2).diff(x)
    -2*x*cot(x**2)*csc(x**2)
    >>> csc(1).diff(x)
    0

    See Also
    ========

    sin, cos, sec, tan, cot
    asin, acsc, acos, asec, atan, acot, atan2

    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Trigonometric_functions
    .. [2] http://dlmf.nist.gov/4.14
    .. [3] http://functions.wolfram.com/ElementaryFunctions/Csc

    TNc                 C   rV  r]   r  r   r/   r/   r0   r     rW  z
csc.periodc                 K   r   r   r  r   r/   r/   r0   rU    r   zcsc._eval_rewrite_as_sinc                 K   r!  r]   r  r   r/   r/   r0   r     r   zcsc._eval_rewrite_as_sincosc                 K   s    t |d }d|d  d|  S r   r  r   r/   r/   r0   r     s   zcsc._eval_rewrite_as_cotc                 K   r  r   )r   r   r   r   r/   r/   r0   r     r  zcsc._eval_rewrite_as_cosc                 K   r"  r   r   r   r/   r/   r0   r     r   zcsc._eval_rewrite_as_secc                 K   r  r   )r   r   r   r   r/   r/   r0   r     r  zcsc._eval_rewrite_as_tanrq   c                 C   s0   |dkrt | jd  t| jd  S t| |r   )r   r5   r   r   r   r/   r/   r0   r     s   
z	csc.fdiffc                 C   r   r<   r  r$  r/   r/   r0   r0    r  zcsc._eval_is_complexc                 G   s   | dkr
dt | S | dk s| d dkrtjS t |}| d d }tj|d  d dd| d  d  td|  |d| d   td|  S r  )r   r   rJ   r   r   r   r#  r/   r/   r0   r     s   $

zcsc.taylor_termr   c           
      C   s   ddl m} ddlm} | jd }||d }|t }|jr0||t  	|}	t
j| |	 S |t
ju rD|j|d||jr@dndd}|t
jt
jfv rS|t
jt
jS |jr[| |S | S )Nr   r   r  r  r  r  r%  r  r/   r/   r0   r    s   

zcsc._eval_as_leading_termr]   r2  r   )r^   r_   r`   ra   r   r  r  r   rU  r   r   r   r   r   r   r0  r5  r   r   r  r/   r/   r/   r0   r   X  s"    #

r   c                   @   s\   e Zd ZdZejfZdddZedd Z	ddd	Z
d
d Zdd Zdd Zdd ZeZdS )r   a  
    Represents an unnormalized sinc function:

    .. math::

        \operatorname{sinc}(x) =
        \begin{cases}
          \frac{\sin x}{x} & \qquad x \neq 0 \\
          1 & \qquad x = 0
        \end{cases}

    Examples
    ========

    >>> from sympy import sinc, oo, jn
    >>> from sympy.abc import x
    >>> sinc(x)
    sinc(x)

    * Automated Evaluation

    >>> sinc(0)
    1
    >>> sinc(oo)
    0

    * Differentiation

    >>> sinc(x).diff()
    cos(x)/x - sin(x)/x**2

    * Series Expansion

    >>> sinc(x).series()
    1 - x**2/6 + x**4/120 + O(x**6)

    * As zero'th order spherical Bessel Function

    >>> sinc(x).rewrite(jn)
    jn(0, x)

    See also
    ========

    sin

    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Sinc_function

    rq   c                 C   s8   | j d }|dkrt|| t||d   S t| |r  )r5   r   r   r   )r9   r   r{   r/   r/   r0   r     s   

z
sinc.fdiffc                 C   s   |j rtjS |jr|tjtjfv rtjS |tju rtjS |tju r$tjS |	 r-| | S t
|}|d urQ|jrBt|j r@tjS d S d| jrStj|tj  | S d S d S r   )r7   r   rr   r   r   r   rJ   r   rc   r   r>   rj   r   r   ri   )r   r   r?   r/   r/   r0   r     s*   




z	sinc.evalr   c                 C   s    | j d }t|| |||S r   )r5   r   r   r  r/   r/   r0   r     s   
zsinc._eval_nseriesc                 K   s   ddl m} |d|S )Nr   )jn)sympy.functions.special.besselr&  )r9   r   r   r&  r/   r/   r0   _eval_rewrite_as_jn  s   
zsinc._eval_rewrite_as_jnc                 K   s&   t t|| t|tjftjtjfS r]   )r'   r   r   r   rJ   rr   truer   r/   r/   r0   rU  !     &zsinc._eval_rewrite_as_sinc                 C   sP   | j d jrdS t| j d \}}|jrt|j|jgS |jr$|jr&dS d S d S )Nr   TF)r5   is_infiniterp   r7   r   rj   
is_nonzeror   r(  r/   r/   r0   r+  $  s   zsinc._eval_is_zeroc                 C   r-  r  )r5   rH   r  r   r/   r/   r0   r  -  s   zsinc._eval_is_realNr2  r3  )r^   r_   r`   ra   r   rc   rd   r   r4  r   r   r(  rU  r+  r  r%  r/   r/   r/   r0   r     s    4


	r   c                   @   sT   e Zd ZdZejejejejfZ	e
edd Ze
edd Ze
edd ZdS )	InverseTrigonometricFunctionz/Base class for inverse trigonometric functions.c                   C   sB  i t dd td t dd td dt d td t dt d d td t dt dt d  d td t dt d d ttdd t dt dt d  d ttdd tjtd t dt d d td t tjt dd  td t dt d d ttdd t tjt dd  ttdd t dd d td dt d d t d t dd d ttdd t dd t dd  td	 t d d t dd  t d	 t dd t d td	 dt d t d t d	 t dd t dd  ttdd	 dt d t d ttdd	 iS )
Nr   re   r7  rq   r   r   r;  r=  rG  )r$   r   r   r   ri   r/   r/   r/   r0   _asin_table=  sP    &
	
  "z(InverseTrigonometricFunction._asin_tablec                   C   s  t dd td dt d td t dtd t dd td dt d t d dt d ttdd t ddt d  td t ddt d  ttdd t ddt d d  td t ddt d d  ttdd dt d td d	t d t d dt d ttdd iS )
Nr   r;  rq   re   r   r   r=  rG  r   r$   r   r   r/   r/   r/   r0   _atan_table[  s   "z(InverseTrigonometricFunction._atan_tablec                   C   s  i dt d d td t dtd t ddt d d  td dt tddt dd   td t ddt d d  ttdd dt tddt dd   ttdd dtd t ddt d  td dt dt d  td t ddt d  ttdd dt dt d  ttdd dt d td t dd ttdd t dd  ttd	d t dt d td
 t dt d ttdd
 t dt d  ttdd
 S )Nre   r   r7  r   rq   r   r;  r=  rG  r/  r/   r/   r/   r0   _acsc_tablep  sF   ""(	
z(InverseTrigonometricFunction._acsc_tableN)r^   r_   r`   ra   r   rr   r   rJ   rc   rd   r5  r   r.  r0  r3  r/   r/   r/   r0   r-  9  s    r-  c                   @   s   e Zd ZdZd%ddZdd Zdd Zd	d
 Zedd Z	e
edd Zd&ddZd'ddZdd Zdd Zdd ZeZdd Zdd Zdd  Zd!d" Zd%d#d$ZdS )(r   ab  
    The inverse sine function.

    Returns the arcsine of x in radians.

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

    ``asin(x)`` will evaluate automatically in the cases
    $x \in \{\infty, -\infty, 0, 1, -1\}$ and for some instances when the
    result is a rational multiple of $\pi$ (see the ``eval`` class method).

    A purely imaginary argument will lead to an asinh expression.

    Examples
    ========

    >>> from sympy import asin, oo
    >>> asin(1)
    pi/2
    >>> asin(-1)
    -pi/2
    >>> asin(-oo)
    oo*I
    >>> asin(oo)
    -oo*I

    See Also
    ========

    sin, csc, cos, sec, tan, cot
    acsc, acos, asec, atan, acot, atan2

    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Inverse_trigonometric_functions
    .. [2] http://dlmf.nist.gov/4.23
    .. [3] http://functions.wolfram.com/ElementaryFunctions/ArcSin

    rq   c                 C   s,   |dkrdt d| jd d   S t| |Nrq   r   re   r$   r5   r   r   r/   r/   r0   r        
z
asin.fdiffc                 C   2   | j | j }|j | j kr|jd jrdS d S |jS r3   r4   r5   r6   r8   r/   r/   r0   r;        zasin._eval_is_rationalc                 C      |   o	| jd jS r   )r!  r5   is_positiver   r/   r/   r0   _eval_is_positive  r   zasin._eval_is_positivec                 C   r:  r   )r!  r5   r  r   r/   r/   r0   _eval_is_negative  r   zasin._eval_is_negativec                 C   s  |j r:|tju rtjS |tju rtjtj S |tju r!tjtj S |jr'tjS |tju r0t	d S |tj
u r:t	 d S |tju rBtjS | rL| |  S |jr[|  }||v r[|| S t|}|d urpddlm} tj|| S |jrvtjS t|tr|jd }|jr|dt	 ; }|t	krt	| }|t	d krt	| }|t	 d k rt	 | }|S t|tr|jd }|jrt	d t| S d S d S )Nre   r   )asinh)r   r   r   r   r   r.   r7   rJ   rr   r   r   rc   r   	is_numberr.  r1   r   r>  r,   r   r5   is_comparabler   r   )r   r   
asin_tabler   r>  angr/   r/   r0   r     sX   











z	asin.evalc                 G   s   | dk s
| d dkrt jS t|}t|dkr1| dkr1|d }|| d d  | | d   |d  S | d d }tt j|}t|}|| ||   |  S r   )r   rJ   r   r   r   ri   r   r   r{   r   r|   r$  Rr  r/   r/   r0   r    	  s   $zasin.taylor_termNr   c                 C   s   | j d }||d }|jr||S |tj tjtjfv r-| t	j
|||d S |dkr7|||}t|dk rM|jrM|tjk rMt | | S t|dkrb|jrb|tjkrbt| | S | |S Nr   r   r   )r5   r   r  r7   r  r   rr   rc   r   r!   r  rI   r  r   r  r   r   r4   r9   r{   r   r   r   r  r/   r/   r0   r  	  s   


zasin._eval_as_leading_termc                 C   s  ddl m} | jd |d}|tju rtddd}ttj|d  t	
|dd| }tj| jd  }	|	|}
|	|
 |
 }||dsX|dkrN|dS td |t| S ttj| j|||d}| t|
  }| ||  ||| | S |tju rtddd}ttj|d  t	
|dd| }tj| jd  }	|	|}
|	|
 |
 }||ds|dkr|dS t d |t| S ttj| j|||d}| t|
  }| ||  ||| | S tj| |||d}|tju r|S |dkr| jd ||}t|dk r+|jr+|tjk r+t | S t|dkr@|jr@|tjkr@t| S |S 	Nr   Or  Tpositivere   rq   r  )sympy.series.orderrJ  r5   r   r   rr   r   r   r   r!   nseriesr  is_meromorphicr   r$   r   removeOrI   powsimpr   r   rc   r  r   r  r9   r{   r   r   r   rJ  arg0r  serarg1rW   rX   res1resr/   r/   r0   r    	  sD   
&
$&
&
&&
"
"zasin._eval_nseriesc                 K      t d t| S r   r   r   r  r/   r/   r0   _eval_rewrite_as_acosF	  r   zasin._eval_rewrite_as_acosc                 K   s    dt |dtd|d     S r   )r   r$   r  r/   r/   r0   _eval_rewrite_as_atanI	      zasin._eval_rewrite_as_atanc                 K   s&   t j tt j| td|d    S r  r   r.   r!   r$   r  r/   r/   r0   _eval_rewrite_as_logL	  r*  zasin._eval_rewrite_as_logc                 K   s    dt dtd|d   |  S r   )r   r$   r   r/   r/   r0   _eval_rewrite_as_acotP	  r\  zasin._eval_rewrite_as_acotc                 K      t d td|  S r   r   r   r   r/   r/   r0   _eval_rewrite_as_asecS	  r   zasin._eval_rewrite_as_asecc                 K      t d| S r   )r   r   r/   r/   r0   _eval_rewrite_as_acscV	  r   zasin._eval_rewrite_as_acscc                 C      | j d }|jodt| jS Nr   rq   r5   rH   rR   is_nonnegativer9   r{   r/   r/   r0   r!  Y	     
zasin._eval_is_extended_realc                 C   r  r  r  r   r/   r/   r0   r  ]	  r  zasin.inverser2  r   r3  )r^   r_   r`   ra   r   r;   r<  r=  r4  r   r5  r   r   r  r   rZ  r[  r^  _eval_rewrite_as_tractabler_  rb  rd  r!  r  r/   r/   r/   r0   r     s,    
*
6

&r   c                   @   s   e Zd ZdZd%ddZdd Zedd Zee	d	d
 Z
d&ddZdd Zdd Zd'ddZdd ZeZdd Zdd Zd%ddZdd Zdd  Zd!d" Zd#d$ ZdS )(r   a  
    The inverse cosine function.

    Returns the arc cosine of x (measured in radians).

    Examples
    ========

    ``acos(x)`` will evaluate automatically in the cases
    $x \in \{\infty, -\infty, 0, 1, -1\}$ and for some instances when
    the result is a rational multiple of $\pi$ (see the eval class method).

    ``acos(zoo)`` evaluates to ``zoo``
    (see note in :class:`sympy.functions.elementary.trigonometric.asec`)

    A purely imaginary argument will be rewritten to asinh.

    Examples
    ========

    >>> from sympy import acos, oo
    >>> acos(1)
    0
    >>> acos(0)
    pi/2
    >>> acos(oo)
    oo*I

    See Also
    ========

    sin, csc, cos, sec, tan, cot
    asin, acsc, asec, atan, acot, atan2

    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Inverse_trigonometric_functions
    .. [2] http://dlmf.nist.gov/4.23
    .. [3] http://functions.wolfram.com/ElementaryFunctions/ArcCos

    rq   c                 C   s,   |dkrdt d| jd d   S t| |Nrq   r   r   re   r5  r   r/   r/   r0   r   	  r6  z
acos.fdiffc                 C   r7  r3   r8  r8   r/   r/   r0   r;   	  r9  zacos._eval_is_rationalc                 C   sP  |j r7|tju rtjS |tju rtjtj S |tju r!tjtj S |jr(td S |tju r0tj	S |tj
u r7tS |tju r?tjS |jr`|  }||v rRtd ||  S | |v r`td ||   S t|}|d urptd t| S t|tr|jd }|jr|dt ; }|tkrdt | }|S t|tr|jd }|jrtd t| S d S d S Nre   r   )r   r   r   r   r.   r   r7   r   rr   rJ   r   rc   r?  r.  r1   r   r,   r   r5   r@  r   )r   r   rA  r   rB  r/   r/   r0   r   	  sJ   










z	acos.evalc                 G   s   | dkrt d S | dk s| d dkrtjS t|}t|dkr9| dkr9|d }|| d d  | | d   |d  S | d d }ttj|}t|}| | ||   |  S r   )r   r   rJ   r   r   r   ri   r   rC  r/   r/   r0   r   	  s   $zacos.taylor_termNr   c                 C   s   | j d }||d }|dkrtdttj| | S |tj tjfv r3| t	j
|||dS |dkr=|||}t|dk rT|jrT|tjk rTdt | | S t|dkrh|jrh|tjkrh| | S | |S Nr   rq   re   rF  )r5   r   r  r$   r   rr   r  rc   r   r!   r  r  r   r  r   r   r4   rG  r/   r/   r0   r  	  s   

zacos._eval_as_leading_termc                 C   re  rf  rg  ri  r/   r/   r0   r!  	  rj  zacos._eval_is_extended_realc                 C   s   |   S r]   )r!  r   r/   r/   r0   _eval_is_nonnegative	  s   zacos._eval_is_nonnegativec                 C   st  ddl m} | jd |d}|tju r~tddd}ttj|d  t	
|dd| }tj| jd  }	|	|}
|	|
 |
 }||dsT|dkrN|dS |t|S ttj| j|||d}| t|
  }| ||  ||| | S |tju rtddd}ttj|d  t	
|dd| }tj| jd  }	|	|}
|	|
 |
 }||ds|dkr|dS t|t| S ttj| j|||d}| t|
  }| ||  ||| | S tj| |||d}|tju r|S |dkr| jd ||}t|dk r$|jr$|tjk r$dt | S t|dkr8|jr8|tjkr8| S |S rH  )rM  rJ  r5   r   r   rr   r   r   r   r!   rN  r  rO  r$   r   rP  rI   rQ  r   r   r   rc   r  r   r  rR  r/   r/   r0   r   	  sD   
&
&
&
 &

""zacos._eval_nseriesc                 K   s,   t d tjttj| td|d     S r   r   r   r.   r!   r$   r  r/   r/   r0   r^  
  s   
zacos._eval_rewrite_as_logc                 K   rX  r   r   r   r  r/   r/   r0   _eval_rewrite_as_asin
  r   zacos._eval_rewrite_as_asinc                 K   s8   t td|d  | td d|td|d      S r  )r   r$   r   r  r/   r/   r0   r[  !
     8zacos._eval_rewrite_as_atanc                 C   r  r  r   r   r/   r/   r0   r  $
  r  zacos.inversec                 K   s(   t d dtdtd|d   |   S r   )r   r   r$   r   r/   r/   r0   r_  *
     (zacos._eval_rewrite_as_acotc                 K   rc  r   )r   r   r/   r/   r0   rb  -
  r   zacos._eval_rewrite_as_asecc                 K   r`  r   r   r   r   r/   r/   r0   rd  0
  r   zacos._eval_rewrite_as_acscc                 C   sV   | j d }| | j d  }|jdu r|S |jr%|d jr'|d jr)|S d S d S d S Nr   Frq   )r5   r4   r   rH   rh  is_nonpositive)r9   r  rd  r/   r/   r0   r   3
  s   

zacos._eval_conjugater2  r   r3  )r^   r_   r`   ra   r   r;   r4  r   r5  r   r   r  r!  ro  r   r^  rk  rr  r[  r  r_  rb  rd  r   r/   r/   r/   r0   r   d	  s,    
+
+

&
r   c                       s   e Zd ZU dZee ed< ejej fZ	d*ddZ
dd Zdd	 Zd
d Zdd Zdd Zedd Zeedd Zd+ddZd,ddZdd ZeZ fddZd*ddZd d! Zd"d# Zd$d% Zd&d' Zd(d) Z  Z S )-r   a  
    The inverse tangent function.

    Returns the arc tangent of x (measured in radians).

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

    ``atan(x)`` will evaluate automatically in the cases
    $x \in \{\infty, -\infty, 0, 1, -1\}$ and for some instances when the
    result is a rational multiple of $\pi$ (see the eval class method).

    Examples
    ========

    >>> from sympy import atan, oo
    >>> atan(0)
    0
    >>> atan(1)
    pi/4
    >>> atan(oo)
    pi/2

    See Also
    ========

    sin, csc, cos, sec, tan, cot
    asin, acsc, acos, asec, acot, atan2

    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Inverse_trigonometric_functions
    .. [2] http://dlmf.nist.gov/4.23
    .. [3] http://functions.wolfram.com/ElementaryFunctions/ArcTan

    r5   rq   c                 C   s(   |dkrdd| j d d   S t| |r4  r5   r   r   r/   r/   r0   r   g
     
z
atan.fdiffc                 C   r7  r3   r8  r8   r/   r/   r0   r;   m
  r9  zatan._eval_is_rationalc                 C   r  r   )r5   is_extended_positiver   r/   r/   r0   r<  u
  r   zatan._eval_is_positivec                 C   r  r   )r5   is_extended_nonnegativer   r/   r/   r0   ro  x
  r   zatan._eval_is_nonnegativec                 C   r  r   )r5   r7   r   r/   r/   r0   r+  {
  r   zatan._eval_is_zeroc                 C   r  r   r   r   r/   r/   r0   r  ~
  r   zatan._eval_is_realc                 C   s  |j r7|tju rtjS |tju rtd S |tju rt d S |jr$tjS |tju r-td S |tj	u r7t d S |tj
u rLddlm} |t d td S | rV| |  S |jre|  }||v re|| S t|}|d urzddlm} tj|| S |jrtjS t|tr|jd }|jr|t; }|td kr|t8 }|S t|tr|jd }|jrtd t| }|td kr|t8 }|S d S d S )Nre   r7  r   r   )atanh)r   r   r   r   r   r   r7   rJ   rr   r   rc   r   r   r   r?  r0  r1   r   r|  r.   r,   r   r5   r@  r   r   )r   r   r   
atan_tabler   r|  rB  r/   r/   r0   r   
  sX   











z	atan.evalc                 G   s@   | dk s
| d dkrt jS t|}t j| d d  ||   |  S r  )r   rJ   r   r   r   r{   r   r/   r/   r0   r   
  s   zatan.taylor_termNr   c                 C   s   | j d }||d }|jr||S |tj tjtjfv r-| t	j
|||d S |dkr7|||}t|dk rPt|jrPt|tjkrP| |t S t|dkrit|jrit|tjk ri| |t S | |S rE  )r5   r   r  r7   r  r   r.   rc   r   r!   r  rI   r  r    r   rr   r4   r   r   rG  r/   r/   r0   r  
  s   

$$
zatan._eval_as_leading_termc                 C   s   | j d |d}tj| |||d}|dkr| j d ||}|tju r0t|dkr.|t S |S t|dk rFt|j	rFt
|tjkrF|t S t|dkr\t|j	r\t
|tjk r\|t S |S r  )r5   r   r   r   r  r   rc   r    r   r7   r   rr   r   r9   r{   r   r   r   rS  rW  r/   r/   r0   r   
  s   
$$zatan._eval_nseriesc                 K   s2   t jd tt jt j|  tt jt j|    S r   )r   r.   r!   rr   r  r/   r/   r0   r^  
  s   zatan._eval_rewrite_as_logc                    sx   |d t ju rtd td| jd   |||S |d t ju r3t d td| jd   |||S t ||||S r  )	r   r   r   r   r5   r   r   super_eval_aseriesr9   r   args0r{   r   	__class__r/   r0   r  
  s
   $&zatan._eval_aseriesc                 C   r  r  r  r   r/   r/   r0   r  
  r  zatan.inversec                 K   s0   t |d | td tdt d|d     S r   r$   r   r   r   r/   r/   r0   rr  
  ro  zatan._eval_rewrite_as_asinc                 K   s(   t |d | tdt d|d    S r   r$   r   r   r/   r/   r0   rZ  
  rt  zatan._eval_rewrite_as_acosc                 K   rc  r   r  r   r/   r/   r0   r_  
  r   zatan._eval_rewrite_as_acotc                 K   s$   t |d | tt d|d   S r   r$   r   r   r/   r/   r0   rb  
  s   $zatan._eval_rewrite_as_asecc                 K   s,   t |d | td tt d|d    S r   r$   r   r   r   r/   r/   r0   rd  
     ,zatan._eval_rewrite_as_acscr2  r   r3  )!r^   r_   r`   ra   tTupler   __annotations__r   r.   rd   r   r;   r<  ro  r+  r  r4  r   r5  r   r   r  r   r^  rk  r  r  rr  rZ  r_  rb  rd  __classcell__r/   r/   r  r0   r   <
  s4   
 &

4


r   c                       s   e Zd ZdZejej fZd'ddZdd Zdd Z	d	d
 Z
dd Zedd Zeedd Zd(ddZd)ddZ fddZdd ZeZd'ddZdd Zdd  Zd!d" Zd#d$ Zd%d& Z  ZS )*r   a  
    The inverse cotangent function.

    Returns the arc cotangent of x (measured in radians).

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

    ``acot(x)`` will evaluate automatically in the cases
    $x \in \{\infty, -\infty, \tilde{\infty}, 0, 1, -1\}$
    and for some instances when the result is a rational multiple of $\pi$
    (see the eval class method).

    A purely imaginary argument will lead to an ``acoth`` expression.

    ``acot(x)`` has a branch cut along $(-i, i)$, hence it is discontinuous
    at 0. Its range for real $x$ is $(-\frac{\pi}{2}, \frac{\pi}{2}]$.

    Examples
    ========

    >>> from sympy import acot, sqrt
    >>> acot(0)
    pi/2
    >>> acot(1)
    pi/4
    >>> acot(sqrt(3) - 2)
    -5*pi/12

    See Also
    ========

    sin, csc, cos, sec, tan, cot
    asin, acsc, acos, asec, atan, atan2

    References
    ==========

    .. [1] http://dlmf.nist.gov/4.23
    .. [2] http://functions.wolfram.com/ElementaryFunctions/ArcCot

    rq   c                 C   s(   |dkrdd| j d d   S t| |rl  rx  r   r/   r/   r0   r   .  ry  z
acot.fdiffc                 C   r7  r3   r8  r8   r/   r/   r0   r;   4  r9  zacot._eval_is_rationalc                 C   r  r   )r5   rh  r   r/   r/   r0   r<  <  r   zacot._eval_is_positivec                 C   r  r   )r5   r  r   r/   r/   r0   r=  ?  r   zacot._eval_is_negativec                 C   r  r   r   r   r/   r/   r0   r!  B  r   zacot._eval_is_extended_realc                 C   s  |j r5|tju rtjS |tju rtjS |tju rtjS |jr"td S |tju r+td S |tj	u r5t d S |tj
u r=tjS | rG| |  S |jrf|  }||v rftd ||  }|td krd|t8 }|S t|}|d ur|ddlm} tj || S |jrttj S t|tr|jd }|jr|t; }|td kr|t8 }|S t|tr|jd }|jrtd t| }|td kr|t8 }|S d S d S )Nre   r7  r   )acoth)r   r   r   r   rJ   r   r7   r   rr   r   rc   r   r?  r0  r1   r   r  r.   ri   r,   r   r5   r@  r   r   )r   r   r}  rB  r   r  r/   r/   r0   r   E  s\   











z	acot.evalc                 G   sP   | dkrt d S | dk s| d dkrtjS t|}tj| d d  ||   |  S r  )r   r   rJ   r   r   r~  r/   r/   r0   r   {  s   zacot.taylor_termNr   c                 C   s   | j d }||d }|tju rd| |S |dkr#|||}|tj tjtjfv r;| 	t
j|||d S t|dkr[t|jr[t|tjkr[t|tjk r[| |t S t|dk r{t|jr{t|tjk r{t|tjkr{| |t S | |S )Nr   rq   rF  )r5   r   r  r   rc   r  r  r.   rJ   r   r!   r  rI   r    r7   r   rr   r4   r   r   rG  r/   r/   r0   r    s   

22
zacot._eval_as_leading_termc                 C   s   | j d |d}tj| |||d}|tju r|S |dkr&| j d ||}|jr5t|dk r3|t	 S |S t|dkrRt|jrRt
|tjkrRt
|tjk rR|t	 S t|dk rot|jrot
|tjk rot
|tjkro|t	 S |S r  )r5   r   r   r   r   rc   r  r7   r    r   r   rJ   rr   r   r  r/   r/   r0   r     s   
22zacot._eval_nseriesc                    s   |d t ju rtd td| jd   |||S |d t ju r5ttdd td| jd   |||S tt	| 
||||S )Nr   re   rq   r   )r   r   r   r   r5   r   r   r   r  r   r  r  r  r/   r0   r    s
   $*zacot._eval_aseriesc                 K   s.   t jd tdt j|  tdt j|    S r   )r   r.   r!   r  r/   r/   r0   r^    s   zacot._eval_rewrite_as_logc                 C   r  r  r  r   r/   r/   r0   r    r  zacot.inversec                 K   s@   |t d|d   td tt |d  t |d  d    S r  r  r   r/   r/   r0   rr    s   *zacot._eval_rewrite_as_asinc                 K   s8   |t d|d   tt |d  t |d  d   S r  r  r   r/   r/   r0   rZ    rs  zacot._eval_rewrite_as_acosc                 K   rc  r   r  r   r/   r/   r0   r[    r   zacot._eval_rewrite_as_atanc                 K   s0   |t d|d   tt d|d  |d   S r  r  r   r/   r/   r0   rb    ro  zacot._eval_rewrite_as_asecc                 K   s8   |t d|d   td tt d|d  |d    S r  r  r   r/   r/   r0   rd    rs  zacot._eval_rewrite_as_acscr2  r   r3  )r^   r_   r`   ra   r   r.   rd   r   r;   r<  r=  r!  r4  r   r5  r   r   r  r   r  r^  rk  r  rr  rZ  r[  rb  rd  r  r/   r/   r  r0   r     s0    *

5
	

r   c                   @   s   e Zd ZdZedd ZdddZdddZdddZdddZ	dd Z
dd ZeZdd Zdd Zdd Zdd Zdd Zd	S ) r   a  
    The inverse secant function.

    Returns the arc secant of x (measured in radians).

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

    ``asec(x)`` will evaluate automatically in the cases
    $x \in \{\infty, -\infty, 0, 1, -1\}$ and for some instances when the
    result is a rational multiple of $\pi$ (see the eval class method).

    ``asec(x)`` has branch cut in the interval $[-1, 1]$. For complex arguments,
    it can be defined [4]_ as

    .. math::
        \operatorname{sec^{-1}}(z) = -i\frac{\log\left(\sqrt{1 - z^2} + 1\right)}{z}

    At ``x = 0``, for positive branch cut, the limit evaluates to ``zoo``. For
    negative branch cut, the limit

    .. math::
        \lim_{z \to 0}-i\frac{\log\left(-\sqrt{1 - z^2} + 1\right)}{z}

    simplifies to :math:`-i\log\left(z/2 + O\left(z^3\right)\right)` which
    ultimately evaluates to ``zoo``.

    As ``acos(x) = asec(1/x)``, a similar argument can be given for
    ``acos(x)``.

    Examples
    ========

    >>> from sympy import asec, oo
    >>> asec(1)
    0
    >>> asec(-1)
    pi
    >>> asec(0)
    zoo
    >>> asec(-oo)
    pi/2

    See Also
    ========

    sin, csc, cos, sec, tan, cot
    asin, acsc, acos, atan, acot, atan2

    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Inverse_trigonometric_functions
    .. [2] http://dlmf.nist.gov/4.23
    .. [3] http://functions.wolfram.com/ElementaryFunctions/ArcSec
    .. [4] http://reference.wolfram.com/language/ref/ArcSec.html

    c                 C   s  |j rtjS |jr |tju rtjS |tju rtjS |tju r tS |tj	tj
tjfv r.td S |jrO|  }||v rAtd ||  S | |v rOtd ||   S |jrWtjd S t|trv|jd }|jrv|dt ; }|tkrtdt | }|S t|tr|jd }|jrtd t| S d S d S rm  )r7   r   rc   r   r   rr   rJ   r   r   r   r   r?  r3  r+  Pir,   r   r5   r@  r   r   r   r   
acsc_tablerB  r/   r/   r0   r     s@   








z	asec.evalrq   c                 C   s>   |dkrd| j d d tdd| j d d     S t| |r4  r5   r$   r   r   r/   r/   r0   r   -     ,
z
asec.fdiffc                 C   r  r  r  r   r/   r/   r0   r  3  r  zasec.inverseNr   c                 C   s   | j d }||d }|dkrtdt|tj | S |tj tjfv r3| t	j
|||dS |dkr=|||}t|dk rV|jrV|tjkrV|tjk rV| | S t|dkrr|jrr|tjk rr|tjkrrdt | | S | |S rn  )r5   r   r  r$   r   rr   r  rJ   r   r!   r  r  r   r  r4   r   r   rG  r/   r/   r0   r  9  s   
&&
zasec._eval_as_leading_termc                 C   s.  ddl m} | jd |d}|tju rjtddd}ttj|d  t	
|dd| }tj| jd  }	|	|}
|	|
 |
 }ttj| j|||d}| t|
  }| ||  ||| | S |tju rtddd}ttj|d  t	
|dd| }tj| jd  }	|	|}
|	|
 |
 }ttj| j|||d}| t|
  }| ||  ||| | S tj| |||d}|tju r|S |dkr| jd ||}t|dk r|jr|tjkr|tjk r| S t|dkr|jr|tjk r|tjkrdt | S |S Nr   rI  r  TrK  re   r  )rM  rJ  r5   r   r   rr   r   r   r   r!   rN  r   r  r$   r   rP  rI   rQ  r   rc   r  r   r  rJ   r   rR  r/   r/   r0   r   I  s<   
&
&
&
&
&.zasec._eval_nseriesc                 C   s2   | j d }|jdu rdS t|d j| d jfS rv  )r5   rH   r   rh  ri  r/   r/   r0   r!  k  s   

zasec._eval_is_extended_realc              	   K   s0   t d tjttj| tdd|d      S r   rp  r   r/   r/   r0   r^  q  ro  zasec._eval_rewrite_as_logc                 K   r`  r   rq  r   r/   r/   r0   rr  u  r   zasec._eval_rewrite_as_asinc                 K   rc  r   )r   r   r/   r/   r0   rZ  x  r   zasec._eval_rewrite_as_acosc                 K   s8   t |d | }td d|  |tt |d d   S r   r$   r   r   r9   r{   r   sx2xr/   r/   r0   r[  {  s   (zasec._eval_rewrite_as_atanc                 K   s<   t |d | }td d|  |tdt |d d    S r   r$   r   r   r  r/   r/   r0   r_    s   ,zasec._eval_rewrite_as_acotc                 K   rX  r   ru  r   r/   r/   r0   rd    r   zasec._eval_rewrite_as_acscr2  r   r3  )r^   r_   r`   ra   r4  r   r   r  r  r   r!  r^  rk  rr  rZ  r[  r_  rd  r/   r/   r/   r0   r     s     ;

%


"r   c                   @   sx   e Zd ZdZedd ZdddZdddZdddZdddZ	dd Z
e
Zdd Zdd Zdd Zdd Zdd Zd	S )r   aT  
    The inverse cosecant function.

    Returns the arc cosecant of x (measured in radians).

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

    ``acsc(x)`` will evaluate automatically in the cases
    $x \in \{\infty, -\infty, 0, 1, -1\}$` and for some instances when the
    result is a rational multiple of $\pi$ (see the ``eval`` class method).

    Examples
    ========

    >>> from sympy import acsc, oo
    >>> acsc(1)
    pi/2
    >>> acsc(-1)
    -pi/2
    >>> acsc(oo)
    0
    >>> acsc(-oo) == acsc(oo)
    True
    >>> acsc(0)
    zoo

    See Also
    ========

    sin, csc, cos, sec, tan, cot
    asin, acos, asec, atan, acot, atan2

    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Inverse_trigonometric_functions
    .. [2] http://dlmf.nist.gov/4.23
    .. [3] http://functions.wolfram.com/ElementaryFunctions/ArcCsc

    c                 C   s8  |j rtjS |jr$|tju rtjS |tju rtd S |tju r$t d S |tjtj	tjfv r1tj
S | r;| |  S |jrAtj
S |jrP|  }||v rP|| S t|tr|jd }|jr|dt ; }|tkrkt| }|td krut| }|t d k rt | }|S t|tr|jd }|jrtd t| S d S d S rm  )r7   r   rc   r   r   rr   r   r   r   r   rJ   r   r+  r?  r3  r,   r   r5   r@  r   r   r  r/   r/   r0   r     sH   








z	acsc.evalrq   c                 C   s>   |dkrd| j d d tdd| j d d     S t| |rl  r  r   r/   r/   r0   r     r  z
acsc.fdiffc                 C   r  r  r   r   r/   r/   r0   r    r  zacsc.inverseNr   c                 C   s   | j d }||d }|tj tjtjfv r%| tj|||d	 S |tj
u r1d| |S |dkr;|||}t|dk rU|jrU|tjkrU|tjk rUt| | S t|dkrp|jrp|tjk rp|tjkrpt | | S | |S )Nr   rF  rq   )r5   r   r  r   rr   rJ   r   r!   r  rI   rc   r  r  r   r  r   r4   r   rG  r/   r/   r0   r    s   

&&
zacsc._eval_as_leading_termc                 C   s.  ddl m} | jd |d}|tju rjtddd}ttj|d  t	
|dd| }tj| jd  }	|	|}
|	|
 |
 }ttj| j|||d}| t|
  }| ||  ||| | S |tju rtddd}ttj|d  t	
|dd| }tj| jd  }	|	|}
|	|
 |
 }ttj| j|||d}| t|
  }| ||  ||| | S tj| |||d}|tju r|S |dkr| jd ||}t|dk r|jr|tjkr|tjk rt| S t|dkr|jr|tjk r|tjkrt | S |S r  )rM  rJ  r5   r   r   rr   r   r   r   r!   rN  r   r  r$   r   rP  rI   rQ  r   rc   r  r   r  rJ   r   rR  r/   r/   r0   r     s<   
&
&
&
&
&.
zacsc._eval_nseriesc                 K   s*   t j tt j| tdd|d     S r  r]  r   r/   r/   r0   r^    s   *zacsc._eval_rewrite_as_logc                 K   rc  r   )r   r   r/   r/   r0   rr  !  r   zacsc._eval_rewrite_as_asinc                 K   r`  r   rY  r   r/   r/   r0   rZ  $  r   zacsc._eval_rewrite_as_acosc                 K   s,   t |d | td tt |d d   S r   r  r  r/   r/   r0   r[  '  r  zacsc._eval_rewrite_as_atanc                 K   s0   t |d | td tdt |d d    S r   r  r   r/   r/   r0   r_  *  ro  zacsc._eval_rewrite_as_acotc                 K   rX  r   ra  r   r/   r/   r0   rb  -  r   zacsc._eval_rewrite_as_asecr2  r   r3  )r^   r_   r`   ra   r4  r   r   r  r  r   r^  rk  rr  rZ  r[  r_  rb  r/   r/   r/   r0   r     s    *

,


"r   c                       s\   e 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 fddZ  ZS )r   a
  
    The function ``atan2(y, x)`` computes `\operatorname{atan}(y/x)` taking
    two arguments `y` and `x`.  Signs of both `y` and `x` are considered to
    determine the appropriate quadrant of `\operatorname{atan}(y/x)`.
    The range is `(-\pi, \pi]`. The complete definition reads as follows:

    .. math::

        \operatorname{atan2}(y, x) =
        \begin{cases}
          \arctan\left(\frac y x\right) & \qquad x > 0 \\
          \arctan\left(\frac y x\right) + \pi& \qquad y \ge 0, x < 0 \\
          \arctan\left(\frac y x\right) - \pi& \qquad y < 0, x < 0 \\
          +\frac{\pi}{2} & \qquad y > 0, x = 0 \\
          -\frac{\pi}{2} & \qquad y < 0, x = 0 \\
          \text{undefined} & \qquad y = 0, x = 0
        \end{cases}

    Attention: Note the role reversal of both arguments. The `y`-coordinate
    is the first argument and the `x`-coordinate the second.

    If either `x` or `y` is complex:

    .. math::

        \operatorname{atan2}(y, x) =
            -i\log\left(\frac{x + iy}{\sqrt{x^2 + y^2}}\right)

    Examples
    ========

    Going counter-clock wise around the origin we find the
    following angles:

    >>> from sympy import atan2
    >>> atan2(0, 1)
    0
    >>> atan2(1, 1)
    pi/4
    >>> atan2(1, 0)
    pi/2
    >>> atan2(1, -1)
    3*pi/4
    >>> atan2(0, -1)
    pi
    >>> atan2(-1, -1)
    -3*pi/4
    >>> atan2(-1, 0)
    -pi/2
    >>> atan2(-1, 1)
    -pi/4

    which are all correct. Compare this to the results of the ordinary
    `\operatorname{atan}` function for the point `(x, y) = (-1, 1)`

    >>> from sympy import atan, S
    >>> atan(S(1)/-1)
    -pi/4
    >>> atan2(1, -1)
    3*pi/4

    where only the `\operatorname{atan2}` function reurns what we expect.
    We can differentiate the function with respect to both arguments:

    >>> from sympy import diff
    >>> from sympy.abc import x, y
    >>> diff(atan2(y, x), x)
    -y/(x**2 + y**2)

    >>> diff(atan2(y, x), y)
    x/(x**2 + y**2)

    We can express the `\operatorname{atan2}` function in terms of
    complex logarithms:

    >>> from sympy import log
    >>> atan2(y, x).rewrite(log)
    -I*log((x + I*y)/sqrt(x**2 + y**2))

    and in terms of `\operatorname(atan)`:

    >>> from sympy import atan
    >>> atan2(y, x).rewrite(atan)
    Piecewise((2*atan(y/(x + sqrt(x**2 + y**2))), Ne(y, 0)), (pi, re(x) < 0), (0, Ne(x, 0)), (nan, True))

    but note that this form is undefined on the negative real axis.

    See Also
    ========

    sin, csc, cos, sec, tan, cot
    asin, acsc, acos, asec, atan, acot

    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Inverse_trigonometric_functions
    .. [2] https://en.wikipedia.org/wiki/Atan2
    .. [3] http://functions.wolfram.com/ElementaryFunctions/ArcTan2

    c                 C   s  ddl m} |tju r|jrtS dt |t| t S |tju r$tjS |j	r8|j	r8|j
r8|j
r8t|}t|}|jry|jry|jrGt|| S |jra|jrUt|| t S |jr`t|| t S n|jry|jrktd S |jrst d S |jrytjS |jr|jrttj||  S |j
rttt|dk fdt|dftjdfS |j
r|j
rtj t|tj|  t|d |d    S d S d S )Nr   )	Heavisidere   T)'sympy.functions.special.delta_functionsr  r   r   r7   r   r    r   rJ   r  r?  r   rH   r;  r   r  rh  r   is_extended_nonzerorr   r'   r   r.   r!   r$   )r   r   r{   r  r/   r/   r0   r     sN   


 z
atan2.evalc                 K   s.   t j t|t j|  t|d |d    S r   r]  r9   r   r{   r   r/   r/   r0   r^    s   .zatan2._eval_rewrite_as_logc              	   K   sT   t dt||t|d |d     t|dftt|dk fdt|dftjdfS )Nre   r   T)r'   r   r$   r   r   r    r   r   r  r/   r/   r0   r[    s
   .zatan2._eval_rewrite_as_atanc                 K   sj   |j r|j rt||tj  S |tj|  }|d |d  }t|t| tjtt|tt|   S r   )rH   arg_fr   r.   r$   r!   rR   )r9   r   r{   r   r   r   r/   r/   r0   _eval_rewrite_as_arg  s
   .zatan2._eval_rewrite_as_argc                 C   s   | j d jo| j d jS rf  r   r   r/   r/   r0   r!    r   zatan2._eval_is_extended_realc                 C   s    |  | jd  | jd  S rf  r   r   r/   r/   r0   r     r\  zatan2._eval_conjugatec                 C   sN   | j \}}|dkr||d |d   S |dkr"| |d |d   S t| |r  rx  )r9   r   r   r{   r/   r/   r0   r     s   

zatan2.fdiffc                    s*   | j \}}|jr|jrt |S d S d S r]   )r5   rH   r  _eval_evalf)r9   precr   r{   r  r/   r0   r    s   
zatan2._eval_evalf)r^   r_   r`   ra   r4  r   r^  r[  r  r!  r   r   r  r  r/   r/   r  r0   r   1  s    f
'r   Nr2  )Vtypingr   r  sympy.core.addr   sympy.core.basicr   r   sympy.core.exprr   sympy.core.functionr   r   r	   r
   sympy.core.logicr   r   r   r   sympy.core.modr   sympy.core.numbersr   r   r   r   r   sympy.core.relationalr   r   sympy.core.singletonr   sympy.core.symbolr   r   (sympy.functions.combinatorial.factorialsr   r   %sympy.functions.combinatorial.numbersr   r   r  r   r  r   r    &sympy.functions.elementary.exponentialr!   r"   #sympy.functions.elementary.integersr#   (sympy.functions.elementary.miscellaneousr$   r%   r&   $sympy.functions.elementary.piecewiser'   sympy.logic.boolalgr(   sympy.ntheoryr)   sympy.polys.specialpolysr*   sympy.utilities.iterablesr+   r1   r2   rp   r>   r   r   r   r   r  r   r   r   r-  r   r   r   r   r   r   r   r/   r/   r/   r0   <module>   sr    D
%J  8   R  Y  Cxee|Q [ Y F K = +