o
    oh'                     @   s:  d Z ddlmZ ddlmZmZmZmZmZm	Z	m
Z
mZ ddlmZmZ ddlmZ ddlmZ dd Zed3ddZdd Zd3ddZdd Zdd Zdd Zdd Zed3ddZed3ddZdd Zdd  Zed3d!d"Zed3d#d$Z d%d& Z!ed3d'd(Z"d)d* Z#ed4d+d,Z$d-d. Z%d/d0 Z&d3d1d2Z'd	S )5z: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                 C   s  | dk r|j gS |j g|| |d |j  || |d g}}td| d D ]}|||| |  || |d|  |d  }|| |d|  |j  || ||   |d|  }|| |d|  |j  || |d|  |d  || |d|   |d|  }	|| |j  || |j   || |d|   | }
t|||}tt|d||	|}t||
|}|tt|||||}}q'|S )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p2 r!   j/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/sympy/polys/orthopolys.py
dup_jacobi	   s   006V4r#   NFc                 C   s   t | tdd|||f|S )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polysr!   r!   r"   jacobi_poly   s   r&   c                 C   s   | dk r|j gS |j g|d| |jg}}td| d D ]8}tt|d||d||j   || |d |}t||d||j   || |j  |}|t|||}}q|S )z3Low-level implementation of Gegenbauer polynomials.r   r   r   zeror   r   r   r   )r   r   r   r   r   r   r   r    r!   r!   r"   dup_gegenbauer,   s   2(r)   c                 C   s   t | tdd||f|S )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%   r!   r!   r"   gegenbauer_poly7   s   r*   c                 C   s,   | dk r|j gS | dk rt| |S t| |S )zDLow-level implementation of Chebyshev polynomials of the first kind.r   @   )r   _dup_chebyshevt_rec_dup_chebyshevt_prod)r   r   r!   r!   r"   dup_chebyshevtG   s
   

r.   c                 C   sR   |j g|j |jg}}t| d D ]}|ttt|d||d|||}}q|S )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   _r!   r!   r"   r,   P   s   (r,   c                 C   s   |j |jg|d|j|j  g}}t| dd D ]?}ttt||||d||j d|}|dkrE|ttt|||d||j |}}qttt|||d||j ||}}q|S )a   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   cr!   r!   r"   r-   n   s   "$((r-   c                 C   sf   | dk r|j gS |j g|d|jg}}td| d D ]}|ttt|d||d|||}}q|S )zELow-level implementation of Chebyshev polynomials of the second kind.r   r   r/   r   r   r   r   r   r!   r!   r"   dup_chebyshevu   s   (r6   c                 C      t | ttd|f|S )a  Generates 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   r.   r   r   r$   r%   r!   r!   r"   chebyshevt_poly      r9   c                 C   r7   )a  Generates 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   r6   r   r8   r!   r!   r"   chebyshevu_poly   r:   r;   c                 C   s~   | dk r|j gS |j g|d|jg}}td| d D ]!}t|d|}t|||d |}|tt||||d|}}q|S )z0Low-level implementation of Hermite polynomials.r   r   r   r(   r   r   r   r   r   r   r   r   r   r   r   r!   r!   r"   dup_hermite   s    r>   c                 C   sp   | dk r|j gS |j g|j |jg}}td| d D ]}t|d|}t|||d |}|t|||}}q|S )z>Low-level implementation of probabilist's Hermite polynomials.r   r   r<   r=   r!   r!   r"   dup_hermite_prob   s   r?   c                 C   r7   )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   r>   r   r8   r!   r!   r"   hermite_poly      r@   c                 C   r7   )a  Generates 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   r?   r   r8   r!   r!   r"   hermite_prob_poly   r:   rB   c                 C   s   | dk r|j gS |j g|j |jg}}td| d D ]'}tt|d||d| d ||}t|||d ||}|t|||}}q|S )z1Low-level implementation of Legendre polynomials.r   r   r'   r=   r!   r!   r"   dup_legendre   s   "rC   c                 C   r7   )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   rC   r   r8   r!   r!   r"   legendre_poly   rA   rD   c                 C   s   |j g|jg}}td| d D ]4}t||j || ||j || |d g|}t|||j || |j |}|t|||}}q|S )z1Low-level implementation of Laguerre polynomials.r   r   )r(   r   r   r   r   r   )r   alphar   r   r   r   r   r   r!   r!   r"   dup_laguerre  s   2 rF   c                 C   s   t | tdd||f|S )aQ  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   rF   )r   r$   rE   r%   r!   r!   r"   laguerre_poly  s   rG   c                 C   sx   | dk r
|j |jgS |j g|j |jg}}td| d D ]}|ttt|d||d| d |||}}qt|d|S )z%Low-level implementation of fn(n, x).r   r   r/   r5   r!   r!   r"   dup_spherical_bessel_fn  s   0rH   c              	   C   s\   |j |jg|jg}}td| d D ]}|ttt|d||dd|  |||}}q|S )z&Low-level implementation of fn(-n, x).r   r   r1   r/   r5   r!   r!   r"   dup_spherical_bessel_fn_minus(  s   0rI   c                 C   s@   |du rt d}| dk rtnt}tt| |tdtd| f|S )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

    Nr$   r    r   )r   rI   rH   r   absr   r   )r   r$   r%   fr!   r!   r"   spherical_bessel_fn/  s   % rM   )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*   r.   r,   r-   r6   r9   r;   r>   r?   r@   rB   rC   rD   rF   rG   rH   rI   rM   r!   r!   r!   r"   <module>   sD    (
				