o
    GZh                    @  s  d dl mZ d dlmZ d dlmZ d dlmZ d dlm	Z	m
Z
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# 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;m<Z<m=Z= d dl>m?Z? d dl@mAZA d dlBmCZC d dlDmEZE dd ZFG dd de	ZGedd ZHdd  ZIdKdLd(d)ZJG d*d+ d+eGZKG d,d- d-eGZLG d.d/ d/eGZMG d0d1 d1eGZNG d2d3 d3eGZOG d4d5 d5eOZPG d6d7 d7eOZQG d8d9 d9e	ZRG d:d; d;e	ZSG d<d= d=eSZTG d>d? d?eSZUG d@dA dAeSZVG dBdC dCeSZWG dDdE dEeSZXG dFdG dGeSZYG dHdI dIeSZZdJS )M    )annotations)Add)cacheit)Expr)DefinedFunctionArgumentIndexError	PoleError
expand_mul)	fuzzy_notfuzzy_or	FuzzyBool	fuzzy_and)Mod)RationalpiIntegerFloatequal_valued)NeEq)S)SymbolDummy)sympify)	factorialRisingFactorial)	bernoullieuler)argimre)logexp)floor)sqrtMinMax)	Piecewise)	cos_table	ipartfracfermat_coords)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   Zas_coefficientr   ImaginaryUnit)r    r1   W/var/www/auris/lib/python3.10/site-packages/sympy/functions/elementary/trigonometric.py_imaginary_unit_as_coefficient!   s   
r3   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sr1   r1   r2   _eval_is_rational3   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)r6   r7   r
   r9   Zis_algebraic	_pi_coeffr8   )r;   r<   pi_coeffr1   r1   r2   _eval_is_algebraic;   s   z(TrigonometricFunction._eval_is_algebraicc                 K  s&   | j dd|i|\}}||tj  S )Ndeepr1   )as_real_imagr   r0   )r;   rB   hintsZre_partZim_partr1   r1   r2   _eval_expand_complexF   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)r7   is_extended_realexpandr   ZerorC   )r;   rB   rD   r    r   r1   r1   r2   _as_real_imagJ   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)Zas_Addz%Use the periodicity function instead.)r	   r7   tupleZfree_symbolshasr   rI   is_MulZas_independentabsis_AddNotImplementedError)r;   Zgeneral_periodsymbolfghar1   r1   r2   _periodW   s$   

zTrigonometricFunction._periodTN)__name__
__module____qualname____doc__Z
unbranchedr   ComplexInfinity_singularitiesr=   rA   rE   rJ   rV   r1   r1   r1   r2   r4   -   s    

r4   c                	   C  s   ddddddddd	S )
N)      )r`      )ra      )rb   
   )rb      )rd   rc   )      )(   <   )   re   rf         rg   rh   x   r1   r1   r1   r1   r2   _table2q   s   rm   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   rI   r   Z	make_argscoeffr   r8   appendHalf
is_integeris_even)r   r@   Z
rest_termsrU   Km1m2r1   r1   r2   _peeloff_pi   s   






rw      r   r   cyclesintreturnExpr | Nonec                 C  s
  | t u rtjS | stjS | jr}| t }|r{| \}}|jrZt|d }|dkrPt	t
t|d  }d| }|| }t	|}	t|	|rOt|	|}|| }n
tt	|}|| }|jry|d }
|
dkrg|S |
su|jdurqt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

    rx   r   rn   N)r   r   OnerI   rM   ro   as_coeff_MulZis_FloatrN   rz   roundr!   Zevalfr   r   rr   rs   r   r9   )r   ry   cxcxrR   pmcmic2r1   r1   r2   r?      sF   %



r?   c                      s   e Zd ZdZd8ddZd9ddZedd	 Zee	d
d Z
d: fdd	Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd;d*d+Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 Z  Z 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] https://dlmf.nist.gov/4.14
    .. [3] https://functions.wolfram.com/ElementaryFunctions/Sin
    .. [4] https://mathworld.wolfram.com/TrigonometryAngles.html

    Nc                 C     |  dt |S Nrn   rV   r   r;   rQ   r1   r1   r2   period#     z
sin.periodrx   c                 C  s    |dkrt | jd S t| |Nrx   r   )cosr7   r   r;   argindexr1   r1   r2   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SetExprrx   	FiniteSetrn   ra   r_      rd   )sinhF)1!sympy.calculus.accumulationboundsr   sympy.sets.setexprr   	is_Numberr   NaNr9   rI   InfinityNegativeInfinityr]   r/   sympy.sets.setsr   minmaxr#   r   intersectionr   ZEmptySetr%   r   r&   
_eval_funccould_extract_minus_signr3   %sympy.functions.elementary.hyperbolicr   r0   r?   rr   rs   NegativeOnerq   is_Rationalr   rO   rw   asinr7   atanr$   atan2acosacotacscasec)clsr   r   r   r   r   r   di_coeffr   r@   nargr   resultr   yr1   r1   r2   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   rn   rx   r   rI   r   lenr   r   nr   previous_termsr   r1   r1   r2   taylor_term     zsin.taylor_termr   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
r7   subsr!   rL   r   r   r]   r   super_eval_nseriesr;   r   r   r   r   r   	__class__r1   r2   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   HyperbolicFunctionrn   
r   r   r   r0   r/   r4   r6   r7   rewriter"   )r;   r   kwargsr   Ir1   r1   r2   _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   rn   r/   r!   r   r0   r7   r;   r   r   r   r   r1   r1   r2   _eval_rewrite_as_Pow  s
   

"zsin._eval_rewrite_as_Powc                 K  s   t |td  ddS Nrn   Fevaluater   r   r;   r   r   r1   r1   r2   _eval_rewrite_as_cos     zsin._eval_rewrite_as_cosc                 K  s"   t tj| }d| d|d   S Nrn   rx   tanr   rq   r;   r   r   Ztan_halfr1   r1   r2   _eval_rewrite_as_tan  s   zsin._eval_rewrite_as_tanc                 K  s   t |t| t| S rX   r   r   r   r1   r1   r2   _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   rn   rx   T	cotr   rq   r'   r+   r   r   r   r   r;   r   r   Zcot_halfr1   r1   r2   _eval_rewrite_as_cot  s   $zsin._eval_rewrite_as_cotc                 K      | j tfi |j tfi |S rX   )r   r   powr   r1   r1   r2   _eval_rewrite_as_pow      zsin._eval_rewrite_as_powc                 K  r   rX   )r   r   r$   r   r1   r1   r2   _eval_rewrite_as_sqrt  r   zsin._eval_rewrite_as_sqrtc                 K     dt | S Nrx   cscr   r1   r1   r2   _eval_rewrite_as_csc     zsin._eval_rewrite_as_cscc                 K  s   dt |td  dd S )Nrx   rn   Fr   secr   r   r1   r1   r2   _eval_rewrite_as_sec  r   zsin._eval_rewrite_as_secc                 K  s   |t | S rX   )sincr   r1   r1   r2   _eval_rewrite_as_sinc  r   zsin._eval_rewrite_as_sincc                 K  s(   ddl m} tt| d |tj| S )Nr   besseljrn   sympy.functions.special.besselr   r$   r   r   rq   r;   r   r   r   r1   r1   r2   _eval_rewrite_as_besselj  s   zsin._eval_rewrite_as_besseljc                 C     |  | jd  S Nr   r6   r7   	conjugater;   r1   r1   r2   _eval_conjugate  r   zsin._eval_conjugateTc                 K  sH   ddl m}m} | jdd|i|\}}t||| t||| fS Nr   coshr   rB   r1   )r   r  r   rJ   r   r   r;   rB   rD   r  r   r    r   r1   r1   r2   rC     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|S )
Nr   )
chebyshevt
chebyshevuFr   TZrationalrx   rn   )rB   )#sympy.functions.special.polynomialsr  r  r7   rO   as_two_termsr   _eval_expand_trigr   rM   r~   
is_IntegerZis_oddr   r   r	   )r;   rD   r  r  r   r   r   sxsyr   cyr   r1   r1   r2   r    s*   
 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   rx   r   r   r7   r   cancelr   rr   as_leading_termr   r   r]   limitr    is_negativer   r   	is_finiter6   	r;   r   r   r   r   r   x0r   ltr1   r1   r2   _eval_as_leading_term  s   


zsin._eval_as_leading_termc                 C     | j d jrdS d S Nr   Tr7   rG   r	  r1   r1   r2   _eval_is_extended_real     zsin._eval_is_extended_realc                 C     | j d }|jr
dS d S r(  r)  r;   r   r1   r1   r2   _eval_is_finite  s   
zsin._eval_is_finitec                 C  "   t | jd \}}|jr|jS d S r  rw   r7   r9   rr   r;   restZpi_multr1   r1   r2   _eval_is_zero     zsin._eval_is_zeroc                 C      | j d js| j d jrdS d S r(  r7   rG   
is_complexr	  r1   r1   r2   _eval_is_complex#  
   
zsin._eval_is_complexrX   rx   r   rW   )!rY   rZ   r[   r\   r   r   classmethodr   staticmethodr   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r
  rC   r  r&  r*  r.  r3  r8  __classcell__r1   r1   r   r2   r      s<    
/

t
r   c                      s   e Zd ZdZd8ddZd9ddZedd	 Zee	d
d Z
d: f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d%d& Zd'd( Zd<d*d+Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 Z  ZS )=r   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] https://dlmf.nist.gov/4.14
    .. [3] https://functions.wolfram.com/ElementaryFunctions/Cos

    Nc                 C  r   r   r   r   r1   r1   r2   r   U  r   z
cos.periodrx   c                 C  s"   |dkrt | jd  S t| |r   )r   r7   r   r   r1   r1   r2   r   X  s   
z	cos.fdiffc                 C  sL  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rw|jrtj| S d| jr|jdu rtjS |js|t }||kr| |S d S |jru|j}	|jd|	  }
|
|	kr|d t }| | S d|
 |	krd| t }| | S t  }|	|v r||	 \}}|
t | |
t | }}| || |}}d ||fv rd S || | td | | td |   S |	d
krd S tj!t"dd d d}|	|v r:||j }||j|# S d|	d kru|d t }| |}d |krRd S d| d d }d|dk rbd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|t0r$|j*d }d| S d S )Nr   r  r   r   r   rx   rn   F)r  ri   ra   r`   )r_   ra   )1r  r  r   r   r   r   r   r   r   r9   r}   r   r   r]   r/   r   r   r   rG   r"  r   r3   r   r  r?   rr   r   rs   rI   r   qr   rm   rq   r$   rH   rz   rN   rO   rw   r   r   r7   r   r   r   r   r   r   )r   r   r  r   r   r   r  r@   r   r@  r   table2rU   bnvalanvalbcst_table_someZctsnvalr   sign_cosr   r   r1   r1   r2   r   ^  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   rn   rx   r   r   r   r1   r1   r2   r     r   zcos.taylor_termr   c                   r   r   r   r   r   r1   r2   r     r   zcos._eval_nseriesc                 K  s\   t j}ddlm} t|t|fr||jd jt	fi |}t	|| t	| |  d S r   
r   r0   r   r   r/   r4   r6   r7   r   r"   )r;   r   r   r   r   r1   r1   r2   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   r1   r1   r2   r     s
   

