{-|
    Module      :  Data.Number.ER.RnToRm.UnitDom.ChebyshevBase.Polynom.Tests.Division
    Description :  (testing) properties of polynomial enclosure division
    Copyright   :  (c) 2007-2008 Michal Konecny
    License     :  BSD3

    Maintainer  :  mik@konecny.aow.cz
    Stability   :  experimental
    Portability :  portable
    
    Quickcheck properties of polynomial enclosure division.
-}
module Data.Number.ER.RnToRm.UnitDom.ChebyshevBase.Polynom.Tests.Division
where

import Data.Number.ER.RnToRm.UnitDom.ChebyshevBase.Polynom.Division
import Data.Number.ER.RnToRm.UnitDom.ChebyshevBase.Polynom.Enclosure
--import Data.Number.ER.RnToRm.UnitDom.ChebyshevBase.Polynom.Basic
import Data.Number.ER.RnToRm.UnitDom.ChebyshevBase.Polynom.Tests.Generate

import Data.Number.ER.Real.Approx.Interval

import Data.Number.ER.BasicTypes

import Test.QuickCheck

prop_enclRecip_ThickEncl_consistent
        reportFileName
        (Deg20Size20 maxDegree maxSize,
         (Int20 ixInt, Int20 tauDegr),
         SmallRatio sepNum sepDenom,
         (isNegative, PSize30 (n1,p1), PSize30 (n2, p2))) =
    recip_encl_consistent
        reportFileName 
        maxDegree maxSize 
        ixInt tauDegr 
        sepNum sepDenom isNegative (n1, n2) preEncl
    where
    preEncl = makeThickEncl maxDegree maxSize p1 p2 

prop_enclRecip_ParalEncl_consistent
        reportFileName
        (Deg20Size20 maxDegree maxSize,
         (Int20 ixInt, Int20 tauDegr),
         SmallRatio sepNum sepDenom,
         (isNegative, SmallRatio wNum wDenom, PSize30 (n, p))) =
    recip_encl_consistent 
        reportFileName
        maxDegree maxSize 
        ixInt tauDegr 
        sepNum sepDenom isNegative ((wNum, wDenom), n) preEncl
    where
    preEncl = makeParalEncl p wNum wDenom

recip_encl_consistent 
        reportFileName
        maxDegree maxSize 
        ixInt tauDegr 
        sepNum sepDenom isNegative pId preEncl =
    excludedZero ==>
    enclAtKeyPointsPointwiseUnaryDownUpConsistent
        reportFileName
        ((maxDegree, maxSize), (ixInt, tauDegr), (sepNum, sepDenom), (isNegative, pId)) 
        (intervalDivideInner 1) 
        pEncl resEncl
    where
    resEncl = enclRecip maxDegree maxSize ix tauDegr pEncl
    ix = int2effIx ixInt
    (excludedZero, pEncl) =
        enclRestrictRange ix rangeNoZero preEncl
    rangeNoZero
        | isNegative = (Nothing, Just (-sepB))
        | otherwise = (Just sepB, Nothing)
    sepB = abs sepNumB / sepDenomB
    sepNumB = fromInteger $ toInteger sepNum
    sepDenomB = fromInteger $ toInteger sepDenom