U
    9%e.                    @   s  d dl mZmZ d dlmZ d dlmZ d dl	m
Z
 d dlmZ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/m0Z0m1Z1 d dl2m3Z3m4Z4 d dl5m6Z6 d dl7m8Z8m9Z9m:Z: d dl;m<Z< d dl=m>Z>m?Z?m@Z@ d dlAmBZB d dlCmDZD d dlEmFZF d dlGmHZH dd ZIG dd deZJedd ZKdd  ZLdFe
eMee
d"f d#d$d%ZNG d&d' d'eJZOG d(d) d)eJZPG d*d+ d+eJZQG d,d- d-eJZRG d.d/ d/eJZSG d0d1 d1eSZTG d2d3 d3eSZUG d4d5 d5eZVG d6d7 d7eZWG d8d9 d9eWZXG d:d; d;eWZYG d<d= d=eWZZG d>d? d?eWZ[G d@dA dAeWZ\G dBdC dCeWZ]G dDdE dEeWZ^d"S )G    )TupleUnion)Add)cacheit)Expr)Function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 dS )z; Helper to extract symbolic coefficient for imaginary unit N)
isinstancer   Zas_coefficientr   ImaginaryUnitr    r3   g/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/sympy/functions/elementary/trigonometric.py_imaginary_unit_as_coefficient!   s    
r5   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   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sr3   r3   r4   _eval_is_rational3   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 k	r`|jr`dS n|jS d S Nr   FT)r8   r9   r   r;   Zis_algebraic	_pi_coeffr:   )r=   r>   pi_coeffr3   r3   r4   _eval_is_algebraic;   s    z(TrigonometricFunction._eval_is_algebraicc                 K   s&   | j f d|i|\}}||tj  S )Ndeep)as_real_imagr   r1   )r=   rD   hintsZre_partZim_partr3   r3   r4   _eval_expand_complexF   s    z*TrigonometricFunction._eval_expand_complexc                 K   s~   | j d jrB|r2d|d< | j d j|f|tjfS | j d tjfS |rd| j d j|f| \}}n| j d  \}}||fS )Nr   Fcomplex)r9   is_extended_realexpandr   ZerorE   )r=   rD   rF   r!   r    r3   r3   r4   _as_real_imagJ   s    z#TrigonometricFunction._as_real_imagNc                 C   s   t | jd }|d kr$t|jd }||s4tjS ||kr@|S ||jk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
   r9   tupleZfree_symbolshasr   rK   is_MulZas_independentabsis_AddNotImplementedError)r=   Zgeneral_periodsymbolfghar3   r3   r4   _periodW   s$    

zTrigonometricFunction._period)T)T)N)__name__
__module____qualname____doc__Z
unbranchedr   ComplexInfinity_singularitiesr?   rC   rG   rL   rX   r3   r3   r3   r4   r6   -   s   

r6   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   r3   r3   r3   r3   r4   _table2q   s    rm   c                 C   s   t j}g }t| D ],}|t}|r6|jr6||7 }q|| q|t jkrV| t jfS |t j }|| }|j	sd| j	r|j
dk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   rK   r   Z	make_argscoeffr   r:   appendHalf
is_integeris_even)r   rB   Z
rest_termsrW   Km1m2r3   r3   r4   _peeloff_pi   s    





rw      N)r   cyclesreturnc                 C   s  | t krtjS | stjS | j r| t }|r| \}}|jrt|d }|dkrt	t
t|d  }d| }|| }t	|}	t|	|rt|	|}|| }ntt	|}|| }|j r|d }
|
dkr|S |
s|jdk	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

    rx   r   rn   N)r   r   OnerK   rO   ro   as_coeff_MulZis_FloatrP   introundr"   Zevalfr   r   rr   rs   r   r;   )r   ry   cxcxrT   pmcmic2r3   r3   r4   rA      sB    %




rA   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] https://dlmf.nist.gov/4.14
    .. [3] https://functions.wolfram.com/ElementaryFunctions/Sin
    .. [4] https://mathworld.wolfram.com/TrigonometryAngles.html

    Nc                 C   s   |  dt |S Nrn   rX   r   r=   rS   r3   r3   r4   period#  s    z
sin.periodrx   c                 C   s$   |dkrt | jd S t| |d S Nrx   r   )cosr9   r   r=   argindexr3   r3   r4   fdiff&  s    z	sin.fdiffc                 C   s  ddl m} ddlm} |jrT|tjkr.tjS |jr:tjS |tj	tj
fkrT|ddS |tjkrdtjS t||rddlm} |j|j }}t|dt  }|tj
k	r||d t  }|tj	k	r||d t  }||||td ttdd tjk	r6||||ttd	d ttd
d tjk	r6|ddS ||||td ttdd tjk	rz|tt|t|dS ||||ttd	d ttdd tjk	r|dtt|t|S |tt|t|tt|t|S nt||r|| S | r| |  S t|}|d k	rDddlm}	 tj|	| S t|}
|
d k	rH|
j rdtjS d|
 j r|
j!dkrtj"|
tj#  S |
j$s|
t }||kr| |S d S |
j$rH|
d }|dkr| |d t  S d| dkr| d| t S |
td	d d t }t%|}t|t%s*|S |
t |krD| |
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/r||j)d }d| S t|t0r|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   NaNr;   rK   InfinityNegativeInfinityr]   r0   sympy.sets.setsr   minmaxr$   r   intersectionr   ZEmptySetr&   r   r'   
_eval_funccould_extract_minus_signr5   %sympy.functions.elementary.hyperbolicr   r1   rA   rr   rs   NegativeOnerq   is_Rationalr   rQ   rw   asinr9   atanr%   atan2acosacotacscasec)clsr   r   r   r   r   r   di_coeffr   rB   nargr   resultr   yr3   r3   r4   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   rn   rx   r   rK   r   lenr   r   nr   previous_termsr   r3   r3   r4   taylor_term  s    zsin.taylor_termr   c                 C   sZ   | j d }|d k	r"|t||}||dtjtjrFtd|  tj	| ||||dS Nr   zCannot expand %s around 0)r   logxcdir
r9   subsr"   rN   r   r   r]   r	   r   _eval_nseriesr=   r   r   r   r   r   r3   r3   r4   r     s    
zsin._eval_nseriesc                 K   sX   ddl m} tj}t|t|fr6||jd t	}t	|| t	| |  d|  S Nr   HyperbolicFunctionrn   
r   r   r   r1   r0   r6   r8   r9   rewriter#   )r=   r   kwargsr   Ir3   r3   r4   _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   r0   r"   r   r1   r9   r=   r   r   r   r   r3   r3   r4   _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   r3   r3   r4   _eval_rewrite_as_cos  s    zsin._eval_rewrite_as_cosc                 K   s"   t tj| }d| d|d   S Nrn   rx   tanr   rq   r=   r   r   Ztan_halfr3   r3   r4   _eval_rewrite_as_tan  s    zsin._eval_rewrite_as_tanc                 K   s   t |t| t| S Nr   r   r   r3   r3   r4   _eval_rewrite_as_sincos  s    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_halfr3   r3   r4   _eval_rewrite_as_cot  s    $zsin._eval_rewrite_as_cotc                 K   s   |  t tS r   )r   r   powr   r3   r3   r4   _eval_rewrite_as_pow  s    zsin._eval_rewrite_as_powc                 K   s   |  t tS r   )r   r   r%   r   r3   r3   r4   _eval_rewrite_as_sqrt  s    zsin._eval_rewrite_as_sqrtc                 K   s   dt | S Nrx   cscr   r3   r3   r4   _eval_rewrite_as_csc  s    zsin._eval_rewrite_as_cscc                 K   s   dt |td  dd S )Nrx   rn   Fr   secr   r   r3   r3   r4   _eval_rewrite_as_sec  s    zsin._eval_rewrite_as_secc                 K   s   |t | S r   )sincr   r3   r3   r4   _eval_rewrite_as_sinc  s    zsin._eval_rewrite_as_sincc                 C   s   |  | jd  S Nr   r8   r9   	conjugater=   r3   r3   r4   _eval_conjugate  s    zsin._eval_conjugateTc                 K   sH   ddl m}m} | jf d|i|\}}t||| t||| fS Nr   coshr   rD   )r   r   r   rL   r   r   r=   rD   rF   r   r   r!   r    r3   r3   r4   rE     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 k	r|jr| tS t|S )
Nr   )
chebyshevt
chebyshevuFr   TZrationalrx   rn   )rD   )#sympy.functions.special.polynomialsr   r   r9   rQ   as_two_termsr   _eval_expand_trigr   rO   r|   
is_IntegerZis_oddr   r   r
   rA   r   r   r%   )r=   rF   r   r   r   r   r   sxsyr   cyr   rB   r3   r3   r4   r     s2    
 

