never executed always true always false
    1 -- | Various formulas for working with bloomfilters.
    2 module Data.BloomFilter.Calc (
    3     falsePositiveProb,
    4     filterSize,
    5 ) where
    6 
    7 import           Numeric (expm1)
    8 
    9 -- $setup
   10 -- >>> import Numeric (showFFloat)
   11 
   12 -- | Approximate probability of false positives
   13 -- \[
   14 -- {\displaystyle \varepsilon =\left(1-\left[1-{\frac {1}{m}}\right]^{kn}\right)^{k}\approx \left(1-e^{-kn/m}\right)^{k}}
   15 -- \]
   16 --
   17 -- >>> [ showFFloat (Just 5) (falsePositiveProb 10_000 100_000 k) "" | k <- [1..5] ]
   18 -- ["0.09516","0.03286","0.01741","0.01181","0.00943"]
   19 --
   20 falsePositiveProb ::
   21        Double  -- ^ /n/, number of elements
   22     -> Double  -- ^ /m/, size of bloom filter
   23     -> Double  -- ^ /k/, number of hash functions
   24     -> Double
   25 falsePositiveProb n m k =
   26     -- (1 - (1 - recip m) ** (k * n)) ** k
   27     negate (expm1 (negate (k * n / m))) ** k
   28 
   29 -- | Filter size for given number of elements, false positive rate and
   30 -- number of hash functions.
   31 filterSize ::
   32        Double  -- ^ /n/, number of elements
   33     -> Double  -- ^ /e/, false positive rate
   34     -> Double  -- ^ /k/, number of hash functions
   35     -> Double
   36 filterSize n e k  =
   37     -- recip (1 - (1 - e ** recip k) ** recip (k * n))
   38     negate k * n / log (1 - e ** recip k)