Change log to ln in Shape javadoc

This commit is contained in:
Alex Herbert 2020-03-14 08:12:03 +00:00
parent e3484deb51
commit 90f705e732
1 changed files with 15 additions and 15 deletions

View File

@ -28,11 +28,11 @@ import java.util.Objects;
* <h2>Interrelatedness of values</h2> * <h2>Interrelatedness of values</h2>
* *
* <dl> <dt>Number of Items ({@code n})</dt> * <dl> <dt>Number of Items ({@code n})</dt>
* <dd>{@code n = ceil(m / (-k / log(1 - exp(log(p) / k))))}</dd> <dt>Probability of * <dd>{@code n = ceil(m / (-k / ln(1 - exp(ln(p) / k))))}</dd> <dt>Probability of
* False Positives ({@code p})</dt> <dd>{@code p = pow(1 - exp(-k / (m / n)), k)}</dd> <dt>Number * False Positives ({@code p})</dt> <dd>{@code p = pow(1 - exp(-k / (m / n)), k)}</dd> <dt>Number
* of Bits ({@code m})</dt> * of Bits ({@code m})</dt>
* <dd>{@code m = ceil((n * log(p)) / log(1 / pow(2, log(2))))}</dd> <dt>Number of * <dd>{@code m = ceil((n * ln(p)) / ln(1 / pow(2, ln(2))))}</dd> <dt>Number of
* Functions ({@code k})</dt> <dd>{@code k = round((m / n) * log(2))}</dd> </dl> * Functions ({@code k})</dt> <dd>{@code k = round((m / n) * ln(2))}</dd> </dl>
* *
* <h2>Comparisons</h2> <p> For purposes of equality checking and hashCode * <h2>Comparisons</h2> <p> For purposes of equality checking and hashCode
* calculations a {@code Shape} is defined by the hashing function identity, the number of * calculations a {@code Shape} is defined by the hashing function identity, the number of
@ -48,14 +48,14 @@ public final class Shape {
/** /**
* The natural logarithm of 2. Used in several calculations. Approximately 0.693147180559945. * The natural logarithm of 2. Used in several calculations. Approximately 0.693147180559945.
*/ */
private static final double LOG_OF_2 = Math.log(2.0); private static final double LN_2 = Math.log(2.0);
/** /**
* log(1 / 2^log(2)). Used in calculating the number of bits. Approximately -0.480453013918201. * ln(1 / 2^ln(2)). Used in calculating the number of bits. Approximately -0.480453013918201.
* *
* <p>log(1 / 2^log(2)) = log(1) - log(2^log(2)) = -log(2) * log(2) * <p>ln(1 / 2^ln(2)) = ln(1) - ln(2^ln(2)) = -ln(2) * ln(2)
*/ */
private static final double DENOMINATOR = -LOG_OF_2 * LOG_OF_2; private static final double DENOMINATOR = -LN_2 * LN_2;
/** /**
* Number of items in the filter ({@code n}). * Number of items in the filter ({@code n}).
@ -87,7 +87,7 @@ public final class Shape {
* specified number of bits ({@code m}) and hash functions ({@code k}). * specified number of bits ({@code m}) and hash functions ({@code k}).
* *
* <p>The number of items ({@code n}) to be stored in the filter is computed. * <p>The number of items ({@code n}) to be stored in the filter is computed.
* <pre>n = ceil(m / (-k / log(1 - exp(log(p) / k))))</pre> * <pre>n = ceil(m / (-k / ln(1 - exp(ln(p) / k))))</pre>
* *
* <p>The actual probability will be approximately equal to the * <p>The actual probability will be approximately equal to the
* desired probability but will be dependent upon the calculated Bloom filter capacity * desired probability but will be dependent upon the calculated Bloom filter capacity
@ -112,7 +112,7 @@ public final class Shape {
this.numberOfHashFunctions = checkNumberOfHashFunctions(numberOfHashFunctions); this.numberOfHashFunctions = checkNumberOfHashFunctions(numberOfHashFunctions);
// Number of items (n): // Number of items (n):
// n = ceil(m / (-k / log(1 - exp(log(p) / k)))) // n = ceil(m / (-k / ln(1 - exp(ln(p) / k))))
final double n = Math.ceil(numberOfBits / final double n = Math.ceil(numberOfBits /
(-numberOfHashFunctions / Math.log(1 - Math.exp(Math.log(probability) / numberOfHashFunctions)))); (-numberOfHashFunctions / Math.log(1 - Math.exp(Math.log(probability) / numberOfHashFunctions))));
@ -137,10 +137,10 @@ public final class Shape {
* desired false-positive probability ({@code p}). * desired false-positive probability ({@code p}).
* *
* <p>The number of bits ({@code m}) for the filter is computed. * <p>The number of bits ({@code m}) for the filter is computed.
* <pre>m = ceil(n * log(p) / log(1 / 2^log(2)))</pre> * <pre>m = ceil(n * ln(p) / ln(1 / 2^ln(2)))</pre>
* *
* <p>The optimal number of hash functions ({@code k}) is computed. * <p>The optimal number of hash functions ({@code k}) is computed.
* <pre>k = round((m / n) * log(2))</pre> * <pre>k = round((m / n) * ln(2))</pre>
* *
* <p>The actual probability will be approximately equal to the * <p>The actual probability will be approximately equal to the
* desired probability but will be dependent upon the calculated number of bits and hash * desired probability but will be dependent upon the calculated number of bits and hash
@ -178,7 +178,7 @@ public final class Shape {
* bits ({@code m}). * bits ({@code m}).
* *
* <p>The optimal number of hash functions ({@code k}) is computed. * <p>The optimal number of hash functions ({@code k}) is computed.
* <pre>k = round((m / n) * log(2))</pre> * <pre>k = round((m / n) * ln(2))</pre>
* *
* <p>The false-positive probability is computed using the number of items, bits and hash * <p>The false-positive probability is computed using the number of items, bits and hash
* functions. An exception is raised if this is greater than or equal to 1 (i.e. the * functions. An exception is raised if this is greater than or equal to 1 (i.e. the
@ -317,16 +317,16 @@ public final class Shape {
* @throws IllegalArgumentException if the calculated number of hash function is {@code < 1} * @throws IllegalArgumentException if the calculated number of hash function is {@code < 1}
*/ */
private static int calculateNumberOfHashFunctions(final int numberOfItems, final int numberOfBits) { private static int calculateNumberOfHashFunctions(final int numberOfItems, final int numberOfBits) {
// k = round((m / n) * log(2)) We change order so that we use real math rather // k = round((m / n) * ln(2)) We change order so that we use real math rather
// than integer math. // than integer math.
final long k = Math.round(LOG_OF_2 * numberOfBits / numberOfItems); final long k = Math.round(LN_2 * numberOfBits / numberOfItems);
if (k < 1) { if (k < 1) {
throw new IllegalArgumentException( throw new IllegalArgumentException(
String.format("Filter too small: Calculated number of hash functions (%s) was less than 1", k)); String.format("Filter too small: Calculated number of hash functions (%s) was less than 1", k));
} }
// Normally we would check that numberofHashFunctions <= Integer.MAX_VALUE but // Normally we would check that numberofHashFunctions <= Integer.MAX_VALUE but
// since numberOfBits is at most Integer.MAX_VALUE the numerator of // since numberOfBits is at most Integer.MAX_VALUE the numerator of
// numberofHashFunctions is log(2) * Integer.MAX_VALUE = 646456992.9449 the // numberofHashFunctions is ln(2) * Integer.MAX_VALUE = 646456992.9449 the
// value of k can not be above Integer.MAX_VALUE. // value of k can not be above Integer.MAX_VALUE.
return (int) k; return (int) k;
} }