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