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 com.google.errorprone.annotations.InlineMe;
033import java.math.BigInteger;
034import java.math.RoundingMode;
035
036/**
037 * A class for arithmetic on values of type {@code int}. Where possible, methods are defined and
038 * named analogously to their {@code BigInteger} counterparts.
039 *
040 * <p>The implementations of many methods in this class are based on material from Henry S. Warren,
041 * Jr.'s <i>Hacker's Delight</i>, (Addison Wesley, 2002).
042 *
043 * <p>Similar functionality for {@code long} and for {@link BigInteger} can be found in {@link
044 * LongMath} and {@link BigIntegerMath} respectively. For other common operations on {@code int}
045 * values, see {@link com.google.common.primitives.Ints}.
046 *
047 * @author Louis Wasserman
048 * @since 11.0
049 */
050@GwtCompatible
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}. If the {@code RoundingMode} is {@link RoundingMode#DOWN}, then this method is
305   * equivalent to regular Java division, {@code p / q}; and if it is {@link RoundingMode#FLOOR},
306   * then this method is equivalent to {@link Math#floorDiv(int,int) Math.floorDiv}{@code (p, q)}.
307   *
308   * @throws ArithmeticException if {@code q == 0}, or if {@code mode == UNNECESSARY} and {@code a}
309   *     is not an integer multiple of {@code b}
310   */
311  // Whenever both tests are cheap and functional, it's faster to use &, | instead of &&, ||
312  @SuppressWarnings({"fallthrough", "ShortCircuitBoolean"})
313  public static int divide(int p, int q, RoundingMode mode) {
314    checkNotNull(mode);
315    if (q == 0) {
316      throw new ArithmeticException("/ by zero"); // for GWT
317    }
318    int div = p / q;
319    int rem = p - q * div; // equal to p % q
320
321    if (rem == 0) {
322      return div;
323    }
324
325    /*
326     * Normal Java division rounds towards 0, consistently with RoundingMode.DOWN. We just have to
327     * deal with the cases where rounding towards 0 is wrong, which typically depends on the sign of
328     * p / q.
329     *
330     * signum is 1 if p and q are both nonnegative or both negative, and -1 otherwise.
331     */
332    int signum = 1 | ((p ^ q) >> (Integer.SIZE - 1));
333    boolean increment;
334    switch (mode) {
335      case UNNECESSARY:
336        checkRoundingUnnecessary(rem == 0);
337      // fall through
338      case DOWN:
339        increment = false;
340        break;
341      case UP:
342        increment = true;
343        break;
344      case CEILING:
345        increment = signum > 0;
346        break;
347      case FLOOR:
348        increment = signum < 0;
349        break;
350      case HALF_EVEN:
351      case HALF_DOWN:
352      case HALF_UP:
353        int absRem = abs(rem);
354        int cmpRemToHalfDivisor = absRem - (abs(q) - absRem);
355        // subtracting two nonnegative ints can't overflow
356        // cmpRemToHalfDivisor has the same sign as compare(abs(rem), abs(q) / 2).
357        if (cmpRemToHalfDivisor == 0) { // exactly on the half mark
358          increment = (mode == HALF_UP || (mode == HALF_EVEN & (div & 1) != 0));
359        } else {
360          increment = cmpRemToHalfDivisor > 0; // closer to the UP value
361        }
362        break;
363      default:
364        throw new AssertionError();
365    }
366    return increment ? div + signum : div;
367  }
368
369  /**
370   * Returns {@code x mod m}, a non-negative value less than {@code m}. This differs from {@code x %
371   * m}, which might be negative. This method is equivalent to {@code Math.floorMod(x, m)} except
372   * that that method also allows negative {@code m}. {@code Math.floorMod} should be preferred when
373   * {@code m} is known to be positive.
374   *
375   * <p>For example:
376   *
377   * {@snippet :
378   * mod(7, 4) == 3
379   * mod(-7, 4) == 1
380   * mod(-1, 4) == 3
381   * mod(-8, 4) == 0
382   * mod(8, 4) == 0
383   * }
384   *
385   * @throws ArithmeticException if {@code m <= 0}
386   * @see <a href="https://docs.oracle.com/javase/specs/jls/se26/html/jls-15.html#jls-15.17.3">
387   *     Remainder Operator</a>
388   */
389  public static int mod(int x, int m) {
390    if (m <= 0) {
391      throw new ArithmeticException("Modulus " + m + " must be > 0");
392    }
393    return Math.floorMod(x, m);
394  }
395
396  /**
397   * Returns the greatest common divisor of {@code a, b}. Returns {@code 0} if {@code a == 0 && b ==
398   * 0}.
399   *
400   * @throws IllegalArgumentException if {@code a < 0} or {@code b < 0}
401   */
402  public static int gcd(int a, int b) {
403    /*
404     * The reason we require both arguments to be >= 0 is because otherwise, what do you return on
405     * gcd(0, Integer.MIN_VALUE)? BigInteger.gcd would return positive 2^31, but positive 2^31 isn't
406     * an int.
407     */
408    checkNonNegative("a", a);
409    checkNonNegative("b", b);
410    if (a == 0) {
411      // 0 % b == 0, so b divides a, but the converse doesn't hold.
412      // BigInteger.gcd is consistent with this decision.
413      return b;
414    } else if (b == 0) {
415      return a; // similar logic
416    }
417    /*
418     * Uses the binary GCD algorithm; see http://en.wikipedia.org/wiki/Binary_GCD_algorithm. This is
419     * >40% faster than the Euclidean algorithm in benchmarks.
420     */
421    int aTwos = Integer.numberOfTrailingZeros(a);
422    a >>= aTwos; // divide out all 2s
423    int bTwos = Integer.numberOfTrailingZeros(b);
424    b >>= bTwos; // divide out all 2s
425    while (a != b) { // both a, b are odd
426      // The key to the binary GCD algorithm is as follows:
427      // Both a and b are odd. Assume a > b; then gcd(a - b, b) = gcd(a, b).
428      // But in gcd(a - b, b), a - b is even and b is odd, so we can divide out powers of two.
429
430      // We bend over backwards to avoid branching, adapting a technique from
431      // http://graphics.stanford.edu/~seander/bithacks.html#IntegerMinOrMax
432
433      int delta = a - b; // can't overflow, since a and b are nonnegative
434
435      int minDeltaOrZero = delta & (delta >> (Integer.SIZE - 1));
436      // equivalent to Math.min(delta, 0)
437
438      a = delta - minDeltaOrZero - minDeltaOrZero; // sets a to Math.abs(a - b)
439      // a is now nonnegative and even
440
441      b += minDeltaOrZero; // sets b to min(old a, b)
442      a >>= Integer.numberOfTrailingZeros(a); // divide out all 2s, since 2 doesn't divide b
443    }
444    return a << min(aTwos, bTwos);
445  }
446
447  /**
448   * Returns the sum of {@code a} and {@code b}, provided it does not overflow.
449   *
450   * <p><b>Note:</b> this method is now unnecessary and should be treated as deprecated; use {@link
451   * Math#addExact(int, int)} instead.
452   *
453   * @throws ArithmeticException if {@code a + b} overflows in signed {@code int} arithmetic
454   */
455  @InlineMe(replacement = "Math.addExact(a, b)")
456  public static int checkedAdd(int a, int b) {
457    return Math.addExact(a, b);
458  }
459
460  /**
461   * Returns the difference of {@code a} and {@code b}, provided it does not overflow.
462   *
463   * <p><b>Note:</b> this method is now unnecessary and should be treated as deprecated; use {@link
464   * Math#subtractExact(int, int)} instead.
465   *
466   * @throws ArithmeticException if {@code a - b} overflows in signed {@code int} arithmetic
467   */
468  @InlineMe(replacement = "Math.subtractExact(a, b)")
469  public static int checkedSubtract(int a, int b) {
470    return Math.subtractExact(a, b);
471  }
472
473  /**
474   * Returns the product of {@code a} and {@code b}, provided it does not overflow.
475   *
476   * <p><b>Note:</b> this method is now unnecessary and should be treated as deprecated; use {@link
477   * Math#multiplyExact(int, int)} instead.
478   *
479   * @throws ArithmeticException if {@code a * b} overflows in signed {@code int} arithmetic
480   */
481  @InlineMe(replacement = "Math.multiplyExact(a, b)")
482  public static int checkedMultiply(int a, int b) {
483    return Math.multiplyExact(a, b);
484  }
485
486  /**
487   * Returns the {@code b} to the {@code k}th power, provided it does not overflow.
488   *
489   * <p>{@link #pow} may be faster, but does not check for overflow.
490   *
491   * @throws ArithmeticException if {@code b} to the {@code k}th power overflows in signed {@code
492   *     int} arithmetic
493   */
494  // Whenever both tests are cheap and functional, it's faster to use &, | instead of &&, ||
495  @SuppressWarnings("ShortCircuitBoolean")
496  public static int checkedPow(int b, int k) {
497    checkNonNegative("exponent", k);
498    switch (b) {
499      case 0:
500        return (k == 0) ? 1 : 0;
501      case 1:
502        return 1;
503      case -1:
504        return ((k & 1) == 0) ? 1 : -1;
505      case 2:
506        checkNoOverflow(k < Integer.SIZE - 1, "checkedPow", b, k);
507        return 1 << k;
508      case -2:
509        checkNoOverflow(k < Integer.SIZE, "checkedPow", b, k);
510        return ((k & 1) == 0) ? 1 << k : -1 << k;
511      default:
512        // continue below to handle the general case
513    }
514    int accum = 1;
515    while (true) {
516      switch (k) {
517        case 0:
518          return accum;
519        case 1:
520          return Math.multiplyExact(accum, b);
521        default:
522          if ((k & 1) != 0) {
523            accum = Math.multiplyExact(accum, b);
524          }
525          k >>= 1;
526          if (k > 0) {
527            checkNoOverflow(-FLOOR_SQRT_MAX_INT <= b & b <= FLOOR_SQRT_MAX_INT, "checkedPow", b, k);
528            b *= b;
529          }
530      }
531    }
532  }
533
534  /**
535   * Returns the sum of {@code a} and {@code b} unless it would overflow or underflow in which case
536   * {@code Integer.MAX_VALUE} or {@code Integer.MIN_VALUE} is returned, respectively.
537   *
538   * @since 20.0
539   */
540  public static int saturatedAdd(int a, int b) {
541    return Ints.saturatedCast((long) a + b);
542  }
543
544  /**
545   * Returns the difference of {@code a} and {@code b} unless it would overflow or underflow in
546   * which case {@code Integer.MAX_VALUE} or {@code Integer.MIN_VALUE} is returned, respectively.
547   *
548   * @since 20.0
549   */
550  public static int saturatedSubtract(int a, int b) {
551    return Ints.saturatedCast((long) a - b);
552  }
553
554  /**
555   * Returns the product of {@code a} and {@code b} unless it would overflow or underflow in which
556   * case {@code Integer.MAX_VALUE} or {@code Integer.MIN_VALUE} is returned, respectively.
557   *
558   * @since 20.0
559   */
560  public static int saturatedMultiply(int a, int b) {
561    return Ints.saturatedCast((long) a * b);
562  }
563
564  /**
565   * Returns the {@code b} to the {@code k}th power, unless it would overflow or underflow in which
566   * case {@code Integer.MAX_VALUE} or {@code Integer.MIN_VALUE} is returned, respectively.
567   *
568   * @since 20.0
569   */
570  // Whenever both tests are cheap and functional, it's faster to use &, | instead of &&, ||
571  @SuppressWarnings("ShortCircuitBoolean")
572  public static int saturatedPow(int b, int k) {
573    checkNonNegative("exponent", k);
574    switch (b) {
575      case 0:
576        return (k == 0) ? 1 : 0;
577      case 1:
578        return 1;
579      case -1:
580        return ((k & 1) == 0) ? 1 : -1;
581      case 2:
582        if (k >= Integer.SIZE - 1) {
583          return Integer.MAX_VALUE;
584        }
585        return 1 << k;
586      case -2:
587        if (k >= Integer.SIZE) {
588          return Integer.MAX_VALUE + (k & 1);
589        }
590        return ((k & 1) == 0) ? 1 << k : -1 << k;
591      default:
592        // continue below to handle the general case
593    }
594    int accum = 1;
595    // if b is negative and k is odd then the limit is MIN otherwise the limit is MAX
596    int limit = Integer.MAX_VALUE + ((b >>> (Integer.SIZE - 1)) & (k & 1));
597    while (true) {
598      switch (k) {
599        case 0:
600          return accum;
601        case 1:
602          return saturatedMultiply(accum, b);
603        default:
604          if ((k & 1) != 0) {
605            accum = saturatedMultiply(accum, b);
606          }
607          k >>= 1;
608          if (k > 0) {
609            if (-FLOOR_SQRT_MAX_INT > b | b > FLOOR_SQRT_MAX_INT) {
610              return limit;
611            }
612            b *= b;
613          }
614      }
615    }
616  }
617
618  @VisibleForTesting static final int FLOOR_SQRT_MAX_INT = 46340;
619
620  /**
621   * Returns {@code n!}, that is, the product of the first {@code n} positive integers, {@code 1} if
622   * {@code n == 0}, or {@link Integer#MAX_VALUE} if the result does not fit in a {@code int}.
623   *
624   * @throws IllegalArgumentException if {@code n < 0}
625   */
626  public static int factorial(int n) {
627    checkNonNegative("n", n);
628    return (n < factorials.length) ? factorials[n] : Integer.MAX_VALUE;
629  }
630
631  private static final int[] factorials = {
632    1,
633    1,
634    1 * 2,
635    1 * 2 * 3,
636    1 * 2 * 3 * 4,
637    1 * 2 * 3 * 4 * 5,
638    1 * 2 * 3 * 4 * 5 * 6,
639    1 * 2 * 3 * 4 * 5 * 6 * 7,
640    1 * 2 * 3 * 4 * 5 * 6 * 7 * 8,
641    1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9,
642    1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10,
643    1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10 * 11,
644    1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10 * 11 * 12
645  };
646
647  /**
648   * Returns {@code n} choose {@code k}, also known as the binomial coefficient of {@code n} and
649   * {@code k}, or {@link Integer#MAX_VALUE} if the result does not fit in an {@code int}.
650   *
651   * @throws IllegalArgumentException if {@code n < 0}, {@code k < 0} or {@code k > n}
652   */
653  public static int binomial(int n, int k) {
654    checkNonNegative("n", n);
655    checkNonNegative("k", k);
656    checkArgument(k <= n, "k (%s) > n (%s)", k, n);
657    if (k > (n >> 1)) {
658      k = n - k;
659    }
660    if (k >= biggestBinomials.length || n > biggestBinomials[k]) {
661      return Integer.MAX_VALUE;
662    }
663    switch (k) {
664      case 0:
665        return 1;
666      case 1:
667        return n;
668      default:
669        long result = 1;
670        for (int i = 0; i < k; i++) {
671          result *= n - i;
672          result /= i + 1;
673        }
674        return (int) result;
675    }
676  }
677
678  // binomial(biggestBinomials[k], k) fits in an int, but not binomial(biggestBinomials[k]+1,k).
679  @VisibleForTesting
680  static final int[] biggestBinomials = {
681    Integer.MAX_VALUE,
682    Integer.MAX_VALUE,
683    65536,
684    2345,
685    477,
686    193,
687    110,
688    75,
689    58,
690    49,
691    43,
692    39,
693    37,
694    35,
695    34,
696    34,
697    33
698  };
699
700  /**
701   * Returns the arithmetic mean of {@code x} and {@code y}, rounded towards negative infinity. This
702   * method is overflow resilient.
703   *
704   * @since 14.0
705   */
706  public static int mean(int x, int y) {
707    // Efficient method for computing the arithmetic mean.
708    // The alternative (x + y) / 2 fails for large values.
709    // The alternative (x + y) >>> 1 fails for negative values.
710    return (x & y) + ((x ^ y) >> 1);
711  }
712
713  /**
714   * Returns {@code true} if {@code n} is a <a
715   * href="http://mathworld.wolfram.com/PrimeNumber.html">prime number</a>: an integer <i>greater
716   * than one</i> that cannot be factored into a product of <i>smaller</i> positive integers.
717   * Returns {@code false} if {@code n} is zero, one, or a composite number (one which <i>can</i> be
718   * factored into smaller positive integers).
719   *
720   * <p>To test larger numbers, use {@link LongMath#isPrime} or {@link BigInteger#isProbablePrime}.
721   *
722   * @throws IllegalArgumentException if {@code n} is negative
723   * @since 20.0
724   */
725  @GwtIncompatible // TODO
726  public static boolean isPrime(int n) {
727    return LongMath.isPrime(n);
728  }
729
730  /**
731   * Returns the closest representable {@code int} to the absolute value of {@code x}.
732   *
733   * <p>This is the same thing as the true absolute value of {@code x} except in the case when
734   * {@code x} is {@link Integer#MIN_VALUE}, in which case this returns {@link Integer#MAX_VALUE}.
735   * (Note that {@code Integer.MAX_VALUE} is mathematically equal to {@code -Integer.MIN_VALUE -
736   * 1}.)
737   *
738   * <p>There are three common APIs for determining the absolute value of an integer, all of which
739   * behave identically except when passed {@code Integer.MIN_VALUE}. Those methods are:
740   *
741   * <ul>
742   *   <li>{@link Math#abs(int)}, which returns {@code Integer.MIN_VALUE} when passed {@code
743   *       Integer.MIN_VALUE}
744   *   <li>{@link Math#absExact(int)}, which throws {@link ArithmeticException} when passed {@code
745   *       Integer.MIN_VALUE}
746   *   <li>this method, {@code IntMath.saturatedAbs(int)}, which returns {@code Integer.MAX_VALUE}
747   *       when passed {@code Integer.MIN_VALUE}
748   * </ul>
749   *
750   * <p>Note that if your only goal is to turn a well-distributed {@code int} (such as a random
751   * number or hash code) into a well-distributed nonnegative number, the most even distribution is
752   * achieved not by this method or other absolute value methods, but by {@code x &
753   * Integer.MAX_VALUE}.
754   *
755   * @since 33.5.0
756   */
757  public static int saturatedAbs(int x) {
758    return (x == Integer.MIN_VALUE) ? Integer.MAX_VALUE : Math.abs(x);
759  }
760
761  private IntMath() {}
762}