zcos._eval_rewrite_as_Powc                 K  s   t |td  ddS r   )r   r   r   r1   r1   r2   _eval_rewrite_as_sin  r   zcos._eval_rewrite_as_sinc                 K  s"   t tj| d }d| d|  S r   r   r   r1   r1   r2   r     s   zcos._eval_rewrite_as_tanc                 K  s   t |t| t | S rX   r   r   r1   r1   r2   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 )Nrn   rx   r   Tr   r   r1   r1   r2   r     s   (zcos._eval_rewrite_as_cotc                 K  s   | j |fi |S rX   )r   r   r1   r1   r2   r     s   zcos._eval_rewrite_as_powr   r   c                   s  ddl m} t|  d u rd S t trd S t tsd S t } j|v r;| j| j  } jdk r9|	 }|S  jd sk d }t
|t jtfi |}|d d }t|d r_dnd}	|	td| d  S t j}
|
ru|
}ndd t j D }t| } fd	d
t||D }dd t|tdD }t
tdd
 |D  |}|
rt|
dkr|S |jtfi |S )Nr   r?  i  rn   rx   r   c                 S  s   g | ]\}}|| qS r1   r1   ).0rB  er1   r1   r2   
<listcomp>?  s    z-cos._eval_rewrite_as_sqrt.<locals>.<listcomp>c                 3  s$    | ]\}} j t|| V  qd S rX   )r   r   )rJ  r   r   r@   r1   r2   	<genexpr>B  s   " z,cos._eval_rewrite_as_sqrt.<locals>.<genexpr>c                 S  s    g | ]}|d  |d t  fqS )rx   r   )r   rJ  r   r1   r1   r2   rL  C  s     zc                 s  s    | ]}|d  V  qdS )r   Nr1   rO  r1   r1   r2   rN  D  s    )r  r  r?   r/   r   r   r(   r@  r   rH   r   r   r   r$   rz   r*   r,   itemsr)   zipr.   sumr  r   r   )r;   r   r   r  rE  rvZpico2rF  r   rG  ZFCZdenomsZapartdecompXZpclsr1   rM  r2   r     s>   





 zcos._eval_rewrite_as_sqrtc                 K  r   r   r   r   r1   r1   r2   r   J  r   zcos._eval_rewrite_as_secc                 K     dt |jtfi | S r   )r   r   r   r   r1   r1   r2   r   M     zcos._eval_rewrite_as_cscc                 K  s:   ddl m} ttt| d |tj | t|dfdS )Nr   r   rn   rx   Tr  r   r'   r$   r   r   rq   r   r  r1   r1   r2   r  P  s
   &zcos._eval_rewrite_as_besseljc                 C  r  r  r  r	  r1   r1   r2   r
  W  r   zcos._eval_conjugateTc                 K  sJ   ddl m}m} | jdd|i|\}}t||| t| || fS r  )r   r  r   rJ   r   r   r  r1   r1   r2   rC   Z  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rS|j	dd\}
}|
j
rS||
t|S t|S )Nr   r?  Fr   Tr  )r  r  r7   rO   r  r   r  r   rM   r~   r  )r;   rD   r  r   r   r   r  r  r   r  ro   termsr1   r1   r2   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   rn   r  r  r  r   rx   r  r#  r1   r1   r2   r&  p  s   


