a
    <b                    @   sb  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mZmZmZ d dl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' d dl(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0 d dl1m2Z2m3Z3m4Z4 d dl5m6Z6 d dl7m8Z8 d dl9m:Z: d dl;m<Z< G dd deZ=dd Z>d<ddZ?G dd de=Z@G dd de=ZAG dd  d e=ZBG d!d" d"e=ZCG d#d$ d$e=ZDG d%d& d&eDZEG d'd( d(eDZFG d)d* d*eZGG d+d, d,eZHG d-d. d.eHZIG d/d0 d0eHZJG d1d2 d2eHZKG d3d4 d4eHZLG d5d6 d6eHZMG d7d8 d8eHZNG d9d: d:eHZOd;S )=    )Tuple)Add)sympifycacheit)Expr)FunctionArgumentIndexError	PoleError
expand_mul)	fuzzy_notfuzzy_or	FuzzyBool	fuzzy_and)igcdexRationalpiInteger)Ne)S)SymbolDummy)	factorialRisingFactorial)logexp)floor)acothasinhatanhcoshcothHyperbolicFunctionsinhtanh)sqrtMinMax)	Piecewise)SetExpr)	FiniteSet)numbered_symbolsc                   @   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   sD   | j | j }|j | j kr:|jd jr@t|jd jr@dS n|jS d S Nr   F)funcargsis_rationalr   is_zeroselfs r4   x/Users/vegardjervell/Documents/master/model/venv/lib/python3.9/site-packages/sympy/functions/elementary/trigonometric.py_eval_is_rational"   s
    z'TrigonometricFunction._eval_is_rationalc                 C   sd   | j | j }|j | j krZt| jd jr8| jd jr8dS t| jd }|d ur`|jr`dS n|jS d S Nr   FT)r-   r.   r   r0   Zis_algebraic	_pi_coeffr/   )r2   r3   pi_coeffr4   r4   r5   _eval_is_algebraic*   s    z(TrigonometricFunction._eval_is_algebraicc                 K   s&   | j f d|i|\}}||tj  S Ndeep)as_real_imagr   ImaginaryUnit)r2   r<   hintsZre_partZim_partr4   r4   r5   _eval_expand_complex5   s    z*TrigonometricFunction._eval_expand_complexc                 K   s   | j d jrF|r6d|d< | j d j|fi |tjfS | j d tjfS |rl| j d j|fi | \}}n| j d  \}}||fS )Nr   Fcomplex)r.   is_extended_realexpandr   Zeror=   r2   r<   r?   reimr4   r4   r5   _as_real_imag9   s    "z#TrigonometricFunction._as_real_imagNc                 C   s   t | jd }|d u r$t|jd }||s4tjS ||kr@|S ||jv r|jrr||\}}||krr|t	| S |j
r||\}}|j|dd\}}||kr|t	| S tdd S )Nr   F)Zas_Addz%Use the periodicity function instead.)r
   r.   tupleZfree_symbolshasr   rD   is_MulZas_independentabsis_AddNotImplementedError)r2   Zgeneral_periodsymbolfghar4   r4   r5   _periodF   s$    

zTrigonometricFunction._period)T)T)N)__name__
__module____qualname____doc__Z
unbranchedr   ComplexInfinity_singularitiesr6   r:   r@   rH   rT   r4   r4   r4   r5   r+      s   

r+   c                 C   s   t j}g }t| D ].}|t j}|r8|jr8||7 }q|| q|t ju rX| t jfS |t j }|| }|j	sd| j	r|j
du rt||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   rD   r   Z	make_argscoeffPir/   appendHalf
is_integeris_evenr   )argr9   Z
rest_termsrS   Km1m2r4   r4   r5   _peeloff_pi`   s    




rf      c                 C   s  t | } | tju rtjS | s"tjS | jr
| tj}|r| \}}|jrt	|d }|dkrt
tt|d  }d| }|| }t
|}	|	|krt|	|}|| }ntt
|}|| }|jr|d }
|
dkr|S |
 s|jdurtjS tdS |
| S |S n| jrt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

    rg   r   r[   N)r   r   r]   OnerD   rK   r\   as_coeff_MulZis_FloatrL   introundr   Zevalfr   r`   ra   r   r0   )rb   ZcyclescxcxrP   pmcmic2r4   r4   r5   r8      sB    %



r8   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   s   |  dt |S Nr[   rT   r   r2   rO   r4   r4   r5   period   s    z
sin.periodrg   c                 C   s$   |dkrt | jd S t| |d S Nrg   r   )cosr.   r   r2   argindexr4   r4   r5   fdiff  s    z	sin.fdiffc                 C   s  ddl m} |jrH|tju r"tjS |jr.tjS |tjtjfv rH|ddS |tj	u rXtjS t
||r|j|j }}t|dtj  }|tjur||d tj  }|tjur||d tj  }|||ttjd tjtdd tjur,|||ttjtdd tjtdd tjur,|ddS |||ttjd tjtdd tjurt|tt|t|dS |||ttjtdd tjtd	d tjur|dtt|t|S |tt|t|tt|t|S nt
|tr || S | r| |  S |tj}|d ur:tjt| S t|}|d urJ|jrZtjS d| jr|jd
u rtj|tj   S |j!s|tj }||kr| |S d S |j!rJ|d }	|	dkr| |	d tj  S d|	 dkr| d|	 tj S |tdd d tj }t"|}
t
|
t"s(|
S |tj |krF| |tj S d S |j#rt$|\}	}|r|tj }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*r0|j&d }	t(d|	d  S t
|t+rb|j&d }	dt(dd|	d   |	  S t
|t,r|j&d }	d|	 S t
|t-r|j&d }	t(dd|	d   S d S )Nr   AccumBoundsrg   r[               F).!sympy.calculus.accumulationboundsr   	is_Numberr   NaNr0   rD   InfinityNegativeInfinityrY   
isinstanceminmaxr   r]   intersectionr)   r   ZEmptySetr%   rt   r&   r(   
_eval_funccould_extract_minus_signas_coefficientr>   r"   r8   r`   ra   NegativeOner_   is_Rationalrz   rM   rf   asinr.   atanr$   atan2acosacotacscasec)clsrb   r   r   r   di_coeffr9   nargrn   resultrp   yr4   r4   r5   eval	  s    




&
&,







 






zsin.evalc                 G   sr   | dk s| d dkrt jS t|}t|dkrP|d }| |d  | | d   S t j| d  ||   t|  S d S Nr   r[   rg   r   rD   r   lenr   r   nrn   previous_termsro   r4   r4   r5   taylor_term{  s    zsin.taylor_termr   c                 C   sZ   | j d }|d ur"|t||}||dtjtjrFtd|  tj	| ||||dS Nr   zCannot expand %s around 0)r   logxcdir
r.   subsr   rJ   r   r   rY   r	   r   _eval_nseriesr2   rn   r   r   r   rb   r4   r4   r5   r     s    
zsin._eval_nseriesc                 K   sL   t j}t|ttfr*||jd t}t|| t| |  d|  S Nr   r[   	r   r>   r   r+   r!   r-   r.   rewriter   r2   rb   kwargsIr4   r4   r5   _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 r   r   r   r   r>   r.   r2   rb   r   r   rn   r4   r4   r5   _eval_rewrite_as_Pow  s    

zsin._eval_rewrite_as_Powc                 K   s   t |tjd  ddS Nr[   Fevaluaterz   r   r]   r2   rb   r   r4   r4   r5   _eval_rewrite_as_cos  s    zsin._eval_rewrite_as_cosc                 K   s"   t tj| }d| d|d   S Nr[   rg   tanr   r_   r2   rb   r   Ztan_halfr4   r4   r5   _eval_rewrite_as_tan  s    zsin._eval_rewrite_as_tanc                 K   s   t |t| t| S Nrt   rz   r   r4   r4   r5   _eval_rewrite_as_sincos  s    zsin._eval_rewrite_as_sincosc                 K   s"   t tj| }d| d|d   S r   cotr   r_   r2   rb   r   Zcot_halfr4   r4   r5   _eval_rewrite_as_cot  s    zsin._eval_rewrite_as_cotc                 K   s   |  t tS r   )r   rz   powr   r4   r4   r5   _eval_rewrite_as_pow  s    zsin._eval_rewrite_as_powc                 K   s   |  t tS r   )r   rz   r$   r   r4   r4   r5   _eval_rewrite_as_sqrt  s    zsin._eval_rewrite_as_sqrtc                 K   s   dt | S Nrg   cscr   r4   r4   r5   _eval_rewrite_as_csc  s    zsin._eval_rewrite_as_cscc                 K   s   dt |tjd  dd S )Nrg   r[   Fr   )secr   r]   r   r4   r4   r5   _eval_rewrite_as_sec  s    zsin._eval_rewrite_as_secc                 K   s   |t | S r   )sincr   r4   r4   r5   _eval_rewrite_as_sinc  s    zsin._eval_rewrite_as_sincc                 C   s   |  | jd  S Nr   r-   r.   	conjugater2   r4   r4   r5   _eval_conjugate  s    zsin._eval_conjugateTc                 K   s8   | j f d|i|\}}t|t| t|t| fS r;   )rH   rt   r   rz   r"   rE   r4   r4   r5   r=     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rt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Zrationalrg   r[   )r<   )#sympy.functions.special.polynomialsr   r   r.   rM   as_two_termsrt   _eval_expand_trigrz   rK   ri   
is_IntegerZis_oddr   r   r
   r8   r   r   r$   )r2   r?   r   r   rb   rn   r   sxsyrl   cyr   r9   r4   r4   r5   r     s2    
 

