o
    oh~                     @   s  d Z ddlmZ ddlmZ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 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 ddlmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z% e	dZ&G dd deZ'G dd de'Z(dd Z)G dd de'Z*G dd de'Z+G dd de'Z,G dd deZ-G dd deZ.G d d! d!e'Z/G d"d# d#eZ0G d$d% d%e'Z1G d&d' d'e'Z2G d(d) d)e'Z3G d*d+ d+e'Z4d,S )-z
This module mainly implements special orthogonal polynomials.

See also functions.combinatorial.numbers which contains some
combinatorial polynomials.

    )Rational)FunctionArgumentIndexError)S)Dummy)binomial	factorialRisingFactorial)re)exp)floor)sqrt)cossec)gamma)hyper)chebyshevt_polychebyshevu_polygegenbauer_polyhermite_polyhermite_prob_polyjacobi_polylaguerre_polylegendre_polyxc                   @   s$   e Zd ZdZedd Zdd ZdS )OrthogonalPolynomialz+Base class for orthogonal polynomials.
    c                 C   s.   |j r|dkr| t|tt|S d S d S )Nr   )
is_integer_ortho_polyint_xsubsclsnr    r$   w/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/sympy/functions/special/polynomials.py_eval_at_order    s   z#OrthogonalPolynomial._eval_at_orderc                 C   s   |  | jd | jd  S )Nr      )funcargs	conjugate)selfr$   r$   r%   _eval_conjugate%   s   z$OrthogonalPolynomial._eval_conjugateN)__name__
__module____qualname____doc__classmethodr&   r,   r$   r$   r$   r%   r      s
    
r   c                   @   >   e Zd ZdZedd ZdddZdd Zd	d
 Zdd Z	dS )jacobia  
    Jacobi polynomial $P_n^{\left(\alpha, \beta\right)}(x)$.

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

    ``jacobi(n, alpha, beta, x)`` gives the $n$th Jacobi polynomial
    in $x$, $P_n^{\left(\alpha, \beta\right)}(x)$.

    The Jacobi polynomials are orthogonal on $[-1, 1]$ with respect
    to the weight $\left(1-x\right)^\alpha \left(1+x\right)^\beta$.

    Examples
    ========

    >>> from sympy import jacobi, S, conjugate, diff
    >>> from sympy.abc import a, b, n, x

    >>> jacobi(0, a, b, x)
    1
    >>> jacobi(1, a, b, x)
    a/2 - b/2 + x*(a/2 + b/2 + 1)
    >>> jacobi(2, a, b, x)
    a**2/8 - a*b/4 - a/8 + b**2/8 - b/8 + x**2*(a**2/8 + a*b/4 + 7*a/8 + b**2/8 + 7*b/8 + 3/2) + x*(a**2/4 + 3*a/4 - b**2/4 - 3*b/4) - 1/2

    >>> jacobi(n, a, b, x)
    jacobi(n, a, b, x)

    >>> jacobi(n, a, a, x)
    RisingFactorial(a + 1, n)*gegenbauer(n,
        a + 1/2, x)/RisingFactorial(2*a + 1, n)

    >>> jacobi(n, 0, 0, x)
    legendre(n, x)

    >>> jacobi(n, S(1)/2, S(1)/2, x)
    RisingFactorial(3/2, n)*chebyshevu(n, x)/factorial(n + 1)

    >>> jacobi(n, -S(1)/2, -S(1)/2, x)
    RisingFactorial(1/2, n)*chebyshevt(n, x)/factorial(n)

    >>> jacobi(n, a, b, -x)
    (-1)**n*jacobi(n, b, a, x)

    >>> jacobi(n, a, b, 0)
    gamma(a + n + 1)*hyper((-n, -b - n), (a + 1,), -1)/(2**n*factorial(n)*gamma(a + 1))
    >>> jacobi(n, a, b, 1)
    RisingFactorial(a + 1, n)/factorial(n)

    >>> conjugate(jacobi(n, a, b, x))
    jacobi(n, conjugate(a), conjugate(b), conjugate(x))

    >>> diff(jacobi(n,a,b,x), x)
    (a/2 + b/2 + n/2 + 1/2)*jacobi(n - 1, a + 1, b + 1, x)

    See Also
    ========

    gegenbauer,
    chebyshevt_root, chebyshevu, chebyshevu_root,
    legendre, assoc_legendre,
    hermite, hermite_prob,
    laguerre, assoc_laguerre,
    sympy.polys.orthopolys.jacobi_poly,
    sympy.polys.orthopolys.gegenbauer_poly
    sympy.polys.orthopolys.chebyshevt_poly
    sympy.polys.orthopolys.chebyshevu_poly
    sympy.polys.orthopolys.hermite_poly
    sympy.polys.orthopolys.legendre_poly
    sympy.polys.orthopolys.laguerre_poly

    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Jacobi_polynomials
    .. [2] https://mathworld.wolfram.com/JacobiPolynomial.html
    .. [3] https://functions.wolfram.com/Polynomials/JacobiP/

    c                 C   s  ||krS|t ddkrttj|t| t|| S |jr"t||S |tjkr:tdtj |t|d  t|| S t|d |td| d | t	||tj | S || kr}t
|| d t
|d  d| |d   d| |d   t|| | S |js| rtj| t||||  S |jrd|  t
|| d  t
|d t|  t| | | g|d gd S |tjkrt|d |t| S |tju r|jr|| d|  jrtdt|| | d |tj S d S d S t||||S )N      r'   z,Error. a + b + 2*n should not be an integer.)r   r	   r   Halfr   
chebyshevtis_zerolegendre
chebyshevu
gegenbauerr   assoc_legendre	is_Numbercould_extract_minus_signNegativeOner3   r   OneInfinityis_positiver   
ValueErrorr   )r"   r#   abr   r$   r$   r%   eval~   s6   