zcos._eval_as_leading_termc                 C  r'  r(  r)  r	  r1   r1   r2   r*  ~  r+  zcos._eval_is_extended_realc                 C  r,  r(  r)  r-  r1   r1   r2   r.    s   
zcos._eval_is_finitec                 C  r5  r(  r6  r	  r1   r1   r2   r8    r9  zcos._eval_is_complexc                 C  s0   t | jd \}}|jr|r|tj jS d S d S r  rw   r7   r9   r   rq   rr   r1  r1   r1   r2   r3       
zcos._eval_is_zerorX   r:  r;  )r   r   rW   ) rY   rZ   r[   r\   r   r   r<  r   r=  r   r   r   r   r   rI  r   r   r   r   r   r   r   r  r
  rC   r  r&  r*  r.  r8  r3  r>  r1   r1   r   r2   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< f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- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Z   Z!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] https://dlmf.nist.gov/4.14
    .. [3] https://functions.wolfram.com/ElementaryFunctions/Tan

    Nc                 C     |  t|S rX   r   r   r1   r1   r2   r     r   z
tan.periodrx   c                 C  s    |dkrt j| d  S t| |Nrx   rn   )r   r}   r   r   r1   r1   r2   r     r   z	tan.fdiffc                 C     t S z7
        Returns the inverse of this function.
        r   r   r1   r1   r2   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 t  }||v ry|| \}}| |t | | |t | }}d ||fv rod 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*r/|j&d }d| S t
|t+rH|j&d }dtdd|d   |  S t
|t,r_|j&d }tdd|d   | S d S )Nr   r   r   rn   r_   )tanhrx   ra   )rx   rn   r_   r`   ra   rc   rc   )-r   r   r   r   r   r9   rI   r   r   r]   r/   r   r   r#   r   r   r   r   r   r   r   r3   r   rf  r0   r?   rr   r   r@  r   r$   r   rm   rq   rO   rw   r   r   r7   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   rf  r@   r   r@  r   Ztable10r   cresultsresultrA  rU   rB  rC  rD  r   r   Ztanmr   r1   r1   r2   r     s   




$







"









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   rn   rx   )r   rI   r   r   r   r   )r   r   r   rU   rB  BFr1   r1   r2   r   J  s   &ztan.taylor_termr   c                   sL   | j d |dd t }|r|jr| tj|||dS t j|||dS )Nr   rn   r   r   )r7   r   r   r  r   r   r   r   r;   r   r   r   r   r   r   r1   r2   r   Y  s   
ztan._eval_nseriesc                 K  sF   t |tr!tj}|jd }|||  ||   ||  ||   S d S r  r   r   r1   r1   r2   r   _  s
   

(ztan._eval_rewrite_as_Powc                 C  r  r  r  r	  r1   r1   r2   r
  e  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 NrB   r   r  rn   r1   	rJ   r   r  r   r   r   r6   r   rI   r;   rB   rD   r    r   r  r   denomr1   r1   r2   rC   h  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 r1   nextrJ  r   ZYgr1   r2   rL  |      z)tan._eval_expand_trig.<locals>.<listcomp>rx   rn   r   r`   Tr  dummyreal)r7   rO   r   r   r  rp   r.   ranger-   r   listrR  rM   r~   r  r   r0   r   rH   r   r    )r;   rD   r   r   r   ZTXZtxrs  r   r   ro   r\  r   rP  Pr1   rx  r2   r  q  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   rH  )r;   r   r   r   r   neg_exppos_expr1   r1   r2   r     s   ztan._eval_rewrite_as_expc                 K  s   dt |d  t d|  S r   r   r;   r   r   r1   r1   r2   rI       ztan._eval_rewrite_as_sinc                 K  s   t |td  ddt | S r   r   r  r1   r1   r2   r     r  ztan._eval_rewrite_as_cosc                 K     t |t| S rX   r   r   r1   r1   r2   r     r   ztan._eval_rewrite_as_sincosc                 K  r   r   r   r   r1   r1   r2   r     r   ztan._eval_rewrite_as_cotc                 K  4   t |jtfi |}t|jtfi |}|| S rX   )r   r   r   r   )r;   r   r   sin_in_sec_formcos_in_sec_formr1   r1   r2   r        ztan._eval_rewrite_as_secc                 K  r  rX   )r   r   r   r   )r;   r   r   sin_in_csc_formcos_in_csc_formr1   r1   r2   r     r  ztan._eval_rewrite_as_cscc                 K  2   | j tfi |j tfi |}|trd S |S rX   r   r   r   rL   r;   r   r   r   r1   r1   r2   r         
ztan._eval_rewrite_as_powc                 K  r  rX   r   r   r$   rL   r  r1   r1   r2   r     r  ztan._eval_rewrite_as_sqrtc                 K  s&   ddl m} |tj||tj | S Nr   r   r  r   r   rq   r  r1   r1   r2   r       ztan._eval_rewrite_as_besseljc           
      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    rn   r   r  r  r  r   r   $sympy.functions.elementary.complexesr    r7   r   r  r   rr   r  rs   r   r]   r   r!  r   r   r"  r6   
r;   r   r   r   r   r    r   r$  r   r%  r1   r1   r2   r&    s   

ztan._eval_as_leading_termc                 C     | j d jS r  r)  r	  r1   r1   r2   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>   r7   is_realr   r   rq   rr   r-  r1   r1   r2   _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>   )r7   r  r   r   rq   rr   is_imaginaryr-  r1   r1   r2   r.    s   
ztan._eval_is_finitec                 C  r/  r  r0  r1  r1   r1   r2   r3    r4  ztan._eval_is_zeroc                 C  r  r>   r  r-  r1   r1   r2   r8       
ztan._eval_is_complexrX   r:  r;  rW   )"rY   rZ   r[   r\   r   r   rd  r<  r   r=  r   r   r   r   r
  rC   r  r   rI  r   r   r   r   r   r   r   r  r&  r*  r  r.  r3  r8  r>  r1   r1   r   r2   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+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Z d:d; 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] https://dlmf.nist.gov/4.14
    .. [3] https://functions.wolfram.com/ElementaryFunctions/Cot

    Nc                 C  r_  rX   r   r   r1   r1   r2   r     r   z