zsin._eval_expand_trigc           
      C   s   ddl m} ddlm} | jd }||d }|tj }|j	rd||tj  
|}	tj| |	 S |tju r|j|d||jrdndd}|tjtjfv r|ddS |jr| |S | S )	Nr   rF   r~   -+dirr   rg   $sympy.functions.elementary.complexesrF   r   r   r.   r   cancelr   r]   r`   as_leading_termr   rY   limitis_negativer   r   	is_finiter-   
r2   rn   r   r   rF   r   rb   x0r   ltr4   r4   r5   _eval_as_leading_term  s    



zsin._eval_as_leading_termc                 C   s   | j d jrdS d S Nr   Tr.   rB   r   r4   r4   r5   _eval_is_extended_real  s    zsin._eval_is_extended_realc                 C   s   | j d }|jrdS d S r   r   r2   rb   r4   r4   r5   _eval_is_finite  s    
zsin._eval_is_finitec                 C   s"   t | jd \}}|jr|jS d S r   rf   r.   r0   r`   r2   restZpi_multr4   r4   r5   _eval_is_zero  s    zsin._eval_is_zeroc                 C   s    | j d js| j d jrdS d S r   r.   rB   
is_complexr   r4   r4   r5   _eval_is_complex  s    
zsin._eval_is_complex)N)rg   )r   )T)Nr   )rU   rV   rW   rX   rx   r}   classmethodr   staticmethodr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r=   r   r   r   r   r   r  r4   r4   r4   r5   rt      s8   /


q


rt   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 )9rz   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   s   |  dt |S ru   rv   rw   r4   r4   r5   rx   -  s    z
cos.periodrg   c                 C   s&   |dkrt | jd  S t| |d S ry   )rt   r.   r   r{   r4   r4   r5   r}   0  s    z	cos.fdiffc              	   C   sn  ddl m} ddlm} |jrT|tju r.tjS |jr:tjS |tj	tj
fv rT|ddS |tju rdtjS t||rt|tjd  S t|tr|| S |jr|jdu r|ddS | r| | S |tj}|d urt|S t|}|d ur|jr tj| S d| jr|jdu rtjS |jsF|tj }||krB| |S d S tjtdd d	 d
}|jr
|j}|j d|  }	|	|kr|d tj }| | S d|	 |krd| tj }| | S ddddddddd}
||
v r`|	tj |
| d  |	tj |
| d   }}| || | }}d ||fv r4d S || | tjd | | tjd |   S |dkrnd S ||v r||j }||j |! S d|d kr
|d tj }| |}d |krd S d| d d }d|dk rdndt"t#|  }|td| d  S d S |j$rRt%|\}}|rR|tj }t&|t&| t|t|  S |jr`tjS t|t'rv|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-rL|j(d }tdd|d   S t|t.rj|j(d }d| S d S )Nr   r   r~   r   rg   r[   Fr      )r   r   r   r  r  r   r      r	  
   r	  r   r   r        (   <      r  r        r  r  x   r  )/r   r   r   r   r   r   r   r0   rh   r   r   rY   r   rt   r]   r(   r   rB   r   r   r   r>   r   r8   r`   r   ra   rD   r   r_   r$   qro   rC   rj   rL   rM   rf   rz   r   r.   r   r   r   r   r   r   )r   rb   r   r   r   r9   r   cst_table_somer  ro   table2rS   bnvalanvalbZctsnvalrn   sign_cosrp   r   r4   r4   r5   r   6  s    

















.,



"
 






zcos.evalc                 G   sr   | dk s| d dkrt jS t|}t|dkrP|d }| |d  | | d   S t j| d  ||   t|  S d S )Nr   r[   rg   r   r   r   r4   r4   r5   r     s    zcos.taylor_termr   c                 C   sZ   | j d }|d ur"|t||}||dtjtjrFtd|  tj	| ||||dS r   r   r   r4   r4   r5   r     s    
zcos._eval_nseriesc                 K   sH   t j}t|ttfr*||jd t}t|| t| |  d S r   r   r   r4   r4   r5   r     s    zcos._eval_rewrite_as_expc                 K   s8   t |tr4tj}|jd }|| d ||  d  S d S r   r   r   r4   r4   r5   r     s    

zcos._eval_rewrite_as_Powc                 K   s   t |tjd  ddS r   )rt   r   r]   r   r4   r4   r5   _eval_rewrite_as_sin  s    zcos._eval_rewrite_as_sinc                 K   s"   t tj| d }d| d|  S r   r   r   r4   r4   r5   r     s    zcos._eval_rewrite_as_tanc                 K   s   t |t| t | S r   r   r   r4   r4   r5   r     s    zcos._eval_rewrite_as_sincosc                 K   s"   t tj| d }|d |d  S r   r   r   r4   r4   r5   r     s    zcos._eval_rewrite_as_cotc                 K   s
   |  |S r   )r   r   r4   r4   r5   r     s    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rP| |tj S |jsZd 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 r6| }|S |j
d s|d }	t|	tj 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 d S )Nr   r  c                    s   t | dkrd| d fS t | dkr6t| d | d S | dd  }t| d |d \} }t|g fdd|dd D  |g S )Nrg   r   r[   r   c                    s   g | ]} | qS r4   r4   .0rr   vr4   r5   
<listcomp>      z>cos._eval_rewrite_as_sqrt.<locals>.migcdex.<locals>.<listcomp>)r   r   rI   )rn   rQ   urR   migcdexr$  r5   r*    s    z*cos._eval_rewrite_as_sqrt.<locals>.migcdexc                    s   ddl m} ttrS tts,tdj djj krHjS d |krn fdd|j D }n fdd|D }t|dkrgS |}fd	dt	|d d
 |D }t
|ksJ |S )Nr   )	factorintzr is not rationalr[   c                    s   g | ]\}} ||  qS r4   r4   )r#  rn   r   r   r4   r5   r&    r'  z@cos._eval_rewrite_as_sqrt.<locals>.ipartfrac.<locals>.<listcomp>c                    s   g | ]} | qS r4   r4   r#  rn   r,  r4   r5   r&    r'  rg   c                    s&   g | ]\}} j t||  j qS r4   )ro   r   r  )r#  rr   j)rr4   r5   r&    r'  r   )Zsympy.ntheoryr+  r   rj   r   	TypeErrorr  itemsr   zipsum)r/  Zfactorsr+  rS   rR   Zansr)  )r   r/  r5   	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 ru   r$   rS   r  r4   r4   r5   f12  s    z8cos._eval_rewrite_as_sqrt.<locals>._cospi257.<locals>.f1c                 S   s   | t | d |  d S ru   r5  r6  r4   r4   r5   f25  s    z8cos._eval_rewrite_as_sqrt.<locals>._cospi257.<locals>.f2r      @   r  r   r[   r   r   )r$   r   r_   ))r7  r8  t1t2Zz1Zz3Zz2Zz4y1Zy5Zy6y2Zy3Zy7Zy8Zy4x1Zx9Zx2Zx10Zx3Zx11Zx4Zx12Zx5Zx13Zx6Zx14Zx15Zx7Zx8Zx16v1v2Zv3Zv4Zv5Zv6u1u2Zw1r4   r4   r5   	_cospi257,  s6    """"""""z,cos._eval_rewrite_as_sqrt.<locals>._cospi257r   rg   r  r         r[   ir	  "   )r   r   rF    c                    sJ   g } D ]<}t | |\}}|dkr|} || | dkrt|  S qdS )Nr   rg   F)divmodr^   rI   )r   ZprimesZp_iZquotient	remainder)r  r4   r5   _fermatCoords^  s    
z0cos._eval_rewrite_as_sqrt.<locals>._fermatCoordsrI  r   c                 S   s"   g | ]}|d  |d t j fqS rg   r   r   r]   r-  r4   r4   r5   r&  |  r'  z-cos._eval_rewrite_as_sqrt.<locals>.<listcomp>zc                 S   s   g | ]}|d  qS r   r4   r-  r4   r4   r5   r&  }  r'  c                 S   s"   g | ]}|d  |d t j fqS rM  rN  r-  r4   r4   r5   r&    r'  c                 S   s   g | ]}|d  qS rP  r4   r-  r4   r4   r5   r&    r'  )N)r   r   r8   r`   r-   r   r]   r   r_   r$   r  ro   rC   rz   r   rj   r2  r*   r3  r   r   )r2   rb   r   r   r4  r9   rE  rL  rvZpico2r  rn   r   ZFCdecompXZpclsr4   )r  r*  r5   r     s`    '$$


 
 zcos._eval_rewrite_as_sqrtc                 K   s   dt | S r   r   r   r4   r4   r5   r     s    zcos._eval_rewrite_as_secc                 K   s   dt |t S r   )r   r   r   r   r4   r4   r5   r     s    zcos._eval_rewrite_as_cscc                 C   s   |  | jd  S r   r   r   r4   r4   r5   r     s    zcos._eval_conjugateTc                 K   s:   | j f d|i|\}}t|t| t| t| fS r;   )rH   rz   r   rt   r"   rE   r4   r4   r5   r=     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r|j	dd\}
}|
j
r||
t|S t|}|d ur|jr| tS t|S )Nr   r  Fr   Tr   )r   r   r.   rM   r   rt   r   rz   rK   ri   r   r8   r   r   r$   )r2   r?   r   rb   rn   r   r   r   rl   r   r\   termsr9   r4   r4   r5   r     s&    

zcos._eval_expand_trigc           
      C   s   ddl m} ddlm} | jd }||d }|tjd  tj }|j	rx||tj  tjd  
|}	tj| |	 S |tju r|j|d||jrdndd}|tjtjfv r|dd	S |jr| |S | S )
Nr   r   r~   r[   r   r   r   r   rg   r   r   r4   r4   r5   r     s    


zcos._eval_as_leading_termc                 C   s   | j d jrdS d S r   r   r   r4   r4   r5   r     s    zcos._eval_is_extended_realc                 C   s   | j d }|jrdS d S r   r   r   r4   r4   r5   r     s    
zcos._eval_is_finitec                 C   s    | j d js| j d jrdS d S r   r   r   r4   r4   r5   r    s    
zcos._eval_is_complexc                 C   s6   t | jd \}}|r,t|tj j|jgS |jS d S r   )rf   r.   r   r   r_   r`   r0   r   r4   r4   r5   r     s    zcos._eval_is_zero)N)rg   )r   )T)Nr   )rU   rV   rW   rX   rx   r}   r  r   r  r   r   r   r   r   r!  r   r   r   r   r   r   r   r   r=   r   r   r   r   r  r   r4   r4   r4   r5   rz     s:   +


 
 

