Blame test-suite/Math/NumberTheory/LogarithmsTests.hs

Packit 785658
-- |
Packit 785658
-- Module:      Math.NumberTheory.LogarithmsTests
Packit 785658
-- Copyright:   (c) 2016 Andrew Lelechenko
Packit 785658
-- Licence:     MIT
Packit 785658
-- Maintainer:  Andrew Lelechenko <andrew.lelechenko@gmail.com>
Packit 785658
-- Stability:   Provisional
Packit 785658
--
Packit 785658
-- Tests for Math.NumberTheory.Logarithms
Packit 785658
--
Packit 785658
Packit 785658
{-# LANGUAGE CPP       #-}
Packit 785658
Packit 785658
{-# OPTIONS_GHC -fno-warn-type-defaults #-}
Packit 785658
Packit 785658
module Math.NumberTheory.LogarithmsTests
Packit 785658
  ( testSuite
Packit 785658
  ) where
Packit 785658
Packit 785658
import Test.Tasty
Packit 785658
Packit 785658
#if MIN_VERSION_base(4,8,0)
Packit 785658
#else
Packit 785658
import Data.Word
Packit 785658
#endif
Packit 785658
import Numeric.Natural
Packit 785658
Packit 785658
import Math.NumberTheory.Logarithms
Packit 785658
import Math.NumberTheory.TestUtils
Packit 785658
Packit 785658
-- Arbitrary Natural
Packit 785658
import Orphans ()
Packit 785658
Packit 785658
-- | Check that 'integerLogBase' returns the largest integer @l@ such that @b@ ^ @l@ <= @n@ and @b@ ^ (@l@+1) > @n@.
Packit 785658
integerLogBaseProperty :: Positive Integer -> Positive Integer -> Bool
Packit 785658
integerLogBaseProperty (Positive b) (Positive n) = b == 1 || b ^ l <= n && b ^ (l + 1) > n
Packit 785658
  where
Packit 785658
    l = toInteger $ integerLogBase b n
Packit 785658
Packit 785658
-- | Check that 'integerLog2' returns the largest integer @l@ such that 2 ^ @l@ <= @n@ and 2 ^ (@l@+1) > @n@.
Packit 785658
integerLog2Property :: Positive Integer -> Bool
Packit 785658
integerLog2Property (Positive n) = 2 ^ l <= n && 2 ^ (l + 1) > n
Packit 785658
  where
Packit 785658
    l = toInteger $ integerLog2 n
Packit 785658
Packit 785658
integerLog2HugeProperty :: Huge (Positive Integer) -> Bool
Packit 785658
integerLog2HugeProperty (Huge (Positive n)) = 2 ^ l <= n && 2 ^ (l + 1) > n
Packit 785658
  where
Packit 785658
    l = toInteger $ integerLog2 n
Packit 785658
Packit 785658
-- | Check that 'integerLog10' returns the largest integer @l@ such that 10 ^ @l@ <= @n@ and 10 ^ (@l@+1) > @n@.
Packit 785658
integerLog10Property :: Positive Integer -> Bool
Packit 785658
integerLog10Property (Positive n) = 10 ^ l <= n && 10 ^ (l + 1) > n
Packit 785658
  where
Packit 785658
    l = toInteger $ integerLog10 n
Packit 785658
Packit 785658
-- | Check that 'naturalLogBase' returns the largest natural @l@ such that @b@ ^ @l@ <= @n@ and @b@ ^ (@l@+1) > @n@.
Packit 785658
naturalLogBaseProperty :: Positive Natural -> Positive Natural -> Bool
Packit 785658
naturalLogBaseProperty (Positive b) (Positive n) = b == 1 || b ^ l <= n && b ^ (l + 1) > n
Packit 785658
  where
Packit 785658
    l = fromIntegral $ naturalLogBase b n
Packit 785658
Packit 785658
-- | Check that 'naturalLog2' returns the largest natural @l@ such that 2 ^ @l@ <= @n@ and 2 ^ (@l@+1) > @n@.
Packit 785658
naturalLog2Property :: Positive Natural -> Bool
Packit 785658
naturalLog2Property (Positive n) = 2 ^ l <= n && 2 ^ (l + 1) > n
Packit 785658
  where
Packit 785658
    l = fromIntegral $ naturalLog2 n
Packit 785658
Packit 785658
naturalLog2HugeProperty :: Huge (Positive Natural) -> Bool
Packit 785658
naturalLog2HugeProperty (Huge (Positive n)) = 2 ^ l <= n && 2 ^ (l + 1) > n
Packit 785658
  where
Packit 785658
    l = fromIntegral $ naturalLog2 n
Packit 785658
Packit 785658
-- | Check that 'naturalLog10' returns the largest natural @l@ such that 10 ^ @l@ <= @n@ and 10 ^ (@l@+1) > @n@.
Packit 785658
naturalLog10Property :: Positive Natural -> Bool
Packit 785658
naturalLog10Property (Positive n) = 10 ^ l <= n && 10 ^ (l + 1) > n
Packit 785658
  where
Packit 785658
    l = fromIntegral $ naturalLog10 n
Packit 785658
Packit 785658
-- | Check that 'intLog2' returns the largest integer @l@ such that 2 ^ @l@ <= @n@ and 2 ^ (@l@+1) > @n@.
Packit 785658
intLog2Property :: Positive Int -> Bool
Packit 785658
intLog2Property (Positive n) = 2 ^ l <= n && (2 ^ (l + 1) > n || n > maxBound `div` 2)
Packit 785658
  where
Packit 785658
    l = intLog2 n
Packit 785658
Packit 785658
-- | Check that 'wordLog2' returns the largest integer @l@ such that 2 ^ @l@ <= @n@ and 2 ^ (@l@+1) > @n@.
Packit 785658
wordLog2Property :: Positive Word -> Bool
Packit 785658
wordLog2Property (Positive n) = 2 ^ l <= n && (2 ^ (l + 1) > n || n > maxBound `div` 2)
Packit 785658
  where
Packit 785658
    l = wordLog2 n
Packit 785658
Packit 785658
-- | Check that 'integerLogBase'' returns the largest integer @l@ such that @b@ ^ @l@ <= @n@ and @b@ ^ (@l@+1) > @n@.
Packit 785658
integerLogBase'Property :: Positive Integer -> Positive Integer -> Bool
Packit 785658
integerLogBase'Property (Positive b) (Positive n) = b == 1 || b ^ l <= n && b ^ (l + 1) > n
Packit 785658
  where
Packit 785658
    l = toInteger $ integerLogBase' b n
Packit 785658
Packit 785658
-- | Check that 'integerLogBase'' returns the largest integer @l@ such that @b@ ^ @l@ <= @n@ and @b@ ^ (@l@+1) > @n@ for @b@ > 32 and @n@ >= @b@ ^ 2.
Packit 785658
integerLogBase'Property2 :: Positive Integer -> Positive Integer -> Bool
Packit 785658
integerLogBase'Property2 (Positive b') (Positive n') = b ^ l <= n && b ^ (l + 1) > n
Packit 785658
  where
Packit 785658
    b = b' + 32
Packit 785658
    n = n' + b ^ 2 - 1
Packit 785658
    l = toInteger $ integerLogBase' b n
Packit 785658
Packit 785658
-- | Check that 'integerLog2'' returns the largest integer @l@ such that 2 ^ @l@ <= @n@ and 2 ^ (@l@+1) > @n@.
Packit 785658
integerLog2'Property :: Positive Integer -> Bool
Packit 785658
integerLog2'Property (Positive n) = 2 ^ l <= n && 2 ^ (l + 1) > n
Packit 785658
  where
Packit 785658
    l = toInteger $ integerLog2' n
Packit 785658
Packit 785658
-- | Check that 'integerLog10'' returns the largest integer @l@ such that 10 ^ @l@ <= @n@ and 10 ^ (@l@+1) > @n@.
Packit 785658
integerLog10'Property :: Positive Integer -> Bool
Packit 785658
integerLog10'Property (Positive n) = 10 ^ l <= n && 10 ^ (l + 1) > n
Packit 785658
  where
Packit 785658
    l = toInteger $ integerLog10' n
Packit 785658
Packit 785658
-- | Check that 'intLog2'' returns the largest integer @l@ such that 2 ^ @l@ <= @n@ and 2 ^ (@l@+1) > @n@.
Packit 785658
intLog2'Property :: Positive Int -> Bool
Packit 785658
intLog2'Property (Positive n) = 2 ^ l <= n && (2 ^ (l + 1) > n || n > maxBound `div` 2)
Packit 785658
  where
Packit 785658
    l = intLog2' n
Packit 785658
Packit 785658
-- | Check that 'wordLog2'' returns the largest integer @l@ such that 2 ^ @l@ <= @n@ and 2 ^ (@l@+1) > @n@.
Packit 785658
wordLog2'Property :: Positive Word -> Bool
Packit 785658
wordLog2'Property (Positive n) = 2 ^ l <= n && (2 ^ (l + 1) > n || n > maxBound `div` 2)
Packit 785658
  where
Packit 785658
    l = wordLog2' n
Packit 785658
Packit 785658
testSuite :: TestTree
Packit 785658
testSuite = testGroup "Logarithms"
Packit 785658
  [ testSmallAndQuick "integerLogBase"  integerLogBaseProperty
Packit 785658
  , testSmallAndQuick "integerLog2"     integerLog2Property
Packit 785658
  , testSmallAndQuick "integerLog2Huge" integerLog2HugeProperty
Packit 785658
  , testSmallAndQuick "integerLog10"    integerLog10Property
Packit 785658
  , testSmallAndQuick "naturalLogBase"  naturalLogBaseProperty
Packit 785658
  , testSmallAndQuick "naturalLog2"     naturalLog2Property
Packit 785658
  , testSmallAndQuick "naturalLog2Huge" naturalLog2HugeProperty
Packit 785658
  , testSmallAndQuick "naturalLog10"    naturalLog10Property
Packit 785658
  , testSmallAndQuick "intLog2"         intLog2Property
Packit 785658
  , testSmallAndQuick "wordLog2"        wordLog2Property
Packit 785658
Packit 785658
  , testSmallAndQuick "integerLogBase'" integerLogBase'Property
Packit 785658
  , testSmallAndQuick "integerLogBase' with base > 32 and n >= base ^ 2"
Packit 785658
      integerLogBase'Property2
Packit 785658
  , testSmallAndQuick "integerLog2'"    integerLog2'Property
Packit 785658
  , testSmallAndQuick "integerLog10'"   integerLog10'Property
Packit 785658
  , testSmallAndQuick "intLog2'"        intLog2'Property
Packit 785658
  , testSmallAndQuick "wordLog2'"       wordLog2'Property
Packit 785658
  ]