&2
J,

zjacobi.eval   c           
   	   C   s  ddl m} |dkrt| ||dkrj| j\}}}}td}d|| | | d  }|| d|  d t|| d ||  || t|| | d ||   }	||t|||||	t||||   |d|d fS |dkr| j\}}}}td}d|| | | d  }d||  || d|  d t|| d ||  || t|| | d ||    }	||t|||||	t||||   |d|d fS |dkr| j\}}}}tj|| | d  t|d |d |d | S t| |)	Nr   Sumr'   r5   kr6   r4   rH   )	sympy.concrete.summationsrJ   r   r)   r   r	   r3   r   r7   )
r+   argindexrJ   r#   rE   rF   r   rK   f1f2r$   r$   r%   fdiff   s.   
( 42 40
zjacobi.fdiffc           	      K   s   ddl m} |js|jdu rtdtd}t| |t|| | d | t|| d ||  t| d| d |  }dt| |||d|f S )Nr   rI   F*Error: n should be a non-negative integer.rK   r'   r5   )rL   rJ   is_negativer   rD   r   r	   r   )	r+   r#   rE   rF   r   kwargsrJ   rK   kernr$   r$   r%   _eval_rewrite_as_Sum   s   6zjacobi._eval_rewrite_as_Sumc                 K   s   | j ||||fi |S NrU   )r+   r#   rE   rF   r   rS   r$   r$   r%   _eval_rewrite_as_polynomial   s   z"jacobi._eval_rewrite_as_polynomialc                 C   s*   | j \}}}}| || | | S rV   r)   r(   r*   )r+   r#   rE   rF   r   r$   r$   r%   r,      s   zjacobi._eval_conjugateN)rH   
r-   r.   r/   r0   r1   rG   rP   rU   rX   r,   r$   r$   r$   r%   r3   -   s    P

%
r3   c                 C   sz   t d|| d  t| | d t| | d   d|  | | d  t| t| | | d   }t| |||t| S )a  
    Jacobi polynomial $P_n^{\left(\alpha, \beta\right)}(x)$.

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

    ``jacobi_normalized(n, alpha, beta, x)`` gives the $n$th
    Jacobi polynomial in $x$, $P_n^{\left(\alpha, \beta\right)}(x)$.

    The Jacobi polynomials are orthogonal on $[-1, 1]$ with respect
    to the weight $\left(1-x\right)^\alpha \left(1+x\right)^\beta$.

    This functions returns the polynomials normilzed:

    .. math::

        \int_{-1}^{1}
          P_m^{\left(\alpha, \beta\right)}(x)
          P_n^{\left(\alpha, \beta\right)}(x)
          (1-x)^{\alpha} (1+x)^{\beta} \mathrm{d}x
        = \delta_{m,n}

    Examples
    ========

    >>> from sympy import jacobi_normalized
    >>> from sympy.abc import n,a,b,x

    >>> jacobi_normalized(n, a, b, x)
    jacobi(n, a, b, x)/sqrt(2**(a + b + 1)*gamma(a + n + 1)*gamma(b + n + 1)/((a + b + 2*n + 1)*factorial(n)*gamma(a + b + n + 1)))

    Parameters
    ==========

    n : integer degree of polynomial

    a : alpha value

    b : beta value

    x : symbol

    See Also
    ========

    gegenbauer,
    chebyshevt_root, chebyshevu, chebyshevu_root,
    legendre, assoc_legendre,
    hermite, hermite_prob,
    laguerre, assoc_laguerre,
    sympy.polys.orthopolys.jacobi_poly,
    sympy.polys.orthopolys.gegenbauer_poly
    sympy.polys.orthopolys.chebyshevt_poly
    sympy.polys.orthopolys.chebyshevu_poly
    sympy.polys.orthopolys.hermite_poly
    sympy.polys.orthopolys.legendre_poly
    sympy.polys.orthopolys.laguerre_poly

    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Jacobi_polynomials
    .. [2] https://mathworld.wolfram.com/JacobiPolynomial.html
    .. [3] https://functions.wolfram.com/Polynomials/JacobiP/

    r5   r'   )r   r   r   r3   r   )r#   rE   rF   r   nfactorr$   r$   r%   jacobi_normalized   s   2Cr\   c                   @   r2   )r<   aN  
    Gegenbauer polynomial $C_n^{\left(\alpha\right)}(x)$.

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

    ``gegenbauer(n, alpha, x)`` gives the $n$th Gegenbauer polynomial
    in $x$, $C_n^{\left(\alpha\right)}(x)$.

    The Gegenbauer polynomials are orthogonal on $[-1, 1]$ with
    respect to the weight $\left(1-x^2\right)^{\alpha-\frac{1}{2}}$.

    Examples
    ========

    >>> from sympy import gegenbauer, conjugate, diff
    >>> from sympy.abc import n,a,x
    >>> gegenbauer(0, a, x)
    1
    >>> gegenbauer(1, a, x)
    2*a*x
    >>> gegenbauer(2, a, x)
    -a + x**2*(2*a**2 + 2*a)
    >>> gegenbauer(3, a, x)
    x**3*(4*a**3/3 + 4*a**2 + 8*a/3) + x*(-2*a**2 - 2*a)

    >>> gegenbauer(n, a, x)
    gegenbauer(n, a, x)
    >>> gegenbauer(n, a, -x)
    (-1)**n*gegenbauer(n, a, x)

    >>> gegenbauer(n, a, 0)
    2**n*sqrt(pi)*gamma(a + n/2)/(gamma(a)*gamma(1/2 - n/2)*gamma(n + 1))
    >>> gegenbauer(n, a, 1)
    gamma(2*a + n)/(gamma(2*a)*gamma(n + 1))

    >>> conjugate(gegenbauer(n, a, x))
    gegenbauer(n, conjugate(a), conjugate(x))

    >>> diff(gegenbauer(n, a, x), x)
    2*a*gegenbauer(n - 1, a + 1, x)

    See Also
    ========

    jacobi,
    chebyshevt_root, chebyshevu, chebyshevu_root,
    legendre, assoc_legendre,
    hermite, hermite_prob,
    laguerre, assoc_laguerre,
    sympy.polys.orthopolys.jacobi_poly
    sympy.polys.orthopolys.gegenbauer_poly
    sympy.polys.orthopolys.chebyshevt_poly
    sympy.polys.orthopolys.chebyshevu_poly
    sympy.polys.orthopolys.hermite_poly
    sympy.polys.orthopolys.hermite_prob_poly
    sympy.polys.orthopolys.legendre_poly
    sympy.polys.orthopolys.laguerre_poly

    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Gegenbauer_polynomials
    .. [2] https://mathworld.wolfram.com/GegenbauerPolynomial.html
    .. [3] https://functions.wolfram.com/Polynomials/GegenbauerC3/

    c                 C   s  |j rtjS |tjkrt||S |tjkrt||S |tjkr"tjS |js|tjkrZt	|tjkdkr6tj
