a
    kh0                    @   s  d dl mZ d dlmZ d dlmZ d dlmZ d dlm	Z	 d dl
mZ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mZ d dlmZ d dl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) d dl*m+Z+m,Z,m-Z- d dl.m/Z/m0Z0m1Z1m2Z2m3Z3 d dl4m5Z5m6Z6m7Z7 d dl8m9Z9 d dl:m;Z; d dl<m=Z=m>Z> G dd deZ?G dd de?Z@G dd de?ZAG dd de?ZBG dd de?ZCG d d! d!e?ZDG d"d# d#e?ZEd$d% ZFG d&d' d'e?ZGd(d) ZHd*d+ ZIG d,d- d-eGZJG d.d/ d/eGZKG d0d1 d1eGZLG d2d3 d3eLZMG d4d5 d5eLZNdKd8d9ZOG d:d; d;eZPG d<d= d=ePZQG d>d? d?ePZRG d@dA dAePZSG dBdC dCePZTG dDdE dEeZUG dFdG dGeZVG dHdI dIeZWdJS )L    wraps)S)Add)cacheit)Expr)DefinedFunctionArgumentIndexError_mexpand)fuzzy_or	fuzzy_not)RationalpiI)Pow)Dummyuniquely_named_symbolWild)sympify)	factorialRisingFactorial)sincoscsccot)ceiling)explog)cbrtsqrtroot)Absreim
polar_lift
unpolarify)gammadigamma
uppergamma)hyper)spherical_bessel_fn)mpworkprecc                   @   s^   e Zd ZdZedd Zedd Zedd Zdd	d
Z	dd Z
dd Zdd Zdd ZdS )
BesselBasea  
    Abstract base class for Bessel-type functions.

    This class is meant to reduce code duplication.
    All Bessel-type functions can 1) be differentiated, with the derivatives
    expressed in terms of similar functions, and 2) be rewritten in terms
    of other Bessel-type functions.

    Here, Bessel-type functions are assumed to have one complex parameter.

    To use this base class, define class attributes ``_a`` and ``_b`` such that
    ``2*F_n' = -_a*F_{n+1} + b*F_{n-1}``.

    c                 C   s
   | j d S )z( The order of the Bessel-type function. r   argsself r2   L/var/www/auris/lib/python3.9/site-packages/sympy/functions/special/bessel.pyorder4   s    zBesselBase.orderc                 C   s
   | j d S )z+ The argument of the Bessel-type function.    r.   r0   r2   r2   r3   argument9   s    zBesselBase.argumentc                 C   s   d S Nr2   clsnuzr2   r2   r3   eval>   s    zBesselBase.eval   c                 C   sN   |dkrt | || jd | | jd | j | jd | | jd | j  S Nr=   r5   )r	   _b	__class__r4   r6   _ar1   argindexr2   r2   r3   fdiffB   s
    
zBesselBase.fdiffc                 C   s*   | j }|jdu r&| | j | S d S NF)r6   is_extended_negativer@   r4   	conjugater1   r;   r2   r2   r3   _eval_conjugateH   s    
zBesselBase._eval_conjugatec                 C   sx   | j | j }}||rdS |||s,d S |||}|jrdt| ttt	t
ttfsZ|jsdt|jS tt|j|jgS rE   )r4   r6   Zhas_eval_is_meromorphicsubs
is_integer
isinstancebesseljbesselihn1hn2jnynis_zeror   is_infiniter   )r1   xar:   r;   Zz0r2   r2   r3   rJ   M   s    

zBesselBase._eval_is_meromorphicc                 K   s   | j | j| j  }}}|jr|d jrn| j | j ||d |  d| j |d  ||d |  |  S |d jrd| j |d  ||d |  | | j| j ||d |   S | S Nr5   r=   )	r4   r6   r@   Zis_realis_positiverA   r?   _eval_expand_funcis_negative)r1   hintsr:   r;   fr2   r2   r3   rZ   Z   s    
&
&zBesselBase._eval_expand_funcc                 K   s   ddl m} || S )Nr   )
besselsimp)Zsympy.simplify.simplifyr^   )r1   kwargsr^   r2   r2   r3   _eval_simplifye   s    zBesselBase._eval_simplifyN)r=   )__name__
__module____qualname____doc__propertyr4   r6   classmethodr<   rD   rI   rJ   rZ   r`   r2   r2   r2   r3   r-   $   s   



r-   c                       sf   e Zd ZdZejZejZedd Z	dd Z
dd Zdd	 Z fd
dZdd Zd fdd	Z  ZS )rN   a4  
    Bessel function of the first kind.

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

    The Bessel $J$ function of order $\nu$ is defined to be the function
    satisfying Bessel's differential equation

    .. math ::
        z^2 \frac{\mathrm{d}^2 w}{\mathrm{d}z^2}
        + z \frac{\mathrm{d}w}{\mathrm{d}z} + (z^2 - \nu^2) w = 0,

    with Laurent expansion

    .. math ::
        J_\nu(z) = z^\nu \left(\frac{1}{\Gamma(\nu + 1) 2^\nu} + O(z^2) \right),

    if $\nu$ is not a negative integer. If $\nu=-n \in \mathbb{Z}_{<0}$
    *is* a negative integer, then the definition is

    .. math ::
        J_{-n}(z) = (-1)^n J_n(z).

    Examples
    ========

    Create a Bessel function object:

    >>> from sympy import besselj, jn
    >>> from sympy.abc import z, n
    >>> b = besselj(n, z)

    Differentiate it:

    >>> b.diff(z)
    besselj(n - 1, z)/2 - besselj(n + 1, z)/2

    Rewrite in terms of spherical Bessel functions:

    >>> b.rewrite(jn)
    sqrt(2)*sqrt(z)*jn(n - 1/2, z)/sqrt(pi)

    Access the parameter and argument:

    >>> b.order
    n
    >>> b.argument
    z

    See Also
    ========

    bessely, besseli, besselk

    References
    ==========

    .. [1] Abramowitz, Milton; Stegun, Irene A., eds. (1965), "Chapter 9",
           Handbook of Mathematical Functions with Formulas, Graphs, and
           Mathematical Tables
    .. [2] Luke, Y. L. (1969), The Special Functions and Their
           Approximations, Volume 1
    .. [3] https://en.wikipedia.org/wiki/Bessel_function
    .. [4] https://functions.wolfram.com/Bessel-TypeFunctions/BesselJ/

    c                 C   sZ  |j rX|j rtjS |jr"|j du s,t|jr2tjS t|jrL|jdurLtjS |j	rXtj
S |tjtjfv rntjS | r|| | |   t||  S |jr| rtj|  t| | S |t}|rt| t|| S |jrt|}||kr:t||S n8| \}}|dkr:td| t | t t|| S t|}||krVt||S d S )NFTr   r=   )rT   r   OnerL   r"   rY   Zeror[   ComplexInfinityis_imaginaryNaNInfinityNegativeInfinitycould_extract_minus_signrN   NegativeOneextract_multiplicativelyr   rO   r%   extract_branch_factorr   r   r9   r:   r;   ZnewznZnnur2   r2   r3   r<      s:     


"
zbesselj.evalc                 K   s(   t tt | d t|tt |  S Nr=   )r   r   r   rO   r$   r1   r:   r;   r_   r2   r2   r3   _eval_rewrite_as_besseli   s    z besselj._eval_rewrite_as_besselic                 K   s<   |j du r8tt| t| | tt| t||  S d S rE   )rL   r   r   besselyr   ru   r2   r2   r3   _eval_rewrite_as_bessely   s    
z besselj._eval_rewrite_as_besselyc                 K   s"   t d| t t|tj | j S rt   )r   r   rR   r   Halfr6   ru   r2   r2   r3   _eval_rewrite_as_jn   s    zbesselj._eval_rewrite_as_jnc           
         s   | j \}}z||}W n ty.   |  Y S 0 ||\}}|jr`|| d| t|d   S |jr|dkrrdn|}|||  }	|	jstdt|t	d| d  d   tt	|  S | S t
t| j|||dS )Nr=   r5   r      logxcdir)r/   as_leading_termNotImplementedErroras_coeff_exponentrY   r&   r[   r   r   r   superrN   _eval_as_leading_term
r1   rV   r}   r~   r:   r;   argcesignr@   r2   r3   r      s    

