{-# LANGUAGE DataKinds #-} {-# OPTIONS_GHC -fno-warn-type-defaults #-} module Faugere5Spec where import Algebra.Algorithms.Faugere5 import Algebra.Algorithms.Groebner import Algebra.Prelude (KnownNat, SNat, SingI (..), (%)) import Algebra.Ring.Ideal import Algebra.Ring.Polynomial import Data.List (sort) import Numeric.Field.Fraction (Fraction) import Test.Hspec import Test.Hspec.QuickCheck import Test.QuickCheck import Utils spec :: Spec spec = do describe "f5Original" $ modifyMaxSize (const 10) $ modifyMaxSuccess (const 100) $ do it "computes Groebner basis for homogeneous ideals (regression)" $ do all (\i -> sort (calcGroebnerBasis i) == generators (f5Original i)) testCases it "computes Groebner basis for homogeneous ideals (random)" $ do checkForArity [2..3] prop_computesGroebner prop_computesGroebner :: KnownNat n => SNat n -> Property prop_computesGroebner sdim = forAll (sized $ \size -> vectorOf size (homogPolyOfDim sdim)) $ \ideal -> let answer = sort $ calcGroebnerBasis $ toIdeal ideal gs = generators $ f5Original $ toIdeal ideal in gs == answer testCases :: [Ideal (OrderedPolynomial (Fraction Integer) Grevlex 3)] testCases = map toIdeal [[-8%5 *x^2 + 2*x *y - 3%2 *y^2 ,-1%2 *x^2 + 7%3 *x *y ,2%7 *x^3 + 1%7 *x^2 *y + 7%6 *x *y^2 + 5*y^3 - 3%4 *y *z^2 ,5%8 *x^2 + 4%5 *y^2 ,-4%5 *x^2 - 3%7 *y *z ,-3%7 *x^2 + 8*x *y - 3%4 *y^2 + 8%7 *x *z - 8%11 *z^2 ,-4%5 *x^2 *z - 7%2 *x *z^2 ,-3%5 *x^2 - 8%5 *x *y + 8%5 *y^2 + 2*y *z - 5%6 *z^2] {- ,[-3%4 *x *y + 1%2 *x *z - 3%2 *z^2 ,3*x^3 - 2*x *y *z ,-1%4 *x^2 - 5*x *y + y^2 + 4%3 *x *z ,-4%5 *x^3 - 5%4 *x^2 *y + 4*y *z^2 ,-2%3 *x^2 - 4%3 *y *z] -} -- this should converge (according to singular implementation), -- but seems not with my implementation... ,[4%5 *x^2 *y *z - 5%3 *x^2 *z^2 ,5%2 *x^4 - 4%5 *x^3 *y ,3%5 *x^4 - 3%2 *x^2 *y^2 + 3%5 *x^2 *y *z + 3%5 *y *z^3 ,-5%4 *x^3 - 4%3 *y^3 + 3%7 *y *z^2] ,[-5*x^3 *y + 3%2 *x^2 *z^2 - 5%4 *y^2 *z^2 + 5%4 *z^4 ,4%5 *x^3 + 3*x *y^2 - 4*x^2 *z + 4%7 *y^2 *z ,-1%4 *x^4 - 4%3 *x^3 *y - x^2 *y *z ,-2%5 *x *y,-5%3 *x^3], [-2%5 *x^2 *z + 8%5 *x *z^2,-3*x^4 - y^4 + 7%4 *x *y^2 *z + 5%7 *x^2 *z^2 - 8*y^2 *z^2 - 3%5 *z^4,3%7 *x *y - 7%8 *x *z,-1%4 *x^2 + 6%7 *x *z + 2%9 *y *z + 2%7 *z^2,-1%6 *x^3 - 1%4 *x^2 *y - 8%3 *x *y *z + 8%5 *x *z^2,-6%5 *x *y^3 + 1%8 *x^3 *z + 1%7 *x^2 *y *z,7%4 *x^4 + 7%4 *x^2 *z^2,-1%6 *x^3 *y + 4%7 *x^2 *y *z] ,[x^2*z^2-5%6*y^2*z^2+5%6*z^4, x^3, x^2*z-1%7*y^2*z, x*y, y^3*z, y^2*z^2-35%29*z^4, y*z^4, x*z^4,z^6]] where [x,y,z] = vars