Ritt-Wu-0.1.0.0: src/Polynomial/Terms.hs
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module Polynomial.Terms
-- Types
( Term(..)
) where
import Prelude as P
import Polynomial.Monomial
import Numeric.Algebra as N
import Data.Foldable
import Data.Function
import Control.DeepSeq
import Data.Massiv.Array as A
import Data.Char.SScript
import GHC.Generics (Generic)
-- | Constraint synonym for rings that can be used as polynomial coefficient.
-- data Term k ord =
-- Term
-- { getT :: (k , Mon ord)
-- } deriving (Eq)
data Term k ord = Term !k !(Mon ord) deriving (Eq, Generic) -- Term 4 $ m[1,2,3,4] :: Term Rational Revlex
instance (NFData k) => NFData (Term k ord) where
rnf (Term k mon) = rnf k `deepseq` rnf mon `deepseq` ()
-- ----------------------<< FUNCTIONS >>--------------------
-- ----------------------<< INSTANCES >>--------------------
instance (Num k, Show k, Eq k) => Show (Term k ord) where
show xs = showMon xs
showMon :: (Num k, Show k, Eq k) => Term k ord -> String
showMon (Term k mon)
| mon == zero = show k
| otherwise = (formatSS . show) k ++ show mon
-----------------------------------------------------------------------------------------
instance (Num k) => Additive (Term k ord) where
(+) xs xp = addPol' xs xp
addPol' :: (Num k) => Term k mon -> Term k mon -> Term k mon
addPol' (Term k mon) (Term k' mon') = Term (k P.+ k')( mon N.+ mon')
-----------------------------------------------------------------------------------------
instance (Num k) => Multiplicative (Term k ord) where
(*) xs xz = multPol' xs xz
multPol' :: (Num k) => Term k mon -> Term k mon -> Term k mon
multPol' (Term k mon) (Term k' mon') = Term (k P.* k')( mon N.* mon')
-----------------------------------------------------------------------------------------
instance (Fractional k, Num k) => Division (Term k ord) where
(/) xs xp = divPol' xs xp
divPol' :: (Fractional k, Num k) => Term k mon -> Term k mon -> Term k mon
divPol' (Term k mon) (Term k' mon') = Term (k P./ k')( mon N./ mon')
instance (Num k) => Unital (Term k ord) where
one = undefined -- Term (0, one)
instance (Num k) => Semiring (Term k ord)
instance (Num k) => Abelian (Term k ord)
instance (Num k) => Monoidal (Term k ord) where
zero = Term 0 zero -- Term (0, zero)
instance (Num k) => LeftModule Integer (Term k ord) where
(.*) = undefined
instance (Num k) => RightModule Integer (Term k ord) where
(*.) = undefined
instance (Num k) => LeftModule Natural (Term k ord) where
(.*) = undefined
instance (Num k) => RightModule Natural (Term k ord) where
(*.) = undefined
instance (Num k) => Group (Term k ord) where
(-) xs xz = subPol' xs xz
subPol' ::(Num k) => Term k mon -> Term k mon -> Term k mon
subPol' (Term k mon) (Term k' mon') = Term (k P.- k')( mon N.- mon')
-------------------------------------------------------------------------------
--instance Eq (Term k ord) where
-- (==) =
-- instance (Eq k)=> Ord (Term k Lex) where
-- compare = on compare (snd . getT)
-- (<) = on (P.<) (snd . getT)
-- (>) = on (P.>) (snd . getT)
-- λ> a = Term (2,m[5,2,3,2]) :: Term Int Lex
-- λ> b = Term (8,m[4,2,3,2]) :: Term Int Lex
-- λ> a P.> b
-- True
-- λ>
instance (Eq k)=> Ord (Term k Revlex) where
compare (Term k mon)(Term k' mon') = compare mon mon'
(<) (Term k mon)(Term k' mon') = (P.<) mon mon'
(>) (Term k mon)(Term k' mon') = (P.>) mon mon'