
    \h'                     L   S r SSKJr  SSKJrJrJrJrJrJ	r	J
r
Jr  SSKJrJr  SSKJr  SSKJr  S r\SS	 j5       rS
 rSS jrS rS rS rS r\SS j5       r\SS j5       rS rS r\SS j5       r\SS j5       r S r!\SS j5       r"S r#\SS j5       r$S r%S r&SS jr'g)z:Efficient functions for generating orthogonal polynomials.    )Dummy)dup_muldup_mul_ground
dup_lshiftdup_subdup_adddup_sub_termdup_sub_grounddup_sqr)ZZQQ)
named_poly)publicc           	         U S:  a  UR                   /$ UR                   /X-   U" S5      -  UR                   -   X-
  U" S5      -  /pT[        SU S-   5       GH2  nU" U5      X-   U-   -  X-   U" S5      U-  -   U" S5      -
  -  nX-   U" S5      U-  -   UR                   -
  X-  X"-  -
  -  U" S5      U-  -  nX-   U" S5      U-  -   UR                   -
  X-   U" S5      U-  -   U" S5      -
  -  X-   U" S5      U-  -   -  U" S5      U-  -  n	X-   UR                   -
  X&-   UR                   -
  -  X-   U" S5      U-  -   -  U-  n
[        XXU5      n[        [        USU5      X5      n[        XJU5      nU[	        [        XU5      X5      pTGM5     U$ )z/Low-level implementation of Jacobi polynomials.      )oneranger   r   r   r   )nabKm2m1idenf0f1f2p0p1p2s                 N/var/www/auris/envauris/lib/python3.13/site-packages/sympy/polys/orthopolys.py
dup_jacobir$   	   s   1uweeWQqTzAEE)AC1:61ac]dAEAI!Q1 56ead1fnquu$qs3qtCx@ead1fnquu$1a!A$)>?151Q4PQ6>RVWXYVZ[^V^_eaeemaeaeem,aead1fn=CBA&Jr1a0"8BA&WWRQ/7B  I    Nc           	      .    [        U [        SSX1U4U5      $ )a^  Generates the Jacobi polynomial `P_n^{(a,b)}(x)`.

Parameters
==========

n : int
    Degree of the 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
    If True, return a Poly, otherwise (default) return an expression.
NzJacobi polynomial)r   r$   )r   r   r   xpolyss        r#   jacobi_polyr)      s    " aT+>q	5QQr%   c                    U S:  a  UR                   /$ UR                   /U" S5      U-  UR                  /pC[        SU S-   5       H  n[        [	        USU5      U" S5      XR                   -
  -  U" U5      -  U" S5      -   U5      n[        X2" S5      XR                   -
  -  U" U5      -  UR                   -   U5      nU[        XgU5      pCM     U$ )z3Low-level implementation of Gegenbauer polynomials.r   r   r   zeror   r   r   r   )r   r   r   r   r   r   r!   r"   s           r#   dup_gegenbauerr-   ,   s    1uweeWqtAvqvv&1ac]Jr1a0!A$%%.12E!2LaPB!agqt 3aee ;Q?WRQ'B  Ir%   c                 ,    [        U [        SSX!4U5      $ )a  Generates the Gegenbauer polynomial `C_n^{(a)}(x)`.

Parameters
==========

n : int
    Degree of the polynomial.
x : optional
a
    Decides minimal domain for the list of coefficients.
polys : bool, optional
    If True, return a Poly, otherwise (default) return an expression.
NzGegenbauer polynomial)r   r-   )r   r   r'   r(   s       r#   gegenbauer_polyr/   7   s     a/FPUVVr%   c                 `    U S:  a  UR                   /$ U S:  a  [        X5      $ [        X5      $ )zDLow-level implementation of Chebyshev polynomials of the first kind.r   @   )r   _dup_chebyshevt_rec_dup_chebyshevt_prod)r   r   s     r#   dup_chebyshevtr4   G   s1    1uw2v"1((%%r%   c                     UR                   /UR                   UR                  /p2[        U S-
  5       H,  nU[        [	        [        USU5      U" S5      U5      X!5      p2M.     U$ )a  Chebyshev polynomials of the first kind using recurrence.

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

Chebyshev polynomials of the first kind are defined by the recurrence
relation:

.. math::
    T_0(x) &= 1\\
    T_1(x) &= x\\
    T_n(x) &= 2xT_{n-1}(x) - T_{n-2}(x)

This function calculates the Chebyshev polynomial of the first kind using
the above recurrence relation.

Parameters
==========

n : int
    n is a nonnegative integer.
K : domain

r   r   r   r,   r   r   r   r   )r   r   r   r   _s        r#   r2   r2   P   sX    2 eeWquuaffo1q5\W^Jr1a,@!A$JBRB Ir%   c           
         UR                   UR                  /U" S5      UR                  UR                   * /p2[        U 5      SS  H  n[        [	        [        X2U5      U" S5      U5      UR                   SU5      nUS:X  a4  U[        [	        [        X15      U" S5      U5      UR                   U5      p2Mp  [        [	        [        X!5      U" S5      U5      UR                   U5      Up2M     U$ )ar  Chebyshev polynomials of the first kind using recursive products.

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

Computes Chebyshev polynomials of the first kind using

.. math::
    T_{2n}(x) &= 2T_n^2(x) - 1\\
    T_{2n+1}(x) &= 2T_{n+1}(x)T_n(x) - x

This is faster than ``_dup_chebyshevt_rec`` for large ``n``.

Parameters
==========

n : int
    n is a nonnegative integer.
K : domain

r      Nr   1)r   r,   binr	   r   r   r
   r   )r   r   r   r   r   cs         r#   r3   r3   n   s    , eeQVV_qtQVVaeeV4VABZ(:AaD!DaeeQPQR#I~gbnadA'NPQPUPUWXY#N72>1Q4$KQUUTUVXY  Ir%   c                     U S:  a  UR                   /$ UR                   /U" S5      UR                  /p2[        SU S-   5       H,  nU[        [	        [        USU5      U" S5      U5      X!5      p2M.     U$ )zELow-level implementation of Chebyshev polynomials of the second kind.r   r   r6   r   r   r   r   r   s        r#   dup_chebyshevur?      sj    1uweeWqtQVVn1ac]W^Jr1a,@!A$JBRB Ir%   c                 4    [        U [        [        SU4U5      $ )zGenerates the Chebyshev polynomial of the first kind `T_n(x)`.

Parameters
==========

n : int
    Degree of the polynomial.
x : optional
polys : bool, optional
    If True, return a Poly, otherwise (default) return an expression.
z&Chebyshev polynomial of the first kind)r   r4   r   r   r'   r(   s      r#   chebyshevt_polyrB      s"     a4qdEC Cr%   c                 4    [        U [        [        SU4U5      $ )zGenerates the Chebyshev polynomial of the second kind `U_n(x)`.

Parameters
==========

n : int
    Degree of the polynomial.
x : optional
polys : bool, optional
    If True, return a Poly, otherwise (default) return an expression.
z'Chebyshev polynomial of the second kind)r   r?   r   rA   s      r#   chebyshevu_polyrD      s"     a5tUD Dr%   c           	         U S:  a  UR                   /$ UR                   /U" S5      UR                  /p2[        SU S-   5       HC  n[        USU5      n[	        X!" US-
  5      U5      nU[	        [        XVU5      U" S5      U5      p2ME     U$ )z0Low-level implementation of Hermite polynomials.r   r   r   r,   r   r   r   r   r   r   r   r   r   r   r   s          r#   dup_hermiterH      s    1uweeWqtQVVn1ac]r1a 2q1vq)^GA!$4adA>B  Ir%   c                     U S:  a  UR                   /$ UR                   /UR                   UR                  /p2[        SU S-   5       H2  n[        USU5      n[	        X!" US-
  5      U5      nU[        XVU5      p2M4     U$ )z>Low-level implementation of probabilist's Hermite polynomials.r   r   rF   rG   s          r#   dup_hermite_probrJ      sz    1uweeWquuaffo1ac]r1a 2q1vq)WQ1%B  Ir%   c                 4    [        U [        [        SU4U5      $ )zGenerates the Hermite polynomial `H_n(x)`.

Parameters
==========

n : int
    Degree of the polynomial.
x : optional
polys : bool, optional
    If True, return a Poly, otherwise (default) return an expression.
zHermite polynomial)r   rH   r   rA   s      r#   hermite_polyrL      s     ab*>eLLr%   c                 4    [        U [        [        SU4U5      $ )zGenerates the probabilist's Hermite polynomial `He_n(x)`.

Parameters
==========

n : int
    Degree of the polynomial.
x : optional
polys : bool, optional
    If True, return a Poly, otherwise (default) return an expression.
z probabilist's Hermite polynomial)r   rJ   r   rA   s      r#   hermite_prob_polyrN      s!     a)2.e= =r%   c                 0   U S:  a  UR                   /$ UR                   /UR                   UR                  /p2[        SU S-   5       HK  n[        [	        USU5      U" SU-  S-
  U5      U5      n[        X!" US-
  U5      U5      nU[        XVU5      p2MM     U$ )z1Low-level implementation of Legendre polynomials.r   r   r+   rG   s          r#   dup_legendrerP      s    1uweeWquuaffo1ac]:b!Q/1Q3q5!a@2q1ay!,WQ1%B  Ir%   c                 4    [        U [        [        SU4U5      $ )zGenerates the Legendre polynomial `P_n(x)`.

Parameters
==========

n : int
    Degree of the polynomial.
x : optional
polys : bool, optional
    If True, return a Poly, otherwise (default) return an expression.
zLegendre polynomial)r   rP   r   rA   s      r#   legendre_polyrR      s     ar+@1$NNr%   c           	      \   UR                   /UR                  /pC[        SU S-   5       H  n[        XBR                  * U" U5      -  XR                  -
  U" U5      -  U" S5      -   /U5      n[	        X1UR                  -
  U" U5      -  UR                  -   U5      nU[        XgU5      pCM     U$ )z1Low-level implementation of Laguerre polynomials.r   r   )r,   r   r   r   r   r   )r   alphar   r   r   r   r   r   s           r#   dup_laguerrerU     s    ffXw1ac]B%%!uUU{AaD&81Q4&?@!D2aeeQqT1AEE91=WQ1%B  Ir%   c                 ,    [        U [        SSX4U5      $ )a)  Generates the Laguerre polynomial `L_n^{(\alpha)}(x)`.

Parameters
==========

n : int
    Degree of the polynomial.
x : optional
alpha : optional
    Decides minimal domain for the list of coefficients.
polys : bool, optional
    If True, return a Poly, otherwise (default) return an expression.
NzLaguerre polynomial)r   rU   )r   r'   rT   r(   s       r#   laguerre_polyrW     s     at-BQJPUVVr%   c                 *   U S:  a  UR                   UR                  /$ UR                   /UR                   UR                  /p2[        SU S-   5       H2  nU[        [	        [        USU5      U" SU-  S-
  5      U5      X!5      p2M4     [        USU5      $ )z%Low-level implementation of fn(n, x).r   r   r6   r>   s        r#   dup_spherical_bessel_fnrY     s    1uqvveeWquuaffo1ac]W^Jr1a,@!AaCE(ANPRVB b!Qr%   c                     UR                   UR                  /UR                  /p2[        SU S-   5       H2  nU[        [	        [        USU5      U" SSU-  -
  5      U5      X!5      p2M4     U$ )z&Low-level implementation of fn(-n, x).r   r   r9   r6   r>   s        r#   dup_spherical_bessel_fn_minusr[   (  sa    eeQVV_qvvh1ac]W^Jr1a,@!AacE(ANPRVB Ir%   c           	          Uc  [        S5      nU S:  a  [        O[        n[        [	        U 5      U[
        S[        S5      U-  4U5      $ )a|  
Coefficients for the spherical Bessel functions.

These 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
    Degree of the polynomial.
x : optional
polys : bool, optional
    If True, return a Poly, otherwise (default) return 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'   r    r   )r   r[   rY   r   absr   r   )r   r'   r(   fs       r#   spherical_bessel_fnr`   /  sE    J 	y#J)*Q%4KAc!faR"Q%'U;;r%   )NF)Nr   F)(__doc__sympy.core.symbolr   sympy.polys.densearithr   r   r   r   r   r	   r
   r   sympy.polys.domainsr   r   sympy.polys.polytoolsr   sympy.utilitiesr   r$   r)   r-   r/   r4   r2   r3   r?   rB   rD   rH   rJ   rL   rN   rP   rR   rU   rW   rY   r[   r`    r%   r#   <module>rh      s   @ #I I I & , "  R R$	W &<> C C D D		 M M = =	 O O W W  (<r%   