B
    ['                 @   s@  d Z ddlmZmZ ddlmZ ddlmZ ddlm	Z	 ddl
mZmZ ddlmZ ddlmZmZmZmZmZ dd	lmZmZ dd
lmZ dd Zed/ddZdd Zd0ddZdd Zed1ddZdd Z ed2ddZ!dd Z"ed3dd Z#d!d" Z$ed4d#d$Z%d%d& Z&ed5d'd(Z'd)d* Z(d+d, Z)d6d-d.Z*dS )7z;Efficient functions for generating orthogonal polynomials.     )print_functiondivision)Dummy)public)construct_domain)PolyPurePoly)DMP)dup_muldup_mul_ground
dup_lshiftdup_subdup_add)ZZQQ)rangec             C   s  |j g|| |d |d || |d gg}xZtd| d D ]F}|||| |  || |d|  |d  }|| |d|  |j  || ||   |d|  }|| |d|  |j  || |d|  |d  || |d|   |d|  }|| |j  || |j   || |d|   | }	t|d ||}
tt|d d|||}t|d |	|}|tt|
|||| qBW ||  S )z0Low-level implementation of Jacobi polynomials.       )oner   r   r   appendr   r   )nabKseqiZdenZf0f1f2Zp0p1p2 r"   5lib/python3.7/site-packages/sympy/polys/orthopolys.py
dup_jacobi   s    006V4r$   NFc             C   s~   | dk rt d|  t||gdd\}}ttt| |d |d ||}|dk	r^t||}nt|td}|rv|S |	 S )a  Generates Jacobi polynomial of degree `n` in `x`.

    Parameters
    ----------
    n : int
        `n` decides the degree of polynomial
    a
        Lower limit of minimal domain for the list of
        coefficients.
    b
        Upper limit of minimal domain for the list of
        coefficients.
    x : optional
    polys : bool, optional
        ``polys=True`` returns an expression, otherwise
        (default) returns an expression.
    r   z-can't generate Jacobi polynomial of degree %sT)fieldr   Nx)

ValueErrorr   r	   r$   intr   newr   r   as_expr)r   r   r   r&   polysr   vpolyr"   r"   r#   jacobi_poly'   s     r.   c       	      C   s   |j g|d| |jgg}xtd| d D ]t}|d|| |j   | }||d|  |d | }tt|d d|||}t|d ||}|t||| q*W ||  S )z4Low-level implementation of Gegenbauer polynomials. r   r   r   r   )r   zeror   r   r   r   r   )	r   r   r   r   r   r   r   r    r!   r"   r"   r#   dup_gegenbauerH   s    r0   c             C   sp   | dk rt d|  t|dd\}}ttt| |||}|dk	rPt||}nt|td}|rh|S |	 S )aj  Generates Gegenbauer polynomial of degree `n` in `x`.

    Parameters
    ----------
    n : int
        `n` decides the degree of polynomial
    x : optional
    a
        Decides minimal domain for the list of
        coefficients.
    polys : bool, optional
        ``polys=True`` returns an expression, otherwise
        (default) returns an expression.
    r   z1can't generate Gegenbauer polynomial of degree %sT)r%   Nr&   )
r'   r   r	   r0   r(   r   r)   r   r   r*   )r   r   r&   r+   r   r-   r"   r"   r#   gegenbauer_polyV   s    
r1   c             C   sf   |j g|j |jgg}xHtd| d D ]6}tt|d d||d|}|t||d | q$W ||  S )zCLow-level implementation of Chebyshev polynomials of the 1st kind. r   r   r   r   )r   r/   r   r   r   r   r   )r   r   r   r   r   r"   r"   r#   dup_chebyshevtt   s
    r2   c             C   s^   | dk rt d|  ttt| tt}|dk	r>t||}nt|td}|rV|S |	 S )a0  Generates Chebyshev polynomial of the first kind of degree `n` in `x`.

    Parameters
    ----------
    n : int
        `n` decides the degree of polynomial
    x : optional
    polys : bool, optional
        ``polys=True`` returns an expression, otherwise
        (default) returns an expression.
    r   z9can't generate 1st kind Chebyshev polynomial of degree %sNr&   )
r'   r	   r2   r(   r   r   r)   r   r   r*   )r   r&   r+   r-   r"   r"   r#   chebyshevt_poly   s    
r3   c             C   sh   |j g|d|jgg}xHtd| d D ]6}tt|d d||d|}|t||d | q&W ||  S )zCLow-level implementation of Chebyshev polynomials of the 2nd kind. r   r   r   r   )r   r/   r   r   r   r   r   )r   r   r   r   r   r"   r"   r#   dup_chebyshevu   s
    r4   c             C   s^   | dk rt d|  ttt| tt}|dk	r>t||}nt|td}|rV|S |	 S )a1  Generates Chebyshev polynomial of the second kind of degree `n` in `x`.

    Parameters
    ----------
    n : int
        `n` decides the degree of polynomial
    x : optional
    polys : bool, optional
        ``polys=True`` returns an expression, otherwise
        (default) returns an expression.
    r   z9can't generate 2nd kind Chebyshev polynomial of degree %sNr&   )
