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