rz   c                   @   s   e Zd ZdZd8ddZd9ddZd: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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   s   |  t|S r   rv   rw   r4   r4   r5   rx     s    z
tan.periodrg   c                 C   s$   |dkrt j| d  S t| |d S Nrg   r[   )r   rh   r   r{   r4   r4   r5   r}     s    z	tan.fdiffc                 C   s   t S z7
        Returns the inverse of this function.
        r   r{   r4   r4   r5   inverse  s    ztan.inversec              	   C   s  ddl m} |jrL|tju r"tjS |jr.tjS |tjtjfv rL|tjtjS |tj	u r\tjS t
|| r|j|j }}t|tj }|tjur||tj  }|tjur||tj  }|||ttjd tjtdd r|tjtjS |t|t|S | r| |  S |tj}|d ur6tjt| S t|d}|d ur|jrXtjS |js|tj }||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 s|tj d }t|t|tjd   }}t
|tst
|ts|dkrtj	S d| ||  S d
dddddddd}|	|v r| |
tj ||	 d  | |
tj ||	 d   }}d ||fv rd S || d||   S |tj d tj tj }t|t|tjd   }}t
|tsxt
|tsx|dkrptj	S || S ||kr| |S |jrt |\}}|rt|tj }|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&rf|j#d }td|d  | S t
|t'r|j#d }d| S t
|t(r|j#d }dtdd|d   |  S t
|t)r|j#d }tdd|d   | S d S )Nr   r~   r[   r   rg   r   )rg   r[   r   r  r   r  r  r  r  r  r
  r  r  r  r  r  )*r   r   r   r   r   r0   rD   r   r   rY   r   r   r   r   r]   r   r)   r   r   r   r   r>   r#   r8   r`   r   r  ro   r$   rz   r_   rM   rf   r   r   r.   r   r   r   r   r   r   )r   rb   r   r   r   r   r   r9   r   r  ro   Ztable10r   cresultsresultr  r  r  rn   rp   Ztanmr   r4   r4   r5   r     s    



(












6









ztan.evalc                 G   s   ddl m} | dk s | d dkr&tjS t|}| d d d| d   }}|| d }t| d }tj| | |d  | | ||   S d S )Nr   	bernoullir[   rg   )%sympy.functions.combinatorial.numbersr^  r   rD   r   r   r   )r   rn   r   r^  rS   r  BFr4   r4   r5   r     s    ztan.taylor_termr   c                 C   sN   | j d |dd tj }|r<|jr<| tj|||dS tj| |||dS )Nr   r[   r   r   )	r.   r   r   r]   r   r   rz   r   r   r2   rn   r   r   r   rr   r4   r4   r5   r     s    
ztan._eval_nseriesc                 K   sF   t |trBtj}|jd }|||  ||   ||  ||   S d S r   r   r   r4   r4   r5   r     s    

ztan._eval_rewrite_as_Powc                 C   s   |  | jd  S r   r   r   r4   r4   r5   r     s    ztan._eval_conjugateTc                 K   sh   | j f d|i|\}}|rTtd| td|  }td| | td| | fS | |tjfS d S Nr<   r[   rH   rz   r   rt   r"   r-   r   rD   r2   r<   r?   rF   rG   Zdenomr4   r4   r5   r=     s
     ztan.as_real_imagc                    sb  ddl m}m} | jd }d }|jrddlm} t|j}g }|jD ]}t|dd	 }	|
|	 qDtd  fddt|D }
ddg}t|d	 D ]2}|d	|d
    |||
d|d d
   7  < q|d |d	  tt|
|S |jrZ|jdd\}}|jrZ|d	krZtj}tddd}d	||  |  }|||| |t|fgS t|S )Nr   rG   rF   symmetric_polyFr   Yc                    s   g | ]}t  qS r4   nextr"  ZYgr4   r5   r&    r'  z)tan._eval_expand_trig.<locals>.<listcomp>rg   r[   r   r  Tr   dummyreal)r   rG   rF   r.   rM   sympy.polys.specialpolysri  r   r   r   r^   r*   ranger   listr2  rK   ri   r   r   r>   r   rC   )r2   r?   rG   rF   rb   rn   ri  r   ZTXZtxrj  ro   rr   r\   rU  r   rO  Pr4   rm  r5   r     s0    


0  ztan._eval_expand_trigc                 K   sZ   t j}t|ttfr*||jd t}t| | t||  }}|||  ||  S r   r   r2   rb   r   r   Zneg_expZpos_expr4   r4   r5   r     s
    ztan._eval_rewrite_as_expc                 K   s   dt |d  t d|  S ru   rt   r2   rn   r   r4   r4   r5   r!    s    ztan._eval_rewrite_as_sinc                 K   s   t |tjd  ddt | S r   r   rw  r4   r4   r5   r     s    ztan._eval_rewrite_as_cosc                 K   s   t |t| S r   r   r   r4   r4   r5   r     s    ztan._eval_rewrite_as_sincosc                 K   s   dt | S r   r   r   r4   r4   r5   r     s    ztan._eval_rewrite_as_cotc                 K   s$   t |t}t|t}|| S r   )rt   r   r   rz   )r2   rb   r   sin_in_sec_formcos_in_sec_formr4   r4   r5   r     s    ztan._eval_rewrite_as_secc                 K   s$   t |t}t|t}|| S r   )rt   r   r   rz   )r2   rb   r   sin_in_csc_formcos_in_csc_formr4   r4   r5   r     s    ztan._eval_rewrite_as_cscc                 K   s"   |  t t}|trd S |S r   r   rz   r   rJ   r2   rb   r   r   r4   r4   r5   r     s    