zsin._eval_expand_trigc           	      C   s   ddl m} | jd }||d }|t }|jrT||t  |}tj	| | S |tj
kr||j|dt|jrtdndd}|tjtjfkr|ddS |jr| |S | S )Nr   r   -+dirr   rx   r   r   r9   r   cancelr   rr   as_leading_termr   r   r]   limitr!   is_negativer   r   	is_finiter8   	r=   r   r   r   r   r   x0r   ltr3   r3   r4   _eval_as_leading_term  s    


zsin._eval_as_leading_termc                 C   s   | j d jrdS d S Nr   Tr9   rI   r   r3   r3   r4   _eval_is_extended_real  s    zsin._eval_is_extended_realc                 C   s   | j d }|jrdS d S r  r  r=   r   r3   r3   r4   _eval_is_finite  s    
zsin._eval_is_finitec                 C   s"   t | jd \}}|jr|jS d S r   rw   r9   r;   rr   r=   restZpi_multr3   r3   r4   _eval_is_zero  s    zsin._eval_is_zeroc                 C   s    | j d js| j d jrdS d S r  r9   rI   
is_complexr   r3   r3   r4   _eval_is_complex#  s    
zsin._eval_is_complex)N)rx   )r   )T)Nr   )rY   rZ   r[   r\   r   r   classmethodr   staticmethodr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rE   r   r  r  r  r  r  r3   r3   r3   r4   r      s8   /


t


r   c                   @   s   e Zd ZdZd5ddZd6ddZedd	 Zee	d
d Z
d7ddZdd Zdd Zdd Zdd Zdd Zdd Zdd ZedddZd d! Zd"d# Zd$d% Zd8d'd(Zd)d* Zd9d+d,Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd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   s   |  dt |S r   r   r   r3   r3   r4   r   U  s    z
cos.periodrx   c                 C   s&   |dkrt | jd  S t| |d S r   )r   r9   r   r   r3   r3   r4   r   X  s    z	cos.fdiffc                 C   sZ  ddl m} ddlm} ddlm} |jr`|tjkr:tjS |j	rFtj
S |tjtjfkr`|ddS |tjkrptjS t||rt|td  S t||r|| S |jr|jdkr|ddS | r| | S t|}|d k	rdd	lm} ||S t|}|d k	r|jrtj| S d| jr0|jdkr0tjS |jsV|t }||krR| |S d S |jr|j}	|jd|	  }
|
|	kr|d t }| | S d|
 |	krd| t }| | S t  }|	|kr8||	 \}}|
t | |
t |  }}| || | }}d ||fkrd S || | td | | td |   S |	d
krFd S tj!t"dd d d}|	|kr||j }||j|# S d|	d kr|d t }| |}d |krd S d| d d }d|dk rdndt$t%|  }|t"d| d  S d S |j&r>t'|\}}|r>|t }t(|t(| t|t|  S |j	rLtj
S t|t)rb|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/r8|j*d }t"dd|d   S t|t0rV|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   r;   r{   r   r   r]   r0   r   r   r   rI   r  r   r5   r   r   rA   rr   r   rs   rK   r   qr   rm   rq   r%   rJ   r}   rP   rQ   rw   r   r   r9   r   r   r   r   r   r   )r   r   r   r   r   r   r   rB   r   r   r   table2rW   bnvalanvalbcst_table_someZctsnvalr   sign_cosr   r   r3   r3   r4   r   ^  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   rn   rx   r   r   r   r3   r3   r4   r     s    zcos.taylor_termr   c                 C   sZ   | j d }|d k	r"|t||}||dtjtjrFtd|  tj	| ||||dS r   r   r   r3   r3   r4   r     s    
zcos._eval_nseriesc                 K   sT   t j}ddlm} t|t|fr6||jd t	}t	|| t	| |  d S r   
r   r1   r   r   r0   r6   r8   r9   r   r#   )r=   r   r   r   r   r3   r3   r4   r      s
    zcos._eval_rewrite_as_expc                 K   s8   t |tr4tj}|jd }|| d ||  d  S d S r   r   r   r3   r3   r4   r     s    

zcos._eval_rewrite_as_Powc                 K   s   t |td  ddS r   )r   r   r   r3   r3   r4   _eval_rewrite_as_sin  s    zcos._eval_rewrite_as_sinc                 K   s"   t tj| d }d| d|  S r   r   r   r3   r3   r4   r     s    zcos._eval_rewrite_as_tanc                 K   s   t |t| t | S r   r   r   r3   r3   r4   r     s    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   r3   r3   r4   r     s    (zcos._eval_rewrite_as_cotc                 K   s
   |  |S r   )r   r   r3   r3   r4   r     s    zcos._eval_rewrite_as_powr2   c                    st  ddl m} t|  d kr d S t tr.d S t ts<d S t } j|krv| j| j  } jdk rr|	 }|S  jd sΈ d }t
|t t}|d d }t|d rdnd}	|	td| d  S t j}
|
r|
}ndd t j D }t| } fd	d
t||D }dd t|tdD }t
tdd
 |D  |}|
rft|
dkrj|S |tS )Nr   r  i  rn   rx   r   c                 S   s   g | ]\}}|| qS r3   r3   ).0r"  er3   r3   r4   
<listcomp>?  s     z-cos._eval_rewrite_as_sqrt.<locals>.<listcomp>c                 3   s"   | ]\}} j t|| V  qd S r   )r   r   )r*  r   r   rB   r3   r4   	<genexpr>B  s     z,cos._eval_rewrite_as_sqrt.<locals>.<genexpr>c                 S   s    g | ]}|d  |d t  fqS )rx   r   )r   r*  r   r3   r3   r4   r,  C  s     zc                 s   s   | ]}|d  V  qdS )r   Nr3   r/  r3   r3   r4   r.  D  s     )r   r   rA   r0   r   r   r)   r   r   rJ   r   r   r   r%   r}   r+   r-   itemsr*   zipr/   sumr   r   r   )r=   r   r   r   r%  rvZpico2r&  r   r'  ZFCZdenomsZapartdecompXZpclsr3   r-  r4   r     s>    





 zcos._eval_rewrite_as_sqrtc                 K   s   dt | S r   r   r   r3   r3   r4   r   J  s    zcos._eval_rewrite_as_secc                 K   s   dt |t S r   )r   r   r   r   r3   r3   r4   r   M  s    zcos._eval_rewrite_as_cscc                 C   s   |  | jd  S r   r   r   r3   r3   r4   r   P  s    zcos._eval_conjugateTc                 K   sJ   ddl m}m} | jf d|i|\}}t||| t| || fS r   )r   r   r   rL   r   r   r   r3   r3   r4   rE   S  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 k	r|jr| tS t|S )Nr   r  Fr   Tr   )r   r   r9   rQ   r   r   r   r   rO   r|   r   rA   r   r   r%   )r=   rF   r   r   r   r   r   r  r   r  ro   termsrB   r3   r3   r4   r   X  s&    

zcos._eval_expand_trigc           	      C   s   ddl m} | jd }||d }|td  t }|jrd||t  td  |}tj	| | S |tj
kr|j|dt|jrdndd}|tjtjfkr|ddS |jr| |S | S )	Nr   r   rn   r  r  r  r   rx   r  r  r3   r3   r4   r  m  s    


zcos._eval_as_leading_termc                 C   s   | j d jrdS d S r  r  r   r3   r3   r4   r  {  s    zcos._eval_is_extended_realc                 C   s   | j d }|jrdS d S r  r  r  r3   r3   r4   r    s    
zcos._eval_is_finitec                 C   s    | j d js| j d jrdS d S r  r  r   r3   r3   r4   r    s    
zcos._eval_is_complexc                 C   s,   t | jd \}}|jr(|r(|tj jS d S r   rw   r9   r;   r   rq   rr   r  r3   r3   r4   r    s    
zcos._eval_is_zero)N)rx   )r   )T)Nr   )rY   rZ   r[   r\   r   r   r  r   r  r   r   r   r   r   r)  r   r   r   r   r   r   r   r   r   rE   r   r  r  r  r  r  r3   r3   r3   r4   r   )  s8   +


 
+

r   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] https://dlmf.nist.gov/4.14
    .. [3] https://functions.wolfram.com/ElementaryFunctions/Tan

    Nc                 C   s   |  t|S r   r   r   r3   r3   r4   r     s    z