0zbesselj._eval_as_leading_termc                 C   s   | j \}}|jr|jrdS d S NTr/   rL   is_extended_realr1   r:   r;   r2   r2   r3   _eval_is_extended_real   s    
zbesselj._eval_is_extended_realr   c              	      s$  ddl m} | j\}}z||\}}	W n ttfyB   |  Y S 0 |	jrt||	 }
||| |}|d ||||	 }|t
ju r|S t|d | 	 }|| t|d  }|g}td|
d d D ]4}|| |||   9 }t|| 	 }|| qt| | S tt| ||||S Nr   Orderr=   r5   )sympy.series.orderr   r/   leadterm
ValueErrorr   rY   r   _eval_nseriesremoveOr   rh   r
   r&   rangeappendr   r   rN   r1   rV   rs   r}   r~   r   r:   r;   _r   newnorttermskr   r2   r3   r      s*    


zbesselj._eval_nseries)r   )ra   rb   rc   rd   r   rg   rA   r?   rf   r<   rv   rx   rz   r   r   r   __classcell__r2   r2   r   r3   rN   j   s   D
#rN   c                       sf   e Zd ZdZejZejZedd Z	dd Z
dd Zdd	 Z fd
dZdd Zd fdd	Z  ZS )rw   a`  
    Bessel function of the second kind.

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

    The Bessel $Y$ function of order $\nu$ is defined as

    .. math ::
        Y_\nu(z) = \lim_{\mu \to \nu} \frac{J_\mu(z) \cos(\pi \mu)
                                            - J_{-\mu}(z)}{\sin(\pi \mu)},

    where $J_\mu(z)$ is the Bessel function of the first kind.

    It is a solution to Bessel's equation, and linearly independent from
    $J_\nu$.

    Examples
    ========

    >>> from sympy import bessely, yn
    >>> from sympy.abc import z, n
    >>> b = bessely(n, z)
    >>> b.diff(z)
    bessely(n - 1, z)/2 - bessely(n + 1, z)/2
    >>> b.rewrite(yn)
    sqrt(2)*sqrt(z)*yn(n - 1/2, z)/sqrt(pi)

    See Also
    ========

    besselj, besseli, besselk

    References
    ==========

    .. [1] https://functions.wolfram.com/Bessel-TypeFunctions/BesselY/

    c                 C   s   |j r6|j rtjS t|j du r&tjS t|j r6tjS |tjtjfv rLtjS |ttj krxt	tt
 |d  d tj S |ttj krt	t t
 |d  d tj S |jr| rtj|  t| | S d S )NFr5   r=   )rT   r   rm   r"   ri   rk   rl   rh   r   r   r   rL   rn   ro   rw   r8   r2   r2   r3   r<   F  s     
 zbessely.evalc                 K   s<   |j du r8tt| tt| t|| t| |  S d S rE   )rL   r   r   r   rN   ru   r2   r2   r3   _eval_rewrite_as_besseljZ  s    
z bessely._eval_rewrite_as_besseljc                 K   s   | j | j }|r|tS d S r7   )r   r/   rewriterO   r1   r:   r;   r_   Zajr2   r2   r3   rv   ^  s    z bessely._eval_rewrite_as_besselic                 K   s"   t d| t t|tj | j S rt   )r   r   rS   r   ry   r6   ru   r2   r2   r3   _eval_rewrite_as_ync  s    zbessely._eval_rewrite_as_ync                    s~  | j \}}z||}W n ty.   |  Y S 0 ||\}}|jrdt t|d  t|| }	|jr|d |   t|d  t nt	j
}
|d |  tt|  t|d t	j  }t|	|
|g j||d}|S |jrh|dkrdn|}|||  }|jsdtdtt| d | td   dtt| d | td   d|    td|  tt S | S tt| j|||dS )	Nr=   r5   r}   r   r{         r|   )r/   r   r   r   rY   r   r   rN   r   r   rh   r'   
EulerGammar   r[   r   r   r   r   rw   r   )r1   rV   r}   r~   r:   r;   r   r   r   Zterm_oneZterm_twoZ
term_threer   r   r2   r3   r   f  s&    

,,bzbessely._eval_as_leading_termc                 C   s   | j \}}|jr|jrdS d S r   r/   rL   rY   r   r2   r2   r3   r     s    
zbessely._eval_is_extended_realr   c              	      s6  ddl m} | j\}}z||\}}	W n ttfyB   |  Y S 0 |	jr |jr t||	 }
t	||}dt
 t|d  | ||||}g g  }}||| |}|d |||| }|tju r|S t|d |  }|tjkrn||  t|d  t
 }|| td|D ]R}|| | }|tjkrD||| 9 }n||| 9 }t||  }|| q|| t
t|  }|t|d tj  }|| td|
d d D ]V}|| |||   9 }t||  }|t|| d t|d   }|| q|t|  t|  S tt| ||||S r   )r   r   r/   r   r   r   rY   rL   r   rN   r   r   r   r   r   rh   r
   r   r   r   r'   r   r   r   rw   )r1   rV   rs   r}   r~   r   r:   r;   r   r   r   bnrW   br   r   r   r   r   r   Zdenompr   r2   r3   r     sH    


$



 zbessely._eval_nseries)r   )ra   rb   rc   rd   r   rg   rA   r?   rf   r<   r   rv   r   r   r   r   r   r2   r2   r   r3   rw     s   (
rw   c                       s~   e Zd ZdZej ZejZedd Z	dddZ
dd Zd	d
 Zdd Zdd Z fddZd fdd	Z fddZ  ZS )rO   a  
    Modified Bessel function of the first kind.

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

    The Bessel $I$ function is a solution to the modified Bessel equation

    .. math ::
        z^2 \frac{\mathrm{d}^2 w}{\mathrm{d}z^2}
        + z \frac{\mathrm{d}w}{\mathrm{d}z} + (z^2 + \nu^2)^2 w = 0.

    It can be defined as

    .. math ::
        I_\nu(z) = i^{-\nu} J_\nu(iz),

    where $J_\nu(z)$ is the Bessel function of the first kind.

    Examples
    ========

    >>> from sympy import besseli
    >>> from sympy.abc import z, n
    >>> besseli(n, z).diff(z)
    besseli(n - 1, z)/2 + besseli(n + 1, z)/2

    See Also
    ========

    besselj, bessely, besselk

    References
    ==========

    .. [1] https://functions.wolfram.com/Bessel-TypeFunctions/BesselI/

    c                 C   s  |j rX|j rtjS |jr"|j du s,t|jr2tjS t|jrL|jdurLtjS |j	rXtj
S t|tjtjfv rrtjS |tju rtjS |tju rd| tj S | r|| | |   t||  S |jr| rt| |S |t}|rt|  t||  S |jr*t|}||krbt||S n8| \}}|dkrbtd| t | t t|| S t|}||kr~t||S d S )NFTr   r=   )rT   r   rg   rL   r"   rY   rh   r[   ri   rj   rk   r#   rl   rm   rn   rO   rp   r   rN   r%   rq   r   r   rr   r2   r2   r3   r<     sB    

 


"
zbesseli.evalNc                 K   s   |j rt|t|| S d S r7   )r   r   _besselir1   r:   r;   Zlimitvarr_   r2   r2   r3   _eval_rewrite_as_tractable	  s    z"besseli._eval_rewrite_as_tractablec                 K   s(   t t t | d t|tt|  S rt   )r   r   r   rN   r$   ru   r2   r2   r3   r     s    z besseli._eval_rewrite_as_besseljc                 K   s   | j | j }|r|tS d S r7   r   r/   r   rw   r   r2   r2   r3   rx     s    z besseli._eval_rewrite_as_besselyc                 K   s   | j | j tS r7   )r   r/   r   rR   ru   r2   r2   r3   rz     s    zbesseli._eval_rewrite_as_jnc                 C   s   | j \}}|jr|jrdS d S r   r   r   r2   r2   r3   r     s    
zbesseli._eval_is_extended_realc           
         s   | j \}}z||}W n ty.   |  Y S 0 ||\}}|jr`|| d| t|d   S |jr|dkrrdn|}|||  }	|	jst|tdt	 |  S | S t
t| j|||dS )Nr=   r5   r   r|   )r/   r   r   r   rY   r&   r[   r   r   r   r   rO   r   r   r   r2   r3   r     s    

zbesseli._eval_as_leading_termr   c              	      s"  ddl m} | j\}}z||\}}	W n ttfyB   |  Y S 0 |	jrt||	 }
||| |}|d ||||	 }|t
ju r|S t|d | 	 }|| t|d  }|g}td|
d d D ]2}|||||   9 }t|| 	 }|| qt| | S tt| ||||S r   )r   r   r/   r   r   r   rY   r   r   r   r   rh   r
   r&   r   r   r   r   rO   r   r   r2   r3   r   2  s*    


