{-# LANGUAGE RebindableSyntax #-}
module Data.YAP.PowerSeries (
PowerSeries,
constant,
fromPolynomial,
fromCoefficients,
fromDerivatives,
atZero,
coefficients,
derivatives,
flatten,
toPolynomial,
modulus,
order,
distance,
approximations,
approximationsWith,
padeApproximants,
identity,
compose,
inverse,
inverseSimple,
(.*),
(.^),
divX,
mulX,
shift,
recipSimple,
divSimple,
recipOneMinus,
expS,
logOnePlus,
powerOnePlus,
euler,
sinS,
cosS,
secS,
tanS,
asinS,
atanS,
sinhS,
coshS,
sechS,
tanhS,
asinhS,
atanhS,
stieltjes,
jacobi,
binomialTransform,
inverseBinomialTransform,
lambertTransform,
inverseLambertTransform,
eulerTransform,
inverseEulerTransform,
linearRecurrence,
GradedLanguage,
string,
constants,
monomials,
riordan,
delta,
bernoulliPGF,
geometricPGF,
poissonPGF,
) where
import Prelude.YAP
import Data.YAP.Algebra
import Data.YAP.FiniteSet
import qualified Data.YAP.Polynomial as Poly
import Data.YAP.Polynomial (Polynomial, RationalFunction)
import Data.YAP.Ratio
import Data.YAP.Utilities.List (longZipWith)
import Data.List (intercalate)
infixl 9 .^
infixl 9 .*
newtype PowerSeries a = PS [a]
atZero :: (AdditiveMonoid a) => PowerSeries a -> a
atZero :: forall a. AdditiveMonoid a => PowerSeries a -> a
atZero (PS []) = a
forall a. AdditiveMonoid a => a
zero
atZero (PS (a
a:[a]
_)) = a
a
divX :: PowerSeries a -> PowerSeries a
divX :: forall a. PowerSeries a -> PowerSeries a
divX (PS []) = [a] -> PowerSeries a
forall a. [a] -> PowerSeries a
PS []
divX (PS (a
_:[a]
as)) = [a] -> PowerSeries a
forall a. [a] -> PowerSeries a
PS [a]
as
mulX :: (AdditiveMonoid a) => PowerSeries a -> PowerSeries a
mulX :: forall a. AdditiveMonoid a => PowerSeries a -> PowerSeries a
mulX PowerSeries a
f = a -> PowerSeries a -> PowerSeries a
forall a. a -> PowerSeries a -> PowerSeries a
plusMulX a
forall a. AdditiveMonoid a => a
zero PowerSeries a
f
plusMulX :: a -> PowerSeries a -> PowerSeries a
plusMulX :: forall a. a -> PowerSeries a -> PowerSeries a
plusMulX a
a (PS [a]
as) = [a] -> PowerSeries a
forall a. [a] -> PowerSeries a
PS (a
aa -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
as)
shift :: (AdditiveMonoid a) => Int -> PowerSeries a -> PowerSeries a
shift :: forall a. AdditiveMonoid a => Int -> PowerSeries a -> PowerSeries a
shift Int
_ (PS []) = [a] -> PowerSeries a
forall a. [a] -> PowerSeries a
PS []
shift Int
k (PS [a]
as)
| Int
k Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
0 = [a] -> PowerSeries a
forall a. [a] -> PowerSeries a
PS (Int -> a -> [a]
forall a. Int -> a -> [a]
replicate Int
k a
forall a. AdditiveMonoid a => a
zero [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++ [a]
as)
| Bool
otherwise = [a] -> PowerSeries a
forall a. [a] -> PowerSeries a
PS (Int -> [a] -> [a]
forall a. Int -> [a] -> [a]
drop (-Int
k) [a]
as)
coefficients :: (AdditiveMonoid a) => PowerSeries a -> [a]
coefficients :: forall a. AdditiveMonoid a => PowerSeries a -> [a]
coefficients (PS [a]
as) = [a]
as [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++ a -> [a]
forall a. a -> [a]
repeat a
forall a. AdditiveMonoid a => a
zero
fromCoefficients :: (AdditiveMonoid a) => [a] -> PowerSeries a
fromCoefficients :: forall a. AdditiveMonoid a => [a] -> PowerSeries a
fromCoefficients = [a] -> PowerSeries a
forall a. [a] -> PowerSeries a
PS
instance (Semiring a) => Differentiable (PowerSeries a) where
derivative :: PowerSeries a -> PowerSeries a
derivative (PS []) = [a] -> PowerSeries a
forall a. [a] -> PowerSeries a
PS []
derivative (PS (a
_:[a]
as)) = [a] -> PowerSeries a
forall a. [a] -> PowerSeries a
PS ((Int -> a -> a) -> [Int] -> [a] -> [a]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith Int -> a -> a
forall b. ToInteger b => b -> a -> a
forall a b. (AdditiveMonoid a, ToInteger b) => b -> a -> a
atimes (Int -> [Int]
forall a. Semiring a => a -> [a]
from (Int
1::Int)) [a]
as)
instance (FromRational a) => Integrable (PowerSeries a) where
integral :: PowerSeries a -> PowerSeries a
integral (PS [a]
as) = [a] -> PowerSeries a
forall a. [a] -> PowerSeries a
PS (a
0a -> [a] -> [a]
forall a. a -> [a] -> [a]
:(a -> a -> a) -> [a] -> [a] -> [a]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith a -> a -> a
forall a. Semiring a => a -> a -> a
(*) ((Integer -> a) -> [Integer] -> [a]
forall a b. (a -> b) -> [a] -> [b]
map Integer -> a
forall {a}. FromRational a => Integer -> a
coeff (Integer -> [Integer]
forall a. Semiring a => a -> [a]
from Integer
1)) [a]
as)
where
coeff :: Integer -> a
coeff Integer
n = Rational -> a
forall a. FromRational a => Rational -> a
fromRational (Integer
1Integer -> Integer -> Rational
forall a.
(Eq a, StandardAssociate a, Euclidean a) =>
a -> a -> Ratio a
%Integer
n)
instance AdditiveFunctor PowerSeries where
mapAdditive :: forall a b.
(AdditiveMonoid a, AdditiveMonoid b) =>
(a -> b) -> PowerSeries a -> PowerSeries b
mapAdditive a -> b
f (PS [a]
as) = [b] -> PowerSeries b
forall a. [a] -> PowerSeries a
PS ((a -> b) -> [a] -> [b]
forall a b. (a -> b) -> [a] -> [b]
map a -> b
f [a]
as)
derivatives :: (Semiring a) => PowerSeries a -> [a]
derivatives :: forall a. Semiring a => PowerSeries a -> [a]
derivatives PowerSeries a
p = (Integer -> a -> a) -> [Integer] -> [a] -> [a]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith Integer -> a -> a
forall b. ToInteger b => b -> a -> a
forall a b. (AdditiveMonoid a, ToInteger b) => b -> a -> a
atimes [Integer]
factorials (PowerSeries a -> [a]
forall a. AdditiveMonoid a => PowerSeries a -> [a]
coefficients PowerSeries a
p)
where
factorials :: [Integer]
factorials = (Integer -> Integer -> Integer)
-> Integer -> [Integer] -> [Integer]
forall b a. (b -> a -> b) -> b -> [a] -> [b]
scanl Integer -> Integer -> Integer
forall a. Semiring a => a -> a -> a
(*) (Integer
1::Integer) [Integer
1..]
fromDerivatives :: (FromRational a) => [a] -> PowerSeries a
fromDerivatives :: forall a. FromRational a => [a] -> PowerSeries a
fromDerivatives [a]
as = [a] -> PowerSeries a
forall a. AdditiveMonoid a => [a] -> PowerSeries a
fromCoefficients ((a -> a -> a) -> [a] -> [a] -> [a]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith a -> a -> a
forall a. Semiring a => a -> a -> a
(*) ((Integer -> a) -> [Integer] -> [a]
forall a b. (a -> b) -> [a] -> [b]
map Integer -> a
forall {a}. FromRational a => Integer -> a
coeff [Integer]
factorials) [a]
as)
where
coeff :: Integer -> a
coeff Integer
n = Rational -> a
forall a. FromRational a => Rational -> a
fromRational (Integer
1Integer -> Integer -> Rational
forall a.
(Eq a, StandardAssociate a, Euclidean a) =>
a -> a -> Ratio a
%Integer
n)
factorials :: [Integer]
factorials = (Integer -> Integer -> Integer)
-> Integer -> [Integer] -> [Integer]
forall b a. (b -> a -> b) -> b -> [a] -> [b]
scanl Integer -> Integer -> Integer
forall a. Semiring a => a -> a -> a
(*) (Integer
1::Integer) [Integer
1..]
instance (AdditiveMonoid a) => AdditiveMonoid (PowerSeries a) where
PS [a]
as + :: PowerSeries a -> PowerSeries a -> PowerSeries a
+ PS [a]
bs = [a] -> PowerSeries a
forall a. [a] -> PowerSeries a
PS ([a] -> [a] -> [a]
forall a. AdditiveMonoid a => [a] -> [a] -> [a]
add [a]
as [a]
bs)
zero :: PowerSeries a
zero = [a] -> PowerSeries a
forall a. [a] -> PowerSeries a
PS []
atimes :: forall b. ToInteger b => b -> PowerSeries a -> PowerSeries a
atimes b
n PowerSeries a
p
| b
n b -> b -> Bool
forall a. Eq a => a -> a -> Bool
== b
forall a. AdditiveMonoid a => a
zero = PowerSeries a
forall a. AdditiveMonoid a => a
zero
| Bool
otherwise = (a -> a) -> PowerSeries a -> PowerSeries a
forall a b.
(AdditiveMonoid a, AdditiveMonoid b) =>
(a -> b) -> PowerSeries a -> PowerSeries b
forall (f :: * -> *) a b.
(AdditiveFunctor f, AdditiveMonoid a, AdditiveMonoid b) =>
(a -> b) -> f a -> f b
mapAdditive (b -> a -> a
forall b. ToInteger b => b -> a -> a
forall a b. (AdditiveMonoid a, ToInteger b) => b -> a -> a
atimes b
n) PowerSeries a
p
add :: (AdditiveMonoid a) => [a] -> [a] -> [a]
add :: forall a. AdditiveMonoid a => [a] -> [a] -> [a]
add = (a -> a -> a) -> [a] -> [a] -> [a]
forall a. (a -> a -> a) -> [a] -> [a] -> [a]
longZipWith a -> a -> a
forall a. AdditiveMonoid a => a -> a -> a
(+)
instance (AbelianGroup a) => AbelianGroup (PowerSeries a) where
negate :: PowerSeries a -> PowerSeries a
negate = (a -> a) -> PowerSeries a -> PowerSeries a
forall a b.
(AdditiveMonoid a, AdditiveMonoid b) =>
(a -> b) -> PowerSeries a -> PowerSeries b
forall (f :: * -> *) a b.
(AdditiveFunctor f, AdditiveMonoid a, AdditiveMonoid b) =>
(a -> b) -> f a -> f b
mapAdditive a -> a
forall a. AbelianGroup a => a -> a
negate
gtimes :: forall b.
(AbelianGroup b, ToInteger b) =>
b -> PowerSeries a -> PowerSeries a
gtimes b
n PowerSeries a
p
| b
n b -> b -> Bool
forall a. Eq a => a -> a -> Bool
== b
forall a. AdditiveMonoid a => a
zero = PowerSeries a
forall a. AdditiveMonoid a => a
zero
| Bool
otherwise = (a -> a) -> PowerSeries a -> PowerSeries a
forall a b.
(AdditiveMonoid a, AdditiveMonoid b) =>
(a -> b) -> PowerSeries a -> PowerSeries b
forall (f :: * -> *) a b.
(AdditiveFunctor f, AdditiveMonoid a, AdditiveMonoid b) =>
(a -> b) -> f a -> f b
mapAdditive (b -> a -> a
forall b. (AbelianGroup b, ToInteger b) => b -> a -> a
forall a b.
(AbelianGroup a, AbelianGroup b, ToInteger b) =>
b -> a -> a
gtimes b
n) PowerSeries a
p
instance (Semiring a) => Semiring (PowerSeries a) where
PS [a]
as * :: PowerSeries a -> PowerSeries a -> PowerSeries a
* PS [a]
bs = [a] -> PowerSeries a
forall a. [a] -> PowerSeries a
PS ([a] -> [a] -> [a]
forall a. Semiring a => [a] -> [a] -> [a]
mul [a]
as [a]
bs)
one :: PowerSeries a
one = a -> PowerSeries a
forall a. AdditiveMonoid a => a -> PowerSeries a
constant a
forall a. Semiring a => a
one
fromNatural :: Natural -> PowerSeries a
fromNatural Natural
i = a -> PowerSeries a
forall a. AdditiveMonoid a => a -> PowerSeries a
constant (Natural -> a
forall a. Semiring a => Natural -> a
fromNatural Natural
i)
mul :: (Semiring a) => [a] -> [a] -> [a]
mul :: forall a. Semiring a => [a] -> [a] -> [a]
mul [a]
_ [] = []
mul [a]
xs (a
y:[a]
ys) = (a -> [a] -> [a]) -> [a] -> [a] -> [a]
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr a -> [a] -> [a]
mulOne [] [a]
xs
where
mulOne :: a -> [a] -> [a]
mulOne a
x [a]
zs = (a
xa -> a -> a
forall a. Semiring a => a -> a -> a
*a
y) a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a] -> [a] -> [a]
forall a. AdditiveMonoid a => [a] -> [a] -> [a]
add ((a -> a) -> [a] -> [a]
forall a b. (a -> b) -> [a] -> [b]
map (a
xa -> a -> a
forall a. Semiring a => a -> a -> a
*) [a]
ys) [a]
zs
instance (Ring a) => Ring (PowerSeries a) where
fromInteger :: Integer -> PowerSeries a
fromInteger Integer
i = a -> PowerSeries a
forall a. AdditiveMonoid a => a -> PowerSeries a
constant (Integer -> a
forall a. Ring a => Integer -> a
fromInteger Integer
i)
instance (FromRational a) => FromRational (PowerSeries a) where
fromRational :: Rational -> PowerSeries a
fromRational Rational
x = a -> PowerSeries a
forall a. AdditiveMonoid a => a -> PowerSeries a
constant (Rational -> a
forall a. FromRational a => Rational -> a
fromRational Rational
x)
instance (Eq a, Field a) => StandardAssociate (PowerSeries a) where
stdAssociate :: PowerSeries a -> PowerSeries a
stdAssociate = PowerSeries a -> PowerSeries a
forall a. (Eq a, Semiring a) => PowerSeries a -> PowerSeries a
stdAssociateStream
stdUnit :: PowerSeries a -> PowerSeries a
stdUnit = (PowerSeries a -> Bool)
-> (PowerSeries a -> PowerSeries a)
-> PowerSeries a
-> PowerSeries a
forall a. (a -> Bool) -> (a -> a) -> a -> a
until ((a -> a -> Bool
forall a. Eq a => a -> a -> Bool
/= a
0) (a -> Bool) -> (PowerSeries a -> a) -> PowerSeries a -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PowerSeries a -> a
forall a. AdditiveMonoid a => PowerSeries a -> a
atZero) PowerSeries a -> PowerSeries a
forall a. PowerSeries a -> PowerSeries a
divX
stdRecip :: PowerSeries a -> PowerSeries a
stdRecip PowerSeries a
f = PowerSeries a
1 PowerSeries a -> PowerSeries a -> PowerSeries a
forall a.
Field a =>
PowerSeries a -> PowerSeries a -> PowerSeries a
`exactDiv` PowerSeries a -> PowerSeries a
forall a. StandardAssociate a => a -> a
stdUnit PowerSeries a
f
stdAssociateStream :: (Eq a, Semiring a) => PowerSeries a -> PowerSeries a
stdAssociateStream :: forall a. (Eq a, Semiring a) => PowerSeries a -> PowerSeries a
stdAssociateStream PowerSeries a
f
| PowerSeries a -> a
forall a. AdditiveMonoid a => PowerSeries a -> a
atZero PowerSeries a
f a -> a -> Bool
forall a. Eq a => a -> a -> Bool
/= a
forall a. AdditiveMonoid a => a
zero = PowerSeries a
forall a. Semiring a => a
one
| Bool
otherwise = PowerSeries a -> PowerSeries a
forall a. AdditiveMonoid a => PowerSeries a -> PowerSeries a
mulX (PowerSeries a -> PowerSeries a
forall a. (Eq a, Semiring a) => PowerSeries a -> PowerSeries a
stdAssociateStream (PowerSeries a -> PowerSeries a
forall a. PowerSeries a -> PowerSeries a
divX PowerSeries a
f))
instance (Eq a, Field a) => Euclidean (PowerSeries a) where
divMod :: PowerSeries a -> PowerSeries a -> (PowerSeries a, PowerSeries a)
divMod PowerSeries a
f PowerSeries a
g = ([a] -> PowerSeries a)
-> (PowerSeries a, [a]) -> (PowerSeries a, PowerSeries a)
forall a b. (a -> b) -> (PowerSeries a, a) -> (PowerSeries a, b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [a] -> PowerSeries a
forall a. AdditiveMonoid a => [a] -> PowerSeries a
fromCoefficients (PowerSeries a -> PowerSeries a -> (PowerSeries a, [a])
forall a.
(Eq a, Field a) =>
PowerSeries a -> PowerSeries a -> (PowerSeries a, [a])
divModStream PowerSeries a
f PowerSeries a
g)
div :: PowerSeries a -> PowerSeries a -> PowerSeries a
div = PowerSeries a -> PowerSeries a -> PowerSeries a
forall a.
(Eq a, Field a) =>
PowerSeries a -> PowerSeries a -> PowerSeries a
divStream
mod :: PowerSeries a -> PowerSeries a -> PowerSeries a
mod PowerSeries a
f PowerSeries a
g = [a] -> PowerSeries a
forall a. AdditiveMonoid a => [a] -> PowerSeries a
fromCoefficients (PowerSeries a -> PowerSeries a -> [a]
forall a.
(Eq a, AdditiveMonoid a) =>
PowerSeries a -> PowerSeries a -> [a]
modStream PowerSeries a
f PowerSeries a
g)
euclideanNorm :: PowerSeries a -> Natural
euclideanNorm (PS [a]
as) = Int -> Natural
forall a. Euclidean a => a -> Natural
euclideanNorm ([a] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length ((a -> Bool) -> [a] -> [a]
forall a. (a -> Bool) -> [a] -> [a]
takeWhile (a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
0) [a]
as))
divModStream :: (Eq a, Field a) =>
PowerSeries a -> PowerSeries a -> (PowerSeries a, [a])
divModStream :: forall a.
(Eq a, Field a) =>
PowerSeries a -> PowerSeries a -> (PowerSeries a, [a])
divModStream PowerSeries a
f PowerSeries a
g
| PowerSeries a -> a
forall a. AdditiveMonoid a => PowerSeries a -> a
atZero PowerSeries a
g a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
0 = (PowerSeries a
q, PowerSeries a -> a
forall a. AdditiveMonoid a => PowerSeries a -> a
atZero PowerSeries a
fa -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
r)
| Bool
otherwise = (PowerSeries a -> PowerSeries a -> PowerSeries a
forall a.
Field a =>
PowerSeries a -> PowerSeries a -> PowerSeries a
exactDiv PowerSeries a
f PowerSeries a
g, [])
where
(PowerSeries a
q, [a]
r) = PowerSeries a -> PowerSeries a -> (PowerSeries a, [a])
forall a.
(Eq a, Field a) =>
PowerSeries a -> PowerSeries a -> (PowerSeries a, [a])
divModStream (PowerSeries a -> PowerSeries a
forall a. PowerSeries a -> PowerSeries a
divX PowerSeries a
f) (PowerSeries a -> PowerSeries a
forall a. PowerSeries a -> PowerSeries a
divX PowerSeries a
g)
divStream :: (Eq a, Field a) => PowerSeries a -> PowerSeries a -> PowerSeries a
divStream :: forall a.
(Eq a, Field a) =>
PowerSeries a -> PowerSeries a -> PowerSeries a
divStream PowerSeries a
f PowerSeries a
g
| PowerSeries a -> a
forall a. AdditiveMonoid a => PowerSeries a -> a
atZero PowerSeries a
g a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
0 = PowerSeries a -> PowerSeries a -> PowerSeries a
forall a.
(Eq a, Field a) =>
PowerSeries a -> PowerSeries a -> PowerSeries a
divStream (PowerSeries a -> PowerSeries a
forall a. PowerSeries a -> PowerSeries a
divX PowerSeries a
f) (PowerSeries a -> PowerSeries a
forall a. PowerSeries a -> PowerSeries a
divX PowerSeries a
g)
| Bool
otherwise = PowerSeries a -> PowerSeries a -> PowerSeries a
forall a.
Field a =>
PowerSeries a -> PowerSeries a -> PowerSeries a
exactDiv PowerSeries a
f PowerSeries a
g
modStream :: (Eq a, AdditiveMonoid a) => PowerSeries a -> PowerSeries a -> [a]
modStream :: forall a.
(Eq a, AdditiveMonoid a) =>
PowerSeries a -> PowerSeries a -> [a]
modStream PowerSeries a
f PowerSeries a
g
| PowerSeries a -> a
forall a. AdditiveMonoid a => PowerSeries a -> a
atZero PowerSeries a
g a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
forall a. AdditiveMonoid a => a
zero = PowerSeries a -> a
forall a. AdditiveMonoid a => PowerSeries a -> a
atZero PowerSeries a
fa -> [a] -> [a]
forall a. a -> [a] -> [a]
:PowerSeries a -> PowerSeries a -> [a]
forall a.
(Eq a, AdditiveMonoid a) =>
PowerSeries a -> PowerSeries a -> [a]
modStream (PowerSeries a -> PowerSeries a
forall a. PowerSeries a -> PowerSeries a
divX PowerSeries a
f) (PowerSeries a -> PowerSeries a
forall a. PowerSeries a -> PowerSeries a
divX PowerSeries a
g)
| Bool
otherwise = []
flatten :: (AdditiveMonoid a) => PowerSeries (PowerSeries a) -> PowerSeries a
flatten :: forall a.
AdditiveMonoid a =>
PowerSeries (PowerSeries a) -> PowerSeries a
flatten (PS [PowerSeries a]
ps) = (PowerSeries a -> PowerSeries a -> PowerSeries a)
-> PowerSeries a -> [PowerSeries a] -> PowerSeries a
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr PowerSeries a -> PowerSeries a -> PowerSeries a
forall a.
AdditiveMonoid a =>
PowerSeries a -> PowerSeries a -> PowerSeries a
add_shifted PowerSeries a
forall a. AdditiveMonoid a => a
zero [PowerSeries a]
ps
where
add_shifted :: PowerSeries a -> PowerSeries a -> PowerSeries a
add_shifted PowerSeries a
p PowerSeries a
q = a -> PowerSeries a -> PowerSeries a
forall a. a -> PowerSeries a -> PowerSeries a
plusMulX (PowerSeries a -> a
forall a. AdditiveMonoid a => PowerSeries a -> a
atZero PowerSeries a
p) (PowerSeries a -> PowerSeries a
forall a. PowerSeries a -> PowerSeries a
divX PowerSeries a
p PowerSeries a -> PowerSeries a -> PowerSeries a
forall a. AdditiveMonoid a => a -> a -> a
+ PowerSeries a
q)
toPolynomial :: (AdditiveMonoid a) => Int -> PowerSeries a -> Polynomial a
toPolynomial :: forall a. AdditiveMonoid a => Int -> PowerSeries a -> Polynomial a
toPolynomial Int
n (PS [a]
as) = [a] -> Polynomial a
forall a. [a] -> Polynomial a
Poly.fromCoefficients (Int -> [a] -> [a]
forall a. Int -> [a] -> [a]
take Int
n [a]
as)
modulus :: (Eq a, AdditiveMonoid a) =>
PowerSeries a -> PowerSeries a -> Polynomial a
modulus :: forall a.
(Eq a, AdditiveMonoid a) =>
PowerSeries a -> PowerSeries a -> Polynomial a
modulus PowerSeries a
f PowerSeries a
g = [a] -> Polynomial a
forall a. [a] -> Polynomial a
Poly.fromCoefficients (PowerSeries a -> PowerSeries a -> [a]
forall a.
(Eq a, AdditiveMonoid a) =>
PowerSeries a -> PowerSeries a -> [a]
modStream PowerSeries a
f PowerSeries a
g)
exactDiv :: (Field a) => PowerSeries a -> PowerSeries a -> PowerSeries a
exactDiv :: forall a.
Field a =>
PowerSeries a -> PowerSeries a -> PowerSeries a
exactDiv PowerSeries a
f PowerSeries a
g = PowerSeries a
q
where
q :: PowerSeries a
q = a -> PowerSeries a -> PowerSeries a
forall a. a -> PowerSeries a -> PowerSeries a
plusMulX (a
f0a -> a -> a
forall a. Semifield a => a -> a -> a
/a
g0) (a -> PowerSeries a
forall a. AdditiveMonoid a => a -> PowerSeries a
constant (a -> a
forall a. DivisionSemiring a => a -> a
recip a
g0) PowerSeries a -> PowerSeries a -> PowerSeries a
forall a. Semiring a => a -> a -> a
* (PowerSeries a -> PowerSeries a
forall a. PowerSeries a -> PowerSeries a
divX PowerSeries a
f PowerSeries a -> PowerSeries a -> PowerSeries a
forall a. AbelianGroup a => a -> a -> a
- PowerSeries a
q PowerSeries a -> PowerSeries a -> PowerSeries a
forall a. Semiring a => a -> a -> a
* PowerSeries a -> PowerSeries a
forall a. PowerSeries a -> PowerSeries a
divX PowerSeries a
g))
f0 :: a
f0 = PowerSeries a -> a
forall a. AdditiveMonoid a => PowerSeries a -> a
atZero PowerSeries a
f
g0 :: a
g0 = PowerSeries a -> a
forall a. AdditiveMonoid a => PowerSeries a -> a
atZero PowerSeries a
g
constant :: (AdditiveMonoid a) => a -> PowerSeries a
constant :: forall a. AdditiveMonoid a => a -> PowerSeries a
constant a
a = [a] -> PowerSeries a
forall a. [a] -> PowerSeries a
PS [a
a]
fromPolynomial :: (AdditiveMonoid a) => Polynomial a -> PowerSeries a
fromPolynomial :: forall a. AdditiveMonoid a => Polynomial a -> PowerSeries a
fromPolynomial Polynomial a
p = [a] -> PowerSeries a
forall a. AdditiveMonoid a => [a] -> PowerSeries a
fromCoefficients (Polynomial a -> [a]
forall a. Polynomial a -> [a]
Poly.unsafeCoefficients Polynomial a
p)
recipOneMinus :: (Semiring a) => PowerSeries a
recipOneMinus :: forall a. Semiring a => PowerSeries a
recipOneMinus = [a] -> PowerSeries a
forall a. AdditiveMonoid a => [a] -> PowerSeries a
fromCoefficients (a -> [a]
forall a. a -> [a]
repeat a
forall a. Semiring a => a
one)
expS :: (FromRational a) => PowerSeries a
expS :: forall a. FromRational a => PowerSeries a
expS = [a] -> PowerSeries a
forall a. FromRational a => [a] -> PowerSeries a
fromDerivatives (a -> [a]
forall a. a -> [a]
repeat a
forall a. Semiring a => a
one)
logOnePlus :: (FromRational a) => PowerSeries a
logOnePlus :: forall a. FromRational a => PowerSeries a
logOnePlus = PowerSeries a -> PowerSeries a
forall a. Integrable a => a -> a
integral ([a] -> PowerSeries a
forall a. AdditiveMonoid a => [a] -> PowerSeries a
fromCoefficients ([a] -> [a]
forall a. HasCallStack => [a] -> [a]
cycle [a
1, -a
1]))
powerOnePlus :: (FromRational a) => a -> PowerSeries a
powerOnePlus :: forall a. FromRational a => a -> PowerSeries a
powerOnePlus a
a = [a] -> PowerSeries a
forall a. FromRational a => [a] -> PowerSeries a
fromDerivatives ((a -> a -> a) -> a -> [a] -> [a]
forall b a. (b -> a -> b) -> b -> [a] -> [b]
scanl a -> a -> a
forall a. Semiring a => a -> a -> a
(*) a
1 ((a -> a) -> a -> [a]
forall a. (a -> a) -> a -> [a]
iterate (a -> a -> a
forall a. AbelianGroup a => a -> a -> a
subtract a
1) a
a))
sinS :: (FromRational a) => PowerSeries a
sinS :: forall a. FromRational a => PowerSeries a
sinS = [a] -> PowerSeries a
forall a. FromRational a => [a] -> PowerSeries a
fromDerivatives ([a] -> [a]
forall a. HasCallStack => [a] -> [a]
cycle [a
0, a
1, a
0, -a
1])
cosS :: (FromRational a) => PowerSeries a
cosS :: forall a. FromRational a => PowerSeries a
cosS = [a] -> PowerSeries a
forall a. FromRational a => [a] -> PowerSeries a
fromDerivatives ([a] -> [a]
forall a. HasCallStack => [a] -> [a]
cycle [a
1, a
0, -a
1, a
0])
tanS :: (FromRational a) => PowerSeries a
tanS :: forall a. FromRational a => PowerSeries a
tanS = PowerSeries a
forall a. FromRational a => PowerSeries a
sinS PowerSeries a -> PowerSeries a -> PowerSeries a
forall a. Semiring a => a -> a -> a
* PowerSeries a
forall a. FromRational a => PowerSeries a
secS
secS :: (FromRational a) => PowerSeries a
secS :: forall a. FromRational a => PowerSeries a
secS = PowerSeries a -> PowerSeries a
forall a. Ring a => PowerSeries a -> PowerSeries a
recipSimple PowerSeries a
forall a. FromRational a => PowerSeries a
cosS
asinS :: (FromRational a) => PowerSeries a
asinS :: forall a. FromRational a => PowerSeries a
asinS = PowerSeries a -> PowerSeries a
forall a. Integrable a => a -> a
integral (PowerSeries a -> PowerSeries a) -> PowerSeries a -> PowerSeries a
forall a b. (a -> b) -> a -> b
$ a -> PowerSeries a
forall a. FromRational a => a -> PowerSeries a
powerOnePlus (-a
0.5) PowerSeries a -> a -> PowerSeries a
forall a. Semiring a => PowerSeries a -> a -> PowerSeries a
.* (-a
1) PowerSeries a -> Int -> PowerSeries a
forall a. AdditiveMonoid a => PowerSeries a -> Int -> PowerSeries a
.^ Int
2
atanS :: (FromRational a) => PowerSeries a
atanS :: forall a. FromRational a => PowerSeries a
atanS = PowerSeries a -> PowerSeries a
forall a. Integrable a => a -> a
integral ([a] -> PowerSeries a
forall a. AdditiveMonoid a => [a] -> PowerSeries a
fromCoefficients ([a] -> [a]
forall a. HasCallStack => [a] -> [a]
cycle [a
1, a
0, -a
1, a
0]))
sinhS :: (FromRational a) => PowerSeries a
sinhS :: forall a. FromRational a => PowerSeries a
sinhS = [a] -> PowerSeries a
forall a. FromRational a => [a] -> PowerSeries a
fromDerivatives ([a] -> [a]
forall a. HasCallStack => [a] -> [a]
cycle [a
forall a. AdditiveMonoid a => a
zero, a
forall a. Semiring a => a
one])
coshS :: (FromRational a) => PowerSeries a
coshS :: forall a. FromRational a => PowerSeries a
coshS = [a] -> PowerSeries a
forall a. FromRational a => [a] -> PowerSeries a
fromDerivatives ([a] -> [a]
forall a. HasCallStack => [a] -> [a]
cycle [a
forall a. Semiring a => a
one, a
forall a. AdditiveMonoid a => a
zero])
tanhS :: (FromRational a) => PowerSeries a
tanhS :: forall a. FromRational a => PowerSeries a
tanhS = PowerSeries a
forall a. FromRational a => PowerSeries a
sinhS PowerSeries a -> PowerSeries a -> PowerSeries a
forall a. Semiring a => a -> a -> a
* PowerSeries a
forall a. FromRational a => PowerSeries a
sechS
sechS :: (FromRational a) => PowerSeries a
sechS :: forall a. FromRational a => PowerSeries a
sechS = PowerSeries a -> PowerSeries a
forall a. Ring a => PowerSeries a -> PowerSeries a
recipSimple PowerSeries a
forall a. FromRational a => PowerSeries a
coshS
asinhS :: (FromRational a) => PowerSeries a
asinhS :: forall a. FromRational a => PowerSeries a
asinhS = PowerSeries a -> PowerSeries a
forall a. Integrable a => a -> a
integral (PowerSeries a -> PowerSeries a) -> PowerSeries a -> PowerSeries a
forall a b. (a -> b) -> a -> b
$ a -> PowerSeries a
forall a. FromRational a => a -> PowerSeries a
powerOnePlus (-a
0.5) PowerSeries a -> Int -> PowerSeries a
forall a. AdditiveMonoid a => PowerSeries a -> Int -> PowerSeries a
.^ Int
2
atanhS :: (FromRational a) => PowerSeries a
atanhS :: forall a. FromRational a => PowerSeries a
atanhS = PowerSeries a -> PowerSeries a
forall a. Integrable a => a -> a
integral ([a] -> PowerSeries a
forall a. AdditiveMonoid a => [a] -> PowerSeries a
fromCoefficients ([a] -> [a]
forall a. HasCallStack => [a] -> [a]
cycle [a
forall a. Semiring a => a
one, a
forall a. AdditiveMonoid a => a
zero]))
euler :: (Ring a) => PowerSeries a
euler :: forall a. Ring a => PowerSeries a
euler =
[(a, Int)] -> PowerSeries a
forall a. AdditiveMonoid a => [(a, Int)] -> PowerSeries a
expand [(Int -> a
forall a. Ring a => Int -> a
sign Int
k, Int
kInt -> Int -> Int
forall a. Semiring a => a -> a -> a
*(Int
3Int -> Int -> Int
forall a. Semiring a => a -> a -> a
*Int
kInt -> Int -> Int
forall a. AdditiveMonoid a => a -> a -> a
+Int
1) Int -> Int -> Int
forall a. Euclidean a => a -> a -> a
`div` Int
2) | Int
k <- [Int
0..]] PowerSeries a -> PowerSeries a -> PowerSeries a
forall a. AdditiveMonoid a => a -> a -> a
+
[(a, Int)] -> PowerSeries a
forall a. AdditiveMonoid a => [(a, Int)] -> PowerSeries a
expand [(Int -> a
forall a. Ring a => Int -> a
sign Int
k, Int
kInt -> Int -> Int
forall a. Semiring a => a -> a -> a
*(Int
3Int -> Int -> Int
forall a. Semiring a => a -> a -> a
*Int
kInt -> Int -> Int
forall a. AbelianGroup a => a -> a -> a
-Int
1) Int -> Int -> Int
forall a. Euclidean a => a -> a -> a
`div` Int
2) | Int
k <- [Int
1..]]
expand :: (AdditiveMonoid a) => [(a, Int)] -> PowerSeries a
expand :: forall a. AdditiveMonoid a => [(a, Int)] -> PowerSeries a
expand = [a] -> PowerSeries a
forall a. AdditiveMonoid a => [a] -> PowerSeries a
fromCoefficients ([a] -> PowerSeries a)
-> ([(a, Int)] -> [a]) -> [(a, Int)] -> PowerSeries a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [(a, Int)] -> [a]
forall {a}. AdditiveMonoid a => Int -> [(a, Int)] -> [a]
aux Int
0
where
aux :: Int -> [(a, Int)] -> [a]
aux Int
_ [] = []
aux Int
n ((a
a, Int
i):[(a, Int)]
ais) = Int -> a -> [a]
forall a. Int -> a -> [a]
replicate (Int
iInt -> Int -> Int
forall a. AbelianGroup a => a -> a -> a
-Int
n) a
forall a. AdditiveMonoid a => a
zero [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++ a
a a -> [a] -> [a]
forall a. a -> [a] -> [a]
: Int -> [(a, Int)] -> [a]
aux (Int
iInt -> Int -> Int
forall a. AdditiveMonoid a => a -> a -> a
+Int
1) [(a, Int)]
ais
sign :: (Ring a) => Int -> a
sign :: forall a. Ring a => Int -> a
sign Int
k
| Int -> Bool
forall a. ToInteger a => a -> Bool
odd Int
k = -a
1
| Bool
otherwise = a
1
approximations :: (Semiring a) => PowerSeries a -> a -> [a]
approximations :: forall a. Semiring a => PowerSeries a -> a -> [a]
approximations = (a -> a -> a) -> PowerSeries a -> a -> [a]
forall a b c.
(AdditiveMonoid a, Semiring b, AdditiveMonoid c) =>
(a -> b -> c) -> PowerSeries a -> b -> [c]
approximationsWith a -> a -> a
forall a. Semiring a => a -> a -> a
(*)
approximationsWith :: (AdditiveMonoid a, Semiring b, AdditiveMonoid c) =>
(a -> b -> c) -> PowerSeries a -> b -> [c]
approximationsWith :: forall a b c.
(AdditiveMonoid a, Semiring b, AdditiveMonoid c) =>
(a -> b -> c) -> PowerSeries a -> b -> [c]
approximationsWith a -> b -> c
f PowerSeries a
as b
x =
(c -> c -> c) -> c -> [c] -> [c]
forall b a. (b -> a -> b) -> b -> [a] -> [b]
scanl c -> c -> c
forall a. AdditiveMonoid a => a -> a -> a
(+) c
forall a. AdditiveMonoid a => a
zero ((a -> b -> c) -> [a] -> [b] -> [c]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith a -> b -> c
f (PowerSeries a -> [a]
forall a. AdditiveMonoid a => PowerSeries a -> [a]
coefficients PowerSeries a
as) ((b -> b) -> b -> [b]
forall a. (a -> a) -> a -> [a]
iterate (b -> b -> b
forall a. Semiring a => a -> a -> a
*b
x) b
forall a. Semiring a => a
one))
padeApproximants :: (Eq a, Field a) =>
Int -> PowerSeries a -> [RationalFunction a]
padeApproximants :: forall a.
(Eq a, Field a) =>
Int -> PowerSeries a -> [RationalFunction a]
padeApproximants Int
k PowerSeries a
f = [Polynomial a
pPolynomial a -> Polynomial a -> RationalFunction a
forall a.
(Eq a, StandardAssociate a, Euclidean a) =>
a -> a -> Ratio a
%Polynomial a
q | (Polynomial a
_, Polynomial a
p, Polynomial a
_, Polynomial a
q) <- Polynomial a
-> Polynomial a
-> [(Polynomial a, Polynomial a, Polynomial a, Polynomial a)]
forall a.
(Eq a, AbelianGroup a, StandardAssociate a, Euclidean a) =>
a -> a -> [(a, a, a, a)]
extendedEuclid Polynomial a
xk1 Polynomial a
truncation]
where
truncation :: Polynomial a
truncation = PowerSeries a -> PowerSeries a -> Polynomial a
forall a.
(Eq a, AdditiveMonoid a) =>
PowerSeries a -> PowerSeries a -> Polynomial a
modulus PowerSeries a
f (Polynomial a -> PowerSeries a
forall a. AdditiveMonoid a => Polynomial a -> PowerSeries a
fromPolynomial Polynomial a
xk1)
xk1 :: Polynomial a
xk1 = Polynomial a
forall a. Semiring a => Polynomial a
Poly.identityPolynomial a -> Int -> Polynomial a
forall a b. (Semiring a, ToInteger b) => a -> b -> a
^(Int
kInt -> Int -> Int
forall a. AdditiveMonoid a => a -> a -> a
+Int
1)
order :: (Eq a, AdditiveMonoid a) => PowerSeries a -> Int
order :: forall a. (Eq a, AdditiveMonoid a) => PowerSeries a -> Int
order PowerSeries a
f = PowerSeries a -> PowerSeries a -> Int
forall a.
(Eq a, AdditiveMonoid a) =>
PowerSeries a -> PowerSeries a -> Int
countSame PowerSeries a
f PowerSeries a
forall a. AdditiveMonoid a => a
zero
distance :: (Eq a, AdditiveMonoid a) =>
PowerSeries a -> PowerSeries a -> Rational
distance :: forall a.
(Eq a, AdditiveMonoid a) =>
PowerSeries a -> PowerSeries a -> Rational
distance PowerSeries a
f PowerSeries a
g = Rational
2Rational -> Int -> Rational
forall a b.
(DivisionSemiring a, AbelianGroup b, ToInteger b) =>
a -> b -> a
^^(Int -> Int
forall a. AbelianGroup a => a -> a
negate (PowerSeries a -> PowerSeries a -> Int
forall a.
(Eq a, AdditiveMonoid a) =>
PowerSeries a -> PowerSeries a -> Int
countSame PowerSeries a
f PowerSeries a
g))
countSame :: (Eq a, AdditiveMonoid a) => PowerSeries a -> PowerSeries a -> Int
countSame :: forall a.
(Eq a, AdditiveMonoid a) =>
PowerSeries a -> PowerSeries a -> Int
countSame PowerSeries a
f PowerSeries a
g
| PowerSeries a -> a
forall a. AdditiveMonoid a => PowerSeries a -> a
atZero PowerSeries a
f a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== PowerSeries a -> a
forall a. AdditiveMonoid a => PowerSeries a -> a
atZero PowerSeries a
g = PowerSeries a -> PowerSeries a -> Int
forall a.
(Eq a, AdditiveMonoid a) =>
PowerSeries a -> PowerSeries a -> Int
countSame (PowerSeries a -> PowerSeries a
forall a. PowerSeries a -> PowerSeries a
divX PowerSeries a
f) (PowerSeries a -> PowerSeries a
forall a. PowerSeries a -> PowerSeries a
divX PowerSeries a
g) Int -> Int -> Int
forall a. AdditiveMonoid a => a -> a -> a
+ Int
1
| Bool
otherwise = Int
0
from :: (Semiring a) => a -> [a]
from :: forall a. Semiring a => a -> [a]
from = (a -> a) -> a -> [a]
forall a. (a -> a) -> a -> [a]
iterate (a -> a -> a
forall a. AdditiveMonoid a => a -> a -> a
+a
forall a. Semiring a => a
one)
identity :: (Semiring a) => PowerSeries a
identity :: forall a. Semiring a => PowerSeries a
identity = PowerSeries a -> PowerSeries a
forall a. AdditiveMonoid a => PowerSeries a -> PowerSeries a
mulX PowerSeries a
forall a. Semiring a => a
one
compose :: (Eq a, Semiring a) =>
PowerSeries a -> PowerSeries a -> PowerSeries a
compose :: forall a.
(Eq a, Semiring a) =>
PowerSeries a -> PowerSeries a -> PowerSeries a
compose PowerSeries a
f PowerSeries a
g
| PowerSeries a -> a
forall a. AdditiveMonoid a => PowerSeries a -> a
atZero PowerSeries a
g a -> a -> Bool
forall a. Eq a => a -> a -> Bool
/= a
forall a. AdditiveMonoid a => a
zero =
[Char] -> PowerSeries a
forall a. HasCallStack => [Char] -> a
error [Char]
"compose: second series has non-zero constant term"
| Bool
otherwise = PowerSeries a -> PowerSeries a -> PowerSeries a
forall a.
Semiring a =>
PowerSeries a -> PowerSeries a -> PowerSeries a
composeMulX PowerSeries a
f (PowerSeries a -> PowerSeries a
forall a. PowerSeries a -> PowerSeries a
divX PowerSeries a
g)
composeMulX :: (Semiring a) =>
PowerSeries a -> PowerSeries a -> PowerSeries a
composeMulX :: forall a.
Semiring a =>
PowerSeries a -> PowerSeries a -> PowerSeries a
composeMulX PowerSeries a
f PowerSeries a
g = a -> PowerSeries a -> PowerSeries a
forall a. a -> PowerSeries a -> PowerSeries a
plusMulX (PowerSeries a -> a
forall a. AdditiveMonoid a => PowerSeries a -> a
atZero PowerSeries a
f) (PowerSeries a
g PowerSeries a -> PowerSeries a -> PowerSeries a
forall a. Semiring a => a -> a -> a
* PowerSeries a -> PowerSeries a -> PowerSeries a
forall a.
Semiring a =>
PowerSeries a -> PowerSeries a -> PowerSeries a
composeMulX (PowerSeries a -> PowerSeries a
forall a. PowerSeries a -> PowerSeries a
divX PowerSeries a
f) PowerSeries a
g)
inverse :: (Eq a, Field a) => PowerSeries a -> PowerSeries a
inverse :: forall a. (Eq a, Field a) => PowerSeries a -> PowerSeries a
inverse PowerSeries a
f
| PowerSeries a -> a
forall a. AdditiveMonoid a => PowerSeries a -> a
atZero PowerSeries a
f a -> a -> Bool
forall a. Eq a => a -> a -> Bool
/= a
0 = [Char] -> PowerSeries a
forall a. HasCallStack => [Char] -> a
error [Char]
"inverse: zero constant term"
| PowerSeries a -> a
forall a. AdditiveMonoid a => PowerSeries a -> a
atZero (PowerSeries a -> PowerSeries a
forall a. PowerSeries a -> PowerSeries a
divX PowerSeries a
f) a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
0 = [Char] -> PowerSeries a
forall a. HasCallStack => [Char] -> a
error [Char]
"inverse: non-zero linear term"
| Bool
otherwise = PowerSeries a -> PowerSeries a
forall a. Field a => PowerSeries a -> PowerSeries a
unsafeInverse PowerSeries a
f
unsafeInverse :: (Field a) => PowerSeries a -> PowerSeries a
unsafeInverse :: forall a. Field a => PowerSeries a -> PowerSeries a
unsafeInverse PowerSeries a
f = PowerSeries a -> PowerSeries a
forall a. AdditiveMonoid a => PowerSeries a -> PowerSeries a
mulX PowerSeries a
r
where
r :: PowerSeries a
r = PowerSeries a
1 PowerSeries a -> PowerSeries a -> PowerSeries a
forall a.
Field a =>
PowerSeries a -> PowerSeries a -> PowerSeries a
`exactDiv` PowerSeries a -> PowerSeries a -> PowerSeries a
forall a.
Semiring a =>
PowerSeries a -> PowerSeries a -> PowerSeries a
composeMulX (PowerSeries a -> PowerSeries a
forall a. PowerSeries a -> PowerSeries a
divX PowerSeries a
f) PowerSeries a
r
inverseSimple :: (Eq a, Ring a) => PowerSeries a -> PowerSeries a
inverseSimple :: forall a. (Eq a, Ring a) => PowerSeries a -> PowerSeries a
inverseSimple PowerSeries a
p = PowerSeries a -> PowerSeries a
forall a. AdditiveMonoid a => PowerSeries a -> PowerSeries a
mulX PowerSeries a
r
where
r :: PowerSeries a
r = PowerSeries a -> PowerSeries a
forall a. Ring a => PowerSeries a -> PowerSeries a
recipSimple (PowerSeries a -> PowerSeries a -> PowerSeries a
forall a.
Semiring a =>
PowerSeries a -> PowerSeries a -> PowerSeries a
composeMulX (PowerSeries a -> PowerSeries a
forall a. PowerSeries a -> PowerSeries a
divX PowerSeries a
p) PowerSeries a
r)
(.*) :: (Semiring a) => PowerSeries a -> a -> PowerSeries a
PS [a]
as .* :: forall a. Semiring a => PowerSeries a -> a -> PowerSeries a
.* a
a = [a] -> PowerSeries a
forall a. [a] -> PowerSeries a
PS ((a -> a -> a) -> [a] -> [a] -> [a]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith a -> a -> a
forall a. Semiring a => a -> a -> a
(*) [a]
as ((a -> a) -> a -> [a]
forall a. (a -> a) -> a -> [a]
iterate (a -> a -> a
forall a. Semiring a => a -> a -> a
*a
a) a
forall a. Semiring a => a
one))
(.^) :: (AdditiveMonoid a) => PowerSeries a -> Int -> PowerSeries a
PS [a]
as .^ :: forall a. AdditiveMonoid a => PowerSeries a -> Int -> PowerSeries a
.^ Int
k
| Int
k Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
0 = [Char] -> PowerSeries a
forall a. HasCallStack => [Char] -> a
error [Char]
"non-positive power"
| Int
k Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
1 = [a] -> PowerSeries a
forall a. [a] -> PowerSeries a
PS [a]
as
| Bool
otherwise = [a] -> PowerSeries a
forall a. [a] -> PowerSeries a
PS ([a] -> [[a]] -> [a]
forall a. [a] -> [[a]] -> [a]
intercalate (Int -> a -> [a]
forall a. Int -> a -> [a]
replicate (Int
kInt -> Int -> Int
forall a. AbelianGroup a => a -> a -> a
-Int
1) a
forall a. AdditiveMonoid a => a
zero) ((a -> [a]) -> [a] -> [[a]]
forall a b. (a -> b) -> [a] -> [b]
map a -> [a]
forall a. a -> [a]
forall (f :: * -> *) a. Applicative f => a -> f a
pure [a]
as))
recipSimple :: (Ring a) => PowerSeries a -> PowerSeries a
recipSimple :: forall a. Ring a => PowerSeries a -> PowerSeries a
recipSimple PowerSeries a
p = PowerSeries a -> PowerSeries a
forall a. Semiring a => PowerSeries a -> PowerSeries a
recipOneMinusOf (PowerSeries a -> PowerSeries a
forall a. AbelianGroup a => a -> a
negate (PowerSeries a -> PowerSeries a
forall a. PowerSeries a -> PowerSeries a
divX PowerSeries a
p))
recipOneMinusOf :: (Semiring a) => PowerSeries a -> PowerSeries a
recipOneMinusOf :: forall a. Semiring a => PowerSeries a -> PowerSeries a
recipOneMinusOf PowerSeries a
p = PowerSeries a
q
where
q :: PowerSeries a
q = a -> PowerSeries a -> PowerSeries a
forall a. a -> PowerSeries a -> PowerSeries a
plusMulX a
forall a. Semiring a => a
one (PowerSeries a
pPowerSeries a -> PowerSeries a -> PowerSeries a
forall a. Semiring a => a -> a -> a
*PowerSeries a
q)
divSimple :: (Eq a, Ring a) => PowerSeries a -> PowerSeries a -> PowerSeries a
divSimple :: forall a.
(Eq a, Ring a) =>
PowerSeries a -> PowerSeries a -> PowerSeries a
divSimple PowerSeries a
p PowerSeries a
q = PowerSeries a -> PowerSeries a -> PowerSeries a
forall a.
Semiring a =>
PowerSeries a -> PowerSeries a -> PowerSeries a
divOneMinus PowerSeries a
p (PowerSeries a -> PowerSeries a
forall a. AbelianGroup a => a -> a
negate (PowerSeries a -> PowerSeries a
forall a. PowerSeries a -> PowerSeries a
divX PowerSeries a
q))
divOneMinus :: (Semiring a) => PowerSeries a -> PowerSeries a -> PowerSeries a
divOneMinus :: forall a.
Semiring a =>
PowerSeries a -> PowerSeries a -> PowerSeries a
divOneMinus PowerSeries a
as PowerSeries a
bs = PowerSeries a
q
where
q :: PowerSeries a
q = PowerSeries a
as PowerSeries a -> PowerSeries a -> PowerSeries a
forall a. AdditiveMonoid a => a -> a -> a
+ PowerSeries a -> PowerSeries a
forall a. AdditiveMonoid a => PowerSeries a -> PowerSeries a
mulX (PowerSeries a
bsPowerSeries a -> PowerSeries a -> PowerSeries a
forall a. Semiring a => a -> a -> a
*PowerSeries a
q)
stieltjes :: (Semiring a) => [a] -> PowerSeries a
stieltjes :: forall a. Semiring a => [a] -> PowerSeries a
stieltjes [a]
as = PowerSeries a -> PowerSeries a
forall a. Semiring a => PowerSeries a -> PowerSeries a
recipOneMinusOf ((PowerSeries a -> PowerSeries a -> PowerSeries a)
-> PowerSeries a -> [PowerSeries a] -> PowerSeries a
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr PowerSeries a -> PowerSeries a -> PowerSeries a
forall a.
Semiring a =>
PowerSeries a -> PowerSeries a -> PowerSeries a
divOneMinus PowerSeries a
forall a. AdditiveMonoid a => a
zero ((a -> PowerSeries a) -> [a] -> [PowerSeries a]
forall a b. (a -> b) -> [a] -> [b]
map a -> PowerSeries a
forall a. AdditiveMonoid a => a -> PowerSeries a
constant [a]
as))
delta :: (Semiring a) => [a] -> [a] -> PowerSeries (Polynomial a)
delta :: forall a. Semiring a => [a] -> [a] -> PowerSeries (Polynomial a)
delta [a]
r [a]
s =
[Polynomial a] -> PowerSeries (Polynomial a)
forall a. Semiring a => [a] -> PowerSeries a
stieltjes ((Polynomial a -> Polynomial a -> Polynomial a)
-> [Polynomial a] -> [Polynomial a] -> [Polynomial a]
forall a. (a -> a -> a) -> [a] -> [a] -> [a]
longZipWith Polynomial a -> Polynomial a -> Polynomial a
forall a. AdditiveMonoid a => a -> a -> a
(+) ((a -> Polynomial a) -> [a] -> [Polynomial a]
forall a b. (a -> b) -> [a] -> [b]
map a -> Polynomial a
forall a. a -> Polynomial a
Poly.constant [a]
r) ((a -> Polynomial a) -> [a] -> [Polynomial a]
forall a b. (a -> b) -> [a] -> [b]
map a -> Polynomial a
forall a. AdditiveMonoid a => a -> Polynomial a
Poly.linear [a]
s))
jacobi :: (Semiring a) => [a] -> [a] -> PowerSeries a
jacobi :: forall a. Semiring a => [a] -> [a] -> PowerSeries a
jacobi [a]
as [a]
bs = ((a, a) -> PowerSeries a -> PowerSeries a)
-> PowerSeries a -> [(a, a)] -> PowerSeries a
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (a, a) -> PowerSeries a -> PowerSeries a
forall {a}. Semiring a => (a, a) -> PowerSeries a -> PowerSeries a
fraction PowerSeries a
forall a. AdditiveMonoid a => a
zero ([a] -> [a] -> [(a, a)]
forall a b. [a] -> [b] -> [(a, b)]
zip ([a]
as [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++ a -> [a]
forall a. a -> [a]
repeat a
forall a. AdditiveMonoid a => a
zero) (a
forall a. Semiring a => a
onea -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
bs))
where
fraction :: (a, a) -> PowerSeries a -> PowerSeries a
fraction (a
a, a
b) PowerSeries a
p = PowerSeries a -> PowerSeries a -> PowerSeries a
forall a.
Semiring a =>
PowerSeries a -> PowerSeries a -> PowerSeries a
divOneMinus (a -> PowerSeries a
forall a. AdditiveMonoid a => a -> PowerSeries a
constant a
b) (a -> PowerSeries a
forall a. AdditiveMonoid a => a -> PowerSeries a
constant a
a PowerSeries a -> PowerSeries a -> PowerSeries a
forall a. AdditiveMonoid a => a -> a -> a
+ PowerSeries a -> PowerSeries a
forall a. AdditiveMonoid a => PowerSeries a -> PowerSeries a
mulX PowerSeries a
p)
binomialTransform :: (Semiring a) => PowerSeries a -> PowerSeries a
binomialTransform :: forall a. Semiring a => PowerSeries a -> PowerSeries a
binomialTransform PowerSeries a
a = PowerSeries a
forall a. Semiring a => PowerSeries a
recipOneMinus PowerSeries a -> PowerSeries a -> PowerSeries a
forall a. Semiring a => a -> a -> a
* PowerSeries a -> PowerSeries a -> PowerSeries a
forall a.
Semiring a =>
PowerSeries a -> PowerSeries a -> PowerSeries a
composeMulX PowerSeries a
a PowerSeries a
forall a. Semiring a => PowerSeries a
recipOneMinus
inverseBinomialTransform :: (Ring a) => PowerSeries a -> PowerSeries a
inverseBinomialTransform :: forall a. Ring a => PowerSeries a -> PowerSeries a
inverseBinomialTransform PowerSeries a
a = PowerSeries a
recipOnePlus PowerSeries a -> PowerSeries a -> PowerSeries a
forall a. Semiring a => a -> a -> a
* PowerSeries a -> PowerSeries a -> PowerSeries a
forall a.
Semiring a =>
PowerSeries a -> PowerSeries a -> PowerSeries a
composeMulX PowerSeries a
a PowerSeries a
recipOnePlus
where
recipOnePlus :: PowerSeries a
recipOnePlus = PowerSeries a
forall a. Semiring a => PowerSeries a
recipOneMinus PowerSeries a -> a -> PowerSeries a
forall a. Semiring a => PowerSeries a -> a -> PowerSeries a
.* (-a
1)
lambertTransform :: (AdditiveMonoid a) => PowerSeries a -> PowerSeries a
lambertTransform :: forall a. AdditiveMonoid a => PowerSeries a -> PowerSeries a
lambertTransform PowerSeries a
p = PowerSeries (PowerSeries a) -> PowerSeries a
forall a.
AdditiveMonoid a =>
PowerSeries (PowerSeries a) -> PowerSeries a
flatten (PowerSeries (PowerSeries a) -> PowerSeries a)
-> PowerSeries (PowerSeries a) -> PowerSeries a
forall a b. (a -> b) -> a -> b
$ PowerSeries (PowerSeries a) -> PowerSeries (PowerSeries a)
forall a. AdditiveMonoid a => PowerSeries a -> PowerSeries a
mulX (PowerSeries (PowerSeries a) -> PowerSeries (PowerSeries a))
-> PowerSeries (PowerSeries a) -> PowerSeries (PowerSeries a)
forall a b. (a -> b) -> a -> b
$ [PowerSeries a] -> PowerSeries (PowerSeries a)
forall a. AdditiveMonoid a => [a] -> PowerSeries a
fromCoefficients [PowerSeries a
p' PowerSeries a -> Int -> PowerSeries a
forall a. AdditiveMonoid a => PowerSeries a -> Int -> PowerSeries a
.^ Int
k | Int
k <- [Int
1..]]
where
p' :: PowerSeries a
p' = PowerSeries a -> PowerSeries a
forall a. PowerSeries a -> PowerSeries a
divX PowerSeries a
p
inverseLambertTransform :: (Ring a) => PowerSeries a -> PowerSeries a
inverseLambertTransform :: forall a. Ring a => PowerSeries a -> PowerSeries a
inverseLambertTransform PowerSeries a
q = PowerSeries a -> PowerSeries a
forall a. AdditiveMonoid a => PowerSeries a -> PowerSeries a
mulX PowerSeries a
p'
where
p' :: PowerSeries a
p' = PowerSeries a -> PowerSeries a
forall a. PowerSeries a -> PowerSeries a
divX PowerSeries a
q PowerSeries a -> PowerSeries a -> PowerSeries a
forall a. AbelianGroup a => a -> a -> a
- PowerSeries (PowerSeries a) -> PowerSeries a
forall a.
AdditiveMonoid a =>
PowerSeries (PowerSeries a) -> PowerSeries a
flatten ([PowerSeries a] -> PowerSeries (PowerSeries a)
forall a. AdditiveMonoid a => [a] -> PowerSeries a
fromCoefficients (PowerSeries a
0 PowerSeries a -> [PowerSeries a] -> [PowerSeries a]
forall a. a -> [a] -> [a]
: [PowerSeries a
p' PowerSeries a -> Int -> PowerSeries a
forall a. AdditiveMonoid a => PowerSeries a -> Int -> PowerSeries a
.^ Int
k | Int
k <- [Int
2..]]))
eulerTransform :: (Eq a, FromRational a) => PowerSeries a -> PowerSeries a
eulerTransform :: forall a. (Eq a, FromRational a) => PowerSeries a -> PowerSeries a
eulerTransform PowerSeries a
a =
PowerSeries a
forall a. FromRational a => PowerSeries a
expS PowerSeries a -> PowerSeries a -> PowerSeries a
forall a.
(Eq a, Semiring a) =>
PowerSeries a -> PowerSeries a -> PowerSeries a
`compose` PowerSeries a -> PowerSeries a
forall a. FromRational a => PowerSeries a -> PowerSeries a
divN (PowerSeries a -> PowerSeries a
forall a. AdditiveMonoid a => PowerSeries a -> PowerSeries a
lambertTransform (PowerSeries a -> PowerSeries a
forall a. Semiring a => PowerSeries a -> PowerSeries a
mulN PowerSeries a
a))
inverseEulerTransform ::
(Eq a, FromRational a) => PowerSeries a -> PowerSeries a
inverseEulerTransform :: forall a. (Eq a, FromRational a) => PowerSeries a -> PowerSeries a
inverseEulerTransform PowerSeries a
b =
PowerSeries a -> PowerSeries a
forall a. FromRational a => PowerSeries a -> PowerSeries a
divN (PowerSeries a -> PowerSeries a
forall a. Ring a => PowerSeries a -> PowerSeries a
inverseLambertTransform (PowerSeries a -> PowerSeries a
forall a. Semiring a => PowerSeries a -> PowerSeries a
mulN (PowerSeries a
forall a. FromRational a => PowerSeries a
logOnePlus PowerSeries a -> PowerSeries a -> PowerSeries a
forall a.
(Eq a, Semiring a) =>
PowerSeries a -> PowerSeries a -> PowerSeries a
`compose` (PowerSeries a
bPowerSeries a -> PowerSeries a -> PowerSeries a
forall a. AbelianGroup a => a -> a -> a
-PowerSeries a
1))))
mulN :: (Semiring a) => PowerSeries a -> PowerSeries a
mulN :: forall a. Semiring a => PowerSeries a -> PowerSeries a
mulN PowerSeries a
p = PowerSeries a -> PowerSeries a
forall a. AdditiveMonoid a => PowerSeries a -> PowerSeries a
mulX (PowerSeries a -> PowerSeries a
forall a. Differentiable a => a -> a
derivative PowerSeries a
p)
divN :: (FromRational a) => PowerSeries a -> PowerSeries a
divN :: forall a. FromRational a => PowerSeries a -> PowerSeries a
divN PowerSeries a
p = PowerSeries a -> PowerSeries a
forall a. Integrable a => a -> a
integral (PowerSeries a -> PowerSeries a
forall a. PowerSeries a -> PowerSeries a
divX PowerSeries a
p)
linearRecurrence :: (Ring a) => [a] -> [a] -> PowerSeries a
linearRecurrence :: forall a. Ring a => [a] -> [a] -> PowerSeries a
linearRecurrence [a]
recurrence [a]
initial = PowerSeries a -> PowerSeries a -> PowerSeries a
forall a.
Semiring a =>
PowerSeries a -> PowerSeries a -> PowerSeries a
divOneMinus PowerSeries a
r PowerSeries a
q
where
k :: Int
k = Int -> Int -> Int
forall a. Ord a => a -> a -> a
max ([a] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
recurrence) ([a] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
initial)
p :: PowerSeries a
p = [a] -> PowerSeries a
forall a. AdditiveMonoid a => [a] -> PowerSeries a
fromCoefficients [a]
initial
q :: PowerSeries a
q = [a] -> PowerSeries a
forall a. AdditiveMonoid a => [a] -> PowerSeries a
fromCoefficients [a]
recurrence
r :: PowerSeries a
r = [a] -> PowerSeries a
forall a. AdditiveMonoid a => [a] -> PowerSeries a
fromCoefficients (Int -> [a] -> [a]
forall a. Int -> [a] -> [a]
take Int
k (PowerSeries a -> [a]
forall a. AdditiveMonoid a => PowerSeries a -> [a]
coefficients (PowerSeries a
pPowerSeries a -> PowerSeries a -> PowerSeries a
forall a. Semiring a => a -> a -> a
*(PowerSeries a
1 PowerSeries a -> PowerSeries a -> PowerSeries a
forall a. AbelianGroup a => a -> a -> a
- PowerSeries a
forall a. Semiring a => PowerSeries a
identityPowerSeries a -> PowerSeries a -> PowerSeries a
forall a. Semiring a => a -> a -> a
*PowerSeries a
q))))
type GradedLanguage a = PowerSeries (FiniteLanguage a)
string :: (Ord a) => [a] -> GradedLanguage a
string :: forall a. Ord a => [a] -> GradedLanguage a
string [a]
s = [FiniteLanguage a] -> PowerSeries (FiniteLanguage a)
forall a. AdditiveMonoid a => [a] -> PowerSeries a
fromCoefficients (Int -> FiniteLanguage a -> [FiniteLanguage a]
forall a. Int -> a -> [a]
replicate ([a] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
s) FiniteLanguage a
forall a. AdditiveMonoid a => a
zero [FiniteLanguage a] -> [FiniteLanguage a] -> [FiniteLanguage a]
forall a. [a] -> [a] -> [a]
++ [[a] -> FiniteLanguage a
forall a. a -> FiniteSet a
singleton [a]
s])
constants :: (AdditiveMonoid a) => PowerSeries a -> PowerSeries (Polynomial a)
constants :: forall a.
AdditiveMonoid a =>
PowerSeries a -> PowerSeries (Polynomial a)
constants PowerSeries a
f = (a -> Polynomial a) -> PowerSeries a -> PowerSeries (Polynomial a)
forall a b.
(AdditiveMonoid a, AdditiveMonoid b) =>
(a -> b) -> PowerSeries a -> PowerSeries b
forall (f :: * -> *) a b.
(AdditiveFunctor f, AdditiveMonoid a, AdditiveMonoid b) =>
(a -> b) -> f a -> f b
mapAdditive a -> Polynomial a
forall a. a -> Polynomial a
Poly.constant PowerSeries a
f
monomials :: (Eq a, Semiring a) => PowerSeries (Polynomial a)
monomials :: forall a. (Eq a, Semiring a) => PowerSeries (Polynomial a)
monomials = PowerSeries (Polynomial a) -> PowerSeries (Polynomial a)
forall a. Semiring a => PowerSeries a -> PowerSeries a
recipOneMinusOf (Polynomial a -> PowerSeries (Polynomial a)
forall a. AdditiveMonoid a => a -> PowerSeries a
constant Polynomial a
forall a. Semiring a => Polynomial a
Poly.identity)
riordan :: (Semiring a) =>
PowerSeries a -> PowerSeries a -> PowerSeries (Polynomial a)
riordan :: forall a.
Semiring a =>
PowerSeries a -> PowerSeries a -> PowerSeries (Polynomial a)
riordan PowerSeries a
f PowerSeries a
g =
(a -> Polynomial a) -> PowerSeries a -> PowerSeries (Polynomial a)
forall a b.
(AdditiveMonoid a, AdditiveMonoid b) =>
(a -> b) -> PowerSeries a -> PowerSeries b
forall (f :: * -> *) a b.
(AdditiveFunctor f, AdditiveMonoid a, AdditiveMonoid b) =>
(a -> b) -> f a -> f b
mapAdditive a -> Polynomial a
forall a. a -> Polynomial a
Poly.constant PowerSeries a
f PowerSeries (Polynomial a)
-> PowerSeries (Polynomial a) -> PowerSeries (Polynomial a)
forall a.
Semiring a =>
PowerSeries a -> PowerSeries a -> PowerSeries a
`divOneMinus` (a -> Polynomial a) -> PowerSeries a -> PowerSeries (Polynomial a)
forall a b.
(AdditiveMonoid a, AdditiveMonoid b) =>
(a -> b) -> PowerSeries a -> PowerSeries b
forall (f :: * -> *) a b.
(AdditiveFunctor f, AdditiveMonoid a, AdditiveMonoid b) =>
(a -> b) -> f a -> f b
mapAdditive a -> Polynomial a
forall a. AdditiveMonoid a => a -> Polynomial a
Poly.linear (PowerSeries a -> PowerSeries a
forall a. PowerSeries a -> PowerSeries a
divX PowerSeries a
g)
bernoulliPGF :: (Ring a) => a -> PowerSeries a
bernoulliPGF :: forall a. Ring a => a -> PowerSeries a
bernoulliPGF a
p = [a] -> PowerSeries a
forall a. AdditiveMonoid a => [a] -> PowerSeries a
fromCoefficients [a
1a -> a -> a
forall a. AbelianGroup a => a -> a -> a
-a
p, a
p]
geometricPGF :: (Ring a) => a -> PowerSeries a
geometricPGF :: forall a. Ring a => a -> PowerSeries a
geometricPGF a
p = a -> PowerSeries a
forall a. AdditiveMonoid a => a -> PowerSeries a
constant a
p PowerSeries a -> PowerSeries a -> PowerSeries a
forall a. Semiring a => a -> a -> a
* (PowerSeries a
forall a. Semiring a => PowerSeries a
recipOneMinus PowerSeries a -> a -> PowerSeries a
forall a. Semiring a => PowerSeries a -> a -> PowerSeries a
.* (a
1a -> a -> a
forall a. AbelianGroup a => a -> a -> a
-a
p))
poissonPGF :: (Floating a) => a -> PowerSeries a
poissonPGF :: forall a. Floating a => a -> PowerSeries a
poissonPGF a
l = a -> PowerSeries a
forall a. AdditiveMonoid a => a -> PowerSeries a
constant (a -> a
forall a. Floating a => a -> a
exp a
l) PowerSeries a -> PowerSeries a -> PowerSeries a
forall a. Semiring a => a -> a -> a
* PowerSeries a
forall a. FromRational a => PowerSeries a
expS PowerSeries a -> a -> PowerSeries a
forall a. Semiring a => PowerSeries a -> a -> PowerSeries a
.* a
l