tan.periodrx   c                 C   s$   |dkrt j| d  S t| |d S Nrx   rn   )r   r{   r   r   r3   r3   r4   r     s    z	tan.fdiffc                 C   s   t S z7
        Returns the inverse of this function.
        r   r   r3   r3   r4   inverse  s    ztan.inversec                 C   s  ddl m} |jrL|tjkr"tjS |jr.tjS |tjtjfkrL|tjtjS |tj	kr\tjS t
|| r|j|j }}t|t }|tjk	r||t  }|tjk	r||t  }ddlm} ||||td ttdd r|tjtjS |t|t|S | r| |  S t|}|d k	r@ddlm} tj|| S t|d}	|	d k	rr|	jrbtjS |	js|	t }
|
|kr| |
S d S |	jrr|	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
kr0d| | }|dkr(d| }||  S || S |	jd s|	t d }
t|
t|
td   }}t
|tst
|ts|dkrtj	S d| ||  S t  }||kr|| \}}| |t | | |t |  }}d ||fkrd S || d||   S |	tj! d tj! t }
t|
t|
td   }}t
|ts`t
|ts`|dkrXtj	S || S |
|krr| |
S |j"rt#|\}}|rt|t }|tj	k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)rL|j&d }td|d  | S t
|t*rj|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   rn   r_   )tanhrx   ra   )rx   rn   r_   r`   ra   rc   rc   )-r   r   r   r   r   r;   rK   r   r   r]   r0   r   r   r$   r   r   r   r   r   r   r   r5   r   r>  r1   rA   rr   r   r   r   r%   r   rm   rq   rQ   rw   r   r   r9   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r>  rB   r   r   r   Ztable10r   cresultsresultr!  rW   r"  r#  r$  r   r   Ztanmr   r3   r3   r4   r     s    



$










"









ztan.evalc                 G   s~   | dk s| d dkrt jS t|}| d d d| d   }}t| d }t| d }t j| | |d  | | ||   S d S Nr   rn   rx   )r   rK   r   r   r   r   )r   r   r   rW   r"  BFr3   r3   r4   r   G  s    ztan.taylor_termr   c                 C   sL   | j d |dd t }|r:|jr:| tj|||dS tj| |||dS )Nr   rn   r   r   )r9   r
  r   r   r   r   r   r   r=   r   r   r   r   r   r3   r3   r4   r   V  s    
ztan._eval_nseriesc                 K   sF   t |trBtj}|jd }|||  ||   ||  ||   S d S r   r   r   r3   r3   r4   r   \  s    

ztan._eval_rewrite_as_Powc                 C   s   |  | jd  S r   r   r   r3   r3   r4   r   b  s    ztan._eval_conjugateTc                 K   sx   | j f d|i|\}}|rdddlm}m} td| |d|  }td| | |d| | fS | |tjfS d S NrD   r   r   rn   	rL   r   r   r   r   r   r8   r   rK   r=   rD   rF   r!   r    r   r   denomr3   r3   r4   rE   e  s     ztan.as_real_imagc                    sF  | j d }d }|jrt|j }g }|j D ]}t|dd }|| q(td  fddt|D }ddg}t|d D ]2}	|d|	d    t|	|d	|	d
 d   7  < qz|d |d  	t
t||S |jr>|jdd\}
}|
jr>|
dkr>tj}tddd}d||  |
  }t|t| 	|t|fgS t|S )Nr   Fr   Yc                    s   g | ]}t  qS r3   nextr*  r   ZYgr3   r4   r,  y  s     z)tan._eval_expand_trig.<locals>.<listcomp>rx   rn   r   r`   Tr   dummyreal)r9   rQ   r   r   r   rp   r/   ranger.   r   listr2  rO   r|   r   r   r1   r   rJ   r    r!   )r=   rF   r   r   r   ZTXZtxrK  r   r   ro   r8  r   r0  Pr3   rO  r4   r   n  s,    


0  ztan._eval_expand_trigc                 K   sf   t j}ddlm} t|t|fr6||jd t	}t	| | t	||  }}|||  ||  S Nr   r   r(  )r=   r   r   r   r   neg_exppos_expr3   r3   r4   r     s    ztan._eval_rewrite_as_expc                 K   s   dt |d  t d|  S r   r   r=   r   r   r3   r3   r4   r)    s    ztan._eval_rewrite_as_sinc                 K   s   t |td  ddt | S r   r   rZ  r3   r3   r4   r     s    ztan._eval_rewrite_as_cosc                 K   s   t |t| S r   r   r   r3   r3   r4   r     s    ztan._eval_rewrite_as_sincosc                 K   s   dt | S r   r   r   r3   r3   r4   r     s    ztan._eval_rewrite_as_cotc                 K   s$   t |t}t|t}|| S r   )r   r   r   r   )r=   r   r   sin_in_sec_formcos_in_sec_formr3   r3   r4   r     s    ztan._eval_rewrite_as_secc                 K   s$   t |t}t|t}|| S r   )r   r   r   r   )r=   r   r   sin_in_csc_formcos_in_csc_formr3   r3   r4   r     s    ztan._eval_rewrite_as_cscc                 K   s"   |  t t}|trd S |S r   r   r   r   rN   r=   r   r   r   r3   r3   r4   r     s    
ztan._eval_rewrite_as_powc                 K   s"   |  t t}|trd S |S r   r   r   r%   rN   ra  r3   r3   r4   r     s    
ztan._eval_rewrite_as_sqrtc           
      C   s   ddl m} ddlm} | jd }||d }d| t }|jrl||t d  	|}	|j
rd|	S d|	 S |tjkr|j|d||jrdndd}|tjtjfkr|tjtjS |jr| |S | S )	Nr   r   r!   rn   r   r  r  r  r   r   $sympy.functions.elementary.complexesr!   r9   r   r  r   rr   r	  rs   r   r]   r
  r  r   r   r  r8   
r=   r   r   r   r   r!   r   r  r   r  r3   r3   r4   r    s    

ztan._eval_as_leading_termc                 C   s   | j d jS r   r  r   r3   r3   r4   r    s    ztan._eval_is_extended_realc                 C   s,   | j d }|jr(|t tj jdkr(dS d S r@   r9   is_realr   r   rq   rr   r  r3   r3   r4   _eval_is_real  s    
ztan._eval_is_realc                 C   s6   | j d }|jr(|t tj jdkr(dS |jr2dS d S r@   )r9   rh  r   r   rq   rr   is_imaginaryr  r3   r3   r4   r    s
    
ztan._eval_is_finitec                 C   s"   t | jd \}}|jr|jS d S r   r  r  r3   r3   r4   r    s    ztan._eval_is_zeroc                 C   s,   | j d }|jr(|t tj jdkr(dS d S r@   rg  r  r3   r3   r4   r    s    
ztan._eval_is_complex)N)rx   )rx   )r   )T)Nr   ) rY   rZ   r[   r\   r   r   r=  r  r   r  r   r   r   r   r   rE   r   r   r)  r   r   r   r   r   r   r   r  r  ri  r  r  r  r3   r3   r3   r4   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] https://dlmf.nist.gov/4.14
    .. [3] https://functions.wolfram.com/ElementaryFunctions/Cot

    Nc                 C   s   |  t|S r   r   r   r3   r3   r4   r     s    z
cot.periodrx   c                 C   s$   |dkrt j| d  S t| |d S r:  )r   r   r   r   r3   r3   r4   r   	  s    z	cot.fdiffc                 C   s   t S r;  r   r   r3   r3   r4   r=    s    zcot.inversec                 C   s  ddl m} |jrL|tjkr"tjS |jr.tjS |tjtjfkrL|tjtjS |tjkr\tjS t	||rxt
|td   S | r| |  S t|}|d k	rddlm} tj || S t|d}|d k	rl|jrtjS |js|t }||kr| |S d S |jrl|jdkrt
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 }|	|kr||	 \}}| |
t | | |
t |  }}d ||fkrd S d||  ||  S |tj d tj t }t|t|td   }}t	|tsZt	|tsZ|dkrRtjS || S ||krl| |S |jrt|\}}|rt|t }|tjk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   rn   )cothr?  rx   )%r   r   r   r   r   r;   r]   r   r   r0   r   r   r   r5   r   rl  r1   rA   rr   r   r   r   r   rm   rq   rQ   rw   r   r   r9   r   r   r   r%   r   r   r   )r   r   r   r   rl  rB   r   r@  rA  r   r   r!  rW   r"  r#  r$  r   r   Zcotmr   r3   r3   r4   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 d S Nr   rx   rn   )r   r   rK   r   r   r   )r   r   r   rC  rD  r3   r3   r4   r   ~  s    zcot.taylor_termr   c                 C   sL   | j d |dt }|r6|jr6| tj|||dS | tj|||dS )Nr   rE  )r9   r
  r   r   r   r   r   r   rF  r3   r3   r4   r     s    
