numeric-prelude-0.4.3.3: test/Test/MathObj/PartialFraction.hs
-- Do not edit! Automatically created with doctest-extract from src/MathObj/PartialFraction.hs
{-# LINE 45 "src/MathObj/PartialFraction.hs" #-}
module Test.MathObj.PartialFraction where
import qualified Test.DocTest.Driver as DocTest
{-# LINE 46 "src/MathObj/PartialFraction.hs" #-}
import qualified MathObj.PartialFraction as PartialFraction
import qualified MathObj.Polynomial.Core as PolyCore
import qualified MathObj.Polynomial as Poly
import qualified Algebra.PrincipalIdealDomain as PID
import qualified Algebra.Indexable as Indexable
import qualified Algebra.Laws as Laws
import qualified Number.Ratio as Ratio
import Test.NumericPrelude.Utility ((/\))
import qualified Test.QuickCheck as QC
import NumericPrelude.Numeric as NP
import NumericPrelude.Base as P
import Prelude ()
import Control.Applicative (liftA2)
{- |
Generator of irreducible elements for tests.
Choosing from a list of examples is a simple yet effective design.
If we would construct irreducible elements by a clever algorithm
we might obtain multiple primes only rarely.
-} --
genSmallPrime :: QC.Gen Integer
genSmallPrime =
let primes = [2,3,5,7,11,13]
in QC.elements (primes ++ map negate primes)
genPartialFractionInt :: QC.Gen (PartialFraction.T Integer)
genPartialFractionInt =
liftA2 PartialFraction.fromFactoredFraction
(QC.listOf genSmallPrime) QC.arbitrary
genIrreduciblePolynomial :: QC.Gen (Poly.T Rational)
genIrreduciblePolynomial = do
QC.NonZero unit <- QC.arbitrary
fmap (Poly.fromCoeffs . map (unit*)) $
QC.elements [[2,3],[2,0,1],[3,0,1],[1,-3,0,1]]
genPartialFractionPoly :: QC.Gen (PartialFraction.T (Poly.T Rational))
genPartialFractionPoly =
liftA2 PartialFraction.fromFactoredFraction
(fmap (take 3) $ QC.listOf genIrreduciblePolynomial)
(fmap (Poly.fromCoeffs . PolyCore.normalize . take 5) QC.arbitrary)
fractionConv :: (PID.C a, Indexable.C a) => [a] -> a -> Bool
fractionConv xs y =
PartialFraction.toFraction (PartialFraction.fromFactoredFraction xs y) ==
y % product xs
fractionConvAlt :: (PID.C a, Indexable.C a) => [a] -> a -> Bool
fractionConvAlt xs y =
PartialFraction.fromFactoredFraction xs y ==
PartialFraction.fromFactoredFractionAlt xs y
scaleInt :: (PID.C a, Indexable.C a) => a -> PartialFraction.T a -> Bool
scaleInt k a =
PartialFraction.toFraction (PartialFraction.scaleInt k a) ==
Ratio.scale k (PartialFraction.toFraction a)
add, sub, mul ::
(PID.C a, Indexable.C a) =>
PartialFraction.T a -> PartialFraction.T a -> Bool
add = Laws.homomorphism PartialFraction.toFraction (+) (+)
sub = Laws.homomorphism PartialFraction.toFraction (-) (-)
mul = Laws.homomorphism PartialFraction.toFraction (*) (*)
test :: DocTest.T ()
test = do
DocTest.printPrefix "MathObj.PartialFraction:195: "
{-# LINE 195 "src/MathObj/PartialFraction.hs" #-}
DocTest.property
{-# LINE 195 "src/MathObj/PartialFraction.hs" #-}
(QC.listOf genSmallPrime /\ fractionConv)
DocTest.printPrefix "MathObj.PartialFraction:196: "
{-# LINE 196 "src/MathObj/PartialFraction.hs" #-}
DocTest.property
{-# LINE 196 "src/MathObj/PartialFraction.hs" #-}
(fmap (take 3) (QC.listOf genIrreduciblePolynomial) /\ fractionConv)
DocTest.printPrefix "MathObj.PartialFraction:220: "
{-# LINE 220 "src/MathObj/PartialFraction.hs" #-}
DocTest.property
{-# LINE 220 "src/MathObj/PartialFraction.hs" #-}
(QC.listOf genSmallPrime /\ fractionConvAlt)
DocTest.printPrefix "MathObj.PartialFraction:221: "
{-# LINE 221 "src/MathObj/PartialFraction.hs" #-}
DocTest.property
{-# LINE 221 "src/MathObj/PartialFraction.hs" #-}
(fmap (take 3) (QC.listOf genIrreduciblePolynomial) /\ fractionConvAlt)
DocTest.printPrefix "MathObj.PartialFraction:297: "
{-# LINE 297 "src/MathObj/PartialFraction.hs" #-}
DocTest.property
{-# LINE 297 "src/MathObj/PartialFraction.hs" #-}
(genPartialFractionInt /\ \x -> genPartialFractionInt /\ \y -> add x y)
DocTest.printPrefix "MathObj.PartialFraction:298: "
{-# LINE 298 "src/MathObj/PartialFraction.hs" #-}
DocTest.property
{-# LINE 298 "src/MathObj/PartialFraction.hs" #-}
(genPartialFractionInt /\ \x -> genPartialFractionInt /\ \y -> sub x y)
DocTest.printPrefix "MathObj.PartialFraction:300: "
{-# LINE 300 "src/MathObj/PartialFraction.hs" #-}
DocTest.property
{-# LINE 300 "src/MathObj/PartialFraction.hs" #-}
(genPartialFractionPoly /\ \x -> genPartialFractionPoly /\ \y -> add x y)
DocTest.printPrefix "MathObj.PartialFraction:301: "
{-# LINE 301 "src/MathObj/PartialFraction.hs" #-}
DocTest.property
{-# LINE 301 "src/MathObj/PartialFraction.hs" #-}
(genPartialFractionPoly /\ \x -> genPartialFractionPoly /\ \y -> sub x y)
DocTest.printPrefix "MathObj.PartialFraction:429: "
{-# LINE 429 "src/MathObj/PartialFraction.hs" #-}
DocTest.property
{-# LINE 429 "src/MathObj/PartialFraction.hs" #-}
(genPartialFractionInt /\ \x k -> scaleInt k x)
DocTest.printPrefix "MathObj.PartialFraction:430: "
{-# LINE 430 "src/MathObj/PartialFraction.hs" #-}
DocTest.property
{-# LINE 430 "src/MathObj/PartialFraction.hs" #-}
(genPartialFractionPoly /\ \x k -> scaleInt k x)
DocTest.printPrefix "MathObj.PartialFraction:449: "
{-# LINE 449 "src/MathObj/PartialFraction.hs" #-}
DocTest.property
{-# LINE 449 "src/MathObj/PartialFraction.hs" #-}
(genPartialFractionInt /\ \x -> genPartialFractionInt /\ \y -> mul x y)
DocTest.printPrefix "MathObj.PartialFraction:450: "
{-# LINE 450 "src/MathObj/PartialFraction.hs" #-}
DocTest.property
{-# LINE 450 "src/MathObj/PartialFraction.hs" #-}
(genPartialFractionPoly /\ \x -> genPartialFractionPoly /\ \y -> mul x y)