cot.periodrx   c                 C  s    |dkrt j| d  S t| |r`  )r   r   r   r   r1   r1   r2   r     r   z	cot.fdiffc                 C  ra  rb  r   r   r1   r1   r2   rd    re  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r/|jrltjS |js}|t }||kr{| |S d S |jr/|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 |j}	|j|	 }
t }|	|v r||	 \}}| |
t | | |
t | }}d ||fv rd S d||  ||  S |tj d tj t }t|t|td  }}t	|ts&t	|ts&|dkr"tjS || S ||kr/| |S |jrQt|\}}|rQt|t }|tju rLt|S t
| S |jrXtjS t	|trc|jd S t	|trr|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   rn   )cothrg  rx   )%r   r   r   r   r   r9   r]   r   r   r/   r   r   r   r3   r   r  r0   r?   rr   r   r@  r   r   rm   rq   rO   rw   r   r   r7   r   r   r   r$   r   r   r   )r   r   r   r   r  r@   r   rh  ri  r@  r   rA  rU   rB  rC  rD  r   r   Zcotmr   r1   r1   r2   r     s   







"









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   rx   rn   )r   r   rI   r   r   r   )r   r   r   rk  rl  r1   r1   r2   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   rm  )r7   r   r   r  r   r   r   r   rn  r1   r1   r2   r     s   
zcot._eval_nseriesc                 C  r  r  r  r	  r1   r1   r2   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 ro  rp  rq  r1   r1   r2   rC     s   "zcot.as_real_imagc                 K  sn   ddl m} tj}t|t|fr||jd jt	fi |}t	| | t	|| }}|||  ||  S r  r   )r;   r   r   r   r   r  r  r1   r1   r2   r     s   zcot._eval_rewrite_as_expc                 K  sH   t |tr"tj}|jd }| ||  ||   ||  ||   S d S r  r   r   r1   r1   r2   r     s
   

*zcot._eval_rewrite_as_Powc                 K  s   t d| dt |d   S r   r  r  r1   r1   r2   rI    r  zcot._eval_rewrite_as_sinc                 K  s   t |t |td  dd S r   r   r  r1   r1   r2   r     r  zcot._eval_rewrite_as_cosc                 K  r  rX   r   r   r   r1   r1   r2   r     r   zcot._eval_rewrite_as_sincosc                 K  r   r   r   r   r1   r1   r2   r     r   zcot._eval_rewrite_as_tanc                 K  r  rX   )r   r   r   r   )r;   r   r   r  r  r1   r1   r2   r     r  zcot._eval_rewrite_as_secc                 K  r  rX   )r   r   r   r   )r;   r   r   r  r  r1   r1   r2   r     r  zcot._eval_rewrite_as_cscc                 K  r  rX   r  r  r1   r1   r2   r     r  zcot._eval_rewrite_as_powc                 K  r  rX   r  r  r1   r1   r2   r     r  zcot._eval_rewrite_as_sqrtc                 K  s&   ddl m} |tj ||tj| S r  r  r  r1   r1   r2   r    r  zcot._eval_rewrite_as_besseljc           
      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  rn   rx   r  r  r  r  r  r1   r1   r2   r&    s   

zcot._eval_as_leading_termc                 C  r  r  r)  r	  r1   r1   r2   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   rs  c                   rt  r1   ru  rw  rx  r1   r2   rL    ry  z)cot._eval_expand_trig.<locals>.<listcomp>r   rn   r`   rx   Tr  rz  r{  )r7   rO   r   r   r  rp   r.   r}  r-   r   r~  rR  rM   r~   r  r   r0   r   rH   r    r   )r;   rD   r   r   r   ZCXr   rs  r   r   ro   r\  r   rP  r  r1   rx  r2   r    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>   )r7   r  r   rr   r  r-  r1   r1   r2   r.    s   
zcot._eval_is_finitec                 C  *   | j d }|jr|t jdu rdS d S d S r>   r7   r  r   rr   r-  r1   r1   r2   r       
zcot._eval_is_realc                 C  r  r>   r  r-  r1   r1   r2   r8    r  zcot._eval_is_complexc                 C  s0   t | jd \}}|r|jr|tj jS d S d S r  r]  )r;   r2  Zpimultr1   r1   r2   r3    r^  zcot._eval_is_zeroc                 C  s6   | j d }|||}||kr|t jrtjS t|S r  )r7   r   r   rr   r   r]   r   )r;   oldnewr   Zargnewr1   r1   r2   
_eval_subs  s
   
zcot._eval_subsrX   r:  r;  rW   )"rY   rZ   r[   r\   r   r   rd  r<  r   r=  r   r   r   r
  rC   r   r   rI  r   r   r   r   r   r   r   r  r&  r*  r  r.  r  r8  r3  r  r1   r1   r1   r2   r     s@    
%


h

	r   c                   @  s   e Zd ZU dZdZejfZdZde	d< dZ
de	d< edd Zdd	 Zd
d Zdd Zdd Zd1d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d2d$d%Zd&d' Zd(d) Zd*d+ Zd,d- Zd3d/d0ZdS )4ReciprocalTrigonometricFunctionz@Base class for reciprocal functions of trigonometric functions. Nr   _is_even_is_oddc                 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 )Nrn   rx   rd  r   c                 s      | ]}t |tV  qd S rX   )r/   r   rw  r1   r1   r2   rN  P      z7ReciprocalTrigonometricFunction.eval.<locals>.<genexpr>c                 s  r  rX   )r/   r   rw  r1   r1   r2   rN  R  r  )r   r  r  r?   rr   r   r@  r   r   hasattrrd  r7   _reciprocal_ofr   anyr   r   r   )r   r   r@   r@  r   r   tr1   r1   r2   r   2  s@   



z$ReciprocalTrigonometricFunction.evalc                 O  s$   |  | jd }t|||i |S r  )r  r7   getattr)r;   method_namer7   r   or1   r1   r2   _call_reciprocalW  s   z0ReciprocalTrigonometricFunction._call_reciprocalc                 O  s,   | j |g|R i |}|d urd| S |S r   )r  )r;   r  r7   r   r  r1   r1   r2   _calculate_reciprocal\  s   z5ReciprocalTrigonometricFunction._calculate_reciprocalc                 C  s2   |  ||}|d ur|| |krd| S d S d S r   )r  r  )r;   r  r   r  r1   r1   r2   _rewrite_reciprocalb  s   z3ReciprocalTrigonometricFunction._rewrite_reciprocalc                 C  s   t | jd }| ||S r  )r	   r7   r  r   )r;   rQ   rR   r1   r1   r2   rV   i  s   z'ReciprocalTrigonometricFunction._periodrx   c                 C  s   |  d| | d  S )Nr   rn   r  r   r1   r1   r2   r   m     z%ReciprocalTrigonometricFunction.fdiffc                 K     |  d|S )Nr   r  r   r1   r1   r2   r   p  r   z4ReciprocalTrigonometricFunction._eval_rewrite_as_expc                 K  r  )Nr   r  r   r1   r1   r2   r   s  r   z4ReciprocalTrigonometricFunction._eval_rewrite_as_Powc                 K  r  )NrI  r  r   r1   r1   r2   rI  v  r   z4ReciprocalTrigonometricFunction._eval_rewrite_as_sinc                 K  r  )Nr   r  r   r1   r1   r2   r   y  r   z4ReciprocalTrigonometricFunction._eval_rewrite_as_cosc                 K  r  )Nr   r  r   r1   r1   r2   r   |  r   z4ReciprocalTrigonometricFunction._eval_rewrite_as_tanc                 K  r  )Nr   r  r   r1   r1   r2   r     r   z4ReciprocalTrigonometricFunction._eval_rewrite_as_powc                 K  r  )Nr   r  r   r1   r1   r2   r     r   z5ReciprocalTrigonometricFunction._eval_rewrite_as_sqrtc                 C  r  r  r  r	  r1   r1   r2   r
    r   z/ReciprocalTrigonometricFunction._eval_conjugateTc                 K  s"   d|  | jd  j|fi |S r   )r  r7   rC   )r;   rB   rD   r1   r1   r2   rC     s   z,ReciprocalTrigonometricFunction.as_real_imagc                 K  s   | j di |S )Nr  )r  r  )r;   rD   r1   r1   r2   r    r   z1ReciprocalTrigonometricFunction._eval_expand_trigc                 C  s   |  | jd  S r  )r  r7   r*  r	  r1   r1   r2   r*    r   z6ReciprocalTrigonometricFunction._eval_is_extended_realc                 C  s    d|  | jd  j|||dS )Nrx   r   r   r   )r  r7   r&  )r;   r   r   r   r1   r1   r2   r&    r   z5ReciprocalTrigonometricFunction._eval_as_leading_termc                 C  s   d|  | jd  jS r   )r  r7   r"  r	  r1   r1   r2   r.    r  z/ReciprocalTrigonometricFunction._eval_is_finiter   c                 C  s   d|  | jd  |||S r   )r  r7   r   r;   r   r   r   r   r1   r1   r2   r     s   z-ReciprocalTrigonometricFunction._eval_nseriesr:  rW   r;  ) rY   rZ   r[   r\   r  r   r]   r^   r  __annotations__r  r<  r   r  r  r  rV   r   r   r   rI  r   r   r   r   r
  rC   r  r*  r&  r.  r   r1   r1   r1   r2   r  $  s6   
 