S ttj||  ttj|  td| |  td| t|d   S | rjtj| t|||  S |jrd| ttj t|tj|   td| d t|d  t|  S |tjkrtd| | td| t|d   S |tju r|jrt||tj S d S d S t|||S )NTr5   r'   )rR   r   Zeror7   r:   rA   r;   r@   r>   r
   ComplexInfinityr   Pir   r   r?   r<   r9   r   rB   rC   r	   r   )r"   r#   rE   r   r$   r$   r%   rG   g  s:   





.""
(
zgegenbauer.evalr6   c           
      C   s  ddl m} |dkrt| ||dkrq| j\}}}td}ddd||    ||  || d|  ||   }d|d  |d|  d| d|  d   d|| d|    }|t||| |t|||  }	||	|d|d fS |dkr| j\}}}d| t|d |d | S t| |)Nr   rI   r'   r5   rK   r4   r6   )rL   rJ   r   r)   r   r<   )
r+   rM   rJ   r#   rE   r   rK   factor1factor2rT   r$   r$   r%   rP     s,   
* 
zgegenbauer.fdiffc                 K   sn   ddl m} td}d| t|||  d| |d|    t|t|d|    }|||dt|d fS )Nr   rI   rK   r4   r5   )rL   rJ   r   r	   r   r   )r+   r#   rE   r   rS   rJ   rK   rT   r$   r$   r%   rU     s   (zgegenbauer._eval_rewrite_as_Sumc                 K      | j |||fi |S rV   rW   )r+   r#   rE   r   rS   r$   r$   r%   rX        z&gegenbauer._eval_rewrite_as_polynomialc                 C   "   | j \}}}| || | S rV   rY   )r+   r#   rE   r   r$   r$   r%   r,        zgegenbauer._eval_conjugateNr6   rZ   r$   r$   r$   r%   r<   "  s    D

(r<   c                   @   >   e Zd ZdZeeZedd ZdddZ	dd Z
d	d
 ZdS )r8   a  
    Chebyshev polynomial of the first kind, $T_n(x)$.

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

    ``chebyshevt(n, x)`` gives the $n$th Chebyshev polynomial (of the first
    kind) in $x$, $T_n(x)$.

    The Chebyshev polynomials of the first kind are orthogonal on
    $[-1, 1]$ with respect to the weight $\frac{1}{\sqrt{1-x^2}}$.

    Examples
    ========

    >>> from sympy import chebyshevt, diff
    >>> from sympy.abc import n,x
    >>> chebyshevt(0, x)
    1
    >>> chebyshevt(1, x)
    x
    >>> chebyshevt(2, x)
    2*x**2 - 1

    >>> chebyshevt(n, x)
    chebyshevt(n, x)
    >>> chebyshevt(n, -x)
    (-1)**n*chebyshevt(n, x)
    >>> chebyshevt(-n, x)
    chebyshevt(n, x)

    >>> chebyshevt(n, 0)
    cos(pi*n/2)
    >>> chebyshevt(n, -1)
    (-1)**n

    >>> diff(chebyshevt(n, x), x)
    n*chebyshevu(n - 1, x)

    See Also
    ========

    jacobi, gegenbauer,
    chebyshevt_root, chebyshevu, chebyshevu_root,
    legendre, assoc_legendre,
    hermite, hermite_prob,
    laguerre, assoc_laguerre,
    sympy.polys.orthopolys.jacobi_poly
    sympy.polys.orthopolys.gegenbauer_poly
    sympy.polys.orthopolys.chebyshevt_poly
    sympy.polys.orthopolys.chebyshevu_poly
    sympy.polys.orthopolys.hermite_poly
    sympy.polys.orthopolys.hermite_prob_poly
    sympy.polys.orthopolys.legendre_poly
    sympy.polys.orthopolys.laguerre_poly

    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Chebyshev_polynomial
    .. [2] https://mathworld.wolfram.com/ChebyshevPolynomialoftheFirstKind.html
    .. [3] https://mathworld.wolfram.com/ChebyshevPolynomialoftheSecondKind.html
    .. [4] https://functions.wolfram.com/Polynomials/ChebyshevT/
    .. [5] https://functions.wolfram.com/Polynomials/ChebyshevU/

    c                 C   s   |j s;| rtj| t||  S | rt| |S |jr)ttjtj | S |tj	kr1tj	S |tj
u r9tj
S d S |jrE| | |S | ||S rV   )r>   r?   r   r@   r8   r9   r   r7   r_   rA   rB   rR   r&   r!   r$   r$   r%   rG     s   

