B
    [1Y                @   sF  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mZ d dlmZmZ d dlmZmZ d d	lmZmZ d d
lmZmZmZ d dlmZm Z  d dl!m"Z" d dl#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+ d dl,m-Z- d dl.m/Z/ d dl0m1Z1 d dl2m3Z3 d dl4m5Z5 G dd de	Z6dd Z7d;ddZ8G dd de6Z9G dd de6Z:G dd de6Z;G d d! d!e6Z<G d"d# d#e6Z=G d$d% d%e=Z>G d&d' d'e=Z?G d(d) d)e	Z@G d*d+ d+e	ZAG d,d- d-eAZBG d.d/ d/eAZCG d0d1 d1eAZDG d2d3 d3eAZEG d4d5 d5eAZFG d6d7 d7eAZGG d8d9 d9eAZHd:S )<    )print_functiondivision)Add)sympifycacheit)FunctionArgumentIndexError)igcdexRationalpi)S)SymbolWild)	fuzzy_notfuzzy_or)	factorialRisingFactorial)sqrtMinMax)logexp)floor)acothasinhatanhcoshcothHyperbolicFunctionsinhtanh)	FiniteSet)numbered_symbols)range)Ne)	Piecewisec               @   sB   e Zd ZdZdZdd Zdd ZdddZdd	d
ZdddZ	dS )TrigonometricFunctionz(Base class for trigonometric functions. Tc             C   sD   | j | j }|j | j kr:|jd jr@t|jd jr@dS n|jS d S )Nr   F)funcargsis_rationalr   is_zero)selfs r-   Glib/python3.7/site-packages/sympy/functions/elementary/trigonometric.py_eval_is_rational    s
    z'TrigonometricFunction._eval_is_rationalc             C   sd   | j | j }|j | j krZt| jd jr8| jd jr8dS t| jd }|d k	r`|jr`dS n|jS d S )Nr   FT)r'   r(   r   r*   Zis_algebraic	_pi_coeffr)   )r+   r,   pi_coeffr-   r-   r.   _eval_is_algebraic(   s    z(TrigonometricFunction._eval_is_algebraicc             K   s&   | j f d|i|\}}||tj  S )Ndeep)as_real_imagr   ImaginaryUnit)r+   r3   hintsZre_partZim_partr-   r-   r.   _eval_expand_complex3   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)r(   is_realexpandr   Zeror4   )r+   r3   r6   reimr-   r-   r.   _as_real_imag7   s    z#TrigonometricFunction._as_real_imagNc       	      C   s   | j d }|d kr t|jd }||s0tjS ||kr<|S ||jkrtdtd }}|jr||\}}||kr|t	| S |j
r||\}}|j|dd\}}||kr|t	| S tdd S )Nr   pqF)Zas_Addz%Use the periodicity function instead.)r(   tuplefree_symbolshasr   r;   r   is_MulZas_independentabsis_AddNotImplementedError)	r+   Zgeneral_periodsymbolfr?   r@   ghar-   r-   r.   _periodD   s&    


zTrigonometricFunction._period)T)T)N)
__name__
__module____qualname____doc__Z
unbranchedr/   r2   r7   r>   rM   r-   r-   r-   r.   r&      s   

r&   c             C   s   xTt | D ]<}|tjkr$tj}P q|jr| \}}|tjkr|jrP qW | tjfS |tj	 tj }|tj | }| | |fS )a  
    Split ARG into two parts, a "rest" and a multiple of pi/2.
    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 as peel
    >>> from sympy import pi
    >>> from sympy.abc import x, y
    >>> peel(x + pi/2)
    (x, pi/2)
    >>> peel(x + 2*pi/3 + pi*y)
    (x + pi*y + pi/6, pi/2)
    )
r   Z	make_argsr   PiOnerD   as_two_termsis_Rationalr;   Half)argrL   Kr?   Zm1Zm2r-   r-   r.   _peeloff_pi_   s    

rY      c             C   s  t | } | tjkrtjS | s"tjS | jr| tj}|r| \}}|jrt	|d }|dkrt
tt|d  }d| }|| }t
|}	|	|krt|	|}|| }ntt
|}|| }|jr|d }
|
dkr|S |
 s|jdk	rtjS tdS |
| S |S dS )a  
    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 as coeff
    >>> from sympy import pi, Dummy
    >>> from sympy.abc import x, y
    >>> coeff(3*x*pi)
    3*x
    >>> coeff(11*pi/7)
    11/7
    >>> coeff(-11*pi/7)
    3/7
    >>> coeff(4*pi)
    0
    >>> coeff(5*pi)
    1
    >>> coeff(5.0*pi)
    1
    >>> coeff(5.5*pi)
    3/2
    >>> coeff(2 + pi)

    >>> coeff(2*Dummy(integer=True)*pi)
    2
    >>> coeff(2*Dummy(even=True)*pi)
    0
    rZ   r      N)r   r   rR   rS   r;   rD   coeffas_coeff_MulZis_FloatrE   introundr   Zevalfr
   
is_integeris_even)rW   ZcyclescxcxrI   r?   mcmiZc2r-   r-   r.   r0      s>    $



r0   c               @   s   e Zd ZdZd/ddZd0ddZedd	 Zee	d
d Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd 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S )2sina  
    The sine function.

    Returns the sine of x (measured in radians).

    Notes
    =====

    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] http://en.wikipedia.org/wiki/Trigonometric_functions
    .. [2] http://dlmf.nist.gov/4.14
    .. [3] http://functions.wolfram.com/ElementaryFunctions/Sin
    .. [4] http://mathworld.wolfram.com/TrigonometryAngles.html
    Nc             C   s   |  dt |S )Nr[   )rM   r   )r+   rH   r-   r-   r.   period   s    z
sin.periodrZ   c             C   s$   |dkrt | jd S t| |d S )NrZ   r   )cosr(   r   )r+   argindexr-   r-   r.   fdiff   s    z	sin.fdiffc             C   s  ddl m} ddlm} |jr\|tjkr.tjS |tjkr>tjS |tjksR|tj	kr\|ddS |tj
krltjS t||r|j|j }}t|dtj  }|tj	k	r||d tj  }|tjk	r||d tj  }|||ttjd dtj d tjk	r:|||tdtj d d	tj d tjk	r:|ddS |||ttjd dtj d tjk	r|tt|t|dS |||tdtj d d
tj d tjk	r|dtt|t|S |tt|t|tt|t|S nt||r|| S | r| |  S |tj}|d k	rBtjt| S t|}|d k	r`|jrbtjS d| jr|jr|tjS |jdkrtj|tj  S |j s|tj }	|	|kr| |	S d S |j r`|d }
|
dkr| |
d tj  S d|
 dkr| d|
 tj S |t!dd d tj }	t"|	}t|t"s>|S |tj |kr\| |tj S d S |j#rt$|\}
}|rt|t"|
 t"|t|
  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|t-r|j&d }