$

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dd Zeedd Z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] https://dlmf.nist.gov/4.14
    .. [3] https://functions.wolfram.com/ElementaryFunctions/Sec

    TNc                 C  
   |  |S rX   rV   r   r1   r1   r2   r        
z
sec.periodc                 K  s    t |d d }|d |d  S r   r  )r;   r   r   Zcot_half_sqr1   r1   r2   r     s   zsec._eval_rewrite_as_cotc                 K  r   r   r   r   r1   r1   r2   r     r   zsec._eval_rewrite_as_cosc                 K     t |t|t |  S rX   r   r   r1   r1   r2   r     r   zsec._eval_rewrite_as_sincosc                 K  rX  r   )r   r   r   r   r1   r1   r2   rI    rY  zsec._eval_rewrite_as_sinc                 K  rX  r   )r   r   r   r   r1   r1   r2   r     rY  zsec._eval_rewrite_as_tanc                 K     t td | ddS r   )r   r   r   r1   r1   r2   r     r   zsec._eval_rewrite_as_cscrx   c                 C  s.   |dkrt | jd t| jd  S t| |r   )r   r7   r   r   r   r1   r1   r2   r     s   
z	sec.fdiffc                 K  sB   ddl m} tdtt| td |tj |  t|dfdS )Nr   r   rx   rn   rZ  r[  r  r1   r1   r2   r    s
   .zsec._eval_rewrite_as_besseljc                 C  r  r>   )r7   r7  r   r   rq   rr   r-  r1   r1   r2   r8    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 rj  )r   rI   r   r   r   r   r   r   r   kr1   r1   r2   r     s
   .zsec.taylor_termc           
      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  rn   r  r  r  r   r   r  r    r7   r   r  r   rr   r  r   r   r]   r   r!  r   r   r"  r6   r  r1   r1   r2   r&    s   

zsec._eval_as_leading_termrX   r:  )rY   rZ   r[   r\   r   r  r  r   r   r   r   rI  r   r   r   r  r8  r=  r   r   r&  r1   r1   r1   r2   r     s$    #


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 ZdddZdd Zeedd Z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] https://dlmf.nist.gov/4.14
    .. [3] https://functions.wolfram.com/ElementaryFunctions/Csc

    TNc                 C  r  rX   r  r   r1   r1   r2   r   /  r  z
csc.periodc                 K  r   r   r  r   r1   r1   r2   rI  2  r   zcsc._eval_rewrite_as_sinc                 K  r  rX   r  r   r1   r1   r2   r   5  r   zcsc._eval_rewrite_as_sincosc                 K  s    t |d }d|d  d|  S r   r  r   r1   r1   r2   r   8  s   zcsc._eval_rewrite_as_cotc                 K  rX  r   )r   r   r   r   r1   r1   r2   r   <  rY  zcsc._eval_rewrite_as_cosc                 K  r  r   r   r   r1   r1   r2   r   ?  r   zcsc._eval_rewrite_as_secc                 K  rX  r   )r   r   r   r   r1   r1   r2   r   B  rY  zcsc._eval_rewrite_as_tanc                 K  s0   ddl m} tdt dt||tj|   S )Nr   r   rn   rx   r  r  r1   r1   r2   r  E  s   $zcsc._eval_rewrite_as_besseljrx   c                 C  s0   |dkrt | jd  t| jd  S t| |r   )r   r7   r   r   r   r1   r1   r2   r   I  s   
z	csc.fdiffc                 C  r  r>   r  r-  r1   r1   r2   r8  O  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   rI   r   r   r   r  r1   r1   r2   r   T  s   $

zcsc.taylor_termc           
      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  r1   r1   r2   r&  a  s   

zcsc._eval_as_leading_termrX   r:  )rY   rZ   r[   r\   r   r  r  r   rI  r   r   r   r   r   r  r   r8  r=  r   r   r&  r1   r1   r1   r2   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

    rx   c                 C  s8   | j d }|dkrt|| t||d   S t| |r  )r7   r   r   r   )r;   r   r   r1   r1   r2   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   )r9   r   r}   r   r   r   rI   r   r]   r   r?   rr   r
   r   rq   )r   r   r@   r1   r1   r2   r     s*   




z	sinc.evalr   c                 C  s    | j d }t|| |||S r  )r7   r   r   r  r1   r1   r2   r     s   
zsinc._eval_nseriesc                 K  s   ddl m} |d|S )Nr   )jn)r  r  )r;   r   r   r  r1   r1   r2   _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 rX   )r'   r   r   r   rI   r}   truer   r1   r1   r2   rI       &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)r7   is_infiniterw   r9   r   rr   Z
is_nonzeror   r1  r1   r1   r2   r3    s   zsinc._eval_is_zeroc                 C  r5  r(  )r7   rG   r  r	  r1   r1   r2   r    s   zsinc._eval_is_realNr:  r;  )rY   rZ   r[   r\   r   r]   r^   r   r<  r   r   r  rI  r3  r  r.  r1   r1   r1   r2   r   q  s    4


	r   c                   @  s^   e Zd ZU dZejejejejfZ	de
d< eedd Zeedd Zeedd	 Zd
S )InverseTrigonometricFunctionz/Base class for inverse trigonometric functions.ztuple[Expr, ...]r^   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_   rn   r`   rx   ra   rd   rb   rc   ri   )r$   r   r   r   rq   r1   r1   r1   r2   _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_   rb   rx   rn   rd   ra   rc   ri   r   r$   r   r   r1   r1   r1   r2   _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 )Nrn   r_   r`   ra   rx   rd   rb   rc   ri   r  r1   r1   r1   r2   _acsc_table$  sF   ""(	
z(InverseTrigonometricFunction._acsc_tableN)rY   rZ   r[   r\   r   r}   r   rI   r]   r^   r  r=  r   r  r  r  r1   r1   r1   r2   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 Zd% f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  ZS )&r   ad  
    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] https://dlmf.nist.gov/4.23
    .. [3] https://functions.wolfram.com/ElementaryFunctions/ArcSin

    rx   c                 C  s,   |dkrdt d| jd d   S t| |Nrx   r   rn   r$   r7   r   r   r1   r1   r2   r   i     