ztan._eval_rewrite_as_powc                 K   s"   |  t t}|trd S |S r   r   rz   r$   rJ   r~  r4   r4   r5   r     s    
ztan._eval_rewrite_as_sqrtc                 C   sl   | j d }||d }d| tj }|jrX||tj d  |}|jrP|S d| S |jrh| 	|S | S )Nr   r[   r   
r.   r   r   r   r]   r`   r   ra   r   r-   r2   rn   r   r   rb   r   r   r   r4   r4   r5   r     s    
ztan._eval_as_leading_termc                 C   s   | j d jS r   r   r   r4   r4   r5   r     s    ztan._eval_is_extended_realc                 C   s,   | j d }|jr(|t tj jdu r(dS d S r7   r.   is_realr   r   r_   r`   r   r4   r4   r5   _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r2dS d S r7   )r.   r  r   r   r_   r`   is_imaginaryr   r4   r4   r5   r     s
    
ztan._eval_is_finitec                 C   s"   t | jd \}}|jr|jS d S r   r   r   r4   r4   r5   r     s    ztan._eval_is_zeroc                 C   s,   | j d }|jr(|t tj jdu r(dS d S r7   r  r   r4   r4   r5   r    s    
ztan._eval_is_complex)N)rg   )rg   )r   )T)Nr   ) rU   rV   rW   rX   rx   r}   rY  r  r   r  r   r   r   r   r   r=   r   r   r!  r   r   r   r   r   r   r   r   r   r  r   r   r  r4   r4   r4   r5   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   s   |  t|S r   rv   rw   r4   r4   r5   rx   C  s    z
cot.periodrg   c                 C   s$   |dkrt j| d  S t| |d S rV  )r   r   r   r{   r4   r4   r5   r}   F  s    z	cot.fdiffc                 C   s   t S rW  r   r{   r4   r4   r5   rY  L  s    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u r>tjS t||r\t|tj	d   S |
 rp| |  S |tj}|d urtj t| S t|d}|d urj|jrtjS |js|tj	 }||kr| |S d S |jrj|jdv rttj	d | S |jdkrf|jd sf|tj	 d }t|t|tj	d   }}t|tsft|tsfd| ||  S dddd	d
dddd}|j}	|j|	 }
|	|v r| |
tj	 ||	 d  | |
tj	 ||	 d   }}d ||fv rd S d||  ||  S |tj d tj tj	 }t|t|tj	d   }}t|tsXt|tsX|dkrPtjS || S ||krj| |S |jrt|\}}|rt|tj	 }|tju rt|S t| S |jrtjS t|tr|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rd|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~   r[   rZ  rg   r  r  r  r
  r  r  r  r  r  )!r   r   r   r   r   r0   rY   r   r   r]   r   r   r>   r    r8   r`   r   r  rz   ro   r_   rM   rf   r   r   r.   r   r   r   r$   r   r   r   )r   rb   r   r   r9   r   r[  r\  r  r  ro   r  r  rn   rp   Zcotmr   r4   r4   r5   r   R  s    









6









zcot.evalc                 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 }tj| d d  d| d   | | ||   S d S Nr   r]  rg   r[   )r_  r^  r   r   rD   r   r   )r   rn   r   r^  r`  ra  r4   r4   r5   r     s    zcot.taylor_termr   c                 C   sN   | j d |dtj }|r8|jr8| tj|||dS | tj|||dS )Nr   rb  )	r.   r   r   r]   r   r   rz   r   r   rc  r4   r4   r5   r     s    
zcot._eval_nseriesc                 C   s   |  | jd  S r   r   r   r4   r4   r5   r     s    zcot._eval_conjugateTc                 K   sj   | j f d|i|\}}|rVtd| td|  }td|  | td| | fS | |tjfS d S rd  re  rf  r4   r4   r5   r=     s
    "zcot.as_real_imagc                 K   sZ   t j}t|ttfr*||jd t}t| | t||  }}|||  ||  S r   r   ru  r4   r4   r5   r     s
    zcot._eval_rewrite_as_expc                 K   sH   t |trDtj}|jd }| ||  ||   ||  ||   S d S r   r   r   r4   r4   r5   r     s    

zcot._eval_rewrite_as_Powc                 K   s   t d| dt |d   S ru   rv  rw  r4   r4   r5   r!    s    zcot._eval_rewrite_as_sinc                 K   s   t |t |tjd  dd S r   r   rw  r4   r4   r5   r     s    zcot._eval_rewrite_as_cosc                 K   s   t |t| S r   rz   rt   r   r4   r4   r5   r     s    zcot._eval_rewrite_as_sincosc                 K   s   dt | S r   r   r   r4   r4   r5   r     s    zcot._eval_rewrite_as_tanc                 K   s$   t |t}t|t}|| S r   )rz   r   r   rt   )r2   rb   r   rz  ry  r4   r4   r5   r     s    zcot._eval_rewrite_as_secc                 K   s$   t |t}t|t}|| S r   )rz   r   r   rt   )r2   rb   r   r|  r{  r4   r4   r5   r     s    zcot._eval_rewrite_as_cscc                 K   s"   |  t t}|trd S |S r   r}  r~  r4   r4   r5   r     s    
zcot._eval_rewrite_as_powc                 K   s"   |  t t}|trd S |S r   r  r~  r4   r4   r5   r   
  s    
zcot._eval_rewrite_as_sqrtc                 C   sn   | j d }||d }d| tj }|jrZ||tj d  |}|jrTd| S | S |jrj| 	|S | S Nr   r[   rg   r  r  r4   r4   r5   r     s    
zcot._eval_as_leading_termc                 C   s   | j d jS r   r   r   r4   r4   r5   r     s    zcot._eval_is_extended_realc                    sb  ddl m}m} | jd }d }|jrddlm} t|j}g }|jD ]}t|dd	 }	|
|	 qDtd  fddt|D }
ddg}t|d	d	D ]6}||| d
   |||
d	|| d d
   7  < q|d |d  tt|
|S |jrZ|jdd\}}|jrZ|dkrZtj}tddd}|| |  }|||| |t|fgS t|S )Nr   rg  rh  Fr   rj  c                    s   g | ]}t  qS r4   rk  r"  rm  r4   r5   r&  )  r'  z)cot._eval_expand_trig.<locals>.<listcomp>r   r[   r  rg   Tr   rn  ro  )r   rG   rF   r.   rM   rq  ri  r   r   r   r^   r*   rr  r   rs  r2  rK   ri   r   r   r>   r   rC   )r2   r?   rG   rF   rb   rn   ri  r   ZCXrl   rj  ro   rr   r\   rU  r   rO  rt  r4   rm  r5   r     s0    


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 r7   )r.   r  r   r`   r  r   r4   r4   r5   r   8  s
    
zcot._eval_is_finitec                 C   s&   | j d }|jr"|t jdu r"dS d S r7   r.   r  r   r`   r   r4   r4   r5   r  ?  s    
zcot._eval_is_realc                 C   s&   | j d }|jr"|t jdu r"dS d S r7   r  r   r4   r4   r5   r  D  s    
zcot._eval_is_complexc                 C   s,   t | jd \}}|r(|jr(|tj jS d S r   )rf   r.   r0   r   r_   r`   )r2   r   Zpimultr4   r4   r5   r   I  s    
zcot._eval_is_zeroc                 C   s8   | j d }|||}||kr0|tj jr0tjS t|S r   )r.   r   r   r]   r`   rY   r   )r2   oldnewrb   Zargnewr4   r4   r5   
_eval_subsN  s
    
zcot._eval_subs)N)rg   )rg   )r   )T)Nr   )!rU   rV   rW   rX   rx   r}   rY  r  r   r  r   r   r   r   r=   r   r   r!  r   r   r   r   r   r   r   r   r   r   r   r  r  r   r  r4   r4   r4   r5   r     s<   %



m


	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   sJ  |  r*| jr| | S | jr*| |  S t|}|d urd| js|jr|j}|jd|  }||kr~|d tj	 }| | S d| |krd| tj	 }| jr| |S | jr| | S t
|dr| | kr|jd S | j|}|d u r|S tdd || fD rd| tS tdd || fD r>d| tS d| S d S )Nr[   rg   rY  r   c                 s   s   | ]}t |tV  qd S r   )r   rz   r"  r4   r4   r5   	<genexpr>  r'  z7ReciprocalTrigonometricFunction.eval.<locals>.<genexpr>c                 s   s   | ]}t |tV  qd S r   )r   rt   r"  r4   r4   r5   r    r'  )r   _is_even_is_oddr8   r`   r   r  ro   r   r]   hasattrrY  r.   _reciprocal_ofr   anyr   r   r   )r   rb   r9   r  ro   r   tr4   r4   r5   r   d  s@    