zbesseli._eval_nseriesc                    s   ddl m  ddlm} |d }|tjtjfv r| j\ fddt|D |dt	d| d d  |g }t
tdt  t|  S t ||||S )Nr   r   r   r5   c                    sb   g | ]Z} t d  d d | t d  d d | d | t d | d d   t|  qS r=   r5   r   r   .0r   r   r:   r;   r2   r3   
<listcomp>X  s   .$z)besseli._eval_aseries.<locals>.<listcomp>r=   (sympy.functions.combinatorial.factorialsr   r   r   r   rl   rm   r/   r   r   r   r   r   r   r   _eval_aseriesr1   rs   args0rV   r}   r   pointr   r   r   r3   r   Q  s    
 zbesseli._eval_aseries)N)r   )ra   rb   rc   rd   r   rg   rA   r?   rf   r<   r   r   rx   rz   r   r   r   r   r   r2   r2   r   r3   rO     s   '
'
rO   c                       s   e Zd ZdZejZej Ze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 fdd	Z fddZ  ZS )besselka  
    Modified Bessel function of the second kind.

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

    The Bessel $K$ function of order $\nu$ is defined as

    .. math ::
        K_\nu(z) = \lim_{\mu \to \nu} \frac{\pi}{2}
                   \frac{I_{-\mu}(z) -I_\mu(z)}{\sin(\pi \mu)},

    where $I_\mu(z)$ is the modified Bessel function of the first kind.

    It is a solution of the modified Bessel equation, and linearly independent
    from $Y_\nu$.

    Examples
    ========

    >>> from sympy import besselk
    >>> from sympy.abc import z, n
    >>> besselk(n, z).diff(z)
    -besselk(n - 1, z)/2 - besselk(n + 1, z)/2

    See Also
    ========

    besselj, besseli, bessely

    References
    ==========

    .. [1] https://functions.wolfram.com/Bessel-TypeFunctions/BesselK/

    c                 C   sv   |j r6|j rtjS t|j du r&tjS t|j r6tjS |tjttj ttj fv rXtjS |j	rr|
 rrt| |S d S rE   )rT   r   rl   r"   ri   rk   r   rm   rh   rL   rn   r   r8   r2   r2   r3   r<     s    
zbesselk.evalc                 K   s8   |j du r4ttt|  t| |t||  d S d S )NFr=   )rL   r   r   rO   ru   r2   r2   r3   rv     s    
z besselk._eval_rewrite_as_besselic                 K   s   | j | j }|r|tS d S r7   )rv   r/   r   rN   )r1   r:   r;   r_   Zair2   r2   r3   r     s    z besselk._eval_rewrite_as_besseljc                 K   s   | j | j }|r|tS d S r7   r   r   r2   r2   r3   rx     s    z besselk._eval_rewrite_as_besselyc                 K   s   | j | j }|r|tS d S r7   )rx   r/   r   rS   )r1   r:   r;   r_   Zayr2   r2   r3   r     s    zbesselk._eval_rewrite_as_ync                 C   s   | j \}}|jr|jrdS d S r   r   r   r2   r2   r3   r     s    
zbesselk._eval_is_extended_realNc                 K   s   |j rt| t|| S d S r7   )r   r   _besselkr   r2   r2   r3   r     s    z"besselk._eval_rewrite_as_tractablec           
      C   s   | j \}}z||}W n ty.   |  Y S 0 ||\}}|jr|jrdt| tj td }	n:|j	rt
t||d t|   d }	ntd| d|	j||dS |jrttt|  td|  S | ||S d S )Nr=   z"Cannot proceed without knowing if z is zero or not.r   )r/   r   r   r   rY   rT   r   r   r   Z
is_nonzeror&   r!   r[   r   r   r   func)
r1   rV   r}   r~   r:   r;   r   r   r   r   r2   r2   r3   r     s     