z
asin.fdiffc                 C  2   | j | j }|j | j kr|jd jrdS d S |jS r5   r6   r7   r8   r:   r1   r1   r2   r=   o     zasin._eval_is_rationalc                 C     |   o	| jd jS r  )r*  r7   is_positiver	  r1   r1   r2   _eval_is_positivew  r   zasin._eval_is_positivec                 C  r  r  )r*  r7   r!  r	  r1   r1   r2   _eval_is_negativez  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 )Nrn   r   )asinh)r   r   r   r   r   r0   r9   rI   r}   r   r   r]   r   	is_numberr  r3   r   r  r/   r   r7   is_comparabler   r   )r   r   
asin_tabler   r  angr1   r1   r2   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   rI   r   r   r   rq   r   r   r   r   r   r  Rrl  r1   r1   r2   r     s   $zasin.taylor_termc                 C  s   | j d }||d }|tju r| ||S |jr"||S |tj tjtj	fv r:| 
tj|||d S d|d  jry|||rH|nd}t|jr\|jr[t | | S nt|jrl|jrkt| | S n| 
tj|||d S | |S Nr   r  rx   rn   )r7   r   r  r   r   r6   r  r9   r}   r]   r   r!   r&  rH   r!  r  r   r   r  r;   r   r   r   r   r$  ndirr1   r1   r2   r&    s(   





zasin._eval_as_leading_termr   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|d  jrJ| jd ||r|nd}t|jr.|jr,t | S |S t|jr>|jr<t| S |S | t	j||||d	S |S 
Nr   Or  TZpositivern   rx   rm  r  )sympy.series.orderr  r7   r   r   r}   r   r   r   r!   nseriesr  is_meromorphicr   r$   r   removeOrH   powsimpr   r   r]   r!  r  r   r  r;   r   r   r   r   r  arg0r  ZserZarg1rR   rS   Zres1resr  r   r1   r2   r     sN   
&
$&
&
&&
zasin._eval_nseriesc                 K     t d t| S r   r   r   r  r1   r1   r2   _eval_rewrite_as_acos	  r   zasin._eval_rewrite_as_acosc                 K  s    dt |dtd|d     S r   )r   r$   r  r1   r1   r2   _eval_rewrite_as_atan	  r   zasin._eval_rewrite_as_atanc                 K  s&   t j tt j| td|d    S r`  r   r0   r!   r$   r  r1   r1   r2   _eval_rewrite_as_log	  r  zasin._eval_rewrite_as_logc                 K  s    dt dtd|d   |  S r   )r   r$   r   r1   r1   r2   _eval_rewrite_as_acot	  r   zasin._eval_rewrite_as_acotc                 K     t d td|  S r   r   r   r   r1   r1   r2   _eval_rewrite_as_asec	  r   zasin._eval_rewrite_as_asecc                 K     t d| S r   )r   r   r1   r1   r2   _eval_rewrite_as_acsc	  r   zasin._eval_rewrite_as_acscc                 C     | j d }|jodt| jS Nr   rx   r7   rG   rN   is_nonnegativer;   r   r1   r1   r2   r*  	     
zasin._eval_is_extended_realc                 C  ra  rb  r  r   r1   r1   r2   rd   	  re  zasin.inverser:  r;  )rY   rZ   r[   r\   r   r=   r  r  r<  r   r=  r   r   r&  r   r  r  r  _eval_rewrite_as_tractabler  r   r  r*  rd  r>  r1   r1   r   r2   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 Zdd Zdd Zd% f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  ZS )&r   a  
    The inverse cosine function.

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

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

    ``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] https://dlmf.nist.gov/4.23
    .. [3] https://functions.wolfram.com/ElementaryFunctions/ArcCos

    rx   c                 C  s,   |dkrdt d| jd d   S t| |Nrx   r   r   rn   r  r   r1   r1   r2   r   S	  r  z
acos.fdiffc                 C  r  r5   r  r:   r1   r1   r2   r=   Y	  r  zacos._eval_is_rationalc                 C  s  |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 |jrt|jdkr|jd dkr|jd }d}n|}d}t|tr|jd }|jr|rt| }|dt ; }|tkrdt | }|S t|tr|jd }|jr|rtd t| S td t| S d S d S Nrn   r   r   rx   TF)r   r   r   r   r0   r   r9   r   r}   rI   r   r]   r  r  r3   r   rM   r   r7   r/   r   r  r   )r   r   r  r   r   minusr  r1   r1   r2   r   a	  s\   






"




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   rI   r   r   r   rq   r   r  r1   r1   r2   r   	  s   $zacos.taylor_termc                 C  s  | j d }||d }|tju r| ||S |dkr,tdttj| | S |tj tj	fv r@| 
tj|||dS d|d  jr|||rN|nd}t|jrc|jrbdt | | S nt|jrr|jrq| | S n| 
tj|||d S | |S Nr   rx   rn   r  )r7   r   r  r   r   r6   r  r$   r}   r]   r   r!   r&  r!  r  r   r   r  rH   r  r1   r1   r2   r&  	  s(   




zacos._eval_as_leading_termc                 C  r  r  r  r  r1   r1   r2   r*  	  r  zacos._eval_is_extended_realc                 C  s   |   S rX   )r*  r	  r1   r1   r2   _eval_is_nonnegative	  s   zacos._eval_is_nonnegativer   c                   s  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|d  jrB| jd ||r|nd}t|jr'|jr%dt | S |S t|jr6|jr4| S |S | t	j||||d	S |S r  )r  r  r7   r   r   r}   r   r   r   r!   r  r  r  r$   r   r  rH   r  r   r   r   r]   r!  r  r   r  r  r   r1   r2   r   	  sN   
&
&
&
 &
zacos._eval_nseriesc                 K  s,   t d tjttj| td|d     S r   r   r   r0   r!   r$   r  r1   r1   r2   r  	  s   
zacos._eval_rewrite_as_logc                 K  r  r   r   r   r  r1   r1   r2   _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  r1   r1   r2   r  	     8zacos._eval_rewrite_as_atanc                 C  ra  rb  r  r   r1   r1   r2   rd   
  re  zacos.inversec                 K  s(   t d dtdtd|d   |   S r   )r   r   r$   r   r1   r1   r2   r  
     (zacos._eval_rewrite_as_acotc                 K  r  r   )r   r   r1   r1   r2   r   	
  r   zacos._eval_rewrite_as_asecc                 K  r  r   r   r   r   r1   r1   r2   r  
  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   Frx   )r7   r6   r  rG   r  Zis_nonpositive)r;   rP  rr1   r1   r2   r
  
  s   

zacos._eval_conjugater:  r;  )rY   rZ   r[   r\   r   r=   r<  r   r=  r   r   r&  r*  r  r   r  r	  r  r  rd  r  r   r  r
  r>  r1   r1   r   r2   r   '	  s,    
+
6,
r   c                      s   e Zd ZU dZd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 Zd+ f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] https://dlmf.nist.gov/4.23
    .. [3] https://functions.wolfram.com/ElementaryFunctions/ArcTan

    ztuple[Expr]r7   rx   c                 C  s(   |dkrdd| j d d   S t| |r  r7   r   r   r1   r1   r2   r   C
     
z
atan.fdiffc                 C  r  r5   r  r:   r1   r1   r2   r=   I
  r  zatan._eval_is_rationalc                 C  r  r  )r7   Zis_extended_positiver	  r1   r1   r2   r  Q
  r   zatan._eval_is_positivec                 C  r  r  )r7   Zis_extended_nonnegativer	  r1   r1   r2   r  T
  r   zatan._eval_is_nonnegativec                 C  r  r  )r7   r9   r	  r1   r1   r2   r3  W
  r   zatan._eval_is_zeroc                 C  r  r  r)  r	  r1   r1   r2   r  Z
  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 )Nrn   r`   r   r   )atanh)r   r   r   r   r   r   r9   rI   r}   r   r]   r   r   r   r  r  r3   r   r  r0   r/   r   r7   r  r   r   )r   r   r   
atan_tabler   r  r  r1   r1   r2   r   ]
  sX   











z	atan.evalc                 G  s@   | dk s
| d dkrt jS t|}t j| d d  ||   |  S rj  )r   rI   r   r   r   r   r   r1   r1   r2   r   
  s   zatan.taylor_termc                 C  s  | j d }||d }|tju r| ||S |jr"||S |tj tjtj	fv r:| 