z$ReciprocalTrigonometricFunction.evalc                 O   s$   |  | jd }t|||i |S r   )r  r.   getattr)r2   method_namer.   r   or4   r4   r5   _call_reciprocal  s    z0ReciprocalTrigonometricFunction._call_reciprocalc                 O   s,   | j |g|R i |}|d ur(d| S |S r   )r  )r2   r  r.   r   r  r4   r4   r5   _calculate_reciprocal  s    z5ReciprocalTrigonometricFunction._calculate_reciprocalc                 C   s.   |  ||}|d ur*|| |kr*d| S d S r   )r  r  )r2   r  rb   r  r4   r4   r5   _rewrite_reciprocal  s    z3ReciprocalTrigonometricFunction._rewrite_reciprocalc                 C   s   t | jd }| ||S r   )r
   r.   r  rx   )r2   rO   rP   r4   r4   r5   rT     s    z'ReciprocalTrigonometricFunction._periodrg   c                 C   s   |  d| | d  S )Nr}   r[   r  r{   r4   r4   r5   r}     s    z%ReciprocalTrigonometricFunction.fdiffc                 K   s   |  d|S )Nr   r  r   r4   r4   r5   r     s    z4ReciprocalTrigonometricFunction._eval_rewrite_as_expc                 K   s   |  d|S )Nr   r  r   r4   r4   r5   r     s    z4ReciprocalTrigonometricFunction._eval_rewrite_as_Powc                 K   s   |  d|S )Nr!  r  r   r4   r4   r5   r!    s    z4ReciprocalTrigonometricFunction._eval_rewrite_as_sinc                 K   s   |  d|S )Nr   r  r   r4   r4   r5   r     s    z4ReciprocalTrigonometricFunction._eval_rewrite_as_cosc                 K   s   |  d|S )Nr   r  r   r4   r4   r5   r     s    z4ReciprocalTrigonometricFunction._eval_rewrite_as_tanc                 K   s   |  d|S )Nr   r  r   r4   r4   r5   r     s    z4ReciprocalTrigonometricFunction._eval_rewrite_as_powc                 K   s   |  d|S )Nr   r  r   r4   r4   r5   r     s    z5ReciprocalTrigonometricFunction._eval_rewrite_as_sqrtc                 C   s   |  | jd  S r   r   r   r4   r4   r5   r     s    z/ReciprocalTrigonometricFunction._eval_conjugateTc                 K   s"   d|  | jd  j|fi |S ry   )r  r.   r=   )r2   r<   r?   r4   r4   r5   r=     s    z,ReciprocalTrigonometricFunction.as_real_imagc                 K   s   | j di |S )Nr   )r   r  )r2   r?   r4   r4   r5   r     s    z1ReciprocalTrigonometricFunction._eval_expand_trigc                 C   s   |  | jd  S r   )r  r.   r   r   r4   r4   r5   r     s    z6ReciprocalTrigonometricFunction._eval_is_extended_realr   c                 C   s   d|  | jd  |S ry   )r  r.   r   )r2   rn   r   r   r4   r4   r5   r     s    z5ReciprocalTrigonometricFunction._eval_as_leading_termc                 C   s   d|  | jd  jS ry   )r  r.   r   r   r4   r4   r5   r     s    z/ReciprocalTrigonometricFunction._eval_is_finitec                 C   s   d|  | jd  |||S ry   )r  r.   r   r2   rn   r   r   r   r4   r4   r5   r     s    z-ReciprocalTrigonometricFunction._eval_nseries)rg   )T)Nr   )r   )rU   rV   rW   rX   r  r   rY   rZ   r  r  r  r   r  r  r  rT   r}   r   r   r!  r   r   r   r   r   r=   r   r   r   r   r   r4   r4   r4   r5   r  V  s4   
$


r  c                   @   s~   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   s
   |  |S r   rT   rw   r4   r4   r5   rx     s    z
sec.periodc                 K   s    t |d d }|d |d  S r   rx  )r2   rb   r   Zcot_half_sqr4   r4   r5   r     s    zsec._eval_rewrite_as_cotc                 K   s   dt | S r   rz   r   r4   r4   r5   r     s    zsec._eval_rewrite_as_cosc                 K   s   t |t|t |  S r   r   r   r4   r4   r5   r     s    zsec._eval_rewrite_as_sincosc                 K   s   dt |t S r   )rz   r   rt   r   r4   r4   r5   r!    s    zsec._eval_rewrite_as_sinc                 K   s   dt |t S r   )rz   r   r   r   r4   r4   r5   r     s    zsec._eval_rewrite_as_tanc                 K   s   t td | ddS r   )r   r   r   r4   r4   r5   r     s    zsec._eval_rewrite_as_cscrg   c                 C   s2   |dkr$t | jd t| jd  S t| |d S ry   )r   r.   r   r   r{   r4   r4   r5   r}     s    z	sec.fdiffc                 C   s,   | j d }|jr(|t tj jdu r(dS d S r7   )r.   r   r   r   r_   r`   r   r4   r4   r5   r    s    
zsec._eval_is_complexc                 G   sh   ddl m} | dk s | d dkr&tjS t|}| d }tj| |d|  td|  |d|   S d S )Nr   )eulerr[   rg   )r_  r  r   rD   r   r   r   )r   rn   r   r  kr4   r4   r5   r     s    zsec.taylor_termr   c                 C   sj   | j d }||d }|tjd  tj }|jr`||tj  tjd  |}tj| | S | |S r   )	r.   r   r   r   r]   r`   r   r   r-   r  r4   r4   r5   r   $  s    
zsec._eval_as_leading_term)N)rg   )Nr   )rU   rV   rW   rX   rz   r  r  rx   r   r   r   r!  r   r   r}   r  r  r   r   r   r4   r4   r4   r5   r     s    #

r   c                   @   st   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S )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   s
   |  |S r   r  rw   r4   r4   r5   rx   U  s    z
csc.periodc                 K   s   dt | S r   rv  r   r4   r4   r5   r!  X  s    zcsc._eval_rewrite_as_sinc                 K   s   t |t|t |  S r   r  r   r4   r4   r5   r   [  s    zcsc._eval_rewrite_as_sincosc                 K   s    t |d }d|d  d|  S r   rx  r   r4   r4   r5   r   ^  s    zcsc._eval_rewrite_as_cotc                 K   s   dt |t S r   )rt   r   rz   r   r4   r4   r5   r   b  s    zcsc._eval_rewrite_as_cosc                 K   s   t td | ddS r   )r   r   r   r4   r4   r5   r   e  s    zcsc._eval_rewrite_as_secc                 K   s   dt |t S r   )rt   r   r   r   r4   r4   r5   r   h  s    zcsc._eval_rewrite_as_tanrg   c                 C   s4   |dkr&t | jd  t| jd  S t| |d S ry   )r   r.   r   r   r{   r4   r4   r5   r}   k  s    z	csc.fdiffc                 C   s&   | j d }|jr"|t jdu r"dS d S r7   r  r   r4   r4   r5   r  q  s    
zcsc._eval_is_complexc                 G   s   ddl m} | dkr dt| S | dk s4| d dkr:tjS t|}| d d }tj|d  d dd| d  d  |d|  |d| d   td|  S d S r  )r_  r^  r   r   rD   r   r   )r   rn   r   r^  r  r4   r4   r5   r   v  s    $

zcsc.taylor_term)N)rg   )rU   rV   rW   rX   rt   r  r  rx   r!  r   r   r   r   r   r}   r  r  r   r   r4   r4   r4   r5   r   .  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

    rg   c                 C   s<   | j d }|dkr.t|| t||d   S t| |d S )Nr   rg   r[   )r.   rz   rt   r   )r2   r|   rn   r4   r4   r5   r}     s    
z
sinc.fdiffc                 C   s   |j rtjS |jr8|tjtjfv r(tjS |tju r8tjS |tju rHtjS |	 rZ| | S t
|}|d ur|jrt|j rtjS nd| jrtj|tj  | S d S ru   )r0   r   rh   r   r   r   rD   r   rY   r   r8   r`   r   r   r_   )r   rb   r9   r4   r4   r5   r     s$    




z	sinc.evalr   c                 C   s    | j d }t|| |||S r   )r.   rt   r   r  r4   r4   r5   r     s    
zsinc._eval_nseriesc                 K   s   ddl m} |d|S )Nr   )jn)Zsympy.functions.special.besselr  )r2   rb   r   r  r4   r4   r5   _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'   rt   r   r   rD   rh   truer   r4   r4   r5   r!    s    zsinc._eval_rewrite_as_sinc                 C   sL   | j d jrdS t| j d \}}|jr8t|j|jgS |jrH|jrHdS d S )Nr   TF)r.   is_infiniterf   r0   r   r`   Z
is_nonzeror   r   r4   r4   r5   r     s    zsinc._eval_is_zeroc                 C   s    | j d js| j d jrdS d S r   )r.   rB   r  r   r4   r4   r5   r    s    zsinc._eval_is_realN)rg   )r   )rU   rV   rW   rX   r   rY   rZ   r}   r  r   r   r  r!  r   r  r   r4   r4   r4   r5   r     s   4


	r   c                   @   sH   e Zd ZdZejejejejfZ	e