t(dd|
d   S d S )Nr   )AccumBounds)SetExprrZ   r[               F).Zsympy.calculusrm   sympy.sets.setexprrn   	is_Numberr   NaNr;   InfinityNegativeInfinityComplexInfinity
isinstanceminmaxr   rR   intersectionr!   ZEmptySetr   rh   r   
_eval_funccould_extract_minus_signas_coefficientr5   r   r0   r`   ra   NegativeOnerV   rU   r
   rj   rF   rY   asinr(   atanr   atan2acosacotacscasec)clsrW   rm   rn   r{   r|   di_coeffr1   nargrd   resultre   yr-   r-   r.   eval   s    





$

$
(







 






zsin.evalc             G   sp   | dk s| d dkrt jS t|}t|dkrP|d }| |d  | | d   S d| d  ||   t|  S d S )Nr   r[   rZ   ro   )r   r;   r   lenr   )nrd   previous_termsr?   r-   r-   r.   taylor_termo  s    zsin.taylor_termc             C   sR   t j}t|tst|tr0||jd t}t|| t| |  d|  S )Nr   r[   )	r   r5   rz   r&   r   r'   r(   rewriter   )r+   rW   Ir-   r-   r.   _eval_rewrite_as_exp}  s    zsin._eval_rewrite_as_expc             C   s@   t |tr<tj}|jd }|||   d |||  d  S d S )Nr   r[   )rz   r   r   r5   r(   )r+   rW   r   rd   r-   r-   r.   _eval_rewrite_as_Pow  s    

zsin._eval_rewrite_as_Powc             C   s   t |tjd  ddS )Nr[   F)evaluate)rj   r   rR   )r+   rW   r-   r-   r.   _eval_rewrite_as_cos  s    zsin._eval_rewrite_as_cosc             C   s"   t tj| }d| d|d   S )Nr[   rZ   )tanr   rV   )r+   rW   tan_halfr-   r-   r.   _eval_rewrite_as_tan  s    zsin._eval_rewrite_as_tanc             C   s   t |t| t| S )N)rh   rj   )r+   rW   r-   r-   r.   _eval_rewrite_as_sincos  s    zsin._eval_rewrite_as_sincosc             C   s"   t tj| }d| d|d   S )Nr[   rZ   )cotr   rV   )r+   rW   cot_halfr-   r-   r.   _eval_rewrite_as_cot  s    zsin._eval_rewrite_as_cotc             C   s   |  t tS )N)r   rj   pow)r+   rW   r-   r-   r.   _eval_rewrite_as_pow  s    zsin._eval_rewrite_as_powc             C   s   |  t tS )N)r   rj   r   )r+   rW   r-   r-   r.   _eval_rewrite_as_sqrt  s    zsin._eval_rewrite_as_sqrtc             C   s   dt | S )NrZ   )csc)r+   rW   r-   r-   r.   _eval_rewrite_as_csc  s    zsin._eval_rewrite_as_cscc             C   s   dt |tjd  dd S )NrZ   r[   F)r   )secr   rR   )r+   rW   r-   r-   r.   _eval_rewrite_as_sec  s    zsin._eval_rewrite_as_secc             C   s   |t | S )N)sinc)r+   rW   r-   r-   r.   _eval_rewrite_as_sinc  s    zsin._eval_rewrite_as_sincc             C   s   |  | jd  S )Nr   )r'   r(   	conjugate)r+   r-   r-   r.   _eval_conjugate  s    zsin._eval_conjugateTc             K   s8   | j f d|i|\}}t|t| t|t| fS )Nr3   )r>   rh   r   rj   r   )r+   r3   r6   r<   r=   r-   r-   r.   r4     s    zsin.as_real_imagc             K   s$  ddl m} ddlm}m} | jd }d }|jr| \}}t|dd	 }t|dd	 }	t
|dd	 }
t
|dd	 }|| |	|
  S |jdd\}}|jr|jrd|d	 d
  ||t| S |d|d
 d	  t
| ||d	 t| ddS t|}|d k	r|jr| tS t|S )Nr   )
expand_mul)
chebyshevt
chebyshevuF)r   T)rationalro   rZ   r[   )r3   )sympyr   #sympy.functions.special.polynomialsr   r   r(   rF   rT   rh   _eval_expand_trigrj   r]   
is_IntegerZis_oddr0   rU   r   r   )r+   r6   r   r   r   rW   rd   r   sxsyrb   cyr   r1   r-   r-   r.   r     s,    


zsin._eval_expand_trigc             C   sH   ddl m} | jd |}||jkr:|d||r:|S | |S d S )Nr   )OrderrZ   )r   r   r(   as_leading_termrB   containsr'   )r+   rd   r   rW   r-   r-   r.   _eval_as_leading_term  s
    zsin._eval_as_leading_termc             C   s   | j d jrdS d S )Nr   T)r(   r9   )r+   r-   r-   r.   _eval_is_real  s    zsin._eval_is_realc             C   s   | j d }|jrdS d S )Nr   T)r(   r9   )r+   rW   r-   r-   r.   _eval_is_finite  s    
zsin._eval_is_finite)N)rZ   )T)rN   rO   rP   rQ   ri   rl   classmethodr   staticmethodr   r   r   r   r   r   r   r   r   r   r   r   r   r   r4   r   r   r   r   r-   r-   r-   r.   rh      s.   -

o
	rh   c               @   s   e Zd ZdZd-ddZd.ddZedd	 Zee	d
d Z
dd Zdd 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d)d* Zd+d, ZdS )0rj   a  
    The cosine function.

    Returns the cosine of x (measured in radians).

    Notes
    =====

    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] http://en.wikipedia.org/wiki/Trigonometric_functions
    .. [2] http://dlmf.nist.gov/4.14
    .. [3] http://functions.wolfram.com/ElementaryFunctions/Cos
    Nc             C   s   |  dt |S )Nr[   )rM   r   )r+   rH   r-   r-   r.   ri   	  s    z
cos.periodrZ   c             C   s&   |dkrt | jd  S t| |d S )NrZ   r   )rh   r(   r   )r+   rk   r-   r-   r.   rl     s    z	cos.fdiffc          	   C   sj  ddl m} ddlm} ddlm} |jrh|tjkr:tjS |tj	krJtj
S |tjks^|tjkrh|ddS |tjkrxtjS t||rt|tjd  S t||r|| S | r| | S |tj}|d k	rt|S t|}|d k	r"|jrtj| S d| jr,|jrtj|d  S |jdkr,tj	S |jsT|tj }||krP| |S d S tjtd	d d
 d}|jr|j}	|jd|	  }
|
|	kr|d tj }| | S d|
 |	krd| tj }| | S ddddddddd}|	|krt|
tj ||	 d  |
tj ||	 d   }}| || | }}d |ksDd |krHd S || | tjd | | tjd |   S |	dkrd S |	|kr||j }||j| S d|	d kr|d tj }| |}d |krd S d| d d }d|dk rdndt t!|  }|td| d  S d S |j"r\t#|\}}|r\t$|t$| t|t|  S t|t%rr|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+rH|j&d }tdd|d   S t|t,rf|j&d }d| S d S )Nr   )r   )rm   )rn   ro   rZ   r[   Frp      )rq   rp   )rq   r   )r   rp   )rp      )r   
   )r   rs   )rs   r   )      )(   <   )   r   r         r   r   x   r   )-r   r   sympy.calculus.utilrm   rt   rn   ru   r   rv   r;   rS   rw   rx   ry   rz   rh   rR   r~   r   r   r5   r   r0   r`   r   ra   rU   rV   r   r@   r?   r:   r^   rE   rF   rY   rj   r   r(   r   r   r   r   r   r   )r   rW   r   rm   rn   r   r1   r   cst_table_somer@   r?   table2rL   bnvalanvalbZctsnvalrd   sign_cosre   r   r-   r-   r.   r     s    
















.,



" 






zcos.evalc             G   sp   | dk s| d dkrt jS t|}t|dkrP|d }| |d  | | d   S d| d  ||   t|  S d S )Nr   r[   rZ   r   ro   )r   r;   r   r   r   )r   rd   r   r?   r-   r-   r.   r     s    zcos.taylor_termc             C   sN   t j}t|tst|tr0||jd t}t|| t| |  d S )Nr   r[   )	r   r5   rz   r&   r   r'   r(   r   r   )r+   rW   r   r-   r-   r.   r     s    zcos._eval_rewrite_as_expc             C   s8   t |tr4tj}|jd }|| d ||  d  S d S )Nr   r[   )rz   r   r   r5   r(   )r+   rW   r   rd   r-   r-   r.   r     s    

zcos._eval_rewrite_as_Powc             C   s   t |tjd  ddS )Nr[   F)r   )rh   r   rR   )r+   rW   r-   r-   r.   _eval_rewrite_as_sin  s    zcos._eval_rewrite_as_sinc             C   s"   t tj| d }d| d|  S )Nr[   rZ   )r   r   rV   )r+   rW   r   r-   r-   r.   r     s    zcos._eval_rewrite_as_tanc             C   s   t |t| t | S )N)rh   rj   )r+   rW   r-   r-   r.   r     s    zcos._eval_rewrite_as_sincosc             C   s"   t tj| d }|d |d  S )Nr[   rZ   )r   r   rV   )r+   rW   r   r-   r-   r.   r     s    zcos._eval_rewrite_as_cotc             C   s
   |  |S )N)r   )r+   rW   r-   r-   r.   r     s    zcos._eval_rewrite_as_powc                s<  ddl m} fdddfdd	}t|}|d kr:d S |jrP| |tj S |jsZd S dd }tjt	d	d
 d t	dt	d d t	dt	dt	d t	t	ddt	dt	d  d
t	d t	dt	d    dt	d  d   d  | d  fdd}|j
 kr:||j |j
 }|j
dk r6| }|S |j
d s|d }t|tj t	}	|d
 d }
t|
d rdnd
}|t	d
|	 d  S ||j
}|r|||}dd t|tdD }ttdd |D  |}|t	S ||}dd t|tdD }ttdd |D  |}|S d S )Nr   )r   c                s   t | dkrd| d fS t | dkr6t| d | d S | dd  }t| d |d \} }t|g fdd|dd D  |g S )NrZ   r   r[   ro   c                s   g | ]} | qS r-   r-   ).0rg   )vr-   r.   
<listcomp>  s    z>cos._eval_rewrite_as_sqrt.<locals>.migcdex.<locals>.<listcomp>)r   r	   rA   )rd   rJ   urK   )migcdex)r   r.   r     s    z*cos._eval_rewrite_as_sqrt.<locals>.migcdexc                s   ddl m} ttrS tts,tdj djj krHjS d |krn fdd|j D }n fdd|D }t|dkrgS |}fd	dt	|d d
 |D }t
|kst|S )Nr   )	factorintzr is not rationalr[   c                s   g | ]\}} ||  qS r-   r-   )r   rd   r   )r   r-   r.   r     s    z@cos._eval_rewrite_as_sqrt.<locals>.ipartfrac.<locals>.<listcomp>c                s   g | ]} | qS r-   r-   )r   rd   )r   r-   r.   r     s    rZ   c                s&   g | ]\}} j t||  j qS r-   )r?   r
   r@   )r   rg   j)rr-   r.   r     s    ro   )Zsympy.ntheoryr   rz   r^   r
   	TypeErrorr@   itemsr   zipsumAssertionError)r   Zfactorsr   rL   rK   Zans)r   )r   r   r.   	ipartfrac  s"    

 z,cos._eval_rewrite_as_sqrt.<locals>.ipartfracc        )      S   s  dd } dd }| dd\}}| |d\}}| |d\}}| |dd	| d
|   \}}	| |dd	| d
|   \}
}| |dd	| d
|   \}}| |dd	| d
|   \}}| |d|| | d
|
   \}}| |d|| | d
|   \}}| |d|| |	 d
|   \}}| |d|| |
 d
|   \}}| |	d||	 | d
|   \}}| |
d||
 | d
