1/* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache License, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18// BEGIN android-note 19// Since the original Harmony Code of the BigInteger class was strongly modified, 20// in order to use the more efficient OpenSSL BIGNUM implementation, 21// no android-modification-tags were placed, at all. 22// END android-note 23 24package java.math; 25 26import java.io.IOException; 27import java.io.ObjectInputStream; 28import java.io.ObjectOutputStream; 29import java.io.Serializable; 30import java.util.Random; 31 32/** 33 * An immutable signed integer of arbitrary magnitude. 34 * 35 * <h3>Fast Cryptography</h3> 36 * This implementation is efficient for operations traditionally used in 37 * cryptography, such as the generation of large prime numbers and computation 38 * of the modular inverse. 39 * 40 * <h3>Slow Two's Complement Bitwise Operations</h3> 41 * This API includes operations for bitwise operations in two's complement 42 * representation. Two's complement is not the internal representation used by 43 * this implementation, so such methods may be inefficient. Use {@link 44 * java.util.BitSet} for high-performance bitwise operations on 45 * arbitrarily-large sequences of bits. 46 */ 47public class BigInteger extends Number 48 implements Comparable<BigInteger>, Serializable { 49 50 /** This is the serialVersionUID used by the sun implementation. */ 51 private static final long serialVersionUID = -8287574255936472291L; 52 53 private transient BigInt bigInt; 54 55 private transient boolean nativeIsValid = false; 56 57 private transient boolean javaIsValid = false; 58 59 /** The magnitude of this in the little-endian representation. */ 60 transient int[] digits; 61 62 /** 63 * The length of this in measured in ints. Can be less than 64 * digits.length(). 65 */ 66 transient int numberLength; 67 68 /** The sign of this. */ 69 transient int sign; 70 71 /** The {@code BigInteger} constant 0. */ 72 public static final BigInteger ZERO = new BigInteger(0, 0); 73 74 /** The {@code BigInteger} constant 1. */ 75 public static final BigInteger ONE = new BigInteger(1, 1); 76 77 /** The {@code BigInteger} constant 10. */ 78 public static final BigInteger TEN = new BigInteger(1, 10); 79 80 /** The {@code BigInteger} constant -1. */ 81 static final BigInteger MINUS_ONE = new BigInteger(-1, 1); 82 83 /** All the {@code BigInteger} numbers in the range [0,10] are cached. */ 84 static final BigInteger[] SMALL_VALUES = { ZERO, ONE, new BigInteger(1, 2), 85 new BigInteger(1, 3), new BigInteger(1, 4), new BigInteger(1, 5), 86 new BigInteger(1, 6), new BigInteger(1, 7), new BigInteger(1, 8), 87 new BigInteger(1, 9), TEN }; 88 89 private transient int firstNonzeroDigit = -2; 90 91 /** sign field, used for serialization. */ 92 private int signum; 93 94 /** absolute value field, used for serialization */ 95 private byte[] magnitude; 96 97 /** Cache for the hash code. */ 98 private transient int hashCode = 0; 99 100 BigInteger(BigInt bigInt) { 101 if (bigInt == null || bigInt.getNativeBIGNUM() == 0) { 102 throw new AssertionError(); 103 } 104 setBigInt(bigInt); 105 } 106 107 BigInteger(int sign, long value) { 108 BigInt bigInt = new BigInt(); 109 bigInt.putULongInt(value, (sign < 0)); 110 setBigInt(bigInt); 111 } 112 113 /** 114 * Constructs a number without creating new space. This construct should be 115 * used only if the three fields of representation are known. 116 * 117 * @param sign the sign of the number. 118 * @param numberLength the length of the internal array. 119 * @param digits a reference of some array created before. 120 */ 121 BigInteger(int sign, int numberLength, int[] digits) { 122 setJavaRepresentation(sign, numberLength, digits); 123 } 124 125 /** 126 * Constructs a random non-negative {@code BigInteger} instance in the range 127 * {@code [0, pow(2, numBits)-1]}. 128 * 129 * @param numBits maximum length of the new {@code BigInteger} in bits. 130 * @param random is the random number generator to be used. 131 * @throws IllegalArgumentException if {@code numBits} < 0. 132 */ 133 public BigInteger(int numBits, Random random) { 134 if (numBits < 0) { 135 throw new IllegalArgumentException("numBits < 0: " + numBits); 136 } 137 if (numBits == 0) { 138 setJavaRepresentation(0, 1, new int[] { 0 }); 139 } else { 140 int sign = 1; 141 int numberLength = (numBits + 31) >> 5; 142 int[] digits = new int[numberLength]; 143 for (int i = 0; i < numberLength; i++) { 144 digits[i] = random.nextInt(); 145 } 146 // Using only the necessary bits 147 digits[numberLength - 1] >>>= (-numBits) & 31; 148 setJavaRepresentation(sign, numberLength, digits); 149 } 150 javaIsValid = true; 151 } 152 153 /** 154 * Constructs a random {@code BigInteger} instance in the range {@code [0, 155 * pow(2, bitLength)-1]} which is probably prime. The probability that the 156 * returned {@code BigInteger} is prime is beyond 157 * {@code 1 - 1/pow(2, certainty)}. 158 * 159 * <p><b>Implementation Note:</b> the {@code Random} argument is ignored. 160 * This implementation uses OpenSSL's {@code bn_rand} as a source of 161 * cryptographically strong pseudo-random numbers. 162 * 163 * @param bitLength length of the new {@code BigInteger} in bits. 164 * @param certainty tolerated primality uncertainty. 165 * @throws ArithmeticException if {@code bitLength < 2}. 166 * @see <a href="http://www.openssl.org/docs/crypto/BN_rand.html"> 167 * Specification of random generator used from OpenSSL library</a> 168 */ 169 public BigInteger(int bitLength, int certainty, Random unused) { 170 if (bitLength < 2) { 171 throw new ArithmeticException("bitLength < 2: " + bitLength); 172 } 173 setBigInt(BigInt.generatePrimeDefault(bitLength)); 174 } 175 176 /** 177 * Constructs a new {@code BigInteger} by parsing {@code value}. The string 178 * representation consists of an optional plus or minus sign followed by a 179 * non-empty sequence of decimal digits. Digits are interpreted as if by 180 * {@code Character.digit(char,10)}. 181 * 182 * @param value string representation of the new {@code BigInteger}. 183 * @throws NullPointerException if {@code value == null}. 184 * @throws NumberFormatException if {@code value} is not a valid 185 * representation of a {@code BigInteger}. 186 */ 187 public BigInteger(String value) { 188 BigInt bigInt = new BigInt(); 189 bigInt.putDecString(value); 190 setBigInt(bigInt); 191 } 192 193 /** 194 * Constructs a new {@code BigInteger} instance by parsing {@code value}. 195 * The string representation consists of an optional plus or minus sign 196 * followed by a non-empty sequence of digits in the specified radix. Digits 197 * are interpreted as if by {@code Character.digit(char, radix)}. 198 * 199 * @param value string representation of the new {@code BigInteger}. 200 * @param radix the base to be used for the conversion. 201 * @throws NullPointerException if {@code value == null}. 202 * @throws NumberFormatException if {@code value} is not a valid 203 * representation of a {@code BigInteger} or if {@code radix < 204 * Character.MIN_RADIX} or {@code radix > Character.MAX_RADIX}. 205 */ 206 public BigInteger(String value, int radix) { 207 if (value == null) { 208 throw new NullPointerException("value == null"); 209 } 210 if (radix == 10) { 211 BigInt bigInt = new BigInt(); 212 bigInt.putDecString(value); 213 setBigInt(bigInt); 214 } else if (radix == 16) { 215 BigInt bigInt = new BigInt(); 216 bigInt.putHexString(value); 217 setBigInt(bigInt); 218 } else { 219 if (radix < Character.MIN_RADIX || radix > Character.MAX_RADIX) { 220 throw new NumberFormatException("bad radix: " + radix); 221 } 222 if (value.isEmpty()) { 223 throw new NumberFormatException("value.isEmpty()"); 224 } 225 BigInteger.parseFromString(this, value, radix); 226 } 227 } 228 229 /** 230 * Constructs a new {@code BigInteger} instance with the given sign and 231 * magnitude. 232 * 233 * @param signum sign of the new {@code BigInteger} (-1 for negative, 0 for 234 * zero, 1 for positive). 235 * @param magnitude magnitude of the new {@code BigInteger} with the most 236 * significant byte first. 237 * @throws NullPointerException if {@code magnitude == null}. 238 * @throws NumberFormatException if the sign is not one of -1, 0, 1 or if 239 * the sign is zero and the magnitude contains non-zero entries. 240 */ 241 public BigInteger(int signum, byte[] magnitude) { 242 if (magnitude == null) { 243 throw new NullPointerException("magnitude == null"); 244 } 245 if (signum < -1 || signum > 1) { 246 throw new NumberFormatException("bad signum: " + signum); 247 } 248 if (signum == 0) { 249 for (byte element : magnitude) { 250 if (element != 0) { 251 throw new NumberFormatException("signum-magnitude mismatch"); 252 } 253 } 254 } 255 BigInt bigInt = new BigInt(); 256 bigInt.putBigEndian(magnitude, signum < 0); 257 setBigInt(bigInt); 258 } 259 260 /** 261 * Constructs a new {@code BigInteger} from the given two's complement 262 * representation. The most significant byte is the entry at index 0. The 263 * most significant bit of this entry determines the sign of the new {@code 264 * BigInteger} instance. The array must be nonempty. 265 * 266 * @param value two's complement representation of the new {@code 267 * BigInteger}. 268 * @throws NullPointerException if {@code value == null}. 269 * @throws NumberFormatException if the length of {@code value} is zero. 270 */ 271 public BigInteger(byte[] value) { 272 if (value.length == 0) { 273 throw new NumberFormatException("value.length == 0"); 274 } 275 BigInt bigInt = new BigInt(); 276 bigInt.putBigEndianTwosComplement(value); 277 setBigInt(bigInt); 278 } 279 280 /** 281 * Returns the internal native representation of this big integer, computing 282 * it if necessary. 283 */ 284 BigInt getBigInt() { 285 if (nativeIsValid) { 286 return bigInt; 287 } 288 289 synchronized (this) { 290 if (nativeIsValid) { 291 return bigInt; 292 } 293 BigInt bigInt = new BigInt(); 294 bigInt.putLittleEndianInts(digits, (sign < 0)); 295 setBigInt(bigInt); 296 return bigInt; 297 } 298 } 299 300 private void setBigInt(BigInt bigInt) { 301 this.bigInt = bigInt; 302 this.nativeIsValid = true; 303 } 304 305 private void setJavaRepresentation(int sign, int numberLength, int[] digits) { 306 // decrement numberLength to drop leading zeroes... 307 while (numberLength > 0 && digits[--numberLength] == 0) { 308 ; 309 } 310 // ... and then increment it back because we always drop one too many 311 if (digits[numberLength++] == 0) { 312 sign = 0; 313 } 314 this.sign = sign; 315 this.digits = digits; 316 this.numberLength = numberLength; 317 this.javaIsValid = true; 318 } 319 320 void prepareJavaRepresentation() { 321 if (javaIsValid) { 322 return; 323 } 324 325 synchronized (this) { 326 if (javaIsValid) { 327 return; 328 } 329 int sign = bigInt.sign(); 330 int[] digits = (sign != 0) ? bigInt.littleEndianIntsMagnitude() : new int[] { 0 }; 331 setJavaRepresentation(sign, digits.length, digits); 332 } 333 } 334 335 /** Returns a {@code BigInteger} whose value is equal to {@code value}. */ 336 public static BigInteger valueOf(long value) { 337 if (value < 0) { 338 if (value != -1) { 339 return new BigInteger(-1, -value); 340 } 341 return MINUS_ONE; 342 } else if (value < SMALL_VALUES.length) { 343 return SMALL_VALUES[(int) value]; 344 } else {// (value > 10) 345 return new BigInteger(1, value); 346 } 347 } 348 349 /** 350 * Returns the two's complement representation of this {@code BigInteger} in 351 * a byte array. 352 */ 353 public byte[] toByteArray() { 354 return twosComplement(); 355 } 356 357 /** 358 * Returns a {@code BigInteger} whose value is the absolute value of {@code 359 * this}. 360 */ 361 public BigInteger abs() { 362 BigInt bigInt = getBigInt(); 363 if (bigInt.sign() >= 0) { 364 return this; 365 } 366 BigInt a = bigInt.copy(); 367 a.setSign(1); 368 return new BigInteger(a); 369 } 370 371 /** 372 * Returns a {@code BigInteger} whose value is the {@code -this}. 373 */ 374 public BigInteger negate() { 375 BigInt bigInt = getBigInt(); 376 int sign = bigInt.sign(); 377 if (sign == 0) { 378 return this; 379 } 380 BigInt a = bigInt.copy(); 381 a.setSign(-sign); 382 return new BigInteger(a); 383 } 384 385 /** 386 * Returns a {@code BigInteger} whose value is {@code this + value}. 387 */ 388 public BigInteger add(BigInteger value) { 389 BigInt lhs = getBigInt(); 390 BigInt rhs = value.getBigInt(); 391 if (rhs.sign() == 0) { 392 return this; 393 } 394 if (lhs.sign() == 0) { 395 return value; 396 } 397 return new BigInteger(BigInt.addition(lhs, rhs)); 398 } 399 400 /** 401 * Returns a {@code BigInteger} whose value is {@code this - value}. 402 */ 403 public BigInteger subtract(BigInteger value) { 404 BigInt lhs = getBigInt(); 405 BigInt rhs = value.getBigInt(); 406 if (rhs.sign() == 0) { 407 return this; 408 } 409 return new BigInteger(BigInt.subtraction(lhs, rhs)); 410 } 411 412 /** 413 * Returns the sign of this {@code BigInteger}. 414 * 415 * @return {@code -1} if {@code this < 0}, {@code 0} if {@code this == 0}, 416 * {@code 1} if {@code this > 0}. 417 */ 418 public int signum() { 419 if (javaIsValid) { 420 return sign; 421 } 422 return getBigInt().sign(); 423 } 424 425 /** 426 * Returns a {@code BigInteger} whose value is {@code this >> n}. For 427 * negative arguments, the result is also negative. The shift distance may 428 * be negative which means that {@code this} is shifted left. 429 * 430 * <p><b>Implementation Note:</b> Usage of this method on negative values is 431 * not recommended as the current implementation is not efficient. 432 * 433 * @param n shift distance 434 * @return {@code this >> n} if {@code n >= 0}; {@code this << (-n)} 435 * otherwise 436 */ 437 public BigInteger shiftRight(int n) { 438 return shiftLeft(-n); 439 } 440 441 /** 442 * Returns a {@code BigInteger} whose value is {@code this << n}. The 443 * result is equivalent to {@code this * pow(2, n)} if n >= 0. The shift 444 * distance may be negative which means that {@code this} is shifted right. 445 * The result then corresponds to {@code floor(this / pow(2, -n))}. 446 * 447 * <p><b>Implementation Note:</b> Usage of this method on negative values is 448 * not recommended as the current implementation is not efficient. 449 * 450 * @param n shift distance. 451 * @return {@code this << n} if {@code n >= 0}; {@code this >> (-n)}. 452 * otherwise 453 */ 454 public BigInteger shiftLeft(int n) { 455 if (n == 0) { 456 return this; 457 } 458 int sign = signum(); 459 if (sign == 0) { 460 return this; 461 } 462 if ((sign > 0) || (n >= 0)) { 463 return new BigInteger(BigInt.shift(getBigInt(), n)); 464 } else { 465 // Negative numbers faking 2's complement: 466 // Not worth optimizing this: 467 // Sticking to Harmony Java implementation. 468 return BitLevel.shiftRight(this, -n); 469 } 470 } 471 472 BigInteger shiftLeftOneBit() { 473 return (signum() == 0) ? this : BitLevel.shiftLeftOneBit(this); 474 } 475 476 /** 477 * Returns the length of the value's two's complement representation without 478 * leading zeros for positive numbers / without leading ones for negative 479 * values. 480 * 481 * <p>The two's complement representation of {@code this} will be at least 482 * {@code bitLength() + 1} bits long. 483 * 484 * <p>The value will fit into an {@code int} if {@code bitLength() < 32} or 485 * into a {@code long} if {@code bitLength() < 64}. 486 * 487 * @return the length of the minimal two's complement representation for 488 * {@code this} without the sign bit. 489 */ 490 public int bitLength() { 491 // Optimization to avoid unnecessary duplicate representation: 492 if (!nativeIsValid && javaIsValid) { 493 return BitLevel.bitLength(this); 494 } 495 return getBigInt().bitLength(); 496 } 497 498 /** 499 * Tests whether the bit at position n in {@code this} is set. The result is 500 * equivalent to {@code this & pow(2, n) != 0}. 501 * 502 * <p><b>Implementation Note:</b> Usage of this method is not recommended as 503 * the current implementation is not efficient. 504 * 505 * @param n position where the bit in {@code this} has to be inspected. 506 * @throws ArithmeticException if {@code n < 0}. 507 */ 508 public boolean testBit(int n) { 509 if (n < 0) { 510 throw new ArithmeticException("n < 0: " + n); 511 } 512 int sign = signum(); 513 if (sign > 0 && nativeIsValid && !javaIsValid) { 514 return getBigInt().isBitSet(n); 515 } else { 516 // Negative numbers faking 2's complement: 517 // Not worth optimizing this: 518 // Sticking to Harmony Java implementation. 519 prepareJavaRepresentation(); 520 if (n == 0) { 521 return ((digits[0] & 1) != 0); 522 } 523 int intCount = n >> 5; 524 if (intCount >= numberLength) { 525 return (sign < 0); 526 } 527 int digit = digits[intCount]; 528 n = (1 << (n & 31)); // int with 1 set to the needed position 529 if (sign < 0) { 530 int firstNonZeroDigit = getFirstNonzeroDigit(); 531 if (intCount < firstNonZeroDigit) { 532 return false; 533 } else if (firstNonZeroDigit == intCount) { 534 digit = -digit; 535 } else { 536 digit = ~digit; 537 } 538 } 539 return ((digit & n) != 0); 540 } 541 } 542 543 /** 544 * Returns a {@code BigInteger} which has the same binary representation 545 * as {@code this} but with the bit at position n set. The result is 546 * equivalent to {@code this | pow(2, n)}. 547 * 548 * <p><b>Implementation Note:</b> Usage of this method is not recommended as 549 * the current implementation is not efficient. 550 * 551 * @param n position where the bit in {@code this} has to be set. 552 * @throws ArithmeticException if {@code n < 0}. 553 */ 554 public BigInteger setBit(int n) { 555 prepareJavaRepresentation(); 556 if (!testBit(n)) { 557 return BitLevel.flipBit(this, n); 558 } else { 559 return this; 560 } 561 } 562 563 /** 564 * Returns a {@code BigInteger} which has the same binary representation 565 * as {@code this} but with the bit at position n cleared. The result is 566 * equivalent to {@code this & ~pow(2, n)}. 567 * 568 * <p><b>Implementation Note:</b> Usage of this method is not recommended as 569 * the current implementation is not efficient. 570 * 571 * @param n position where the bit in {@code this} has to be cleared. 572 * @throws ArithmeticException if {@code n < 0}. 573 */ 574 public BigInteger clearBit(int n) { 575 prepareJavaRepresentation(); 576 if (testBit(n)) { 577 return BitLevel.flipBit(this, n); 578 } else { 579 return this; 580 } 581 } 582 583 /** 584 * Returns a {@code BigInteger} which has the same binary representation 585 * as {@code this} but with the bit at position n flipped. The result is 586 * equivalent to {@code this ^ pow(2, n)}. 587 * 588 * <p><b>Implementation Note:</b> Usage of this method is not recommended as 589 * the current implementation is not efficient. 590 * 591 * @param n position where the bit in {@code this} has to be flipped. 592 * @throws ArithmeticException if {@code n < 0}. 593 */ 594 public BigInteger flipBit(int n) { 595 prepareJavaRepresentation(); 596 if (n < 0) { 597 throw new ArithmeticException("n < 0: " + n); 598 } 599 return BitLevel.flipBit(this, n); 600 } 601 602 /** 603 * Returns the position of the lowest set bit in the two's complement 604 * representation of this {@code BigInteger}. If all bits are zero (this==0) 605 * then -1 is returned as result. 606 * 607 * <p><b>Implementation Note:</b> Usage of this method is not recommended as 608 * the current implementation is not efficient. 609 */ 610 public int getLowestSetBit() { 611 prepareJavaRepresentation(); 612 if (sign == 0) { 613 return -1; 614 } 615 // (sign != 0) implies that exists some non zero digit 616 int i = getFirstNonzeroDigit(); 617 return ((i << 5) + Integer.numberOfTrailingZeros(digits[i])); 618 } 619 620 /** 621 * Returns the number of bits in the two's complement representation of 622 * {@code this} which differ from the sign bit. If {@code this} is negative, 623 * the result is equivalent to the number of bits set in the two's 624 * complement representation of {@code -this - 1}. 625 * 626 * <p>Use {@code bitLength(0)} to find the length of the binary value in 627 * bits. 628 * 629 * <p><b>Implementation Note:</b> Usage of this method is not recommended as 630 * the current implementation is not efficient. 631 */ 632 public int bitCount() { 633 prepareJavaRepresentation(); 634 return BitLevel.bitCount(this); 635 } 636 637 /** 638 * Returns a {@code BigInteger} whose value is {@code ~this}. The result 639 * of this operation is {@code -this-1}. 640 * 641 * <p><b>Implementation Note:</b> Usage of this method is not recommended as 642 * the current implementation is not efficient. 643 */ 644 public BigInteger not() { 645 this.prepareJavaRepresentation(); 646 return Logical.not(this); 647 } 648 649 /** 650 * Returns a {@code BigInteger} whose value is {@code this & value}. 651 * 652 * <p><b>Implementation Note:</b> Usage of this method is not recommended 653 * as the current implementation is not efficient. 654 * 655 * @param value value to be and'ed with {@code this}. 656 * @throws NullPointerException if {@code value == null}. 657 */ 658 public BigInteger and(BigInteger value) { 659 this.prepareJavaRepresentation(); 660 value.prepareJavaRepresentation(); 661 return Logical.and(this, value); 662 } 663 664 /** 665 * Returns a {@code BigInteger} whose value is {@code this | value}. 666 * 667 * <p><b>Implementation Note:</b> Usage of this method is not recommended as 668 * the current implementation is not efficient. 669 * 670 * @param value value to be or'ed with {@code this}. 671 * @throws NullPointerException if {@code value == null}. 672 */ 673 public BigInteger or(BigInteger value) { 674 this.prepareJavaRepresentation(); 675 value.prepareJavaRepresentation(); 676 return Logical.or(this, value); 677 } 678 679 /** 680 * Returns a {@code BigInteger} whose value is {@code this ^ value}. 681 * 682 * <p><b>Implementation Note:</b> Usage of this method is not recommended as 683 * the current implementation is not efficient. 684 * 685 * @param value value to be xor'ed with {@code this} 686 * @throws NullPointerException if {@code value == null} 687 */ 688 public BigInteger xor(BigInteger value) { 689 this.prepareJavaRepresentation(); 690 value.prepareJavaRepresentation(); 691 return Logical.xor(this, value); 692 } 693 694 /** 695 * Returns a {@code BigInteger} whose value is {@code this & ~value}. 696 * Evaluating {@code x.andNot(value)} returns the same result as {@code 697 * x.and(value.not())}. 698 * 699 * <p><b>Implementation Note:</b> Usage of this method is not recommended 700 * as the current implementation is not efficient. 701 * 702 * @param value value to be not'ed and then and'ed with {@code this}. 703 * @throws NullPointerException if {@code value == null}. 704 */ 705 public BigInteger andNot(BigInteger value) { 706 this.prepareJavaRepresentation(); 707 value.prepareJavaRepresentation(); 708 return Logical.andNot(this, value); 709 } 710 711 /** 712 * Returns this {@code BigInteger} as an int value. If {@code this} is too 713 * big to be represented as an int, then {@code this % (1 << 32)} is 714 * returned. 715 */ 716 @Override 717 public int intValue() { 718 if (nativeIsValid && bigInt.twosCompFitsIntoBytes(4)) { 719 return (int) bigInt.longInt(); 720 } 721 this.prepareJavaRepresentation(); 722 return (sign * digits[0]); 723 } 724 725 /** 726 * Returns this {@code BigInteger} as a long value. If {@code this} is too 727 * big to be represented as a long, then {@code this % pow(2, 64)} is 728 * returned. 729 */ 730 @Override 731 public long longValue() { 732 if (nativeIsValid && bigInt.twosCompFitsIntoBytes(8)) { 733 return bigInt.longInt(); 734 } 735 prepareJavaRepresentation(); 736 long value = numberLength > 1 737 ? ((long) digits[1]) << 32 | digits[0] & 0xFFFFFFFFL 738 : digits[0] & 0xFFFFFFFFL; 739 return sign * value; 740 } 741 742 /** 743 * Returns this {@code BigInteger} as a float. If {@code this} is too big to 744 * be represented as a float, then {@code Float.POSITIVE_INFINITY} or 745 * {@code Float.NEGATIVE_INFINITY} is returned. Note that not all integers 746 * in the range {@code [-Float.MAX_VALUE, Float.MAX_VALUE]} can be exactly 747 * represented as a float. 748 */ 749 @Override 750 public float floatValue() { 751 return (float) doubleValue(); 752 } 753 754 /** 755 * Returns this {@code BigInteger} as a double. If {@code this} is too big 756 * to be represented as a double, then {@code Double.POSITIVE_INFINITY} or 757 * {@code Double.NEGATIVE_INFINITY} is returned. Note that not all integers 758 * in the range {@code [-Double.MAX_VALUE, Double.MAX_VALUE]} can be exactly 759 * represented as a double. 760 */ 761 @Override 762 public double doubleValue() { 763 return Conversion.bigInteger2Double(this); 764 } 765 766 /** 767 * Compares this {@code BigInteger} with {@code value}. Returns {@code -1} 768 * if {@code this < value}, {@code 0} if {@code this == value} and {@code 1} 769 * if {@code this > value}, . 770 * 771 * @param value value to be compared with {@code this}. 772 * @throws NullPointerException if {@code value == null}. 773 */ 774 public int compareTo(BigInteger value) { 775 return BigInt.cmp(getBigInt(), value.getBigInt()); 776 } 777 778 /** 779 * Returns the minimum of this {@code BigInteger} and {@code value}. 780 * 781 * @param value value to be used to compute the minimum with {@code this}. 782 * @throws NullPointerException if {@code value == null}. 783 */ 784 public BigInteger min(BigInteger value) { 785 return this.compareTo(value) == -1 ? this : value; 786 } 787 788 /** 789 * Returns the maximum of this {@code BigInteger} and {@code value}. 790 * 791 * @param value value to be used to compute the maximum with {@code this} 792 * @throws NullPointerException if {@code value == null} 793 */ 794 public BigInteger max(BigInteger value) { 795 return this.compareTo(value) == 1 ? this : value; 796 } 797 798 @Override 799 public int hashCode() { 800 if (hashCode != 0) { 801 return hashCode; 802 } 803 prepareJavaRepresentation(); 804 for (int digit : digits) { 805 hashCode = hashCode * 33 + digit; 806 } 807 hashCode = hashCode * sign; 808 return hashCode; 809 } 810 811 @Override 812 public boolean equals(Object x) { 813 if (this == x) { 814 return true; 815 } 816 if (x instanceof BigInteger) { 817 return this.compareTo((BigInteger) x) == 0; 818 } 819 return false; 820 } 821 822 /** 823 * Returns a string representation of this {@code BigInteger} in decimal 824 * form. 825 */ 826 @Override 827 public String toString() { 828 return getBigInt().decString(); 829 } 830 831 /** 832 * Returns a string containing a string representation of this {@code 833 * BigInteger} with base radix. If {@code radix < Character.MIN_RADIX} or 834 * {@code radix > Character.MAX_RADIX} then a decimal representation is 835 * returned. The characters of the string representation are generated with 836 * method {@code Character.forDigit}. 837 * 838 * @param radix base to be used for the string representation. 839 */ 840 public String toString(int radix) { 841 if (radix == 10) { 842 return getBigInt().decString(); 843 } else { 844 prepareJavaRepresentation(); 845 return Conversion.bigInteger2String(this, radix); 846 } 847 } 848 849 /** 850 * Returns a {@code BigInteger} whose value is greatest common divisor 851 * of {@code this} and {@code value}. If {@code this == 0} and {@code 852 * value == 0} then zero is returned, otherwise the result is positive. 853 * 854 * @param value value with which the greatest common divisor is computed. 855 * @throws NullPointerException if {@code value == null}. 856 */ 857 public BigInteger gcd(BigInteger value) { 858 return new BigInteger(BigInt.gcd(getBigInt(), value.getBigInt())); 859 } 860 861 /** 862 * Returns a {@code BigInteger} whose value is {@code this * value}. 863 * 864 * @throws NullPointerException if {@code value == null}. 865 */ 866 public BigInteger multiply(BigInteger value) { 867 return new BigInteger(BigInt.product(getBigInt(), value.getBigInt())); 868 } 869 870 /** 871 * Returns a {@code BigInteger} whose value is {@code pow(this, exp)}. 872 * 873 * @throws ArithmeticException if {@code exp < 0}. 874 */ 875 public BigInteger pow(int exp) { 876 if (exp < 0) { 877 throw new ArithmeticException("exp < 0: " + exp); 878 } 879 return new BigInteger(BigInt.exp(getBigInt(), exp)); 880 } 881 882 /** 883 * Returns a two element {@code BigInteger} array containing 884 * {@code this / divisor} at index 0 and {@code this % divisor} at index 1. 885 * 886 * @param divisor value by which {@code this} is divided. 887 * @throws NullPointerException if {@code divisor == null}. 888 * @throws ArithmeticException if {@code divisor == 0}. 889 * @see #divide 890 * @see #remainder 891 */ 892 public BigInteger[] divideAndRemainder(BigInteger divisor) { 893 BigInt divisorBigInt = divisor.getBigInt(); 894 BigInt quotient = new BigInt(); 895 BigInt remainder = new BigInt(); 896 BigInt.division(getBigInt(), divisorBigInt, quotient, remainder); 897 return new BigInteger[] {new BigInteger(quotient), new BigInteger(remainder) }; 898 } 899 900 /** 901 * Returns a {@code BigInteger} whose value is {@code this / divisor}. 902 * 903 * @param divisor value by which {@code this} is divided. 904 * @return {@code this / divisor}. 905 * @throws NullPointerException if {@code divisor == null}. 906 * @throws ArithmeticException if {@code divisor == 0}. 907 */ 908 public BigInteger divide(BigInteger divisor) { 909 BigInt quotient = new BigInt(); 910 BigInt.division(getBigInt(), divisor.getBigInt(), quotient, null); 911 return new BigInteger(quotient); 912 } 913 914 /** 915 * Returns a {@code BigInteger} whose value is {@code this % divisor}. 916 * Regarding signs this methods has the same behavior as the % operator on 917 * ints: the sign of the remainder is the same as the sign of this. 918 * 919 * @param divisor value by which {@code this} is divided. 920 * @throws NullPointerException if {@code divisor == null}. 921 * @throws ArithmeticException if {@code divisor == 0}. 922 */ 923 public BigInteger remainder(BigInteger divisor) { 924 BigInt remainder = new BigInt(); 925 BigInt.division(getBigInt(), divisor.getBigInt(), null, remainder); 926 return new BigInteger(remainder); 927 } 928 929 /** 930 * Returns a {@code BigInteger} whose value is {@code 1/this mod m}. The 931 * modulus {@code m} must be positive. The result is guaranteed to be in the 932 * interval {@code [0, m)} (0 inclusive, m exclusive). If {@code this} is 933 * not relatively prime to m, then an exception is thrown. 934 * 935 * @param m the modulus. 936 * @throws NullPointerException if {@code m == null} 937 * @throws ArithmeticException if {@code m < 0 or} if {@code this} is not 938 * relatively prime to {@code m} 939 */ 940 public BigInteger modInverse(BigInteger m) { 941 if (m.signum() <= 0) { 942 throw new ArithmeticException("modulus not positive"); 943 } 944 return new BigInteger(BigInt.modInverse(getBigInt(), m.getBigInt())); 945 } 946 947 /** 948 * Returns a {@code BigInteger} whose value is {@code 949 * pow(this, exponent) mod m}. The modulus {@code m} must be positive. The 950 * result is guaranteed to be in the interval {@code [0, m)} (0 inclusive, 951 * m exclusive). If the exponent is negative, then {@code 952 * pow(this.modInverse(m), -exponent) mod m} is computed. The inverse of 953 * this only exists if {@code this} is relatively prime to m, otherwise an 954 * exception is thrown. 955 * 956 * @param exponent the exponent. 957 * @param m the modulus. 958 * @throws NullPointerException if {@code m == null} or {@code exponent == 959 * null}. 960 * @throws ArithmeticException if {@code m < 0} or if {@code exponent<0} and 961 * this is not relatively prime to {@code m}. 962 */ 963 public BigInteger modPow(BigInteger exponent, BigInteger m) { 964 if (m.signum() <= 0) { 965 throw new ArithmeticException("m.signum() <= 0"); 966 } 967 BigInteger base = exponent.signum() < 0 ? modInverse(m) : this; 968 return new BigInteger(BigInt.modExp(base.getBigInt(), exponent.getBigInt(), m.getBigInt())); 969 } 970 971 /** 972 * Returns a {@code BigInteger} whose value is {@code this mod m}. The 973 * modulus {@code m} must be positive. The result is guaranteed to be in the 974 * interval {@code [0, m)} (0 inclusive, m exclusive). The behavior of this 975 * function is not equivalent to the behavior of the % operator defined for 976 * the built-in {@code int}'s. 977 * 978 * @param m the modulus. 979 * @return {@code this mod m}. 980 * @throws NullPointerException if {@code m == null}. 981 * @throws ArithmeticException if {@code m < 0}. 982 */ 983 public BigInteger mod(BigInteger m) { 984 if (m.signum() <= 0) { 985 throw new ArithmeticException("m.signum() <= 0"); 986 } 987 return new BigInteger(BigInt.modulus(getBigInt(), m.getBigInt())); 988 } 989 990 /** 991 * Tests whether this {@code BigInteger} is probably prime. If {@code true} 992 * is returned, then this is prime with a probability beyond 993 * {@code 1 - 1/pow(2, certainty)}. If {@code false} is returned, then this 994 * is definitely composite. If the argument {@code certainty} <= 0, then 995 * this method returns true. 996 * 997 * @param certainty tolerated primality uncertainty. 998 * @return {@code true}, if {@code this} is probably prime, {@code false} 999 * otherwise. 1000 */ 1001 public boolean isProbablePrime(int certainty) { 1002 if (certainty <= 0) { 1003 return true; 1004 } 1005 return getBigInt().isPrime(certainty); 1006 } 1007 1008 /** 1009 * Returns the smallest integer x > {@code this} which is probably prime as 1010 * a {@code BigInteger} instance. The probability that the returned {@code 1011 * BigInteger} is prime is beyond {@code 1 - 1/pow(2, 80)}. 1012 * 1013 * @return smallest integer > {@code this} which is probably prime. 1014 * @throws ArithmeticException if {@code this < 0}. 1015 */ 1016 public BigInteger nextProbablePrime() { 1017 if (sign < 0) { 1018 throw new ArithmeticException("sign < 0"); 1019 } 1020 return Primality.nextProbablePrime(this); 1021 } 1022 1023 /** 1024 * Returns a random positive {@code BigInteger} instance in the range {@code 1025 * [0, pow(2, bitLength)-1]} which is probably prime. The probability that 1026 * the returned {@code BigInteger} is prime is beyond {@code 1027 * 1 - 1/pow(2, 80)}. 1028 * 1029 * <p><b>Implementation Note:</b> Currently {@code random} is ignored. 1030 * 1031 * @param bitLength length of the new {@code BigInteger} in bits. 1032 * @return probably prime random {@code BigInteger} instance. 1033 * @throws IllegalArgumentException if {@code bitLength < 2}. 1034 */ 1035 public static BigInteger probablePrime(int bitLength, Random unused) { 1036 return new BigInteger(bitLength, 100, unused); 1037 } 1038 1039 /* Private Methods */ 1040 1041 /** 1042 * Returns the two's complement representation of this BigInteger in a byte 1043 * array. 1044 * 1045 * @return two's complement representation of {@code this} 1046 */ 1047 private byte[] twosComplement() { 1048 prepareJavaRepresentation(); 1049 if (this.sign == 0) { 1050 return new byte[] { 0 }; 1051 } 1052 BigInteger temp = this; 1053 int bitLen = bitLength(); 1054 int iThis = getFirstNonzeroDigit(); 1055 int bytesLen = (bitLen >> 3) + 1; 1056 /* Puts the little-endian int array representing the magnitude 1057 * of this BigInteger into the big-endian byte array. */ 1058 byte[] bytes = new byte[bytesLen]; 1059 int firstByteNumber = 0; 1060 int highBytes; 1061 int bytesInInteger = 4; 1062 int hB; 1063 1064 if (bytesLen - (numberLength << 2) == 1) { 1065 bytes[0] = (byte) ((sign < 0) ? -1 : 0); 1066 highBytes = 4; 1067 firstByteNumber++; 1068 } else { 1069 hB = bytesLen & 3; 1070 highBytes = (hB == 0) ? 4 : hB; 1071 } 1072 1073 int digitIndex = iThis; 1074 bytesLen -= iThis << 2; 1075 1076 if (sign < 0) { 1077 int digit = -temp.digits[digitIndex]; 1078 digitIndex++; 1079 if (digitIndex == numberLength) { 1080 bytesInInteger = highBytes; 1081 } 1082 for (int i = 0; i < bytesInInteger; i++, digit >>= 8) { 1083 bytes[--bytesLen] = (byte) digit; 1084 } 1085 while (bytesLen > firstByteNumber) { 1086 digit = ~temp.digits[digitIndex]; 1087 digitIndex++; 1088 if (digitIndex == numberLength) { 1089 bytesInInteger = highBytes; 1090 } 1091 for (int i = 0; i < bytesInInteger; i++, digit >>= 8) { 1092 bytes[--bytesLen] = (byte) digit; 1093 } 1094 } 1095 } else { 1096 while (bytesLen > firstByteNumber) { 1097 int digit = temp.digits[digitIndex]; 1098 digitIndex++; 1099 if (digitIndex == numberLength) { 1100 bytesInInteger = highBytes; 1101 } 1102 for (int i = 0; i < bytesInInteger; i++, digit >>= 8) { 1103 bytes[--bytesLen] = (byte) digit; 1104 } 1105 } 1106 } 1107 return bytes; 1108 } 1109 1110 1111 static int multiplyByInt(int[] res, int[] a, int aSize, int factor) { 1112 long carry = 0; 1113 1114 for (int i = 0; i < aSize; i++) { 1115 carry += (a[i] & 0xFFFFFFFFL) * (factor & 0xFFFFFFFFL); 1116 res[i] = (int) carry; 1117 carry >>>= 32; 1118 } 1119 return (int) carry; 1120 } 1121 1122 static int inplaceAdd(int[] a, int aSize, int addend) { 1123 long carry = addend & 0xFFFFFFFFL; 1124 1125 for (int i = 0; (carry != 0) && (i < aSize); i++) { 1126 carry += a[i] & 0xFFFFFFFFL; 1127 a[i] = (int) carry; 1128 carry >>= 32; 1129 } 1130 return (int) carry; 1131 } 1132 1133 /** @see BigInteger#BigInteger(String, int) */ 1134 private static void parseFromString(BigInteger bi, String value, int radix) { 1135 int stringLength = value.length(); 1136 int endChar = stringLength; 1137 1138 int sign; 1139 int startChar; 1140 if (value.charAt(0) == '-') { 1141 sign = -1; 1142 startChar = 1; 1143 stringLength--; 1144 } else { 1145 sign = 1; 1146 startChar = 0; 1147 } 1148 1149 /* 1150 * We use the following algorithm: split a string into portions of n 1151 * characters and convert each portion to an integer according to the 1152 * radix. Then convert an pow(radix, n) based number to binary using the 1153 * multiplication method. See D. Knuth, The Art of Computer Programming, 1154 * vol. 2. 1155 */ 1156 1157 int charsPerInt = Conversion.digitFitInInt[radix]; 1158 int bigRadixDigitsLength = stringLength / charsPerInt; 1159 int topChars = stringLength % charsPerInt; 1160 1161 if (topChars != 0) { 1162 bigRadixDigitsLength++; 1163 } 1164 int[] digits = new int[bigRadixDigitsLength]; 1165 // Get the maximal power of radix that fits in int 1166 int bigRadix = Conversion.bigRadices[radix - 2]; 1167 // Parse an input string and accumulate the BigInteger's magnitude 1168 int digitIndex = 0; // index of digits array 1169 int substrEnd = startChar + ((topChars == 0) ? charsPerInt : topChars); 1170 1171 for (int substrStart = startChar; substrStart < endChar; 1172 substrStart = substrEnd, substrEnd = substrStart + charsPerInt) { 1173 int bigRadixDigit = Integer.parseInt(value.substring(substrStart, substrEnd), radix); 1174 int newDigit = multiplyByInt(digits, digits, digitIndex, bigRadix); 1175 newDigit += inplaceAdd(digits, digitIndex, bigRadixDigit); 1176 digits[digitIndex++] = newDigit; 1177 } 1178 int numberLength = digitIndex; 1179 bi.setJavaRepresentation(sign, numberLength, digits); 1180 } 1181 1182 int getFirstNonzeroDigit() { 1183 if (firstNonzeroDigit == -2) { 1184 int i; 1185 if (this.sign == 0) { 1186 i = -1; 1187 } else { 1188 for (i = 0; digits[i] == 0; i++) { 1189 ; 1190 } 1191 } 1192 firstNonzeroDigit = i; 1193 } 1194 return firstNonzeroDigit; 1195 } 1196 1197 /** 1198 * Returns a copy of the current instance to achieve immutability 1199 */ 1200 BigInteger copy() { 1201 prepareJavaRepresentation(); 1202 int[] copyDigits = new int[numberLength]; 1203 System.arraycopy(digits, 0, copyDigits, 0, numberLength); 1204 return new BigInteger(sign, numberLength, copyDigits); 1205 } 1206 1207 /** 1208 * Assigns all transient fields upon deserialization of a {@code BigInteger} 1209 * instance. 1210 */ 1211 private void readObject(ObjectInputStream in) 1212 throws IOException, ClassNotFoundException { 1213 in.defaultReadObject(); 1214 BigInt bigInt = new BigInt(); 1215 bigInt.putBigEndian(magnitude, signum < 0); 1216 setBigInt(bigInt); 1217 } 1218 1219 /** 1220 * Prepares this {@code BigInteger} for serialization, i.e. the 1221 * non-transient fields {@code signum} and {@code magnitude} are assigned. 1222 */ 1223 private void writeObject(ObjectOutputStream out) throws IOException { 1224 BigInt bigInt = getBigInt(); 1225 signum = bigInt.sign(); 1226 magnitude = bigInt.bigEndianMagnitude(); 1227 out.defaultWriteObject(); 1228 } 1229} 1230