zchebyshevt.evalr5   c                 C   s@   |dkr	t | ||dkr| j\}}|t|d | S t | |Nr'   r5   )r   r)   r;   r+   rM   r#   r   r$   r$   r%   rP        


zchebyshevt.fdiffc                 K   sZ   ddl m} td}t|d| |d d |  ||d|    }|||dt|d fS Nr   rI   rK   r5   r'   )rL   rJ   r   r   r   r+   r#   r   rS   rJ   rK   rT   r$   r$   r%   rU   %  s   .zchebyshevt._eval_rewrite_as_Sumc                 K      | j ||fi |S rV   rW   r+   r#   r   rS   r$   r$   r%   rX   +     z&chebyshevt._eval_rewrite_as_polynomialNr5   )r-   r.   r/   r0   staticmethodr   r   r1   rG   rP   rU   rX   r$   r$   r$   r%   r8     s    C

r8   c                   @   rg   )r;   a  
    Chebyshev polynomial of the second kind, $U_n(x)$.

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

    ``chebyshevu(n, x)`` gives the $n$th Chebyshev polynomial of the second
    kind in x, $U_n(x)$.

    The Chebyshev polynomials of the second kind are orthogonal on
    $[-1, 1]$ with respect to the weight $\sqrt{1-x^2}$.

    Examples
    ========

    >>> from sympy import chebyshevu, diff
    >>> from sympy.abc import n,x
    >>> chebyshevu(0, x)
    1
    >>> chebyshevu(1, x)
    2*x
    >>> chebyshevu(2, x)
    4*x**2 - 1

    >>> chebyshevu(n, x)
    chebyshevu(n, x)
    >>> chebyshevu(n, -x)
    (-1)**n*chebyshevu(n, x)
    >>> chebyshevu(-n, x)
    -chebyshevu(n - 2, x)

    >>> chebyshevu(n, 0)
    cos(pi*n/2)
    >>> chebyshevu(n, 1)
    n + 1

    >>> diff(chebyshevu(n, x), x)
    (-x*chebyshevu(n, x) + (n + 1)*chebyshevt(n + 1, x))/(x**2 - 1)

    See Also
    ========

    jacobi, gegenbauer,
    chebyshevt, chebyshevt_root, chebyshevu_root,
    legendre, assoc_legendre,
    hermite, hermite_prob,
    laguerre, assoc_laguerre,
    sympy.polys.orthopolys.jacobi_poly
    sympy.polys.orthopolys.gegenbauer_poly
    sympy.polys.orthopolys.chebyshevt_poly
    sympy.polys.orthopolys.chebyshevu_poly
    sympy.polys.orthopolys.hermite_poly
    sympy.polys.orthopolys.hermite_prob_poly
    sympy.polys.orthopolys.legendre_poly
    sympy.polys.orthopolys.laguerre_poly

    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Chebyshev_polynomial
    .. [2] https://mathworld.wolfram.com/ChebyshevPolynomialoftheFirstKind.html
    .. [3] https://mathworld.wolfram.com/ChebyshevPolynomialoftheSecondKind.html
    .. [4] https://functions.wolfram.com/Polynomials/ChebyshevT/
    .. [5] https://functions.wolfram.com/Polynomials/ChebyshevU/

    c                 C   s   |j sO| rtj| t||  S | r.|tjkrtjS | d  s.t| d | S |jr;ttjtj	 | S |tj
krEtj
| S |tju rMtjS d S |jrd|tjkrZtjS | | d | S | ||S Nr5   )r>   r?   r   r@   r;   r]   r9   r   r7   r_   rA   rB   rR   r&   r!   r$   r$   r%   rG   w  s(   




zchebyshevu.evalr5   c                 C   s^   |dkr	t | ||dkr*| j\}}|d t|d | |t||  |d d  S t | |rh   )r   r)   r8   r;   ri   r$   r$   r%   rP     s   

0
zchebyshevu.fdiffc                 K   sn   ddl m} td}tj| t||  d| |d|    t|t|d|    }|||dt|d fS Nr   rI   rK   r5   rL   rJ   r   r   r@   r   r   rl   r$   r$   r%   rU     s   
zchebyshevu._eval_rewrite_as_Sumc                 K   rm   rV   rW   rn   r$   r$   r%   rX     ro   z&chebyshevu._eval_rewrite_as_polynomialNrp   )r-   r.   r/   r0   rq   r   r   r1   rG   rP   rU   rX   r$   r$   r$   r%   r;   1  s    C