zcot._eval_nseriesc                 C   s   |  | jd  S r   r   r   r3   r3   r4   r     s    zcot._eval_conjugateTc                 K   sz   | j f d|i|\}}|rfddlm}m} td| |d|  }td|  | |d| | fS | |tjfS d S rG  rH  rI  r3   r3   r4   rE     s    "zcot.as_real_imagc                 K   sf   ddl m} tj}t|t|fr6||jd t	}t	| | t	||  }}|||  ||  S rV  r   )r=   r   r   r   r   rW  rX  r3   r3   r4   r     s    zcot._eval_rewrite_as_expc                 K   sH   t |trDtj}|jd }| ||  ||   ||  ||   S d S r   r   r   r3   r3   r4   r     s    

zcot._eval_rewrite_as_Powc                 K   s   t d| dt |d   S r   rY  rZ  r3   r3   r4   r)    s    zcot._eval_rewrite_as_sinc                 K   s   t |t |td  dd S r   r   rZ  r3   r3   r4   r     s    zcot._eval_rewrite_as_cosc                 K   s   t |t| S r   r   r   r   r3   r3   r4   r     s    zcot._eval_rewrite_as_sincosc                 K   s   dt | S r   r   r   r3   r3   r4   r     s    zcot._eval_rewrite_as_tanc                 K   s$   t |t}t|t}|| S r   )r   r   r   r   )r=   r   r   r]  r\  r3   r3   r4   r     s    zcot._eval_rewrite_as_secc                 K   s$   t |t}t|t}|| S r   )r   r   r   r   )r=   r   r   r_  r^  r3   r3   r4   r     s    zcot._eval_rewrite_as_cscc                 K   s"   |  t t}|trd S |S r   r`  ra  r3   r3   r4   r     s    
zcot._eval_rewrite_as_powc                 K   s"   |  t t}|trd S |S r   rb  ra  r3   r3   r4   r     s    
zcot._eval_rewrite_as_sqrtc           
      C   s   ddl m} ddlm} | jd }||d }d| t }|jrn||t d  	|}	|j
rhd|	 S |	 S |tjkr|j|d||jrdndd}|tjtjfkr|tjtjS |jr| |S | S )	Nr   r   rc  rn   rx   r  r  r  rd  rf  r3   r3   r4   r    s    

zcot._eval_as_leading_termc                 C   s   | j d jS r   r  r   r3   r3   r4   r    s    zcot._eval_is_extended_realc                    sF  | j d }d }|jrt|j }g }|j D ]}t|dd }|| q(td  fddt|D }ddg}t|ddD ]6}	|||	 d   t|	|d||	 d	 d   7  < qz|d |d
  	t
t||S |jr>|jdd\}
}|
jr>|
d
kr>tj}tddd}|| |
  }t|t| 	|t|fgS t|S )Nr   Fr   rK  c                    s   g | ]}t  qS r3   rL  rN  rO  r3   r4   r,    s     z)cot._eval_expand_trig.<locals>.<listcomp>r   rn   r`   rx   Tr   rP  rQ  )r9   rQ   r   r   r   rp   r/   rS  r.   r   rT  r2  rO   r|   r   r   r1   r   rJ   r!   r    )r=   rF   r   r   r   ZCXr   rK  r   r   ro   r8  r   r0  rU  r3   rO  r4   r     s,    


4  zcot._eval_expand_trigc                 C   s0   | j d }|jr"|t jdkr"dS |jr,dS d S r@   )r9   rh  r   rr   rj  r  r3   r3   r4   r    s
    
zcot._eval_is_finitec                 C   s&   | j d }|jr"|t jdkr"dS d S r@   r9   rh  r   rr   r  r3   r3   r4   ri    s    
zcot._eval_is_realc                 C   s&   | j d }|jr"|t jdkr"dS d S r@   rp  r  r3   r3   r4   r    s    
zcot._eval_is_complexc                 C   s,   t | jd \}}|r(|jr(|tj jS d S r   r9  )r=   r  Zpimultr3   r3   r4   r    s    
zcot._eval_is_zeroc                 C   s6   | j d }|||}||kr.|t jr.tjS t|S r   )r9   r   r   rr   r   r]   r   )r=   oldnewr   Zargnewr3   r3   r4   
_eval_subs  s
    
zcot._eval_subs)N)rx   )rx   )r   )T)Nr   )!rY   rZ   r[   r\   r   r   r=  r  r   r  r   r   r   r   rE   r   r   r)  r   r   r   r   r   r   r   r  r  r   r  ri  r  r  rs  r3   r3   r3   r4   r     s<   %



h

	
r   c                   @   s   e Zd ZU dZdZejfZdZe	e
d< dZe	e
d< edd Zdd Zd	d
 Zdd Zdd Zd0d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d1d#d$Zd%d& Zd'd( Zd2d*d+Zd,d- Zd3d.d/Z dS )4ReciprocalTrigonometricFunctionz@Base class for reciprocal functions of trigonometric functions. N_is_even_is_oddc                 C   sF  |  r*| jr| | S | jr*| |  S t|}|d k	rd| js|jr|j}|jd|  }||kr||d t }| | S d| |krd| t }| jr| |S | jr| | S t	|dr|
 | kr|jd S | j|}|d kr|S tdd || fD rd| tS tdd || fD r:d| tS d| S d S )Nrn   rx   r=  r   c                 s   s   | ]}t |tV  qd S r   )r0   r   rN  r3   r3   r4   r.  E  s     z7ReciprocalTrigonometricFunction.eval.<locals>.<genexpr>c                 s   s   | ]}t |tV  qd S r   )r0   r   rN  r3   r3   r4   r.  G  s     )r   ru  rv  rA   rr   r   r   r   r   hasattrr=  r9   _reciprocal_ofr   anyr   r   r   )r   r   rB   r   r   r   tr3   r3   r4   r   '  s@    



z$ReciprocalTrigonometricFunction.evalc                 O   s    |  | jd }t||||S r   )rx  r9   getattr)r=   method_namer9   r   or3   r3   r4   _call_reciprocalL  s    z0ReciprocalTrigonometricFunction._call_reciprocalc                 O   s&   | j |f||}|d k	r"d| S |S r   )r~  )r=   r|  r9   r   rz  r3   r3   r4   _calculate_reciprocalQ  s    z5ReciprocalTrigonometricFunction._calculate_reciprocalc                 C   s.   |  ||}|d k	r*|| |kr*d| S d S r   )r~  rx  )r=   r|  r   rz  r3   r3   r4   _rewrite_reciprocalW  s    z3ReciprocalTrigonometricFunction._rewrite_reciprocalc                 C   s   t | jd }| ||S r   )r
   r9   rx  r   )r=   rS   rT   r3   r3   r4   rX   ^  s    z'ReciprocalTrigonometricFunction._periodrx   c                 C   s   |  d| | d  S )Nr   rn   r  r   r3   r3   r4   r   b  s    z%ReciprocalTrigonometricFunction.fdiffc                 K   s   |  d|S )Nr   r  r   r3   r3   r4   r   e  s    z4ReciprocalTrigonometricFunction._eval_rewrite_as_expc                 K   s   |  d|S )Nr   r  r   r3   r3   r4   r   h  s    z4ReciprocalTrigonometricFunction._eval_rewrite_as_Powc                 K   s   |  d|S )Nr)  r  r   r3   r3   r4   r)  k  s    z4ReciprocalTrigonometricFunction._eval_rewrite_as_sinc                 K   s   |  d|S )Nr   r  r   r3   r3   r4   r   n  s    z4ReciprocalTrigonometricFunction._eval_rewrite_as_cosc                 K   s   |  d|S )Nr   r  r   r3   r3   r4   r   q  s    z4ReciprocalTrigonometricFunction._eval_rewrite_as_tanc                 K   s   |  d|S )Nr   r  r   r3   r3   r4   r   t  s    z4ReciprocalTrigonometricFunction._eval_rewrite_as_powc                 K   s   |  d|S )Nr   r  r   r3   r3   r4   r   w  s    z5ReciprocalTrigonometricFunction._eval_rewrite_as_sqrtc                 C   s   |  | jd  S r   r   r   r3   r3   r4   r   z  s    z/ReciprocalTrigonometricFunction._eval_conjugateTc                 K   s   d|  | jd  j|f|S r   )rx  r9   rE   )r=   rD   rF   r3   r3   r4   rE   }  s    z,ReciprocalTrigonometricFunction.as_real_imagc                 K   s   | j d|S )Nr   )r   r  )r=   rF   r3   r3   r4   r     s    z1ReciprocalTrigonometricFunction._eval_expand_trigc                 C   s   |  | jd  S r   )rx  r9   r  r   r3   r3   r4   r    s    z6ReciprocalTrigonometricFunction._eval_is_extended_realr   c                 C   s   d|  | jd  |S r   )rx  r9   r  )r=   r   r   r   r3   r3   r4   r    s    z5ReciprocalTrigonometricFunction._eval_as_leading_termc                 C   s   d|  | jd  jS r   )rx  r9   r  r   r3   r3   r4   r    s    z/ReciprocalTrigonometricFunction._eval_is_finitec                 C   s   d|  | jd  |||S r   )rx  r9   r   r=   r   r   r   r   r3   r3   r4   r     s    z-ReciprocalTrigonometricFunction._eval_nseries)rx   )T)Nr   )r   )!rY   rZ   r[   r\   rx  r   r]   r^   ru  r   __annotations__rv  r  r   r~  r  r  rX   r   r   r   r)  r   r   r   r   r   rE   r   r  r  r  r   r3   r3   r3   r4   rt    s4   

$


rt  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] https://dlmf.nist.gov/4.14
    .. [3] https://functions.wolfram.com/ElementaryFunctions/Sec

    TNc                 C   s
   |  |S r   rX   r   r3   r3   r4   r     s    z
sec.periodc                 K   s    t |d d }|d |d  S r   r[  )r=   r   r   Zcot_half_sqr3   r3   r4   r     s    zsec._eval_rewrite_as_cotc                 K   s   dt | S r   r   r   r3   r3   r4   r     s    zsec._eval_rewrite_as_cosc                 K   s   t |t|t |  S r   r   r   r3   r3   r4   r     s    zsec._eval_rewrite_as_sincosc                 K   s   dt |t S r   )r   r   r   r   r3   r3   r4   r)    s    zsec._eval_rewrite_as_sinc                 K   s   dt |t S r   )r   r   r   r   r3   r3   r4   r     s    zsec._eval_rewrite_as_tanc                 K   s   t td | ddS r   )r   r   r   r3   r3   r4   r     s    zsec._eval_rewrite_as_cscrx   c                 C   s2   |dkr$t | jd t| jd  S t| |d S r   )r   r9   r   r   r   r3   r3   r4   r     s    z	sec.fdiffc                 C   s,   | j d }|jr(|t tj jdkr(dS d S r@   )r9   r  r   r   rq   rr   r  r3   r3   r4   r    s    
zsec._eval_is_complexc                 G   s\   | dk s| d dkrt jS t|}| d }t j| td|  td|  |d|   S d S rB  )r   rK   r   r   r   r   r   r   r   kr3   r3   r4   r     s
    zsec.taylor_termr   c           
      C   s   ddl m} ddlm} | jd }||d }|td  t }|jrp||t  td  	|}	t
j| |	 S |t
jkr|j|d||jrdndd}|t
jt
jfkr|t
jt
jS |jr| |S | S )Nr   r   rc  rn   r  r  r  r   r   re  r!   r9   r   r  r   rr   r	  r   r   r]   r
  r  r   r   r  r8   rf  r3   r3   r4   r    s    

zsec._eval_as_leading_term)N)rx   )Nr   )rY   rZ   r[   r\   r   rx  ru  r   r   r   r   r)  r   r   r   r  r  r   r   r  r3   r3   r3   r4   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dZdd Zeedd Zd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   s
   |  |S r   r  r   r3   r3   r4   r     s    z
csc.periodc                 K   s   dt | S r   rY  r   r3   r3   r4   r)     s    zcsc._eval_rewrite_as_sinc                 K   s   t |t|t |  S r   rn  r   r3   r3   r4   r   #  s    zcsc._eval_rewrite_as_sincosc                 K   s    t |d }d|d  d|  S r   r[  r   r3   r3   r4   r   &  s    zcsc._eval_rewrite_as_cotc                 K   s   dt |t S r   )r   r   r   r   r3   r3   r4   r   *  s    zcsc._eval_rewrite_as_cosc                 K   s   t td | ddS r   r   r   r3   r3   r4   r   -  s    zcsc._eval_rewrite_as_secc                 K   s   dt |t S r   )r   r   r   r   r3   r3   r4   r   0  s    zcsc._eval_rewrite_as_tanrx   c                 C   s4   |dkr&t | jd  t| jd  S t| |d S r   )r   r9   r   r   r   r3   r3   r4   r   3  s    z	csc.fdiffc                 C   s&   | j d }|jr"|t jdkr"dS d S r@   rp  r  r3   r3   r4   r  9  s    
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 d S rm  )r   r   rK   r   r   r   r  r3   r3   r4   r   >  s    $

zcsc.taylor_termr   c           
      C   s   ddl m} ddlm} | jd }||d }|t }|jr`||t  	|}	t
