1 /*
   2  * Copyright (c) 1999, 2007, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 package java.math;
  27 
  28 /**
  29  * A class used to represent multiprecision integers that makes efficient
  30  * use of allocated space by allowing a number to occupy only part of
  31  * an array so that the arrays do not have to be reallocated as often.
  32  * When performing an operation with many iterations the array used to
  33  * hold a number is only reallocated when necessary and does not have to
  34  * be the same size as the number it represents. A mutable number allows
  35  * calculations to occur on the same number without having to create
  36  * a new number for every step of the calculation as occurs with
  37  * BigIntegers.
  38  *
  39  * @see     BigInteger
  40  * @author  Michael McCloskey
  41  * @since   1.3
  42  */
  43 
  44 import java.util.Arrays;
  45 
  46 import static java.math.BigInteger.LONG_MASK;
  47 import static java.math.BigDecimal.INFLATED;
  48 
  49 class MutableBigInteger {
  50     /**
  51      * Holds the magnitude of this MutableBigInteger in big endian order.
  52      * The magnitude may start at an offset into the value array, and it may
  53      * end before the length of the value array.
  54      */
  55     int[] value;
  56 
  57     /**
  58      * The number of ints of the value array that are currently used
  59      * to hold the magnitude of this MutableBigInteger. The magnitude starts
  60      * at an offset and offset + intLen may be less than value.length.
  61      */
  62     int intLen;
  63 
  64     /**
  65      * The offset into the value array where the magnitude of this
  66      * MutableBigInteger begins.
  67      */
  68     int offset = 0;
  69 
  70     // Constants
  71     /**
  72      * MutableBigInteger with one element value array with the value 1. Used by
  73      * BigDecimal divideAndRound to increment the quotient. Use this constant
  74      * only when the method is not going to modify this object.
  75      */
  76     static final MutableBigInteger ONE = new MutableBigInteger(1);
  77 
  78     // Constructors
  79 
  80     /**
  81      * The default constructor. An empty MutableBigInteger is created with
  82      * a one word capacity.
  83      */
  84     MutableBigInteger() {
  85         value = new int[1];
  86         intLen = 0;
  87     }
  88 
  89     /**
  90      * Construct a new MutableBigInteger with a magnitude specified by
  91      * the int val.
  92      */
  93     MutableBigInteger(int val) {
  94         value = new int[1];
  95         intLen = 1;
  96         value[0] = val;
  97     }
  98 
  99     /**
 100      * Construct a new MutableBigInteger with the specified value array
 101      * up to the length of the array supplied.
 102      */
 103     MutableBigInteger(int[] val) {
 104         value = val;
 105         intLen = val.length;
 106     }
 107 
 108     /**
 109      * Construct a new MutableBigInteger with a magnitude equal to the
 110      * specified BigInteger.
 111      */
 112     MutableBigInteger(BigInteger b) {
 113         intLen = b.mag.length;
 114         value = Arrays.copyOf(b.mag, intLen);
 115     }
 116 
 117     /**
 118      * Construct a new MutableBigInteger with a magnitude equal to the
 119      * specified MutableBigInteger.
 120      */
 121     MutableBigInteger(MutableBigInteger val) {
 122         intLen = val.intLen;
 123         value = Arrays.copyOfRange(val.value, val.offset, val.offset + intLen);
 124     }
 125 
 126     /**
 127      * Internal helper method to return the magnitude array. The caller is not
 128      * supposed to modify the returned array.
 129      */
 130     private int[] getMagnitudeArray() {
 131         if (offset > 0 || value.length != intLen)
 132             return Arrays.copyOfRange(value, offset, offset + intLen);
 133         return value;
 134     }
 135 
 136     /**
 137      * Convert this MutableBigInteger to a long value. The caller has to make
 138      * sure this MutableBigInteger can be fit into long.
 139      */
 140     private long toLong() {
 141         assert (intLen <= 2) : "this MutableBigInteger exceeds the range of long";
 142         if (intLen == 0)
 143             return 0;
 144         long d = value[offset] & LONG_MASK;
 145         return (intLen == 2) ? d << 32 | (value[offset + 1] & LONG_MASK) : d;
 146     }
 147 
 148     /**
 149      * Convert this MutableBigInteger to a BigInteger object.
 150      */
 151     BigInteger toBigInteger(int sign) {
 152         if (intLen == 0 || sign == 0)
 153             return BigInteger.ZERO;
 154         return new BigInteger(getMagnitudeArray(), sign);
 155     }
 156 
 157     /**
 158      * Convert this MutableBigInteger to BigDecimal object with the specified sign
 159      * and scale.
 160      */
 161     BigDecimal toBigDecimal(int sign, int scale) {
 162         if (intLen == 0 || sign == 0)
 163             return BigDecimal.valueOf(0, scale);
 164         int[] mag = getMagnitudeArray();
 165         int len = mag.length;
 166         int d = mag[0];
 167         // If this MutableBigInteger can't be fit into long, we need to
 168         // make a BigInteger object for the resultant BigDecimal object.
 169         if (len > 2 || (d < 0 && len == 2))
 170             return new BigDecimal(new BigInteger(mag, sign), INFLATED, scale, 0);
 171         long v = (len == 2) ?
 172             ((mag[1] & LONG_MASK) | (d & LONG_MASK) << 32) :
 173             d & LONG_MASK;
 174         return new BigDecimal(null, sign == -1 ? -v : v, scale, 0);
 175     }
 176 
 177     /**
 178      * Clear out a MutableBigInteger for reuse.
 179      */
 180     void clear() {
 181         offset = intLen = 0;
 182         for (int index=0, n=value.length; index < n; index++)
 183             value[index] = 0;
 184     }
 185 
 186     /**
 187      * Set a MutableBigInteger to zero, removing its offset.
 188      */
 189     void reset() {
 190         offset = intLen = 0;
 191     }
 192 
 193     /**
 194      * Compare the magnitude of two MutableBigIntegers. Returns -1, 0 or 1
 195      * as this MutableBigInteger is numerically less than, equal to, or
 196      * greater than <tt>b</tt>.
 197      */
 198     final int compare(MutableBigInteger b) {
 199         int blen = b.intLen;
 200         if (intLen < blen)
 201             return -1;
 202         if (intLen > blen)
 203            return 1;
 204 
 205         // Add Integer.MIN_VALUE to make the comparison act as unsigned integer
 206         // comparison.
 207         int[] bval = b.value;
 208         for (int i = offset, j = b.offset; i < intLen + offset; i++, j++) {
 209             int b1 = value[i] + 0x80000000;
 210             int b2 = bval[j]  + 0x80000000;
 211             if (b1 < b2)
 212                 return -1;
 213             if (b1 > b2)
 214                 return 1;
 215         }
 216         return 0;
 217     }
 218 
 219     /**
 220      * Compare this against half of a MutableBigInteger object (Needed for
 221      * remainder tests).
 222      * Assumes no leading unnecessary zeros, which holds for results
 223      * from divide().
 224      */
 225     final int compareHalf(MutableBigInteger b) {
 226         int blen = b.intLen;
 227         int len = intLen;
 228         if (len <= 0)
 229             return blen <=0 ? 0 : -1;
 230         if (len > blen)
 231             return 1;
 232         if (len < blen - 1)
 233             return -1;
 234         int[] bval = b.value;
 235         int bstart = 0;
 236         int carry = 0;
 237         // Only 2 cases left:len == blen or len == blen - 1
 238         if (len != blen) { // len == blen - 1
 239             if (bval[bstart] == 1) {
 240                 ++bstart;
 241                 carry = 0x80000000;
 242             } else
 243                 return -1;
 244         }
 245         // compare values with right-shifted values of b,
 246         // carrying shifted-out bits across words
 247         int[] val = value;
 248         for (int i = offset, j = bstart; i < len + offset;) {
 249             int bv = bval[j++];
 250             long hb = ((bv >>> 1) + carry) & LONG_MASK;
 251             long v = val[i++] & LONG_MASK;
 252             if (v != hb)
 253                 return v < hb ? -1 : 1;
 254             carry = (bv & 1) << 31; // carray will be either 0x80000000 or 0
 255         }
 256         return carry == 0? 0 : -1;
 257     }
 258 
 259     /**
 260      * Return the index of the lowest set bit in this MutableBigInteger. If the
 261      * magnitude of this MutableBigInteger is zero, -1 is returned.
 262      */
 263     private final int getLowestSetBit() {
 264         if (intLen == 0)
 265             return -1;
 266         int j, b;
 267         for (j=intLen-1; (j>0) && (value[j+offset]==0); j--)
 268             ;
 269         b = value[j+offset];
 270         if (b==0)
 271             return -1;
 272         return ((intLen-1-j)<<5) + Integer.numberOfTrailingZeros(b);
 273     }
 274 
 275     /**
 276      * Return the int in use in this MutableBigInteger at the specified
 277      * index. This method is not used because it is not inlined on all
 278      * platforms.
 279      */
 280     private final int getInt(int index) {
 281         return value[offset+index];
 282     }
 283 
 284     /**
 285      * Return a long which is equal to the unsigned value of the int in
 286      * use in this MutableBigInteger at the specified index. This method is
 287      * not used because it is not inlined on all platforms.
 288      */
 289     private final long getLong(int index) {
 290         return value[offset+index] & LONG_MASK;
 291     }
 292 
 293     /**
 294      * Ensure that the MutableBigInteger is in normal form, specifically
 295      * making sure that there are no leading zeros, and that if the
 296      * magnitude is zero, then intLen is zero.
 297      */
 298     final void normalize() {
 299         if (intLen == 0) {
 300             offset = 0;
 301             return;
 302         }
 303 
 304         int index = offset;
 305         if (value[index] != 0)
 306             return;
 307 
 308         int indexBound = index+intLen;
 309         do {
 310             index++;
 311         } while(index < indexBound && value[index]==0);
 312 
 313         int numZeros = index - offset;
 314         intLen -= numZeros;
 315         offset = (intLen==0 ?  0 : offset+numZeros);
 316     }
 317 
 318     /**
 319      * If this MutableBigInteger cannot hold len words, increase the size
 320      * of the value array to len words.
 321      */
 322     private final void ensureCapacity(int len) {
 323         if (value.length < len) {
 324             value = new int[len];
 325             offset = 0;
 326             intLen = len;
 327         }
 328     }
 329 
 330     /**
 331      * Convert this MutableBigInteger into an int array with no leading
 332      * zeros, of a length that is equal to this MutableBigInteger's intLen.
 333      */
 334     int[] toIntArray() {
 335         int[] result = new int[intLen];
 336         for(int i=0; i<intLen; i++)
 337             result[i] = value[offset+i];
 338         return result;
 339     }
 340 
 341     /**
 342      * Sets the int at index+offset in this MutableBigInteger to val.
 343      * This does not get inlined on all platforms so it is not used
 344      * as often as originally intended.
 345      */
 346     void setInt(int index, int val) {
 347         value[offset + index] = val;
 348     }
 349 
 350     /**
 351      * Sets this MutableBigInteger's value array to the specified array.
 352      * The intLen is set to the specified length.
 353      */
 354     void setValue(int[] val, int length) {
 355         value = val;
 356         intLen = length;
 357         offset = 0;
 358     }
 359 
 360     /**
 361      * Sets this MutableBigInteger's value array to a copy of the specified
 362      * array. The intLen is set to the length of the new array.
 363      */
 364     void copyValue(MutableBigInteger src) {
 365         int len = src.intLen;
 366         if (value.length < len)
 367             value = new int[len];
 368         System.arraycopy(src.value, src.offset, value, 0, len);
 369         intLen = len;
 370         offset = 0;
 371     }
 372 
 373     /**
 374      * Sets this MutableBigInteger's value array to a copy of the specified
 375      * array. The intLen is set to the length of the specified array.
 376      */
 377     void copyValue(int[] val) {
 378         int len = val.length;
 379         if (value.length < len)
 380             value = new int[len];
 381         System.arraycopy(val, 0, value, 0, len);
 382         intLen = len;
 383         offset = 0;
 384     }
 385 
 386     /**
 387      * Returns true iff this MutableBigInteger has a value of one.
 388      */
 389     boolean isOne() {
 390         return (intLen == 1) && (value[offset] == 1);
 391     }
 392 
 393     /**
 394      * Returns true iff this MutableBigInteger has a value of zero.
 395      */
 396     boolean isZero() {
 397         return (intLen == 0);
 398     }
 399 
 400     /**
 401      * Returns true iff this MutableBigInteger is even.
 402      */
 403     boolean isEven() {
 404         return (intLen == 0) || ((value[offset + intLen - 1] & 1) == 0);
 405     }
 406 
 407     /**
 408      * Returns true iff this MutableBigInteger is odd.
 409      */
 410     boolean isOdd() {
 411         return isZero() ? false : ((value[offset + intLen - 1] & 1) == 1);
 412     }
 413 
 414     /**
 415      * Returns true iff this MutableBigInteger is in normal form. A
 416      * MutableBigInteger is in normal form if it has no leading zeros
 417      * after the offset, and intLen + offset <= value.length.
 418      */
 419     boolean isNormal() {
 420         if (intLen + offset > value.length)
 421             return false;
 422         if (intLen ==0)
 423             return true;
 424         return (value[offset] != 0);
 425     }
 426 
 427     /**
 428      * Returns a String representation of this MutableBigInteger in radix 10.
 429      */
 430     public String toString() {
 431         BigInteger b = toBigInteger(1);
 432         return b.toString();
 433     }
 434 
 435     /**
 436      * Right shift this MutableBigInteger n bits. The MutableBigInteger is left
 437      * in normal form.
 438      */
 439     void rightShift(int n) {
 440         if (intLen == 0)
 441             return;
 442         int nInts = n >>> 5;
 443         int nBits = n & 0x1F;
 444         this.intLen -= nInts;
 445         if (nBits == 0)
 446             return;
 447         int bitsInHighWord = BigInteger.bitLengthForInt(value[offset]);
 448         if (nBits >= bitsInHighWord) {
 449             this.primitiveLeftShift(32 - nBits);
 450             this.intLen--;
 451         } else {
 452             primitiveRightShift(nBits);
 453         }
 454     }
 455 
 456     /**
 457      * Left shift this MutableBigInteger n bits.
 458      */
 459     void leftShift(int n) {
 460         /*
 461          * If there is enough storage space in this MutableBigInteger already
 462          * the available space will be used. Space to the right of the used
 463          * ints in the value array is faster to utilize, so the extra space
 464          * will be taken from the right if possible.
 465          */
 466         if (intLen == 0)
 467            return;
 468         int nInts = n >>> 5;
 469         int nBits = n&0x1F;
 470         int bitsInHighWord = BigInteger.bitLengthForInt(value[offset]);
 471 
 472         // If shift can be done without moving words, do so
 473         if (n <= (32-bitsInHighWord)) {
 474             primitiveLeftShift(nBits);
 475             return;
 476         }
 477 
 478         int newLen = intLen + nInts +1;
 479         if (nBits <= (32-bitsInHighWord))
 480             newLen--;
 481         if (value.length < newLen) {
 482             // The array must grow
 483             int[] result = new int[newLen];
 484             for (int i=0; i<intLen; i++)
 485                 result[i] = value[offset+i];
 486             setValue(result, newLen);
 487         } else if (value.length - offset >= newLen) {
 488             // Use space on right
 489             for(int i=0; i<newLen - intLen; i++)
 490                 value[offset+intLen+i] = 0;
 491         } else {
 492             // Must use space on left
 493             for (int i=0; i<intLen; i++)
 494                 value[i] = value[offset+i];
 495             for (int i=intLen; i<newLen; i++)
 496                 value[i] = 0;
 497             offset = 0;
 498         }
 499         intLen = newLen;
 500         if (nBits == 0)
 501             return;
 502         if (nBits <= (32-bitsInHighWord))
 503             primitiveLeftShift(nBits);
 504         else
 505             primitiveRightShift(32 -nBits);
 506     }
 507 
 508     /**
 509      * A primitive used for division. This method adds in one multiple of the
 510      * divisor a back to the dividend result at a specified offset. It is used
 511      * when qhat was estimated too large, and must be adjusted.
 512      */
 513     private int divadd(int[] a, int[] result, int offset) {
 514         long carry = 0;
 515 
 516         for (int j=a.length-1; j >= 0; j--) {
 517             long sum = (a[j] & LONG_MASK) +
 518                        (result[j+offset] & LONG_MASK) + carry;
 519             result[j+offset] = (int)sum;
 520             carry = sum >>> 32;
 521         }
 522         return (int)carry;
 523     }
 524 
 525     /**
 526      * This method is used for division. It multiplies an n word input a by one
 527      * word input x, and subtracts the n word product from q. This is needed
 528      * when subtracting qhat*divisor from dividend.
 529      */
 530     private int mulsub(int[] q, int[] a, int x, int len, int offset) {
 531         long xLong = x & LONG_MASK;
 532         long carry = 0;
 533         offset += len;
 534 
 535         for (int j=len-1; j >= 0; j--) {
 536             long product = (a[j] & LONG_MASK) * xLong + carry;
 537             long difference = q[offset] - product;
 538             q[offset--] = (int)difference;
 539             carry = (product >>> 32)
 540                      + (((difference & LONG_MASK) >
 541                          (((~(int)product) & LONG_MASK))) ? 1:0);
 542         }
 543         return (int)carry;
 544     }
 545 
 546     /**
 547      * Right shift this MutableBigInteger n bits, where n is
 548      * less than 32.
 549      * Assumes that intLen > 0, n > 0 for speed
 550      */
 551     private final void primitiveRightShift(int n) {
 552         int[] val = value;
 553         int n2 = 32 - n;
 554         for (int i=offset+intLen-1, c=val[i]; i>offset; i--) {
 555             int b = c;
 556             c = val[i-1];
 557             val[i] = (c << n2) | (b >>> n);
 558         }
 559         val[offset] >>>= n;
 560     }
 561 
 562     /**
 563      * Left shift this MutableBigInteger n bits, where n is
 564      * less than 32.
 565      * Assumes that intLen > 0, n > 0 for speed
 566      */
 567     private final void primitiveLeftShift(int n) {
 568         int[] val = value;
 569         int n2 = 32 - n;
 570         for (int i=offset, c=val[i], m=i+intLen-1; i<m; i++) {
 571             int b = c;
 572             c = val[i+1];
 573             val[i] = (b << n) | (c >>> n2);
 574         }
 575         val[offset+intLen-1] <<= n;
 576     }
 577 
 578     /**
 579      * Adds the contents of two MutableBigInteger objects.The result
 580      * is placed within this MutableBigInteger.
 581      * The contents of the addend are not changed.
 582      */
 583     void add(MutableBigInteger addend) {
 584         int x = intLen;
 585         int y = addend.intLen;
 586         int resultLen = (intLen > addend.intLen ? intLen : addend.intLen);
 587         int[] result = (value.length < resultLen ? new int[resultLen] : value);
 588 
 589         int rstart = result.length-1;
 590         long sum;
 591         long carry = 0;
 592 
 593         // Add common parts of both numbers
 594         while(x>0 && y>0) {
 595             x--; y--;
 596             sum = (value[x+offset] & LONG_MASK) +
 597                 (addend.value[y+addend.offset] & LONG_MASK) + carry;
 598             result[rstart--] = (int)sum;
 599             carry = sum >>> 32;
 600         }
 601 
 602         // Add remainder of the longer number
 603         while(x>0) {
 604             x--;
 605             if (carry == 0 && result == value && rstart == (x + offset))
 606                 return;
 607             sum = (value[x+offset] & LONG_MASK) + carry;
 608             result[rstart--] = (int)sum;
 609             carry = sum >>> 32;
 610         }
 611         while(y>0) {
 612             y--;
 613             sum = (addend.value[y+addend.offset] & LONG_MASK) + carry;
 614             result[rstart--] = (int)sum;
 615             carry = sum >>> 32;
 616         }
 617 
 618         if (carry > 0) { // Result must grow in length
 619             resultLen++;
 620             if (result.length < resultLen) {
 621                 int temp[] = new int[resultLen];
 622                 // Result one word longer from carry-out; copy low-order
 623                 // bits into new result.
 624                 System.arraycopy(result, 0, temp, 1, result.length);
 625                 temp[0] = 1;
 626                 result = temp;
 627             } else {
 628                 result[rstart--] = 1;
 629             }
 630         }
 631 
 632         value = result;
 633         intLen = resultLen;
 634         offset = result.length - resultLen;
 635     }
 636 
 637 
 638     /**
 639      * Subtracts the smaller of this and b from the larger and places the
 640      * result into this MutableBigInteger.
 641      */
 642     int subtract(MutableBigInteger b) {
 643         MutableBigInteger a = this;
 644 
 645         int[] result = value;
 646         int sign = a.compare(b);
 647 
 648         if (sign == 0) {
 649             reset();
 650             return 0;
 651         }
 652         if (sign < 0) {
 653             MutableBigInteger tmp = a;
 654             a = b;
 655             b = tmp;
 656         }
 657 
 658         int resultLen = a.intLen;
 659         if (result.length < resultLen)
 660             result = new int[resultLen];
 661 
 662         long diff = 0;
 663         int x = a.intLen;
 664         int y = b.intLen;
 665         int rstart = result.length - 1;
 666 
 667         // Subtract common parts of both numbers
 668         while (y>0) {
 669             x--; y--;
 670 
 671             diff = (a.value[x+a.offset] & LONG_MASK) -
 672                    (b.value[y+b.offset] & LONG_MASK) - ((int)-(diff>>32));
 673             result[rstart--] = (int)diff;
 674         }
 675         // Subtract remainder of longer number
 676         while (x>0) {
 677             x--;
 678             diff = (a.value[x+a.offset] & LONG_MASK) - ((int)-(diff>>32));
 679             result[rstart--] = (int)diff;
 680         }
 681 
 682         value = result;
 683         intLen = resultLen;
 684         offset = value.length - resultLen;
 685         normalize();
 686         return sign;
 687     }
 688 
 689     /**
 690      * Subtracts the smaller of a and b from the larger and places the result
 691      * into the larger. Returns 1 if the answer is in a, -1 if in b, 0 if no
 692      * operation was performed.
 693      */
 694     private int difference(MutableBigInteger b) {
 695         MutableBigInteger a = this;
 696         int sign = a.compare(b);
 697         if (sign ==0)
 698             return 0;
 699         if (sign < 0) {
 700             MutableBigInteger tmp = a;
 701             a = b;
 702             b = tmp;
 703         }
 704 
 705         long diff = 0;
 706         int x = a.intLen;
 707         int y = b.intLen;
 708 
 709         // Subtract common parts of both numbers
 710         while (y>0) {
 711             x--; y--;
 712             diff = (a.value[a.offset+ x] & LONG_MASK) -
 713                 (b.value[b.offset+ y] & LONG_MASK) - ((int)-(diff>>32));
 714             a.value[a.offset+x] = (int)diff;
 715         }
 716         // Subtract remainder of longer number
 717         while (x>0) {
 718             x--;
 719             diff = (a.value[a.offset+ x] & LONG_MASK) - ((int)-(diff>>32));
 720             a.value[a.offset+x] = (int)diff;
 721         }
 722 
 723         a.normalize();
 724         return sign;
 725     }
 726 
 727     /**
 728      * Multiply the contents of two MutableBigInteger objects. The result is
 729      * placed into MutableBigInteger z. The contents of y are not changed.
 730      */
 731     void multiply(MutableBigInteger y, MutableBigInteger z) {
 732         int xLen = intLen;
 733         int yLen = y.intLen;
 734         int newLen = xLen + yLen;
 735 
 736         // Put z into an appropriate state to receive product
 737         if (z.value.length < newLen)
 738             z.value = new int[newLen];
 739         z.offset = 0;
 740         z.intLen = newLen;
 741 
 742         // The first iteration is hoisted out of the loop to avoid extra add
 743         long carry = 0;
 744         for (int j=yLen-1, k=yLen+xLen-1; j >= 0; j--, k--) {
 745                 long product = (y.value[j+y.offset] & LONG_MASK) *
 746                                (value[xLen-1+offset] & LONG_MASK) + carry;
 747                 z.value[k] = (int)product;
 748                 carry = product >>> 32;
 749         }
 750         z.value[xLen-1] = (int)carry;
 751 
 752         // Perform the multiplication word by word
 753         for (int i = xLen-2; i >= 0; i--) {
 754             carry = 0;
 755             for (int j=yLen-1, k=yLen+i; j >= 0; j--, k--) {
 756                 long product = (y.value[j+y.offset] & LONG_MASK) *
 757                                (value[i+offset] & LONG_MASK) +
 758                                (z.value[k] & LONG_MASK) + carry;
 759                 z.value[k] = (int)product;
 760                 carry = product >>> 32;
 761             }
 762             z.value[i] = (int)carry;
 763         }
 764 
 765         // Remove leading zeros from product
 766         z.normalize();
 767     }
 768 
 769     /**
 770      * Multiply the contents of this MutableBigInteger by the word y. The
 771      * result is placed into z.
 772      */
 773     void mul(int y, MutableBigInteger z) {
 774         if (y == 1) {
 775             z.copyValue(this);
 776             return;
 777         }
 778 
 779         if (y == 0) {
 780             z.clear();
 781             return;
 782         }
 783 
 784         // Perform the multiplication word by word
 785         long ylong = y & LONG_MASK;
 786         int[] zval = (z.value.length<intLen+1 ? new int[intLen + 1]
 787                                               : z.value);
 788         long carry = 0;
 789         for (int i = intLen-1; i >= 0; i--) {
 790             long product = ylong * (value[i+offset] & LONG_MASK) + carry;
 791             zval[i+1] = (int)product;
 792             carry = product >>> 32;
 793         }
 794 
 795         if (carry == 0) {
 796             z.offset = 1;
 797             z.intLen = intLen;
 798         } else {
 799             z.offset = 0;
 800             z.intLen = intLen + 1;
 801             zval[0] = (int)carry;
 802         }
 803         z.value = zval;
 804     }
 805 
 806      /**
 807      * This method is used for division of an n word dividend by a one word
 808      * divisor. The quotient is placed into quotient. The one word divisor is
 809      * specified by divisor.
 810      *
 811      * @return the remainder of the division is returned.
 812      *
 813      */
 814     int divideOneWord(int divisor, MutableBigInteger quotient) {
 815         long divisorLong = divisor & LONG_MASK;
 816 
 817         // Special case of one word dividend
 818         if (intLen == 1) {
 819             long dividendValue = value[offset] & LONG_MASK;
 820             int q = (int) (dividendValue / divisorLong);
 821             int r = (int) (dividendValue - q * divisorLong);
 822             quotient.value[0] = q;
 823             quotient.intLen = (q == 0) ? 0 : 1;
 824             quotient.offset = 0;
 825             return r;
 826         }
 827 
 828         if (quotient.value.length < intLen)
 829             quotient.value = new int[intLen];
 830         quotient.offset = 0;
 831         quotient.intLen = intLen;
 832 
 833         // Normalize the divisor
 834         int shift = Integer.numberOfLeadingZeros(divisor);
 835 
 836         int rem = value[offset];
 837         long remLong = rem & LONG_MASK;
 838         if (remLong < divisorLong) {
 839             quotient.value[0] = 0;
 840         } else {
 841             quotient.value[0] = (int)(remLong / divisorLong);
 842             rem = (int) (remLong - (quotient.value[0] * divisorLong));
 843             remLong = rem & LONG_MASK;
 844         }
 845 
 846         int xlen = intLen;
 847         int[] qWord = new int[2];
 848         while (--xlen > 0) {
 849             long dividendEstimate = (remLong<<32) |
 850                 (value[offset + intLen - xlen] & LONG_MASK);
 851             if (dividendEstimate >= 0) {
 852                 qWord[0] = (int) (dividendEstimate / divisorLong);
 853                 qWord[1] = (int) (dividendEstimate - qWord[0] * divisorLong);
 854             } else {
 855                 divWord(qWord, dividendEstimate, divisor);
 856             }
 857             quotient.value[intLen - xlen] = qWord[0];
 858             rem = qWord[1];
 859             remLong = rem & LONG_MASK;
 860         }
 861 
 862         quotient.normalize();
 863         // Unnormalize
 864         if (shift > 0)
 865             return rem % divisor;
 866         else
 867             return rem;
 868     }
 869 
 870     /**
 871      * Calculates the quotient of this div b and places the quotient in the
 872      * provided MutableBigInteger objects and the remainder object is returned.
 873      *
 874      * Uses Algorithm D in Knuth section 4.3.1.
 875      * Many optimizations to that algorithm have been adapted from the Colin
 876      * Plumb C library.
 877      * It special cases one word divisors for speed. The content of b is not
 878      * changed.
 879      *
 880      */
 881     MutableBigInteger divide(MutableBigInteger b, MutableBigInteger quotient) {
 882         if (b.intLen == 0)
 883             throw new ArithmeticException("BigInteger divide by zero");
 884 
 885         // Dividend is zero
 886         if (intLen == 0) {
 887             quotient.intLen = quotient.offset;
 888             return new MutableBigInteger();
 889         }
 890 
 891         int cmp = compare(b);
 892         // Dividend less than divisor
 893         if (cmp < 0) {
 894             quotient.intLen = quotient.offset = 0;
 895             return new MutableBigInteger(this);
 896         }
 897         // Dividend equal to divisor
 898         if (cmp == 0) {
 899             quotient.value[0] = quotient.intLen = 1;
 900             quotient.offset = 0;
 901             return new MutableBigInteger();
 902         }
 903 
 904         quotient.clear();
 905         // Special case one word divisor
 906         if (b.intLen == 1) {
 907             int r = divideOneWord(b.value[b.offset], quotient);
 908             if (r == 0)
 909                 return new MutableBigInteger();
 910             return new MutableBigInteger(r);
 911         }
 912 
 913         // Copy divisor value to protect divisor
 914         int[] div = Arrays.copyOfRange(b.value, b.offset, b.offset + b.intLen);
 915         return divideMagnitude(div, quotient);
 916     }
 917 
 918     /**
 919      * Internally used  to calculate the quotient of this div v and places the
 920      * quotient in the provided MutableBigInteger object and the remainder is
 921      * returned.
 922      *
 923      * @return the remainder of the division will be returned.
 924      */
 925     long divide(long v, MutableBigInteger quotient) {
 926         if (v == 0)
 927             throw new ArithmeticException("BigInteger divide by zero");
 928 
 929         // Dividend is zero
 930         if (intLen == 0) {
 931             quotient.intLen = quotient.offset = 0;
 932             return 0;
 933         }
 934         if (v < 0)
 935             v = -v;
 936 
 937         int d = (int)(v >>> 32);
 938         quotient.clear();
 939         // Special case on word divisor
 940         if (d == 0)
 941             return divideOneWord((int)v, quotient) & LONG_MASK;
 942         else {
 943             int[] div = new int[]{ d, (int)(v & LONG_MASK) };
 944             return divideMagnitude(div, quotient).toLong();
 945         }
 946     }
 947 
 948     /**
 949      * Divide this MutableBigInteger by the divisor represented by its magnitude
 950      * array. The quotient will be placed into the provided quotient object &
 951      * the remainder object is returned.
 952      */
 953     private MutableBigInteger divideMagnitude(int[] divisor,
 954                                               MutableBigInteger quotient) {
 955 
 956         // Remainder starts as dividend with space for a leading zero
 957         MutableBigInteger rem = new MutableBigInteger(new int[intLen + 1]);
 958         System.arraycopy(value, offset, rem.value, 1, intLen);
 959         rem.intLen = intLen;
 960         rem.offset = 1;
 961 
 962         int nlen = rem.intLen;
 963 
 964         // Set the quotient size
 965         int dlen = divisor.length;
 966         int limit = nlen - dlen + 1;
 967         if (quotient.value.length < limit) {
 968             quotient.value = new int[limit];
 969             quotient.offset = 0;
 970         }
 971         quotient.intLen = limit;
 972         int[] q = quotient.value;
 973 
 974         // D1 normalize the divisor
 975         int shift = Integer.numberOfLeadingZeros(divisor[0]);
 976         if (shift > 0) {
 977             // First shift will not grow array
 978             BigInteger.primitiveLeftShift(divisor, dlen, shift);
 979             // But this one might
 980             rem.leftShift(shift);
 981         }
 982 
 983         // Must insert leading 0 in rem if its length did not change
 984         if (rem.intLen == nlen) {
 985             rem.offset = 0;
 986             rem.value[0] = 0;
 987             rem.intLen++;
 988         }
 989 
 990         int dh = divisor[0];
 991         long dhLong = dh & LONG_MASK;
 992         int dl = divisor[1];
 993         int[] qWord = new int[2];
 994 
 995         // D2 Initialize j
 996         for(int j=0; j<limit; j++) {
 997             // D3 Calculate qhat
 998             // estimate qhat
 999             int qhat = 0;
1000             int qrem = 0;
1001             boolean skipCorrection = false;
1002             int nh = rem.value[j+rem.offset];
1003             int nh2 = nh + 0x80000000;
1004             int nm = rem.value[j+1+rem.offset];
1005 
1006             if (nh == dh) {
1007                 qhat = ~0;
1008                 qrem = nh + nm;
1009                 skipCorrection = qrem + 0x80000000 < nh2;
1010             } else {
1011                 long nChunk = (((long)nh) << 32) | (nm & LONG_MASK);
1012                 if (nChunk >= 0) {
1013                     qhat = (int) (nChunk / dhLong);
1014                     qrem = (int) (nChunk - (qhat * dhLong));
1015                 } else {
1016                     divWord(qWord, nChunk, dh);
1017                     qhat = qWord[0];
1018                     qrem = qWord[1];
1019                 }
1020             }
1021 
1022             if (qhat == 0)
1023                 continue;
1024 
1025             if (!skipCorrection) { // Correct qhat
1026                 long nl = rem.value[j+2+rem.offset] & LONG_MASK;
1027                 long rs = ((qrem & LONG_MASK) << 32) | nl;
1028                 long estProduct = (dl & LONG_MASK) * (qhat & LONG_MASK);
1029 
1030                 if (unsignedLongCompare(estProduct, rs)) {
1031                     qhat--;
1032                     qrem = (int)((qrem & LONG_MASK) + dhLong);
1033                     if ((qrem & LONG_MASK) >=  dhLong) {
1034                         estProduct -= (dl & LONG_MASK);
1035                         rs = ((qrem & LONG_MASK) << 32) | nl;
1036                         if (unsignedLongCompare(estProduct, rs))
1037                             qhat--;
1038                     }
1039                 }
1040             }
1041 
1042             // D4 Multiply and subtract
1043             rem.value[j+rem.offset] = 0;
1044             int borrow = mulsub(rem.value, divisor, qhat, dlen, j+rem.offset);
1045 
1046             // D5 Test remainder
1047             if (borrow + 0x80000000 > nh2) {
1048                 // D6 Add back
1049                 divadd(divisor, rem.value, j+1+rem.offset);
1050                 qhat--;
1051             }
1052 
1053             // Store the quotient digit
1054             q[j] = qhat;
1055         } // D7 loop on j
1056 
1057         // D8 Unnormalize
1058         if (shift > 0)
1059             rem.rightShift(shift);
1060 
1061         quotient.normalize();
1062         rem.normalize();
1063         return rem;
1064     }
1065 
1066     /**
1067      * Compare two longs as if they were unsigned.
1068      * Returns true iff one is bigger than two.
1069      */
1070     private boolean unsignedLongCompare(long one, long two) {
1071         return (one+Long.MIN_VALUE) > (two+Long.MIN_VALUE);
1072     }
1073 
1074     /**
1075      * This method divides a long quantity by an int to estimate
1076      * qhat for two multi precision numbers. It is used when
1077      * the signed value of n is less than zero.
1078      */
1079     private void divWord(int[] result, long n, int d) {
1080         long dLong = d & LONG_MASK;
1081 
1082         if (dLong == 1) {
1083             result[0] = (int)n;
1084             result[1] = 0;
1085             return;
1086         }
1087 
1088         // Approximate the quotient and remainder
1089         long q = (n >>> 1) / (dLong >>> 1);
1090         long r = n - q*dLong;
1091 
1092         // Correct the approximation
1093         while (r < 0) {
1094             r += dLong;
1095             q--;
1096         }
1097         while (r >= dLong) {
1098             r -= dLong;
1099             q++;
1100         }
1101 
1102         // n - q*dlong == r && 0 <= r <dLong, hence we're done.
1103         result[0] = (int)q;
1104         result[1] = (int)r;
1105     }
1106 
1107     /**
1108      * Calculate GCD of this and b. This and b are changed by the computation.
1109      */
1110     MutableBigInteger hybridGCD(MutableBigInteger b) {
1111         // Use Euclid's algorithm until the numbers are approximately the
1112         // same length, then use the binary GCD algorithm to find the GCD.
1113         MutableBigInteger a = this;
1114         MutableBigInteger q = new MutableBigInteger();
1115 
1116         while (b.intLen != 0) {
1117             if (Math.abs(a.intLen - b.intLen) < 2)
1118                 return a.binaryGCD(b);
1119 
1120             MutableBigInteger r = a.divide(b, q);
1121             a = b;
1122             b = r;
1123         }
1124         return a;
1125     }
1126 
1127     /**
1128      * Calculate GCD of this and v.
1129      * Assumes that this and v are not zero.
1130      */
1131     private MutableBigInteger binaryGCD(MutableBigInteger v) {
1132         // Algorithm B from Knuth section 4.5.2
1133         MutableBigInteger u = this;
1134         MutableBigInteger r = new MutableBigInteger();
1135 
1136         // step B1
1137         int s1 = u.getLowestSetBit();
1138         int s2 = v.getLowestSetBit();
1139         int k = (s1 < s2) ? s1 : s2;
1140         if (k != 0) {
1141             u.rightShift(k);
1142             v.rightShift(k);
1143         }
1144 
1145         // step B2
1146         boolean uOdd = (k==s1);
1147         MutableBigInteger t = uOdd ? v: u;
1148         int tsign = uOdd ? -1 : 1;
1149 
1150         int lb;
1151         while ((lb = t.getLowestSetBit()) >= 0) {
1152             // steps B3 and B4
1153             t.rightShift(lb);
1154             // step B5
1155             if (tsign > 0)
1156                 u = t;
1157             else
1158                 v = t;
1159 
1160             // Special case one word numbers
1161             if (u.intLen < 2 && v.intLen < 2) {
1162                 int x = u.value[u.offset];
1163                 int y = v.value[v.offset];
1164                 x  = binaryGcd(x, y);
1165                 r.value[0] = x;
1166                 r.intLen = 1;
1167                 r.offset = 0;
1168                 if (k > 0)
1169                     r.leftShift(k);
1170                 return r;
1171             }
1172 
1173             // step B6
1174             if ((tsign = u.difference(v)) == 0)
1175                 break;
1176             t = (tsign >= 0) ? u : v;
1177         }
1178 
1179         if (k > 0)
1180             u.leftShift(k);
1181         return u;
1182     }
1183 
1184     /**
1185      * Calculate GCD of a and b interpreted as unsigned integers.
1186      */
1187     static int binaryGcd(int a, int b) {
1188         if (b==0)
1189             return a;
1190         if (a==0)
1191             return b;
1192 
1193         // Right shift a & b till their last bits equal to 1.
1194         int aZeros = Integer.numberOfTrailingZeros(a);
1195         int bZeros = Integer.numberOfTrailingZeros(b);
1196         a >>>= aZeros;
1197         b >>>= bZeros;
1198 
1199         int t = (aZeros < bZeros ? aZeros : bZeros);
1200 
1201         while (a != b) {
1202             if ((a+0x80000000) > (b+0x80000000)) {  // a > b as unsigned
1203                 a -= b;
1204                 a >>>= Integer.numberOfTrailingZeros(a);
1205             } else {
1206                 b -= a;
1207                 b >>>= Integer.numberOfTrailingZeros(b);
1208             }
1209         }
1210         return a<<t;
1211     }
1212 
1213     /**
1214      * Returns the modInverse of this mod p. This and p are not affected by
1215      * the operation.
1216      */
1217     MutableBigInteger mutableModInverse(MutableBigInteger p) {
1218         // Modulus is odd, use Schroeppel's algorithm
1219         if (p.isOdd())
1220             return modInverse(p);
1221 
1222         // Base and modulus are even, throw exception
1223         if (isEven())
1224             throw new ArithmeticException("BigInteger not invertible.");
1225 
1226         // Get even part of modulus expressed as a power of 2
1227         int powersOf2 = p.getLowestSetBit();
1228 
1229         // Construct odd part of modulus
1230         MutableBigInteger oddMod = new MutableBigInteger(p);
1231         oddMod.rightShift(powersOf2);
1232 
1233         if (oddMod.isOne())
1234             return modInverseMP2(powersOf2);
1235 
1236         // Calculate 1/a mod oddMod
1237         MutableBigInteger oddPart = modInverse(oddMod);
1238 
1239         // Calculate 1/a mod evenMod
1240         MutableBigInteger evenPart = modInverseMP2(powersOf2);
1241 
1242         // Combine the results using Chinese Remainder Theorem
1243         MutableBigInteger y1 = modInverseBP2(oddMod, powersOf2);
1244         MutableBigInteger y2 = oddMod.modInverseMP2(powersOf2);
1245 
1246         MutableBigInteger temp1 = new MutableBigInteger();
1247         MutableBigInteger temp2 = new MutableBigInteger();
1248         MutableBigInteger result = new MutableBigInteger();
1249 
1250         oddPart.leftShift(powersOf2);
1251         oddPart.multiply(y1, result);
1252 
1253         evenPart.multiply(oddMod, temp1);
1254         temp1.multiply(y2, temp2);
1255 
1256         result.add(temp2);
1257         return result.divide(p, temp1);
1258     }
1259 
1260     /*
1261      * Calculate the multiplicative inverse of this mod 2^k.
1262      */
1263     MutableBigInteger modInverseMP2(int k) {
1264         if (isEven())
1265             throw new ArithmeticException("Non-invertible. (GCD != 1)");
1266 
1267         if (k > 64)
1268             return euclidModInverse(k);
1269 
1270         int t = inverseMod32(value[offset+intLen-1]);
1271 
1272         if (k < 33) {
1273             t = (k == 32 ? t : t & ((1 << k) - 1));
1274             return new MutableBigInteger(t);
1275         }
1276 
1277         long pLong = (value[offset+intLen-1] & LONG_MASK);
1278         if (intLen > 1)
1279             pLong |=  ((long)value[offset+intLen-2] << 32);
1280         long tLong = t & LONG_MASK;
1281         tLong = tLong * (2 - pLong * tLong);  // 1 more Newton iter step
1282         tLong = (k == 64 ? tLong : tLong & ((1L << k) - 1));
1283 
1284         MutableBigInteger result = new MutableBigInteger(new int[2]);
1285         result.value[0] = (int)(tLong >>> 32);
1286         result.value[1] = (int)tLong;
1287         result.intLen = 2;
1288         result.normalize();
1289         return result;
1290     }
1291 
1292     /*
1293      * Returns the multiplicative inverse of val mod 2^32.  Assumes val is odd.
1294      */
1295     static int inverseMod32(int val) {
1296         // Newton's iteration!
1297         int t = val;
1298         t *= 2 - val*t;
1299         t *= 2 - val*t;
1300         t *= 2 - val*t;
1301         t *= 2 - val*t;
1302         return t;
1303     }
1304 
1305     /*
1306      * Calculate the multiplicative inverse of 2^k mod mod, where mod is odd.
1307      */
1308     static MutableBigInteger modInverseBP2(MutableBigInteger mod, int k) {
1309         // Copy the mod to protect original
1310         return fixup(new MutableBigInteger(1), new MutableBigInteger(mod), k);
1311     }
1312 
1313     /**
1314      * Calculate the multiplicative inverse of this mod mod, where mod is odd.
1315      * This and mod are not changed by the calculation.
1316      *
1317      * This method implements an algorithm due to Richard Schroeppel, that uses
1318      * the same intermediate representation as Montgomery Reduction
1319      * ("Montgomery Form").  The algorithm is described in an unpublished
1320      * manuscript entitled "Fast Modular Reciprocals."
1321      */
1322     private MutableBigInteger modInverse(MutableBigInteger mod) {
1323         MutableBigInteger p = new MutableBigInteger(mod);
1324         MutableBigInteger f = new MutableBigInteger(this);
1325         MutableBigInteger g = new MutableBigInteger(p);
1326         SignedMutableBigInteger c = new SignedMutableBigInteger(1);
1327         SignedMutableBigInteger d = new SignedMutableBigInteger();
1328         MutableBigInteger temp = null;
1329         SignedMutableBigInteger sTemp = null;
1330 
1331         int k = 0;
1332         // Right shift f k times until odd, left shift d k times
1333         if (f.isEven()) {
1334             int trailingZeros = f.getLowestSetBit();
1335             f.rightShift(trailingZeros);
1336             d.leftShift(trailingZeros);
1337             k = trailingZeros;
1338         }
1339 
1340         // The Almost Inverse Algorithm
1341         while(!f.isOne()) {
1342             // If gcd(f, g) != 1, number is not invertible modulo mod
1343             if (f.isZero())
1344                 throw new ArithmeticException("BigInteger not invertible.");
1345 
1346             // If f < g exchange f, g and c, d
1347             if (f.compare(g) < 0) {
1348                 temp = f; f = g; g = temp;
1349                 sTemp = d; d = c; c = sTemp;
1350             }
1351 
1352             // If f == g (mod 4)
1353             if (((f.value[f.offset + f.intLen - 1] ^
1354                  g.value[g.offset + g.intLen - 1]) & 3) == 0) {
1355                 f.subtract(g);
1356                 c.signedSubtract(d);
1357             } else { // If f != g (mod 4)
1358                 f.add(g);
1359                 c.signedAdd(d);
1360             }
1361 
1362             // Right shift f k times until odd, left shift d k times
1363             int trailingZeros = f.getLowestSetBit();
1364             f.rightShift(trailingZeros);
1365             d.leftShift(trailingZeros);
1366             k += trailingZeros;
1367         }
1368 
1369         while (c.sign < 0)
1370            c.signedAdd(p);
1371 
1372         return fixup(c, p, k);
1373     }
1374 
1375     /*
1376      * The Fixup Algorithm
1377      * Calculates X such that X = C * 2^(-k) (mod P)
1378      * Assumes C<P and P is odd.
1379      */
1380     static MutableBigInteger fixup(MutableBigInteger c, MutableBigInteger p,
1381                                                                       int k) {
1382         MutableBigInteger temp = new MutableBigInteger();
1383         // Set r to the multiplicative inverse of p mod 2^32
1384         int r = -inverseMod32(p.value[p.offset+p.intLen-1]);
1385 
1386         for(int i=0, numWords = k >> 5; i<numWords; i++) {
1387             // V = R * c (mod 2^j)
1388             int  v = r * c.value[c.offset + c.intLen-1];
1389             // c = c + (v * p)
1390             p.mul(v, temp);
1391             c.add(temp);
1392             // c = c / 2^j
1393             c.intLen--;
1394         }
1395         int numBits = k & 0x1f;
1396         if (numBits != 0) {
1397             // V = R * c (mod 2^j)
1398             int v = r * c.value[c.offset + c.intLen-1];
1399             v &= ((1<<numBits) - 1);
1400             // c = c + (v * p)
1401             p.mul(v, temp);
1402             c.add(temp);
1403             // c = c / 2^j
1404             c.rightShift(numBits);
1405         }
1406 
1407         // In theory, c may be greater than p at this point (Very rare!)
1408         while (c.compare(p) >= 0)
1409             c.subtract(p);
1410 
1411         return c;
1412     }
1413 
1414     /**
1415      * Uses the extended Euclidean algorithm to compute the modInverse of base
1416      * mod a modulus that is a power of 2. The modulus is 2^k.
1417      */
1418     MutableBigInteger euclidModInverse(int k) {
1419         MutableBigInteger b = new MutableBigInteger(1);
1420         b.leftShift(k);
1421         MutableBigInteger mod = new MutableBigInteger(b);
1422 
1423         MutableBigInteger a = new MutableBigInteger(this);
1424         MutableBigInteger q = new MutableBigInteger();
1425         MutableBigInteger r = b.divide(a, q);
1426 
1427         MutableBigInteger swapper = b;
1428         // swap b & r
1429         b = r;
1430         r = swapper;
1431 
1432         MutableBigInteger t1 = new MutableBigInteger(q);
1433         MutableBigInteger t0 = new MutableBigInteger(1);
1434         MutableBigInteger temp = new MutableBigInteger();
1435 
1436         while (!b.isOne()) {
1437             r = a.divide(b, q);
1438 
1439             if (r.intLen == 0)
1440                 throw new ArithmeticException("BigInteger not invertible.");
1441 
1442             swapper = r;
1443             a = swapper;
1444 
1445             if (q.intLen == 1)
1446                 t1.mul(q.value[q.offset], temp);
1447             else
1448                 q.multiply(t1, temp);
1449             swapper = q;
1450             q = temp;
1451             temp = swapper;
1452             t0.add(q);
1453 
1454             if (a.isOne())
1455                 return t0;
1456 
1457             r = b.divide(a, q);
1458 
1459             if (r.intLen == 0)
1460                 throw new ArithmeticException("BigInteger not invertible.");
1461 
1462             swapper = b;
1463             b =  r;
1464 
1465             if (q.intLen == 1)
1466                 t0.mul(q.value[q.offset], temp);
1467             else
1468                 q.multiply(t0, temp);
1469             swapper = q; q = temp; temp = swapper;
1470 
1471             t1.add(q);
1472         }
1473         mod.subtract(t1);
1474         return mod;
1475     }
1476 
1477 }