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)