001    /*
002     * Copyright (C) 2011 The Guava Authors
003     *
004     * Licensed under the Apache License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     * http://www.apache.org/licenses/LICENSE-2.0
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    
017    package com.google.common.math;
018    
019    import static com.google.common.base.Preconditions.checkArgument;
020    import static com.google.common.base.Preconditions.checkNotNull;
021    import static com.google.common.math.MathPreconditions.checkNoOverflow;
022    import static com.google.common.math.MathPreconditions.checkNonNegative;
023    import static com.google.common.math.MathPreconditions.checkPositive;
024    import static com.google.common.math.MathPreconditions.checkRoundingUnnecessary;
025    import static java.lang.Math.abs;
026    import static java.lang.Math.min;
027    import static java.math.RoundingMode.HALF_EVEN;
028    import static java.math.RoundingMode.HALF_UP;
029    
030    import com.google.common.annotations.Beta;
031    import com.google.common.annotations.GwtCompatible;
032    import com.google.common.annotations.GwtIncompatible;
033    import com.google.common.annotations.VisibleForTesting;
034    
035    import java.math.BigInteger;
036    import java.math.RoundingMode;
037    
038    /**
039     * A class for arithmetic on values of type {@code long}. Where possible, methods are defined and
040     * named analogously to their {@code BigInteger} counterparts.
041     *
042     * <p>The implementations of many methods in this class are based on material from Henry S. Warren,
043     * Jr.'s <i>Hacker's Delight</i>, (Addison Wesley, 2002).
044     *
045     * <p>Similar functionality for {@code int} and for {@link BigInteger} can be found in
046     * {@link IntMath} and {@link BigIntegerMath} respectively.  For other common operations on
047     * {@code long} values, see {@link com.google.common.primitives.Longs}.
048     *
049     * @author Louis Wasserman
050     * @since 11.0
051     */
052    @Beta
053    @GwtCompatible(emulated = true)
054    public final class LongMath {
055      // NOTE: Whenever both tests are cheap and functional, it's faster to use &, | instead of &&, ||
056    
057      /**
058       * Returns {@code true} if {@code x} represents a power of two.
059       *
060       * <p>This differs from {@code Long.bitCount(x) == 1}, because
061       * {@code Long.bitCount(Long.MIN_VALUE) == 1}, but {@link Long#MIN_VALUE} is not a power of two.
062       */
063      public static boolean isPowerOfTwo(long x) {
064        return x > 0 & (x & (x - 1)) == 0;
065      }
066    
067      /**
068       * Returns the base-2 logarithm of {@code x}, rounded according to the specified rounding mode.
069       *
070       * @throws IllegalArgumentException if {@code x <= 0}
071       * @throws ArithmeticException if {@code mode} is {@link RoundingMode#UNNECESSARY} and {@code x}
072       *         is not a power of two
073       */
074      @SuppressWarnings("fallthrough")
075      public static int log2(long x, RoundingMode mode) {
076        checkPositive("x", x);
077        switch (mode) {
078          case UNNECESSARY:
079            checkRoundingUnnecessary(isPowerOfTwo(x));
080            // fall through
081          case DOWN:
082          case FLOOR:
083            return (Long.SIZE - 1) - Long.numberOfLeadingZeros(x);
084    
085          case UP:
086          case CEILING:
087            return Long.SIZE - Long.numberOfLeadingZeros(x - 1);
088    
089          case HALF_DOWN:
090          case HALF_UP:
091          case HALF_EVEN:
092            // Since sqrt(2) is irrational, log2(x) - logFloor cannot be exactly 0.5
093            int leadingZeros = Long.numberOfLeadingZeros(x);
094            long cmp = MAX_POWER_OF_SQRT2_UNSIGNED >>> leadingZeros;
095            // floor(2^(logFloor + 0.5))
096            int logFloor = (Long.SIZE - 1) - leadingZeros;
097            return (x <= cmp) ? logFloor : logFloor + 1;
098    
099          default:
100            throw new AssertionError("impossible");
101        }
102      }
103    
104      /** The biggest half power of two that fits into an unsigned long */
105      @VisibleForTesting static final long MAX_POWER_OF_SQRT2_UNSIGNED = 0xB504F333F9DE6484L;
106    
107      /**
108       * Returns the base-10 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 ten
113       */
114      @GwtIncompatible("TODO")
115      @SuppressWarnings("fallthrough")
116      public static int log10(long x, RoundingMode mode) {
117        checkPositive("x", x);
118        if (fitsInInt(x)) {
119          return IntMath.log10((int) x, mode);
120        }
121        int logFloor = log10Floor(x);
122        long floorPow = POWERS_OF_10[logFloor];
123        switch (mode) {
124          case UNNECESSARY:
125            checkRoundingUnnecessary(x == floorPow);
126            // fall through
127          case FLOOR:
128          case DOWN:
129            return logFloor;
130          case CEILING:
131          case UP:
132            return (x == floorPow) ? logFloor : logFloor + 1;
133          case HALF_DOWN:
134          case HALF_UP:
135          case HALF_EVEN:
136            // sqrt(10) is irrational, so log10(x)-logFloor is never exactly 0.5
137            return (x <= HALF_POWERS_OF_10[logFloor]) ? logFloor : logFloor + 1;
138          default:
139            throw new AssertionError();
140        }
141      }
142    
143      @GwtIncompatible("TODO")
144      static int log10Floor(long x) {
145        /*
146         * Based on Hacker's Delight Fig. 11-5, the two-table-lookup, branch-free implementation.
147         *
148         * The key idea is that based on the number of leading zeros (equivalently, floor(log2(x))),
149         * we can narrow the possible floor(log10(x)) values to two.  For example, if floor(log2(x))
150         * is 6, then 64 <= x < 128, so floor(log10(x)) is either 1 or 2.
151         */
152        int y = MAX_LOG10_FOR_LEADING_ZEROS[Long.numberOfLeadingZeros(x)];
153        // y is the higher of the two possible values of floor(log10(x))
154    
155        long sgn = (x - POWERS_OF_10[y]) >>> (Long.SIZE - 1);
156        /*
157         * sgn is the sign bit of x - 10^y; it is 1 if x < 10^y, and 0 otherwise. If x < 10^y, then we
158         * want the lower of the two possible values, or y - 1, otherwise, we want y.
159         */
160        return y - (int) sgn;
161      }
162    
163      // MAX_LOG10_FOR_LEADING_ZEROS[i] == floor(log10(2^(Long.SIZE - i)))
164      @VisibleForTesting static final byte[] MAX_LOG10_FOR_LEADING_ZEROS = {
165          19, 18, 18, 18, 18, 17, 17, 17, 16, 16, 16, 15, 15, 15, 15, 14, 14, 14, 13, 13, 13, 12, 12,
166          12, 12, 11, 11, 11, 10, 10, 10, 9, 9, 9, 9, 8, 8, 8, 7, 7, 7, 6, 6, 6, 6, 5, 5, 5, 4, 4, 4,
167          3, 3, 3, 3, 2, 2, 2, 1, 1, 1, 0, 0, 0 };
168    
169      @GwtIncompatible("TODO")
170      @VisibleForTesting
171      static final long[] POWERS_OF_10 = {
172        1L,
173        10L,
174        100L,
175        1000L,
176        10000L,
177        100000L,
178        1000000L,
179        10000000L,
180        100000000L,
181        1000000000L,
182        10000000000L,
183        100000000000L,
184        1000000000000L,
185        10000000000000L,
186        100000000000000L,
187        1000000000000000L,
188        10000000000000000L,
189        100000000000000000L,
190        1000000000000000000L
191      };
192    
193      // HALF_POWERS_OF_10[i] = largest long less than 10^(i + 0.5)
194      @GwtIncompatible("TODO")
195      @VisibleForTesting
196      static final long[] HALF_POWERS_OF_10 = {
197        3L,
198        31L,
199        316L,
200        3162L,
201        31622L,
202        316227L,
203        3162277L,
204        31622776L,
205        316227766L,
206        3162277660L,
207        31622776601L,
208        316227766016L,
209        3162277660168L,
210        31622776601683L,
211        316227766016837L,
212        3162277660168379L,
213        31622776601683793L,
214        316227766016837933L,
215        3162277660168379331L
216      };
217    
218      /**
219       * Returns {@code b} to the {@code k}th power. Even if the result overflows, it will be equal to
220       * {@code BigInteger.valueOf(b).pow(k).longValue()}. This implementation runs in {@code O(log k)}
221       * time.
222       *
223       * @throws IllegalArgumentException if {@code k < 0}
224       */
225      @GwtIncompatible("TODO")
226      public static long pow(long b, int k) {
227        checkNonNegative("exponent", k);
228        if (-2 <= b && b <= 2) {
229          switch ((int) b) {
230            case 0:
231              return (k == 0) ? 1 : 0;
232            case 1:
233              return 1;
234            case (-1):
235              return ((k & 1) == 0) ? 1 : -1;
236            case 2:
237              return (k < Long.SIZE) ? 1L << k : 0;
238            case (-2):
239              if (k < Long.SIZE) {
240                return ((k & 1) == 0) ? 1L << k : -(1L << k);
241              } else {
242                return 0;
243              }
244          }
245        }
246        for (long accum = 1;; k >>= 1) {
247          switch (k) {
248            case 0:
249              return accum;
250            case 1:
251              return accum * b;
252            default:
253              accum *= ((k & 1) == 0) ? 1 : b;
254              b *= b;
255          }
256        }
257      }
258    
259      /**
260       * Returns the square root of {@code x}, rounded with the specified rounding mode.
261       *
262       * @throws IllegalArgumentException if {@code x < 0}
263       * @throws ArithmeticException if {@code mode} is {@link RoundingMode#UNNECESSARY} and
264       *         {@code sqrt(x)} is not an integer
265       */
266      @GwtIncompatible("TODO")
267      @SuppressWarnings("fallthrough")
268      public static long sqrt(long x, RoundingMode mode) {
269        checkNonNegative("x", x);
270        if (fitsInInt(x)) {
271          return IntMath.sqrt((int) x, mode);
272        }
273        long sqrtFloor = sqrtFloor(x);
274        switch (mode) {
275          case UNNECESSARY:
276            checkRoundingUnnecessary(sqrtFloor * sqrtFloor == x); // fall through
277          case FLOOR:
278          case DOWN:
279            return sqrtFloor;
280          case CEILING:
281          case UP:
282            return (sqrtFloor * sqrtFloor == x) ? sqrtFloor : sqrtFloor + 1;
283          case HALF_DOWN:
284          case HALF_UP:
285          case HALF_EVEN:
286            long halfSquare = sqrtFloor * sqrtFloor + sqrtFloor;
287            /*
288             * We wish to test whether or not x <= (sqrtFloor + 0.5)^2 = halfSquare + 0.25. Since both
289             * x and halfSquare are integers, this is equivalent to testing whether or not x <=
290             * halfSquare. (We have to deal with overflow, though.)
291             */
292            return (halfSquare >= x | halfSquare < 0) ? sqrtFloor : sqrtFloor + 1;
293          default:
294            throw new AssertionError();
295        }
296      }
297    
298      @GwtIncompatible("TODO")
299      private static long sqrtFloor(long x) {
300        // Hackers's Delight, Figure 11-1
301        long sqrt0 = (long) Math.sqrt(x);
302        // Precision can be lost in the cast to double, so we use this as a starting estimate.
303        long sqrt1 = (sqrt0 + (x / sqrt0)) >> 1;
304        if (sqrt1 == sqrt0) {
305          return sqrt0;
306        }
307        do {
308          sqrt0 = sqrt1;
309          sqrt1 = (sqrt0 + (x / sqrt0)) >> 1;
310        } while (sqrt1 < sqrt0);
311        return sqrt0;
312      }
313    
314      /**
315       * Returns the result of dividing {@code p} by {@code q}, rounding using the specified
316       * {@code RoundingMode}.
317       *
318       * @throws ArithmeticException if {@code q == 0}, or if {@code mode == UNNECESSARY} and {@code a}
319       *         is not an integer multiple of {@code b}
320       */
321      @GwtIncompatible("TODO")
322      @SuppressWarnings("fallthrough")
323      public static long divide(long p, long q, RoundingMode mode) {
324        checkNotNull(mode);
325        long div = p / q; // throws if q == 0
326        long rem = p - q * div; // equals p % q
327    
328        if (rem == 0) {
329          return div;
330        }
331    
332        /*
333         * Normal Java division rounds towards 0, consistently with RoundingMode.DOWN. We just have to
334         * deal with the cases where rounding towards 0 is wrong, which typically depends on the sign of
335         * p / q.
336         *
337         * signum is 1 if p and q are both nonnegative or both negative, and -1 otherwise.
338         */
339        int signum = 1 | (int) ((p ^ q) >> (Long.SIZE - 1));
340        boolean increment;
341        switch (mode) {
342          case UNNECESSARY:
343            checkRoundingUnnecessary(rem == 0);
344            // fall through
345          case DOWN:
346            increment = false;
347            break;
348          case UP:
349            increment = true;
350            break;
351          case CEILING:
352            increment = signum > 0;
353            break;
354          case FLOOR:
355            increment = signum < 0;
356            break;
357          case HALF_EVEN:
358          case HALF_DOWN:
359          case HALF_UP:
360            long absRem = abs(rem);
361            long cmpRemToHalfDivisor = absRem - (abs(q) - absRem);
362            // subtracting two nonnegative longs can't overflow
363            // cmpRemToHalfDivisor has the same sign as compare(abs(rem), abs(q) / 2).
364            if (cmpRemToHalfDivisor == 0) { // exactly on the half mark
365              increment = (mode == HALF_UP | (mode == HALF_EVEN & (div & 1) != 0));
366            } else {
367              increment = cmpRemToHalfDivisor > 0; // closer to the UP value
368            }
369            break;
370          default:
371            throw new AssertionError();
372        }
373        return increment ? div + signum : div;
374      }
375    
376      /**
377       * Returns {@code x mod m}. This differs from {@code x % m} in that it always returns a
378       * non-negative result.
379       *
380       * <p>For example:
381       *
382       * <pre> {@code
383       *
384       * mod(7, 4) == 3
385       * mod(-7, 4) == 1
386       * mod(-1, 4) == 3
387       * mod(-8, 4) == 0
388       * mod(8, 4) == 0}</pre>
389       *
390       * @throws ArithmeticException if {@code m <= 0}
391       */
392      @GwtIncompatible("TODO")
393      public static int mod(long x, int m) {
394        // Cast is safe because the result is guaranteed in the range [0, m)
395        return (int) mod(x, (long) m);
396      }
397    
398      /**
399       * Returns {@code x mod m}. This differs from {@code x % m} in that it always returns a
400       * non-negative result.
401       *
402       * <p>For example:
403       *
404       * <pre> {@code
405       *
406       * mod(7, 4) == 3
407       * mod(-7, 4) == 1
408       * mod(-1, 4) == 3
409       * mod(-8, 4) == 0
410       * mod(8, 4) == 0}</pre>
411       *
412       * @throws ArithmeticException if {@code m <= 0}
413       */
414      @GwtIncompatible("TODO")
415      public static long mod(long x, long m) {
416        if (m <= 0) {
417          throw new ArithmeticException("Modulus " + m + " must be > 0");
418        }
419        long result = x % m;
420        return (result >= 0) ? result : result + m;
421      }
422    
423      /**
424       * Returns the greatest common divisor of {@code a, b}. Returns {@code 0} if
425       * {@code a == 0 && b == 0}.
426       *
427       * @throws IllegalArgumentException if {@code a < 0} or {@code b < 0}
428       */
429      @GwtIncompatible("TODO")
430      public static long gcd(long a, long b) {
431        /*
432         * The reason we require both arguments to be >= 0 is because otherwise, what do you return on
433         * gcd(0, Long.MIN_VALUE)? BigInteger.gcd would return positive 2^63, but positive 2^63 isn't
434         * an int.
435         */
436        checkNonNegative("a", a);
437        checkNonNegative("b", b);
438        if (a == 0) {
439          // 0 % b == 0, so b divides a, but the converse doesn't hold.
440          // BigInteger.gcd is consistent with this decision.
441          return b;
442        } else if (b == 0) {
443          return a; // similar logic
444        }
445        /*
446         * Uses the binary GCD algorithm; see http://en.wikipedia.org/wiki/Binary_GCD_algorithm.
447         * This is >60% faster than the Euclidean algorithm in benchmarks.
448         */
449        int aTwos = Long.numberOfTrailingZeros(a);
450        a >>= aTwos; // divide out all 2s
451        int bTwos = Long.numberOfTrailingZeros(b);
452        b >>= bTwos; // divide out all 2s
453        while (a != b) { // both a, b are odd
454          // The key to the binary GCD algorithm is as follows:
455          // Both a and b are odd.  Assume a > b; then gcd(a - b, b) = gcd(a, b).
456          // But in gcd(a - b, b), a - b is even and b is odd, so we can divide out powers of two.
457    
458          // We bend over backwards to avoid branching, adapting a technique from
459          // http://graphics.stanford.edu/~seander/bithacks.html#IntegerMinOrMax
460    
461          long delta = a - b; // can't overflow, since a and b are nonnegative
462    
463          long minDeltaOrZero = delta & (delta >> (Long.SIZE - 1));
464          // equivalent to Math.min(delta, 0)
465    
466          a = delta - minDeltaOrZero - minDeltaOrZero; // sets a to Math.abs(a - b)
467          // a is now nonnegative and even
468    
469          b += minDeltaOrZero; // sets b to min(old a, b)
470          a >>= Long.numberOfTrailingZeros(a); // divide out all 2s, since 2 doesn't divide b
471        }
472        return a << min(aTwos, bTwos);
473      }
474    
475      /**
476       * Returns the sum of {@code a} and {@code b}, provided it does not overflow.
477       *
478       * @throws ArithmeticException if {@code a + b} overflows in signed {@code long} arithmetic
479       */
480      @GwtIncompatible("TODO")
481      public static long checkedAdd(long a, long b) {
482        long result = a + b;
483        checkNoOverflow((a ^ b) < 0 | (a ^ result) >= 0);
484        return result;
485      }
486    
487      /**
488       * Returns the difference of {@code a} and {@code b}, provided it does not overflow.
489       *
490       * @throws ArithmeticException if {@code a - b} overflows in signed {@code long} arithmetic
491       */
492      @GwtIncompatible("TODO")
493      public static long checkedSubtract(long a, long b) {
494        long result = a - b;
495        checkNoOverflow((a ^ b) >= 0 | (a ^ result) >= 0);
496        return result;
497      }
498    
499      /**
500       * Returns the product of {@code a} and {@code b}, provided it does not overflow.
501       *
502       * @throws ArithmeticException if {@code a * b} overflows in signed {@code long} arithmetic
503       */
504      @GwtIncompatible("TODO")
505      public static long checkedMultiply(long a, long b) {
506        // Hacker's Delight, Section 2-12
507        int leadingZeros = Long.numberOfLeadingZeros(a) + Long.numberOfLeadingZeros(~a)
508            + Long.numberOfLeadingZeros(b) + Long.numberOfLeadingZeros(~b);
509        /*
510         * If leadingZeros > Long.SIZE + 1 it's definitely fine, if it's < Long.SIZE it's definitely
511         * bad. We do the leadingZeros check to avoid the division below if at all possible.
512         *
513         * Otherwise, if b == Long.MIN_VALUE, then the only allowed values of a are 0 and 1. We take
514         * care of all a < 0 with their own check, because in particular, the case a == -1 will
515         * incorrectly pass the division check below.
516         *
517         * In all other cases, we check that either a is 0 or the result is consistent with division.
518         */
519        if (leadingZeros > Long.SIZE + 1) {
520          return a * b;
521        }
522        checkNoOverflow(leadingZeros >= Long.SIZE);
523        checkNoOverflow(a >= 0 | b != Long.MIN_VALUE);
524        long result = a * b;
525        checkNoOverflow(a == 0 || result / a == b);
526        return result;
527      }
528    
529      /**
530       * Returns the {@code b} to the {@code k}th power, provided it does not overflow.
531       *
532       * @throws ArithmeticException if {@code b} to the {@code k}th power overflows in signed
533       *         {@code long} arithmetic
534       */
535      @GwtIncompatible("TODO")
536      public static long checkedPow(long b, int k) {
537        checkNonNegative("exponent", k);
538        if (b >= -2 & b <= 2) {
539          switch ((int) b) {
540            case 0:
541              return (k == 0) ? 1 : 0;
542            case 1:
543              return 1;
544            case (-1):
545              return ((k & 1) == 0) ? 1 : -1;
546            case 2:
547              checkNoOverflow(k < Long.SIZE - 1);
548              return 1L << k;
549            case (-2):
550              checkNoOverflow(k < Long.SIZE);
551              return ((k & 1) == 0) ? (1L << k) : (-1L << k);
552          }
553        }
554        long accum = 1;
555        while (true) {
556          switch (k) {
557            case 0:
558              return accum;
559            case 1:
560              return checkedMultiply(accum, b);
561            default:
562              if ((k & 1) != 0) {
563                accum = checkedMultiply(accum, b);
564              }
565              k >>= 1;
566              if (k > 0) {
567                checkNoOverflow(b <= FLOOR_SQRT_MAX_LONG);
568                b *= b;
569              }
570          }
571        }
572      }
573    
574      @GwtIncompatible("TODO")
575      @VisibleForTesting static final long FLOOR_SQRT_MAX_LONG = 3037000499L;
576    
577      /**
578       * Returns {@code n!}, that is, the product of the first {@code n} positive
579       * integers, {@code 1} if {@code n == 0}, or {@link Long#MAX_VALUE} if the
580       * result does not fit in a {@code long}.
581       *
582       * @throws IllegalArgumentException if {@code n < 0}
583       */
584      @GwtIncompatible("TODO")
585      public static long factorial(int n) {
586        checkNonNegative("n", n);
587        return (n < FACTORIALS.length) ? FACTORIALS[n] : Long.MAX_VALUE;
588      }
589    
590      static final long[] FACTORIALS = {
591          1L,
592          1L,
593          1L * 2,
594          1L * 2 * 3,
595          1L * 2 * 3 * 4,
596          1L * 2 * 3 * 4 * 5,
597          1L * 2 * 3 * 4 * 5 * 6,
598          1L * 2 * 3 * 4 * 5 * 6 * 7,
599          1L * 2 * 3 * 4 * 5 * 6 * 7 * 8,
600          1L * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9,
601          1L * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10,
602          1L * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10 * 11,
603          1L * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10 * 11 * 12,
604          1L * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10 * 11 * 12 * 13,
605          1L * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10 * 11 * 12 * 13 * 14,
606          1L * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10 * 11 * 12 * 13 * 14 * 15,
607          1L * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10 * 11 * 12 * 13 * 14 * 15 * 16,
608          1L * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10 * 11 * 12 * 13 * 14 * 15 * 16 * 17,
609          1L * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10 * 11 * 12 * 13 * 14 * 15 * 16 * 17 * 18,
610          1L * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10 * 11 * 12 * 13 * 14 * 15 * 16 * 17 * 18 * 19,
611          1L * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10 * 11 * 12 * 13 * 14 * 15 * 16 * 17 * 18 * 19 * 20
612      };
613    
614      /**
615       * Returns {@code n} choose {@code k}, also known as the binomial coefficient of {@code n} and
616       * {@code k}, or {@link Long#MAX_VALUE} if the result does not fit in a {@code long}.
617       *
618       * @throws IllegalArgumentException if {@code n < 0}, {@code k < 0}, or {@code k > n}
619       */
620      public static long binomial(int n, int k) {
621        checkNonNegative("n", n);
622        checkNonNegative("k", k);
623        checkArgument(k <= n, "k (%s) > n (%s)", k, n);
624        if (k > (n >> 1)) {
625          k = n - k;
626        }
627        if (k >= BIGGEST_BINOMIALS.length || n > BIGGEST_BINOMIALS[k]) {
628          return Long.MAX_VALUE;
629        }
630        long result = 1;
631        if (k < BIGGEST_SIMPLE_BINOMIALS.length && n <= BIGGEST_SIMPLE_BINOMIALS[k]) {
632          // guaranteed not to overflow
633          for (int i = 0; i < k; i++) {
634            result *= n - i;
635            result /= i + 1;
636          }
637        } else {
638          // We want to do this in long math for speed, but want to avoid overflow.
639          // Dividing by the GCD suffices to avoid overflow in all the remaining cases.
640          for (int i = 1; i <= k; i++, n--) {
641            int d = IntMath.gcd(n, i);
642            result /= i / d; // (i/d) is guaranteed to divide result
643            result *= n / d;
644          }
645        }
646        return result;
647      }
648    
649      /*
650       * binomial(BIGGEST_BINOMIALS[k], k) fits in a long, but not
651       * binomial(BIGGEST_BINOMIALS[k] + 1, k).
652       */
653      static final int[] BIGGEST_BINOMIALS =
654          {Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MAX_VALUE, 3810779, 121977, 16175, 4337, 1733,
655              887, 534, 361, 265, 206, 169, 143, 125, 111, 101, 94, 88, 83, 79, 76, 74, 72, 70, 69, 68,
656              67, 67, 66, 66, 66, 66};
657    
658      /*
659       * binomial(BIGGEST_SIMPLE_BINOMIALS[k], k) doesn't need to use the slower GCD-based impl,
660       * but binomial(BIGGEST_SIMPLE_BINOMIALS[k] + 1, k) does.
661       */
662      @VisibleForTesting static final int[] BIGGEST_SIMPLE_BINOMIALS =
663          {Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MAX_VALUE, 2642246, 86251, 11724, 3218, 1313,
664              684, 419, 287, 214, 169, 139, 119, 105, 95, 87, 81, 76, 73, 70, 68, 66, 64, 63, 62, 62,
665              61, 61, 61};
666      // These values were generated by using checkedMultiply to see when the simple multiply/divide
667      // algorithm would lead to an overflow.
668    
669      @GwtIncompatible("TODO")
670      static boolean fitsInInt(long x) {
671        return (int) x == x;
672      }
673    
674      private LongMath() {}
675    }