{-# LANGUAGE DataKinds, NoMonomorphismRestriction, OverloadedStrings #-} module Main where import Algebra.Ring.Ideal import Algebra.Ring.Polynomial import Algebra.Ring.Polynomial.Quotient import Data.Type.Natural import Test.Hspec import qualified Test.Hspec.QuickCheck as QC import Test.QuickCheck (Arbitrary (..)) import qualified Test.QuickCheck as QC import Utils main :: IO () main = hspec spec i1 :: Ideal (OrderedPolynomial (Fraction Integer) Lex Two) i1 = toIdeal [] spec :: Spec spec = do describe "Table multiplication" $ do it "coincides with ordinary multiplication" $ QC.property prop01 prop01 :: QC.Property prop01 = QC.forAll (QC.resize 4 arbitrary `QC.suchThat` isNonTrivial) $ \(ZeroDimIdeal ideal) -> QC.forAll (QC.resize 6 $ polyOfDim sThree) $ \f -> QC.forAll (QC.resize 6 $ polyOfDim sThree) $ \g -> withQuotient ideal (modIdeal f * modIdeal g) == withQuotient ideal (multWithTable (modIdeal f) (modIdeal g))