dd Ze
dd Ze
dd ZdS )	InverseTrigonometricFunctionz/Base class for inverse trigonometric functions.c                -   C   sF  t dd tjd t dd tjd dt d tjd t dt d d tjd t dt dt d  d tjd t dt d d tjtdd t dt dt d  d tjtdd tjtjd t dt d d tjd t tjt dd  tjd t dt d d tjtdd t tjt dd  tjtdd t dd d tjd dt d d tj d t dd d tjtdd t dd t dd  tjd	 t d d t dd  tj d	 t dd t d tjd	 dt d t d tj d	 t dd t dd  tjtdd	 dt d t d tjtdd	 iS )
Nr   r[   r  rg   r   r   r	  r  r  )r$   r   r]   r   r_   r4   r4   r4   r5   _asin_table  s,    " ( ""$ z(InverseTrigonometricFunction._asin_tablec                   C   s.  t dd tjd dt d tjd t dtjd t dd tjd dt d tj d dt d tjtdd t ddt d  tjd t ddt d  tjtdd t ddt d d  tjd t ddt d d  tjtdd dt d tjd d	t d tj d dt d tjtdd iS )
Nr   r	  rg   r[   r   r   r  r  r   r$   r   r]   r   r4   r4   r4   r5   _atan_table!  s     $z(InverseTrigonometricFunction._atan_tablec                %   C   s  dt d d tjd t dtjd t ddt d d  tjd dt tddt dd   tjd t ddt d d  tjtdd dt tddt dd   tjtdd dtjd t ddt d  tjd dt dt d  tjd t ddt d  tjtdd dt dt d  tjtdd dt d tjd t dd tjtdd t dd  tjtd	d t dt d tjd
 t dt d tjtdd
 t dt d  tjtdd
 iS )Nr[   r   r  r   rg   r   r	  r  r  r  r4   r4   r4   r5   _acsc_table5  s$    $$*
  z(InverseTrigonometricFunction._acsc_tableN)rU   rV   rW   rX   r   rh   r   rD   rY   rZ   r  r  r  r  r4   r4   r4   r5   r    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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

    rg   c                 C   s0   |dkr"dt d| jd d   S t| |d S Nrg   r   r[   r$   r.   r   r{   r4   r4   r5   r}   y  s    z
asin.fdiffc                 C   s4   | j | j }|j | j kr*|jd jr0dS n|jS d S r,   r-   r.   r/   r1   r4   r4   r5   r6     s
    zasin._eval_is_rationalc                 C   s   |   o| jd jS r   )r   r.   is_positiver   r4   r4   r5   _eval_is_positive  s    zasin._eval_is_positivec                 C   s   |   o| jd jS r   )r   r.   r   r   r4   r4   r5   _eval_is_negative  s    zasin._eval_is_negativec                 C   s  |j rx|tju rtjS |tju r,tjtj S |tju rBtjtj S |jrNtjS |tju rbtj	d S |tj
u rxtj	 d S |tju rtjS | r| |  S |jr|  }||v r|| S |tj}|d urtjt| S |jrtjS t|trX|jd }|jrX|dt ; }|tkr$t| }|td kr:t| }|t d k rTt | }|S t|tr|jd }|jrtd t| S d S Nr[   r   )r   r   r   r   r   r>   r0   rD   rh   r]   r   rY   r   	is_numberr  r   r   r   rt   r.   is_comparabler   rz   r   r   rb   Z
asin_tabler   angr4   r4   r5   r     sR    










z	asin.evalc                 G   s   | dk s| d dkrt jS t|}t|dkrb| dkrb|d }|| d d  | | d   |d  S | d d }tt j|}t|}|| ||   |  S d S r   )r   rD   r   r   r   r_   r   r   rn   r   ro   r  Rra  r4   r4   r5   r     s    $zasin.taylor_termNr   c                 C   s   ddl m} | jd }||d }|jr6||S |tju rTtj	t
|| S |dkrh|||}||dk r|jr|tjk rtj | | S ||dkr|jr|tjkrtj| | S | |S Nr   rG   )r   rG   r.   r   r   r0   r   r   rY   r>   r   r   r  r   r]   r-   rh   r2   rn   r   r   rG   rb   r   r4   r4   r5   r     s    


zasin._eval_as_leading_termc                 C   s  ddl m} 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s|dkr|dS tjd |t| S ttj| j|||d	}| t|  }|	 ||  ||| | S |tju rtddd}t	tj|d  
t|dd| }	tj| jd  }
|
|}|
| | }||ds|dkr|dS tj d |t| S ttj| j|||d	}| t|  }|	 ||  ||| | S tj| |||d	}|tju r&|S |dkrB| jd ||}||dk rp|jrp|tjk rptj | S ||dkr|jr|tjkrtj| S |S 
Nr   r  Or  TZpositiver[   rg   rb  )r   rG   sympy.series.orderr  r.   r   r   rh   r   r   r   r   nseriesr   is_meromorphicr]   r$   r   removeOrC   powsimpr   r   rY   r   r  r2   rn   r   r   r   rG   r  arg0r  ZserZarg1rP   rQ   Zres1resr4   r4   r5   r     sF    &
&&&
*&
""
zasin._eval_nseriesc                 K   s   t jd t| S ru   r   r]   r   rw  r4   r4   r5   _eval_rewrite_as_acos
	  s    zasin._eval_rewrite_as_acosc                 K   s    dt |dtd|d     S r   )r   r$   rw  r4   r4   r5   _eval_rewrite_as_atan	  s    zasin._eval_rewrite_as_atanc                 K   s&   t j tt j| td|d    S rV  r   r>   r   r$   rw  r4   r4   r5   _eval_rewrite_as_log	  s    zasin._eval_rewrite_as_logc                 K   s    dt dtd|d   |  S r   )r   r$   r   r4   r4   r5   _eval_rewrite_as_acot	  s    zasin._eval_rewrite_as_acotc                 K   s   t jd td|  S r   r   r]   r   r   r4   r4   r5   _eval_rewrite_as_asec	  s    zasin._eval_rewrite_as_asecc                 K   s   t d| S r   )r   r   r4   r4   r5   _eval_rewrite_as_acsc	  s    zasin._eval_rewrite_as_acscc                 C   s   | j d }|jodt| jS Nr   rg   r.   rB   rL   is_nonnegativer2   rn   r4   r4   r5   r   	  s    
zasin._eval_is_extended_realc                 C   s   t S rW  rv  r{   r4   r4   r5   rY   	  s    zasin.inverse)rg   )Nr   )r   )rg   )rU   rV   rW   rX   r}   r6   r  r  r  r   r  r   r   r   r   r  r  r  r  r  r  r   rY  r4   r4   r4   r5   r   N  s(   *

5

'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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

    rg   c                 C   s0   |dkr"dt d| jd d   S t| |d S Nrg   r   r   r[   r  r{   r4   r4   r5   r}   S	  s    z
acos.fdiffc                 C   s4   | j | j }|j | j kr*|jd jr0dS n|jS d S r,   r  r1   r4   r4   r5   r6   Y	  s
    zacos._eval_is_rationalc                 C   s^  |j rr|tju rtjS |tju r,tjtj S |tju rBtjtj S |jrRtjd S |tju rbtj	S |tj
u rrtjS |tju rtjS |jr|  }||v rtd ||  S | |v rtd ||   S |tj}|d urtd t| S t|tr,|jd }|jr,|dt ; }|tkr(dt | }|S t|trZ|jd }|jrZtd t| S d S r  )r   r   r   r   r>   r   r0   r]   rh   rD   r   rY   r  r  r   r   r   r   rz   r.   r  rt   r  r4   r4   r5   r   a	  sF    










z	acos.evalc                 G   s   | dkrt jd S | dk s&| d dkr,t jS t|}t|dkrt| dkrt|d }|| d d  | | d   |d  S | d d }tt j|}t|}| | ||   |  S d S r   )r   r]   rD   r   r   r   r_   r   r  r4   r4   r5   r   	  s    
$zacos.taylor_termNr   c                 C   s   ddl m} | jd }||d }|dkrJtdttj| | S |tj	u rhtj
t|| S |dkr||||}||dk r|jr|tjk rdtj | | S ||dkr|jr|tjkr| | S | |S Nr   r  rg   r[   )r   rG   r.   r   r   r$   r   rh   r   rY   r>   r   r   r  r   r]   r-   r  r4   r4   r5   r   	  s    

zacos._eval_as_leading_termc                 C   s   | j d }|jodt| jS r  r  r  r4   r4   r5   r   	  s    
zacos._eval_is_extended_realc                 C   s   |   S r   )r   r   r4   r4   r5   _eval_is_nonnegative	  s    zacos._eval_is_nonnegativec                 C   s  ddl m} 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s|dkr|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j|t| S ttj| j|||d	}| t|  }|	 ||  ||| | S tj| |||d	}|tju r|S |dkr2| jd ||}||dk rb|jrb|tjk rbdtj | S ||dkr|jr|tjkr| S |S r  )r   rG   r  r  r.   r   r   rh   r   r   r   r   r  r   r  r$   r   r  rC   r  r   r]   r   rY   r   r  r  r4   r4   r5   r   	  sF    &
&&
$&
""zacos._eval_nseriesc                 K   s.   t jd t jtt j| td|d     S r   r   r]   r>   r   r$   rw  r4   r4   r5   r  	  s    zacos._eval_rewrite_as_logc                 K   s   t jd t| S ru   r   r]   r   rw  r4   r4   r5   _eval_rewrite_as_asin	  s    zacos._eval_rewrite_as_asinc                 K   s:   t td|d  | tjd d|td|d      S rV  )r   r$   r   r]   rw  r4   r4   r5   r  	  s    zacos._eval_rewrite_as_atanc                 C   s   t S rW  r  r{   r4   r4   r5   rY  	  s    zacos.inversec                 K   s*   t jd dtdtd|d   |   S r   )r   r]   r   r$   r   r4   r4   r5   r  	  s    zacos._eval_rewrite_as_acotc                 K   s   t d| S r   )r   r   r4   r4   r5   r  	  s    zacos._eval_rewrite_as_asecc                 K   s   t jd td|  S r   r   r]   r   r   r4   r4   r5   r  	  s    zacos._eval_rewrite_as_acscc                 C   sN   | j d }| | j d  }|jdu r,|S |jrJ|d jrJ|d jrJ|S d S Nr   Frg   )r.   r-   r   rB   r  Zis_nonpositive)r2   rO  r/  r4   r4   r5   r   	  s    