tj|||d S d|d  jr||||rH|nd}t|jr]t|jr\| |t S nt|jrot|jrn| |t S n| 
tj|||d S | |S r  )r7   r   r  r   r   r6   r  r9   r0   r]   r   r!   r&  rH   r!  r  r    r   r  r   r  r1   r1   r2   r&  
  s(   







zatan._eval_as_leading_termr   c                   s   | j d |d}|tjtjtj fv r | tj||||dS t j|||d}| j d 	||r3|nd}|tj
u rGt|dkrE|t S |S d|d  jrzt|jr^t|jr\|t S |S t|jrnt|jrl|t S |S | tj||||dS |S Nr   r  rm  rx   rn   )r7   r   r   r0   r   r   r!   r   r   r  r]   r    r   r!  r   r  r;   r   r   r   r   r  r  r  r   r1   r2   r   
  s(   




zatan._eval_nseriesc                 K  s2   t jd tt jt j|  tt jt j|    S r   )r   r0   r!   r}   r  r1   r1   r2   r  
  s   zatan._eval_rewrite_as_logc                   sJ   |d t jt jfv rtd td| jd   |||S t ||||S rj  )	r   r   r   r   r   r7   r   r   _eval_aseriesr;   r   Zargs0r   r   r   r1   r2   r  
  s   $zatan._eval_aseriesc                 C  ra  rb  r  r   r1   r1   r2   rd  
  re  zatan.inversec                 K  s0   t |d | td tdt d|d     S r   r$   r   r   r   r1   r1   r2   r  
     0zatan._eval_rewrite_as_asinc                 K  s(   t |d | tdt d|d    S r   r$   r   r   r1   r1   r2   r  
  r  zatan._eval_rewrite_as_acosc                 K  r  r   r  r   r1   r1   r2   r  
  r   zatan._eval_rewrite_as_acotc                 K  s$   t |d | tt d|d   S r   r$   r   r   r1   r1   r2   r   
  s   $zatan._eval_rewrite_as_asecc                 K  s,   t |d | td tt d|d    S r   r$   r   r   r   r1   r1   r2   r  
     ,zatan._eval_rewrite_as_acscr:  r;  )rY   rZ   r[   r\   r  r   r0   r^   r   r=   r  r  r3  r  r<  r   r=  r   r   r&  r   r  r	  r  rd  r  r  r  r   r  r>  r1   r1   r   r2   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 Zd' f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] https://dlmf.nist.gov/4.23
    .. [2] https://functions.wolfram.com/ElementaryFunctions/ArcCot

    rx   c                 C  s(   |dkrdd| j d d   S t| |r
  r  r   r1   r1   r2   r     r  z
acot.fdiffc                 C  r  r5   r  r:   r1   r1   r2   r=      r  zacot._eval_is_rationalc                 C  r  r  )r7   r  r	  r1   r1   r2   r  (  r   zacot._eval_is_positivec                 C  r  r  )r7   r!  r	  r1   r1   r2   r  +  r   zacot._eval_is_negativec                 C  r  r  r)  r	  r1   r1   r2   r*  .  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 )Nrn   r`   r   )acoth)r   r   r   r   rI   r   r9   r   r}   r   r]   r   r  r  r3   r   r&  r0   rq   r/   r   r7   r  r   r   )r   r   r  r  r   r&  r1   r1   r2   r   1  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 rj  )r   r   rI   r   r   r  r1   r1   r2   r   g  s   zacot.taylor_termc                 C  s  | j d }||d }|tju r| ||S |tju r&d| |S |tj tjtj	fv r>| 
tj|||d S |jrd|d  jr|||rO|nd}t|jrdt|jrc| |t S nt|jrvt|jru| |t S n| 
tj|||d S | |S )Nr   rx   r  rn   )r7   r   r  r   r   r6   r  r]   r0   rI   r   r!   r&  rH   r  r  r  r    r   r   r!  r  r1   r1   r2   r&  r  s(   







zacot._eval_as_leading_termr   c                   s  | j d |d}|tjtjtj fv r | tj||||dS t j|||d}|tj	u r0|S | j d 
||r:|nd}|jrLt|dk rJ|t S |S |jrd|d  jrt|jrft|jrd|t S |S t|jrvt|jrt|t S |S | tj||||dS |S r  )r7   r   r   r0   r   r   r!   r   r   r]   r  r9   r    r   r  r  r   r!  r  r   r1   r2   r     s,   




zacot._eval_nseriesc                   sB   |d t jt jfv rtd| jd  |||S t ||||S r  )r   r   r   r   r7   r   r   r  r  r   r1   r2   r    s   zacot._eval_aseriesc                 K  s.   t jd tdt j|  tdt j|    S r   )r   r0   r!   r  r1   r1   r2   r    s   zacot._eval_rewrite_as_logc                 C  ra  rb  r  r   r1   r1   r2   rd    re  zacot.inversec                 K  s@   |t d|d   td tt |d  t |d  d    S r`  r   r   r1   r1   r2   r    s   *zacot._eval_rewrite_as_asinc                 K  s8   |t d|d   tt |d  t |d  d   S r`  r"  r   r1   r1   r2   r    r  zacot._eval_rewrite_as_acosc                 K  r  r   rc  r   r1   r1   r2   r    r   zacot._eval_rewrite_as_atanc                 K  s0   |t d|d   tt d|d  |d   S r`  r#  r   r1   r1   r2   r     r!  zacot._eval_rewrite_as_asecc                 K  s8   |t d|d   td tt d|d  |d    S r`  r$  r   r1   r1   r2   r    r  zacot._eval_rewrite_as_acscr:  r;  )rY   rZ   r[   r\   r   r0   r^   r   r=   r  r  r*  r<  r   r=  r   r   r&  r   r  r  r	  rd  r  r  r  r   r  r>  r1   r1   r   r2   r   
  s0    *

5	
r   c                      s   e Zd ZdZedd ZdddZdddZee	d	d
 Z
dd Zd f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  Z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] https://dlmf.nist.gov/4.23
    .. [3] https://functions.wolfram.com/ElementaryFunctions/ArcSec
    .. [4] https://reference.wolfram.com/language/ref/ArcSec.html

    c                 C  sv  |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rVtd S |jrot|jdkro|jd dkro|jd }d}n|}d}t|tr|jd }|jr|rt| }|dt ; }|tkrdt | }|S t|tr|jd }|jr|rtd t|  td t| S d S d S r  )r9   r   r]   r   r   r}   rI   r   r   r   r   r  r  r  rM   r   r7   r/   r   r  r   r   )r   r   
acsc_tabler   r  r  r1   r1   r2   r     sR   



"