j| |	 S |t
jkr|j|d||jrdndd}|t
jt
jfkr|t
jt
jS |jr| |S | S )Nr   r   rc  r  r  r  r  rf  r3   r3   r4   r  K  s    

zcsc._eval_as_leading_term)N)rx   )Nr   )rY   rZ   r[   r\   r   rx  rv  r   r)  r   r   r   r   r   r   r  r  r   r   r  r3   r3   r3   r4   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   s<   | j d }|dkr.t|| t||d   S t| |d S rm  )r9   r   r   r   )r=   r   r   r3   r3   r4   r     s    
z
sinc.fdiffc                 C   s   |j rtjS |jr8|tjtjfkr(tjS |tjkr8tjS |tjkrHtjS |	 rZ| | S t
|}|d k	r|jrt|j rtjS nd| jrtj|tj  | S d S r   )r;   r   r{   r   r   r   rK   r   r]   r   rA   rr   r   r   rq   )r   r   rB   r3   r3   r4   r     s$    




z	sinc.evalr   c                 C   s    | j d }t|| |||S r   )r9   r   r   r  r3   r3   r4   r     s    
zsinc._eval_nseriesc                 K   s   ddl m} |d|S )Nr   )jn)Zsympy.functions.special.besselr  )r=   r   r   r  r3   r3   r4   _eval_rewrite_as_jn  s    zsinc._eval_rewrite_as_jnc                 K   s&   t t|| t|tjftjtjfS r   )r(   r   r   r   rK   r{   truer   r3   r3   r4   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)r9   is_infiniterw   r;   r   rr   Z
is_nonzeror   r  r3   r3   r4   r    s    zsinc._eval_is_zeroc                 C   s    | j d js| j d jrdS d S r  )r9   rI   rj  r   r3   r3   r4   ri    s    zsinc._eval_is_realN)rx   )r   )rY   rZ   r[   r\   r   r]   r^   r   r  r   r   r  r)  r  ri  r  r3   r3   r3   r4   r   [  s   4


	r   c                   @   sT   e Zd ZdZejejejejfZ	e
edd Ze
edd Ze
edd ZdS )	InverseTrigonometricFunctionz/Base class for inverse trigonometric functions.c                -   C   s  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   r3   r3   r3   r4   _asin_table  sV    
 
 
                   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   r3   r3   r3   r4   _atan_table  s6    
 
  
 
 
     
 
 
 z(InverseTrigonometricFunction._atan_tablec                %   C   s  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
 iS )Nrn   r_   r`   ra   rx   rd   rb   rc   ri   r  r3   r3   r3   r4   _acsc_table  sF               
 
     z(InverseTrigonometricFunction._acsc_tableN)rY   rZ   r[   r\   r   r{   r   rK   r]   r^   r  r   r  r  r  r3   r3   r3   r4   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eZdd Zdd Zdd  Zd!d" Zd(d#d$Zd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   s0   |dkr"dt d| jd d   S t| |d S Nrx   r   rn   r%   r9   r   r   r3   r3   r4   r   S  s    z
asin.fdiffc                 C   s4   | j | j }|j | j kr*|jd jr0dS n|jS d S r7   r8   r9   r:   r<   r3   r3   r4   r?   Y  s
    zasin._eval_is_rationalc                 C   s   |   o| jd jS r   )r  r9   is_positiver   r3   r3   r4   _eval_is_positivea  s    zasin._eval_is_positivec                 C   s   |   o| jd jS r   )r  r9   r  r   r3   r3   r4   _eval_is_negatived  s    zasin._eval_is_negativec                 C   s  |j rt|tjkrtjS |tjkr,tjtj S |tjkrBtjtj S |jrNtjS |tjkr`t	d S |tj