$zbesselk._eval_as_leading_termr   c              	      s2  ddl m} | j\}}z||\}}	W n ttfyB   |  Y S 0 |	jr|d |||| }
|
t	j
u r|||  ||  |S ||| |}|jrt||	 }t||}d|d  t|d  | ||||}g g  }}t|
d }|t	j
kr`|
|  t|d  d }|| td|D ]4}|||| |  9 }t||  }|| q*|
| d|  dt|  }|t|d t	j  }|| td|d d D ]T}|||||   9 }t||  }|t|| d t|d   }|| q|t|  t|  | S |jrt|| |	 }t|| |	 }g g  }}t|d d D ]F}t||
d| |   dtd| | t|  }|t| q^t|d d D ]H}t| |
d| |   dt|d | t|  }|t| qt| t|  | S tdtt| ||||S )Nr   r   r=   r   r5   z4besselk expansion is only implemented for real order)r   r   r/   r   r   r   rY   r   r   r   rh   rL   r   rO   r   r
   r   r   r   r'   r   r   Zis_nonintegerr&   r   r   r   )r1   rV   rs   r}   r~   r   r:   r;   r   r   r   r   r   r   rW   r   r   r   r   r   r   Znewn_aZnewn_br   r2   r3   r     s\    



(


 

24zbesselk._eval_nseriesc                    s   ddl m  ddlm} |d }|tjtjfv r| j\ fddt|D |dt	d| d d  |g }t
 ttd  t|  S t ||||S )Nr   r   r   r5   c                    sb   g | ]Z} t d  d d | t d  d d | d| t d | d d   t|  qS r=   r5   r   r   r   r2   r3   r     s   .$z)besselk._eval_aseries.<locals>.<listcomp>r=   r   r   r   r   r3   r     s    
 zbesselk._eval_aseries)N)r   )ra   rb   rc   rd   r   rg   rA   r?   rf   r<   rv   r   rx   r   r   r   r   r   r   r   r2   r2   r   r3   r   _  s   %

Er   c                   @   s$   e Zd ZdZejZejZdd ZdS )hankel1a  
    Hankel function of the first kind.

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

    This function is defined as

    .. math ::
        H_\nu^{(1)} = J_\nu(z) + iY_\nu(z),

    where $J_\nu(z)$ is the Bessel function of the first kind, and
    $Y_\nu(z)$ is the Bessel function of the second kind.

    It is a solution to Bessel's equation.

    Examples
    ========

    >>> from sympy import hankel1
    >>> from sympy.abc import z, n
    >>> hankel1(n, z).diff(z)
    hankel1(n - 1, z)/2 - hankel1(n + 1, z)/2

    See Also
    ========

    hankel2, besselj, bessely

    References
    ==========

    .. [1] https://functions.wolfram.com/Bessel-TypeFunctions/HankelH1/

    c                 C   s(   | j }|jdu r$t| j | S d S rE   )r6   rF   hankel2r4   rG   rH   r2   r2   r3   rI   H  s    
zhankel1._eval_conjugateN	ra   rb   rc   rd   r   rg   rA   r?   rI   r2   r2   r2   r3   r      s   $r   c                   @   s$   e Zd ZdZejZejZdd ZdS )r   a  
    Hankel function of the second kind.

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

    This function is defined as

    .. math ::
        H_\nu^{(2)} = J_\nu(z) - iY_\nu(z),

    where $J_\nu(z)$ is the Bessel function of the first kind, and
    $Y_\nu(z)$ is the Bessel function of the second kind.

    It is a solution to Bessel's equation, and linearly independent from
    $H_\nu^{(1)}$.

    Examples
    ========

    >>> from sympy import hankel2
    >>> from sympy.abc import z, n
    >>> hankel2(n, z).diff(z)
    hankel2(n - 1, z)/2 - hankel2(n + 1, z)/2

    See Also
    ========

    hankel1, besselj, bessely

    References
    ==========

    .. [1] https://functions.wolfram.com/Bessel-TypeFunctions/HankelH2/

    c                 C   s(   | j }|jdu r$t| j | S d S rE   )r6   rF   r   r4   rG   rH   r2   r2   r3   rI   w  s    
zhankel2._eval_conjugateNr   r2   r2   r2   r3   r   N  s   %r   c                    s   t   fdd}|S )Nc                    s   |j r | ||S d S r7   )rL   r   fnr2   r3   g~  s    zassume_integer_order.<locals>.gr   )r   r   r2   r   r3   assume_integer_order}  s    r   c                   @   s*   e Zd ZdZdd Zdd Zd
ddZd	S )SphericalBesselBasea-  
    Base class for spherical Bessel functions.

    These are thin wrappers around ordinary Bessel functions,
    since spherical Bessel functions differ from the ordinary
    ones just by a slight change in order.

    To use this class, define the ``_eval_evalf()`` and ``_expand()`` methods.

    c                 K   s   t ddS )z@ Expand self into a polynomial. Nu is guaranteed to be Integer. Z	expansionNr   r1   r\   r2   r2   r3   _expand  s    zSphericalBesselBase._expandc                 K   s   | j jr| jf i |S | S r7   )r4   
is_Integerr   r   r2   r2   r3   rZ     s    z%SphericalBesselBase._eval_expand_funcr=   c                 C   s:   |dkrt | || | jd | j| | jd  | j  S r>   )r	   r@   r4   r6   rB   r2   r2   r3   rD     s
    
zSphericalBesselBase.fdiffN)r=   )ra   rb   rc   rd   r   rZ   rD   r2   r2   r2   r3   r     s   r   c                 C   s8   t | |t| tj| d  t |  d | t|  S Nr5   )r*   r   r   ro   r   rs   r;   r2   r2   r3   _jn  s    $r   c                 C   s8   t j| d  t|  d | t| t| |t|  S r   )r   ro   r*   r   r   r   r2   r2   r3   _yn  s    $r   c                   @   sD   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S )rR   a  
    Spherical Bessel function of the first kind.

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

    This function is a solution to the spherical Bessel equation

    .. math ::
        z^2 \frac{\mathrm{d}^2 w}{\mathrm{d}z^2}
          + 2z \frac{\mathrm{d}w}{\mathrm{d}z} + (z^2 - \nu(\nu + 1)) w = 0.

    It can be defined as

    .. math ::
        j_\nu(z) = \sqrt{\frac{\pi}{2z}} J_{\nu + \frac{1}{2}}(z),

    where $J_\nu(z)$ is the Bessel function of the first kind.

    The spherical Bessel functions of integral order are
    calculated using the formula:

    .. math:: j_n(z) = f_n(z) \sin{z} + (-1)^{n+1} f_{-n-1}(z) \cos{z},

    where the coefficients $f_n(z)$ are available as
    :func:`sympy.polys.orthopolys.spherical_bessel_fn`.

    Examples
    ========

    >>> from sympy import Symbol, jn, sin, cos, expand_func, besselj, bessely
    >>> z = Symbol("z")
    >>> nu = Symbol("nu", integer=True)
    >>> print(expand_func(jn(0, z)))
    sin(z)/z
    >>> expand_func(jn(1, z)) == sin(z)/z**2 - cos(z)/z
    True
    >>> expand_func(jn(3, z))
    (-6/z**2 + 15/z**4)*sin(z) + (1/z - 15/z**3)*cos(z)
    >>> jn(nu, z).rewrite(besselj)
    sqrt(2)*sqrt(pi)*sqrt(1/z)*besselj(nu + 1/2, z)/2
    >>> jn(nu, z).rewrite(bessely)
    (-1)**nu*sqrt(2)*sqrt(pi)*sqrt(1/z)*bessely(-nu - 1/2, z)/2
    >>> jn(2, 5.2+0.3j).evalf(20)
    0.099419756723640344491 - 0.054525080242173562897*I

    See Also
    ========

    besselj, bessely, besselk, yn

    References
    ==========

    .. [1] https://dlmf.nist.gov/10.47

    c                 C   sD   |j r*|j rtjS |jr*|jr$tjS tjS |tjtjfv r@tjS d S r7   )	rT   r   rg   rL   rY   rh   ri   rm   rl   r8   r2   r2   r3   r<     s    zjn.evalc                 K   s    t td|  t|tj | S rt   )r   r   rN   r   ry   ru   r2   r2   r3   r     s    zjn._eval_rewrite_as_besseljc                 K   s,   t j| ttd|   t| t j | S rt   )r   ro   r   r   rw   ry   ru   r2   r2   r3   rx     s    zjn._eval_rewrite_as_besselyc                 K   s   t j| t| d | S r   )r   ro   rS   ru   r2   r2   r3   r     s    zjn._eval_rewrite_as_ync                 K   s   t | j| jS r7   )r   r4   r6   r   r2   r2   r3   r     s    z
jn._expandc                 C   s   | j jr| t|S d S r7   r4   r   r   rN   _eval_evalfr1   precr2   r2   r3   r     s    zjn._eval_evalfN)ra   rb   rc   rd   rf   r<   r   rx   r   r   r   r2   r2   r2   r3   rR     s   9
rR   c                   @   s@   e Zd ZdZedd Zedd Zdd Zdd	 Zd
d Z	dS )rS   a  
    Spherical Bessel function of the second kind.

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

    This function is another solution to the spherical Bessel equation, and
    linearly independent from $j_n$. It can be defined as

    .. math ::
        y_\nu(z) = \sqrt{\frac{\pi}{2z}} Y_{\nu + \frac{1}{2}}(z),

    where $Y_\nu(z)$ is the Bessel function of the second kind.

    For integral orders $n$, $y_n$ is calculated using the formula:

    .. math:: y_n(z) = (-1)^{n+1} j_{-n-1}(z)

    Examples
    ========

    >>> from sympy import Symbol, yn, sin, cos, expand_func, besselj, bessely
    >>> z = Symbol("z")
    >>> nu = Symbol("nu", integer=True)
    >>> print(expand_func(yn(0, z)))
    -cos(z)/z
    >>> expand_func(yn(1, z)) == -cos(z)/z**2-sin(z)/z
    True
    >>> yn(nu, z).rewrite(besselj)
    (-1)**(nu + 1)*sqrt(2)*sqrt(pi)*sqrt(1/z)*besselj(-nu - 1/2, z)/2
    >>> yn(nu, z).rewrite(bessely)
    sqrt(2)*sqrt(pi)*sqrt(1/z)*bessely(nu + 1/2, z)/2
    >>> yn(2, 5.2+0.3j).evalf(20)
    0.18525034196069722536 + 0.014895573969924817587*I

    See Also
    ========

    besselj, bessely, besselk, jn

    References
    ==========

    .. [1] https://dlmf.nist.gov/10.47

    c                 K   s0   t j|d  ttd|   t| t j | S rX   )r   ro   r   r   rN   ry   ru   r2   r2   r3   r   3  s    zyn._eval_rewrite_as_besseljc                 K   s    t td|  t|tj | S rt   )r   r   rw   r   ry   ru   r2   r2   r3   rx   7  s    zyn._eval_rewrite_as_besselyc                 K   s   t j|d  t| d | S r   )r   ro   rR   ru   r2   r2   r3   rz   ;  s    zyn._eval_rewrite_as_jnc                 K   s   t | j| jS r7   )r   r4   r6   r   r2   r2   r3   r   >  s    z
yn._expandc                 C   s   | j jr| t|S d S r7   )r4   r   r   rw   r   r   r2   r2   r3   r   A  s    zyn._eval_evalfN)
ra   rb   rc   rd   r   r   rx   rz   r   r   r2   r2   r2   r3   rS     s   .

rS   c                   @   sL   e Zd Zedd Zedd Zdd Zdd Zd	d
 Zdd Z	dd Z
dS )SphericalHankelBasec                 K   sN   | j }ttd|  t|tj ||t tj|d   t| tj |   S r>   )_hankel_kind_signr   r   rN   r   ry   r   ro   r1   r:   r;   r_   hksr2   r2   r3   r   H  s    &z,SphericalHankelBase._eval_rewrite_as_besseljc                 K   sJ   | j }ttd|  tj| t| tj | |t t|tj |   S rt   )r   r   r   r   ro   rw   ry   r   r   r2   r2   r3   rx   Q  s    (z,SphericalHankelBase._eval_rewrite_as_besselyc                 K   s(   | j }t||t|t t||  S r7   )r   rR   r   rS   r   r   r2   r2   r3   r   Z  s    z'SphericalHankelBase._eval_rewrite_as_ync                 K   s(   | j }t|||t t||t  S r7   )r   rR   r   rS   r   r   r2   r2   r3   rz   ^  s    z'SphericalHankelBase._eval_rewrite_as_jnc                 K   sJ   | j jr| jf i |S | j }| j}| j}t|||t t||  S d S r7   )r4   r   r   r6   r   rR   r   rS   )r1   r\   r:   r;   r   r2   r2   r3   rZ   b  s    z%SphericalHankelBase._eval_expand_funcc                 K   s2   | j }| j}| j}t|||t t||   S r7   )r4   r6   r   r   r   r   expand)r1   r\   rs   r;   r   r2   r2   r3   r   k  s    
zSphericalHankelBase._expandc                 C   s   | j jr| t|S d S r7   r   r   r2   r2   r3   r   z  s    zSphericalHankelBase._eval_evalfN)ra   rb   rc   r   r   rx   r   rz   rZ   r   r   r2   r2   r2   r3   r   F  s   

	r   c                   @   s"   e Zd ZdZejZedd ZdS )rP   a  
    Spherical Hankel function of the first kind.

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

    This function is defined as

    .. math:: h_\nu^(1)(z) = j_\nu(z) + i y_\nu(z),

    where $j_\nu(z)$ and $y_\nu(z)$ are the spherical
    Bessel function of the first and second kinds.

    For integral orders $n$, $h_n^(1)$ is calculated using the formula:

    .. math:: h_n^(1)(z) = j_{n}(z) + i (-1)^{n+1} j_{-n-1}(z)

    Examples
    ========

    >>> from sympy import Symbol, hn1, hankel1, expand_func, yn, jn
    >>> z = Symbol("z")
    >>> nu = Symbol("nu", integer=True)
    >>> print(expand_func(hn1(nu, z)))
    jn(nu, z) + I*yn(nu, z)
    >>> print(expand_func(hn1(0, z)))
    sin(z)/z - I*cos(z)/z
    >>> print(expand_func(hn1(1, z)))
    -I*sin(z)/z - cos(z)/z + sin(z)/z**2 - I*cos(z)/z**2
    >>> hn1(nu, z).rewrite(jn)
    (-1)**(nu + 1)*I*jn(-nu - 1, z) + jn(nu, z)
    >>> hn1(nu, z).rewrite(yn)
    (-1)**nu*yn(-nu - 1, z) + I*yn(nu, z)
    >>> hn1(nu, z).rewrite(hankel1)
    sqrt(2)*sqrt(pi)*sqrt(1/z)*hankel1(nu, z)/2

    See Also
    ========

    hn2, jn, yn, hankel1, hankel2

    References
    ==========

    .. [1] https://dlmf.nist.gov/10.47

    c                 K   s   t td|  t|| S rt   )r   r   r   ru   r2   r2   r3   _eval_rewrite_as_hankel1  s    zhn1._eval_rewrite_as_hankel1N)	ra   rb   rc   rd   r   rg   r   r   r   r2   r2   r2   r3   rP     s   0rP   c                   @   s$   e Zd ZdZej Zedd ZdS )rQ   a  
    Spherical Hankel function of the second kind.

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

    This function is defined as

    .. math:: h_\nu^(2)(z) = j_\nu(z) - i y_\nu(z),

    where $j_\nu(z)$ and $y_\nu(z)$ are the spherical
    Bessel function of the first and second kinds.

    For integral orders $n$, $h_n^(2)$ is calculated using the formula:

    .. math:: h_n^(2)(z) = j_{n} - i (-1)^{n+1} j_{-n-1}(z)

    Examples
    ========

    >>> from sympy import Symbol, hn2, hankel2, expand_func, jn, yn
    >>> z = Symbol("z")
    >>> nu = Symbol("nu", integer=True)
    >>> print(expand_func(hn2(nu, z)))
    jn(nu, z) - I*yn(nu, z)
    >>> print(expand_func(hn2(0, z)))
    sin(z)/z + I*cos(z)/z
    >>> print(expand_func(hn2(1, z)))
    I*sin(z)/z - cos(z)/z + sin(z)/z**2 + I*cos(z)/z**2
    >>> hn2(nu, z).rewrite(hankel2)
    sqrt(2)*sqrt(pi)*sqrt(1/z)*hankel2(nu, z)/2
    >>> hn2(nu, z).rewrite(jn)
    -(-1)**(nu + 1)*I*jn(-nu - 1, z) + jn(nu, z)
    >>> hn2(nu, z).rewrite(yn)
    (-1)**nu*yn(-nu - 1, z) - I*yn(nu, z)

    See Also
    ========

    hn1, jn, yn, hankel1, hankel2

    References
    ==========

    .. [1] https://dlmf.nist.gov/10.47

    c                 K   s   t td|  t|| S rt   )r   r   r   ru   r2   r2   r3   _eval_rewrite_as_hankel2  s    zhn2._eval_rewrite_as_hankel2N)	ra   rb   rc   rd   r   rg   r   r   r   r2   r2   r2   r3   rQ     s   0rQ   sympy   c                    s  ddl m} dkrTddlm  ddlm} || fddtd|d D S d	krdd
lm zddl	m
 fdd}W q ty   ddl	m fdd}Y q0 ntdfdd}| }|||}|g}	t|d D ]}
|||| }|	| q|	S )a  
    Zeros of the spherical Bessel function of the first kind.

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

    This returns an array of zeros of $jn$ up to the $k$-th zero.

    * method = "sympy": uses `mpmath.besseljzero
      <https://mpmath.org/doc/current/functions/bessel.html#mpmath.besseljzero>`_
    * method = "scipy": uses the
      `SciPy's sph_jn <https://docs.scipy.org/doc/scipy/reference/generated/scipy.special.jn_zeros.html>`_
      and
      `newton <https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.newton.html>`_
      to find all
      roots, which is faster than computing the zeros using a general
      numerical solver, but it requires SciPy and only works with low
      precision floating point numbers. (The function used with
      method="sympy" is a recent addition to mpmath; before that a general
      solver was used.)

    Examples
    ========

    >>> from sympy import jn_zeros
    >>> jn_zeros(2, 4, dps=5)
    [5.7635, 9.095, 12.323, 15.515]

    See Also
    ========

    jn, yn, besselj, besselk, bessely

    Parameters
    ==========

    n : integer
        order of Bessel function

    k : integer
        number of zeros to return


    r   )r   r   )besseljzero)dps_to_precc                    s0   g | ](}t  td  t|qS )g      ?)r   _from_mpmathr   