|   \}}| |d|| | d
|   \}}| |d|| | d
|	   \}}||d|| | |  } ||d|| | |  }!||d|| | |  }"||d|| | |  }#||d|| | |  }$||d|| | |  }%||  d|!|"   }&||# d|$|%   }'d||& d|'  }(t t d
t |(d  d tj S )a2   Express cos(pi/257) explicitly as a function of radicals
                Based upon the equations in
                http://math.stackexchange.com/questions/516142/how-does-cos2-pi-257-look-like-in-real-radicals
                See also http://www.susqu.edu/brakke/constructions/257-gon.m.txt
            c             S   s0   | t | d |  d | t | d |  d fS )Nr[   )r   )rL   r   r-   r-   r.   f1   s    z8cos._eval_rewrite_as_sqrt.<locals>._cospi257.<locals>.f1c             S   s   | t | d |  d S )Nr[   )r   )rL   r   r-   r-   r.   f2  s    z8cos._eval_rewrite_as_sqrt.<locals>._cospi257.<locals>.f2ro      @   r   rp   r[   r   rs   )r   r   rV   ))r   r   Zt1Zt2Zz1Zz3Zz2Zz4Zy1Zy5Zy6Zy2Zy3Zy7Zy8Zy4Zx1Zx9Zx2Zx10Zx3Zx11Zx4Zx12Zx5Zx13Zx6Zx14Zx15Zx7Zx8Zx16Zv1Zv2Zv3Zv4Zv5Zv6Zu1Zu2Zw1r-   r-   r.   	_cospi257  s6    """"""""z,cos._eval_rewrite_as_sqrt.<locals>._cospi257rp   rZ   r   r          r[   ir   "   )rq   rp   r   i  c                sJ   g }x@ D ]8}t | |\}}|dkr
|} || | dkr
t|S q
W dS )Nr   rZ   F)divmodappendrA   )r   ZprimesZp_iZquotientZ	remainder)r   r-   r.   _fermatCoords,  s    

z0cos._eval_rewrite_as_sqrt.<locals>._fermatCoordsi  ro   c             S   s"   g | ]}|d  |d t j fqS )rZ   r   )r   rR   )r   rd   r-   r-   r.   r   J  s    z-cos._eval_rewrite_as_sqrt.<locals>.<listcomp>zc             S   s   g | ]}|d  qS )r   r-   )r   rd   r-   r-   r.   r   K  s    c             S   s"   g | ]}|d  |d t j fqS )rZ   r   )r   rR   )r   rd   r-   r-   r.   r   O  s    c             S   s   g | ]}|d  qS )r   r-   )r   rd   r-   r-   r.   r   P  s    )N)r   r   r0   r`   r'   r   rR   rU   rV   r   r@   r?   r:   rj   r   r^   r   r"   r   r   subs)r+   rW   r   r   r1   r   r   rvZpico2r   rd   r   ZFCZdecompXZpclsr-   )r   r   r.   r     sL    'j


 
 zcos._eval_rewrite_as_sqrtc             C   s   dt | S )NrZ   )r   )r+   rW   r-   r-   r.   r   S  s    zcos._eval_rewrite_as_secc             C   s   dt || S )NrZ   )r   r   )r+   rW   r-   r-   r.   r   V  s    zcos._eval_rewrite_as_cscc             C   s   |  | jd  S )Nr   )r'   r(   r   )r+   r-   r-   r.   r   Y  s    zcos._eval_conjugateTc             K   s:   | j f d|i|\}}t|t| t| t| fS )Nr3   )r>   rj   r   rh   r   )r+   r3   r6   r<   r=   r-   r-   r.   r4   \  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dd\}
}|
j	r||
t|S t
|}|d k	r|jr| tS t|S )Nr   )r   F)r   T)r   )r   r   r(   rF   rT   rh   r   rj   r]   r   r0   rU   r   r   )r+   r6   r   rW   rd   r   r   r   rb   r   r\   termsr1   r-   r-   r.   r   `  s$    

zcos._eval_expand_trigc             C   sJ   ddl m} | jd |}||jkr<|d||r<tjS | |S d S )Nr   )r   rZ   )	r   r   r(   r   rB   r   r   rS   r'   )r+   rd   r   rW   r-   r-   r.   r   u  s
    zcos._eval_as_leading_termc             C   s   | j d jrdS d S )Nr   T)r(   r9   )r+   r-   r-   r.   r   ~  s    zcos._eval_is_realc             C   s   | j d }|jrdS d S )Nr   T)r(   r9   )r+   rW   r-   r-   r.   r     s    
zcos._eval_is_finite)N)rZ   )T)rN   rO   rP   rQ   ri   rl   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r4   r   r   r   r   r-   r-   r-   r.   rj     s0   )

  
	rj   c               @   s   e Zd ZdZd1ddZd2ddZd3dd	Zed
d Ze	e
dd Zdd Zdd Zdd Zd4d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/d0 ZdS )5r   a  
    The tangent function.

    Returns the tangent of x (measured in radians).

    Notes
    =====

    See :func:`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] http://en.wikipedia.org/wiki/Trigonometric_functions
    .. [2] http://dlmf.nist.gov/4.14
    .. [3] http://functions.wolfram.com/ElementaryFunctions/Tan
    Nc             C   s   |  t|S )N)rM   r   )r+   rH   r-   r-   r.   ri     s    z
tan.periodrZ   c             C   s$   |dkrt j| d  S t| |d S )NrZ   r[   )r   rS   r   )r+   rk   r-   r-   r.   rl     s    z	tan.fdiffc             C   s   t S )z7
        Returns the inverse of this function.
        )r   )r+   rk   r-   r-   r.   inverse  s    ztan.inversec          	   C   sL  ddl m} |jrT|tjkr"tjS |tjkr2tjS |tjksF|tjkrT|tjtjS |tjkrdtjS t	||r|j
|j }}t|tj }|tjk	r||tj  }|tjk	r||tj  }|||ttjd dtj d r|tjtjS |t|t|S | r| |  S |tj}|d k	r<tjt| S t|d}|d k	r|jr^tjS |js|tj }||kr| |S d S |jr|jd s|tj d }t|t|tjd   }	}
t	|	tst	|
ts|
dkrtjS d|	 |
 S dddd	d
dddd}|j}|j| }||kr| |tj || d  | |tj || d   }}d |ksrd |krvd S || d||   S |tj d tj tj }t|t|tjd   }	}
t	|	tst	|
ts|	dkrtjS |
|	 S ||kr| |S |jrBt|\}}|rBt|}|tjkr:t| S t|S t	|trX|j d S t	|t!rv|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&r|j d }dt#dd|d   |  S t	|t'rH|j d }t#dd|d   | S d S )Nr   )rm   r[   rq   rZ   )rq   r   )r   rp   )rp   r   )r   r   )r   rs   )rs   r   )r   r   )r   r   )r   r   r   r   r   r   r   r   )(r   rm   ru   r   rv   r;   rw   rx   ry   rz   r{   r|   r   rR   r}   r!   r   r   r   r5   r    r0   r`   rU   r@   rj   r?   rV   rF   rY   r   r   r(   r   r   r   r   r   r   r   )r   rW   rm   r{   r|   r   r   r1   r   cresultsresultr   r@   r?   r   r   rd   re   Ztanmr   r-   r-   r.   r     s    




&








6









ztan.evalc             G   s   ddl m} | dk s | d dkr&tjS t|}| d d d| d   }}|| d }t| d }d| | |d  | | ||   S d S )Nr   )	bernoullir[   rZ   ro   )r   r   r   r;   r   r   )r   rd   r   r   rL   r   BFr-   r-   r.   r   3  s    ztan.taylor_termc             C   sN   | j d |dd tj }|r<|jr<| tj|||dS tj| |||dS )Nr   r[   )r   logx)	r(   limitr   rR   r   r   rj   _eval_nseriesr   )r+   rd   r   r   rg   r-   r-   r.   r   C  s    
ztan._eval_nseriesc             C   sF   t |trBtj}|jd }|||  ||   ||  ||   S d S )Nr   )rz   r   r   r5   r(   )r+   rW   r   rd   r-   r-   r.   r   I  s    

ztan._eval_rewrite_as_Powc             C   s   |  | jd  S )Nr   )r'   r(   r   )r+   r-   r-   r.   r   O  s    ztan._eval_conjugateTc             K   sh   | j f d|i|\}}|rTtd| td|  }td| | td| | fS | |tjfS d S )Nr3   r[   )r>   rj   r   rh   r   r'   r   r;   )r+   r3   r6   r<   r=   denomr-   r-   r.   r4   R  s
     ztan.as_real_imagc                sb  ddl m}m} | jd }d }|jrddl m} t|j}g }x(|jD ]}t|dd }	|	|	 qFW t
d  fddt|D }
ddg}xBt|d	 D ]2}|d	|d
    |||
d|d d
   7  < qW |d |d	  tt|
