module MathObj.Gaussian.Variance where
import qualified MathObj.Polynomial as Poly
import qualified Algebra.Transcendental as Trans
import qualified Algebra.Algebraic as Algebraic
import qualified Algebra.Field as Field
import qualified Algebra.Real as Real
import qualified Algebra.Ring as Ring
import qualified Algebra.Additive as Additive
import Algebra.Transcendental (pi, )
import Algebra.Ring ((*), (^), )
import Algebra.Additive ((+))
import Test.QuickCheck (Arbitrary, arbitrary, coarbitrary, )
import NumericPrelude
import PreludeBase
data T a = Cons {c :: a}
deriving (Eq, Show)
instance (Real.C a, Arbitrary a) => Arbitrary (T a) where
arbitrary = fmap (Cons . (1+) . abs) arbitrary
coarbitrary = undefined
constant :: Additive.C a => T a
constant = Cons zero
evaluate :: (Trans.C a) =>
T a -> a -> a
evaluate f x =
exp $ (pi * c f * x^2)
exponentPolynomial :: (Additive.C a) =>
T a -> Poly.T a
exponentPolynomial f =
Poly.fromCoeffs [zero, zero, c f]
norm1 :: (Algebraic.C a) => T a -> a
norm1 f =
recip $ sqrt $ c f
norm2 :: (Algebraic.C a) => T a -> a
norm2 f =
recip $ sqrt $ sqrt $ 2 * c f
normP :: (Trans.C a) => a -> T a -> a
normP p f =
(p * c f) ^? ( recip (2*p))
variance :: (Trans.C a) =>
T a -> a
variance f =
recip $ c f * 2*pi
multiply :: (Additive.C a) =>
T a -> T a -> T a
multiply f g =
Cons $ c f + c g
convolve :: (Field.C a) =>
T a -> T a -> T a
convolve f g =
Cons $ recip $ recip (c f) + recip (c g)
fourier :: (Field.C a) =>
T a -> T a
fourier f =
Cons $ recip $ c f
dilate :: (Field.C a) => a -> T a -> T a
dilate k f =
Cons $ c f / k^2
shrink :: (Ring.C a) => a -> T a -> T a
shrink k f =
Cons $ c f * k^2