_to_mpmathint)r   l)r   rs   r   r2   r3   r   "  s   zjn_zeros.<locals>.<listcomp>r5   scipy)newton)spherical_jnc                    s
    | S r7   r2   rV   )rs   r   r2   r3   <lambda>)      zjn_zeros.<locals>.<lambda>)sph_jnc                    s    | d d S )Nr   r   r2   r   )rs   r   r2   r3   r   ,  r   Unknown method.c                    s     dkr| |}nt d|S )Nr   r   r   )r]   rV   r    )methodr   r2   r3   solver0  s    zjn_zeros.<locals>.solver)mathr   mpmathr   Zmpmath.libmp.libmpfr   r   Zscipy.optimizer   Zscipy.specialr   ImportErrorr   r   r   )rs   r   r   ZdpsZmath_pir   r]   r   r    rootsir2   )r   r   rs   r   r   r   r   r3   jn_zeros  s2    -
r   c                   @   s4   e Zd ZdZdd Zdd ZdddZdd	d
ZdS )AiryBasezg
    Abstract base class for Airy functions.

    This class is meant to reduce code duplication.

    c                 C   s   |  | jd  S Nr   )r   r/   rG   r0   r2   r2   r3   rI   K  s    zAiryBase._eval_conjugatec                 C   s   | j d jS r   )r/   r   r0   r2   r2   r3   r   N  s    zAiryBase._eval_is_extended_realTc                 K   sL   | j d }| }| j}|||| d }t||||  d }||fS )Nr   r=   )r/   rG   r   r   )r1   deepr\   r;   Zzcr]   uvr2   r2   r3   as_real_imagQ  s    
zAiryBase.as_real_imagc                 K   s$   | j f d|i|\}}||t  S )Nr   )r   r   )r1   r   r\   Zre_partZim_partr2   r2   r3   _eval_expand_complexY  s    zAiryBase._eval_expand_complexN)T)T)ra   rb   rc   rd   rI   r   r   r   r2   r2   r2   r3   r   C  s
   
