1 /* java.math.BigInteger -- Arbitary precision integers 2 Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2005, 2006, 2007, 2010 3 Free Software Foundation, Inc. 4 5 This file is part of GNU Classpath. 6 7 GNU Classpath is free software; you can redistribute it and/or modify 8 it under the terms of the GNU General Public License as published by 9 the Free Software Foundation; either version 2, or (at your option) 10 any later version. 11 12 GNU Classpath is distributed in the hope that it will be useful, but 13 WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with GNU Classpath; see the file COPYING. If not, write to the 19 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 20 02110-1301 USA. 21 22 Linking this library statically or dynamically with other modules is 23 making a combined work based on this library. Thus, the terms and 24 conditions of the GNU General Public License cover the whole 25 combination. 26 27 As a special exception, the copyright holders of this library give you 28 permission to link this library with independent modules to produce an 29 executable, regardless of the license terms of these independent 30 modules, and to copy and distribute the resulting executable under 31 terms of your choice, provided that you also meet, for each linked 32 independent module, the terms and conditions of the license of that 33 module. An independent module is a module which is not derived from 34 or based on this library. If you modify this library, you may extend 35 this exception to your version of the library, but you are not 36 obligated to do so. If you do not wish to do so, delete this 37 exception statement from your version. */ 38 39 40 package java.math; 41 42 import gnu.classpath.Configuration; 43 44 import gnu.java.lang.CPStringBuilder; 45 import gnu.java.math.GMP; 46 import gnu.java.math.MPN; 47 48 import java.io.IOException; 49 import java.io.ObjectInputStream; 50 import java.io.ObjectOutputStream; 51 import java.util.Random; 52 import java.util.logging.Logger; 53 54 /** 55 * Written using on-line Java Platform 1.2 API Specification, as well 56 * as "The Java Class Libraries", 2nd edition (Addison-Wesley, 1998) and 57 * "Applied Cryptography, Second Edition" by Bruce Schneier (Wiley, 1996). 58 * 59 * Based primarily on IntNum.java BitOps.java by Per Bothner (per@bothner.com) 60 * (found in Kawa 1.6.62). 61 * 62 * @author Warren Levy (warrenl@cygnus.com) 63 * @date December 20, 1999. 64 * @status believed complete and correct. 65 */ 66 public class BigInteger extends Number implements Comparable<BigInteger> 67 { 68 private static final Logger log = Configuration.DEBUG ? 69 Logger.getLogger(BigInteger.class.getName()) : null; 70 71 /** All integers are stored in 2's-complement form. 72 * If words == null, the ival is the value of this BigInteger. 73 * Otherwise, the first ival elements of words make the value 74 * of this BigInteger, stored in little-endian order, 2's-complement form. */ 75 private transient int ival; 76 private transient int[] words; 77 78 // Serialization fields. 79 // the first three, although not used in the code, are present for 80 // compatibility with older RI versions of this class. DO NOT REMOVE. 81 private int bitCount = -1; 82 private int bitLength = -1; 83 private int lowestSetBit = -2; 84 private byte[] magnitude; 85 private int signum; 86 private static final long serialVersionUID = -8287574255936472291L; 87 88 89 /** We pre-allocate integers in the range minFixNum..maxFixNum. 90 * Note that we must at least preallocate 0, 1, and 10. */ 91 private static final int minFixNum = -100; 92 private static final int maxFixNum = 1024; 93 private static final int numFixNum = maxFixNum-minFixNum+1; 94 private static final BigInteger[] smallFixNums; 95 96 /** The alter-ego GMP instance for this. */ 97 private transient GMP mpz; 98 99 private static final boolean USING_NATIVE = Configuration.WANT_NATIVE_BIG_INTEGER 100 && initializeLibrary(); 101 102 static 103 { 104 if (USING_NATIVE) 105 { 106 smallFixNums = null; 107 ZERO = valueOf(0L); 108 ONE = valueOf(1L); 109 TEN = valueOf(10L); 110 } 111 else 112 { 113 smallFixNums = new BigInteger[numFixNum]; 114 for (int i = numFixNum; --i >= 0; ) 115 smallFixNums[i] = new BigInteger(i + minFixNum); 116 117 ZERO = smallFixNums[-minFixNum]; 118 ONE = smallFixNums[1 - minFixNum]; 119 TEN = smallFixNums[10 - minFixNum]; 120 } 121 } 122 123 /** 124 * The constant zero as a BigInteger. 125 * @since 1.2 126 */ 127 public static final BigInteger ZERO; 128 129 /** 130 * The constant one as a BigInteger. 131 * @since 1.2 132 */ 133 public static final BigInteger ONE; 134 135 /** 136 * The constant ten as a BigInteger. 137 * @since 1.5 138 */ 139 public static final BigInteger TEN; 140 141 /* Rounding modes: */ 142 private static final int FLOOR = 1; 143 private static final int CEILING = 2; 144 private static final int TRUNCATE = 3; 145 private static final int ROUND = 4; 146 147 /** When checking the probability of primes, it is most efficient to 148 * first check the factoring of small primes, so we'll use this array. 149 */ 150 private static final int[] primes = 151 { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 152 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 153 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 154 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251 }; 155 156 /** HAC (Handbook of Applied Cryptography), Alfred Menezes & al. Table 4.4. */ 157 private static final int[] k = 158 {100,150,200,250,300,350,400,500,600,800,1250, Integer.MAX_VALUE}; 159 private static final int[] t = 160 { 27, 18, 15, 12, 9, 8, 7, 6, 5, 4, 3, 2}; 161 BigInteger()162 private BigInteger() 163 { 164 super(); 165 166 if (USING_NATIVE) 167 mpz = new GMP(); 168 } 169 170 /* Create a new (non-shared) BigInteger, and initialize to an int. */ BigInteger(int value)171 private BigInteger(int value) 172 { 173 super(); 174 175 ival = value; 176 } 177 BigInteger(String s, int radix)178 public BigInteger(String s, int radix) 179 { 180 this(); 181 182 int len = s.length(); 183 int i, digit; 184 boolean negative; 185 byte[] bytes; 186 char ch = s.charAt(0); 187 if (ch == '-') 188 { 189 negative = true; 190 i = 1; 191 bytes = new byte[len - 1]; 192 } 193 else 194 { 195 negative = false; 196 i = 0; 197 bytes = new byte[len]; 198 } 199 int byte_len = 0; 200 for ( ; i < len; i++) 201 { 202 ch = s.charAt(i); 203 digit = Character.digit(ch, radix); 204 if (digit < 0) 205 throw new NumberFormatException("Invalid character at position #" + i); 206 bytes[byte_len++] = (byte) digit; 207 } 208 209 if (USING_NATIVE) 210 { 211 bytes = null; 212 if (mpz.fromString(s, radix) != 0) 213 throw new NumberFormatException("String \"" + s 214 + "\" is NOT a valid number in base " 215 + radix); 216 } 217 else 218 { 219 BigInteger result; 220 // Testing (len < MPN.chars_per_word(radix)) would be more accurate, 221 // but slightly more expensive, for little practical gain. 222 if (len <= 15 && radix <= 16) 223 result = valueOf(Long.parseLong(s, radix)); 224 else 225 result = valueOf(bytes, byte_len, negative, radix); 226 227 this.ival = result.ival; 228 this.words = result.words; 229 } 230 } 231 BigInteger(String val)232 public BigInteger(String val) 233 { 234 this(val, 10); 235 } 236 237 /* Create a new (non-shared) BigInteger, and initialize from a byte array. */ BigInteger(byte[] val)238 public BigInteger(byte[] val) 239 { 240 this(); 241 242 if (val == null || val.length < 1) 243 throw new NumberFormatException(); 244 245 if (USING_NATIVE) 246 mpz.fromByteArray(val); 247 else 248 { 249 words = byteArrayToIntArray(val, val[0] < 0 ? -1 : 0); 250 BigInteger result = make(words, words.length); 251 this.ival = result.ival; 252 this.words = result.words; 253 } 254 } 255 BigInteger(int signum, byte[] magnitude)256 public BigInteger(int signum, byte[] magnitude) 257 { 258 this(); 259 260 if (magnitude == null || signum > 1 || signum < -1) 261 throw new NumberFormatException(); 262 263 if (signum == 0) 264 { 265 int i; 266 for (i = magnitude.length - 1; i >= 0 && magnitude[i] == 0; --i) 267 ; 268 if (i >= 0) 269 throw new NumberFormatException(); 270 return; 271 } 272 273 if (USING_NATIVE) 274 mpz.fromSignedMagnitude(magnitude, signum == -1); 275 else 276 { 277 // Magnitude is always positive, so don't ever pass a sign of -1. 278 words = byteArrayToIntArray(magnitude, 0); 279 BigInteger result = make(words, words.length); 280 this.ival = result.ival; 281 this.words = result.words; 282 283 if (signum < 0) 284 setNegative(); 285 } 286 } 287 BigInteger(int numBits, Random rnd)288 public BigInteger(int numBits, Random rnd) 289 { 290 this(); 291 292 if (numBits < 0) 293 throw new IllegalArgumentException(); 294 295 init(numBits, rnd); 296 } 297 init(int numBits, Random rnd)298 private void init(int numBits, Random rnd) 299 { 300 if (USING_NATIVE) 301 { 302 int length = (numBits + 7) / 8; 303 byte[] magnitude = new byte[length]; 304 rnd.nextBytes(magnitude); 305 int discardedBitCount = numBits % 8; 306 if (discardedBitCount != 0) 307 { 308 discardedBitCount = 8 - discardedBitCount; 309 magnitude[0] = (byte)((magnitude[0] & 0xFF) >>> discardedBitCount); 310 } 311 mpz.fromSignedMagnitude(magnitude, false); 312 magnitude = null; 313 return; 314 } 315 316 int highbits = numBits & 31; 317 // minimum number of bytes to store the above number of bits 318 int highBitByteCount = (highbits + 7) / 8; 319 // number of bits to discard from the last byte 320 int discardedBitCount = highbits % 8; 321 if (discardedBitCount != 0) 322 discardedBitCount = 8 - discardedBitCount; 323 byte[] highBitBytes = new byte[highBitByteCount]; 324 if (highbits > 0) 325 { 326 rnd.nextBytes(highBitBytes); 327 highbits = (highBitBytes[highBitByteCount - 1] & 0xFF) >>> discardedBitCount; 328 for (int i = highBitByteCount - 2; i >= 0; i--) 329 highbits = (highbits << 8) | (highBitBytes[i] & 0xFF); 330 } 331 int nwords = numBits / 32; 332 333 while (highbits == 0 && nwords > 0) 334 { 335 highbits = rnd.nextInt(); 336 --nwords; 337 } 338 if (nwords == 0 && highbits >= 0) 339 { 340 ival = highbits; 341 } 342 else 343 { 344 ival = highbits < 0 ? nwords + 2 : nwords + 1; 345 words = new int[ival]; 346 words[nwords] = highbits; 347 while (--nwords >= 0) 348 words[nwords] = rnd.nextInt(); 349 } 350 } 351 BigInteger(int bitLength, int certainty, Random rnd)352 public BigInteger(int bitLength, int certainty, Random rnd) 353 { 354 this(); 355 356 BigInteger result = new BigInteger(); 357 while (true) 358 { 359 result.init(bitLength, rnd); 360 result = result.setBit(bitLength - 1); 361 if (result.isProbablePrime(certainty)) 362 break; 363 } 364 365 if (USING_NATIVE) 366 mpz.fromBI(result.mpz); 367 else 368 { 369 this.ival = result.ival; 370 this.words = result.words; 371 } 372 } 373 374 /** 375 * Return a BigInteger that is bitLength bits long with a 376 * probability < 2^-100 of being composite. 377 * 378 * @param bitLength length in bits of resulting number 379 * @param rnd random number generator to use 380 * @throws ArithmeticException if bitLength < 2 381 * @since 1.4 382 */ probablePrime(int bitLength, Random rnd)383 public static BigInteger probablePrime(int bitLength, Random rnd) 384 { 385 if (bitLength < 2) 386 throw new ArithmeticException(); 387 388 return new BigInteger(bitLength, 100, rnd); 389 } 390 391 /** Return a (possibly-shared) BigInteger with a given long value. */ valueOf(long val)392 public static BigInteger valueOf(long val) 393 { 394 if (USING_NATIVE) 395 { 396 BigInteger result = new BigInteger(); 397 result.mpz.fromLong(val); 398 return result; 399 } 400 401 if (val >= minFixNum && val <= maxFixNum) 402 return smallFixNums[(int) val - minFixNum]; 403 int i = (int) val; 404 if ((long) i == val) 405 return new BigInteger(i); 406 BigInteger result = alloc(2); 407 result.ival = 2; 408 result.words[0] = i; 409 result.words[1] = (int)(val >> 32); 410 return result; 411 } 412 413 /** 414 * @return <code>true</code> if the GMP-based native implementation library 415 * was successfully loaded. Returns <code>false</code> otherwise. 416 */ initializeLibrary()417 private static boolean initializeLibrary() 418 { 419 boolean result; 420 try 421 { 422 System.loadLibrary("javamath"); 423 GMP.natInitializeLibrary(); 424 result = true; 425 } 426 catch (Throwable x) 427 { 428 result = false; 429 if (Configuration.DEBUG) 430 { 431 log.info("Unable to use native BigInteger: " + x); 432 log.info("Will use a pure Java implementation instead"); 433 } 434 } 435 return result; 436 } 437 438 /** Make a canonicalized BigInteger from an array of words. 439 * The array may be reused (without copying). */ make(int[] words, int len)440 private static BigInteger make(int[] words, int len) 441 { 442 if (words == null) 443 return valueOf(len); 444 len = BigInteger.wordsNeeded(words, len); 445 if (len <= 1) 446 return len == 0 ? ZERO : valueOf(words[0]); 447 BigInteger num = new BigInteger(); 448 num.words = words; 449 num.ival = len; 450 return num; 451 } 452 453 /** Convert a big-endian byte array to a little-endian array of words. */ byteArrayToIntArray(byte[] bytes, int sign)454 private static int[] byteArrayToIntArray(byte[] bytes, int sign) 455 { 456 // Determine number of words needed. 457 int[] words = new int[bytes.length/4 + 1]; 458 int nwords = words.length; 459 460 // Create a int out of modulo 4 high order bytes. 461 int bptr = 0; 462 int word = sign; 463 for (int i = bytes.length % 4; i > 0; --i, bptr++) 464 word = (word << 8) | (bytes[bptr] & 0xff); 465 words[--nwords] = word; 466 467 // Elements remaining in byte[] are a multiple of 4. 468 while (nwords > 0) 469 words[--nwords] = bytes[bptr++] << 24 | 470 (bytes[bptr++] & 0xff) << 16 | 471 (bytes[bptr++] & 0xff) << 8 | 472 (bytes[bptr++] & 0xff); 473 return words; 474 } 475 476 /** Allocate a new non-shared BigInteger. 477 * @param nwords number of words to allocate 478 */ alloc(int nwords)479 private static BigInteger alloc(int nwords) 480 { 481 BigInteger result = new BigInteger(); 482 if (nwords > 1) 483 result.words = new int[nwords]; 484 return result; 485 } 486 487 /** Change words.length to nwords. 488 * We allow words.length to be upto nwords+2 without reallocating. 489 */ realloc(int nwords)490 private void realloc(int nwords) 491 { 492 if (nwords == 0) 493 { 494 if (words != null) 495 { 496 if (ival > 0) 497 ival = words[0]; 498 words = null; 499 } 500 } 501 else if (words == null 502 || words.length < nwords 503 || words.length > nwords + 2) 504 { 505 int[] new_words = new int [nwords]; 506 if (words == null) 507 { 508 new_words[0] = ival; 509 ival = 1; 510 } 511 else 512 { 513 if (nwords < ival) 514 ival = nwords; 515 System.arraycopy(words, 0, new_words, 0, ival); 516 } 517 words = new_words; 518 } 519 } 520 isNegative()521 private boolean isNegative() 522 { 523 return (words == null ? ival : words[ival - 1]) < 0; 524 } 525 signum()526 public int signum() 527 { 528 if (USING_NATIVE) 529 return mpz.compare(ZERO.mpz); 530 531 if (ival == 0 && words == null) 532 return 0; 533 int top = words == null ? ival : words[ival-1]; 534 return top < 0 ? -1 : 1; 535 } 536 compareTo(BigInteger x, BigInteger y)537 private static int compareTo(BigInteger x, BigInteger y) 538 { 539 if (USING_NATIVE) 540 { 541 int dummy = y.signum; // force NPE check 542 return x.mpz.compare(y.mpz); 543 } 544 545 if (x.words == null && y.words == null) 546 return x.ival < y.ival ? -1 : x.ival > y.ival ? 1 : 0; 547 boolean x_negative = x.isNegative(); 548 boolean y_negative = y.isNegative(); 549 if (x_negative != y_negative) 550 return x_negative ? -1 : 1; 551 int x_len = x.words == null ? 1 : x.ival; 552 int y_len = y.words == null ? 1 : y.ival; 553 if (x_len != y_len) 554 return (x_len > y_len) != x_negative ? 1 : -1; 555 return MPN.cmp(x.words, y.words, x_len); 556 } 557 558 /** @since 1.2 */ compareTo(BigInteger val)559 public int compareTo(BigInteger val) 560 { 561 return compareTo(this, val); 562 } 563 min(BigInteger val)564 public BigInteger min(BigInteger val) 565 { 566 return compareTo(this, val) < 0 ? this : val; 567 } 568 max(BigInteger val)569 public BigInteger max(BigInteger val) 570 { 571 return compareTo(this, val) > 0 ? this : val; 572 } 573 isZero()574 private boolean isZero() 575 { 576 return words == null && ival == 0; 577 } 578 isOne()579 private boolean isOne() 580 { 581 return words == null && ival == 1; 582 } 583 584 /** Calculate how many words are significant in words[0:len-1]. 585 * Returns the least value x such that x>0 && words[0:x-1]==words[0:len-1], 586 * when words is viewed as a 2's complement integer. 587 */ wordsNeeded(int[] words, int len)588 private static int wordsNeeded(int[] words, int len) 589 { 590 int i = len; 591 if (i > 0) 592 { 593 int word = words[--i]; 594 if (word == -1) 595 { 596 while (i > 0 && (word = words[i - 1]) < 0) 597 { 598 i--; 599 if (word != -1) break; 600 } 601 } 602 else 603 { 604 while (word == 0 && i > 0 && (word = words[i - 1]) >= 0) i--; 605 } 606 } 607 return i + 1; 608 } 609 canonicalize()610 private BigInteger canonicalize() 611 { 612 if (words != null 613 && (ival = BigInteger.wordsNeeded(words, ival)) <= 1) 614 { 615 if (ival == 1) 616 ival = words[0]; 617 words = null; 618 } 619 if (words == null && ival >= minFixNum && ival <= maxFixNum) 620 return smallFixNums[ival - minFixNum]; 621 return this; 622 } 623 624 /** Add two ints, yielding a BigInteger. */ add(int x, int y)625 private static BigInteger add(int x, int y) 626 { 627 return valueOf((long) x + (long) y); 628 } 629 630 /** Add a BigInteger and an int, yielding a new BigInteger. */ add(BigInteger x, int y)631 private static BigInteger add(BigInteger x, int y) 632 { 633 if (x.words == null) 634 return BigInteger.add(x.ival, y); 635 BigInteger result = new BigInteger(0); 636 result.setAdd(x, y); 637 return result.canonicalize(); 638 } 639 640 /** Set this to the sum of x and y. 641 * OK if x==this. */ setAdd(BigInteger x, int y)642 private void setAdd(BigInteger x, int y) 643 { 644 if (x.words == null) 645 { 646 set((long) x.ival + (long) y); 647 return; 648 } 649 int len = x.ival; 650 realloc(len + 1); 651 long carry = y; 652 for (int i = 0; i < len; i++) 653 { 654 carry += ((long) x.words[i] & 0xffffffffL); 655 words[i] = (int) carry; 656 carry >>= 32; 657 } 658 if (x.words[len - 1] < 0) 659 carry--; 660 words[len] = (int) carry; 661 ival = wordsNeeded(words, len + 1); 662 } 663 664 /** Destructively add an int to this. */ setAdd(int y)665 private void setAdd(int y) 666 { 667 setAdd(this, y); 668 } 669 670 /** Destructively set the value of this to a long. */ set(long y)671 private void set(long y) 672 { 673 int i = (int) y; 674 if ((long) i == y) 675 { 676 ival = i; 677 words = null; 678 } 679 else 680 { 681 realloc(2); 682 words[0] = i; 683 words[1] = (int) (y >> 32); 684 ival = 2; 685 } 686 } 687 688 /** Destructively set the value of this to the given words. 689 * The words array is reused, not copied. */ set(int[] words, int length)690 private void set(int[] words, int length) 691 { 692 this.ival = length; 693 this.words = words; 694 } 695 696 /** Destructively set the value of this to that of y. */ set(BigInteger y)697 private void set(BigInteger y) 698 { 699 if (y.words == null) 700 set(y.ival); 701 else if (this != y) 702 { 703 realloc(y.ival); 704 System.arraycopy(y.words, 0, words, 0, y.ival); 705 ival = y.ival; 706 } 707 } 708 709 /** Add two BigIntegers, yielding their sum as another BigInteger. */ add(BigInteger x, BigInteger y, int k)710 private static BigInteger add(BigInteger x, BigInteger y, int k) 711 { 712 if (x.words == null && y.words == null) 713 return valueOf((long) k * (long) y.ival + (long) x.ival); 714 if (k != 1) 715 { 716 if (k == -1) 717 y = BigInteger.neg(y); 718 else 719 y = BigInteger.times(y, valueOf(k)); 720 } 721 if (x.words == null) 722 return BigInteger.add(y, x.ival); 723 if (y.words == null) 724 return BigInteger.add(x, y.ival); 725 // Both are big 726 if (y.ival > x.ival) 727 { // Swap so x is longer then y. 728 BigInteger tmp = x; x = y; y = tmp; 729 } 730 BigInteger result = alloc(x.ival + 1); 731 int i = y.ival; 732 long carry = MPN.add_n(result.words, x.words, y.words, i); 733 long y_ext = y.words[i - 1] < 0 ? 0xffffffffL : 0; 734 for (; i < x.ival; i++) 735 { 736 carry += ((long) x.words[i] & 0xffffffffL) + y_ext; 737 result.words[i] = (int) carry; 738 carry >>>= 32; 739 } 740 if (x.words[i - 1] < 0) 741 y_ext--; 742 result.words[i] = (int) (carry + y_ext); 743 result.ival = i+1; 744 return result.canonicalize(); 745 } 746 add(BigInteger val)747 public BigInteger add(BigInteger val) 748 { 749 if (USING_NATIVE) 750 { 751 int dummy = val.signum; // force NPE check 752 BigInteger result = new BigInteger(); 753 mpz.add(val.mpz, result.mpz); 754 return result; 755 } 756 757 return add(this, val, 1); 758 } 759 subtract(BigInteger val)760 public BigInteger subtract(BigInteger val) 761 { 762 if (USING_NATIVE) 763 { 764 int dummy = val.signum; // force NPE check 765 BigInteger result = new BigInteger(); 766 mpz.subtract(val.mpz, result.mpz); 767 return result; 768 } 769 770 return add(this, val, -1); 771 } 772 times(BigInteger x, int y)773 private static BigInteger times(BigInteger x, int y) 774 { 775 if (y == 0) 776 return ZERO; 777 if (y == 1) 778 return x; 779 int[] xwords = x.words; 780 int xlen = x.ival; 781 if (xwords == null) 782 return valueOf((long) xlen * (long) y); 783 boolean negative; 784 BigInteger result = BigInteger.alloc(xlen + 1); 785 if (xwords[xlen - 1] < 0) 786 { 787 negative = true; 788 negate(result.words, xwords, xlen); 789 xwords = result.words; 790 } 791 else 792 negative = false; 793 if (y < 0) 794 { 795 negative = !negative; 796 y = -y; 797 } 798 result.words[xlen] = MPN.mul_1(result.words, xwords, xlen, y); 799 result.ival = xlen + 1; 800 if (negative) 801 result.setNegative(); 802 return result.canonicalize(); 803 } 804 times(BigInteger x, BigInteger y)805 private static BigInteger times(BigInteger x, BigInteger y) 806 { 807 if (y.words == null) 808 return times(x, y.ival); 809 if (x.words == null) 810 return times(y, x.ival); 811 boolean negative = false; 812 int[] xwords; 813 int[] ywords; 814 int xlen = x.ival; 815 int ylen = y.ival; 816 if (x.isNegative()) 817 { 818 negative = true; 819 xwords = new int[xlen]; 820 negate(xwords, x.words, xlen); 821 } 822 else 823 { 824 negative = false; 825 xwords = x.words; 826 } 827 if (y.isNegative()) 828 { 829 negative = !negative; 830 ywords = new int[ylen]; 831 negate(ywords, y.words, ylen); 832 } 833 else 834 ywords = y.words; 835 // Swap if x is shorter then y. 836 if (xlen < ylen) 837 { 838 int[] twords = xwords; xwords = ywords; ywords = twords; 839 int tlen = xlen; xlen = ylen; ylen = tlen; 840 } 841 BigInteger result = BigInteger.alloc(xlen+ylen); 842 MPN.mul(result.words, xwords, xlen, ywords, ylen); 843 result.ival = xlen+ylen; 844 if (negative) 845 result.setNegative(); 846 return result.canonicalize(); 847 } 848 multiply(BigInteger y)849 public BigInteger multiply(BigInteger y) 850 { 851 if (USING_NATIVE) 852 { 853 int dummy = y.signum; // force NPE check 854 BigInteger result = new BigInteger(); 855 mpz.multiply(y.mpz, result.mpz); 856 return result; 857 } 858 859 return times(this, y); 860 } 861 divide(long x, long y, BigInteger quotient, BigInteger remainder, int rounding_mode)862 private static void divide(long x, long y, 863 BigInteger quotient, BigInteger remainder, 864 int rounding_mode) 865 { 866 boolean xNegative, yNegative; 867 if (x < 0) 868 { 869 xNegative = true; 870 if (x == Long.MIN_VALUE) 871 { 872 divide(valueOf(x), valueOf(y), 873 quotient, remainder, rounding_mode); 874 return; 875 } 876 x = -x; 877 } 878 else 879 xNegative = false; 880 881 if (y < 0) 882 { 883 yNegative = true; 884 if (y == Long.MIN_VALUE) 885 { 886 if (rounding_mode == TRUNCATE) 887 { // x != Long.Min_VALUE implies abs(x) < abs(y) 888 if (quotient != null) 889 quotient.set(0); 890 if (remainder != null) 891 remainder.set(x); 892 } 893 else 894 divide(valueOf(x), valueOf(y), 895 quotient, remainder, rounding_mode); 896 return; 897 } 898 y = -y; 899 } 900 else 901 yNegative = false; 902 903 long q = x / y; 904 long r = x % y; 905 boolean qNegative = xNegative ^ yNegative; 906 907 boolean add_one = false; 908 if (r != 0) 909 { 910 switch (rounding_mode) 911 { 912 case TRUNCATE: 913 break; 914 case CEILING: 915 case FLOOR: 916 if (qNegative == (rounding_mode == FLOOR)) 917 add_one = true; 918 break; 919 case ROUND: 920 add_one = r > ((y - (q & 1)) >> 1); 921 break; 922 } 923 } 924 if (quotient != null) 925 { 926 if (add_one) 927 q++; 928 if (qNegative) 929 q = -q; 930 quotient.set(q); 931 } 932 if (remainder != null) 933 { 934 // The remainder is by definition: X-Q*Y 935 if (add_one) 936 { 937 // Subtract the remainder from Y. 938 r = y - r; 939 // In this case, abs(Q*Y) > abs(X). 940 // So sign(remainder) = -sign(X). 941 xNegative = ! xNegative; 942 } 943 else 944 { 945 // If !add_one, then: abs(Q*Y) <= abs(X). 946 // So sign(remainder) = sign(X). 947 } 948 if (xNegative) 949 r = -r; 950 remainder.set(r); 951 } 952 } 953 954 /** Divide two integers, yielding quotient and remainder. 955 * @param x the numerator in the division 956 * @param y the denominator in the division 957 * @param quotient is set to the quotient of the result (iff quotient!=null) 958 * @param remainder is set to the remainder of the result 959 * (iff remainder!=null) 960 * @param rounding_mode one of FLOOR, CEILING, TRUNCATE, or ROUND. 961 */ divide(BigInteger x, BigInteger y, BigInteger quotient, BigInteger remainder, int rounding_mode)962 private static void divide(BigInteger x, BigInteger y, 963 BigInteger quotient, BigInteger remainder, 964 int rounding_mode) 965 { 966 if ((x.words == null || x.ival <= 2) 967 && (y.words == null || y.ival <= 2)) 968 { 969 long x_l = x.longValue(); 970 long y_l = y.longValue(); 971 if (x_l != Long.MIN_VALUE && y_l != Long.MIN_VALUE) 972 { 973 divide(x_l, y_l, quotient, remainder, rounding_mode); 974 return; 975 } 976 } 977 978 boolean xNegative = x.isNegative(); 979 boolean yNegative = y.isNegative(); 980 boolean qNegative = xNegative ^ yNegative; 981 982 int ylen = y.words == null ? 1 : y.ival; 983 int[] ywords = new int[ylen]; 984 y.getAbsolute(ywords); 985 while (ylen > 1 && ywords[ylen - 1] == 0) ylen--; 986 987 int xlen = x.words == null ? 1 : x.ival; 988 int[] xwords = new int[xlen+2]; 989 x.getAbsolute(xwords); 990 while (xlen > 1 && xwords[xlen-1] == 0) xlen--; 991 992 int qlen, rlen; 993 994 int cmpval = MPN.cmp(xwords, xlen, ywords, ylen); 995 if (cmpval < 0) // abs(x) < abs(y) 996 { // quotient = 0; remainder = num. 997 int[] rwords = xwords; xwords = ywords; ywords = rwords; 998 rlen = xlen; qlen = 1; xwords[0] = 0; 999 } 1000 else if (cmpval == 0) // abs(x) == abs(y) 1001 { 1002 xwords[0] = 1; qlen = 1; // quotient = 1 1003 ywords[0] = 0; rlen = 1; // remainder = 0; 1004 } 1005 else if (ylen == 1) 1006 { 1007 qlen = xlen; 1008 // Need to leave room for a word of leading zeros if dividing by 1 1009 // and the dividend has the high bit set. It might be safe to 1010 // increment qlen in all cases, but it certainly is only necessary 1011 // in the following case. 1012 if (ywords[0] == 1 && xwords[xlen-1] < 0) 1013 qlen++; 1014 rlen = 1; 1015 ywords[0] = MPN.divmod_1(xwords, xwords, xlen, ywords[0]); 1016 } 1017 else // abs(x) > abs(y) 1018 { 1019 // Normalize the denominator, i.e. make its most significant bit set by 1020 // shifting it normalization_steps bits to the left. Also shift the 1021 // numerator the same number of steps (to keep the quotient the same!). 1022 1023 int nshift = MPN.count_leading_zeros(ywords[ylen - 1]); 1024 if (nshift != 0) 1025 { 1026 // Shift up the denominator setting the most significant bit of 1027 // the most significant word. 1028 MPN.lshift(ywords, 0, ywords, ylen, nshift); 1029 1030 // Shift up the numerator, possibly introducing a new most 1031 // significant word. 1032 int x_high = MPN.lshift(xwords, 0, xwords, xlen, nshift); 1033 xwords[xlen++] = x_high; 1034 } 1035 1036 if (xlen == ylen) 1037 xwords[xlen++] = 0; 1038 MPN.divide(xwords, xlen, ywords, ylen); 1039 rlen = ylen; 1040 MPN.rshift0 (ywords, xwords, 0, rlen, nshift); 1041 1042 qlen = xlen + 1 - ylen; 1043 if (quotient != null) 1044 { 1045 for (int i = 0; i < qlen; i++) 1046 xwords[i] = xwords[i+ylen]; 1047 } 1048 } 1049 1050 if (ywords[rlen-1] < 0) 1051 { 1052 ywords[rlen] = 0; 1053 rlen++; 1054 } 1055 1056 // Now the quotient is in xwords, and the remainder is in ywords. 1057 1058 boolean add_one = false; 1059 if (rlen > 1 || ywords[0] != 0) 1060 { // Non-zero remainder i.e. in-exact quotient. 1061 switch (rounding_mode) 1062 { 1063 case TRUNCATE: 1064 break; 1065 case CEILING: 1066 case FLOOR: 1067 if (qNegative == (rounding_mode == FLOOR)) 1068 add_one = true; 1069 break; 1070 case ROUND: 1071 // int cmp = compareTo(remainder<<1, abs(y)); 1072 BigInteger tmp = remainder == null ? new BigInteger() : remainder; 1073 tmp.set(ywords, rlen); 1074 tmp = shift(tmp, 1); 1075 if (yNegative) 1076 tmp.setNegative(); 1077 int cmp = compareTo(tmp, y); 1078 // Now cmp == compareTo(sign(y)*(remainder<<1), y) 1079 if (yNegative) 1080 cmp = -cmp; 1081 add_one = (cmp == 1) || (cmp == 0 && (xwords[0]&1) != 0); 1082 } 1083 } 1084 if (quotient != null) 1085 { 1086 quotient.set(xwords, qlen); 1087 if (qNegative) 1088 { 1089 if (add_one) // -(quotient + 1) == ~(quotient) 1090 quotient.setInvert(); 1091 else 1092 quotient.setNegative(); 1093 } 1094 else if (add_one) 1095 quotient.setAdd(1); 1096 } 1097 if (remainder != null) 1098 { 1099 // The remainder is by definition: X-Q*Y 1100 remainder.set(ywords, rlen); 1101 if (add_one) 1102 { 1103 // Subtract the remainder from Y: 1104 // abs(R) = abs(Y) - abs(orig_rem) = -(abs(orig_rem) - abs(Y)). 1105 BigInteger tmp; 1106 if (y.words == null) 1107 { 1108 tmp = remainder; 1109 tmp.set(yNegative ? ywords[0] + y.ival : ywords[0] - y.ival); 1110 } 1111 else 1112 tmp = BigInteger.add(remainder, y, yNegative ? 1 : -1); 1113 // Now tmp <= 0. 1114 // In this case, abs(Q) = 1 + floor(abs(X)/abs(Y)). 1115 // Hence, abs(Q*Y) > abs(X). 1116 // So sign(remainder) = -sign(X). 1117 if (xNegative) 1118 remainder.setNegative(tmp); 1119 else 1120 remainder.set(tmp); 1121 } 1122 else 1123 { 1124 // If !add_one, then: abs(Q*Y) <= abs(X). 1125 // So sign(remainder) = sign(X). 1126 if (xNegative) 1127 remainder.setNegative(); 1128 } 1129 } 1130 } 1131 divide(BigInteger val)1132 public BigInteger divide(BigInteger val) 1133 { 1134 if (USING_NATIVE) 1135 { 1136 if (val.compareTo(ZERO) == 0) 1137 throw new ArithmeticException("divisor is zero"); 1138 1139 BigInteger result = new BigInteger(); 1140 mpz.quotient(val.mpz, result.mpz); 1141 return result; 1142 } 1143 1144 if (val.isZero()) 1145 throw new ArithmeticException("divisor is zero"); 1146 1147 BigInteger quot = new BigInteger(); 1148 divide(this, val, quot, null, TRUNCATE); 1149 return quot.canonicalize(); 1150 } 1151 remainder(BigInteger val)1152 public BigInteger remainder(BigInteger val) 1153 { 1154 if (USING_NATIVE) 1155 { 1156 if (val.compareTo(ZERO) == 0) 1157 throw new ArithmeticException("divisor is zero"); 1158 1159 BigInteger result = new BigInteger(); 1160 mpz.remainder(val.mpz, result.mpz); 1161 return result; 1162 } 1163 1164 if (val.isZero()) 1165 throw new ArithmeticException("divisor is zero"); 1166 1167 BigInteger rem = new BigInteger(); 1168 divide(this, val, null, rem, TRUNCATE); 1169 return rem.canonicalize(); 1170 } 1171 divideAndRemainder(BigInteger val)1172 public BigInteger[] divideAndRemainder(BigInteger val) 1173 { 1174 if (USING_NATIVE) 1175 { 1176 if (val.compareTo(ZERO) == 0) 1177 throw new ArithmeticException("divisor is zero"); 1178 1179 BigInteger q = new BigInteger(); 1180 BigInteger r = new BigInteger(); 1181 mpz.quotientAndRemainder(val.mpz, q.mpz, r.mpz); 1182 return new BigInteger[] { q, r }; 1183 } 1184 1185 if (val.isZero()) 1186 throw new ArithmeticException("divisor is zero"); 1187 1188 BigInteger[] result = new BigInteger[2]; 1189 result[0] = new BigInteger(); 1190 result[1] = new BigInteger(); 1191 divide(this, val, result[0], result[1], TRUNCATE); 1192 result[0].canonicalize(); 1193 result[1].canonicalize(); 1194 return result; 1195 } 1196 mod(BigInteger m)1197 public BigInteger mod(BigInteger m) 1198 { 1199 if (USING_NATIVE) 1200 { 1201 int dummy = m.signum; // force NPE check 1202 if (m.compareTo(ZERO) < 1) 1203 throw new ArithmeticException("non-positive modulus"); 1204 1205 BigInteger result = new BigInteger(); 1206 mpz.modulo(m.mpz, result.mpz); 1207 return result; 1208 } 1209 1210 if (m.isNegative() || m.isZero()) 1211 throw new ArithmeticException("non-positive modulus"); 1212 1213 BigInteger rem = new BigInteger(); 1214 divide(this, m, null, rem, FLOOR); 1215 return rem.canonicalize(); 1216 } 1217 1218 /** Calculate the integral power of a BigInteger. 1219 * @param exponent the exponent (must be non-negative) 1220 */ pow(int exponent)1221 public BigInteger pow(int exponent) 1222 { 1223 if (exponent <= 0) 1224 { 1225 if (exponent == 0) 1226 return ONE; 1227 throw new ArithmeticException("negative exponent"); 1228 } 1229 1230 if (USING_NATIVE) 1231 { 1232 BigInteger result = new BigInteger(); 1233 mpz.pow(exponent, result.mpz); 1234 return result; 1235 } 1236 1237 if (isZero()) 1238 return this; 1239 int plen = words == null ? 1 : ival; // Length of pow2. 1240 int blen = ((bitLength() * exponent) >> 5) + 2 * plen; 1241 boolean negative = isNegative() && (exponent & 1) != 0; 1242 int[] pow2 = new int [blen]; 1243 int[] rwords = new int [blen]; 1244 int[] work = new int [blen]; 1245 getAbsolute(pow2); // pow2 = abs(this); 1246 int rlen = 1; 1247 rwords[0] = 1; // rwords = 1; 1248 for (;;) // for (i = 0; ; i++) 1249 { 1250 // pow2 == this**(2**i) 1251 // prod = this**(sum(j=0..i-1, (exponent>>j)&1)) 1252 if ((exponent & 1) != 0) 1253 { // r *= pow2 1254 MPN.mul(work, pow2, plen, rwords, rlen); 1255 int[] temp = work; work = rwords; rwords = temp; 1256 rlen += plen; 1257 while (rwords[rlen - 1] == 0) rlen--; 1258 } 1259 exponent >>= 1; 1260 if (exponent == 0) 1261 break; 1262 // pow2 *= pow2; 1263 MPN.mul(work, pow2, plen, pow2, plen); 1264 int[] temp = work; work = pow2; pow2 = temp; // swap to avoid a copy 1265 plen *= 2; 1266 while (pow2[plen - 1] == 0) plen--; 1267 } 1268 if (rwords[rlen - 1] < 0) 1269 rlen++; 1270 if (negative) 1271 negate(rwords, rwords, rlen); 1272 return BigInteger.make(rwords, rlen); 1273 } 1274 euclidInv(int a, int b, int prevDiv)1275 private static int[] euclidInv(int a, int b, int prevDiv) 1276 { 1277 if (b == 0) 1278 throw new ArithmeticException("not invertible"); 1279 1280 if (b == 1) 1281 // Success: values are indeed invertible! 1282 // Bottom of the recursion reached; start unwinding. 1283 return new int[] { -prevDiv, 1 }; 1284 1285 int[] xy = euclidInv(b, a % b, a / b); // Recursion happens here. 1286 a = xy[0]; // use our local copy of 'a' as a work var 1287 xy[0] = a * -prevDiv + xy[1]; 1288 xy[1] = a; 1289 return xy; 1290 } 1291 euclidInv(BigInteger a, BigInteger b, BigInteger prevDiv, BigInteger[] xy)1292 private static void euclidInv(BigInteger a, BigInteger b, 1293 BigInteger prevDiv, BigInteger[] xy) 1294 { 1295 if (b.isZero()) 1296 throw new ArithmeticException("not invertible"); 1297 1298 if (b.isOne()) 1299 { 1300 // Success: values are indeed invertible! 1301 // Bottom of the recursion reached; start unwinding. 1302 xy[0] = neg(prevDiv); 1303 xy[1] = ONE; 1304 return; 1305 } 1306 1307 // Recursion happens in the following conditional! 1308 1309 // If a just contains an int, then use integer math for the rest. 1310 if (a.words == null) 1311 { 1312 int[] xyInt = euclidInv(b.ival, a.ival % b.ival, a.ival / b.ival); 1313 xy[0] = new BigInteger(xyInt[0]); 1314 xy[1] = new BigInteger(xyInt[1]); 1315 } 1316 else 1317 { 1318 BigInteger rem = new BigInteger(); 1319 BigInteger quot = new BigInteger(); 1320 divide(a, b, quot, rem, FLOOR); 1321 // quot and rem may not be in canonical form. ensure 1322 rem.canonicalize(); 1323 quot.canonicalize(); 1324 euclidInv(b, rem, quot, xy); 1325 } 1326 1327 BigInteger t = xy[0]; 1328 xy[0] = add(xy[1], times(t, prevDiv), -1); 1329 xy[1] = t; 1330 } 1331 modInverse(BigInteger y)1332 public BigInteger modInverse(BigInteger y) 1333 { 1334 if (USING_NATIVE) 1335 { 1336 int dummy = y.signum; // force NPE check 1337 if (mpz.compare(ZERO.mpz) < 1) 1338 throw new ArithmeticException("non-positive modulo"); 1339 1340 BigInteger result = new BigInteger(); 1341 mpz.modInverse(y.mpz, result.mpz); 1342 return result; 1343 } 1344 1345 if (y.isNegative() || y.isZero()) 1346 throw new ArithmeticException("non-positive modulo"); 1347 1348 // Degenerate cases. 1349 if (y.isOne()) 1350 return ZERO; 1351 if (isOne()) 1352 return ONE; 1353 1354 // Use Euclid's algorithm as in gcd() but do this recursively 1355 // rather than in a loop so we can use the intermediate results as we 1356 // unwind from the recursion. 1357 // Used http://www.math.nmsu.edu/~crypto/EuclideanAlgo.html as reference. 1358 BigInteger result = new BigInteger(); 1359 boolean swapped = false; 1360 1361 if (y.words == null) 1362 { 1363 // The result is guaranteed to be less than the modulus, y (which is 1364 // an int), so simplify this by working with the int result of this 1365 // modulo y. Also, if this is negative, make it positive via modulo 1366 // math. Note that BigInteger.mod() must be used even if this is 1367 // already an int as the % operator would provide a negative result if 1368 // this is negative, BigInteger.mod() never returns negative values. 1369 int xval = (words != null || isNegative()) ? mod(y).ival : ival; 1370 int yval = y.ival; 1371 1372 // Swap values so x > y. 1373 if (yval > xval) 1374 { 1375 int tmp = xval; xval = yval; yval = tmp; 1376 swapped = true; 1377 } 1378 // Normally, the result is in the 2nd element of the array, but 1379 // if originally x < y, then x and y were swapped and the result 1380 // is in the 1st element of the array. 1381 result.ival = 1382 euclidInv(yval, xval % yval, xval / yval)[swapped ? 0 : 1]; 1383 1384 // Result can't be negative, so make it positive by adding the 1385 // original modulus, y.ival (not the possibly "swapped" yval). 1386 if (result.ival < 0) 1387 result.ival += y.ival; 1388 } 1389 else 1390 { 1391 // As above, force this to be a positive value via modulo math. 1392 BigInteger x = isNegative() ? this.mod(y) : this; 1393 1394 // Swap values so x > y. 1395 if (x.compareTo(y) < 0) 1396 { 1397 result = x; x = y; y = result; // use 'result' as a work var 1398 swapped = true; 1399 } 1400 // As above (for ints), result will be in the 2nd element unless 1401 // the original x and y were swapped. 1402 BigInteger rem = new BigInteger(); 1403 BigInteger quot = new BigInteger(); 1404 divide(x, y, quot, rem, FLOOR); 1405 // quot and rem may not be in canonical form. ensure 1406 rem.canonicalize(); 1407 quot.canonicalize(); 1408 BigInteger[] xy = new BigInteger[2]; 1409 euclidInv(y, rem, quot, xy); 1410 result = swapped ? xy[0] : xy[1]; 1411 1412 // Result can't be negative, so make it positive by adding the 1413 // original modulus, y (which is now x if they were swapped). 1414 if (result.isNegative()) 1415 result = add(result, swapped ? x : y, 1); 1416 } 1417 1418 return result; 1419 } 1420 modPow(BigInteger exponent, BigInteger m)1421 public BigInteger modPow(BigInteger exponent, BigInteger m) 1422 { 1423 if (USING_NATIVE) 1424 { 1425 int dummy = exponent.signum; // force NPE check 1426 if (m.mpz.compare(ZERO.mpz) < 1) 1427 throw new ArithmeticException("non-positive modulo"); 1428 1429 BigInteger result = new BigInteger(); 1430 mpz.modPow(exponent.mpz, m.mpz, result.mpz); 1431 return result; 1432 } 1433 1434 if (m.isNegative() || m.isZero()) 1435 throw new ArithmeticException("non-positive modulo"); 1436 1437 if (exponent.isNegative()) 1438 return modInverse(m).modPow(exponent.negate(), m); 1439 if (exponent.isOne()) 1440 return mod(m); 1441 1442 // To do this naively by first raising this to the power of exponent 1443 // and then performing modulo m would be extremely expensive, especially 1444 // for very large numbers. The solution is found in Number Theory 1445 // where a combination of partial powers and moduli can be done easily. 1446 // 1447 // We'll use the algorithm for Additive Chaining which can be found on 1448 // p. 244 of "Applied Cryptography, Second Edition" by Bruce Schneier. 1449 BigInteger s = ONE; 1450 BigInteger t = this; 1451 BigInteger u = exponent; 1452 1453 while (!u.isZero()) 1454 { 1455 if (u.and(ONE).isOne()) 1456 s = times(s, t).mod(m); 1457 u = u.shiftRight(1); 1458 t = times(t, t).mod(m); 1459 } 1460 1461 return s; 1462 } 1463 1464 /** Calculate Greatest Common Divisor for non-negative ints. */ gcd(int a, int b)1465 private static int gcd(int a, int b) 1466 { 1467 // Euclid's algorithm, copied from libg++. 1468 int tmp; 1469 if (b > a) 1470 { 1471 tmp = a; a = b; b = tmp; 1472 } 1473 for(;;) 1474 { 1475 if (b == 0) 1476 return a; 1477 if (b == 1) 1478 return b; 1479 tmp = b; 1480 b = a % b; 1481 a = tmp; 1482 } 1483 } 1484 gcd(BigInteger y)1485 public BigInteger gcd(BigInteger y) 1486 { 1487 if (USING_NATIVE) 1488 { 1489 int dummy = y.signum; // force NPE check 1490 BigInteger result = new BigInteger(); 1491 mpz.gcd(y.mpz, result.mpz); 1492 return result; 1493 } 1494 1495 int xval = ival; 1496 int yval = y.ival; 1497 if (words == null) 1498 { 1499 if (xval == 0) 1500 return abs(y); 1501 if (y.words == null 1502 && xval != Integer.MIN_VALUE && yval != Integer.MIN_VALUE) 1503 { 1504 if (xval < 0) 1505 xval = -xval; 1506 if (yval < 0) 1507 yval = -yval; 1508 return valueOf(gcd(xval, yval)); 1509 } 1510 xval = 1; 1511 } 1512 if (y.words == null) 1513 { 1514 if (yval == 0) 1515 return abs(this); 1516 yval = 1; 1517 } 1518 int len = (xval > yval ? xval : yval) + 1; 1519 int[] xwords = new int[len]; 1520 int[] ywords = new int[len]; 1521 getAbsolute(xwords); 1522 y.getAbsolute(ywords); 1523 len = MPN.gcd(xwords, ywords, len); 1524 BigInteger result = new BigInteger(0); 1525 result.ival = len; 1526 result.words = xwords; 1527 return result.canonicalize(); 1528 } 1529 1530 /** 1531 * <p>Returns <code>true</code> if this BigInteger is probably prime, 1532 * <code>false</code> if it's definitely composite. If <code>certainty</code> 1533 * is <code><= 0</code>, <code>true</code> is returned.</p> 1534 * 1535 * @param certainty a measure of the uncertainty that the caller is willing 1536 * to tolerate: if the call returns <code>true</code> the probability that 1537 * this BigInteger is prime exceeds <code>(1 - 1/2<sup>certainty</sup>)</code>. 1538 * The execution time of this method is proportional to the value of this 1539 * parameter. 1540 * @return <code>true</code> if this BigInteger is probably prime, 1541 * <code>false</code> if it's definitely composite. 1542 */ isProbablePrime(int certainty)1543 public boolean isProbablePrime(int certainty) 1544 { 1545 if (certainty < 1) 1546 return true; 1547 1548 if (USING_NATIVE) 1549 return mpz.testPrimality(certainty) != 0; 1550 1551 /** We'll use the Rabin-Miller algorithm for doing a probabilistic 1552 * primality test. It is fast, easy and has faster decreasing odds of a 1553 * composite passing than with other tests. This means that this 1554 * method will actually have a probability much greater than the 1555 * 1 - .5^certainty specified in the JCL (p. 117), but I don't think 1556 * anyone will complain about better performance with greater certainty. 1557 * 1558 * The Rabin-Miller algorithm can be found on pp. 259-261 of "Applied 1559 * Cryptography, Second Edition" by Bruce Schneier. 1560 */ 1561 1562 // First rule out small prime factors 1563 BigInteger rem = new BigInteger(); 1564 int i; 1565 for (i = 0; i < primes.length; i++) 1566 { 1567 if (words == null && ival == primes[i]) 1568 return true; 1569 1570 divide(this, smallFixNums[primes[i] - minFixNum], null, rem, TRUNCATE); 1571 if (rem.canonicalize().isZero()) 1572 return false; 1573 } 1574 1575 // Now perform the Rabin-Miller test. 1576 1577 // Set b to the number of times 2 evenly divides (this - 1). 1578 // I.e. 2^b is the largest power of 2 that divides (this - 1). 1579 BigInteger pMinus1 = add(this, -1); 1580 int b = pMinus1.getLowestSetBit(); 1581 1582 // Set m such that this = 1 + 2^b * m. 1583 BigInteger m = pMinus1.divide(valueOf(2L).pow(b)); 1584 1585 // The HAC (Handbook of Applied Cryptography), Alfred Menezes & al. Note 1586 // 4.49 (controlling the error probability) gives the number of trials 1587 // for an error probability of 1/2**80, given the number of bits in the 1588 // number to test. we shall use these numbers as is if/when 'certainty' 1589 // is less or equal to 80, and twice as much if it's greater. 1590 int bits = this.bitLength(); 1591 for (i = 0; i < k.length; i++) 1592 if (bits <= k[i]) 1593 break; 1594 int trials = t[i]; 1595 if (certainty > 80) 1596 trials *= 2; 1597 BigInteger z; 1598 for (int t = 0; t < trials; t++) 1599 { 1600 // The HAC (Handbook of Applied Cryptography), Alfred Menezes & al. 1601 // Remark 4.28 states: "...A strategy that is sometimes employed 1602 // is to fix the bases a to be the first few primes instead of 1603 // choosing them at random. 1604 z = smallFixNums[primes[t] - minFixNum].modPow(m, this); 1605 if (z.isOne() || z.equals(pMinus1)) 1606 continue; // Passes the test; may be prime. 1607 1608 for (i = 0; i < b; ) 1609 { 1610 if (z.isOne()) 1611 return false; 1612 i++; 1613 if (z.equals(pMinus1)) 1614 break; // Passes the test; may be prime. 1615 1616 z = z.modPow(valueOf(2), this); 1617 } 1618 1619 if (i == b && !z.equals(pMinus1)) 1620 return false; 1621 } 1622 return true; 1623 } 1624 setInvert()1625 private void setInvert() 1626 { 1627 if (words == null) 1628 ival = ~ival; 1629 else 1630 { 1631 for (int i = ival; --i >= 0; ) 1632 words[i] = ~words[i]; 1633 } 1634 } 1635 setShiftLeft(BigInteger x, int count)1636 private void setShiftLeft(BigInteger x, int count) 1637 { 1638 int[] xwords; 1639 int xlen; 1640 if (x.words == null) 1641 { 1642 if (count < 32) 1643 { 1644 set((long) x.ival << count); 1645 return; 1646 } 1647 xwords = new int[1]; 1648 xwords[0] = x.ival; 1649 xlen = 1; 1650 } 1651 else 1652 { 1653 xwords = x.words; 1654 xlen = x.ival; 1655 } 1656 int word_count = count >> 5; 1657 count &= 31; 1658 int new_len = xlen + word_count; 1659 if (count == 0) 1660 { 1661 realloc(new_len); 1662 for (int i = xlen; --i >= 0; ) 1663 words[i+word_count] = xwords[i]; 1664 } 1665 else 1666 { 1667 new_len++; 1668 realloc(new_len); 1669 int shift_out = MPN.lshift(words, word_count, xwords, xlen, count); 1670 count = 32 - count; 1671 words[new_len-1] = (shift_out << count) >> count; // sign-extend. 1672 } 1673 ival = new_len; 1674 for (int i = word_count; --i >= 0; ) 1675 words[i] = 0; 1676 } 1677 setShiftRight(BigInteger x, int count)1678 private void setShiftRight(BigInteger x, int count) 1679 { 1680 if (x.words == null) 1681 set(count < 32 ? x.ival >> count : x.ival < 0 ? -1 : 0); 1682 else if (count == 0) 1683 set(x); 1684 else 1685 { 1686 boolean neg = x.isNegative(); 1687 int word_count = count >> 5; 1688 count &= 31; 1689 int d_len = x.ival - word_count; 1690 if (d_len <= 0) 1691 set(neg ? -1 : 0); 1692 else 1693 { 1694 if (words == null || words.length < d_len) 1695 realloc(d_len); 1696 MPN.rshift0 (words, x.words, word_count, d_len, count); 1697 ival = d_len; 1698 if (neg) 1699 words[d_len-1] |= -2 << (31 - count); 1700 } 1701 } 1702 } 1703 setShift(BigInteger x, int count)1704 private void setShift(BigInteger x, int count) 1705 { 1706 if (count > 0) 1707 setShiftLeft(x, count); 1708 else 1709 setShiftRight(x, -count); 1710 } 1711 shift(BigInteger x, int count)1712 private static BigInteger shift(BigInteger x, int count) 1713 { 1714 if (x.words == null) 1715 { 1716 if (count <= 0) 1717 return valueOf(count > -32 ? x.ival >> (-count) : x.ival < 0 ? -1 : 0); 1718 if (count < 32) 1719 return valueOf((long) x.ival << count); 1720 } 1721 if (count == 0) 1722 return x; 1723 BigInteger result = new BigInteger(0); 1724 result.setShift(x, count); 1725 return result.canonicalize(); 1726 } 1727 shiftLeft(int n)1728 public BigInteger shiftLeft(int n) 1729 { 1730 if (n == 0) 1731 return this; 1732 1733 if (USING_NATIVE) 1734 { 1735 BigInteger result = new BigInteger(); 1736 if (n < 0) 1737 mpz.shiftRight(-n, result.mpz); 1738 else 1739 mpz.shiftLeft(n, result.mpz); 1740 return result; 1741 } 1742 1743 return shift(this, n); 1744 } 1745 shiftRight(int n)1746 public BigInteger shiftRight(int n) 1747 { 1748 if (n == 0) 1749 return this; 1750 1751 if (USING_NATIVE) 1752 { 1753 BigInteger result = new BigInteger(); 1754 if (n < 0) 1755 mpz.shiftLeft(-n, result.mpz); 1756 else 1757 mpz.shiftRight(n, result.mpz); 1758 return result; 1759 } 1760 1761 return shift(this, -n); 1762 } 1763 format(int radix, CPStringBuilder buffer)1764 private void format(int radix, CPStringBuilder buffer) 1765 { 1766 if (words == null) 1767 buffer.append(Integer.toString(ival, radix)); 1768 else if (ival <= 2) 1769 buffer.append(Long.toString(longValue(), radix)); 1770 else 1771 { 1772 boolean neg = isNegative(); 1773 int[] work; 1774 if (neg || radix != 16) 1775 { 1776 work = new int[ival]; 1777 getAbsolute(work); 1778 } 1779 else 1780 work = words; 1781 int len = ival; 1782 1783 if (radix == 16) 1784 { 1785 if (neg) 1786 buffer.append('-'); 1787 int buf_start = buffer.length(); 1788 for (int i = len; --i >= 0; ) 1789 { 1790 int word = work[i]; 1791 for (int j = 8; --j >= 0; ) 1792 { 1793 int hex_digit = (word >> (4 * j)) & 0xF; 1794 // Suppress leading zeros: 1795 if (hex_digit > 0 || buffer.length() > buf_start) 1796 buffer.append(Character.forDigit(hex_digit, 16)); 1797 } 1798 } 1799 } 1800 else 1801 { 1802 int i = buffer.length(); 1803 for (;;) 1804 { 1805 int digit = MPN.divmod_1(work, work, len, radix); 1806 buffer.append(Character.forDigit(digit, radix)); 1807 while (len > 0 && work[len-1] == 0) len--; 1808 if (len == 0) 1809 break; 1810 } 1811 if (neg) 1812 buffer.append('-'); 1813 /* Reverse buffer. */ 1814 int j = buffer.length() - 1; 1815 while (i < j) 1816 { 1817 char tmp = buffer.charAt(i); 1818 buffer.setCharAt(i, buffer.charAt(j)); 1819 buffer.setCharAt(j, tmp); 1820 i++; j--; 1821 } 1822 } 1823 } 1824 } 1825 toString()1826 public String toString() 1827 { 1828 return toString(10); 1829 } 1830 toString(int radix)1831 public String toString(int radix) 1832 { 1833 if (USING_NATIVE) 1834 return mpz.toString(radix); 1835 1836 if (words == null) 1837 return Integer.toString(ival, radix); 1838 if (ival <= 2) 1839 return Long.toString(longValue(), radix); 1840 int buf_size = ival * (MPN.chars_per_word(radix) + 1); 1841 CPStringBuilder buffer = new CPStringBuilder(buf_size); 1842 format(radix, buffer); 1843 return buffer.toString(); 1844 } 1845 intValue()1846 public int intValue() 1847 { 1848 if (USING_NATIVE) 1849 { 1850 int result = mpz.absIntValue(); 1851 return mpz.compare(ZERO.mpz) < 0 ? - result : result; 1852 } 1853 1854 if (words == null) 1855 return ival; 1856 return words[0]; 1857 } 1858 longValue()1859 public long longValue() 1860 { 1861 if (USING_NATIVE) 1862 { 1863 long result; 1864 result = (abs().shiftRight(32)).mpz.absIntValue(); 1865 result <<= 32; 1866 result |= mpz.absIntValue() & 0xFFFFFFFFL; 1867 return this.compareTo(ZERO) < 0 ? - result : result; 1868 } 1869 1870 if (words == null) 1871 return ival; 1872 if (ival == 1) 1873 return words[0]; 1874 return ((long)words[1] << 32) + ((long)words[0] & 0xffffffffL); 1875 } 1876 hashCode()1877 public int hashCode() 1878 { 1879 // FIXME: May not match hashcode of JDK. 1880 if (USING_NATIVE) 1881 { 1882 // TODO: profile to decide whether to make it native 1883 byte[] bytes = this.toByteArray(); 1884 int result = 0; 1885 for (int i = 0; i < bytes.length; i++) 1886 result ^= (bytes[i] & 0xFF) << (8 * (i % 4)); 1887 return result; 1888 } 1889 1890 return words == null ? ival : (words[0] + words[ival - 1]); 1891 } 1892 1893 /* Assumes x and y are both canonicalized. */ equals(BigInteger x, BigInteger y)1894 private static boolean equals(BigInteger x, BigInteger y) 1895 { 1896 if (USING_NATIVE) 1897 return x.mpz.compare(y.mpz) == 0; 1898 1899 if (x.words == null && y.words == null) 1900 return x.ival == y.ival; 1901 if (x.words == null || y.words == null || x.ival != y.ival) 1902 return false; 1903 for (int i = x.ival; --i >= 0; ) 1904 { 1905 if (x.words[i] != y.words[i]) 1906 return false; 1907 } 1908 return true; 1909 } 1910 1911 /* Assumes this and obj are both canonicalized. */ equals(Object obj)1912 public boolean equals(Object obj) 1913 { 1914 if (! (obj instanceof BigInteger)) 1915 return false; 1916 return equals(this, (BigInteger) obj); 1917 } 1918 valueOf(byte[] digits, int byte_len, boolean negative, int radix)1919 private static BigInteger valueOf(byte[] digits, int byte_len, 1920 boolean negative, int radix) 1921 { 1922 int chars_per_word = MPN.chars_per_word(radix); 1923 int[] words = new int[byte_len / chars_per_word + 1]; 1924 int size = MPN.set_str(words, digits, byte_len, radix); 1925 if (size == 0) 1926 return ZERO; 1927 if (words[size-1] < 0) 1928 words[size++] = 0; 1929 if (negative) 1930 negate(words, words, size); 1931 return make(words, size); 1932 } 1933 doubleValue()1934 public double doubleValue() 1935 { 1936 if (USING_NATIVE) 1937 return mpz.doubleValue(); 1938 1939 if (words == null) 1940 return (double) ival; 1941 if (ival <= 2) 1942 return (double) longValue(); 1943 if (isNegative()) 1944 return neg(this).roundToDouble(0, true, false); 1945 return roundToDouble(0, false, false); 1946 } 1947 floatValue()1948 public float floatValue() 1949 { 1950 return (float) doubleValue(); 1951 } 1952 1953 /** Return true if any of the lowest n bits are one. 1954 * (false if n is negative). */ checkBits(int n)1955 private boolean checkBits(int n) 1956 { 1957 if (n <= 0) 1958 return false; 1959 if (words == null) 1960 return n > 31 || ((ival & ((1 << n) - 1)) != 0); 1961 int i; 1962 for (i = 0; i < (n >> 5) ; i++) 1963 if (words[i] != 0) 1964 return true; 1965 return (n & 31) != 0 && (words[i] & ((1 << (n & 31)) - 1)) != 0; 1966 } 1967 1968 /** Convert a semi-processed BigInteger to double. 1969 * Number must be non-negative. Multiplies by a power of two, applies sign, 1970 * and converts to double, with the usual java rounding. 1971 * @param exp power of two, positive or negative, by which to multiply 1972 * @param neg true if negative 1973 * @param remainder true if the BigInteger is the result of a truncating 1974 * division that had non-zero remainder. To ensure proper rounding in 1975 * this case, the BigInteger must have at least 54 bits. */ roundToDouble(int exp, boolean neg, boolean remainder)1976 private double roundToDouble(int exp, boolean neg, boolean remainder) 1977 { 1978 // Compute length. 1979 int il = bitLength(); 1980 1981 // Exponent when normalized to have decimal point directly after 1982 // leading one. This is stored excess 1023 in the exponent bit field. 1983 exp += il - 1; 1984 1985 // Gross underflow. If exp == -1075, we let the rounding 1986 // computation determine whether it is minval or 0 (which are just 1987 // 0x0000 0000 0000 0001 and 0x0000 0000 0000 0000 as bit 1988 // patterns). 1989 if (exp < -1075) 1990 return neg ? -0.0 : 0.0; 1991 1992 // gross overflow 1993 if (exp > 1023) 1994 return neg ? Double.NEGATIVE_INFINITY : Double.POSITIVE_INFINITY; 1995 1996 // number of bits in mantissa, including the leading one. 1997 // 53 unless it's denormalized 1998 int ml = (exp >= -1022 ? 53 : 53 + exp + 1022); 1999 2000 // Get top ml + 1 bits. The extra one is for rounding. 2001 long m; 2002 int excess_bits = il - (ml + 1); 2003 if (excess_bits > 0) 2004 m = ((words == null) ? ival >> excess_bits 2005 : MPN.rshift_long(words, ival, excess_bits)); 2006 else 2007 m = longValue() << (- excess_bits); 2008 2009 // Special rounding for maxval. If the number exceeds maxval by 2010 // any amount, even if it's less than half a step, it overflows. 2011 if (exp == 1023 && ((m >> 1) == (1L << 53) - 1)) 2012 { 2013 if (remainder || checkBits(il - ml)) 2014 return neg ? Double.NEGATIVE_INFINITY : Double.POSITIVE_INFINITY; 2015 else 2016 return neg ? - Double.MAX_VALUE : Double.MAX_VALUE; 2017 } 2018 2019 // Normal round-to-even rule: round up if the bit dropped is a one, and 2020 // the bit above it or any of the bits below it is a one. 2021 if ((m & 1) == 1 2022 && ((m & 2) == 2 || remainder || checkBits(excess_bits))) 2023 { 2024 m += 2; 2025 // Check if we overflowed the mantissa 2026 if ((m & (1L << 54)) != 0) 2027 { 2028 exp++; 2029 // renormalize 2030 m >>= 1; 2031 } 2032 // Check if a denormalized mantissa was just rounded up to a 2033 // normalized one. 2034 else if (ml == 52 && (m & (1L << 53)) != 0) 2035 exp++; 2036 } 2037 2038 // Discard the rounding bit 2039 m >>= 1; 2040 2041 long bits_sign = neg ? (1L << 63) : 0; 2042 exp += 1023; 2043 long bits_exp = (exp <= 0) ? 0 : ((long)exp) << 52; 2044 long bits_mant = m & ~(1L << 52); 2045 return Double.longBitsToDouble(bits_sign | bits_exp | bits_mant); 2046 } 2047 2048 /** Copy the abolute value of this into an array of words. 2049 * Assumes words.length >= (this.words == null ? 1 : this.ival). 2050 * Result is zero-extended, but need not be a valid 2's complement number. 2051 */ getAbsolute(int[] words)2052 private void getAbsolute(int[] words) 2053 { 2054 int len; 2055 if (this.words == null) 2056 { 2057 len = 1; 2058 words[0] = this.ival; 2059 } 2060 else 2061 { 2062 len = this.ival; 2063 for (int i = len; --i >= 0; ) 2064 words[i] = this.words[i]; 2065 } 2066 if (words[len - 1] < 0) 2067 negate(words, words, len); 2068 for (int i = words.length; --i > len; ) 2069 words[i] = 0; 2070 } 2071 2072 /** Set dest[0:len-1] to the negation of src[0:len-1]. 2073 * Return true if overflow (i.e. if src is -2**(32*len-1)). 2074 * Ok for src==dest. */ negate(int[] dest, int[] src, int len)2075 private static boolean negate(int[] dest, int[] src, int len) 2076 { 2077 long carry = 1; 2078 boolean negative = src[len-1] < 0; 2079 for (int i = 0; i < len; i++) 2080 { 2081 carry += ((long) (~src[i]) & 0xffffffffL); 2082 dest[i] = (int) carry; 2083 carry >>= 32; 2084 } 2085 return (negative && dest[len-1] < 0); 2086 } 2087 2088 /** Destructively set this to the negative of x. 2089 * It is OK if x==this.*/ 2090 private void setNegative(BigInteger x) 2091 { 2092 int len = x.ival; 2093 if (x.words == null) 2094 { 2095 if (len == Integer.MIN_VALUE) 2096 set(- (long) len); 2097 else 2098 set(-len); 2099 return; 2100 } 2101 realloc(len + 1); 2102 if (negate(words, x.words, len)) 2103 words[len++] = 0; 2104 ival = len; 2105 } 2106 2107 /** Destructively negate this. */ 2108 private void setNegative() 2109 { 2110 setNegative(this); 2111 } 2112 2113 private static BigInteger abs(BigInteger x) 2114 { 2115 return x.isNegative() ? neg(x) : x; 2116 } 2117 2118 public BigInteger abs() 2119 { 2120 if (USING_NATIVE) 2121 { 2122 BigInteger result = new BigInteger(); 2123 mpz.abs(result.mpz); 2124 return result; 2125 } 2126 2127 return abs(this); 2128 } 2129 2130 private static BigInteger neg(BigInteger x) 2131 { 2132 if (x.words == null && x.ival != Integer.MIN_VALUE) 2133 return valueOf(- x.ival); 2134 BigInteger result = new BigInteger(0); 2135 result.setNegative(x); 2136 return result.canonicalize(); 2137 } 2138 2139 public BigInteger negate() 2140 { 2141 if (USING_NATIVE) 2142 { 2143 BigInteger result = new BigInteger(); 2144 mpz.negate(result.mpz); 2145 return result; 2146 } 2147 2148 return neg(this); 2149 } 2150 2151 /** Calculates ceiling(log2(this < 0 ? -this : this+1)) 2152 * See Common Lisp: the Language, 2nd ed, p. 361. 2153 */ 2154 public int bitLength() 2155 { 2156 if (USING_NATIVE) 2157 return mpz.bitLength(); 2158 2159 if (words == null) 2160 return MPN.intLength(ival); 2161 return MPN.intLength(words, ival); 2162 } 2163 2164 public byte[] toByteArray() 2165 { 2166 if (signum() == 0) 2167 return new byte[1]; 2168 2169 if (USING_NATIVE) 2170 { 2171 // the minimal number of bytes required to represent the MPI is function 2172 // of (a) its bit-length, and (b) its sign. only when this MPI is both 2173 // positive, and its bit-length is a multiple of 8 do we add one zero 2174 // bit for its sign. we do this so if we construct a new MPI from the 2175 // resulting byte array, we wouldn't mistake a positive number, whose 2176 // bit-length is a multiple of 8, for a similar-length negative one. 2177 int bits = bitLength(); 2178 if (bits % 8 == 0 || this.signum() == 1) 2179 bits++; 2180 byte[] bytes = new byte[(bits + 7) / 8]; 2181 mpz.toByteArray(bytes); 2182 return bytes; 2183 } 2184 2185 // Determine number of bytes needed. The method bitlength returns 2186 // the size without the sign bit, so add one bit for that and then 2187 // add 7 more to emulate the ceil function using integer math. 2188 byte[] bytes = new byte[(bitLength() + 1 + 7) / 8]; 2189 int nbytes = bytes.length; 2190 2191 int wptr = 0; 2192 int word; 2193 2194 // Deal with words array until one word or less is left to process. 2195 // If BigInteger is an int, then it is in ival and nbytes will be <= 4. 2196 while (nbytes > 4) 2197 { 2198 word = words[wptr++]; 2199 for (int i = 4; i > 0; --i, word >>= 8) 2200 bytes[--nbytes] = (byte) word; 2201 } 2202 2203 // Deal with the last few bytes. If BigInteger is an int, use ival. 2204 word = (words == null) ? ival : words[wptr]; 2205 for ( ; nbytes > 0; word >>= 8) 2206 bytes[--nbytes] = (byte) word; 2207 2208 return bytes; 2209 } 2210 2211 /** Return the boolean opcode (for bitOp) for swapped operands. 2212 * I.e. bitOp(swappedOp(op), x, y) == bitOp(op, y, x). 2213 */ 2214 private static int swappedOp(int op) 2215 { 2216 return 2217 "\000\001\004\005\002\003\006\007\010\011\014\015\012\013\016\017" 2218 .charAt(op); 2219 } 2220 2221 /** Do one the the 16 possible bit-wise operations of two BigIntegers. */ 2222 private static BigInteger bitOp(int op, BigInteger x, BigInteger y) 2223 { 2224 switch (op) 2225 { 2226 case 0: return ZERO; 2227 case 1: return x.and(y); 2228 case 3: return x; 2229 case 5: return y; 2230 case 15: return valueOf(-1); 2231 } 2232 BigInteger result = new BigInteger(); 2233 setBitOp(result, op, x, y); 2234 return result.canonicalize(); 2235 } 2236 2237 /** Do one the the 16 possible bit-wise operations of two BigIntegers. */ 2238 private static void setBitOp(BigInteger result, int op, 2239 BigInteger x, BigInteger y) 2240 { 2241 if ((y.words != null) && (x.words == null || x.ival < y.ival)) 2242 { 2243 BigInteger temp = x; x = y; y = temp; 2244 op = swappedOp(op); 2245 } 2246 int xi; 2247 int yi; 2248 int xlen, ylen; 2249 if (y.words == null) 2250 { 2251 yi = y.ival; 2252 ylen = 1; 2253 } 2254 else 2255 { 2256 yi = y.words[0]; 2257 ylen = y.ival; 2258 } 2259 if (x.words == null) 2260 { 2261 xi = x.ival; 2262 xlen = 1; 2263 } 2264 else 2265 { 2266 xi = x.words[0]; 2267 xlen = x.ival; 2268 } 2269 if (xlen > 1) 2270 result.realloc(xlen); 2271 int[] w = result.words; 2272 int i = 0; 2273 // Code for how to handle the remainder of x. 2274 // 0: Truncate to length of y. 2275 // 1: Copy rest of x. 2276 // 2: Invert rest of x. 2277 int finish = 0; 2278 int ni; 2279 switch (op) 2280 { 2281 case 0: // clr 2282 ni = 0; 2283 break; 2284 case 1: // and 2285 for (;;) 2286 { 2287 ni = xi & yi; 2288 if (i+1 >= ylen) break; 2289 w[i++] = ni; xi = x.words[i]; yi = y.words[i]; 2290 } 2291 if (yi < 0) finish = 1; 2292 break; 2293 case 2: // andc2 2294 for (;;) 2295 { 2296 ni = xi & ~yi; 2297 if (i+1 >= ylen) break; 2298 w[i++] = ni; xi = x.words[i]; yi = y.words[i]; 2299 } 2300 if (yi >= 0) finish = 1; 2301 break; 2302 case 3: // copy x 2303 ni = xi; 2304 finish = 1; // Copy rest 2305 break; 2306 case 4: // andc1 2307 for (;;) 2308 { 2309 ni = ~xi & yi; 2310 if (i+1 >= ylen) break; 2311 w[i++] = ni; xi = x.words[i]; yi = y.words[i]; 2312 } 2313 if (yi < 0) finish = 2; 2314 break; 2315 case 5: // copy y 2316 for (;;) 2317 { 2318 ni = yi; 2319 if (i+1 >= ylen) break; 2320 w[i++] = ni; xi = x.words[i]; yi = y.words[i]; 2321 } 2322 break; 2323 case 6: // xor 2324 for (;;) 2325 { 2326 ni = xi ^ yi; 2327 if (i+1 >= ylen) break; 2328 w[i++] = ni; xi = x.words[i]; yi = y.words[i]; 2329 } 2330 finish = yi < 0 ? 2 : 1; 2331 break; 2332 case 7: // ior 2333 for (;;) 2334 { 2335 ni = xi | yi; 2336 if (i+1 >= ylen) break; 2337 w[i++] = ni; xi = x.words[i]; yi = y.words[i]; 2338 } 2339 if (yi >= 0) finish = 1; 2340 break; 2341 case 8: // nor 2342 for (;;) 2343 { 2344 ni = ~(xi | yi); 2345 if (i+1 >= ylen) break; 2346 w[i++] = ni; xi = x.words[i]; yi = y.words[i]; 2347 } 2348 if (yi >= 0) finish = 2; 2349 break; 2350 case 9: // eqv [exclusive nor] 2351 for (;;) 2352 { 2353 ni = ~(xi ^ yi); 2354 if (i+1 >= ylen) break; 2355 w[i++] = ni; xi = x.words[i]; yi = y.words[i]; 2356 } 2357 finish = yi >= 0 ? 2 : 1; 2358 break; 2359 case 10: // c2 2360 for (;;) 2361 { 2362 ni = ~yi; 2363 if (i+1 >= ylen) break; 2364 w[i++] = ni; xi = x.words[i]; yi = y.words[i]; 2365 } 2366 break; 2367 case 11: // orc2 2368 for (;;) 2369 { 2370 ni = xi | ~yi; 2371 if (i+1 >= ylen) break; 2372 w[i++] = ni; xi = x.words[i]; yi = y.words[i]; 2373 } 2374 if (yi < 0) finish = 1; 2375 break; 2376 case 12: // c1 2377 ni = ~xi; 2378 finish = 2; 2379 break; 2380 case 13: // orc1 2381 for (;;) 2382 { 2383 ni = ~xi | yi; 2384 if (i+1 >= ylen) break; 2385 w[i++] = ni; xi = x.words[i]; yi = y.words[i]; 2386 } 2387 if (yi >= 0) finish = 2; 2388 break; 2389 case 14: // nand 2390 for (;;) 2391 { 2392 ni = ~(xi & yi); 2393 if (i+1 >= ylen) break; 2394 w[i++] = ni; xi = x.words[i]; yi = y.words[i]; 2395 } 2396 if (yi < 0) finish = 2; 2397 break; 2398 default: 2399 case 15: // set 2400 ni = -1; 2401 break; 2402 } 2403 // Here i==ylen-1; w[0]..w[i-1] have the correct result; 2404 // and ni contains the correct result for w[i+1]. 2405 if (i+1 == xlen) 2406 finish = 0; 2407 switch (finish) 2408 { 2409 case 0: 2410 if (i == 0 && w == null) 2411 { 2412 result.ival = ni; 2413 return; 2414 } 2415 w[i++] = ni; 2416 break; 2417 case 1: w[i] = ni; while (++i < xlen) w[i] = x.words[i]; break; 2418 case 2: w[i] = ni; while (++i < xlen) w[i] = ~x.words[i]; break; 2419 } 2420 result.ival = i; 2421 } 2422 2423 /** Return the logical (bit-wise) "and" of a BigInteger and an int. */ 2424 private static BigInteger and(BigInteger x, int y) 2425 { 2426 if (x.words == null) 2427 return valueOf(x.ival & y); 2428 if (y >= 0) 2429 return valueOf(x.words[0] & y); 2430 int len = x.ival; 2431 int[] words = new int[len]; 2432 words[0] = x.words[0] & y; 2433 while (--len > 0) 2434 words[len] = x.words[len]; 2435 return make(words, x.ival); 2436 } 2437 2438 /** Return the logical (bit-wise) "and" of two BigIntegers. */ 2439 public BigInteger and(BigInteger y) 2440 { 2441 if (USING_NATIVE) 2442 { 2443 int dummy = y.signum; // force NPE check 2444 BigInteger result = new BigInteger(); 2445 mpz.and(y.mpz, result.mpz); 2446 return result; 2447 } 2448 2449 if (y.words == null) 2450 return and(this, y.ival); 2451 else if (words == null) 2452 return and(y, ival); 2453 2454 BigInteger x = this; 2455 if (ival < y.ival) 2456 { 2457 BigInteger temp = this; x = y; y = temp; 2458 } 2459 int i; 2460 int len = y.isNegative() ? x.ival : y.ival; 2461 int[] words = new int[len]; 2462 for (i = 0; i < y.ival; i++) 2463 words[i] = x.words[i] & y.words[i]; 2464 for ( ; i < len; i++) 2465 words[i] = x.words[i]; 2466 return make(words, len); 2467 } 2468 2469 /** Return the logical (bit-wise) "(inclusive) or" of two BigIntegers. */ 2470 public BigInteger or(BigInteger y) 2471 { 2472 if (USING_NATIVE) 2473 { 2474 int dummy = y.signum; // force NPE check 2475 BigInteger result = new BigInteger(); 2476 mpz.or(y.mpz, result.mpz); 2477 return result; 2478 } 2479 2480 return bitOp(7, this, y); 2481 } 2482 2483 /** Return the logical (bit-wise) "exclusive or" of two BigIntegers. */ 2484 public BigInteger xor(BigInteger y) 2485 { 2486 if (USING_NATIVE) 2487 { 2488 int dummy = y.signum; // force NPE check 2489 BigInteger result = new BigInteger(); 2490 mpz.xor(y.mpz, result.mpz); 2491 return result; 2492 } 2493 2494 return bitOp(6, this, y); 2495 } 2496 2497 /** Return the logical (bit-wise) negation of a BigInteger. */ 2498 public BigInteger not() 2499 { 2500 if (USING_NATIVE) 2501 { 2502 BigInteger result = new BigInteger(); 2503 mpz.not(result.mpz); 2504 return result; 2505 } 2506 2507 return bitOp(12, this, ZERO); 2508 } 2509 2510 public BigInteger andNot(BigInteger val) 2511 { 2512 if (USING_NATIVE) 2513 { 2514 int dummy = val.signum; // force NPE check 2515 BigInteger result = new BigInteger(); 2516 mpz.andNot(val.mpz, result.mpz); 2517 return result; 2518 } 2519 2520 return and(val.not()); 2521 } 2522 2523 public BigInteger clearBit(int n) 2524 { 2525 if (n < 0) 2526 throw new ArithmeticException(); 2527 2528 if (USING_NATIVE) 2529 { 2530 BigInteger result = new BigInteger(); 2531 mpz.setBit(n, false, result.mpz); 2532 return result; 2533 } 2534 2535 return and(ONE.shiftLeft(n).not()); 2536 } 2537 2538 public BigInteger setBit(int n) 2539 { 2540 if (n < 0) 2541 throw new ArithmeticException(); 2542 2543 if (USING_NATIVE) 2544 { 2545 BigInteger result = new BigInteger(); 2546 mpz.setBit(n, true, result.mpz); 2547 return result; 2548 } 2549 2550 return or(ONE.shiftLeft(n)); 2551 } 2552 2553 public boolean testBit(int n) 2554 { 2555 if (n < 0) 2556 throw new ArithmeticException(); 2557 2558 if (USING_NATIVE) 2559 return mpz.testBit(n) != 0; 2560 2561 return !and(ONE.shiftLeft(n)).isZero(); 2562 } 2563 2564 public BigInteger flipBit(int n) 2565 { 2566 if (n < 0) 2567 throw new ArithmeticException(); 2568 2569 if (USING_NATIVE) 2570 { 2571 BigInteger result = new BigInteger(); 2572 mpz.flipBit(n, result.mpz); 2573 return result; 2574 } 2575 2576 return xor(ONE.shiftLeft(n)); 2577 } 2578 2579 public int getLowestSetBit() 2580 { 2581 if (USING_NATIVE) 2582 return mpz.compare(ZERO.mpz) == 0 ? -1 : mpz.lowestSetBit(); 2583 2584 if (isZero()) 2585 return -1; 2586 2587 if (words == null) 2588 return MPN.findLowestBit(ival); 2589 else 2590 return MPN.findLowestBit(words); 2591 } 2592 2593 // bit4count[I] is number of '1' bits in I. 2594 private static final byte[] bit4_count = { 0, 1, 1, 2, 1, 2, 2, 3, 2595 1, 2, 2, 3, 2, 3, 3, 4}; 2596 2597 private static int bitCount(int i) 2598 { 2599 int count = 0; 2600 while (i != 0) 2601 { 2602 count += bit4_count[i & 15]; 2603 i >>>= 4; 2604 } 2605 return count; 2606 } 2607 2608 private static int bitCount(int[] x, int len) 2609 { 2610 int count = 0; 2611 while (--len >= 0) 2612 count += bitCount(x[len]); 2613 return count; 2614 } 2615 2616 /** Count one bits in a BigInteger. 2617 * If argument is negative, count zero bits instead. */ 2618 public int bitCount() 2619 { 2620 if (USING_NATIVE) 2621 return mpz.bitCount(); 2622 2623 int i, x_len; 2624 int[] x_words = words; 2625 if (x_words == null) 2626 { 2627 x_len = 1; 2628 i = bitCount(ival); 2629 } 2630 else 2631 { 2632 x_len = ival; 2633 i = bitCount(x_words, x_len); 2634 } 2635 return isNegative() ? x_len * 32 - i : i; 2636 } 2637 2638 private void readObject(ObjectInputStream s) 2639 throws IOException, ClassNotFoundException 2640 { 2641 if (USING_NATIVE) 2642 { 2643 mpz = new GMP(); 2644 s.defaultReadObject(); 2645 if (signum != 0) 2646 mpz.fromByteArray(magnitude); 2647 // else it's zero and we need to do nothing 2648 } 2649 else 2650 { 2651 s.defaultReadObject(); 2652 if (magnitude.length == 0 || signum == 0) 2653 { 2654 this.ival = 0; 2655 this.words = null; 2656 } 2657 else 2658 { 2659 words = byteArrayToIntArray(magnitude, signum < 0 ? -1 : 0); 2660 BigInteger result = make(words, words.length); 2661 this.ival = result.ival; 2662 this.words = result.words; 2663 } 2664 } 2665 } 2666 2667 private void writeObject(ObjectOutputStream s) 2668 throws IOException, ClassNotFoundException 2669 { 2670 signum = signum(); 2671 magnitude = signum == 0 ? new byte[0] : toByteArray(); 2672 s.defaultWriteObject(); 2673 magnitude = null; // not needed anymore 2674 } 2675 2676 // inner class(es) .......................................................... 2677 2678 } 2679