{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE PatternSynonyms #-}
module Data.Poly.Sparse
( Poly
, VPoly
, UPoly
, unPoly
, toPoly
, leading
, monomial
, scale
, pattern X
, eval
, subst
, deriv
, integral
, quotRemFractional
, denseToSparse
, sparseToDense
) where
import Control.Arrow
import qualified Data.Vector.Generic as G
import qualified Data.Vector.Unboxed.Sized as SU
import qualified Data.Vector.Sized as SV
import Data.Poly.Internal.Convert
import Data.Poly.Internal.Multi (Poly, VPoly, UPoly, unPoly, leading)
import qualified Data.Poly.Internal.Multi as Multi
import Data.Poly.Internal.Multi.Field (quotRemFractional)
import Data.Poly.Internal.Multi.GcdDomain ()
toPoly
:: (Eq a, Num a, G.Vector v (Word, a), G.Vector v (SU.Vector 1 Word, a))
=> v (Word, a)
-> Poly v a
toPoly = Multi.toMultiPoly . G.map (first SU.singleton)
monomial
:: (Eq a, Num a, G.Vector v (SU.Vector 1 Word, a))
=> Word
-> a
-> Poly v a
monomial = Multi.monomial . SU.singleton
scale
:: (Eq a, Num a, G.Vector v (SU.Vector 1 Word, a))
=> Word
-> a
-> Poly v a
-> Poly v a
scale = Multi.scale . SU.singleton
pattern X
:: (Eq a, Num a, G.Vector v (SU.Vector 1 Word, a))
=> Poly v a
pattern X = Multi.X
eval
:: (Num a, G.Vector v (SU.Vector 1 Word, a))
=> Poly v a
-> a
-> a
eval p = Multi.eval p . SV.singleton
subst
:: (Eq a, Num a, G.Vector v (SU.Vector 1 Word, a), G.Vector w (SU.Vector 1 Word, a))
=> Poly v a
-> Poly w a
-> Poly w a
subst p = Multi.subst p . SV.singleton
deriv
:: (Eq a, Num a, G.Vector v (SU.Vector 1 Word, a))
=> Poly v a
-> Poly v a
deriv = Multi.deriv 0
integral
:: (Fractional a, G.Vector v (SU.Vector 1 Word, a))
=> Poly v a
-> Poly v a
integral = Multi.integral 0