r   c                   @   s^   e Zd ZdZdZdZedd ZdddZe	e
dd	 Zd
d Zdd Zdd Zdd ZdS )airyaia  
    The Airy function $\operatorname{Ai}$ of the first kind.

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

    The Airy function $\operatorname{Ai}(z)$ is defined to be the function
    satisfying Airy's differential equation

    .. math::
        \frac{\mathrm{d}^2 w(z)}{\mathrm{d}z^2} - z w(z) = 0.

    Equivalently, for real $z$

    .. math::
        \operatorname{Ai}(z) := \frac{1}{\pi}
        \int_0^\infty \cos\left(\frac{t^3}{3} + z t\right) \mathrm{d}t.

    Examples
    ========

    Create an Airy function object:

    >>> from sympy import airyai
    >>> from sympy.abc import z

    >>> airyai(z)
    airyai(z)

    Several special values are known:

    >>> airyai(0)
    3**(1/3)/(3*gamma(2/3))
    >>> from sympy import oo
    >>> airyai(oo)
    0
    >>> airyai(-oo)
    0

    The Airy function obeys the mirror symmetry:

    >>> from sympy import conjugate
    >>> conjugate(airyai(z))
    airyai(conjugate(z))

    Differentiation with respect to $z$ is supported:

    >>> from sympy import diff
    >>> diff(airyai(z), z)
    airyaiprime(z)
    >>> diff(airyai(z), z, 2)
    z*airyai(z)

    Series expansion is also supported:

    >>> from sympy import series
    >>> series(airyai(z), z, 0, 3)
    3**(5/6)*gamma(1/3)/(6*pi) - 3**(1/6)*z*gamma(2/3)/(2*pi) + O(z**3)

    We can numerically evaluate the Airy function to arbitrary precision
    on the whole complex plane:

    >>> airyai(-2).evalf(50)
    0.22740742820168557599192443603787379946077222541710

    Rewrite $\operatorname{Ai}(z)$ in terms of hypergeometric functions:

    >>> from sympy import hyper
    >>> airyai(z).rewrite(hyper)
    -3**(2/3)*z*hyper((), (4/3,), z**3/9)/(3*gamma(1/3)) + 3**(1/3)*hyper((), (2/3,), z**3/9)/(3*gamma(2/3))

    See Also
    ========

    airybi: Airy function of the second kind.
    airyaiprime: Derivative of the Airy function of the first kind.
    airybiprime: Derivative of the Airy function of the second kind.

    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Airy_function
    .. [2] https://dlmf.nist.gov/9
    .. [3] https://encyclopediaofmath.org/wiki/Airy_functions
    .. [4] https://mathworld.wolfram.com/AiryFunctions.html

    r5   Tc                 C   s   |j r^|tju rtjS |tju r&tjS |tju r6tjS |jr^tjdtdd t	tdd  S |jrtjdtdd t	tdd  S d S )Nr   r=   )
	is_Numberr   rk   rl   rh   rm   rT   rg   r   r&   r9   r   r2   r2   r3   r<     s    


"zairyai.evalc                 C   s$   |dkrt | jd S t| |d S Nr5   r   )airyaiprimer/   r	   rB   r2   r2   r3   rD     s    zairyai.fdiffc                 G   s:  | dk rt jS t|}t|dkr|d }td| |   td| | d   tt| tdd tdd   t|  t	| d tdd  tt| tdd tdd  t| d  t	| d tdd   | S t j
dtdd t  t	| t j
 t d  ttddt | t j
   t|  td| |   S d S )Nr   r5   r   r   r=   r{   )r   rh   r   lenr   r   r   r   r   r&   rg   rs   rV   Zprevious_termsr   r2   r2   r3   taylor_term  s"    L@Hzairyai.taylor_termc                 K   s`   t dd}t dd}t| t dd}t|jr\|t|  t| || t|||   S d S Nr5   r   r=   r   r   r"   r[   r   rN   r1   r;   r_   otttrW   r2   r2   r3   r     s
    


zairyai._eval_rewrite_as_besseljc                 K   s   t dd}t dd}t|t dd}t|jrX|t| t| || t|||   S |t||t| ||  |t||  t|||    S d S r  r   r   r"   rY   r   rO   r
  r2   r2   r3   rv     s    


*zairyai._eval_rewrite_as_besselic                 K   s~   t jdtdd ttdd  }|tddttdd  }|tg tddg|d d  |tg tddg|d d   S )Nr   r=   r5   	   r{   )r   rg   r   r&   r    r)   r1   r;   r_   Zpf1Zpf2r2   r2   r3   _eval_rewrite_as_hyper  s    "zairyai._eval_rewrite_as_hyperc                 K   s   | j d }|j}t|dkr| }td|gd}td|gd}td|gd}td|gd}|||||  |  }	|	d ur|	| }d| jr|	| }|	| }|	| }|||  | || |||    }
|||  |||   }tj|
tj	 t
| |
tj	 td t|   S d S 	Nr   r5   r   )excludedmrs   r   )r/   free_symbolsr  popr   matchrL   r   ry   rg   r   r   airybir1   r\   r   Zsymbsr;   r   r  r  rs   MpfZnewargr2   r2   r3   rZ     s$    

$zairyai._eval_expand_funcN)r5   ra   rb   rc   rd   nargs
unbranchedrf   r<   rD   staticmethodr   r  r   rv   r  rZ   r2   r2   r2   r3   r   ^  s   X

	r   c                   @   s^   e Zd ZdZdZdZedd ZdddZe	e
dd	 Zd
d Zdd Zdd Zdd ZdS )r  a  
    The Airy function $\operatorname{Bi}$ of the second kind.

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

    The Airy function $\operatorname{Bi}(z)$ is defined to be the function
    satisfying Airy's differential equation

    .. math::
        \frac{\mathrm{d}^2 w(z)}{\mathrm{d}z^2} - z w(z) = 0.

    Equivalently, for real $z$

    .. math::
        \operatorname{Bi}(z) := \frac{1}{\pi}
                 \int_0^\infty
                   \exp\left(-\frac{t^3}{3} + z t\right)
                   + \sin\left(\frac{t^3}{3} + z t\right) \mathrm{d}t.

    Examples
    ========

    Create an Airy function object:

    >>> from sympy import airybi
    >>> from sympy.abc import z

    >>> airybi(z)
    airybi(z)

    Several special values are known:

    >>> airybi(0)
    3**(5/6)/(3*gamma(2/3))
    >>> from sympy import oo
    >>> airybi(oo)
    oo
    >>> airybi(-oo)
    0

    The Airy function obeys the mirror symmetry:

    >>> from sympy import conjugate
    >>> conjugate(airybi(z))
    airybi(conjugate(z))

    Differentiation with respect to $z$ is supported:

    >>> from sympy import diff
    >>> diff(airybi(z), z)
    airybiprime(z)
    >>> diff(airybi(z), z, 2)
    z*airybi(z)

    Series expansion is also supported:

    >>> from sympy import series
    >>> series(airybi(z), z, 0, 3)
    3**(1/3)*gamma(1/3)/(2*pi) + 3**(2/3)*z*gamma(2/3)/(2*pi) + O(z**3)

    We can numerically evaluate the Airy function to arbitrary precision
    on the whole complex plane:

    >>> airybi(-2).evalf(50)
    -0.41230258795639848808323405461146104203453483447240

    Rewrite $\operatorname{Bi}(z)$ in terms of hypergeometric functions:

    >>> from sympy import hyper
    >>> airybi(z).rewrite(hyper)
    3**(1/6)*z*hyper((), (4/3,), z**3/9)/gamma(1/3) + 3**(5/6)*hyper((), (2/3,), z**3/9)/(3*gamma(2/3))

    See Also
    ========

    airyai: Airy function of the first kind.
    airyaiprime: Derivative of the Airy function of the first kind.
    airybiprime: Derivative of the Airy function of the second kind.

    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Airy_function
    .. [2] https://dlmf.nist.gov/9
    .. [3] https://encyclopediaofmath.org/wiki/Airy_functions
    .. [4] https://mathworld.wolfram.com/AiryFunctions.html

    r5   Tc                 C   s   |j r^|tju rtjS |tju r&tjS |tju r6tjS |jr^tjdtdd t	tdd  S |jrtjdtdd t	tdd  S d S )Nr   r5      r=   )
r  r   rk   rl   rm   rh   rT   rg   r   r&   r  r2   r2   r3   r<   h  s    