r;   c                   @      e Zd ZdZedd ZdS )chebyshevt_roota  
    ``chebyshev_root(n, k)`` returns the $k$th root (indexed from zero) of
    the $n$th Chebyshev polynomial of the first kind; that is, if
    $0 \le k < n$, ``chebyshevt(n, chebyshevt_root(n, k)) == 0``.

    Examples
    ========

    >>> from sympy import chebyshevt, chebyshevt_root
    >>> chebyshevt_root(3, 2)
    -sqrt(3)/2
    >>> chebyshevt(3, chebyshevt_root(3, 2))
    0

    See Also
    ========

    jacobi, gegenbauer,
    chebyshevt, chebyshevu, chebyshevu_root,
    legendre, assoc_legendre,
    hermite, hermite_prob,
    laguerre, assoc_laguerre,
    sympy.polys.orthopolys.jacobi_poly
    sympy.polys.orthopolys.gegenbauer_poly
    sympy.polys.orthopolys.chebyshevt_poly
    sympy.polys.orthopolys.chebyshevu_poly
    sympy.polys.orthopolys.hermite_poly
    sympy.polys.orthopolys.hermite_prob_poly
    sympy.polys.orthopolys.legendre_poly
    sympy.polys.orthopolys.laguerre_poly
    c                 C   s>   d|kr||k st d||f ttjd| d  d|  S )Nr   +must have 0 <= k < n, got k = %s and n = %sr5   r'   rD   r   r   r_   r"   r#   rK   r$   r$   r%   rG     s
   zchebyshevt_root.evalNr-   r.   r/   r0   r1   rG   r$   r$   r$   r%   rv          rv   c                   @   ru   )chebyshevu_rootaw  
    ``chebyshevu_root(n, k)`` returns the $k$th root (indexed from zero) of the
    $n$th Chebyshev polynomial of the second kind; that is, if $0 \le k < n$,
    ``chebyshevu(n, chebyshevu_root(n, k)) == 0``.

    Examples
    ========

    >>> from sympy import chebyshevu, chebyshevu_root
    >>> chebyshevu_root(3, 2)
    -sqrt(2)/2
    >>> chebyshevu(3, chebyshevu_root(3, 2))
    0

    See Also
    ========

    chebyshevt, chebyshevt_root, chebyshevu,
    legendre, assoc_legendre,
    hermite, hermite_prob,
    laguerre, assoc_laguerre,
    sympy.polys.orthopolys.jacobi_poly
    sympy.polys.orthopolys.gegenbauer_poly
    sympy.polys.orthopolys.chebyshevt_poly
    sympy.polys.orthopolys.chebyshevu_poly
    sympy.polys.orthopolys.hermite_poly
    sympy.polys.orthopolys.hermite_prob_poly
    sympy.polys.orthopolys.legendre_poly
    sympy.polys.orthopolys.laguerre_poly
    c                 C   s:   d|kr||k st d||f ttj|d  |d  S )Nr   rw   r'   rx   ry   r$   r$   r%   rG     s
   zchebyshevu_root.evalNrz   r$   r$   r$   r%   r|     r{   r|   c                   @   rg   )r:   a  
    ``legendre(n, x)`` gives the $n$th Legendre polynomial of $x$, $P_n(x)$

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

    The Legendre polynomials are orthogonal on $[-1, 1]$ with respect to
    the constant weight 1. They satisfy $P_n(1) = 1$ for all $n$; further,
    $P_n$ is odd for odd $n$ and even for even $n$.

    Examples
    ========

    >>> from sympy import legendre, diff
    >>> from sympy.abc import x, n
    >>> legendre(0, x)
    1
    >>> legendre(1, x)
    x
    >>> legendre(2, x)
    3*x**2/2 - 1/2
    >>> legendre(n, x)
    legendre(n, x)
    >>> diff(legendre(n,x), x)
    n*(x*legendre(n, x) - legendre(n - 1, x))/(x**2 - 1)

    See Also
    ========

    jacobi, gegenbauer,
    chebyshevt, chebyshevt_root, chebyshevu, chebyshevu_root,
    assoc_legendre,
    hermite, hermite_prob,
    laguerre, assoc_laguerre,
    sympy.polys.orthopolys.jacobi_poly
    sympy.polys.orthopolys.gegenbauer_poly
    sympy.polys.orthopolys.chebyshevt_poly
    sympy.polys.orthopolys.chebyshevu_poly
    sympy.polys.orthopolys.hermite_poly
    sympy.polys.orthopolys.hermite_prob_poly
    sympy.polys.orthopolys.legendre_poly
    sympy.polys.orthopolys.laguerre_poly

    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Legendre_polynomial
    .. [2] https://mathworld.wolfram.com/LegendrePolynomial.html
    .. [3] https://functions.wolfram.com/Polynomials/LegendreP/
    .. [4] https://functions.wolfram.com/Polynomials/LegendreP2/

    c                 C   s   |j sR| rtj| t||  S | r&| d  s&t| tj |S |jr@ttjt	tj
|d  t	tj|d    S |tjkrHtjS |tju rPtjS d S |jr[| tj }| ||S rh   )r>   r?   r   r@   r:   rA   r9   r   r_   r   r7   rB   rR   r&   r!   r$   r$   r%   rG   =  s   .

zlegendre.evalr5   c                 C   sZ   |dkr	t | ||dkr(| j\}}||d d  |t|| t|d |  S t | |rh   )r   r)   r:   ri   r$   r$   r%   rP   U  s   

