emul/compact/src/main/java/java/math/MutableBigInteger.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Sat, 07 Sep 2013 13:51:24 +0200
branchjdk7-b147
changeset 1258 724f3e1ea53e
permissions -rw-r--r--
Additional set of classes to make porting of lookup library more easier
     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 }