r'   r	   r4   r(   r   r   r)   r   r   r*   )r   r&   r+   r-   r"   r"   r#   chebyshevu_poly   s    
r5   c             C   s   |j g|d|jgg}x`td| d D ]N}t|d d|}t|d ||d |}tt||||d|}|| q&W ||  S )z1Low-level implementation of Hermite polynomials. r   r   r   r   )r   r/   r   r   r   r   r   )r   r   r   r   r   r   cr"   r"   r#   dup_hermite   s    r7   c             C   s^   | dk rt d|  ttt| tt}|dk	r>t||}nt|td}|rV|S |	 S )a  Generates Hermite polynomial of degree `n` in `x`.

    Parameters
    ----------
    n : int
        `n` decides the degree of polynomial
    x : optional
    polys : bool, optional
        ``polys=True`` returns an expression, otherwise
        (default) returns an expression.
    r   z.can't generate Hermite polynomial of degree %sNr&   )
r'   r	   r7   r(   r   r   r)   r   r   r*   )r   r&   r+   r-   r"   r"   r#   hermite_poly   s    r8   c             C   s   |j g|j |jgg}xhtd| d D ]V}tt|d d||d| d ||}t|d ||d ||}|t||| q$W ||  S )z2Low-level implementation of Legendre polynomials. r   r   r   r   )r   r/   r   r   r   r   r   )r   r   r   r   r   r   r"   r"   r#   dup_legendre   s    &r9   c             C   s^   | dk rt d|  ttt| tt}|dk	r>t||}nt|td}|rV|S |	 S )a  Generates Legendre polynomial of degree `n` in `x`.

    Parameters
    ----------
    n : int
        `n` decides the degree of polynomial
    x : optional
    polys : bool, optional
        ``polys=True`` returns an expression, otherwise
        (default) returns an expression.
    r   z/can't generate Legendre polynomial of degree %sNr&   )
r'   r	   r9   r(   r   r   r)   r   r   r*   )r   r&   r+   r-   r"   r"   r#   legendre_poly   s    r:   c             C   s   |j g|jgg}xtd| d D ]n}t|d |j | || |d| d |  g|}t|d || ||d |  |}|t||| q W |d S )z2Low-level implementation of Laguerre polynomials. r   r   r   r   )r/   r   r   r
   r   r   r   )r   alphar   r   r   r   r   r"   r"   r#   dup_laguerre  s    4$r<   c             C   s   | dk rt d|  |dk	r.t|dd\}}nttd }}ttt| |||}|dk	rht||}nt|t	d}|r|S |
 S )al  Generates Laguerre polynomial of degree `n` in `x`.

    Parameters
    ----------
    n : int
        `n` decides the degree of polynomial
    x : optional
    alpha
        Decides minimal domain for the list
        of coefficients.
    polys : bool, optional
        ``polys=True`` returns an expression, otherwise
        (default) returns an expression.
    r   z/can't generate Laguerre polynomial of degree %sNT)r%   r&   )r'   r   r   r	   r<   r(   r   r)   r   r   r*   )r   r&   r;   r+   r   r-   r"   r"   r#   laguerre_poly  s    r=   c             C   sv   |j g|j |jgg}xPtd| d D ]>}tt|d d||d| d |}|t||d | q$W t||  d|S )z& Low-level implementation of fn(n, x) r   r   r   r   )r   r/   r   r   r   r   r   )r   r   r   r   r   r"   r"   r#   dup_spherical_bessel_fn@  s
    $r>   c             C   sn   |j |jg|jgg}xPtd| d D ]>}tt|d d||dd|  |}|t||d | q$W ||  S )z' Low-level implementation of fn(-n, x) r   r   r      r   )r   r/   r   r   r   r   r   )r   r   r   r   r   r"   r"   r#   dup_spherical_bessel_fn_minusK  s
    $r@   c             C   sp   | dk rt t|  t}ntt| t}t|t}|dk	rLt|d| }nt|dtd }|rh|S |	 S )a	  
    Coefficients for the spherical Bessel functions.

    Those are only needed in the jn() function.

    The coefficients are calculated from:

    fn(0, z) = 1/z
    fn(1, z) = 1/z**2
    fn(n-1, z) + fn(n+1, z) == (2*n+1)/z * fn(n, z)

    Parameters
    ----------
    n : int
        `n` decides the degree of polynomial
    x : optional
    polys : bool, optional
        ``polys=True`` returns an expression, otherwise
        (default) returns an expression.

    Examples
    ========

    >>> from sympy.polys.orthopolys import spherical_bessel_fn as fn
    >>> from sympy import Symbol
    >>> z = Symbol("z")
    >>> fn(1, z)
    z**(-2)
    >>> fn(2, z)
    -1/z + 3/z**3
    >>> fn(3, z)
    -6/z**2 + 15/z**4
    >>> fn(4, z)
    1/z - 45/z**3 + 105/z**5

    r   Nr   r&   )
r@   r(   r   r>   r	   r   r)   r   r   r*   )r   r&   r+   dupr-   r"   r"   r#   spherical_bessel_fnV  s    &
rB   )NF)NF)NF)NF)NF)NF)NNF)NF)+__doc__Z
__future__r   r   Zsympyr   Zsympy.utilitiesr   Zsympy.polys.constructorr   Zsympy.polys.polytoolsr   r   Zsympy.polys.polyclassesr	   Zsympy.polys.densearithr
   r   r   r   r   Zsympy.polys.domainsr   r   Zsympy.core.compatibilityr   r$   r.   r0   r1   r2   r3   r4   r5   r7   r8   r9   r:   r<   r=   r>   r@   rB   r"   r"   r"   r#   <module>   s@    
"