krtt	 d S |tjkrtjS | r| |  S |jr|  }||kr|| S t|}|d k	rddlm} tj|| S |jrtjS t|tr\|jd }|jr\|dt	 ; }|t	kr(t	| }|t	d kr>t	| }|t	 d k rXt	 | }|S t|tr|jd }|jrt	d t| S d S )Nrn   r   )asinh)r   r   r   r   r   r1   r;   rK   r{   r   r   r]   r   	is_numberr  r5   r   r  r0   r   r9   is_comparabler   r   )r   r   
asin_tabler   r  angr3   r3   r4   r   g  sT    










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   rK   r   r   r   rq   r   r   r   r   r   r  RrD  r3   r3   r4   r     s    $zasin.taylor_termNr   c                 C   s   | j d }||d }|jr*||S |tj tjtjfkrZ| t	j
|||d S d|d  jr|||rv|nd}t|jr|jrt | | S n:t|jr|jrt| | S n| t	j
|||d S | |S Nr   r   r   rx   rn   )r9   r   r  r;   r	  r   r{   r]   r   r"   r  rJ   r  r  r    r   r8   r  r=   r   r   r   r   r  ndirr3   r3   r4   r    s     



zasin._eval_as_leading_termc                 C   s  ddl m} | jd |d}|tjkrt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k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kr|S d|d  jr| jd ||r<|nd}t|jrb|jrt | S n6t|jr|jrt| S n| t	j||||d	S |S 
Nr   Orz  TZpositivern   rx   rE  r  )sympy.series.orderr  r9   r   r   r{   r   r   r   r"   nseriesr	  is_meromorphicr   r%   r   removeOrJ   powsimpr   r   r]   r  r  r    r  r=   r   r   r   r   r  arg0rz  ZserZarg1rT   rU   Zres1resr  r3   r3   r4   r     sJ    &
$&&
(&
zasin._eval_nseriesc                 K   s   t d t| S r   r   r   rZ  r3   r3   r4   _eval_rewrite_as_acos  s    zasin._eval_rewrite_as_acosc                 K   s    dt |dtd|d     S r   )r   r%   rZ  r3   r3   r4   _eval_rewrite_as_atan  s    zasin._eval_rewrite_as_atanc                 K   s&   t j tt j| td|d    S r:  r   r1   r"   r%   rZ  r3   r3   r4   _eval_rewrite_as_log  s    zasin._eval_rewrite_as_logc                 K   s    dt dtd|d   |  S r   )r   r%   r   r3   r3   r4   _eval_rewrite_as_acot  s    zasin._eval_rewrite_as_acotc                 K   s   t d td|  S r   r   r   r   r3   r3   r4   _eval_rewrite_as_asec  s    zasin._eval_rewrite_as_asecc                 K   s   t d| S r   )r   r   r3   r3   r4   _eval_rewrite_as_acsc 	  s    zasin._eval_rewrite_as_acscc                 C   s   | j d }|jodt| jS Nr   rx   r9   rI   rP   is_nonnegativer=   r   r3   r3   r4   r  	  s    
zasin._eval_is_extended_realc                 C   s   t S r;  rY  r   r3   r3   r4   r=  	  s    zasin.inverse)rx   )Nr   )r   )rx   )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  r=  r3   r3   r3   r4   r   (  s*   *

6

,r   c                   @   s   e Zd ZdZd%ddZdd Zedd Zee	d	d
 Z
d&ddZdd Zdd Zd'ddZdd ZeZdd Zdd Zd(ddZdd Zdd  Zd!d" Zd#d$ ZdS ))r   a  
    The inverse cosine function.

    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   s0   |dkr"dt d| jd d   S t| |d S Nrx   r   r   rn   r  r   r3   r3   r4   r   :	  s    z
acos.fdiffc                 C   s4   | j | j }|j | j kr*|jd jr0dS n|jS d S r7   r  r<   r3   r3   r4   r?   @	  s
    zacos._eval_is_rationalc                 C   sV  |j rn|tjkrtjS |tjkr,tjtj S |tjkrBtjtj S |jrPtd S |tjkr`tj	S |tj
krntS |tjkr~tjS |jr|  }||krtd ||  S | |krtd ||   S t|}|d k	rtd t| S t|tr$|jd }|jr$|dt ; }|tkr dt | }|S t|trR|jd }|jrRtd t| S d S Nrn   r   )r   r   r   r   r1   r   r;   r   r{   rK   r   r]   r  r  r5   r   r0   r   r9   r  r   )r   r   r  r   r  r3   r3   r4   r   H	  sF    









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rr| dkrr|d }|| d d  | | d   |d  S | d d }ttj|}t|}| | ||   |  S d S r   )r   r   rK   r   r   r   rq   r   r  r3   r3   r4   r   t	  s    $zacos.taylor_termNr   c                 C   s   | j d }||d }|dkr>tdttj| | S |tj tjfkrf| t	j
|||dS d|d  jr|||r|nd}t|jr|jrdt | | S n8t|jr|jr| | S n| t	j
|||d S | |S Nr   rx   rn   r  )r9   r   r  r%   r   r{   r	  r]   r   r"   r  r  r  r    r   r8   r  rJ   r  r3   r3   r4   r  	  s     


zacos._eval_as_leading_termc                 C   s   | j d }|jodt| jS r  r  r  r3   r3   r4   r  	  s    
zacos._eval_is_extended_realc                 C   s   |   S r   )r  r   r3   r3   r4   _eval_is_nonnegative	  s    zacos._eval_is_nonnegativec                 C   s  ddl m} | jd |d}|tjkrt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k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kr|S d|d  jr| jd ||r,|nd}t|jrT|jrdt | S n4t|jrp|jr| S n| t	j||||d	S |S r  )r  r  r9   r   r   r{   r   r   r   r"   r  r	  r  r%   r   r  rJ   r  r   r   r   r]   r  r  r    r  r  r3   r3   r4   r   	  sJ    
&
&&
"&zacos._eval_nseriesc                 K   s,   t d tjttj| td|d     S r   r   r   r1   r"   r%   rZ  r3   r3   r4   r  	  s    
zacos._eval_rewrite_as_logc                 K   s   t d t| S r   r   r   rZ  r3   r3   r4   _eval_rewrite_as_asin	  s    zacos._eval_rewrite_as_asinc                 K   s8   t td|d  | td d|td|d      S r:  )r   r%   r   rZ  r3   r3   r4   r  	  s    zacos._eval_rewrite_as_atanc                 C   s   t S r;  r  r   r3   r3   r4   r=  	  s    zacos.inversec                 K   s(   t d dtdtd|d   |   S r   )r   r   r%   r   r3   r3   r4   r  	  s    zacos._eval_rewrite_as_acotc                 K   s   t d| S r   )r   r   r3   r3   r4   r  	  s    zacos._eval_rewrite_as_asecc                 K   s   t d td|  S r   r   r   r   r3   r3   r4   r  	  s    zacos._eval_rewrite_as_acscc                 C   sN   | j d }| | j d  }|jdkr,|S |jrJ|d jrJ|d jrJ|S d S Nr   Frx   )r9   r8   r   rI   r  Zis_nonpositive)r=   r0  rr3   r3   r4   r   	  s    

zacos._eval_conjugate)rx   )Nr   )r   )rx   )rY   rZ   r[   r\   r   r?   r  r   r  r   r   r  r  r  r   r  r  r  r  r=  r  r  r  r   r3   r3   r3   r4   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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

    r9   rx   c                 C   s,   |dkrdd| j d d   S t| |d S r  r9   r   r   r3   r3   r4   r   
  s    z
atan.fdiffc                 C   s4   | j | j }|j | j kr*|jd jr0dS n|jS d S r7   r  r<   r3   r3   r4   r?   #
  s
    zatan._eval_is_rationalc                 C   s   | j d jS r   )r9   Zis_extended_positiver   r3   r3   r4   r  +
  s    zatan._eval_is_positivec                 C   s   | j d jS r   )r9   Zis_extended_nonnegativer   r3   r3   r4   r  .
  s    zatan._eval_is_nonnegativec                 C   s   | j d jS r   )r9   r;   r   r3   r3   r4   r  1
  s    zatan._eval_is_zeroc                 C   s   | j d jS r   r  r   r3   r3   r4   ri  4
  s    zatan._eval_is_realc                 C   s  |j rn|tjkrtjS |tjkr(td S |tjkr<t d S |jrHtjS |tjkrZtd S |tj	krnt d S |tj
krddlm} |t d td S | r| |  S |jr|  }||kr|| S t|}|d k	rddlm} tj|| S |jrtjS t|trB|jd }|jrB|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 )Nrn   r`   r   r   )atanh)r   r   r   r   r   r   r;   rK   r{   r   r]   r   r   r   r  r  r5   r   r  r1   r0   r   r9   r  r   r   )r   r   r   
atan_tabler   r  r  r3   r3   r4   r   7
  sT    









