{-# 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
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))