packages feed

computational-algebra-0.4.0.0: tests/division.hs

{-# LANGUAGE DataKinds #-}
{-# OPTIONS_GHC -fno-warn-unused-imports #-}
module Main where
import Algebra.Algorithms.Groebner
import Algebra.Ring.Ideal
import Algebra.Ring.Polynomial
import Data.Type.Monomorphic
import Data.Type.Natural           hiding (one, promote, zero)
import Test.Hspec
import Test.Hspec.QuickCheck
import Test.QuickCheck             hiding (promote)
import Utils

main :: IO ()
main = hspec $ do
  describe "divModPolynomial'" $ do
    prop "quotient cannot be diveided by any denoms (ternary)" $
      checkForArity [3] prop_indivisible
    prop "satisfies a_i f_i /= 0 ==> deg(f) >= deg (a_i f_i)" $
      checkForArity [3] prop_degdecay
    prop "divides correctly" $
      checkForArity [3] prop_divCorrect

prop_divCorrect :: SingI n => SNat n -> Property
prop_divCorrect sdim =
  forAll (polyOfDim sdim) $ \poly ->
  forAll (idealOfDim sdim) $ \ideal ->
  let dvs = take 5 $ generators ideal
      (qds, r) = poly `divModPolynomial'` dvs
  in poly == sum (map (uncurry (*)) qds) + r

prop_indivisible :: SingI n => SNat n -> Property
prop_indivisible sdim =
  forAll (polyOfDim sdim) $ \poly ->
  forAll (idealOfDim sdim) $ \ideal ->
  let dvs = take 5 $ generators ideal
      (_, r) = changeOrder Grevlex poly `divModPolynomial'` dvs
  in r /= 0 ==> all (\f -> all (\(_, m) -> not $ leadingMonomial f `divs` m) $ getTerms r)  dvs

prop_degdecay :: SingI n => SNat n -> Property
prop_degdecay sdim =
  forAll (polyOfDim sdim) $ \poly ->
  forAll (idealOfDim sdim) $ \ideal ->
  let dvs = take 5 $ generators ideal
      (qs, _) = poly `divModPolynomial'` dvs
  in all (\(a, f) -> (a * f == 0) || (leadingMonomial poly >= leadingMonomial (a * f))) qs