|S |jdd\}}|jrZ|d	krZtj}tddd}d	||  |  }|||| |t|fgS t|S )Nr   )r=   r<   )symmetric_polyF)r   Yc                s   g | ]}t  qS r-   )next)r   rg   )Ygr-   r.   r   g  s    z)tan._eval_expand_trig.<locals>.<listcomp>rZ   r[   ro   r   T)r   dummy)real)r   r=   r<   r(   rF   r   r   r   r   r   r"   r#   r   listr   r]   r   r   r5   r   r:   )r+   r6   r=   r<   rW   rd   r   r   ZTXZtxr   r?   rg   r\   r   r   r   Pr-   )r   r.   r   Z  s.    

2  ztan._eval_expand_trigc             C   s`   t j}t|tst|tr0||jd t}t| | t||  }}|||  ||  S )Nr   )	r   r5   rz   r&   r   r'   r(   r   r   )r+   rW   r   neg_exppos_expr-   r-   r.   r   w  s
    ztan._eval_rewrite_as_expc             C   s   dt |d  t d|  S )Nr[   )rh   )r+   rd   r-   r-   r.   r   ~  s    ztan._eval_rewrite_as_sinc             C   s   t |tjd  ddt | S )Nr[   F)r   )rj   r   rR   )r+   rd   r-   r-   r.   r     s    ztan._eval_rewrite_as_cosc             C   s   t |t| S )N)rh   rj   )r+   rW   r-   r-   r.   r     s    ztan._eval_rewrite_as_sincosc             C   s   dt | S )NrZ   )r   )r+   rW   r-   r-   r.   r     s    ztan._eval_rewrite_as_cotc             C   s$   t ||}t||}|| S )N)rh   r   rj   )r+   rW   sin_in_sec_formcos_in_sec_formr-   r-   r.   r     s    ztan._eval_rewrite_as_secc             C   s$   t ||}t||}|| S )N)rh   r   rj   )r+   rW   sin_in_csc_formcos_in_csc_formr-   r-   r.   r     s    ztan._eval_rewrite_as_cscc             C   s"   |  t t}|trd S |S )N)r   rj   r   rC   )r+   rW   r   r-   r-   r.   r     s    
ztan._eval_rewrite_as_powc             C   s"   |  t t}|trd S |S )N)r   rj   r   rC   )r+   rW   r   r-   r-   r.   r     s    
ztan._eval_rewrite_as_sqrtc             C   sH   ddl m} | jd |}||jkr:|d||r:|S | |S d S )Nr   )r   rZ   )r   r   r(   r   rB   r   r'   )r+   rd   r   rW   r-   r-   r.   r     s
    ztan._eval_as_leading_termc             C   s   | j d jS )Nr   )r(   r9   )r+   r-   r-   r.   r     s    ztan._eval_is_realc             C   s   | j d }|jrdS d S )Nr   T)r(   is_imaginary)r+   rW   r-   r-   r.   r     s    
ztan._eval_is_finite)N)rZ   )rZ   )T)rN   rO   rP   rQ   ri   rl   r   r   r   r   r   r   r   r   r   r4   r   r   r   r   r   r   r   r   r   r   r   r   r   r-   r-   r-   r.   r     s0   #


v
	r   c               @   s   e Zd ZdZd3ddZd4ddZd5dd	Zed
d Ze	e
dd Zdd Zdd Zd6ddZdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 ZdS )7r   a  
    The cotangent function.

    Returns the cotangent of x (measured in radians).

    Notes
    =====

    See :func:`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] http://en.wikipedia.org/wiki/Trigonometric_functions
    .. [2] http://dlmf.nist.gov/4.14
    .. [3] http://functions.wolfram.com/ElementaryFunctions/Cot
    Nc             C   s   |  t|S )N)rM   r   )r+   rH   r-   r-   r.   ri     s    z
cot.periodrZ   c             C   s$   |dkrt j| d  S t| |d S )NrZ   r[   )r   r   r   )r+   rk   r-   r-   r.   rl     s    z	cot.fdiffc             C   s   t S )z7
        Returns the inverse of this function.
        )r   )r+   rk   r-   r-   r.   r     s    zcot.inversec          	   C   s  ddl m} |jr2|tjkr"tjS |tjkr2tjS |tjkrBtjS t||r`t|tj	d   S |
 rt| |  S |tj}|d k	rtj t| S t|d}|d k	rT|jrtjS |js|tj	 }||kr| |S d S |jrT|jdkrJ|jd sJ|tj	 d }t|t|tj	d   }}t|tsJt|tsJd| | S ddddd	d
ddd}|j}	|j|	 }
|	|kr| |
tj	 ||	 d  | |
tj	 ||	 d   }}d |ksd |krd S d||  ||  S |tj d tj tj	 }t|t|tj	d   }}t|tsBt|tsB|dkr:tjS || S ||krT| |S |jrt|\}}|rt|}|tjkrt|S t| 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r:|jd }|td|d   S t|trh|jd }tdd|d   | S t|t r|jd }dtdd|d   |  S d S )Nr   )rm   r[   rZ   )rq   r   )r   rp   )rp   r   )r   r   )r   rs   )rs   r   )r   r   )r   r   )r   r   r   r   r   r   r   r   )!r   rm   ru   r   rv   r;   ry   rz   r   rR   r   r   r5   r   r0   r`   rU   r@   rj   r?   rV   rF   rY   r   r   r(   r   r   r   r   r   r   r   )r   rW   rm   r   r1   r   r   r   r   r@   r?   r   r   rd   re   Zcotmr   r-   r-   r.   r     s    








6









zcot.evalc             G   s   ddl m} | dkr dt| S | dk s4| d dkr:tjS t|}|| d }t| d }d| d d  d| d   | | ||   S d S )Nr   )r   rZ   r[   ro   )r   r   r   r   r;   r   )r   rd   r   r   r   r   r-   r-   r.   r   P  s    zcot.taylor_termc             C   sN   | j d |dtj }|r8|jr8| tj|||dS | tj|||dS )Nr   )r   r   )	r(   r   r   rR   r   r   rj   r   r   )r+   rd   r   r   rg   r-   r-   r.   r   `  s    
zcot._eval_nseriesc             C   s   |  | jd  S )Nr   )r'   r(   r   )r+   r-   r-   r.   r   f  s    zcot._eval_conjugateTc             K   sl   | j f d|i|\}}|rXtd| td|  }td|  | td|  | fS | |tjfS d S )Nr3   r[   )r>   rj   r   rh   r   r'   r   r;   )r+   r3   r6   r<   r=   r   r-   r-   r.   r4   i  s
    $zcot.as_real_imagc             C   s`   t j}t|tst|tr0||jd t}t| | t||  }}|||  ||  S )Nr   )	r   r5   rz   r&   r   r'   r(   r   r   )r+   rW   r   r  r  r-   r-   r.   r   q  s
    zcot._eval_rewrite_as_expc             C   sH   t |trDtj}|jd }| ||  ||   ||  ||   S d S )Nr   )rz   r   r   r5   r(   )r+   rW   r   rd   r-   r-   r.   r   x  s    

zcot._eval_rewrite_as_Powc             C   s   t d| dt |d   S )Nr[   )rh   )r+   rd   r-   r-   r.   r   ~  s    zcot._eval_rewrite_as_sinc             C   s   t |t |tjd  dd S )Nr[   F)r   )rj   r   rR   )r+   rd   r-   r-   r.   r     s    zcot._eval_rewrite_as_cosc             C   s   t |t| S )N)rj   rh   )r+   rW   r-   r-   r.   r     s    zcot._eval_rewrite_as_sincosc             C   s   dt | S )NrZ   )r   )r+   rW   r-   r-   r.   r     s    zcot._eval_rewrite_as_tanc             C   s$   t ||}t||}|| S )N)rj   r   rh   )r+   rW   r  r  r-   r-   r.   r     s    zcot._eval_rewrite_as_secc             C   s$   t ||}t||}|| S )N)rj   r   rh   )r+   rW   r
  r	  r-   r-   r.   r     s    zcot._eval_rewrite_as_cscc             C   s"   |  t t}|trd S |S )N)r   rj   r   rC   )r+   rW   r   r-   r-   r.   r     s    
zcot._eval_rewrite_as_powc             C   s"   |  t t}|trd S |S )N)r   rj   r   rC   )r+   rW   r   r-   r-   r.   r     s    
zcot._eval_rewrite_as_sqrtc             C   sL   ddl m} | jd |}||jkr>|d||r>d| S | |S d S )Nr   )r   rZ   )r   r   r(   r   rB   r   r'   )r+   rd   r   rW   r-   r-   r.   r     s
    zcot._eval_as_leading_termc             C   s   | j d jS )Nr   )r(   r9   )r+   r-   r-   r.   r     s    zcot._eval_is_realc                sb  ddl m}m} | jd }d }|jrddl m} t|j}g }x(|jD ]}t|dd }	|	|	 qFW t
d  fddt|D }
ddg}xFt|d	d	D ]6}||| d
   |||
d	|| d d
   7  < qW |d |d  tt|
|S |jdd\}}|jrZ|dkrZtj}tddd}|| |  }|||| |t|fgS t|S )Nr   )r=   r<   )r   F)r   r   c                s   g | ]}t  qS r-   )r   )r   rg   )r   r-   r.   r     s    z)cot._eval_expand_trig.<locals>.<listcomp>ro   r[   r   rZ   T)r   r  )r  )r   r=   r<   r(   rF   r   r   r   r   r   r"   r#   r   r  r   r]   r   r   r5   r   r:   )r+   r6   r=   r<   rW   rd   r   r   ZCXrb   r   r?   rg   r\   r   r   r   r  r-   )r   r.   r     s.    

6  zcot._eval_expand_trigc             C   s   | j d }|jrdS d S )Nr   T)r(   r  )r+   rW   r-   r-   r.   r     s    
zcot._eval_is_finitec             C   sD   | |kr|S | j d }|||}||kr<|tj jr<tjS t|S )Nr   )r(   r   r   rR   r`   ry   r   )r+   oldnewrW   Zargnewr-   r-   r.   
_eval_subs  s    
zcot._eval_subs)N)rZ   )rZ   )T)rN   rO   rP   rQ   ri   rl   r   r   r   r   r   r   r   r   r4   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r-   r-   r-   r.   r     s2   #


i
	r   c               @   s   e Zd ZdZdZdZdZedd Zdd Z	dd Z
d	d
 Zdd Zd-d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d'd( Zd)d* Zd+d, ZdS )/ReciprocalTrigonometricFunctionz@Base class for reciprocal functions of trigonometric functions. Nc             C   sJ  |  r*| jr| | S | jr*| |  S t|}|d k	rd| js|jr|j}|jd|  }||kr~|d tj	 }| | S d| |krd| tj	 }| jr| |S | jr| | S t