zacos._eval_conjugate)rg   )Nr   )r   )rg   )rU   rV   rW   rX   r}   r6   r  r   r  r   r   r   r   r  r   r  r  r  rY  r  r  r  r   r4   r4   r4   r5   r   '	  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 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

    r.   rg   c                 C   s,   |dkrdd| j d d   S t| |d S r  r.   r   r{   r4   r4   r5   r}   *
  s    z
atan.fdiffc                 C   s4   | j | j }|j | j kr*|jd jr0dS n|jS d S r,   r  r1   r4   r4   r5   r6   0
  s
    zatan._eval_is_rationalc                 C   s   | j d jS r   )r.   Zis_extended_positiver   r4   r4   r5   r  8
  s    zatan._eval_is_positivec                 C   s   | j d jS r   )r.   Zis_extended_nonnegativer   r4   r4   r5   r  ;
  s    zatan._eval_is_nonnegativec                 C   s   | j d jS r   )r.   r0   r   r4   r4   r5   r   >
  s    zatan._eval_is_zeroc                 C   s   | j d jS r   r   r   r4   r4   r5   r  A
  s    zatan._eval_is_realc                 C   s  |j rv|tju rtjS |tju r*tjd S |tju r@tj d S |jrLtjS |tju r`tjd S |tj	u rvtj d S |tj
u rddlm} |tj d tjd S | r| |  S |jr|  }||v r|| S |tj}|d u rtjt| S |jrtjS t|trH|jd }|jrH|t; }|td krD|t8 }|S t|tr|jd }|jrtd t| }|td kr|t8 }|S d S )Nr[   r  r   r~   )r   r   r   r   r]   r   r0   rD   rh   r   rY   r   r   r   r  r  r   r>   r   r   r   r.   r  r   r   r   )r   rb   r   
atan_tabler   r  r4   r4   r5   r   D
  sR    










z	atan.evalc                 G   sD   | dk s| d dkrt jS t|}t j| d d  ||   |  S d S r  )r   rD   r   r   r   rn   r   r4   r4   r5   r   x
  s    zatan.taylor_termNr   c                 C   s   ddl m}m} | jd }||d }|jr:||S |tj	u rZt
d| j||dS |dkrn|||}||dk r||jr||tjkr| |tj S ||dkr||jr||tjk r| |tj S | |S )Nr   rg  rg   )r   )r   rG   rF   r.   r   r   r0   r   r   rY   r   r   r   rh   r-   r]   r   r2   rn   r   r   rG   rF   rb   r   r4   r4   r5   r   
  s    


$$zatan._eval_as_leading_termc           	      C   s   ddl m}m} | jd |d}tj| |||d}|dkrN| jd ||}|tj	u rr||dkrn|tj
 S |S ||dk r||jr||tjkr|tj
 S ||dkr||jr||tjk r|tj
 S |S Nr   rg  rb  )r   rG   rF   r.   r   r   r   r   r   rY   r]   r0   rh   r   	r2   rn   r   r   r   rG   rF   r  r  r4   r4   r5   r   
  s    

$
$
zatan._eval_nseriesc                 K   s2   t jd tt jt j|  tt jt j|    S ru   )r   r>   r   rh   rw  r4   r4   r5   r  
  s    zatan._eval_rewrite_as_logc                    s   |d t ju r4t jd td| jd   |||S |d t ju rjt j d td| jd   |||S t ||||S d S r  )	r   r   r]   r   r.   r   r   super_eval_aseriesr2   r   Zargs0rn   r   	__class__r4   r5   r  
  s
    &(zatan._eval_aseriesc                 C   s   t S rW  r  r{   r4   r4   r5   rY  
  s    zatan.inversec                 K   s2   t |d | tjd tdt d|d     S r   r$   r   r]   r   r   r4   r4   r5   r  
  s    zatan._eval_rewrite_as_asinc                 K   s(   t |d | tdt d|d    S r   r$   r   r   r4   r4   r5   r  
  s    zatan._eval_rewrite_as_acosc                 K   s   t d| S r   r  r   r4   r4   r5   r  
  s    zatan._eval_rewrite_as_acotc                 K   s$   t |d | tt d|d   S r   r$   r   r   r4   r4   r5   r  
  s    zatan._eval_rewrite_as_asecc                 K   s.   t |d | tjd tt d|d    S r   r$   r   r]   r   r   r4   r4   r5   r  
  s    zatan._eval_rewrite_as_acsc)rg   )Nr   )r   )rg   ) rU   rV   rW   rX   tTupler   __annotations__r   r>   rZ   r}   r6   r  r  r   r  r  r   r  r   r   r   r   r  r  rY  r  r  r  r  r  __classcell__r4   r4   r  r5   r   	  s0   
&

3


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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

    rg   c                 C   s,   |dkrdd| j d d   S t| |d S r  r  r{   r4   r4   r5   r}   
  s    z
acot.fdiffc                 C   s4   | j | j }|j | j kr*|jd jr0dS n|jS d S r,   r  r1   r4   r4   r5   r6   
  s
    zacot._eval_is_rationalc                 C   s   | j d jS r   )r.   r  r   r4   r4   r5   r  
  s    zacot._eval_is_positivec                 C   s   | j d jS r   )r.   r   r   r4   r4   r5   r    s    zacot._eval_is_negativec                 C   s   | j d jS r   r   r   r4   r4   r5   r     s    zacot._eval_is_extended_realc                 C   s  |j rp|tju rtjS |tju r&tjS |tju r6tjS |jrFtjd S |tju rZtjd S |tj	u rptj d S |tj
u rtjS | r| |  S |jr|  }||v rtd ||  }|td kr|t8 }|S |tj}|d u rtj t| S |jrtjtj S t|trL|jd }|jrL|t; }|td krH|t8 }|S t|tr|jd }|jrtd t| }|td kr|t8 }|S d S )Nr[   r  r   )r   r   r   r   rD   r   r0   r]   rh   r   rY   r   r  r  r   r   r>   r   r_   r   r   r.   r  r   r   )r   rb   r  r  r   r4   r4   r5   r     sV    










z	acot.evalc                 G   sV   | dkrt jd S | dk s&| d dkr,t jS t|}t j| d d  ||   |  S d S r  )r   r]   rD   r   r   r  r4   r4   r5   r   <  s    
zacot.taylor_termNr   c                 C   s  ddl m}m} | jd }||d }|tju rBd| |S |dkrV|	||}|j
r||dk rx| |tj S | |S ||dkr||j
r||tjkr||tjk r| |tj S ||dk r||j
r||tjk r||tjkr| |tj S | |S )Nr   rg  rg   )r   rG   rF   r.   r   r   r   rY   r   r   r0   r-   r]   rD   rh   r   r  r4   r4   r5   r   G  s     


2:zacot._eval_as_leading_termc           	      C   s   ddl m}m} | jd |d}tj| |||d}|tju rB|S |dkr\| jd 	||}|j
r|||dk rx|tj S |S ||dkr||j
r||tjkr||tjk r|tj S ||dk r||j
r||tjk r||tjkr|tj S |S r  )r   rG   rF   r.   r   r   r   r   rY   r   r0   r]   rD   rh   r   r  r4   r4   r5   r   Y  s     

2
2
zacot._eval_nseriesc                    s   |d t ju r4t jd td| jd   |||S |d t ju rnt jtdd td| jd   |||S tt	| 
||||S d S )Nr   r[   rg   r   )r   r   r]   r   r.   r   r   r   r  r   r  r  r  r4   r5   r  k  s
    &,zacot._eval_aseriesc                 K   s.   t jd tdt j|  tdt j|    S r   )r   r>   r   rw  r4   r4   r5   r  s  s    zacot._eval_rewrite_as_logc                 C   s   t S rW  rx  r{   r4   r4   r5   rY  w  s    zacot.inversec                 K   sB   |t d|d   tjd tt |d  t |d  d    S rV  r  r   r4   r4   r5   r  }  s    ,zacot._eval_rewrite_as_asinc                 K   s8   |t d|d   tt |d  t |d  d   S rV  r  r   r4   r4   r5   r    s    zacot._eval_rewrite_as_acosc                 K   s   t d| S r   rX  r   r4   r4   r5   r    s    zacot._eval_rewrite_as_atanc                 K   s0   |t d|d   tt d|d  |d   S rV  r  r   r4   r4   r5   r    s    zacot._eval_rewrite_as_asecc                 K   s:   |t d|d   tjd tt d|d  |d    S rV  r  r   r4   r4   r5   r    s    zacot._eval_rewrite_as_acsc)rg   )Nr   )r   )rg   )rU   rV   rW   rX   r   r>   rZ   r}   r6   r  r  r   r  r   r  r   r   r   r   r  r  rY  r  r  r  r  r  r  r4   r4   r  r5   r   
  s,   *

4	


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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rB|tju r"tjS |tju r2tjS |tju rBtjS |tj	tj
tjfv r`tjd S |jr|  }||v rtd ||  S | |v rtd ||   S t|tr|jd }|jr|dt ; }|tkrdt | }|S t|tr|jd }|jrtd t| S d S r  )r0   r   rY   r   r   rh   rD   r   r]   r   r   r  r  r   r   r   r.   r  r   r   r   rb   Z
acsc_tabler  r4   r4   r5   r     s8    







