-- | Legendre polynomials
--
-- See <https://en.wikipedia.org/wiki/Legendre_polynomials>
-- 

{-# LANGUAGE DataKinds, TypeSynonymInstances, FlexibleContexts, FlexibleInstances, BangPatterns, ScopedTypeVariables #-}
module Math.Algebra.Polynomial.Univariate.Legendre
  ( legendreP
  , rationalLegendreP
  ) 
  where

--------------------------------------------------------------------------------

import Data.List
import Data.Ratio

import Data.Semigroup
import Data.Monoid

import GHC.TypeLits

import qualified Math.Algebra.Polynomial.FreeModule as ZMod
import Math.Algebra.Polynomial.FreeModule ( FreeMod , FreeModule(..) , ZMod , QMod )

import Math.Algebra.Polynomial.Univariate

import Math.Algebra.Polynomial.Class
import Math.Algebra.Polynomial.Pretty
import Math.Algebra.Polynomial.Misc

--------------------------------------------------------------------------------

-- | Legendre polynomials
legendreP :: (Field c, KnownSymbol v) => Int -> Univariate c v
legendreP :: Int -> Univariate c v
legendreP = Univariate Rational v -> Univariate c v
forall c (v :: Symbol).
(Field c, KnownSymbol v) =>
Univariate Rational v -> Univariate c v
fromQUni (Univariate Rational v -> Univariate c v)
-> (Int -> Univariate Rational v) -> Int -> Univariate c v
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Univariate Rational "x" -> Univariate Rational v
forall c (var1 :: Symbol) (var2 :: Symbol).
Univariate c var1 -> Univariate c var2
renameUniVar (Univariate Rational "x" -> Univariate Rational v)
-> (Int -> Univariate Rational "x") -> Int -> Univariate Rational v
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Univariate Rational "x"
rationalLegendreP

--------------------------------------------------------------------------------

x :: Univariate Rational "x"
x :: Univariate Rational "x"
x = VarP (Univariate Rational "x") -> Univariate Rational "x"
forall p. AlmostPolynomial p => VarP p -> p
variableP ()

rationalLegendreP :: Int -> Univariate Rational "x"
rationalLegendreP :: Int -> Univariate Rational "x"
rationalLegendreP = ((Int -> Univariate Rational "x")
 -> Int -> Univariate Rational "x")
-> Int -> Univariate Rational "x"
forall a. ((Int -> a) -> Int -> a) -> Int -> a
intCache (Int -> Univariate Rational "x") -> Int -> Univariate Rational "x"
compute where
  fi :: Int -> Rational
fi = (Int -> Rational
forall a b. (Integral a, Num b) => a -> b
fromIntegral :: Int -> Rational)
  compute :: (Int -> Univariate Rational "x") -> Int -> Univariate Rational "x"
compute Int -> Univariate Rational "x"
recur Int
n = case Int
n of 
    Int
0 -> Univariate Rational "x"
1
    Int
1 -> Univariate Rational "x"
x
    Int
n -> CoeffP (Univariate Rational "x")
-> Univariate Rational "x" -> Univariate Rational "x"
forall p. AlmostPolynomial p => CoeffP p -> p -> p
scaleP (Rational
1 Rational -> Rational -> Rational
forall a. Fractional a => a -> a -> a
/ Int -> Rational
fi Int
n) 
       (Univariate Rational "x" -> Univariate Rational "x")
-> Univariate Rational "x" -> Univariate Rational "x"
forall a b. (a -> b) -> a -> b
$ CoeffP (Univariate Rational "x")
-> Univariate Rational "x" -> Univariate Rational "x"
forall p. AlmostPolynomial p => CoeffP p -> p -> p
scaleP (Int -> Rational
fi (Int -> Rational) -> Int -> Rational
forall a b. (a -> b) -> a -> b
$ Int
2Int -> Int -> Int
forall a. Num a => a -> a -> a
*Int
nInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1) (Univariate Rational "x"
x Univariate Rational "x"
-> Univariate Rational "x" -> Univariate Rational "x"
forall a. Num a => a -> a -> a
* Int -> Univariate Rational "x"
recur (Int
nInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1)) 
       Univariate Rational "x"
-> Univariate Rational "x" -> Univariate Rational "x"
forall a. Num a => a -> a -> a
- CoeffP (Univariate Rational "x")
-> Univariate Rational "x" -> Univariate Rational "x"
forall p. AlmostPolynomial p => CoeffP p -> p -> p
scaleP (Int -> Rational
fi (Int -> Rational) -> Int -> Rational
forall a b. (a -> b) -> a -> b
$   Int
nInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1) (    Int -> Univariate Rational "x"
recur (Int
nInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
2))

--------------------------------------------------------------------------------