,
zlegendre.fdiffc                 K   s`   ddl m} td}tj| t||d  d| d ||   d| d |  }|||d|fS rk   )rL   rJ   r   r   r@   r   rl   r$   r$   r%   rU   m  s   <zlegendre._eval_rewrite_as_Sumc                 K   rm   rV   rW   rn   r$   r$   r%   rX   s  ro   z$legendre._eval_rewrite_as_polynomialNrp   )r-   r.   r/   r0   rq   r   r   r1   rG   rP   rU   rX   r$   r$   r$   r%   r:     s    5

r:   c                   @   sJ   e Zd ZdZedd Zedd ZdddZd	d
 Zdd Z	dd Z
dS )r=   a  
    ``assoc_legendre(n, m, x)`` gives $P_n^m(x)$, where $n$ and $m$ are
    the degree and order or an expression which is related to the nth
    order Legendre polynomial, $P_n(x)$ in the following manner:

    .. math::
        P_n^m(x) = (-1)^m (1 - x^2)^{\frac{m}{2}}
                   \frac{\mathrm{d}^m P_n(x)}{\mathrm{d} x^m}

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

    Associated Legendre polynomials are orthogonal on $[-1, 1]$ with:

    - weight $= 1$            for the same $m$ and different $n$.
    - weight $= \frac{1}{1-x^2}$   for the same $n$ and different $m$.

    Examples
    ========

    >>> from sympy import assoc_legendre
    >>> from sympy.abc import x, m, n
    >>> assoc_legendre(0,0, x)
    1
    >>> assoc_legendre(1,0, x)
    x
    >>> assoc_legendre(1,1, x)
    -sqrt(1 - x**2)
    >>> assoc_legendre(n,m,x)
    assoc_legendre(n, m, x)

    See Also
    ========

    jacobi, gegenbauer,
    chebyshevt, chebyshevt_root, chebyshevu, chebyshevu_root,
    legendre,
    hermite, hermite_prob,
    laguerre, assoc_laguerre,
    sympy.polys.orthopolys.jacobi_poly
    sympy.polys.orthopolys.gegenbauer_poly
    sympy.polys.orthopolys.chebyshevt_poly
    sympy.polys.orthopolys.chebyshevu_poly
    sympy.polys.orthopolys.hermite_poly
    sympy.polys.orthopolys.hermite_prob_poly
    sympy.polys.orthopolys.legendre_poly
    sympy.polys.orthopolys.laguerre_poly

    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Associated_Legendre_polynomials
    .. [2] https://mathworld.wolfram.com/LegendrePolynomial.html
    .. [3] https://functions.wolfram.com/Polynomials/LegendreP/
    .. [4] https://functions.wolfram.com/Polynomials/LegendreP2/

    c                 C   s@   t |tddt|f}tj| dtd  t|d  |  S )NT)polysr'   r5   )r   r   diffr   r@   r   as_expr)r"   r#   mPr$   r$   r%   r&     s   (zassoc_legendre._eval_at_orderc                 C   s
  |  rtj|  t|| t||   t|| | S |dkr&t||S |dkrGd| ttj td| | d td|| d    S |j	r}|j	r|j
r|j
r|jr^td| |f t||krmtd| ||f | t|tt|t|S d S d S d S d S )Nr   r5   r'   z3%s : 1st index must be nonnegative integer (got %r)z9%s : abs('2nd index') must be <= '1st index' (got %r, %r))r?   r   r@   r   r=   r:   r   r_   r   r>   r   rR   rD   absr&   r   r    r   )r"   r#   r   r   r$   r$   r%   rG     s   2
: zassoc_legendre.evalr6   c                 C   s~   |dkr	t | ||dkrt | ||dkr:| j\}}}d|d d  || t||| || t|d ||   S t | |)Nr'   r5   r6   )r   r)   r=   )r+   rM   r#   r   r   r$   r$   r%   rP     s   

<
zassoc_legendre.fdiffc                 K   s   ddl m} td}td| d|  d| t||  t| t|d|  |   tj|  ||| d|    }d|d  |d  |||dt|| tj f S rk   )rL   rJ   r   r   r   r@   r   r7   )r+   r#   r   r   rS   rJ   rK   rT   r$   r$   r%   rU     s   &2z#assoc_legendre._eval_rewrite_as_Sumc                 K   rb   rV   rW   )r+   r#   r   r   rS   r$   r$   r%   rX     rc   z*assoc_legendre._eval_rewrite_as_polynomialc                 C   rd   rV   rY   )r+   r#   r   r   r$   r$   r%   r,     re   zassoc_legendre._eval_conjugateNrf   )r-   r.   r/   r0   r1   r&   rG   rP   rU   rX   r,   r$   r$   r$   r%   r=   y  s    :


r=   c                   @   F   e Zd ZdZeeZedd ZdddZ	dd Z
d	d
 Zdd ZdS )hermitea.  
    ``hermite(n, x)`` gives the $n$th Hermite polynomial in $x$, $H_n(x)$.

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

    The Hermite polynomials are orthogonal on $(-\infty, \infty)$
    with respect to the weight $\exp\left(-x^2\right)$.

    Examples
    ========

    >>> from sympy import hermite, diff
    >>> from sympy.abc import x, n
    >>> hermite(0, x)
    1
    >>> hermite(1, x)
    2*x
    >>> hermite(2, x)
    4*x**2 - 2
    >>> hermite(n, x)
    hermite(n, x)
    >>> diff(hermite(n,x), x)
    2*n*hermite(n - 1, x)
    >>> hermite(n, -x)
    (-1)**n*hermite(n, x)

    See Also
    ========

    jacobi, gegenbauer,
    chebyshevt, chebyshevt_root, chebyshevu, chebyshevu_root,
    legendre, assoc_legendre,
    hermite_prob,
    laguerre, assoc_laguerre,
    sympy.polys.orthopolys.jacobi_poly
    sympy.polys.orthopolys.gegenbauer_poly
    sympy.polys.orthopolys.chebyshevt_poly
    sympy.polys.orthopolys.chebyshevu_poly
    sympy.polys.orthopolys.hermite_poly
    sympy.polys.orthopolys.hermite_prob_poly
    sympy.polys.orthopolys.legendre_poly
    sympy.polys.orthopolys.laguerre_poly

    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Hermite_polynomial
    .. [2] https://mathworld.wolfram.com/HermitePolynomial.html
    .. [3] https://functions.wolfram.com/Polynomials/HermiteH/

    c                 C   s   |j s1| rtj| t||  S |jr'd| ttj ttj	| d  S |tj
u r/tj
S d S |jr:td| | ||S )Nr5   0The index n must be nonnegative integer (got %r))r>   r?   r   r@   r   r9   r   r_   r   rA   rB   rR   rD   r&   r!   r$   r$   r%   rG   &  s   $
zhermite.evalr5   c                 C   sD   |dkr	t | ||dkr| j\}}d| t|d | S t | |rh   )r   r)   r   ri   r$   r$   r%   rP   :  s   


zhermite.fdiffc                 K   sj   ddl m} td}tj| t|t|d|    d| |d|    }t||||dt|d f S rs   rt   rl   r$   r$   r%   rU   E  s   6 zhermite._eval_rewrite_as_Sumc                 K   rm   rV   rW   rn   r$   r$   r%   rX   K  ro   z#hermite._eval_rewrite_as_polynomialc                 K   s   t d| t||t d  S rr   )r   hermite_probrn   r$   r$   r%   _eval_rewrite_as_hermite_probP  s   z%hermite._eval_rewrite_as_hermite_probNrp   )r-   r.   r/   r0   rq   r   r   r1   rG   rP   rU   rX   r   r$   r$   r$   r%   r     s    5

r   c                   @   r   )r   a  
    ``hermite_prob(n, x)`` gives the $n$th probabilist's Hermite polynomial
    in $x$, $He_n(x)$.

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

    The probabilist's Hermite polynomials are orthogonal on $(-\infty, \infty)$
    with respect to the weight $\exp\left(-\frac{x^2}{2}\right)$. They are monic
    polynomials, related to the plain Hermite polynomials (:py:class:`~.hermite`) by

    .. math :: He_n(x) = 2^{-n/2} H_n(x/\sqrt{2})

    Examples
    ========

    >>> from sympy import hermite_prob, diff, I
    >>> from sympy.abc import x, n
    >>> hermite_prob(1, x)
    x
    >>> hermite_prob(5, x)
    x**5 - 10*x**3 + 15*x
    >>> diff(hermite_prob(n,x), x)
    n*hermite_prob(n - 1, x)
    >>> hermite_prob(n, -x)
    (-1)**n*hermite_prob(n, x)

    The sum of absolute values of coefficients of $He_n(x)$ is the number of
    matchings in the complete graph $K_n$ or telephone number, A000085 in the OEIS:

    >>> [hermite_prob(n,I) / I**n for n in range(11)]
    [1, 1, 2, 4, 10, 26, 76, 232, 764, 2620, 9496]

    See Also
    ========

    jacobi, gegenbauer,
    chebyshevt, chebyshevt_root, chebyshevu, chebyshevu_root,
    legendre, assoc_legendre,
    hermite,
    laguerre, assoc_laguerre,
    sympy.polys.orthopolys.jacobi_poly
    sympy.polys.orthopolys.gegenbauer_poly
    sympy.polys.orthopolys.chebyshevt_poly
    sympy.polys.orthopolys.chebyshevu_poly
    sympy.polys.orthopolys.hermite_poly
    sympy.polys.orthopolys.hermite_prob_poly
    sympy.polys.orthopolys.legendre_poly
    sympy.polys.orthopolys.laguerre_poly

    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Hermite_polynomial
    .. [2] https://mathworld.wolfram.com/HermitePolynomial.html
    c                 C   s|   |j s-| rtj| t||  S |jr#ttjttj	| d  S |tj
u r+tj
S d S |jr8td|  d S | ||S )Nr5   z'n must be a nonnegative integer, not %r)r>   r?   r   r@   r   r9   r   r_   r   rA   rB   rR   rD   r&   r!   r$   r$   r%   rG     s   
zhermite_prob.evalr5   c                 C   s.   |dkr| j \}}|t|d | S t| |)Nr5   r'   )r)   r   r   ri   r$   r$   r%   rP     s   

zhermite_prob.fdiffc                 K   sh   ddl m} td}tj | ||d|    t|t|d|    }t||||dt|d f S rs   )rL   rJ   r   r   r7   r   r   rl   r$   r$   r%   rU     s   4 z!hermite_prob._eval_rewrite_as_Sumc                 K   rm   rV   rW   rn   r$   r$   r%   rX     ro   z(hermite_prob._eval_rewrite_as_polynomialc                 K   s    t d|  t||t d  S rr   )r   r   rn   r$   r$   r%   _eval_rewrite_as_hermite  s    z%hermite_prob._eval_rewrite_as_hermiteNrp   )r-   r.   r/   r0   rq   r   r   r1   rG   rP   rU   rX   r   r$   r$   r$   r%   r   T  s    9

r   c                   @   rg   )laguerreaL  
    Returns the $n$th Laguerre polynomial in $x$, $L_n(x)$.

    Examples
    ========

    >>> from sympy import laguerre, diff
    >>> from sympy.abc import x, n
    >>> laguerre(0, x)
    1
    >>> laguerre(1, x)
    1 - x
    >>> laguerre(2, x)
    x**2/2 - 2*x + 1
    >>> laguerre(3, x)
    -x**3/6 + 3*x**2/2 - 3*x + 1

    >>> laguerre(n, x)
    laguerre(n, x)

    >>> diff(laguerre(n, x), x)
    -assoc_laguerre(n - 1, 1, x)

    Parameters
    ==========

    n : int
        Degree of Laguerre polynomial. Must be `n \ge 0`.

    See Also
    ========

    jacobi, gegenbauer,
    chebyshevt, chebyshevt_root, chebyshevu, chebyshevu_root,
    legendre, assoc_legendre,
    hermite, hermite_prob,
    assoc_laguerre,
    sympy.polys.orthopolys.jacobi_poly
    sympy.polys.orthopolys.gegenbauer_poly
    sympy.polys.orthopolys.chebyshevt_poly
    sympy.polys.orthopolys.chebyshevu_poly
    sympy.polys.orthopolys.hermite_poly
    sympy.polys.orthopolys.hermite_prob_poly
    sympy.polys.orthopolys.legendre_poly
    sympy.polys.orthopolys.laguerre_poly

    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Laguerre_polynomial
    .. [2] https://mathworld.wolfram.com/LaguerrePolynomial.html
    .. [3] https://functions.wolfram.com/Polynomials/LaguerreL/
    .. [4] https://functions.wolfram.com/Polynomials/LaguerreL3/

    c                 C   s   |j du r	td|jsA| r$| d  s$t|t| d |  S |jr*tjS |tj	u r2tj
S |tj
u r?tj| tj
 S d S |jrQt|t| d |  S | ||S )NFError: n should be an integer.r'   )r   rD   r>   r?   r   r   r9   r   rA   NegativeInfinityrB   r@   rR   r&   r!   r$   r$   r%   rG     s   


zlaguerre.evalr5   c                 C   s@   |dkr	t | ||dkr| j\}}t|d d| S t | |rh   )r   r)   assoc_laguerreri   r$   r$   r%   rP     rj   zlaguerre.fdiffc                 K   s   ddl m} |jrt|| j| d | fi | S |jdu r$tdtd}t| |t	|d  ||  }|||d|fS )Nr   rI   r'   Fr   rK   r5   )
rL   rJ   rR   r   rU   r   rD   r   r	   r   rl   r$   r$   r%   rU     s   $
 zlaguerre._eval_rewrite_as_Sumc                 K   rm   rV   rW   rn   r$   r$   r%   rX   "  ro   z$laguerre._eval_rewrite_as_polynomialNrp   )r-   r.   r/   r0   rq   r   r   r1   rG   rP   rU   rX   r$   r$   r$   r%   r     s    8

r   c                   @   r2   )r   aj  
    Returns the $n$th generalized Laguerre polynomial in $x$, $L_n(x)$.

    Examples
    ========

    >>> from sympy import assoc_laguerre, diff
    >>> from sympy.abc import x, n, a
    >>> assoc_laguerre(0, a, x)
    1
    >>> assoc_laguerre(1, a, x)
    a - x + 1
    >>> assoc_laguerre(2, a, x)
    a**2/2 + 3*a/2 + x**2/2 + x*(-a - 2) + 1
    >>> assoc_laguerre(3, a, x)
    a**3/6 + a**2 + 11*a/6 - x**3/6 + x**2*(a/2 + 3/2) +
        x*(-a**2/2 - 5*a/2 - 3) + 1

    >>> assoc_laguerre(n, a, 0)
    binomial(a + n, a)

    >>> assoc_laguerre(n, a, x)
    assoc_laguerre(n, a, x)

    >>> assoc_laguerre(n, 0, x)
    laguerre(n, x)

    >>> diff(assoc_laguerre(n, a, x), x)
    -assoc_laguerre(n - 1, a + 1, x)

    >>> diff(assoc_laguerre(n, a, x), a)
    Sum(assoc_laguerre(_k, a, x)/(-a + n), (_k, 0, n - 1))

    Parameters
    ==========

    n : int
        Degree of Laguerre polynomial. Must be `n \ge 0`.

    alpha : Expr
        Arbitrary expression. For ``alpha=0`` regular Laguerre
        polynomials will be generated.

    See Also
    ========

    jacobi, gegenbauer,
    chebyshevt, chebyshevt_root, chebyshevu, chebyshevu_root,
    legendre, assoc_legendre,
    hermite, hermite_prob,
    laguerre,
    sympy.polys.orthopolys.jacobi_poly
    sympy.polys.orthopolys.gegenbauer_poly
    sympy.polys.orthopolys.chebyshevt_poly
    sympy.polys.orthopolys.chebyshevu_poly
    sympy.polys.orthopolys.hermite_poly
    sympy.polys.orthopolys.hermite_prob_poly
    sympy.polys.orthopolys.legendre_poly
    sympy.polys.orthopolys.laguerre_poly

    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Laguerre_polynomial#Generalized_Laguerre_polynomials
    .. [2] https://mathworld.wolfram.com/AssociatedLaguerrePolynomial.html
    .. [3] https://functions.wolfram.com/Polynomials/LaguerreL/
    .. [4] https://functions.wolfram.com/Polynomials/LaguerreL3/

    c                 C   s   |j rt||S |js6|j rt|| |S |tju r&|dkr&tj| tj S |tju r2|dkr4tjS d S d S |jr?t	d| t
|||S )Nr   r   )r9   r   r>   r   r   rB   r@   r   rR   rD   r   )r"   r#   alphar   r$   r$   r%   rG   o  s   
zassoc_laguerre.evalr6   c                 C   s   ddl m} |dkrt| ||dkr/| j\}}}td}|t|||||  |d|d fS |dkrD| j\}}}t|d |d | S t| |)Nr   rI   r'   r5   rK   r6   )rL   rJ   r   r)   r   r   )r+   rM   rJ   r#   r   r   rK   r$   r$   r%   rP     s   
$
zassoc_laguerre.fdiffc                 K   s   ddl m} |js|jdu rtdtd}t| |t|| d t|  ||  }t|| d t| |||d|f S )Nr   rI   FrQ   rK   r'   )	rL   rJ   rR   r   rD   r   r	   r   r   )r+   r#   r   r   rS   rJ   rK   rT   r$   r$   r%   rU     s   (z#assoc_laguerre._eval_rewrite_as_Sumc                 K   rb   rV   rW   )r+   r#   r   r   rS   r$   r$   r%   rX     rc   z*assoc_laguerre._eval_rewrite_as_polynomialc                 C   rd   rV   rY   )r+   r#   r   r   r$   r$   r%   r,     re   zassoc_laguerre._eval_conjugateNrf   rZ   r$   r$   r$   r%   r   (  s    F


r   N)5r0   
sympy.corer   sympy.core.functionr   r   sympy.core.singletonr   sympy.core.symbolr   (sympy.functions.combinatorial.factorialsr   r   r	   $sympy.functions.elementary.complexesr
   &sympy.functions.elementary.exponentialr   #sympy.functions.elementary.integersr   (sympy.functions.elementary.miscellaneousr   (sympy.functions.elementary.trigonometricr   r   'sympy.functions.special.gamma_functionsr   sympy.functions.special.hyperr   sympy.polys.orthopolysr   r   r   r   r   r   r   r   r   r   r3   r\   r<   r8   r;   rv   r|   r:   r=   r   r   r   r   r$   r$   r$   r%   <module>   s>    ( (N v~)-tuffn