ó
¡¼™\c           @  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 m Z m Z m Z d d l m Z m Z d d l m Z d d	 l m Z m Z d d
 l m Z d „  Z e d e d „ ƒ Z d „  Z d e d „ Z d „  Z  e d e d „ ƒ Z! d „  Z" e d e d „ ƒ Z# d „  Z$ e d e d „ ƒ Z% d „  Z& e d e d „ ƒ Z' d „  Z( e d d e d „ ƒ Z) d „  Z* d „  Z+ d e d „ Z, d S(   s;   Efficient functions for generating orthogonal polynomials. iÿÿÿÿ(   t   print_functiont   division(   t   Dummy(   t   range(   t   construct_domain(   t   dup_mult   dup_mul_groundt
   dup_lshiftt   dup_subt   dup_add(   t   ZZt   QQ(   t   DMP(   t   Polyt   PurePoly(   t   publicc         C  sé  | j  g | | | d ƒ | d ƒ | | | d ƒ g g } x t d |  d ƒ D]‹} | | ƒ | | | | | | d ƒ | | d ƒ } | | | d ƒ | | j  | | | | | d ƒ | } | | | d ƒ | | j  | | | d ƒ | | d ƒ | | | d ƒ | | d ƒ | } | | | j  | | | j  | | | d ƒ | | }	 t | d | | ƒ }
 t t | d d | ƒ | | ƒ } t | d |	 | ƒ } | j t t |
 | | ƒ | | ƒ ƒ qR W| |  S(   s0   Low-level implementation of Jacobi polynomials. i   i   iÿÿÿÿiþÿÿÿ(   t   oneR   R   R   t   appendR   R	   (   t   nt   at   bt   Kt   seqt   it   dent   f0t   f1t   f2t   p0t   p1t   p2(    (    s5   lib/python2.7/site-packages/sympy/polys/orthopolys.pyt
   dup_jacobi   s    >8=c:")c         C  s¶   |  d k  r t  d |  ƒ ‚ n  t | | g d t ƒ\ } } t t t |  ƒ | d | d | ƒ | ƒ } | d k	 rŠ t j | | ƒ } n t	 j | t
 d ƒ ƒ } | r¬ | S| j ƒ  S(   sÀ  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.
    i    s-   can't generate Jacobi polynomial of degree %st   fieldi   t   xN(   t
   ValueErrorR   t   TrueR   R   t   intt   NoneR   t   newR   R   t   as_expr(   R   R   R   R!   t   polysR   t   vt   poly(    (    s5   lib/python2.7/site-packages/sympy/polys/orthopolys.pyt   jacobi_poly"   s    ,c   	      C  sÝ   | j  g | d ƒ | | j g g } x­ t d |  d ƒ D]˜ } | d ƒ | | | j  | } | | d ƒ | | d ƒ | } t t | d d | ƒ | | ƒ } t | d | | ƒ } | j t | | | ƒ ƒ q9 W| |  S(   s4   Low-level implementation of Gegenbauer polynomials. i   i   iÿÿÿÿiþÿÿÿ(   R   t   zeroR   R   R   R   R   (	   R   R   R   R   R   R   R   R   R   (    (    s5   lib/python2.7/site-packages/sympy/polys/orthopolys.pyt   dup_gegenbauerD   s    %""c         C  s¥   |  d k  r t  d |  ƒ ‚ n  t | d t ƒ\ } } t t t |  ƒ | | ƒ | ƒ } | d k	 ry t j | | ƒ } n t	 j | t
 d ƒ ƒ } | r› | S| j ƒ  S(   sk  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.
    i    s1   can't generate Gegenbauer polynomial of degree %sR    R!   N(   R"   R   R#   R   R-   R$   R%   R   R&   R   R   R'   (   R   R   R!   R(   R   R*   (    (    s5   lib/python2.7/site-packages/sympy/polys/orthopolys.pyt   gegenbauer_polyR   s    !c         C  s‰   | j  g | j  | j g g } x` t d |  d ƒ D]K } t t | d d | ƒ | d ƒ | ƒ } | j t | | d | ƒ ƒ q2 W| |  S(   sC   Low-level implementation of Chebyshev polynomials of the 1st kind. i   i   iÿÿÿÿiþÿÿÿ(   R   R,   R   R   R   R   R   (   R   R   R   R   R   (    (    s5   lib/python2.7/site-packages/sympy/polys/orthopolys.pyt   dup_chebyshevtq   s
    (!c         C  sŠ   |  d k  r t  d |  ƒ ‚ n  t t t |  ƒ t ƒ t ƒ } | d k	 r^ t j | | ƒ } n t j | t	 d ƒ ƒ } | r€ | S| j
 ƒ  S(   s1  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.
    i    s9   can't generate 1st kind Chebyshev polynomial of degree %sR!   N(   R"   R   R/   R$   R
   R%   R   R&   R   R   R'   (   R   R!   R(   R*   (    (    s5   lib/python2.7/site-packages/sympy/polys/orthopolys.pyt   chebyshevt_poly|   s    c         C  sŒ   | j  g | d ƒ | j g g } x` t d |  d ƒ D]K } t t | d d | ƒ | d ƒ | ƒ } | j t | | d | ƒ ƒ q5 W| |  S(   sC   Low-level implementation of Chebyshev polynomials of the 2nd kind. i   i   iÿÿÿÿiþÿÿÿ(   R   R,   R   R   R   R   R   (   R   R   R   R   R   (    (    s5   lib/python2.7/site-packages/sympy/polys/orthopolys.pyt   dup_chebyshevu˜   s
    !(!c         C  sŠ   |  d k  r t  d |  ƒ ‚ n  t t t |  ƒ t ƒ t ƒ } | d k	 r^ t j | | ƒ } n t j | t	 d ƒ ƒ } | r€ | S| j
 ƒ  S(   s2  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.
    i    s9   can't generate 2nd kind Chebyshev polynomial of degree %sR!   N(   R"   R   R1   R$   R
   R%   R   R&   R   R   R'   (   R   R!   R(   R*   (    (    s5   lib/python2.7/site-packages/sympy/polys/orthopolys.pyt   chebyshevu_poly£   s    c         C  s®   | j  g | d ƒ | j g g } x‚ t d |  d ƒ D]m } t | d d | ƒ } t | d | | d ƒ | ƒ } t t | | | ƒ | d ƒ | ƒ } | j | ƒ q5 W| |  S(   s1   Low-level implementation of Hermite polynomials. i   i   iÿÿÿÿiþÿÿÿ(   R   R,   R   R   R   R   R   (   R   R   R   R   R   R   t   c(    (    s5   lib/python2.7/site-packages/sympy/polys/orthopolys.pyt   dup_hermite¿   s    ! $c         C  sŠ   |  d k  r t  d |  ƒ ‚ n  t t t |  ƒ t ƒ t ƒ } | d k	 r^ t j | | ƒ } n t j | t	 d ƒ ƒ } | r€ | S| j
 ƒ  S(   s  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.
    i    s.   can't generate Hermite polynomial of degree %sR!   N(   R"   R   R4   R$   R
   R%   R   R&   R   R   R'   (   R   R!   R(   R*   (    (    s5   lib/python2.7/site-packages/sympy/polys/orthopolys.pyt   hermite_polyÎ   s    c         C  s³   | j  g | j  | j g g } xŠ t d |  d ƒ D]u } t t | d d | ƒ | d | d | ƒ | ƒ } t | d | | d | ƒ | ƒ } | j t | | | ƒ ƒ q2 W| |  S(   s2   Low-level implementation of Legendre polynomials. i   i   iÿÿÿÿiþÿÿÿ(   R   R,   R   R   R   R   R   (   R   R   R   R   R   R   (    (    s5   lib/python2.7/site-packages/sympy/polys/orthopolys.pyt   dup_legendreé   s    3#c         C  sŠ   |  d k  r t  d |  ƒ ‚ n  t t t |  ƒ t ƒ t ƒ } | d k	 r^ t j | | ƒ } n t j | t	 d ƒ ƒ } | r€ | S| j
 ƒ  S(   s  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.
    i    s/   can't generate Legendre polynomial of degree %sR!   N(   R"   R   R6   R$   R   R%   R   R&   R   R   R'   (   R   R!   R(   R*   (    (    s5   lib/python2.7/site-packages/sympy/polys/orthopolys.pyt   legendre_polyö   s    c         C  sÁ   | j  g | j g g } xž t d |  d ƒ D]‰ } t | d | j | | | | d | d ƒ | g | ƒ } t | d | | | | d ƒ | | ƒ } | j t | | | ƒ ƒ q, W| d S(   s2   Low-level implementation of Laguerre polynomials. i   iÿÿÿÿi   iþÿÿÿ(   R,   R   R   R   R   R   R   (   R   t   alphaR   R   R   R   R   (    (    s5   lib/python2.7/site-packages/sympy/polys/orthopolys.pyt   dup_laguerre  s    >,c         C  sÇ   |  d k  r t  d |  ƒ ‚ n  | d k	 rF t | d t ƒ\ } } n t t d ƒ } } t t t |  ƒ | | ƒ | ƒ } | d k	 r› t j	 | | ƒ } n t
 j	 | t d ƒ ƒ } | r½ | S| j ƒ  S(   sm  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.
    i    s/   can't generate Laguerre polynomial of degree %sR    R!   N(   R"   R%   R   R#   R   R   R9   R$   R   R&   R   R   R'   (   R   R!   R8   R(   R   R*   (    (    s5   lib/python2.7/site-packages/sympy/polys/orthopolys.pyt   laguerre_poly  s    !c         C  s   | j  g | j  | j g g } xh t d |  d ƒ D]S } t t | d d | ƒ | d | d ƒ | ƒ } | j t | | d | ƒ ƒ q2 Wt | |  d | ƒ S(   s&    Low-level implementation of fn(n, x) i   i   iÿÿÿÿiþÿÿÿ(   R   R,   R   R   R   R   R   (   R   R   R   R   R   (    (    s5   lib/python2.7/site-packages/sympy/polys/orthopolys.pyt   dup_spherical_bessel_fnB  s
    0!c         C  s‘   | j  | j g | j g g } xh t d |  d ƒ D]S } t t | d d | ƒ | d d | ƒ | ƒ } | j t | | d | ƒ ƒ q2 W| |  S(   s'    Low-level implementation of fn(-n, x) i   i   iÿÿÿÿi   iþÿÿÿ(   R   R,   R   R   R   R   R   (   R   R   R   R   R   (    (    s5   lib/python2.7/site-packages/sympy/polys/orthopolys.pyt   dup_spherical_bessel_fn_minusM  s
    0!c         C  sž   |  d k  r% t  t |  ƒ t ƒ } n t t |  ƒ t ƒ } t | t ƒ } | d k	 rn t j | d | ƒ } n t j | d t	 d ƒ ƒ } | r” | S| j
 ƒ  S(   s
  
    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

    i    i   R!   N(   R<   R$   R
   R;   R   R%   R   R&   R   R   R'   (   R   R!   R(   t   dupR*   (    (    s5   lib/python2.7/site-packages/sympy/polys/orthopolys.pyt   spherical_bessel_fnX  s    'N(-   t   __doc__t
   __future__R    R   t   sympyR   t   sympy.core.compatibilityR   t   sympy.polys.constructorR   t   sympy.polys.densearithR   R   R   R   R	   t   sympy.polys.domainsR
   R   t   sympy.polys.polyclassesR   t   sympy.polys.polytoolsR   R   t   sympy.utilitiesR   R   R%   t   FalseR+   R-   R.   R/   R0   R1   R2   R4   R5   R6   R7   R9   R:   R;   R<   R>   (    (    (    s5   lib/python2.7/site-packages/sympy/polys/orthopolys.pyt   <module>   s@   (	!						#		