|dr| | kr|jd S | j|}|d 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 )Nr[   rZ   r   r   c             s   s   | ]}t |tV  qd S )N)rz   rj   )r   rg   r-   r-   r.   	<genexpr>   s    z7ReciprocalTrigonometricFunction.eval.<locals>.<genexpr>c             s   s   | ]}t |tV  qd S )N)rz   rh   )r   rg   r-   r-   r.   r    s    )r   _is_even_is_oddr0   r`   rU   r@   r?   r   rR   hasattrr   r(   _reciprocal_ofr   anyr   r   r   )r   rW   r1   r@   r?   r   tr-   r-   r.   r     s<    




z$ReciprocalTrigonometricFunction.evalc             O   s    |  | jd }t||||S )Nr   )r  r(   getattr)r+   method_namer(   kwargsor-   r-   r.   _call_reciprocal  s    z0ReciprocalTrigonometricFunction._call_reciprocalc             O   s&   | j |f||}|d kr"d| S |S )NrZ   )r  )r+   r  r(   r  r  r-   r-   r.   _calculate_reciprocal  s    z5ReciprocalTrigonometricFunction._calculate_reciprocalc             C   s.   |  ||}|d kr*|| |kr*d| S d S )NrZ   )r  r  )r+   r  rW   r  r-   r-   r.   _rewrite_reciprocal  s    z3ReciprocalTrigonometricFunction._rewrite_reciprocalc             C   s   | j d }| ||S )Nr   )r(   r  ri   )r+   rH   rI   r-   r-   r.   rM     s    
z'ReciprocalTrigonometricFunction._periodrZ   c             C   s   |  d| | d  S )Nrl   r[   )r  )r+   rk   r-   r-   r.   rl     s    z%ReciprocalTrigonometricFunction.fdiffc             C   s   |  d|S )Nr   )r  )r+   rW   r-   r-   r.   r      s    z4ReciprocalTrigonometricFunction._eval_rewrite_as_expc             C   s   |  d|S )Nr   )r  )r+   rW   r-   r-   r.   r   #  s    z4ReciprocalTrigonometricFunction._eval_rewrite_as_Powc             C   s   |  d|S )Nr   )r  )r+   rW   r-   r-   r.   r   &  s    z4ReciprocalTrigonometricFunction._eval_rewrite_as_sinc             C   s   |  d|S )Nr   )r  )r+   rW   r-   r-   r.   r   )  s    z4ReciprocalTrigonometricFunction._eval_rewrite_as_cosc             C   s   |  d|S )Nr   )r  )r+   rW   r-   r-   r.   r   ,  s    z4ReciprocalTrigonometricFunction._eval_rewrite_as_tanc             C   s   |  d|S )Nr   )r  )r+   rW   r-   r-   r.   r   /  s    z4ReciprocalTrigonometricFunction._eval_rewrite_as_powc             C   s   |  d|S )Nr   )r  )r+   rW   r-   r-   r.   r   2  s    z5ReciprocalTrigonometricFunction._eval_rewrite_as_sqrtc             C   s   |  | jd  S )Nr   )r'   r(   r   )r+   r-   r-   r.   r   5  s    z/ReciprocalTrigonometricFunction._eval_conjugateTc             K   s   d|  | jd  j|f|S )NrZ   r   )r  r(   r4   )r+   r3   r6   r-   r-   r.   r4   8  s    z,ReciprocalTrigonometricFunction.as_real_imagc             K   s   | j d|S )Nr   )r   )r  )r+   r6   r-   r-   r.   r   <  s    z1ReciprocalTrigonometricFunction._eval_expand_trigc             C   s   |  | jd  S )Nr   )r  r(   r   )r+   r-   r-   r.   r   ?  s    z-ReciprocalTrigonometricFunction._eval_is_realc             C   s   d|  | jd  |S )NrZ   r   )r  r(   r   )r+   rd   r-   r-   r.   r   B  s    z5ReciprocalTrigonometricFunction._eval_as_leading_termc             C   s   d|  | jd  jS )NrZ   r   )r  r(   Z	is_finite)r+   r-   r-   r.   r   E  s    z/ReciprocalTrigonometricFunction._eval_is_finitec             C   s   d|  | jd  |||S )NrZ   r   )r  r(   r   )r+   rd   r   r   r-   r-   r.   r   H  s    z-ReciprocalTrigonometricFunction._eval_nseries)rZ   )T)rN   rO   rP   rQ   r  r  r  r   r   r  r  r  rM   rl   r   r   r   r   r   r   r   r   r4   r   r   r   r   r   r-   r-   r-   r.   r    s0   %

r  c               @   sl   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eedd ZdS )r   az  
    The secant function.

    Returns the secant of x (measured in radians).

    Notes
    =====

    See :func:`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] http://en.wikipedia.org/wiki/Trigonometric_functions
    .. [2] http://dlmf.nist.gov/4.14
    .. [3] http://functions.wolfram.com/ElementaryFunctions/Sec
    TNc             C   s
   |  |S )N)rM   )r+   rH   r-   r-   r.   ri   r  s    z
sec.periodc             C   s    t |d d }|d |d  S )Nr[   rZ   )r   )r+   rW   Zcot_half_sqr-   r-   r.   r   u  s    zsec._eval_rewrite_as_cotc             C   s   dt | S )NrZ   )rj   )r+   rW   r-   r-   r.   r   y  s    zsec._eval_rewrite_as_cosc             C   s   t |t|t |  S )N)rh   rj   )r+   rW   r-   r-   r.   r   |  s    zsec._eval_rewrite_as_sincosc             C   s   dt || S )NrZ   )rj   r   )r+   rW   r-   r-   r.   r     s    zsec._eval_rewrite_as_sinc             C   s   dt || S )NrZ   )rj   r   )r+   rW   r-   r-   r.   r     s    zsec._eval_rewrite_as_tanc             C   s   t td | ddS )Nr[   F)r   )r   r   )r+   rW   r-   r-   r.   r     s    zsec._eval_rewrite_as_cscrZ   c             C   s2   |dkr$t | jd t| jd  S t| |d S )NrZ   r   )r   r(   r   r   )r+   rk   r-   r-   r.   rl     s    z	sec.fdiffc             G   sf   ddl m} | dk s | d dkr&tjS t|}| d }d| |d|  td|  |d|   S d S )Nr   )eulerr[   rZ   ro   )Z%sympy.functions.combinatorial.numbersr  r   r;   r   r   )r   rd   r   r  kr-   r-   r.   r     s    zsec.taylor_term)N)rZ   )rN   rO   rP   rQ   rj   r  r  ri   r   r   r   r   r   r   rl   r   r   r   r-   r-   r-   r.   r   L  s   !

r   c               @   sl   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eedd ZdS )r   a  
    The cosecant function.

    Returns the cosecant of x (measured in radians).

    Notes
    =====

    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] http://en.wikipedia.org/wiki/Trigonometric_functions
    .. [2] http://dlmf.nist.gov/4.14
    .. [3] http://functions.wolfram.com/ElementaryFunctions/Csc
    TNc             C   s
   |  |S )N)rM   )r+   rH   r-   r-   r.   ri     s    z
csc.periodc             C   s   dt | S )NrZ   )rh   )r+   rW   r-   r-   r.   r     s    zcsc._eval_rewrite_as_sinc             C   s   t |t|t |  S )N)rj   rh   )r+   rW   r-   r-   r.   r     s    zcsc._eval_rewrite_as_sincosc             C   s    t |d }d|d  d|  S )Nr[   rZ   )r   )r+   rW   r   r-   r-   r.   r     s    zcsc._eval_rewrite_as_cotc             C   s   dt || S )NrZ   )rh   r   )r+   rW   r-   r-   r.   r     s    zcsc._eval_rewrite_as_cosc             C   s   t td | ddS )Nr[   F)r   )r   r   )r+   rW   r-   r-   r.   r     s    zcsc._eval_rewrite_as_secc             C   s   dt || S )NrZ   )rh   r   )r+   rW   r-   r-   r.   r     s    zcsc._eval_rewrite_as_tanrZ   c             C   s4   |dkr&t | jd  t| jd  S t| |d S )NrZ   r   )r   r(   r   r   )r+   rk   r-   r-   r.   rl     s    z	csc.fdiffc             G   s   ddl m} | dkr dt| S | dk s4| d dkr:tjS t|}| d d }d|d  d dd| d  d  |d|  |d| d   td|  S d S )Nr   )r   rZ   r[   ro   )r   r   r   r   r;   r   )r   rd   r   r   r  r-   r-   r.   r     s    zcsc.taylor_term)N)rZ   )rN   rO   rP   rQ   rh   r  r  ri   r   r   r   r   r   r   rl   r   r   r   r-   r-   r-   r.   r     s   !

r   c               @   s>   e Zd ZdZdddZedd Zdd Zd	d
 Zdd Z	dS )r   aY  Represents unnormalized sinc function

    Examples
    ========

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

    * Automated Evaluation

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

    * Differentiation

    >>> sinc(x).diff()
    (x*cos(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)

    References
    ==========

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

    rZ   c             C   s<   | j d }|dkr.|t| t| |d  S t| |d S )Nr   rZ   r[   )r(   rj   rh   r   )r+   rk   rd   r-   r-   r.   rl     s    
