001/*
002 * Copyright (C) 2011 The Guava Authors
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
005 * in compliance with the License. You may obtain a copy of the License at
006 *
007 * http://www.apache.org/licenses/LICENSE-2.0
008 *
009 * Unless required by applicable law or agreed to in writing, software distributed under the License
010 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
011 * or implied. See the License for the specific language governing permissions and limitations under
012 * the License.
013 */
014
015package com.google.common.math;
016
017import static com.google.common.base.Preconditions.checkArgument;
018import static com.google.common.base.Preconditions.checkNotNull;
019import static com.google.common.math.MathPreconditions.checkNoOverflow;
020import static com.google.common.math.MathPreconditions.checkNonNegative;
021import static com.google.common.math.MathPreconditions.checkPositive;
022import static com.google.common.math.MathPreconditions.checkRoundingUnnecessary;
023import static java.lang.Math.abs;
024import static java.lang.Math.min;
025import static java.math.RoundingMode.HALF_EVEN;
026import static java.math.RoundingMode.HALF_UP;
027
028import com.google.common.annotations.GwtCompatible;
029import com.google.common.annotations.GwtIncompatible;
030import com.google.common.annotations.VisibleForTesting;
031import com.google.common.primitives.Ints;
032import java.math.BigInteger;
033import java.math.RoundingMode;
034
035/**
036 * A class for arithmetic on values of type {@code int}. Where possible, methods are defined and
037 * named analogously to their {@code BigInteger} counterparts.
038 *
039 * <p>The implementations of many methods in this class are based on material from Henry S. Warren,
040 * Jr.'s <i>Hacker's Delight</i>, (Addison Wesley, 2002).
041 *
042 * <p>Similar functionality for {@code long} and for {@link BigInteger} can be found in {@link
043 * LongMath} and {@link BigIntegerMath} respectively. For other common operations on {@code int}
044 * values, see {@link com.google.common.primitives.Ints}.
045 *
046 * @author Louis Wasserman
047 * @since 11.0
048 */
049@GwtCompatible(emulated = true)
050@ElementTypesAreNonnullByDefault
051public final class IntMath {
052  @VisibleForTesting static final int MAX_SIGNED_POWER_OF_TWO = 1 << (Integer.SIZE - 2);
053
054  /**
055   * Returns the smallest power of two greater than or equal to {@code x}. This is equivalent to
056   * {@code checkedPow(2, log2(x, CEILING))}.
057   *
058   * @throws IllegalArgumentException if {@code x <= 0}
059   * @throws ArithmeticException of the next-higher power of two is not representable as an {@code
060   *     int}, i.e. when {@code x > 2^30}
061   * @since 20.0
062   */
063  public static int ceilingPowerOfTwo(int x) {
064    checkPositive("x", x);
065    if (x > MAX_SIGNED_POWER_OF_TWO) {
066      throw new ArithmeticException("ceilingPowerOfTwo(" + x + ") not representable as an int");
067    }
068    return 1 << -Integer.numberOfLeadingZeros(x - 1);
069  }
070
071  /**
072   * Returns the largest power of two less than or equal to {@code x}. This is equivalent to {@code
073   * checkedPow(2, log2(x, FLOOR))}.
074   *
075   * @throws IllegalArgumentException if {@code x <= 0}
076   * @since 20.0
077   */
078  public static int floorPowerOfTwo(int x) {
079    checkPositive("x", x);
080    return Integer.highestOneBit(x);
081  }
082
083  /**
084   * Returns {@code true} if {@code x} represents a power of two.
085   *
086   * <p>This differs from {@code Integer.bitCount(x) == 1}, because {@code
087   * Integer.bitCount(Integer.MIN_VALUE) == 1}, but {@link Integer#MIN_VALUE} is not a power of two.
088   */
089  // Whenever both tests are cheap and functional, it's faster to use &, | instead of &&, ||
090  @SuppressWarnings("ShortCircuitBoolean")
091  public static boolean isPowerOfTwo(int x) {
092    return x > 0 & (x & (x - 1)) == 0;
093  }
094
095  /**
096   * Returns 1 if {@code x < y} as unsigned integers, and 0 otherwise. Assumes that x - y fits into
097   * a signed int. The implementation is branch-free, and benchmarks suggest it is measurably (if
098   * narrowly) faster than the straightforward ternary expression.
099   */
100  @VisibleForTesting
101  static int lessThanBranchFree(int x, int y) {
102    // The double negation is optimized away by normal Java, but is necessary for GWT
103    // to make sure bit twiddling works as expected.
104    return ~~(x - y) >>> (Integer.SIZE - 1);
105  }
106
107  /**
108   * Returns the base-2 logarithm of {@code x}, rounded according to the specified rounding mode.
109   *
110   * @throws IllegalArgumentException if {@code x <= 0}
111   * @throws ArithmeticException if {@code mode} is {@link RoundingMode#UNNECESSARY} and {@code x}
112   *     is not a power of two
113   */
114  @SuppressWarnings("fallthrough")
115  // TODO(kevinb): remove after this warning is disabled globally
116  public static int log2(int x, RoundingMode mode) {
117    checkPositive("x", x);
118    switch (mode) {
119      case UNNECESSARY:
120        checkRoundingUnnecessary(isPowerOfTwo(x));
121        // fall through
122      case DOWN:
123      case FLOOR:
124        return (Integer.SIZE - 1) - Integer.numberOfLeadingZeros(x);
125
126      case UP:
127      case CEILING:
128        return Integer.SIZE - Integer.numberOfLeadingZeros(x - 1);
129
130      case HALF_DOWN:
131      case HALF_UP:
132      case HALF_EVEN:
133        // Since sqrt(2) is irrational, log2(x) - logFloor cannot be exactly 0.5
134        int leadingZeros = Integer.numberOfLeadingZeros(x);
135        int cmp = MAX_POWER_OF_SQRT2_UNSIGNED >>> leadingZeros;
136        // floor(2^(logFloor + 0.5))
137        int logFloor = (Integer.SIZE - 1) - leadingZeros;
138        return logFloor + lessThanBranchFree(cmp, x);
139    }
140    throw new AssertionError();
141  }
142
143  /** The biggest half power of two that can fit in an unsigned int. */
144  @VisibleForTesting static final int MAX_POWER_OF_SQRT2_UNSIGNED = 0xB504F333;
145
146  /**
147   * Returns the base-10 logarithm of {@code x}, rounded according to the specified rounding mode.
148   *
149   * @throws IllegalArgumentException if {@code x <= 0}
150   * @throws ArithmeticException if {@code mode} is {@link RoundingMode#UNNECESSARY} and {@code x}
151   *     is not a power of ten
152   */
153  @GwtIncompatible // need BigIntegerMath to adequately test
154  @SuppressWarnings("fallthrough")
155  public static int log10(int x, RoundingMode mode) {
156    checkPositive("x", x);
157    int logFloor = log10Floor(x);
158    int floorPow = powersOf10[logFloor];
159    switch (mode) {
160      case UNNECESSARY:
161        checkRoundingUnnecessary(x == floorPow);
162        // fall through
163      case FLOOR:
164      case DOWN:
165        return logFloor;
166      case CEILING:
167      case UP:
168        return logFloor + lessThanBranchFree(floorPow, x);
169      case HALF_DOWN:
170      case HALF_UP:
171      case HALF_EVEN:
172        // sqrt(10) is irrational, so log10(x) - logFloor is never exactly 0.5
173        return logFloor + lessThanBranchFree(halfPowersOf10[logFloor], x);
174    }
175    throw new AssertionError();
176  }
177
178  private static int log10Floor(int x) {
179    /*
180     * Based on Hacker's Delight Fig. 11-5, the two-table-lookup, branch-free implementation.
181     *
182     * The key idea is that based on the number of leading zeros (equivalently, floor(log2(x))), we
183     * can narrow the possible floor(log10(x)) values to two. For example, if floor(log2(x)) is 6,
184     * then 64 <= x < 128, so floor(log10(x)) is either 1 or 2.
185     */
186    int y = maxLog10ForLeadingZeros[Integer.numberOfLeadingZeros(x)];
187    /*
188     * y is the higher of the two possible values of floor(log10(x)). If x < 10^y, then we want the
189     * lower of the two possible values, or y - 1, otherwise, we want y.
190     */
191    return y - lessThanBranchFree(x, powersOf10[y]);
192  }
193
194  // maxLog10ForLeadingZeros[i] == floor(log10(2^(Long.SIZE - i)))
195  @VisibleForTesting
196  static final byte[] maxLog10ForLeadingZeros = {
197    9, 9, 9, 8, 8, 8, 7, 7, 7, 6, 6, 6, 6, 5, 5, 5, 4, 4, 4, 3, 3, 3, 3, 2, 2, 2, 1, 1, 1, 0, 0, 0,
198    0
199  };
200
201  @VisibleForTesting
202  static final int[] powersOf10 = {
203    1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000
204  };
205
206  // halfPowersOf10[i] = largest int less than 10^(i + 0.5)
207  @VisibleForTesting
208  static final int[] halfPowersOf10 = {
209    3, 31, 316, 3162, 31622, 316227, 3162277, 31622776, 316227766, Integer.MAX_VALUE
210  };
211
212  /**
213   * Returns {@code b} to the {@code k}th power. Even if the result overflows, it will be equal to
214   * {@code BigInteger.valueOf(b).pow(k).intValue()}. This implementation runs in {@code O(log k)}
215   * time.
216   *
217   * <p>Compare {@link #checkedPow}, which throws an {@link ArithmeticException} upon overflow.
218   *
219   * @throws IllegalArgumentException if {@code k < 0}
220   */
221  @GwtIncompatible // failing tests
222  public static int pow(int b, int k) {
223    checkNonNegative("exponent", k);
224    switch (b) {
225      case 0:
226        return (k == 0) ? 1 : 0;
227      case 1:
228        return 1;
229      case (-1):
230        return ((k & 1) == 0) ? 1 : -1;
231      case 2:
232        return (k < Integer.SIZE) ? (1 << k) : 0;
233      case (-2):
234        if (k < Integer.SIZE) {
235          return ((k & 1) == 0) ? (1 << k) : -(1 << k);
236        } else {
237          return 0;
238        }
239      default:
240        // continue below to handle the general case
241    }
242    for (int accum = 1; ; k >>= 1) {
243      switch (k) {
244        case 0:
245          return accum;
246        case 1:
247          return b * accum;
248        default:
249          accum *= ((k & 1) == 0) ? 1 : b;
250          b *= b;
251      }
252    }
253  }
254
255  /**
256   * Returns the square root of {@code x}, rounded with the specified rounding mode.
257   *
258   * @throws IllegalArgumentException if {@code x < 0}
259   * @throws ArithmeticException if {@code mode} is {@link RoundingMode#UNNECESSARY} and {@code
260   *     sqrt(x)} is not an integer
261   */
262  @GwtIncompatible // need BigIntegerMath to adequately test
263  @SuppressWarnings("fallthrough")
264  public static int sqrt(int x, RoundingMode mode) {
265    checkNonNegative("x", x);
266    int sqrtFloor = sqrtFloor(x);
267    switch (mode) {
268      case UNNECESSARY:
269        checkRoundingUnnecessary(sqrtFloor * sqrtFloor == x); // fall through
270      case FLOOR:
271      case DOWN:
272        return sqrtFloor;
273      case CEILING:
274      case UP:
275        return sqrtFloor + lessThanBranchFree(sqrtFloor * sqrtFloor, x);
276      case HALF_DOWN:
277      case HALF_UP:
278      case HALF_EVEN:
279        int halfSquare = sqrtFloor * sqrtFloor + sqrtFloor;
280        /*
281         * We wish to test whether or not x <= (sqrtFloor + 0.5)^2 = halfSquare + 0.25. Since both x
282         * and halfSquare are integers, this is equivalent to testing whether or not x <=
283         * halfSquare. (We have to deal with overflow, though.)
284         *
285         * If we treat halfSquare as an unsigned int, we know that
286         *            sqrtFloor^2 <= x < (sqrtFloor + 1)^2
287         * halfSquare - sqrtFloor <= x < halfSquare + sqrtFloor + 1
288         * so |x - halfSquare| <= sqrtFloor.  Therefore, it's safe to treat x - halfSquare as a
289         * signed int, so lessThanBranchFree is safe for use.
290         */
291        return sqrtFloor + lessThanBranchFree(halfSquare, x);
292    }
293    throw new AssertionError();
294  }
295
296  private static int sqrtFloor(int x) {
297    // There is no loss of precision in converting an int to a double, according to
298    // http://java.sun.com/docs/books/jls/third_edition/html/conversions.html#5.1.2
299    return (int) Math.sqrt(x);
300  }
301
302  /**
303   * Returns the result of dividing {@code p} by {@code q}, rounding using the specified {@code
304   * RoundingMode}.
305   *
306   * @throws ArithmeticException if {@code q == 0}, or if {@code mode == UNNECESSARY} and {@code a}
307   *     is not an integer multiple of {@code b}
308   */
309  // Whenever both tests are cheap and functional, it's faster to use &, | instead of &&, ||
310  @SuppressWarnings({"fallthrough", "ShortCircuitBoolean"})
311  public static int divide(int p, int q, RoundingMode mode) {
312    checkNotNull(mode);
313    if (q == 0) {
314      throw new ArithmeticException("/ by zero"); // for GWT
315    }
316    int div = p / q;
317    int rem = p - q * div; // equal to p % q
318
319    if (rem == 0) {
320      return div;
321    }
322
323    /*
324     * Normal Java division rounds towards 0, consistently with RoundingMode.DOWN. We just have to
325     * deal with the cases where rounding towards 0 is wrong, which typically depends on the sign of
326     * p / q.
327     *
328     * signum is 1 if p and q are both nonnegative or both negative, and -1 otherwise.
329     */
330    int signum = 1 | ((p ^ q) >> (Integer.SIZE - 1));
331    boolean increment;
332    switch (mode) {
333      case UNNECESSARY:
334        checkRoundingUnnecessary(rem == 0);
335        // fall through
336      case DOWN:
337        increment = false;
338        break;
339      case UP:
340        increment = true;
341        break;
342      case CEILING:
343        increment = signum > 0;
344        break;
345      case FLOOR:
346        increment = signum < 0;
347        break;
348      case HALF_EVEN:
349      case HALF_DOWN:
350      case HALF_UP:
351        int absRem = abs(rem);
352        int cmpRemToHalfDivisor = absRem - (abs(q) - absRem);
353        // subtracting two nonnegative ints can't overflow
354        // cmpRemToHalfDivisor has the same sign as compare(abs(rem), abs(q) / 2).
355        if (cmpRemToHalfDivisor == 0) { // exactly on the half mark
356          increment = (mode == HALF_UP || (mode == HALF_EVEN & (div & 1) != 0));
357        } else {
358          increment = cmpRemToHalfDivisor > 0; // closer to the UP value
359        }
360        break;
361      default:
362        throw new AssertionError();
363    }
364    return increment ? div + signum : div;
365  }
366
367  /**
368   * Returns {@code x mod m}, a non-negative value less than {@code m}. This differs from {@code x %
369   * m}, which might be negative.
370   *
371   * <p>For example:
372   *
373   * <pre>{@code
374   * mod(7, 4) == 3
375   * mod(-7, 4) == 1
376   * mod(-1, 4) == 3
377   * mod(-8, 4) == 0
378   * mod(8, 4) == 0
379   * }</pre>
380   *
381   * @throws ArithmeticException if {@code m <= 0}
382   * @see <a href="http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.17.3">
383   *     Remainder Operator</a>
384   */
385  public static int mod(int x, int m) {
386    if (m <= 0) {
387      throw new ArithmeticException("Modulus " + m + " must be > 0");
388    }
389    int result = x % m;
390    return (result >= 0) ? result : result + m;
391  }
392
393  /**
394   * Returns the greatest common divisor of {@code a, b}. Returns {@code 0} if {@code a == 0 && b ==
395   * 0}.
396   *
397   * @throws IllegalArgumentException if {@code a < 0} or {@code b < 0}
398   */
399  public static int gcd(int a, int b) {
400    /*
401     * The reason we require both arguments to be >= 0 is because otherwise, what do you return on
402     * gcd(0, Integer.MIN_VALUE)? BigInteger.gcd would return positive 2^31, but positive 2^31 isn't
403     * an int.
404     */
405    checkNonNegative("a", a);
406    checkNonNegative("b", b);
407    if (a == 0) {
408      // 0 % b == 0, so b divides a, but the converse doesn't hold.
409      // BigInteger.gcd is consistent with this decision.
410      return b;
411    } else if (b == 0) {
412      return a; // similar logic
413    }
414    /*
415     * Uses the binary GCD algorithm; see http://en.wikipedia.org/wiki/Binary_GCD_algorithm. This is
416     * >40% faster than the Euclidean algorithm in benchmarks.
417     */
418    int aTwos = Integer.numberOfTrailingZeros(a);
419    a >>= aTwos; // divide out all 2s
420    int bTwos = Integer.numberOfTrailingZeros(b);
421    b >>= bTwos; // divide out all 2s
422    while (a != b) { // both a, b are odd
423      // The key to the binary GCD algorithm is as follows:
424      // Both a and b are odd. Assume a > b; then gcd(a - b, b) = gcd(a, b).
425      // But in gcd(a - b, b), a - b is even and b is odd, so we can divide out powers of two.
426
427      // We bend over backwards to avoid branching, adapting a technique from
428      // http://graphics.stanford.edu/~seander/bithacks.html#IntegerMinOrMax
429
430      int delta = a - b; // can't overflow, since a and b are nonnegative
431
432      int minDeltaOrZero = delta & (delta >> (Integer.SIZE - 1));
433      // equivalent to Math.min(delta, 0)
434
435      a = delta - minDeltaOrZero - minDeltaOrZero; // sets a to Math.abs(a - b)
436      // a is now nonnegative and even
437
438      b += minDeltaOrZero; // sets b to min(old a, b)
439      a >>= Integer.numberOfTrailingZeros(a); // divide out all 2s, since 2 doesn't divide b
440    }
441    return a << min(aTwos, bTwos);
442  }
443
444  /**
445   * Returns the sum of {@code a} and {@code b}, provided it does not overflow.
446   *
447   * @throws ArithmeticException if {@code a + b} overflows in signed {@code int} arithmetic
448   */
449  public static int checkedAdd(int a, int b) {
450    long result = (long) a + b;
451    checkNoOverflow(result == (int) result, "checkedAdd", a, b);
452    return (int) result;
453  }
454
455  /**
456   * Returns the difference of {@code a} and {@code b}, provided it does not overflow.
457   *
458   * @throws ArithmeticException if {@code a - b} overflows in signed {@code int} arithmetic
459   */
460  public static int checkedSubtract(int a, int b) {
461    long result = (long) a - b;
462    checkNoOverflow(result == (int) result, "checkedSubtract", a, b);
463    return (int) result;
464  }
465
466  /**
467   * Returns the product of {@code a} and {@code b}, provided it does not overflow.
468   *
469   * @throws ArithmeticException if {@code a * b} overflows in signed {@code int} arithmetic
470   */
471  public static int checkedMultiply(int a, int b) {
472    long result = (long) a * b;
473    checkNoOverflow(result == (int) result, "checkedMultiply", a, b);
474    return (int) result;
475  }
476
477  /**
478   * Returns the {@code b} to the {@code k}th power, provided it does not overflow.
479   *
480   * <p>{@link #pow} may be faster, but does not check for overflow.
481   *
482   * @throws ArithmeticException if {@code b} to the {@code k}th power overflows in signed {@code
483   *     int} arithmetic
484   */
485  // Whenever both tests are cheap and functional, it's faster to use &, | instead of &&, ||
486  @SuppressWarnings("ShortCircuitBoolean")
487  public static int checkedPow(int b, int k) {
488    checkNonNegative("exponent", k);
489    switch (b) {
490      case 0:
491        return (k == 0) ? 1 : 0;
492      case 1:
493        return 1;
494      case (-1):
495        return ((k & 1) == 0) ? 1 : -1;
496      case 2:
497        checkNoOverflow(k < Integer.SIZE - 1, "checkedPow", b, k);
498        return 1 << k;
499      case (-2):
500        checkNoOverflow(k < Integer.SIZE, "checkedPow", b, k);
501        return ((k & 1) == 0) ? 1 << k : -1 << k;
502      default:
503        // continue below to handle the general case
504    }
505    int accum = 1;
506    while (true) {
507      switch (k) {
508        case 0:
509          return accum;
510        case 1:
511          return checkedMultiply(accum, b);
512        default:
513          if ((k & 1) != 0) {
514            accum = checkedMultiply(accum, b);
515          }
516          k >>= 1;
517          if (k > 0) {
518            checkNoOverflow(-FLOOR_SQRT_MAX_INT <= b & b <= FLOOR_SQRT_MAX_INT, "checkedPow", b, k);
519            b *= b;
520          }
521      }
522    }
523  }
524
525  /**
526   * Returns the sum of {@code a} and {@code b} unless it would overflow or underflow in which case
527   * {@code Integer.MAX_VALUE} or {@code Integer.MIN_VALUE} is returned, respectively.
528   *
529   * @since 20.0
530   */
531  public static int saturatedAdd(int a, int b) {
532    return Ints.saturatedCast((long) a + b);
533  }
534
535  /**
536   * Returns the difference of {@code a} and {@code b} unless it would overflow or underflow in
537   * which case {@code Integer.MAX_VALUE} or {@code Integer.MIN_VALUE} is returned, respectively.
538   *
539   * @since 20.0
540   */
541  public static int saturatedSubtract(int a, int b) {
542    return Ints.saturatedCast((long) a - b);
543  }
544
545  /**
546   * Returns the product of {@code a} and {@code b} unless it would overflow or underflow in which
547   * case {@code Integer.MAX_VALUE} or {@code Integer.MIN_VALUE} is returned, respectively.
548   *
549   * @since 20.0
550   */
551  public static int saturatedMultiply(int a, int b) {
552    return Ints.saturatedCast((long) a * b);
553  }
554
555  /**
556   * Returns the {@code b} to the {@code k}th power, unless it would overflow or underflow in which
557   * case {@code Integer.MAX_VALUE} or {@code Integer.MIN_VALUE} is returned, respectively.
558   *
559   * @since 20.0
560   */
561  // Whenever both tests are cheap and functional, it's faster to use &, | instead of &&, ||
562  @SuppressWarnings("ShortCircuitBoolean")
563  public static int saturatedPow(int b, int k) {
564    checkNonNegative("exponent", k);
565    switch (b) {
566      case 0:
567        return (k == 0) ? 1 : 0;
568      case 1:
569        return 1;
570      case (-1):
571        return ((k & 1) == 0) ? 1 : -1;
572      case 2:
573        if (k >= Integer.SIZE - 1) {
574          return Integer.MAX_VALUE;
575        }
576        return 1 << k;
577      case (-2):
578        if (k >= Integer.SIZE) {
579          return Integer.MAX_VALUE + (k & 1);
580        }
581        return ((k & 1) == 0) ? 1 << k : -1 << k;
582      default:
583        // continue below to handle the general case
584    }
585    int accum = 1;
586    // if b is negative and k is odd then the limit is MIN otherwise the limit is MAX
587    int limit = Integer.MAX_VALUE + ((b >>> Integer.SIZE - 1) & (k & 1));
588    while (true) {
589      switch (k) {
590        case 0:
591          return accum;
592        case 1:
593          return saturatedMultiply(accum, b);
594        default:
595          if ((k & 1) != 0) {
596            accum = saturatedMultiply(accum, b);
597          }
598          k >>= 1;
599          if (k > 0) {
600            if (-FLOOR_SQRT_MAX_INT > b | b > FLOOR_SQRT_MAX_INT) {
601              return limit;
602            }
603            b *= b;
604          }
605      }
606    }
607  }
608
609  @VisibleForTesting static final int FLOOR_SQRT_MAX_INT = 46340;
610
611  /**
612   * Returns {@code n!}, that is, the product of the first {@code n} positive integers, {@code 1} if
613   * {@code n == 0}, or {@link Integer#MAX_VALUE} if the result does not fit in a {@code int}.
614   *
615   * @throws IllegalArgumentException if {@code n < 0}
616   */
617  public static int factorial(int n) {
618    checkNonNegative("n", n);
619    return (n < factorials.length) ? factorials[n] : Integer.MAX_VALUE;
620  }
621
622  private static final int[] factorials = {
623    1,
624    1,
625    1 * 2,
626    1 * 2 * 3,
627    1 * 2 * 3 * 4,
628    1 * 2 * 3 * 4 * 5,
629    1 * 2 * 3 * 4 * 5 * 6,
630    1 * 2 * 3 * 4 * 5 * 6 * 7,
631    1 * 2 * 3 * 4 * 5 * 6 * 7 * 8,
632    1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9,
633    1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10,
634    1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10 * 11,
635    1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10 * 11 * 12
636  };
637
638  /**
639   * Returns {@code n} choose {@code k}, also known as the binomial coefficient of {@code n} and
640   * {@code k}, or {@link Integer#MAX_VALUE} if the result does not fit in an {@code int}.
641   *
642   * @throws IllegalArgumentException if {@code n < 0}, {@code k < 0} or {@code k > n}
643   */
644  public static int binomial(int n, int k) {
645    checkNonNegative("n", n);
646    checkNonNegative("k", k);
647    checkArgument(k <= n, "k (%s) > n (%s)", k, n);
648    if (k > (n >> 1)) {
649      k = n - k;
650    }
651    if (k >= biggestBinomials.length || n > biggestBinomials[k]) {
652      return Integer.MAX_VALUE;
653    }
654    switch (k) {
655      case 0:
656        return 1;
657      case 1:
658        return n;
659      default:
660        long result = 1;
661        for (int i = 0; i < k; i++) {
662          result *= n - i;
663          result /= i + 1;
664        }
665        return (int) result;
666    }
667  }
668
669  // binomial(biggestBinomials[k], k) fits in an int, but not binomial(biggestBinomials[k]+1,k).
670  @VisibleForTesting
671  static int[] biggestBinomials = {
672    Integer.MAX_VALUE,
673    Integer.MAX_VALUE,
674    65536,
675    2345,
676    477,
677    193,
678    110,
679    75,
680    58,
681    49,
682    43,
683    39,
684    37,
685    35,
686    34,
687    34,
688    33
689  };
690
691  /**
692   * Returns the arithmetic mean of {@code x} and {@code y}, rounded towards negative infinity. This
693   * method is overflow resilient.
694   *
695   * @since 14.0
696   */
697  public static int mean(int x, int y) {
698    // Efficient method for computing the arithmetic mean.
699    // The alternative (x + y) / 2 fails for large values.
700    // The alternative (x + y) >>> 1 fails for negative values.
701    return (x & y) + ((x ^ y) >> 1);
702  }
703
704  /**
705   * Returns {@code true} if {@code n} is a <a
706   * href="http://mathworld.wolfram.com/PrimeNumber.html">prime number</a>: an integer <i>greater
707   * than one</i> that cannot be factored into a product of <i>smaller</i> positive integers.
708   * Returns {@code false} if {@code n} is zero, one, or a composite number (one which <i>can</i> be
709   * factored into smaller positive integers).
710   *
711   * <p>To test larger numbers, use {@link LongMath#isPrime} or {@link BigInteger#isProbablePrime}.
712   *
713   * @throws IllegalArgumentException if {@code n} is negative
714   * @since 20.0
715   */
716  @GwtIncompatible // TODO
717  public static boolean isPrime(int n) {
718    return LongMath.isPrime(n);
719  }
720
721  private IntMath() {}
722}