module Main where
import Algebra.Algorithms.ZeroDim
import Algebra.Ring.Polynomial.Quotient
import qualified Data.Matrix as M
import Data.Type.Monomorphic (liftPoly)
import Data.Type.Natural
import qualified Data.Vector as V
import Test.Hspec
import Test.Hspec.QuickCheck
import Test.QuickCheck
import Utils
main :: IO ()
main = hspec $ do
describe "matRepr'" $ do
prop "coincids with matrixRep" $ checkForArity [1..3] prop_matrixRep
return ()
prop_matrixRep :: SingI n => SNat n -> Property
prop_matrixRep sn =
forAll arbitrary $ \(ZeroDimIdeal ideal) ->
forAll (polyOfDim sn) $ \poly ->
reifyQuotient ideal $ \pxy ->
let f = modIdeal' pxy poly
in matrixRep f == matToLists (matRepr' f)
matToLists :: M.Matrix a -> [[a]]
matToLists mat = [ V.toList $ M.getRow i mat | i <- [1..M.nrows mat] ]