z
sinc.fdiffc             C   s   |j rtjS |jr:|tjtj gkr*tjS |tjkr:tjS |tjkrJtjS | r\| | S t	|}|d k	r|j
rt|j rtjS nd| j
rtj|tj  | S d S )Nr[   )r*   r   rS   ru   rw   r;   rv   ry   r   r0   r`   r   r   rV   )r   rW   r1   r-   r-   r.   r     s$    




z	sinc.evalc             C   s    | j d }t|| |||S )Nr   )r(   rh   r   )r+   rd   r   r   r-   r-   r.   r   4  s    
zsinc._eval_nseriesc             C   s   ddl m} |d|S )Nr   )jn)Zsympy.functions.special.besselr   )r+   rW   r   r-   r-   r.   _eval_rewrite_as_jn8  s    zsinc._eval_rewrite_as_jnc             C   s   t t|| t|dfdS )Nr   )rZ   T)r%   rh   r$   )r+   rW   r-   r-   r.   r   <  s    zsinc._eval_rewrite_as_sinN)rZ   )
rN   rO   rP   rQ   rl   r   r   r   r!  r   r-   r-   r-   r.   r     s   &
r   c               @   s   e Zd ZdZdS )InverseTrigonometricFunctionz/Base class for inverse trigonometric functions.N)rN   rO   rP   rQ   r-   r-   r-   r.   r"  E  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d Zdd Zdd Zdd Zdd Zdd Zdd Zd#dd Zd!S )$r   a  
    The inverse sine function.

    Returns the arcsine of x in radians.

    Notes
    =====

    asin(x) will evaluate automatically in the cases oo, -oo, 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 asin, oo, pi
    >>> asin(1)
    pi/2
    >>> asin(-1)
    -pi/2

    See Also
    ========

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

    References
    ==========

    .. [1] http://en.wikipedia.org/wiki/Inverse_trigonometric_functions
    .. [2] http://dlmf.nist.gov/4.23
    .. [3] http://functions.wolfram.com/ElementaryFunctions/ArcSin
    rZ   c             C   s0   |dkr"dt d| jd d   S t| |d S )NrZ   r   r[   )r   r(   r   )r+   rk   r-   r-   r.   rl   o  s    z
asin.fdiffc             C   s4   | j | j }|j | j kr*|jd jr0dS n|jS d S )Nr   F)r'   r(   r)   )r+   r,   r-   r-   r.   r/   u  s
    zasin._eval_is_rationalc             C   s   |   o| jd jS )Nr   )r   r(   is_positive)r+   r-   r-   r.   _eval_is_positive}  s    zasin._eval_is_positivec             C   s   |   o| jd jS )Nr   )r   r(   is_negative)r+   r-   r-   r.   _eval_is_negative  s    zasin._eval_is_negativec          %   C   s  |j r||tjkrtjS |tjkr,tjtj S |tjkrBtjtj S |tjkrRtjS |tjkrftjd S |tj	kr|tj d S |tj
krtj
S | r| |  S |jrtdd dtd d dtdd dtd d ddtd ddtd dtdtd d	 dtdtd d	  d
tjdtj dtdtd d d	tdtd  d dtdd d ddtd d dtdd td	 ddtd td	 dtdd d tdd tdd  d td d i}||krtj||  S |tj}|d k	rtjt| S t|tr|jd }|jr|dt ; }|tkrNt| }|td krdt| }|t d k r~t | }|S t|tr|jd }|jrtd t| S d S )Nr[   rq   r   r   rZ   ro   rp   rs   r   iir   ir   ir   )ru   r   rv   rw   rx   r5   r;   rS   rR   r   ry   r   	is_numberr   rV   r   r   rz   rh   r(   is_comparabler   rj   r   )r   rW   	cst_tabler   angr-   r-   r.   r     sp    







 





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 )Nr   r[   r   rZ   )r   r;   r   r   r   rV   r   )r   rd   r   r?   r  Rr   r-   r-   r.   r     s    $zasin.taylor_termc             C   sH   ddl m} | jd |}||jkr:|d||r:|S | |S d S )Nr   )r   rZ   )r   r   r(   r   rB   r   r'   )r+   rd   r   rW   r-   r-   r.   r     s
    zasin._eval_as_leading_termc             C   s   t jd t| S )Nr[   )r   rR   r   )r+   rd   r-   r-   r.   _eval_rewrite_as_acos  s    zasin._eval_rewrite_as_acosc             C   s    dt |dtd|d     S )Nr[   rZ   )r   r   )r+   rd   r-   r-   r.   _eval_rewrite_as_atan  s    zasin._eval_rewrite_as_atanc             C   s&   t j tt j| td|d    S )NrZ   r[   )r   r5   r   r   )r+   rd   r-   r-   r.   _eval_rewrite_as_log  s    zasin._eval_rewrite_as_logc             C   s    dt dtd|d   |  S )Nr[   rZ   )r   r   )r+   rW   r-   r-   r.   _eval_rewrite_as_acot  s    zasin._eval_rewrite_as_acotc             C   s   t jd td|  S )Nr[   rZ   )r   rR   r   )r+   rW   r-   r-   r.   _eval_rewrite_as_asec  s    zasin._eval_rewrite_as_asecc             C   s   t d| S )NrZ   )r   )r+   rW   r-   r-   r.   _eval_rewrite_as_acsc  s    zasin._eval_rewrite_as_acscc             C   s   | j d }|jodt| jS )Nr   rZ   )r(   r9   rE   is_nonnegative)r+   rd   r-   r-   r.   r     s    
zasin._eval_is_realc             C   s   t S )z7
        Returns the inverse of this function.
        )rh   )r+   rk   r-   r-   r.   r     s    zasin.inverseN)rZ   )rZ   )rN   rO   rP   rQ   rl   r/   r$  r&  r   r   r   r   r   r   r.  r/  r0  r1  r2  r3  r   r   r-   r-   r-   r.   r   K  s"   "
G	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d Zdd Zdd Zdd Zd%ddZdd Zdd Zdd  Zd!d" Zd#S )&r   a  
    The inverse cosine function.

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

    Notes
    =====

    ``acos(x)`` will evaluate automatically in the cases
    ``oo``, ``-oo``, ``0``, ``1``, ``-1``.

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

    Examples
    ========

    >>> from sympy import acos, oo, pi
    >>> 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] http://en.wikipedia.org/wiki/Inverse_trigonometric_functions
    .. [2] http://dlmf.nist.gov/4.23
    .. [3] http://functions.wolfram.com/ElementaryFunctions/ArcCos
    rZ   c             C   s0   |dkr"dt d| jd d   S t| |d S )NrZ   ro   r   r[   )r   r(   r   )r+   rk   r-   r-   r.   rl   (  s    z
acos.fdiffc             C   s4   | j | j }|j | j kr*|jd jr0dS n|jS d S )Nr   F)r'   r(   r)   )r+   r,   r-   r-   r.   r/   .  s
    zacos._eval_is_rationalc             C   s  |j rv|tjkrtjS |tjkr,tjtj S |tjkrBtjtj S |tjkrVtjd S |tjkrftjS |tj	krvtjS |tj
krtj
S |jr>tjtjd tj dtj d tdd tjd td d dtj d dtd tjd dtd dtj d tdd tjd td d dtj d i}||kr>|| S t|tr|jd }|jr|dt ; }|tkr~dt | }|S t|tr|jd }|jrtd t| S d S )	Nr[   rq   r   rZ   ro   r   rp   r   )ru   r   rv   rw   r5   rx   r;   rR   rS   r   ry   r)  rV   r   rz   rj   r(   r*  r   rh   r   )r   rW   r+  r,  r-   r-   r.   r   6  sJ    











z	acos.evalc             G   s   | dkrt jd S | dk s&| d dkr,t jS t|}t|dkrt| dkrt|d }|| d d  | | d   |d  S | d d }tt j|}t|}| | ||   |  S d S )Nr   r[   r   rZ   )r   rR   r;   r   r   r   rV   r   )r   rd   r   r?   r  r-  r   r-   r-   r.   r   f  s    
$zacos.taylor_termc             C   sH   ddl m} | jd |}||jkr:|d||r:|S | |S d S )Nr   )r   rZ   )r   r   r(   r   rB   r   r'   )r+   rd   r   rW   r-   r-   r.   r   x  s
    zacos._eval_as_leading_termc             C   s   | j d }|jodt| jS )Nr   rZ   )r(   r9   rE   r4  )r+   rd   r-   r-   r.   r     s    
zacos._eval_is_realc             C   s   |   S )N)r   )r+   r-   r-   r.   _eval_is_nonnegative  s    zacos._eval_is_nonnegativec             C   s   |  | jd |||S )Nr   )r0  r(   r   )r+   rd   r   r   r-   r-   r.   r     s    zacos._eval_nseriesc             C   s.   t jd t jtt j| td|d     S )Nr[   rZ   )r   rR   r5   r   r   )r+   rd   r-   r-   r.   r0    s    zacos._eval_rewrite_as_logc             C   s   t jd t| S )Nr[   )r   rR   r   )r+   rd   r-   r-   r.   _eval_rewrite_as_asin  s    zacos._eval_rewrite_as_asinc             C   s:   t td|d  | tjd d|td|d      S )NrZ   r[   )r   r   r   rR   )r+   rd   r-   r-   r.   r/    s    zacos._eval_rewrite_as_atanc             C   s   t S )z7
        Returns the inverse of this function.
        )rj   )r+   rk   r-   r-   r.   r     s    zacos.inversec             C   s*   t jd dtdtd|d   |   S )Nr[   rZ   )r   rR   r   r   )r+   rW   r-   r-   r.   r1    s    zacos._eval_rewrite_as_acotc             C   s   t d| S )NrZ   )r   )r+   rW   r-   r-   r.   r2    s    zacos._eval_rewrite_as_asecc             C   s   t jd td|  S )Nr[   rZ   )r   rR   r   )r+   rW   r-   r-   r.   r3    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   FrZ   )r(   r'   r   r9   r4  Zis_nonpositive)r+   r   r   r-   r-   r.   r     s    

zacos._eval_conjugateN)rZ   )rZ   )rN   rO   rP   rQ   rl   r/   r   r   r   r   r   r   r   r5  r   r0  r6  r/  r   r1  r2  r3  r   r-   r-   r-   r.   r      s$   &
0	
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d Zdd Z fddZd$ddZdd Zdd Zdd Zdd  Zd!d" Z  ZS )%r   a  
    The inverse tangent function.

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

    Notes
    =====

    atan(x) will evaluate automatically in the cases
    oo, -oo, 0, 1, -1.

    Examples
    ========

    >>> from sympy import atan, oo, pi
    >>> 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] http://en.wikipedia.org/wiki/Inverse_trigonometric_functions
    .. [2] http://dlmf.nist.gov/4.23
    .. [3] http://functions.wolfram.com/ElementaryFunctions/ArcTan
    rZ   c             C   s,   |dkrdd| j d d   S t| |d S )NrZ   r   r[   )r(   r   )r+   rk   r-   r-   r.   rl     s    z
atan.fdiffc             C   s4   | j | j }|j | j kr*|jd jr0dS n|jS d S )Nr   F)r'   r(   r)   )r+   r,   r-   r-   r.   r/     s
    zatan._eval_is_rationalc             C   s   | j d jS )Nr   )r(   r#  )r+   r-   r-   r.   r$    s    zatan._eval_is_positivec             C   s   | j d jS )Nr   )r(   r4  )r+   r-   r-   r.   r5    s    zatan._eval_is_nonnegativec             C   sl  |j rz|tjkrtjS |tjkr*tjd S |tjkr@tj d S |tjkrPtjS |tjkrdtjd S |tjkrztj d S |tj	krddl
m} |tj d tjd S | r| |  S |jrtdd dtd d ddtd dd	td dtddtd d
dtd tdd dtd  tdd tdd ddtd dtddtd  tdd tddtd   td d dtd ddtd  di}||krtj||  S |tj}|d k	rtjt| S t|tr |jd }|jr |t; }|td kr|t8 }|S t|trh|jd }|jrhtd t| }|td krd|t8 }|S d S )Nr[   r   r   )rm   rq   r   irZ   ro   r'  rs   irp   r   i)ru   r   rv   rw   rR   rx   r;   rS   r   ry   r   rm   r   r)  r   r   r5   r   rz   r   r(   r*  r   r   r   )r   rW   rm   r+  r   r,  r-   r-   r.   r     sh    









 



z	atan.evalc             G   sB   | dk s| d dkrt jS t|}d| d d  ||   |  S d S )Nr   r[   ro   rZ   )r   r;   r   )r   rd   r   r-   r-   r.   r   '	  s    zatan.taylor_termc             C   sH   ddl m} | jd |}||jkr:|d||r:|S | |S d S )Nr   )r   rZ   )r   r   r(   r   rB   r   r'   )r+   rd   r   rW   r-   r-   r.   r   0	  s
    zatan._eval_as_leading_termc             C   s   | j d jS )Nr   )r(   r9   )r+   r-   r-   r.   r   9	  s    zatan._eval_is_realc             C   s6   t jd tt dt j|  tt dt j|    S )Nr[   rZ   )r   r5   r   )r+   rd   r-   r-   r.   r0  <	  s    zatan._eval_rewrite_as_logc                s   |d t jkr4t jd td| jd   |||S |d t jkrjt j d td| jd   |||S tt| ||||S d S )Nr   r[   rZ   )	r   rw   rR   r   r(   r   rx   super_eval_aseries)r+   r   args0rd   r   )	__class__r-   r.   r8  @	  s
    &(zatan._eval_aseriesc             C   s   t S )z7
        Returns the inverse of this function.
        )r   )r+   rk   r-   r-   r.   r   H	  s    zatan.inversec             C   s2   t |d | tjd tdt d|d     S )Nr[   rZ   )r   r   rR   r   )r+   rW   r-   r-   r.   r6  N	  s    zatan._eval_rewrite_as_asinc             C   s(   t |d | tdt d|d    S )Nr[   rZ   )r   r   )r+   rW   r-   r-   r.   r.  Q	  s    zatan._eval_rewrite_as_acosc             C   s   t d| S )NrZ   )r   )r+   rW   r-   r-   r.   r1  T	  s    zatan._eval_rewrite_as_acotc             C   s$   t |d | tt d|d   S )Nr[   rZ   )r   r   )r+   rW   r-   r-   r.   r2  W	  s    zatan._eval_rewrite_as_asecc             C   s.   t |d | tjd tt d|d    S )Nr[   rZ   )r   r   rR   r   )r+   rW   r-   r-   r.   r3  Z	  s    zatan._eval_rewrite_as_acsc)rZ   )rZ   )rN   rO   rP   rQ   rl   r/   r$  r5  r   r   r   r   r   r   r   r0  r8  r   r6  r.  r1  r2  r3  __classcell__r-   r-   )r:  r.   r     s$   #
A	
r   c                   s   e Zd Zd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d Z fddZdd Zd%ddZdd Zdd Zdd Zd d! Zd"d# Z  ZS )&r   a  
    The inverse cotangent function.

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

    See Also
    ========

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

    References
    ==========

    .. [1] http://en.wikipedia.org/wiki/Inverse_trigonometric_functions
    .. [2] http://dlmf.nist.gov/4.23
    .. [3] http://functions.wolfram.com/ElementaryFunctions/ArcCot
    rZ   c             C   s,   |dkrdd| j d d   S t| |d S )NrZ   ro   r   r[   )r(   r   )r+   rk   r-   r-   r.   rl   r	  s    z
acot.fdiffc             C   s4   | j | j }|j | j kr*|jd jr0dS n|jS d S )Nr   F)r'   r(   r)   )r+   r,   r-   r-   r.   r/   x	  s
    zacot._eval_is_rationalc             C   s   | j d jS )Nr   )r(   r4  )r+   r-   r-   r.   r$  	  s    zacot._eval_is_positivec             C   s   | j d jS )Nr   )r(   r%  )r+   r-   r-   r.   r&  	  s    zacot._eval_is_negativec             C   s   | j d jS )Nr   )r(   r9   )r+   r-   r-   r.   r   	  s    zacot._eval_is_realc          !   C   sf  |j rt|tjkrtjS |tjkr&tjS |tjkr6tjS |tjkrJtjd S |tjkr^tjd S |tjkrttj d S |tj	krtjS |
 r| |  S |jrtdd dtd d ddtd ddtd dtddtd ddtd d	dtd  d
dtd td	 d tdd td	d tddtd  dtddtd   ddtd ddtd  ddtd tdd dtd  td d i}||krtj||  S |tj}|d k	rtj t| S t|tr|jd }|jr|t; }|td kr|t8 }|S t|trb|jd }|jrbtd t| }|td kr^|t8 }|S d S )Nr[   r   rq   r'  rZ   ro   r   irs   irp   r   ir   ir   )ru   r   rv   rw   r;   rx   rR   rS   r   ry   r   r)  r   r   r5   r   rz   r   r(   r*  r   r   r   )r   rW   r+  r   r,  r-   r-   r.   r   	  sj    













z	acot.evalc             G   sT   | dkrt jd S | dk s&| d dkr,t jS t|}d| d d  ||   |  S d S )Nr   r[   ro   rZ   )r   rR   r;   r   )r   rd   r   r-   r-   r.   r   	  s    
zacot.taylor_termc             C   sH   ddl m} | jd |}||jkr:|d||r:|S | |S d S )Nr   )r   rZ   )r   r   r(   r   rB   r   r'   )r+   rd   r   rW   r-   r-   r.   r   	  s
    zacot._eval_as_leading_termc             C   s   | j d jS )Nr   )r(   r9   )r+   r-   r-   r.   r   	  s    c                s   |d t jkr4t jd td| jd   |||S |d t jkrldt j d td| jd   |||S tt| 	||||S d S )Nr   r[   rZ   rq   )
r   rw   rR   r   r(   r   rx   r7  r   r8  )r+   r   r9  rd   r   )r:  r-   r.   r8  	  s
    &*zacot._eval_aseriesc             C   s.   t jd tdt j|  tdt j|    S )Nr[   rZ   )r   r5   r   )r+   rd   r-   r-   r.   r0  	  s    zacot._eval_rewrite_as_logc             C   s   t S )z7
        Returns the inverse of this function.
        )r   )r+   rk   r-   r-   r.   r   	  s    zacot.inversec             C   sB   |t d|d   tjd tt |d  t |d  d    S )NrZ   r[   )r   r   rR   r   )r+   rW   r-   r-   r.   r6  	  s    zacot._eval_rewrite_as_asinc             C   s8   |t d|d   tt |d  t |d  d   S )NrZ   r[   )r   r   )r+   rW   r-   r-   r.   r.  	  s    zacot._eval_rewrite_as_acosc             C   s   t d| S )NrZ   )r   )r+   rW   r-   r-   r.   r/  	  s    zacot._eval_rewrite_as_atanc             C   s0   |t d|d   tt d|d  |d   S )NrZ   r[   )r   r   )r+   rW   r-   r-   r.   r2  	  s    zacot._eval_rewrite_as_asecc             C   s:   |t d|d   tjd tt d|d  |d    S )NrZ   r[   )r   r   rR   r   )r+   rW   r-   r-   r.   r3   
  s    zacot._eval_rewrite_as_acsc)rZ   )rZ   )rN   rO   rP   rQ   rl   r/   r$  r&  r   r   r   r   r   r   r   r8  r0  r   r6  r.  r/  r2  r3  r;  r-   r-   )r:  r.   r   ^	  s&   
A
	
r   c               @   sp   e Zd ZdZedd ZdddZdddZd	d
 Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd ZdS )r   a  
    The inverse secant function.

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

    Notes
    =====

    ``asec(x)`` will evaluate automatically in the cases
    ``oo``, ``-oo``, ``0``, ``1``, ``-1``.

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

    .. math::
        sec^{-1}(z) = -i*(log(\sqrt{1 - z^2} + 1) / 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*(log(-\sqrt{1 - z^2} + 1) / z)

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

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

    Examples
    ========

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

    See Also
    ========

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

    References
    ==========

    .. [1] http://en.wikipedia.org/wiki/Inverse_trigonometric_functions
    .. [2] http://dlmf.nist.gov/4.23
    .. [3] http://functions.wolfram.com/ElementaryFunctions/ArcSec
    .. [4] http://reference.wolfram.com/language/ref/ArcSec.html
    c             C   s   |j rtjS |jrB|tjkr"tjS |tjkr2tjS |tjkrBtjS |tj	tj
tjgkr`tjd S t|tr|jd }|jr|dt ; }|tkrdt | }|S t|tr|jd }|jrtd t| S d S )Nr[   r   )r*   r   ry   ru   rv   rS   r;   r   rR   rw   rx   rz   r   r(   r*  r   r   r   )r   rW   r,  r-   r-   r.   r   :
  s,    