z	asec.evalrx   c                 C  s>   |dkrd| j d d tdd| j d d     S t| |r  r7   r$   r   r   r1   r1   r2   r   4     ,
z
asec.fdiffc                 C  ra  rb  rW  r   r1   r1   r2   rd  :  re  zasec.inversec                 G  s   | dkrt jtd|  S | dk s| d dkrt jS t|}t|dkrB| dkrB|d }|| d | d   |d  d| d d   S | d }tt j||  }t||  d |  d }t j | | ||   d S Nr   rn   rx   r   r`   )	r   r0   r!   rI   r   r   r   rq   r   r  r1   r1   r2   r   @  s   ,zasec.taylor_termc                 C  s  | j d }||d }|tju r| ||S |dkr,tdt|tj | S |tj tj	fv r@| 
tj|||dS |jrd|d  jr|||rQ|nd}t|jrc|jrb| | S nt|jru|jrtdt | | S n| 
tj|||d S | |S r  )r7   r   r  r   r   r6   r  r$   r}   rI   r   r!   r&  r  r  r  r   r!  r   rH   r  r1   r1   r2   r&  R  s(   




zasec._eval_as_leading_termr   c                   s6  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 |jrd|d  jr| jd ||r|nd}t|jr|jr| S |S t|jr|jrdt | S |S | t	j||||d	S |S 
Nr   r  r  Tr  rn   rm  rx   r  )r  r  r7   r   r   r}   r   r   r   r!   r  r   r  r$   r   r  rH   r  r   r]   r  r  r  r   r!  r   r  r   r1   r2   r   i  sF   
&
&
&
&

zasec._eval_nseriesc                 C  s2   | j d }|jdu rdS t|d j| d jfS r  )r7   rG   r   r  r  r1   r1   r2   r*    s   

zasec._eval_is_extended_realc              	   K  s0   t d tjttj| tdd|d      S r   r  r   r1   r1   r2   r    r!  zasec._eval_rewrite_as_logc                 K  r  r   r  r   r1   r1   r2   r    r   zasec._eval_rewrite_as_asinc                 K  r  r   )r   r   r1   r1   r2   r    r   zasec._eval_rewrite_as_acosc                 K  s8   t |d | }td d|  |tt |d d   S r   r$   r   r   r;   r   r   Zsx2xr1   r1   r2   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-  r1   r1   r2   r    s   ,zasec._eval_rewrite_as_acotc                 K  r  r   r  r   r1   r1   r2   r    r   zasec._eval_rewrite_as_acscr:  r;  )rY   rZ   r[   r\   r<  r   r   rd  r=  r   r   r&  r   r*  r  r	  r  r  r  r  r  r>  r1   r1   r   r2   r     s&    ;

0
(r   c                      s   e Zd ZdZedd ZdddZdddZee	d	d
 Z
dd Zd fdd	Zdd ZeZdd Zdd Zdd Zdd Zdd Z  ZS )r   aV  
    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] https://dlmf.nist.gov/4.23
    .. [3] https://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 )Nrn   r   )r9   r   r]   r   r   r}   r   r   r   r   rI   r   r  r  r  r/   r   r7   r  r   r   )r   r   r'  r  r1   r1   r2   r     sH   








z	acsc.evalrx   c                 C  s>   |dkrd| j d d tdd| j d d     S t| |r
  r(  r   r1   r1   r2   r     r)  z
acsc.fdiffc                 C  ra  rb  r   r   r1   r1   r2   rd    re  zacsc.inversec                 G  s   | dkrt d tjtd  tjt|  S | dk s | d dkr#tjS t|}t|dkrK| dkrK|d }|| d | d   |d  d| d d   S | d }ttj||  }t	||  d |  d }tj| | ||   d S r*  )
r   r   r0   r!   rI   r   r   r   rq   r   r  r1   r1   r2   r     s   $,zacsc.taylor_termc                 C  s
  | j d }||d }|tju r| ||S |tj tjtjfv r2| 	t
j|||d S |tju r>d| |S |jrd|d  jr|||rO|nd}t|jrb|jrat| | S nt|jrs|jrrt | | S n| 	t
j|||d S | |S r  )r7   r   r  r   r   r6   r  r}   rI   r   r!   r&  rH   r]   r  r  r  r   r!  r   r  r1   r1   r2   r&  $  s(   





zacsc._eval_as_leading_termr   c                   s6  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 |jrd|d  jr| jd ||r|nd}t|jr|jrt| S |S t|jr|jrt | S |S | t	j||||d	S |S r+  )r  r  r7   r   r   r}   r   r   r   r!   r  r   r  r$   r   r  rH   r  r   r]   r  r  r  r   r!  r   r  r   r1   r2   r   ;  sF   
&
&
&
&


zacsc._eval_nseriesc                 K  s*   t j tt j| tdd|d     S r`  r  r   r1   r1   r2   r  c  s   *zacsc._eval_rewrite_as_logc                 K  r  r   )r   r   r1   r1   r2   r  h  r   zacsc._eval_rewrite_as_asinc                 K  r  r   r  r   r1   r1   r2   r  k  r   zacsc._eval_rewrite_as_acosc                 K  s,   t |d | td tt |d d   S r   r,  r  r1   r1   r2   r  n  r%  zacsc._eval_rewrite_as_atanc                 K  s0   t |d | td tdt |d d    S r   r.  r   r1   r1   r2   r  q  r!  zacsc._eval_rewrite_as_acotc                 K  r  r   r  r   r1   r1   r2   r   t  r   zacsc._eval_rewrite_as_asecr:  r;  )rY   rZ   r[   r\   r<  r   r   rd  r=  r   r   r&  r   r  r	  r  r  r  r  r   r>  r1   r1   r   r2   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 returns 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] https://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   )	Heavisidern   T)Z'sympy.functions.special.delta_functionsr/  r   r   r9   r   r    r   rI   r  r  r   rG   r  r   r!  r  r   Zis_extended_nonzeror}   r'   r   r0   r!   r$   )r   r   r   r/  r1   r1   r2   r     sN   


 z
atan2.evalc                 K  s.   t j t|t j|  t|d |d    S r   r  r;   r   r   r   r1   r1   r2   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 )Nrn   r   T)r'   r   r$   r   r   r    r   r   r0  r1   r1   r2   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   )rG   arg_fr   r0   r$   r!   rN   )r;   r   r   r   r   r   r1   r1   r2   _eval_rewrite_as_arg  s
   .zatan2._eval_rewrite_as_argc                 C  s   | j d jo| j d jS r  r)  r	  r1   r1   r2   r*    r   zatan2._eval_is_extended_realc                 C  s    |  | jd  | jd  S r  r  r	  r1   r1   r2   r
    r   zatan2._eval_conjugatec                 C  sN   | j \}}|dkr||d |d   S |dkr"| |d |d   S t| |r`  r  )r;   r   r   r   r1   r1   r2   r     s   

zatan2.fdiffc                   s*   | j \}}|jr|jrt |S d S d S rX   )r7   rG   r   _eval_evalf)r;   precr   r   r   r1   r2   r3  (  s   
zatan2._eval_evalf)rY   rZ   r[   r\   r<  r   r  r  r2  r*  r
  r   r3  r>  r1   r1   r   r2   r   x  s    f
'r   Nr:  )r   r   ry   rz   r{   r|   )[
__future__r   Zsympy.core.addr   Zsympy.core.cacher   Zsympy.core.exprr   Zsympy.core.functionr   r   r   r	   Zsympy.core.logicr
   r   r   r   Zsympy.core.modr   Zsympy.core.numbersr   r   r   r   r   Zsympy.core.relationalr   r   Zsympy.core.singletonr   Zsympy.core.symbolr   r   Zsympy.core.sympifyr   Z(sympy.functions.combinatorial.factorialsr   r   Z%sympy.functions.combinatorial.numbersr   r   r  r   r1  r   r    Z&sympy.functions.elementary.exponentialr!   r"   Z#sympy.functions.elementary.integersr#   Z(sympy.functions.elementary.miscellaneousr$   r%   r&   Z$sympy.functions.elementary.piecewiser'   Z1sympy.functions.elementary._trigonometric_specialr(   r)   r*   Zsympy.logic.boolalgr+   Zsympy.ntheoryr,   Zsympy.polys.specialpolysr-   Zsympy.utilities.iterablesr.   r3   r4   rm   rw   r?   r   r   r   r   r  r   r   r   r  r   r   r   r   r   r   r   r1   r1   r1   r2   <module>   sx    D
%K  8  l  V  ?xli|Q j r V [ h K