z	asec.evalrg   c                 C   sB   |dkr4d| j d d tdd| j d d     S t| |d S r  r.   r$   r   r{   r4   r4   r5   r}     s    ,z
asec.fdiffc                 C   s   t S rW  rT  r{   r4   r4   r5   rY    s    zasec.inverseNr   c                 C   s   ddl m} | jd }||d }|dkrJtdt|tj | S |j	rdtj
t|| S |dkrx|||}||dk r|jr|tjkr|tjk r| | S ||dkr|jr|tjk r|tjkrdtj | | S | |S r  )r   rG   r.   r   r   r$   r   rh   r   r0   r>   r   r   r  rD   r-   r   r]   r  r4   r4   r5   r     s    
&&zasec._eval_as_leading_termc                 C   sJ  ddl m} 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  }
|
|}|
| | }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 ||}||dk r
|jr
|tjkr
|tjk r
| S ||dkrF|jrF|tjk rF|tjkrFdtj | S |S 	Nr   r  r  r  Tr  r[   rb  )r   rG   r  r  r.   r   r   rh   r   r   r   r   r  r   r   r$   r   r  rC   r  r   rY   r   r  rD   r]   r  r4   r4   r5   r   	  s>    
&
&&
&
..zasec._eval_nseriesc                 C   s2   | j d }|jdu rdS t|d j| d jfS r  )r.   rB   r   r  r  r4   r4   r5   r   ,  s    

zasec._eval_is_extended_realc              	   K   s2   t jd t jtt j| tdd|d      S r   r  r   r4   r4   r5   r  2  s    zasec._eval_rewrite_as_logc                 K   s   t jd td|  S r   r  r   r4   r4   r5   r  5  s    zasec._eval_rewrite_as_asinc                 K   s   t d| S r   )r   r   r4   r4   r5   r  8  s    zasec._eval_rewrite_as_acosc                 K   s8   t |d | tj d dt|t |d d     S r   r$   r   r]   r   r   r4   r4   r5   r  ;  s    zasec._eval_rewrite_as_atanc                 K   s8   t |d | tj d dt|t |d d     S r   r$   r   r]   r   r   r4   r4   r5   r  >  s    zasec._eval_rewrite_as_acotc                 K   s   t jd t| S ru   r  r   r4   r4   r5   r  A  s    zasec._eval_rewrite_as_acsc)rg   )rg   )Nr   )r   )rU   rV   rW   rX   r  r   r}   rY  r   r   r   r  r  r  r  r  r  r4   r4   r4   r5   r     s   ;
"



#r   c                   @   st   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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   s6  |j rtjS |jrL|tju r"tjS |tju r6tjd S |tju rLtj d S |tjtj	tjfv rftj
S | rz| |  S |jr|  }||v r|| S t|tr|jd }|jr|dt ; }|tkrt| }|td krt| }|t d k r t | }|S t|tr2|jd }|jr2td t| S d S r  )r0   r   rY   r   r   rh   r]   r   r   r   rD   r   r  r  r   r   r.   r  r   r   r   r  r4   r4   r5   r   p  s@    






z	acsc.evalrg   c                 C   sB   |dkr4d| j d d tdd| j d d     S t| |d S r  r  r{   r4   r4   r5   r}     s    ,z
acsc.fdiffc                 C   s   t S rW  r   r{   r4   r4   r5   rY    s    zacsc.inverseNr   c                 C   s   ddl m} | jd }||d }|jr@tjt|	| S |tj
u rT|	|S |dkrh|||}||dk r|jr|tjkr|tjk rtj| | S ||dkr|jr|tjk r|tjkrtj | | S | |S r  )r   rG   r.   r   r   r0   r   r>   r   r   rY   r   r  rD   rh   r]   r-   r   r  r4   r4   r5   r     s    


&&zacsc._eval_as_leading_termc                 C   sL  ddl m} 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  }
|
|}|
| | }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 ||}||dk r|jr|tjkr|tjk rtj| S ||dkrH|jrH|tjk rH|tjkrHtj | S |S r  )r   rG   r  r  r.   r   r   rh   r   r   r   r   r  r   r   r$   r   r  rC   r  r   rY   r   r  rD   r]   r  r4   r4   r5   r     s>    
&
&&
&
.
.zacsc._eval_nseriesc                 K   s*   t j tt j| tdd|d     S rV  r  r   r4   r4   r5   r    s    zacsc._eval_rewrite_as_logc                 K   s   t d| S r   )r   r   r4   r4   r5   r    s    zacsc._eval_rewrite_as_asinc                 K   s   t jd td|  S r   r  r   r4   r4   r5   r    s    zacsc._eval_rewrite_as_acosc                 K   s.   t |d | tjd tt |d d   S r   r  r   r4   r4   r5   r    s    zacsc._eval_rewrite_as_atanc                 K   s2   t |d | tjd tdt |d d    S r   r  r   r4   r4   r5   r    s    zacsc._eval_rewrite_as_acotc                 K   s   t jd t| S ru   r  r   r4   r4   r5   r    s    zacsc._eval_rewrite_as_asec)rg   )rg   )Nr   )r   )rU   rV   rW   rX   r  r   r}   rY  r   r   r  r  r  r  r  r  r4   r4   r4   r5   r   E  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}m} ddlm} |tju rN|jr2tjS dtj ||| tj S |tj	u r^tj
S |jr|jr|jr|jr||}||}|jr|jr|jrt|| S |jr|jrt|| tj S |jrt|| tj S n<|jr|j rtjd S |jrtj d S |jrtjS |jrr|jr@tjtj||  S |jrrttj||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 )Nr   rg  )	Heavisider[   T)r   rG   rF   Z'sympy.functions.special.delta_functionsr  r   r   r0   r]   r   rD   r  r  rB   r  r   r   r  r   Zis_extended_nonzerorh   r'   r   r>   r   r$   )r   r   rn   rG   rF   r  r4   r4   r5   r   S  sL    


 z
atan2.evalc                 K   s.   t j t|t j|  t|d |d    S ru   r  )r2   r   rn   r   r4   r4   r5   r  |  s    zatan2._eval_rewrite_as_logc              	   K   s`   ddl m} tdt||t|d |d     t|dft||dk fdt|dftjdfS )Nr   r   r[   T)	r   rF   r'   r   r$   r   r   r   r   )r2   r   rn   r   rF   r4   r4   r5   r    s    .zatan2._eval_rewrite_as_atanc                 K   sv   ddl m} |jr*|jr*|||tj  S |tj|  }|d |d  }||t| tjtt|tt|   S )Nr   )rb   r[   )r   rb   rB   r   r>   r$   r   rL   )r2   r   rn   r   rb   r   r   r4   r4   r5   _eval_rewrite_as_arg  s    zatan2._eval_rewrite_as_argc                 C   s   | j d jo| j d jS r  r   r   r4   r4   r5   r     s    zatan2._eval_is_extended_realc                 C   s    |  | jd  | jd  S r  r   r   r4   r4   r5   r     s    zatan2._eval_conjugatec                 C   sR   | j \}}|dkr&||d |d   S |dkrD| |d |d   S t| |d S rV  r  )r2   r|   r   rn   r4   r4   r5   r}     s    
zatan2.fdiffc                    s&   | j \}}|jr"|jr"t |S d S r   )r.   rB   r  _eval_evalf)r2   precr   rn   r  r4   r5   r    s    
zatan2._eval_evalf)rU   rV   rW   rX   r  r   r  r  r  r   r   r}   r  r  r4   r4   r  r5   r     s   f
(r   N)rg   )Ptypingr   r  Zsympy.core.addr   Zsympy.core.basicr   r   Zsympy.core.exprr   Zsympy.core.functionr   r   r	   r
   Zsympy.core.logicr   r   r   r   Zsympy.core.numbersr   r   r   r   Zsympy.core.relationalr   Zsympy.core.singletonr   Zsympy.core.symbolr   r   Z(sympy.functions.combinatorial.factorialsr   r   Z&sympy.functions.elementary.exponentialr   r   Z#sympy.functions.elementary.integersr   Z%sympy.functions.elementary.hyperbolicr   r   r   r   r    r!   r"   r#   Z(sympy.functions.elementary.miscellaneousr$   r%   r&   Z$sympy.functions.elementary.piecewiser'   Zsympy.sets.setexprr(   Zsympy.sets.setsr)   Zsympy.utilities.iterablesr*   r+   rf   r8   rt   rz   r   r   r  r   r   r   r  r   r   r   r   r   r   r   r4   r4   r4   r5   <module>   sh   (D%
K  3   O  R  ;x`W|M Z Y E L 8 (