z	asec.evalrZ   c             C   sB   |dkr4d| j d d tdd| j d d     S t| |d S )NrZ   r   r[   )r(   r   r   )r+   rk   r-   r-   r.   rl   V
  s    ,z
asec.fdiffc             C   s   t S )z7
        Returns the inverse of this function.
        )r   )r+   rk   r-   r-   r.   r   \
  s    zasec.inversec             C   sB   ddl m} | jd |}|d||r4t|S | |S d S )Nr   )r   rZ   )r   r   r(   r   r   r   r'   )r+   rd   r   rW   r-   r-   r.   r   b
  s
    zasec._eval_as_leading_termc             C   s2   | j d }|jdkrdS t|d j| d jfS )Nr   FrZ   )r(   r9   r   r4  )r+   rd   r-   r-   r.   r   j
  s    

zasec._eval_is_realc          	   C   s2   t jd t jtt j| tdd|d      S )Nr[   rZ   )r   rR   r5   r   r   )r+   rW   r-   r-   r.   r0  p
  s    zasec._eval_rewrite_as_logc             C   s   t jd td|  S )Nr[   rZ   )r   rR   r   )r+   rW   r-   r-   r.   r6  s
  s    zasec._eval_rewrite_as_asinc             C   s   t d| S )NrZ   )r   )r+   rW   r-   r-   r.   r.  v
  s    zasec._eval_rewrite_as_acosc             C   s8   t |d | tj d dt|t |d d     S )Nr[   rZ   )r   r   rR   r   )r+   rW   r-   r-   r.   r/  y
  s    zasec._eval_rewrite_as_atanc             C   s8   t |d | tj d dt|t |d d     S )Nr[   rZ   )r   r   rR   r   )r+   rW   r-   r-   r.   r1  |
  s    zasec._eval_rewrite_as_acotc             C   s   t jd t| S )Nr[   )r   rR   r   )r+   rW   r-   r-   r.   r3  
  s    zasec._eval_rewrite_as_acscN)rZ   )rZ   )rN   rO   rP   rQ   r   r   rl   r   r   r   r0  r6  r.  r/  r1  r3  r-   r-   r-   r.   r   
  s   4