"zairybi.evalc                 C   s$   |dkrt | jd S t| |d S r  )airybiprimer/   r	   rB   r2   r2   r3   rD   w  s    zairybi.fdiffc                 G   s  | dk rt jS t|}t|dkr|d }td| tttddt | t j	   t
| t j	 t d  | t j	 tttddt | t j   t
| d t d   | S t j	tddt  t| t j	 t d  tttddt | t j	   t
|  td| |   S d S )Nr   r5   r   r   r=   r   )r   rh   r   r  r   r!   r   r   r   rg   r   r   ry   r    r&   r  r2   r2   r3   r  }  s    @<Hzairybi.taylor_termc                 K   s`   t dd}t dd}t| t dd}t|jr\t| d t| || t|||   S d S r  r	  r
  r2   r2   r3   r     s
    


zairybi._eval_rewrite_as_besseljc                 K   s   t dd}t dd}t|t dd}t|jr\t|td t| || t|||   S t||}t|| }t||t| ||  || t|||    S d S r  r  r1   r;   r_   r  r  rW   r   r   r2   r2   r3   rv     s    


.
zairybi._eval_rewrite_as_besselic                 K   sz   t jtddttdd  }|tdd ttdd }|tg tddg|d d  |tg tddg|d d   S )Nr   r   r=   r5   r  r{   )r   rg   r    r&   r   r)   r  r2   r2   r3   r    s    zairybi._eval_rewrite_as_hyperc                 K   s   | j d }|j}t|dkr| }td|gd}td|gd}td|gd}td|gd}|||||  |  }	|	d ur|	| }d| jr|	| }|	| }|	| }|||  | || |||    }
|||  |||   }tjt	dtj
|
  t| tj
|
 t|   S d S r  )r/   r  r  r  r   r  rL   r   ry   r   rg   r   r  r  r2   r2   r3   rZ     s$    

$zairybi._eval_expand_funcN)r5   r  r2   r2   r2   r3   r  
  s   Z

r  c                   @   sV   e Zd ZdZdZdZedd ZdddZdd	 Z	d
d Z
dd Zdd Zdd ZdS )r  a%  
    The derivative $\operatorname{Ai}^\prime$ of the Airy function of the first
    kind.

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

    The Airy function $\operatorname{Ai}^\prime(z)$ is defined to be the
    function

    .. math::
        \operatorname{Ai}^\prime(z) := \frac{\mathrm{d} \operatorname{Ai}(z)}{\mathrm{d} z}.

    Examples
    ========

    Create an Airy function object:

    >>> from sympy import airyaiprime
    >>> from sympy.abc import z

    >>> airyaiprime(z)
    airyaiprime(z)

    Several special values are known:

    >>> airyaiprime(0)
    -3**(2/3)/(3*gamma(1/3))
    >>> from sympy import oo
    >>> airyaiprime(oo)
    0

    The Airy function obeys the mirror symmetry:

    >>> from sympy import conjugate
    >>> conjugate(airyaiprime(z))
    airyaiprime(conjugate(z))

    Differentiation with respect to $z$ is supported:

    >>> from sympy import diff
    >>> diff(airyaiprime(z), z)
    z*airyai(z)
    >>> diff(airyaiprime(z), z, 2)
    z*airyaiprime(z) + airyai(z)

    Series expansion is also supported:

    >>> from sympy import series
    >>> series(airyaiprime(z), z, 0, 3)
    -3**(2/3)/(3*gamma(1/3)) + 3**(1/3)*z**2/(6*gamma(2/3)) + O(z**3)

    We can numerically evaluate the Airy function to arbitrary precision
    on the whole complex plane:

    >>> airyaiprime(-2).evalf(50)
    0.61825902074169104140626429133247528291577794512415

    Rewrite $\operatorname{Ai}^\prime(z)$ in terms of hypergeometric functions:

    >>> from sympy import hyper
    >>> airyaiprime(z).rewrite(hyper)
    3**(1/3)*z**2*hyper((), (5/3,), z**3/9)/(6*gamma(2/3)) - 3**(2/3)*hyper((), (1/3,), z**3/9)/(3*gamma(1/3))

    See Also
    ========

    airyai: Airy function of the first kind.
    airybi: Airy function of the second kind.
    airybiprime: Derivative of the Airy function of the second kind.

    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Airy_function
    .. [2] https://dlmf.nist.gov/9
    .. [3] https://encyclopediaofmath.org/wiki/Airy_functions
    .. [4] https://mathworld.wolfram.com/AiryFunctions.html

    r5   Tc                 C   sR   |j r&|tju rtjS |tju r&tjS |jrNtjdtdd ttdd  S d S )Nr   r5   )	r  r   rk   rl   rh   rT   ro   r   r&   r  r2   r2   r3   r<     s    

zairyaiprime.evalc                 C   s.   |dkr | j d t| j d  S t| |d S r  )r/   r   r	   rB   r2   r2   r3   rD     s    zairyaiprime.fdiffc                 C   sR   | j d |}t| tj|dd}W d    n1 s<0    Y  t||S Nr   r5   )Z
derivative)r/   r   r,   r+   r   r   r   r1   r   r;   resr2   r2   r3   r   !  s    
,zairyaiprime._eval_evalfc                 K   sP   t dd}t| t dd}t|jrL|d t| || t|||   S d S Nr=   r   )r   r   r"   r[   rN   r1   r;   r_   r  rW   r2   r2   r3   r   '  s    

z$airyaiprime._eval_rewrite_as_besseljc                 K   s   t dd}t dd}|t|t dd }t|jrP|d t||t| |  S t|t dd}t||}t|| }||d | t|||  |t| ||    S d S r  )r   r   r"   rY   rO   r"  r2   r2   r3   rv   -  s    



z$airyaiprime._eval_rewrite_as_besselic                 K   s   |d ddt dd  tt dd  }dtddtt dd  }|tg t ddg|d d  |tg t ddg|d d   S )Nr=   r   r5      r  )r   r&   r    r)   r  r2   r2   r3   r  9  s    (z"airyaiprime._eval_rewrite_as_hyperc                 K   s   | j d }|j}t|dkr| }td|gd}td|gd}td|gd}td|gd}|||||  |  }	|	d ur|	| }d| jr|	| }|	| }|	| }|| |||   |||  |  }
|||  |||   }tj|
tj	 t
| |
tj	 td t|   S d S r  )r/   r  r  r  r   r  rL   r   ry   rg   r  r   r!  r  r2   r2   r3   rZ   >  s$    

$zairyaiprime._eval_expand_funcN)r5   ra   rb   rc   rd   r  r  rf   r<   rD   r   r   rv   r  rZ   r2   r2   r2   r3   r    s   Q


r  c                   @   sV   e Zd ZdZdZdZedd ZdddZdd	 Z	d
d Z
dd Zdd Zdd ZdS )r!  a6  
    The derivative $\operatorname{Bi}^\prime$ of the Airy function of the first
    kind.

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

    The Airy function $\operatorname{Bi}^\prime(z)$ is defined to be the
    function

    .. math::
        \operatorname{Bi}^\prime(z) := \frac{\mathrm{d} \operatorname{Bi}(z)}{\mathrm{d} z}.

    Examples
    ========

    Create an Airy function object:

    >>> from sympy import airybiprime
    >>> from sympy.abc import z

    >>> airybiprime(z)
    airybiprime(z)

    Several special values are known:

    >>> airybiprime(0)
    3**(1/6)/gamma(1/3)
    >>> from sympy import oo
    >>> airybiprime(oo)
    oo
    >>> airybiprime(-oo)
    0

    The Airy function obeys the mirror symmetry:

    >>> from sympy import conjugate
    >>> conjugate(airybiprime(z))
    airybiprime(conjugate(z))

    Differentiation with respect to $z$ is supported:

    >>> from sympy import diff
    >>> diff(airybiprime(z), z)
    z*airybi(z)
    >>> diff(airybiprime(z), z, 2)
    z*airybiprime(z) + airybi(z)

    Series expansion is also supported:

    >>> from sympy import series
    >>> series(airybiprime(z), z, 0, 3)
    3**(1/6)/gamma(1/3) + 3**(5/6)*z**2/(6*gamma(2/3)) + O(z**3)

    We can numerically evaluate the Airy function to arbitrary precision
    on the whole complex plane:

    >>> airybiprime(-2).evalf(50)
    0.27879516692116952268509756941098324140300059345163

    Rewrite $\operatorname{Bi}^\prime(z)$ in terms of hypergeometric functions:

    >>> from sympy import hyper
    >>> airybiprime(z).rewrite(hyper)
    3**(5/6)*z**2*hyper((), (5/3,), z**3/9)/(6*gamma(2/3)) + 3**(1/6)*hyper((), (1/3,), z**3/9)/gamma(1/3)

    See Also
    ========

    airyai: Airy function of the first kind.
    airybi: Airy function of the second kind.
    airyaiprime: Derivative of the Airy function of the first kind.

    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Airy_function
    .. [2] https://dlmf.nist.gov/9
    .. [3] https://encyclopediaofmath.org/wiki/Airy_functions
    .. [4] https://mathworld.wolfram.com/AiryFunctions.html

    r5   Tc                 C   s~   |j rX|tju rtjS |tju r&tjS |tju r6tjS |jrXdtdd ttdd S |jrzdtdd ttdd S d S )Nr   r5   r   )	r  r   rk   rl   rm   rh   rT   r   r&   r  r2   r2   r3   r<     s    


zairybiprime.evalc                 C   s.   |dkr | j d t| j d  S t| |d S r  )r/   r  r	   rB   r2   r2   r3   rD     s    zairybiprime.fdiffc                 C   sR   | j d |}t| tj|dd}W d    n1 s<0    Y  t||S r#  )r/   r   r,   r+   r  r   r   r$  r2   r2   r3   r     s    
,zairybiprime._eval_evalfc                 K   sR   t dd}|t| t dd }t|jrN| td t| |t||  S d S r&  r	  r'  r2   r2   r3   r     s    

z$airybiprime._eval_rewrite_as_besseljc                 K   s   t dd}t dd}|t|t dd }t|jrT|td t| |t||  S t|t dd}t||}t|| }t||t| ||  |d | t|||    S d S r  r  r"  r2   r2   r3   rv     s    


"
z$airybiprime._eval_rewrite_as_besselic                 K   s|   |d dt dd ttdd  }t ddttdd }|tg tddg|d d  |tg tddg|d d   S )Nr=   r   r   r5   r(  r  )r    r&   r   r)   r  r2   r2   r3   r    s    $z"airybiprime._eval_rewrite_as_hyperc                 K   s   | j d }|j}t|dkr| }td|gd}td|gd}td|gd}td|gd}|||||  |  }	|	d ur|	| }d| jr|	| }|	| }|	| }|| |||   |||  |  }
|||  |||   }tjt	d|
tj
  t| |
tj
 t|   S d S r  )r/   r  r  r  r   r  rL   r   ry   r   rg   r  r!  r  r2   r2   r3   rZ     s$    

$zairybiprime._eval_expand_funcN)r5   r)  r2   r2   r2   r3   r!  X  s   S

r!  c                   @   sF   e Zd ZdZedd ZdddZdd Zd	d
 Zdd Z	dd Z
dS )marcumqa  
    The Marcum Q-function.

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

    The Marcum Q-function is defined by the meromorphic continuation of

    .. math::
        Q_m(a, b) = a^{- m + 1} \int_{b}^{\infty} x^{m} e^{- \frac{a^{2}}{2} - \frac{x^{2}}{2}} I_{m - 1}\left(a x\right)\, dx

    Examples
    ========

    >>> from sympy import marcumq
    >>> from sympy.abc import m, a, b
    >>> marcumq(m, a, b)
    marcumq(m, a, b)

    Special values:

    >>> marcumq(m, 0, b)
    uppergamma(m, b**2/2)/gamma(m)
    >>> marcumq(0, 0, 0)
    0
    >>> marcumq(0, a, 0)
    1 - exp(-a**2/2)
    >>> marcumq(1, a, a)
    1/2 + exp(-a**2)*besseli(0, a**2)/2
    >>> marcumq(2, a, a)
    1/2 + exp(-a**2)*besseli(0, a**2)/2 + exp(-a**2)*besseli(1, a**2)

    Differentiation with respect to $a$ and $b$ is supported:

    >>> from sympy import diff
    >>> diff(marcumq(m, a, b), a)
    a*(-marcumq(m, a, b) + marcumq(m + 1, a, b))
    >>> diff(marcumq(m, a, b), b)
    -a**(1 - m)*b**m*exp(-a**2/2 - b**2/2)*besseli(m - 1, a*b)

    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Marcum_Q-function
    .. [2] https://mathworld.wolfram.com/MarcumQ-Function.html

    c                 C   sZ  |t ju r@|t ju r$|t ju r$t jS t||d t j t| S |t ju rn|t ju rnddt|d t j   S ||kr|t ju rdt|d  td|d   t j S |dkrt jt jt|d   td|d   t|d  td|d   S |jr,|jr|jrt jS t||d t j t| S |jrV|jrVddt|d t j   S d S )Nr=   r5   r   )	r   rh   r(   ry   r&   r   rg   rO   rT   )r9   r  rW   r   r2   r2   r3   r<   -  s"    

&Dzmarcumq.evalr=   c                 C   s   | j \}}}|dkr6|t||| td| ||  S |dkr||  ||d   t|d |d   d  t|d ||  S t| |d S )Nr=   r5   r   )r/   r*  r   rO   r	   )r1   rC   r  rW   r   r2   r2   r3   rD   E  s    "Bzmarcumq.fdiffc                 K   sp   ddl m} |dttdj}|d|  ||| t|d |d   d  t|d ||  ||tj	g S )Nr   )IntegralrV   r5   r=   )
Zsympy.integrals.integralsr+  getr   r   namer   rO   r   rl   )r1   r  rW   r   r_   r+  rV   r2   r2   r3   _eval_rewrite_as_IntegralN  s
    
@z!marcumq._eval_rewrite_as_Integralc                 K   sb   ddl m} |dtd}t|d |d   d ||| | t|||  |d| tjg S )Nr   )Sumr   r=   r5   )Zsympy.concrete.summationsr/  r,  r   r   rO   r   rl   )r1   r  rW   r   r_   r/  r   r2   r2   r3   _eval_rewrite_as_SumT  s    zmarcumq._eval_rewrite_as_Sumc                    s    |kr|dkr4dt  d  td d   d S |jr|dkrt fddtd|D }tjt  d  td d  d  t  d  |  S d S )Nr5   r=   r   c                 3   s   | ]}t | d  V  qdS )r=   N)rO   )r   r   rW   r2   r3   	<genexpr>^  r   z3marcumq._eval_rewrite_as_besseli.<locals>.<genexpr>)r   rO   r   sumr   r   ry   )r1   r  rW   r   r_   r   r2   r1  r3   rv   Y  s    $z marcumq._eval_rewrite_as_besselic                 C   s   t dd | jD rdS d S )Nc                 s   s   | ]}|j V  qd S r7   )rT   )r   r   r2   r2   r3   r2  b  r   z(marcumq._eval_is_zero.<locals>.<genexpr>T)allr/   r0   r2   r2   r3   _eval_is_zeroa  s    zmarcumq._eval_is_zeroN)r=   )ra   rb   rc   rd   rf   r<   rD   r.  r0  rv   r5  r2   r2   r2   r3   r*    s   0

	r*  c                       s6   e Zd ZdZ fddZdd Zd	 fdd	Z  ZS )
r   zq
    Helper function to make the $\mathrm{besseli}(nu, z)$
    function tractable for the Gruntz algorithm.

    c                    s   ddl m  ddlm} |d }|tjtjfv r| j\ fddt|D }t	t
d t|  |dtd| d d  | S t ||||S )Nr   r   r   r5   c                    sb   g | ]Z} t d  d d | t d  d d | d | t d | d d   t|  qS r   r   r   r   r2   r3   r   s  s   $z*_besseli._eval_aseries.<locals>.<listcomp>r=   r   r   r   r   r   rl   rm   r/   r   r   r   r   r   r   r   r1   rs   r   rV   r}   r   r   r   r   r   r3   r   l  s    
4z_besseli._eval_aseriesc                 K   s   t | t|| S r7   )r   rO   ru   r2   r2   r3   _eval_rewrite_as_intractabley  s    z%_besseli._eval_rewrite_as_intractabler   c                    sB   | j d |d}|jr2| j| j  }||||S t |||S r   r/   limitrT   r8  r   r   r1   rV   rs   r}   r~   Zx0r]   r   r2   r3   r   |  s
    z_besseli._eval_nseries)r   ra   rb   rc   rd   r   r8  r   r   r2   r2   r   r3   r   e  s   r   c                       s6   e Zd ZdZ fddZdd Zd	 fdd	Z  ZS )
r   zq
    Helper function to make the $\mathrm{besselk}(nu, z)$
    function tractable for the Gruntz algorithm.

    c                    s   ddl m  ddlm} |d }|tjtjfv r| j\ fddt|D }t	t
d t|  |dtd| d d  | S t ||||S )Nr   r   r   r5   c                    sb   g | ]Z} t d  d d | t d  d d | d| t d | d d   t|  qS r   r   r   r   r2   r3   r     s   $z*_besselk._eval_aseries.<locals>.<listcomp>r=   r6  r7  r   r   r3   r     s    
4z_besselk._eval_aseriesc                 K   s   t |t|| S r7   )r   r   ru   r2   r2   r3   r8    s    z%_besselk._eval_rewrite_as_intractabler   c                    sB   | j d |d}|jr2| j| j  }||||S t |||S r   r9  r;  r   r2   r3   r     s
    z_besselk._eval_nseries)r   r<  r2   r2   r   r3   r     s   r   N)r   r   )X	functoolsr   Z
sympy.corer   Zsympy.core.addr   Zsympy.core.cacher   Zsympy.core.exprr   Zsympy.core.functionr   r	   r
   Zsympy.core.logicr   r   Zsympy.core.numbersr   r   r   Zsympy.core.powerr   Zsympy.core.symbolr   r   r   Zsympy.core.sympifyr   r   r   r   Z(sympy.functions.elementary.trigonometricr   r   r   r   Z#sympy.functions.elementary.integersr   Z&sympy.functions.elementary.exponentialr   r   Z(sympy.functions.elementary.miscellaneousr   r   r    Z$sympy.functions.elementary.complexesr!   r"   r#   r$   r%   Z'sympy.functions.special.gamma_functionsr&   r'   r(   Zsympy.functions.special.hyperr)   Zsympy.polys.orthopolysr*   r   r+   r,   r-   rN   rw   rO   r   r   r   r   r   r   r   rR   rS   r   rP   rQ   r   r   r   r  r  r!  r*  r   r   r2   r2   r2   r3   <module>   sj   F 1  * B./XB988
T - 2  %i