z	atan.evalc                 G   sD   | dk s| d dkrt jS t|}t j| d d  ||   |  S d S rB  )r   rK   r   r   r   r   r   r3   r3   r4   r   l
  s    zatan.taylor_termNr   c                 C   s   | j d }||d }|jr*||S |tj tjtjfkrZ| t	j
|||d S d|d  jr|||rv|nd}t|jrt|jr| |t S n>t|jrt|jr| |t S n| t	j
|||d S | |S r  )r9   r   r  r;   r	  r   r1   r]   r   r"   r  rJ   r  r  r!   r    r  r8   r   r  r3   r3   r4   r  u
  s     





zatan._eval_as_leading_termc                 C   s   | j d |d}|tjtjtj fkr@| tj||||dS tj| |||d}| j d 	||rf|nd}|tj
krt|dkr|t S |S d|d  jrt|jrt|jr|t S n6t|jrt|jr|t S n| tj||||dS |S Nr   r  rE  rx   rn   )r9   r   r   r1   r   r   r"   r   r   r  r]   r!   r   r  r    r  r=   r   r   r   r   r  r  r  r3   r3   r4   r   
  s$    






zatan._eval_nseriesc                 K   s2   t jd tt jt j|  tt jt j|    S r   )r   r1   r"   r{   rZ  r3   r3   r4   r  
  s    zatan._eval_rewrite_as_logc                    s|   |d t jkr2td td| jd   |||S |d t jkrft d td| jd   |||S t ||||S d S rB  )	r   r   r   r   r9   r   r   super_eval_aseriesr=   r   Zargs0r   r   	__class__r3   r4   r  
  s
    $&zatan._eval_aseriesc                 C   s   t S r;  ro  r   r3   r3   r4   r=  
  s    zatan.inversec                 K   s0   t |d | td tdt d|d     S r   r%   r   r   r   r3   r3   r4   r  
  s    zatan._eval_rewrite_as_asinc                 K   s(   t |d | tdt d|d    S r   r%   r   r   r3   r3   r4   r  
  s    zatan._eval_rewrite_as_acosc                 K   s   t d| S r   rk  r   r3   r3   r4   r  
  s    zatan._eval_rewrite_as_acotc                 K   s$   t |d | tt d|d   S r   r%   r   r   r3   r3   r4   r  
  s    zatan._eval_rewrite_as_asecc                 K   s,   t |d | td tt d|d    S r   r%   r   r   r   r3   r3   r4   r  
  s    zatan._eval_rewrite_as_acsc)rx   )Nr   )r   )rx   )!rY   rZ   r[   r\   tTupler   r  r   r1   r^   r   r?   r  r  r  ri  r  r   r  r   r   r  r   r  r  r  r=  r  r  r  r  r  __classcell__r3   r3   r  r4   r   	  s2   
&

4


r   c                       s   e Zd ZdZejej fZd'ddZdd Zdd Z	d	d
 Z
dd Zedd Zeedd Zd(ddZd)ddZ fddZdd ZeZd*ddZdd Zdd  Zd!d" Zd#d$ Zd%d& Z  ZS )+r   a  
    The inverse cotangent function.

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

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

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

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

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

    Examples
    ========

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

    See Also
    ========

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

    References
    ==========

    .. [1] 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| |d S r  r  r   r3   r3   r4   r   
  s    z
acot.fdiffc                 C   s4   | j | j }|j | j kr*|jd jr0dS n|jS d S r7   r  r<   r3   r3   r4   r?   
  s
    zacot._eval_is_rationalc                 C   s   | j d jS r   )r9   r  r   r3   r3   r4   r    s    zacot._eval_is_positivec                 C   s   | j d jS r   )r9   r  r   r3   r3   r4   r    s    zacot._eval_is_negativec                 C   s   | j d jS r   r  r   r3   r3   r4   r    s    zacot._eval_is_extended_realc                 C   s  |j rj|tjkrtjS |tjkr&tjS |tjkr6tjS |jrDtd S |tjkrVtd S |tj	krjt d S |tj
krztjS | r| |  S |jr|  }||krtd ||  }|td kr|t8 }|S t|}|d k	 rddlm} tj || S |jrt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 )Nrn   r`   r   )acoth)r   r   r   r   rK   r   r;   r   r{   r   r]   r   r  r  r5   r   r  r1   rq   r0   r   r9   r  r   r   )r   r   r  r  r   r  r3   r3   r4   r     sX    










z	acot.evalc                 G   sT   | dkrt d S | dk s$| d dkr*tjS t|}tj| d d  ||   |  S d S rB  )r   r   rK   r   r   r  r3   r3   r4   r   A  s    zacot.taylor_termNr   c                 C   s   | j d }||d }|tjkr2d| |S |tj tjtjfkrb| t	j
|||d S |jrd|d  jr|||r|nd}t|jrt|jr| |t S n>t|jrt|jr| |t S n| t	j
|||d S | |S )Nr   rx   r  rn   )r9   r   r  r   r]   r	  r1   rK   r   r"   r  rJ   rj  r  r  r!   r    r8   r   r  r  r3   r3   r4   r  L  s     





zacot._eval_as_leading_termc                 C   s  | j d |d}|tjtjtj fkr@| tj||||dS tj| |||d}|tj	kr`|S | j d 
||rt|nd}|jrt|dk r|t S |S |jrd|d  jrt|jrt|jr|t S n6t|jrt|jr|t S n| tj||||dS |S r  )r9   r   r   r1   r   r   r"   r   r   r]   r  r;   r!   r   rj  r  r    r  r  r3   r3   r4   r   a  s(    






zacot._eval_nseriesc                    s   |d t jkr2td td| jd   |||S |d t jkrjttdd td| jd   |||S tt	| 
||||S d S )Nr   rn   rx   r_   )r   r   r   r   r9   r   r   r   r  r   r  r  r  r3   r4   r  |  s
    $*zacot._eval_aseriesc                 K   s.   t jd tdt j|  tdt j|    S r   )r   r1   r"   rZ  r3   r3   r4   r    s    zacot._eval_rewrite_as_logc                 C   s   t S r;  r[  r   r3   r3   r4   r=    s    zacot.inversec                 K   s@   |t d|d   td tt |d  t |d  d    S r:  r  r   r3   r3   r4   r    s    *zacot._eval_rewrite_as_asinc                 K   s8   |t d|d   tt |d  t |d  d   S r:  r  r   r3   r3   r4   r    s    zacot._eval_rewrite_as_acosc                 K   s   t d| S r   r<  r   r3   r3   r4   r    s    zacot._eval_rewrite_as_atanc                 K   s0   |t d|d   tt d|d  |d   S r:  r  r   r3   r3   r4   r    s    zacot._eval_rewrite_as_asecc                 K   s8   |t d|d   td tt d|d  |d    S r:  r  r   r3   r3   r4   r    s    zacot._eval_rewrite_as_acsc)rx   )Nr   )r   )rx   )rY   rZ   r[   r\   r   r1   r^   r   r?   r  r  r  r  r   r  r   r   r  r   r  r  r  r=  r  r  r  r  r  r  r3   r3   r  r4   r   
  s.   *

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dZd"ddZdd Zdd ZeZdd Zdd Zdd Zdd Zdd ZdS )#r   a  
    The inverse secant function.

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

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

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

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

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

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

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

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

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

    Examples
    ========

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

    See Also
    ========

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

    References
    ==========

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

    c                 C   s  |j rtjS |jr@|tjkr"tjS |tjkr2tjS |tjkr@tS |tj	tj