r   c               @   sh   e Zd ZdZedd ZdddZdddZd	d
 Zdd Z	dd Z
dd Zdd Zdd Zdd ZdS )r   ap  
    The inverse cosecant function.

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

    Notes
    =====

    acsc(x) will evaluate automatically in the cases
    oo, -oo, 0, 1, -1.

    Examples
    ========

    >>> from sympy import acsc, oo, pi
    >>> acsc(1)
    pi/2
    >>> acsc(-1)
    -pi/2

    See Also
    ========

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

    References
    ==========

    .. [1] http://en.wikipedia.org/wiki/Inverse_trigonometric_functions
    .. [2] http://dlmf.nist.gov/4.23
    .. [3] http://functions.wolfram.com/ElementaryFunctions/ArcCsc
    c             C   s   |j r@|tjkrtjS |tjkr*tjd S |tjkr@tj d S |tjtjtjgkrZt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 )Nr[   r   )ru   r   rv   rS   rR   r   rw   rx   ry   r;   rz   r   r(   r*  r   r   r   )r   rW   r,  r-   r-   r.   r   
  s0    








z	acsc.evalrZ   c             C   sB   |dkr4d| j d d tdd| j d d     S t| |d S )NrZ   ro   r   r[   )r(   r   r   )r+   rk   r-   r-   r.   rl   
  s    ,z
acsc.fdiffc             C   s   t S )z7
        Returns the inverse of this function.
        )r   )r+   rk   r-   r-   r.   r   
  s    zacsc.inversec             C   sB   ddl m} | jd |}|d||r4t|S | |S d S )Nr   )r   rZ   )r   r   r(   r   r   r   r'   )r+   rd   r   rW   r-   r-   r.   r   
  s
    zacsc._eval_as_leading_termc             C   s*   t j tt j| tdd|d     S )NrZ   r[   )r   r5   r   r   )r+   rW   r-   r-   r.   r0  
  s    zacsc._eval_rewrite_as_logc             C   s   t d| S )NrZ   )r   )r+   rW   r-   r-   r.   r6  
  s    zacsc._eval_rewrite_as_asinc             C   s   t jd td|  S )Nr[   rZ   )r   rR   r   )r+   rW   r-   r-   r.   r.  
  s    zacsc._eval_rewrite_as_acosc             C   s.   t |d | tjd tt |d d   S )Nr[   rZ   )r   r   rR   r   )r+   rW   r-   r-   r.   r/  
  s    zacsc._eval_rewrite_as_atanc             C   s2   t |d | tjd tdt |d d    S )Nr[   rZ   )r   r   rR   r   )r+   rW   r-   r-   r.   r1  
  s    zacsc._eval_rewrite_as_acotc             C   s   t jd t| S )Nr[   )r   rR   r   )r+   rW   r-   r-   r.   r2  
  s    zacsc._eval_rewrite_as_asecN)rZ   )rZ   )rN   rO   rP   rQ   r   r   rl   r   r   r0  r6  r.  r/  r1  r2  r-   r-   r-   r.   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.

    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)
    2*atan(y/(x + sqrt(x**2 + y**2)))

    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] http://en.wikipedia.org/wiki/Inverse_trigonometric_functions
    .. [2] http://en.wikipedia.org/wiki/Atan2
    .. [3] http://functions.wolfram.com/ElementaryFunctions/ArcTan2
    c             C   s  ddl m}m}m} |tjkrF|jr*tjS dtj ||| tj S |tjkrVtj	S |j
r~|j
r~|jr~|jr~||}||}|jr|jr|jrt|| S |jr|jrt|| tj S |jrt|| tj S n:|jr|jrtjd S |jrtj d S |jrtjS |jrB|jrBt|jrBtjtj||  S |jr|jrtj t|tj|  t|d |d    S d S )Nr   )	Heavisider=   r<   r[   )r   r<  r=   r<   r   rx   r*   rR   rw   r;   r  r)  r9   r#  r   r%  r4  rv   r   rS   r5   r   r   )r   r   rd   r<  r=   r<   r-   r-   r.   r   L  s<    


z
atan2.evalc             C   s.   t j t|t j|  t|d |d    S )Nr[   )r   r5   r   r   )r+   r   rd   r-   r-   r.   r0  o  s    zatan2._eval_rewrite_as_logc             C   s$   dt |t|d |d  |   S )Nr[   )r   r   )r+   r   rd   r-   r-   r.   r/  r  s    zatan2._eval_rewrite_as_atanc             C   sx   ddl m} |jr*|jr*|||tj  S tj}|||  }|d |d  }||t| |tt|tt|   S )Nr   )rW   r[   )r   rW   r9   r   r5   r   r   rE   )r+   r   rd   rW   r   r   r   r-   r-   r.   _eval_rewrite_as_argu  s    zatan2._eval_rewrite_as_argc             C   s   | j d jo| j d jS )Nr   rZ   )r(   r9   )r+   r-   r-   r.   r   ~  s    zatan2._eval_is_realc             C   s    |  | jd  | jd  S )Nr   rZ   )r'   r(   r   )r+   r-   r-   r.   r     s    zatan2._eval_conjugatec             C   sR   | j \}}|dkr&||d |d   S |dkrD| |d |d   S t| |d S )NrZ   r[   )r(   r   )r+   rk   r   rd   r-   r-   r.   rl     s    
zatan2.fdiffc                s*   | j \}}|jr&|jr&tt| | d S )N)r(   r9   r7  r   _eval_evalf)r+   Zprecr   rd   )r:  r-   r.   r>    s    
zatan2._eval_evalf)rN   rO   rP   rQ   r   r   r0  r/  r=  r   r   rl   r>  r;  r-   r-   )r:  r.   r   
  s   ]#	r   N)rZ   )IZ
__future__r   r   Zsympy.core.addr   Zsympy.core.basicr   r   Zsympy.core.functionr   r   Zsympy.core.numbersr	   r
   r   Zsympy.core.singletonr   Zsympy.core.symbolr   r   Zsympy.core.logicr   r   Z(sympy.functions.combinatorial.factorialsr   r   Z(sympy.functions.elementary.miscellaneousr   r   r   Z&sympy.functions.elementary.exponentialr   r   Z#sympy.functions.elementary.integersr   Z%sympy.functions.elementary.hyperbolicr   r   r   r   r   r   r   r    Zsympy.sets.setsr!   Zsympy.utilities.iterablesr"   Zsympy.core.compatibilityr#   Zsympy.core.relationalr$   Z$sympy.functions.elementary.piecewiser%   r&   rY   r0   rh   rj   r   r   r  r   r   r   r"  r   r   r   r   r   r   r   r-   r-   r-   r.   <module>   sb   (D!
H     .  ,  &uPQX 6 . 2 'j