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