tjfkr\td S |jr|  }||krtd ||  S | |krtd ||   S |j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  )r;   r   r]   r   r   r{   rK   r   r   r   r   r  r  r  r0   r   r9   r  r   r   r   r   Z
acsc_tabler  r3   r3   r4   r     s<    






z	asec.evalrx   c                 C   sB   |dkr4d| j d d tdd| j d d     S t| |d S r  r9   r%   r   r   r3   r3   r4   r     s    ,z
asec.fdiffc                 C   s   t S r;  r7  r   r3   r3   r4   r=  	  s    zasec.inversec                 G   s   | dkrt jtd|  S | dk s.| d dkr4t jS t|}t|dkr| dkr|d }|| d | d   |d  d| d d   S | d }tt j||  }t||  d |  d }t j | | ||   d S d S Nr   rn   rx   r   r`   )	r   r1   r"   rK   r   r   r   rq   r   r  r3   r3   r4   r     s    ,zasec.taylor_termNr   c                 C   s   | j d }||d }|dkr>tdt|tj | S |tj tjfkrf| t	j
|||dS |jrd|d  jr|||r|nd}t|jr|jr| | S n>t|jr|jrdt | | S n| t	j
|||d S | |S r  )r9   r   r  r%   r   r{   r	  rK   r   r"   r  rh  r  r  r    r  r8   r   rJ   r  r3   r3   r4   r  !  s     


zasec._eval_as_leading_termc                 C   s<  ddl m} | jd |d}|tjkrtddd}ttj|d  t	
|dd| }tj| jd  }	|	|}
|	|
 |
 }ttj| j|||d}| t|
  }| ||  ||| | S |tjk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kr|S |jr8d|d  jr8| jd ||r|nd}t|jr|jr8| S n:t|jr |jr8dt | S n| t	j||||d	S |S 
Nr   r  rz  Tr  rn   rE  rx   r  )r  r  r9   r   r   r{   r   r   r   r"   r  r   r	  r%   r   r  rJ   r  r   r]   rh  r  r  r    r  r   r  r3   r3   r4   r   6  sB    
&
&&
&zasec._eval_nseriesc                 C   s2   | j d }|jdkrdS t|d j| d jfS r  )r9   rI   r   r  r  r3   r3   r4   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   r3   r3   r4   r  d  s    zasec._eval_rewrite_as_logc                 K   s   t d td|  S r   r  r   r3   r3   r4   r  i  s    zasec._eval_rewrite_as_asinc                 K   s   t d| S r   )r   r   r3   r3   r4   r  l  s    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sx2xr3   r3   r4   r  o  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  r3   r3   r4   r  s  s    zasec._eval_rewrite_as_acotc                 K   s   t d t| S r   r  r   r3   r3   r4   r  w  s    zasec._eval_rewrite_as_acsc)rx   )rx   )Nr   )r   )rY   rZ   r[   r\   r  r   r   r=  r  r   r   r  r   r  r  r  r  r  r  r  r  r3   r3   r3   r4   r     s$   ;
%



(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dZd ddZdd ZeZdd Zdd Zdd Zdd Zdd ZdS )!r   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   s>  |j rtjS |jrH|tjkr"tjS |tjkr4td S |tjkrHt d S |tjtj	tjfkrbtj
S | rv| |  S |jrtj
S |jr|  }||k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r:|jd }|jr:td t| S d S r  )r;   r   r]   r   r   r{   r   r   r   r   rK   r   r  r  r  r0   r   r9   r  r   r   r  r3   r3   r4   r     sD    






z	acsc.evalrx   c                 C   sB   |dkr4d| j d d tdd| j d d     S t| |d S r  r  r   r3   r3   r4   r     s    ,z
acsc.fdiffc                 C   s   t S r;  r   r   r3   r3   r4   r=    s    zacsc.inversec                 G   s   | dkr,t d tjtd  tjt|  S | dk s@| d dkrFtjS t|}t|dkr| dkr|d }|| d | d   |d  d| d d   S | d }ttj||  }t	||  d |  d }tj| | ||   d S d S r  )
r   r   r1   r"   rK   r   r   r   rq   r   r  r3   r3   r4   r     s    $,zacsc.taylor_termNr   c                 C   s   | j d }||d }|tj tjtjfkrJ| tj|||d	 S |tj
krbd| |S |jrd|d  jr|||r|nd}t|jr|jrt| | S n<t|jr|jrt | | S n| tj|||d	 S | |S r  )r9   r   r  r   r{   rK   r   r"   r  rJ   r]   r	  rh  r  r  r    r  r   r8   r  r3   r3   r4   r    s     



zacsc._eval_as_leading_termc                 C   s<  ddl m} | jd |d}|tjkrtddd}ttj|d  t	
|dd| }tj| jd  }	|	|}
|	|
 |
 }ttj| j|||d}| t|
  }| ||  ||| | S |tjk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kr|S |jr8d|d  jr8| jd ||r|nd}t|jr |jr8t| S n8t|jr |jr8t | S n| t	j||||d	S |S r  )r  r  r9   r   r   r{   r   r   r   r"   r  r   r	  r%   r   r  rJ   r  r   r]   rh  r  r  r    r  r   r  r3   r3   r4   r     sB    
&
&&
&
zacsc._eval_nseriesc                 K   s*   t j tt j| tdd|d     S r:  r  r   r3   r3   r4   r  .  s    zacsc._eval_rewrite_as_logc                 K   s   t d| S r   )r   r   r3   r3   r4   r  3  s    zacsc._eval_rewrite_as_asinc                 K   s   t d td|  S r   r  r   r3   r3   r4   r  6  s    zacsc._eval_rewrite_as_acosc                 K   s,   t |d | td tt |d d   S r   r  rZ  r3   r3   r4   r  9  s    zacsc._eval_rewrite_as_atanc                 K   s0   t |d | td tdt |d d    S r   r  r   r3   r3   r4   r  <  s    zacsc._eval_rewrite_as_acotc                 K   s   t d t| S r   r  r   r3   r3   r4   r  ?  s    zacsc._eval_rewrite_as_asec)rx   )rx   )Nr   )r   )rY   rZ   r[   r\   r  r   r   r=  r  r   r   r  r   r  r  r  r  r  r  r  r3   r3   r3   r4   r   {  s"   *
,



(r   c                       s\   e Zd ZdZedd Zdd Zdd Zdd	 Zd
d Z	dd Z
dd Z fddZ  ZS )r   a
  
    The function ``atan2(y, x)`` computes `\operatorname{atan}(y/x)` taking
    two arguments `y` and `x`.  Signs of both `y` and `x` are considered to
    determine the appropriate quadrant of `\operatorname{atan}(y/x)`.
    The range is `(-\pi, \pi]`. The complete definition reads as follows:

    .. math::

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

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

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

    .. math::

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

    Examples
    ========

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

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

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

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

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

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

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

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

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

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

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

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

    See Also
    ========

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

    References
    ==========

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

    c                 C   s  ddl m} |tjkr8|jr tS dt |t| t S |tjkrHtjS |j	rp|j	rp|j
rp|j
rpt|}t|}|jr|jr|jrt|| S |jr|jrt|| t S |jrt|| t S n0|jr|jrtd S |jrt d S |jrtjS |jrD|jrttj||  S |j
rDt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 )Nr   )	Heavisidern   T)Z'sympy.functions.special.delta_functionsr  r   r   r;   r   r!   r   rK   rj  r  r    rI   r  r   r  r  r   Zis_extended_nonzeror{   r(   r   r1   r"   r%   )r   r   r   r  r3   r3   r4   r     sJ    


 z
atan2.evalc                 K   s.   t j t|t j|  t|d |d    S r   r  r=   r   r   r   r3   r3   r4   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   r  r3   r3   r4   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   )rI   arg_fr   r1   r%   r"   rP   )r=   r   r   r   r   r   r3   r3   r4   _eval_rewrite_as_arg  s
    zatan2._eval_rewrite_as_argc                 C   s   | j d jo| j d jS r  r  r   r3   r3   r4   r    s    zatan2._eval_is_extended_realc                 C   s    |  | jd  | jd  S r  r   r   r3   r3   r4   r     s    zatan2._eval_conjugatec                 C   sR   | j \}}|dkr&||d |d   S |dkrD| |d |d   S t| |d S r:  r  )r=   r   r   r   r3   r3   r4   r     s    
zatan2.fdiffc                    s&   | j \}}|jr"|jr"t |S d S r   )r9   rI   r  _eval_evalf)r=   precr   r   r  r3   r4   r    s    
zatan2._eval_evalf)rY   rZ   r[   r\   r  r   r  r  r  r  r   r   r  r  r3   r3   r  r4   r   C  s   f
'r   )rx   )_typingr   r  r   ZtUnionZ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   re  r   r  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/   r5   r6   rm   rw   r}   rA   r   r   r   r   rt  r   r   r   r  r   r   r   r   r   r   r   r3   r3   r3   r4   <module>   sv   D
%K  8  i  R  ;xee|Q g e V [ [ I