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
017package com.google.common.math;
018
019import static com.google.common.base.Preconditions.checkArgument;
020import static com.google.common.base.Preconditions.checkNotNull;
021import static com.google.common.math.MathPreconditions.checkNonNegative;
022import static com.google.common.math.MathPreconditions.checkPositive;
023import static com.google.common.math.MathPreconditions.checkRoundingUnnecessary;
024import static java.math.RoundingMode.CEILING;
025import static java.math.RoundingMode.FLOOR;
026import static java.math.RoundingMode.HALF_EVEN;
027
028import com.google.common.annotations.GwtCompatible;
029import com.google.common.annotations.GwtIncompatible;
030import com.google.common.annotations.VisibleForTesting;
031
032import java.math.BigDecimal;
033import java.math.BigInteger;
034import java.math.RoundingMode;
035import java.util.ArrayList;
036import java.util.List;
037
038/**
039 * A class for arithmetic on values of type {@code BigInteger}.
040 *
041 * <p>The implementations of many methods in this class are based on material from Henry S. Warren,
042 * Jr.'s <i>Hacker's Delight</i>, (Addison Wesley, 2002).
043 *
044 * <p>Similar functionality for {@code int} and for {@code long} can be found in
045 * {@link IntMath} and {@link LongMath} respectively.
046 *
047 * @author Louis Wasserman
048 * @since 11.0
049 */
050@GwtCompatible(emulated = true)
051public final class BigIntegerMath {
052  /**
053   * Returns {@code true} if {@code x} represents a power of two.
054   */
055  public static boolean isPowerOfTwo(BigInteger x) {
056    checkNotNull(x);
057    return x.signum() > 0 && x.getLowestSetBit() == x.bitLength() - 1;
058  }
059
060  /**
061   * Returns the base-2 logarithm of {@code x}, rounded according to the specified rounding mode.
062   *
063   * @throws IllegalArgumentException if {@code x <= 0}
064   * @throws ArithmeticException if {@code mode} is {@link RoundingMode#UNNECESSARY} and {@code x}
065   *         is not a power of two
066   */
067  @SuppressWarnings("fallthrough")
068  // TODO(kevinb): remove after this warning is disabled globally
069  public static int log2(BigInteger x, RoundingMode mode) {
070    checkPositive("x", checkNotNull(x));
071    int logFloor = x.bitLength() - 1;
072    switch (mode) {
073      case UNNECESSARY:
074        checkRoundingUnnecessary(isPowerOfTwo(x)); // fall through
075      case DOWN:
076      case FLOOR:
077        return logFloor;
078
079      case UP:
080      case CEILING:
081        return isPowerOfTwo(x) ? logFloor : logFloor + 1;
082
083      case HALF_DOWN:
084      case HALF_UP:
085      case HALF_EVEN:
086        if (logFloor < SQRT2_PRECOMPUTE_THRESHOLD) {
087          BigInteger halfPower = SQRT2_PRECOMPUTED_BITS.shiftRight(
088              SQRT2_PRECOMPUTE_THRESHOLD - logFloor);
089          if (x.compareTo(halfPower) <= 0) {
090            return logFloor;
091          } else {
092            return logFloor + 1;
093          }
094        }
095        /*
096         * Since sqrt(2) is irrational, log2(x) - logFloor cannot be exactly 0.5
097         *
098         * To determine which side of logFloor.5 the logarithm is, we compare x^2 to 2^(2 *
099         * logFloor + 1).
100         */
101        BigInteger x2 = x.pow(2);
102        int logX2Floor = x2.bitLength() - 1;
103        return (logX2Floor < 2 * logFloor + 1) ? logFloor : logFloor + 1;
104
105      default:
106        throw new AssertionError();
107    }
108  }
109
110  /*
111   * The maximum number of bits in a square root for which we'll precompute an explicit half power
112   * of two. This can be any value, but higher values incur more class load time and linearly
113   * increasing memory consumption.
114   */
115  @VisibleForTesting static final int SQRT2_PRECOMPUTE_THRESHOLD = 256;
116
117  @VisibleForTesting static final BigInteger SQRT2_PRECOMPUTED_BITS =
118      new BigInteger("16a09e667f3bcc908b2fb1366ea957d3e3adec17512775099da2f590b0667322a", 16);
119
120  /**
121   * Returns the base-10 logarithm of {@code x}, rounded according to the specified rounding mode.
122   *
123   * @throws IllegalArgumentException if {@code x <= 0}
124   * @throws ArithmeticException if {@code mode} is {@link RoundingMode#UNNECESSARY} and {@code x}
125   *         is not a power of ten
126   */
127  @GwtIncompatible("TODO")
128  @SuppressWarnings("fallthrough")
129  public static int log10(BigInteger x, RoundingMode mode) {
130    checkPositive("x", x);
131    if (fitsInLong(x)) {
132      return LongMath.log10(x.longValue(), mode);
133    }
134
135    int approxLog10 = (int) (log2(x, FLOOR) * LN_2 / LN_10);
136    BigInteger approxPow = BigInteger.TEN.pow(approxLog10);
137    int approxCmp = approxPow.compareTo(x);
138
139    /*
140     * We adjust approxLog10 and approxPow until they're equal to floor(log10(x)) and
141     * 10^floor(log10(x)).
142     */
143
144    if (approxCmp > 0) {
145      /*
146       * The code is written so that even completely incorrect approximations will still yield the
147       * correct answer eventually, but in practice this branch should almost never be entered,
148       * and even then the loop should not run more than once.
149       */
150      do {
151        approxLog10--;
152        approxPow = approxPow.divide(BigInteger.TEN);
153        approxCmp = approxPow.compareTo(x);
154      } while (approxCmp > 0);
155    } else {
156      BigInteger nextPow = BigInteger.TEN.multiply(approxPow);
157      int nextCmp = nextPow.compareTo(x);
158      while (nextCmp <= 0) {
159        approxLog10++;
160        approxPow = nextPow;
161        approxCmp = nextCmp;
162        nextPow = BigInteger.TEN.multiply(approxPow);
163        nextCmp = nextPow.compareTo(x);
164      }
165    }
166
167    int floorLog = approxLog10;
168    BigInteger floorPow = approxPow;
169    int floorCmp = approxCmp;
170
171    switch (mode) {
172      case UNNECESSARY:
173        checkRoundingUnnecessary(floorCmp == 0);
174        // fall through
175      case FLOOR:
176      case DOWN:
177        return floorLog;
178
179      case CEILING:
180      case UP:
181        return floorPow.equals(x) ? floorLog : floorLog + 1;
182
183      case HALF_DOWN:
184      case HALF_UP:
185      case HALF_EVEN:
186        // Since sqrt(10) is irrational, log10(x) - floorLog can never be exactly 0.5
187        BigInteger x2 = x.pow(2);
188        BigInteger halfPowerSquared = floorPow.pow(2).multiply(BigInteger.TEN);
189        return (x2.compareTo(halfPowerSquared) <= 0) ? floorLog : floorLog + 1;
190      default:
191        throw new AssertionError();
192    }
193  }
194
195  private static final double LN_10 = Math.log(10);
196  private static final double LN_2 = Math.log(2);
197
198  /**
199   * Returns the square root of {@code x}, rounded with the specified rounding mode.
200   *
201   * @throws IllegalArgumentException if {@code x < 0}
202   * @throws ArithmeticException if {@code mode} is {@link RoundingMode#UNNECESSARY} and
203   *         {@code sqrt(x)} is not an integer
204   */
205  @GwtIncompatible("TODO")
206  @SuppressWarnings("fallthrough")
207  public static BigInteger sqrt(BigInteger x, RoundingMode mode) {
208    checkNonNegative("x", x);
209    if (fitsInLong(x)) {
210      return BigInteger.valueOf(LongMath.sqrt(x.longValue(), mode));
211    }
212    BigInteger sqrtFloor = sqrtFloor(x);
213    switch (mode) {
214      case UNNECESSARY:
215        checkRoundingUnnecessary(sqrtFloor.pow(2).equals(x)); // fall through
216      case FLOOR:
217      case DOWN:
218        return sqrtFloor;
219      case CEILING:
220      case UP:
221        int sqrtFloorInt = sqrtFloor.intValue();
222        boolean sqrtFloorIsExact =
223            (sqrtFloorInt * sqrtFloorInt == x.intValue()) // fast check mod 2^32
224            && sqrtFloor.pow(2).equals(x); // slow exact check
225        return sqrtFloorIsExact ? sqrtFloor : sqrtFloor.add(BigInteger.ONE);
226      case HALF_DOWN:
227      case HALF_UP:
228      case HALF_EVEN:
229        BigInteger halfSquare = sqrtFloor.pow(2).add(sqrtFloor);
230        /*
231         * We wish to test whether or not x <= (sqrtFloor + 0.5)^2 = halfSquare + 0.25. Since both
232         * x and halfSquare are integers, this is equivalent to testing whether or not x <=
233         * halfSquare.
234         */
235        return (halfSquare.compareTo(x) >= 0) ? sqrtFloor : sqrtFloor.add(BigInteger.ONE);
236      default:
237        throw new AssertionError();
238    }
239  }
240
241  @GwtIncompatible("TODO")
242  private static BigInteger sqrtFloor(BigInteger x) {
243    /*
244     * Adapted from Hacker's Delight, Figure 11-1.
245     *
246     * Using DoubleUtils.bigToDouble, getting a double approximation of x is extremely fast, and
247     * then we can get a double approximation of the square root. Then, we iteratively improve this
248     * guess with an application of Newton's method, which sets guess := (guess + (x / guess)) / 2.
249     * This iteration has the following two properties:
250     *
251     * a) every iteration (except potentially the first) has guess >= floor(sqrt(x)). This is
252     * because guess' is the arithmetic mean of guess and x / guess, sqrt(x) is the geometric mean,
253     * and the arithmetic mean is always higher than the geometric mean.
254     *
255     * b) this iteration converges to floor(sqrt(x)). In fact, the number of correct digits doubles
256     * with each iteration, so this algorithm takes O(log(digits)) iterations.
257     *
258     * We start out with a double-precision approximation, which may be higher or lower than the
259     * true value. Therefore, we perform at least one Newton iteration to get a guess that's
260     * definitely >= floor(sqrt(x)), and then continue the iteration until we reach a fixed point.
261     */
262    BigInteger sqrt0;
263    int log2 = log2(x, FLOOR);
264    if (log2 < Double.MAX_EXPONENT) {
265      sqrt0 = sqrtApproxWithDoubles(x);
266    } else {
267      int shift = (log2 - DoubleUtils.SIGNIFICAND_BITS) & ~1; // even!
268      /*
269       * We have that x / 2^shift < 2^54. Our initial approximation to sqrtFloor(x) will be
270       * 2^(shift/2) * sqrtApproxWithDoubles(x / 2^shift).
271       */
272      sqrt0 = sqrtApproxWithDoubles(x.shiftRight(shift)).shiftLeft(shift >> 1);
273    }
274    BigInteger sqrt1 = sqrt0.add(x.divide(sqrt0)).shiftRight(1);
275    if (sqrt0.equals(sqrt1)) {
276      return sqrt0;
277    }
278    do {
279      sqrt0 = sqrt1;
280      sqrt1 = sqrt0.add(x.divide(sqrt0)).shiftRight(1);
281    } while (sqrt1.compareTo(sqrt0) < 0);
282    return sqrt0;
283  }
284
285  @GwtIncompatible("TODO")
286  private static BigInteger sqrtApproxWithDoubles(BigInteger x) {
287    return DoubleMath.roundToBigInteger(Math.sqrt(DoubleUtils.bigToDouble(x)), HALF_EVEN);
288  }
289
290  /**
291   * Returns the result of dividing {@code p} by {@code q}, rounding using the specified
292   * {@code RoundingMode}.
293   *
294   * @throws ArithmeticException if {@code q == 0}, or if {@code mode == UNNECESSARY} and {@code a}
295   *         is not an integer multiple of {@code b}
296   */
297  @GwtIncompatible("TODO")
298  public static BigInteger divide(BigInteger p, BigInteger q, RoundingMode mode) {
299    BigDecimal pDec = new BigDecimal(p);
300    BigDecimal qDec = new BigDecimal(q);
301    return pDec.divide(qDec, 0, mode).toBigIntegerExact();
302  }
303
304  /**
305   * Returns {@code n!}, that is, the product of the first {@code n} positive
306   * integers, or {@code 1} if {@code n == 0}.
307   *
308   * <p><b>Warning:</b> the result takes <i>O(n log n)</i> space, so use cautiously.
309   *
310   * <p>This uses an efficient binary recursive algorithm to compute the factorial
311   * with balanced multiplies.  It also removes all the 2s from the intermediate
312   * products (shifting them back in at the end).
313   *
314   * @throws IllegalArgumentException if {@code n < 0}
315   */
316  public static BigInteger factorial(int n) {
317    checkNonNegative("n", n);
318
319    // If the factorial is small enough, just use LongMath to do it.
320    if (n < LongMath.factorials.length) {
321      return BigInteger.valueOf(LongMath.factorials[n]);
322    }
323
324    // Pre-allocate space for our list of intermediate BigIntegers.
325    int approxSize = IntMath.divide(n * IntMath.log2(n, CEILING), Long.SIZE, CEILING);
326    ArrayList<BigInteger> bignums = new ArrayList<BigInteger>(approxSize);
327
328    // Start from the pre-computed maximum long factorial.
329    int startingNumber = LongMath.factorials.length;
330    long product = LongMath.factorials[startingNumber - 1];
331    // Strip off 2s from this value.
332    int shift = Long.numberOfTrailingZeros(product);
333    product >>= shift;
334
335    // Use floor(log2(num)) + 1 to prevent overflow of multiplication.
336    int productBits = LongMath.log2(product, FLOOR) + 1;
337    int bits = LongMath.log2(startingNumber, FLOOR) + 1;
338    // Check for the next power of two boundary, to save us a CLZ operation.
339    int nextPowerOfTwo = 1 << (bits - 1);
340
341    // Iteratively multiply the longs as big as they can go.
342    for (long num = startingNumber; num <= n; num++) {
343      // Check to see if the floor(log2(num)) + 1 has changed.
344      if ((num & nextPowerOfTwo) != 0) {
345        nextPowerOfTwo <<= 1;
346        bits++;
347      }
348      // Get rid of the 2s in num.
349      int tz = Long.numberOfTrailingZeros(num);
350      long normalizedNum = num >> tz;
351      shift += tz;
352      // Adjust floor(log2(num)) + 1.
353      int normalizedBits = bits - tz;
354      // If it won't fit in a long, then we store off the intermediate product.
355      if (normalizedBits + productBits >= Long.SIZE) {
356        bignums.add(BigInteger.valueOf(product));
357        product = 1;
358        productBits = 0;
359      }
360      product *= normalizedNum;
361      productBits = LongMath.log2(product, FLOOR) + 1;
362    }
363    // Check for leftovers.
364    if (product > 1) {
365      bignums.add(BigInteger.valueOf(product));
366    }
367    // Efficiently multiply all the intermediate products together.
368    return listProduct(bignums).shiftLeft(shift);
369  }
370
371  static BigInteger listProduct(List<BigInteger> nums) {
372    return listProduct(nums, 0, nums.size());
373  }
374
375  static BigInteger listProduct(List<BigInteger> nums, int start, int end) {
376    switch (end - start) {
377      case 0:
378        return BigInteger.ONE;
379      case 1:
380        return nums.get(start);
381      case 2:
382        return nums.get(start).multiply(nums.get(start + 1));
383      case 3:
384        return nums.get(start).multiply(nums.get(start + 1)).multiply(nums.get(start + 2));
385      default:
386        // Otherwise, split the list in half and recursively do this.
387        int m = (end + start) >>> 1;
388        return listProduct(nums, start, m).multiply(listProduct(nums, m, end));
389    }
390  }
391
392 /**
393   * Returns {@code n} choose {@code k}, also known as the binomial coefficient of {@code n} and
394   * {@code k}, that is, {@code n! / (k! (n - k)!)}.
395   *
396   * <p><b>Warning:</b> the result can take as much as <i>O(k log n)</i> space.
397   *
398   * @throws IllegalArgumentException if {@code n < 0}, {@code k < 0}, or {@code k > n}
399   */
400  public static BigInteger binomial(int n, int k) {
401    checkNonNegative("n", n);
402    checkNonNegative("k", k);
403    checkArgument(k <= n, "k (%s) > n (%s)", k, n);
404    if (k > (n >> 1)) {
405      k = n - k;
406    }
407    if (k < LongMath.biggestBinomials.length && n <= LongMath.biggestBinomials[k]) {
408      return BigInteger.valueOf(LongMath.binomial(n, k));
409    }
410
411    BigInteger accum = BigInteger.ONE;
412
413    long numeratorAccum = n;
414    long denominatorAccum = 1;
415
416    int bits = LongMath.log2(n, RoundingMode.CEILING);
417
418    int numeratorBits = bits;
419
420    for (int i = 1; i < k; i++) {
421      int p = n - i;
422      int q = i + 1;
423
424      // log2(p) >= bits - 1, because p >= n/2
425
426      if (numeratorBits + bits >= Long.SIZE - 1) {
427        // The numerator is as big as it can get without risking overflow.
428        // Multiply numeratorAccum / denominatorAccum into accum.
429        accum = accum
430            .multiply(BigInteger.valueOf(numeratorAccum))
431            .divide(BigInteger.valueOf(denominatorAccum));
432        numeratorAccum = p;
433        denominatorAccum = q;
434        numeratorBits = bits;
435      } else {
436        // We can definitely multiply into the long accumulators without overflowing them.
437        numeratorAccum *= p;
438        denominatorAccum *= q;
439        numeratorBits += bits;
440      }
441    }
442    return accum
443        .multiply(BigInteger.valueOf(numeratorAccum))
444        .divide(BigInteger.valueOf(denominatorAccum));
445  }
446
447  // Returns true if BigInteger.valueOf(x.longValue()).equals(x).
448  @GwtIncompatible("TODO")
449  static boolean fitsInLong(BigInteger x) {
450    return x.bitLength() <= Long.SIZE - 1;
451  }
452
453  private BigIntegerMath() {}
454}