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 com.google.errorprone.annotations.InlineMe; 033import java.math.BigInteger; 034import java.math.RoundingMode; 035 036/** 037 * A class for arithmetic on values of type {@code int}. Where possible, methods are defined and 038 * named analogously to their {@code BigInteger} counterparts. 039 * 040 * <p>The implementations of many methods in this class are based on material from Henry S. Warren, 041 * Jr.'s <i>Hacker's Delight</i>, (Addison Wesley, 2002). 042 * 043 * <p>Similar functionality for {@code long} and for {@link BigInteger} can be found in {@link 044 * LongMath} and {@link BigIntegerMath} respectively. For other common operations on {@code int} 045 * values, see {@link com.google.common.primitives.Ints}. 046 * 047 * @author Louis Wasserman 048 * @since 11.0 049 */ 050@GwtCompatible 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}. If the {@code RoundingMode} is {@link RoundingMode#DOWN}, then this method is 305 * equivalent to regular Java division, {@code p / q}; and if it is {@link RoundingMode#FLOOR}, 306 * then this method is equivalent to {@link Math#floorDiv(int,int) Math.floorDiv}{@code (p, q)}. 307 * 308 * @throws ArithmeticException if {@code q == 0}, or if {@code mode == UNNECESSARY} and {@code a} 309 * is not an integer multiple of {@code b} 310 */ 311 // Whenever both tests are cheap and functional, it's faster to use &, | instead of &&, || 312 @SuppressWarnings({"fallthrough", "ShortCircuitBoolean"}) 313 public static int divide(int p, int q, RoundingMode mode) { 314 checkNotNull(mode); 315 if (q == 0) { 316 throw new ArithmeticException("/ by zero"); // for GWT 317 } 318 int div = p / q; 319 int rem = p - q * div; // equal to p % q 320 321 if (rem == 0) { 322 return div; 323 } 324 325 /* 326 * Normal Java division rounds towards 0, consistently with RoundingMode.DOWN. We just have to 327 * deal with the cases where rounding towards 0 is wrong, which typically depends on the sign of 328 * p / q. 329 * 330 * signum is 1 if p and q are both nonnegative or both negative, and -1 otherwise. 331 */ 332 int signum = 1 | ((p ^ q) >> (Integer.SIZE - 1)); 333 boolean increment; 334 switch (mode) { 335 case UNNECESSARY: 336 checkRoundingUnnecessary(rem == 0); 337 // fall through 338 case DOWN: 339 increment = false; 340 break; 341 case UP: 342 increment = true; 343 break; 344 case CEILING: 345 increment = signum > 0; 346 break; 347 case FLOOR: 348 increment = signum < 0; 349 break; 350 case HALF_EVEN: 351 case HALF_DOWN: 352 case HALF_UP: 353 int absRem = abs(rem); 354 int cmpRemToHalfDivisor = absRem - (abs(q) - absRem); 355 // subtracting two nonnegative ints can't overflow 356 // cmpRemToHalfDivisor has the same sign as compare(abs(rem), abs(q) / 2). 357 if (cmpRemToHalfDivisor == 0) { // exactly on the half mark 358 increment = (mode == HALF_UP || (mode == HALF_EVEN & (div & 1) != 0)); 359 } else { 360 increment = cmpRemToHalfDivisor > 0; // closer to the UP value 361 } 362 break; 363 default: 364 throw new AssertionError(); 365 } 366 return increment ? div + signum : div; 367 } 368 369 /** 370 * Returns {@code x mod m}, a non-negative value less than {@code m}. This differs from {@code x % 371 * m}, which might be negative. This method is equivalent to {@code Math.floorMod(x, m)} except 372 * that that method also allows negative {@code m}. {@code Math.floorMod} should be preferred when 373 * {@code m} is known to be positive. 374 * 375 * <p>For example: 376 * 377 * {@snippet : 378 * mod(7, 4) == 3 379 * mod(-7, 4) == 1 380 * mod(-1, 4) == 3 381 * mod(-8, 4) == 0 382 * mod(8, 4) == 0 383 * } 384 * 385 * @throws ArithmeticException if {@code m <= 0} 386 * @see <a href="https://docs.oracle.com/javase/specs/jls/se26/html/jls-15.html#jls-15.17.3"> 387 * Remainder Operator</a> 388 */ 389 public static int mod(int x, int m) { 390 if (m <= 0) { 391 throw new ArithmeticException("Modulus " + m + " must be > 0"); 392 } 393 return Math.floorMod(x, 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 * <p><b>Note:</b> this method is now unnecessary and should be treated as deprecated; use {@link 451 * Math#addExact(int, int)} instead. 452 * 453 * @throws ArithmeticException if {@code a + b} overflows in signed {@code int} arithmetic 454 */ 455 @InlineMe(replacement = "Math.addExact(a, b)") 456 public static int checkedAdd(int a, int b) { 457 return Math.addExact(a, b); 458 } 459 460 /** 461 * Returns the difference of {@code a} and {@code b}, provided it does not overflow. 462 * 463 * <p><b>Note:</b> this method is now unnecessary and should be treated as deprecated; use {@link 464 * Math#subtractExact(int, int)} instead. 465 * 466 * @throws ArithmeticException if {@code a - b} overflows in signed {@code int} arithmetic 467 */ 468 @InlineMe(replacement = "Math.subtractExact(a, b)") 469 public static int checkedSubtract(int a, int b) { 470 return Math.subtractExact(a, b); 471 } 472 473 /** 474 * Returns the product of {@code a} and {@code b}, provided it does not overflow. 475 * 476 * <p><b>Note:</b> this method is now unnecessary and should be treated as deprecated; use {@link 477 * Math#multiplyExact(int, int)} instead. 478 * 479 * @throws ArithmeticException if {@code a * b} overflows in signed {@code int} arithmetic 480 */ 481 @InlineMe(replacement = "Math.multiplyExact(a, b)") 482 public static int checkedMultiply(int a, int b) { 483 return Math.multiplyExact(a, b); 484 } 485 486 /** 487 * Returns the {@code b} to the {@code k}th power, provided it does not overflow. 488 * 489 * <p>{@link #pow} may be faster, but does not check for overflow. 490 * 491 * @throws ArithmeticException if {@code b} to the {@code k}th power overflows in signed {@code 492 * int} arithmetic 493 */ 494 // Whenever both tests are cheap and functional, it's faster to use &, | instead of &&, || 495 @SuppressWarnings("ShortCircuitBoolean") 496 public static int checkedPow(int b, int k) { 497 checkNonNegative("exponent", k); 498 switch (b) { 499 case 0: 500 return (k == 0) ? 1 : 0; 501 case 1: 502 return 1; 503 case -1: 504 return ((k & 1) == 0) ? 1 : -1; 505 case 2: 506 checkNoOverflow(k < Integer.SIZE - 1, "checkedPow", b, k); 507 return 1 << k; 508 case -2: 509 checkNoOverflow(k < Integer.SIZE, "checkedPow", b, k); 510 return ((k & 1) == 0) ? 1 << k : -1 << k; 511 default: 512 // continue below to handle the general case 513 } 514 int accum = 1; 515 while (true) { 516 switch (k) { 517 case 0: 518 return accum; 519 case 1: 520 return Math.multiplyExact(accum, b); 521 default: 522 if ((k & 1) != 0) { 523 accum = Math.multiplyExact(accum, b); 524 } 525 k >>= 1; 526 if (k > 0) { 527 checkNoOverflow(-FLOOR_SQRT_MAX_INT <= b & b <= FLOOR_SQRT_MAX_INT, "checkedPow", b, k); 528 b *= b; 529 } 530 } 531 } 532 } 533 534 /** 535 * Returns the sum of {@code a} and {@code b} unless it would overflow or underflow in which case 536 * {@code Integer.MAX_VALUE} or {@code Integer.MIN_VALUE} is returned, respectively. 537 * 538 * @since 20.0 539 */ 540 public static int saturatedAdd(int a, int b) { 541 return Ints.saturatedCast((long) a + b); 542 } 543 544 /** 545 * Returns the difference of {@code a} and {@code b} unless it would overflow or underflow in 546 * which case {@code Integer.MAX_VALUE} or {@code Integer.MIN_VALUE} is returned, respectively. 547 * 548 * @since 20.0 549 */ 550 public static int saturatedSubtract(int a, int b) { 551 return Ints.saturatedCast((long) a - b); 552 } 553 554 /** 555 * Returns the product of {@code a} and {@code b} unless it would overflow or underflow in which 556 * case {@code Integer.MAX_VALUE} or {@code Integer.MIN_VALUE} is returned, respectively. 557 * 558 * @since 20.0 559 */ 560 public static int saturatedMultiply(int a, int b) { 561 return Ints.saturatedCast((long) a * b); 562 } 563 564 /** 565 * Returns the {@code b} to the {@code k}th power, unless it would overflow or underflow in which 566 * case {@code Integer.MAX_VALUE} or {@code Integer.MIN_VALUE} is returned, respectively. 567 * 568 * @since 20.0 569 */ 570 // Whenever both tests are cheap and functional, it's faster to use &, | instead of &&, || 571 @SuppressWarnings("ShortCircuitBoolean") 572 public static int saturatedPow(int b, int k) { 573 checkNonNegative("exponent", k); 574 switch (b) { 575 case 0: 576 return (k == 0) ? 1 : 0; 577 case 1: 578 return 1; 579 case -1: 580 return ((k & 1) == 0) ? 1 : -1; 581 case 2: 582 if (k >= Integer.SIZE - 1) { 583 return Integer.MAX_VALUE; 584 } 585 return 1 << k; 586 case -2: 587 if (k >= Integer.SIZE) { 588 return Integer.MAX_VALUE + (k & 1); 589 } 590 return ((k & 1) == 0) ? 1 << k : -1 << k; 591 default: 592 // continue below to handle the general case 593 } 594 int accum = 1; 595 // if b is negative and k is odd then the limit is MIN otherwise the limit is MAX 596 int limit = Integer.MAX_VALUE + ((b >>> (Integer.SIZE - 1)) & (k & 1)); 597 while (true) { 598 switch (k) { 599 case 0: 600 return accum; 601 case 1: 602 return saturatedMultiply(accum, b); 603 default: 604 if ((k & 1) != 0) { 605 accum = saturatedMultiply(accum, b); 606 } 607 k >>= 1; 608 if (k > 0) { 609 if (-FLOOR_SQRT_MAX_INT > b | b > FLOOR_SQRT_MAX_INT) { 610 return limit; 611 } 612 b *= b; 613 } 614 } 615 } 616 } 617 618 @VisibleForTesting static final int FLOOR_SQRT_MAX_INT = 46340; 619 620 /** 621 * Returns {@code n!}, that is, the product of the first {@code n} positive integers, {@code 1} if 622 * {@code n == 0}, or {@link Integer#MAX_VALUE} if the result does not fit in a {@code int}. 623 * 624 * @throws IllegalArgumentException if {@code n < 0} 625 */ 626 public static int factorial(int n) { 627 checkNonNegative("n", n); 628 return (n < factorials.length) ? factorials[n] : Integer.MAX_VALUE; 629 } 630 631 private static final int[] factorials = { 632 1, 633 1, 634 1 * 2, 635 1 * 2 * 3, 636 1 * 2 * 3 * 4, 637 1 * 2 * 3 * 4 * 5, 638 1 * 2 * 3 * 4 * 5 * 6, 639 1 * 2 * 3 * 4 * 5 * 6 * 7, 640 1 * 2 * 3 * 4 * 5 * 6 * 7 * 8, 641 1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9, 642 1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10, 643 1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10 * 11, 644 1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10 * 11 * 12 645 }; 646 647 /** 648 * Returns {@code n} choose {@code k}, also known as the binomial coefficient of {@code n} and 649 * {@code k}, or {@link Integer#MAX_VALUE} if the result does not fit in an {@code int}. 650 * 651 * @throws IllegalArgumentException if {@code n < 0}, {@code k < 0} or {@code k > n} 652 */ 653 public static int binomial(int n, int k) { 654 checkNonNegative("n", n); 655 checkNonNegative("k", k); 656 checkArgument(k <= n, "k (%s) > n (%s)", k, n); 657 if (k > (n >> 1)) { 658 k = n - k; 659 } 660 if (k >= biggestBinomials.length || n > biggestBinomials[k]) { 661 return Integer.MAX_VALUE; 662 } 663 switch (k) { 664 case 0: 665 return 1; 666 case 1: 667 return n; 668 default: 669 long result = 1; 670 for (int i = 0; i < k; i++) { 671 result *= n - i; 672 result /= i + 1; 673 } 674 return (int) result; 675 } 676 } 677 678 // binomial(biggestBinomials[k], k) fits in an int, but not binomial(biggestBinomials[k]+1,k). 679 @VisibleForTesting 680 static final int[] biggestBinomials = { 681 Integer.MAX_VALUE, 682 Integer.MAX_VALUE, 683 65536, 684 2345, 685 477, 686 193, 687 110, 688 75, 689 58, 690 49, 691 43, 692 39, 693 37, 694 35, 695 34, 696 34, 697 33 698 }; 699 700 /** 701 * Returns the arithmetic mean of {@code x} and {@code y}, rounded towards negative infinity. This 702 * method is overflow resilient. 703 * 704 * @since 14.0 705 */ 706 public static int mean(int x, int y) { 707 // Efficient method for computing the arithmetic mean. 708 // The alternative (x + y) / 2 fails for large values. 709 // The alternative (x + y) >>> 1 fails for negative values. 710 return (x & y) + ((x ^ y) >> 1); 711 } 712 713 /** 714 * Returns {@code true} if {@code n} is a <a 715 * href="http://mathworld.wolfram.com/PrimeNumber.html">prime number</a>: an integer <i>greater 716 * than one</i> that cannot be factored into a product of <i>smaller</i> positive integers. 717 * Returns {@code false} if {@code n} is zero, one, or a composite number (one which <i>can</i> be 718 * factored into smaller positive integers). 719 * 720 * <p>To test larger numbers, use {@link LongMath#isPrime} or {@link BigInteger#isProbablePrime}. 721 * 722 * @throws IllegalArgumentException if {@code n} is negative 723 * @since 20.0 724 */ 725 @GwtIncompatible // TODO 726 public static boolean isPrime(int n) { 727 return LongMath.isPrime(n); 728 } 729 730 /** 731 * Returns the closest representable {@code int} to the absolute value of {@code x}. 732 * 733 * <p>This is the same thing as the true absolute value of {@code x} except in the case when 734 * {@code x} is {@link Integer#MIN_VALUE}, in which case this returns {@link Integer#MAX_VALUE}. 735 * (Note that {@code Integer.MAX_VALUE} is mathematically equal to {@code -Integer.MIN_VALUE - 736 * 1}.) 737 * 738 * <p>There are three common APIs for determining the absolute value of an integer, all of which 739 * behave identically except when passed {@code Integer.MIN_VALUE}. Those methods are: 740 * 741 * <ul> 742 * <li>{@link Math#abs(int)}, which returns {@code Integer.MIN_VALUE} when passed {@code 743 * Integer.MIN_VALUE} 744 * <li>{@link Math#absExact(int)}, which throws {@link ArithmeticException} when passed {@code 745 * Integer.MIN_VALUE} 746 * <li>this method, {@code IntMath.saturatedAbs(int)}, which returns {@code Integer.MAX_VALUE} 747 * when passed {@code Integer.MIN_VALUE} 748 * </ul> 749 * 750 * <p>Note that if your only goal is to turn a well-distributed {@code int} (such as a random 751 * number or hash code) into a well-distributed nonnegative number, the most even distribution is 752 * achieved not by this method or other absolute value methods, but by {@code x & 753 * Integer.MAX_VALUE}. 754 * 755 * @since 33.5.0 756 */ 757 public static int saturatedAbs(int x) { 758 return (x == Integer.MIN_VALUE) ? Integer.MAX_VALUE : Math.abs(x); 759 } 760 761 private IntMath() {} 762}