src/share/classes/java/math/MutableBigInteger.java

Print this page




  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 class MutableBigInteger {
  45     /**
  46      * Holds the magnitude of this MutableBigInteger in big endian order.
  47      * The magnitude may start at an offset into the value array, and it may
  48      * end before the length of the value array.
  49      */
  50     int[] value;
  51 
  52     /**
  53      * The number of ints of the value array that are currently used
  54      * to hold the magnitude of this MutableBigInteger. The magnitude starts
  55      * at an offset and offset + intLen may be less than value.length.
  56      */
  57     int intLen;
  58 
  59     /**
  60      * The offset into the value array where the magnitude of this
  61      * MutableBigInteger begins.
  62      */
  63     int offset = 0;
  64 

  65     /**
  66      * This mask is used to obtain the value of an int as if it were unsigned.


  67      */
  68     private final static long LONG_MASK = 0xffffffffL;
  69 
  70     // Constructors
  71 
  72     /**
  73      * The default constructor. An empty MutableBigInteger is created with
  74      * a one word capacity.
  75      */
  76     MutableBigInteger() {
  77         value = new int[1];
  78         intLen = 0;
  79     }
  80 
  81     /**
  82      * Construct a new MutableBigInteger with a magnitude specified by
  83      * the int val.
  84      */
  85     MutableBigInteger(int val) {
  86         value = new int[1];
  87         intLen = 1;
  88         value[0] = val;
  89     }
  90 
  91     /**
  92      * Construct a new MutableBigInteger with the specified value array
  93      * up to the specified length.
  94      */
  95     MutableBigInteger(int[] val, int len) {
  96         value = val;
  97         intLen = len;
  98     }
  99 
 100     /**
 101      * Construct a new MutableBigInteger with the specified value array
 102      * up to the length of the array supplied.
 103      */
 104     MutableBigInteger(int[] val) {
 105         value = val;
 106         intLen = val.length;
 107     }
 108 
 109     /**
 110      * Construct a new MutableBigInteger with a magnitude equal to the
 111      * specified BigInteger.
 112      */
 113     MutableBigInteger(BigInteger b) {
 114         value = b.mag.clone();
 115         intLen = value.length;
 116     }
 117 
 118     /**
 119      * Construct a new MutableBigInteger with a magnitude equal to the
 120      * specified MutableBigInteger.
 121      */
 122     MutableBigInteger(MutableBigInteger val) {
 123         intLen = val.intLen;
 124         value = new int[intLen];

 125 
 126         for(int i=0; i<intLen; i++)
 127             value[i] = val.value[val.offset+i];






 128     }
 129 
 130     /**









































 131      * Clear out a MutableBigInteger for reuse.
 132      */
 133     void clear() {
 134         offset = intLen = 0;
 135         for (int index=0, n=value.length; index < n; index++)
 136             value[index] = 0;
 137     }
 138 
 139     /**
 140      * Set a MutableBigInteger to zero, removing its offset.
 141      */
 142     void reset() {
 143         offset = intLen = 0;
 144     }
 145 
 146     /**
 147      * Compare the magnitude of two MutableBigIntegers. Returns -1, 0 or 1
 148      * as this MutableBigInteger is numerically less than, equal to, or
 149      * greater than {@code b}.
 150      */
 151     final int compare(MutableBigInteger b) {
 152         if (intLen < b.intLen)

 153             return -1;
 154         if (intLen > b.intLen)
 155             return 1;
 156 
 157         for (int i=0; i<intLen; i++) {
 158             int b1 = value[offset+i]     + 0x80000000;
 159             int b2 = b.value[b.offset+i] + 0x80000000;



 160             if (b1 < b2)
 161                 return -1;
 162             if (b1 > b2)
 163                 return 1;
 164         }
 165         return 0;
 166     }
 167 
 168     /**








































 169      * Return the index of the lowest set bit in this MutableBigInteger. If the
 170      * magnitude of this MutableBigInteger is zero, -1 is returned.
 171      */
 172     private final int getLowestSetBit() {
 173         if (intLen == 0)
 174             return -1;
 175         int j, b;
 176         for (j=intLen-1; (j>0) && (value[j+offset]==0); j--)
 177             ;
 178         b = value[j+offset];
 179         if (b==0)
 180             return -1;
 181         return ((intLen-1-j)<<5) + BigInteger.trailingZeroCnt(b);
 182     }
 183 
 184     /**
 185      * Return the int in use in this MutableBigInteger at the specified
 186      * index. This method is not used because it is not inlined on all
 187      * platforms.
 188      */
 189     private final int getInt(int index) {
 190         return value[offset+index];
 191     }
 192 
 193     /**
 194      * Return a long which is equal to the unsigned value of the int in
 195      * use in this MutableBigInteger at the specified index. This method is
 196      * not used because it is not inlined on all platforms.
 197      */
 198     private final long getLong(int index) {
 199         return value[offset+index] & LONG_MASK;
 200     }
 201 


 253      * as often as originally intended.
 254      */
 255     void setInt(int index, int val) {
 256         value[offset + index] = val;
 257     }
 258 
 259     /**
 260      * Sets this MutableBigInteger's value array to the specified array.
 261      * The intLen is set to the specified length.
 262      */
 263     void setValue(int[] val, int length) {
 264         value = val;
 265         intLen = length;
 266         offset = 0;
 267     }
 268 
 269     /**
 270      * Sets this MutableBigInteger's value array to a copy of the specified
 271      * array. The intLen is set to the length of the new array.
 272      */
 273     void copyValue(MutableBigInteger val) {
 274         int len = val.intLen;
 275         if (value.length < len)
 276             value = new int[len];
 277 
 278         for(int i=0; i<len; i++)
 279             value[i] = val.value[val.offset+i];
 280         intLen = len;
 281         offset = 0;
 282     }
 283 
 284     /**
 285      * Sets this MutableBigInteger's value array to a copy of the specified
 286      * array. The intLen is set to the length of the specified array.
 287      */
 288     void copyValue(int[] val) {
 289         int len = val.length;
 290         if (value.length < len)
 291             value = new int[len];
 292         for(int i=0; i<len; i++)
 293             value[i] = val[i];
 294         intLen = len;
 295         offset = 0;
 296     }
 297 
 298     /**
 299      * Returns true iff this MutableBigInteger has a value of one.
 300      */
 301     boolean isOne() {
 302         return (intLen == 1) && (value[offset] == 1);
 303     }
 304 
 305     /**
 306      * Returns true iff this MutableBigInteger has a value of zero.
 307      */
 308     boolean isZero() {
 309         return (intLen == 0);
 310     }
 311 
 312     /**
 313      * Returns true iff this MutableBigInteger is even.


 323         return ((value[offset + intLen - 1] & 1) == 1);
 324     }
 325 
 326     /**
 327      * Returns true iff this MutableBigInteger is in normal form. A
 328      * MutableBigInteger is in normal form if it has no leading zeros
 329      * after the offset, and intLen + offset <= value.length.
 330      */
 331     boolean isNormal() {
 332         if (intLen + offset > value.length)
 333             return false;
 334         if (intLen ==0)
 335             return true;
 336         return (value[offset] != 0);
 337     }
 338 
 339     /**
 340      * Returns a String representation of this MutableBigInteger in radix 10.
 341      */
 342     public String toString() {
 343         BigInteger b = new BigInteger(this, 1);
 344         return b.toString();
 345     }
 346 
 347     /**
 348      * Right shift this MutableBigInteger n bits. The MutableBigInteger is left
 349      * in normal form.
 350      */
 351     void rightShift(int n) {
 352         if (intLen == 0)
 353             return;
 354         int nInts = n >>> 5;
 355         int nBits = n & 0x1F;
 356         this.intLen -= nInts;
 357         if (nBits == 0)
 358             return;
 359         int bitsInHighWord = BigInteger.bitLen(value[offset]);
 360         if (nBits >= bitsInHighWord) {
 361             this.primitiveLeftShift(32 - nBits);
 362             this.intLen--;
 363         } else {
 364             primitiveRightShift(nBits);
 365         }
 366     }
 367 
 368     /**
 369      * Left shift this MutableBigInteger n bits.
 370      */
 371     void leftShift(int n) {
 372         /*
 373          * If there is enough storage space in this MutableBigInteger already
 374          * the available space will be used. Space to the right of the used
 375          * ints in the value array is faster to utilize, so the extra space
 376          * will be taken from the right if possible.
 377          */
 378         if (intLen == 0)
 379            return;
 380         int nInts = n >>> 5;
 381         int nBits = n&0x1F;
 382         int bitsInHighWord = BigInteger.bitLen(value[offset]);
 383 
 384         // If shift can be done without moving words, do so
 385         if (n <= (32-bitsInHighWord)) {
 386             primitiveLeftShift(nBits);
 387             return;
 388         }
 389 
 390         int newLen = intLen + nInts +1;
 391         if (nBits <= (32-bitsInHighWord))
 392             newLen--;
 393         if (value.length < newLen) {
 394             // The array must grow
 395             int[] result = new int[newLen];
 396             for (int i=0; i<intLen; i++)
 397                 result[i] = value[offset+i];
 398             setValue(result, newLen);
 399         } else if (value.length - offset >= newLen) {
 400             // Use space on right
 401             for(int i=0; i<newLen - intLen; i++)
 402                 value[offset+intLen+i] = 0;


 482         for (int i=offset, c=val[i], m=i+intLen-1; i<m; i++) {
 483             int b = c;
 484             c = val[i+1];
 485             val[i] = (b << n) | (c >>> n2);
 486         }
 487         val[offset+intLen-1] <<= n;
 488     }
 489 
 490     /**
 491      * Adds the contents of two MutableBigInteger objects.The result
 492      * is placed within this MutableBigInteger.
 493      * The contents of the addend are not changed.
 494      */
 495     void add(MutableBigInteger addend) {
 496         int x = intLen;
 497         int y = addend.intLen;
 498         int resultLen = (intLen > addend.intLen ? intLen : addend.intLen);
 499         int[] result = (value.length < resultLen ? new int[resultLen] : value);
 500 
 501         int rstart = result.length-1;
 502         long sum = 0;

 503 
 504         // Add common parts of both numbers
 505         while(x>0 && y>0) {
 506             x--; y--;
 507             sum = (value[x+offset] & LONG_MASK) +
 508                 (addend.value[y+addend.offset] & LONG_MASK) + (sum >>> 32);
 509             result[rstart--] = (int)sum;

 510         }
 511 
 512         // Add remainder of the longer number
 513         while(x>0) {
 514             x--;
 515             sum = (value[x+offset] & LONG_MASK) + (sum >>> 32);


 516             result[rstart--] = (int)sum;

 517         }
 518         while(y>0) {
 519             y--;
 520             sum = (addend.value[y+addend.offset] & LONG_MASK) + (sum >>> 32);
 521             result[rstart--] = (int)sum;

 522         }
 523 
 524         if ((sum >>> 32) > 0) { // Result must grow in length
 525             resultLen++;
 526             if (result.length < resultLen) {
 527                 int temp[] = new int[resultLen];
 528                 for (int i=resultLen-1; i>0; i--)
 529                     temp[i] = result[i-1];

 530                 temp[0] = 1;
 531                 result = temp;
 532             } else {
 533                 result[rstart--] = 1;
 534             }
 535         }
 536 
 537         value = result;
 538         intLen = resultLen;
 539         offset = result.length - resultLen;
 540     }
 541 
 542 
 543     /**
 544      * Subtracts the smaller of this and b from the larger and places the
 545      * result into this MutableBigInteger.
 546      */
 547     int subtract(MutableBigInteger b) {
 548         MutableBigInteger a = this;
 549 


 694         for (int i = intLen-1; i >= 0; i--) {
 695             long product = ylong * (value[i+offset] & LONG_MASK) + carry;
 696             zval[i+1] = (int)product;
 697             carry = product >>> 32;
 698         }
 699 
 700         if (carry == 0) {
 701             z.offset = 1;
 702             z.intLen = intLen;
 703         } else {
 704             z.offset = 0;
 705             z.intLen = intLen + 1;
 706             zval[0] = (int)carry;
 707         }
 708         z.value = zval;
 709     }
 710 
 711     /**
 712      * This method is used for division of an n word dividend by a one word
 713      * divisor. The quotient is placed into quotient. The one word divisor is
 714      * specified by divisor. The value of this MutableBigInteger is the
 715      * dividend at invocation but is replaced by the remainder.
 716      *
 717      * NOTE: The value of this MutableBigInteger is modified by this method.

 718      */
 719     void divideOneWord(int divisor, MutableBigInteger quotient) {
 720         long divLong = divisor & LONG_MASK;
 721 
 722         // Special case of one word dividend
 723         if (intLen == 1) {
 724             long remValue = value[offset] & LONG_MASK;
 725             quotient.value[0] = (int) (remValue / divLong);
 726             quotient.intLen = (quotient.value[0] == 0) ? 0 : 1;


 727             quotient.offset = 0;
 728 
 729             value[0] = (int) (remValue - (quotient.value[0] * divLong));
 730             offset = 0;
 731             intLen = (value[0] == 0) ? 0 : 1;
 732 
 733             return;
 734         }
 735 
 736         if (quotient.value.length < intLen)
 737             quotient.value = new int[intLen];
 738         quotient.offset = 0;
 739         quotient.intLen = intLen;
 740 
 741         // Normalize the divisor
 742         int shift = 32 - BigInteger.bitLen(divisor);
 743 
 744         int rem = value[offset];
 745         long remLong = rem & LONG_MASK;
 746         if (remLong < divLong) {
 747             quotient.value[0] = 0;
 748         } else {
 749             quotient.value[0] = (int)(remLong/divLong);
 750             rem = (int) (remLong - (quotient.value[0] * divLong));
 751             remLong = rem & LONG_MASK;
 752         }
 753 
 754         int xlen = intLen;
 755         int[] qWord = new int[2];
 756         while (--xlen > 0) {
 757             long dividendEstimate = (remLong<<32) |
 758                 (value[offset + intLen - xlen] & LONG_MASK);
 759             if (dividendEstimate >= 0) {
 760                 qWord[0] = (int) (dividendEstimate/divLong);
 761                 qWord[1] = (int) (dividendEstimate - (qWord[0] * divLong));
 762             } else {
 763                 divWord(qWord, dividendEstimate, divisor);
 764             }
 765             quotient.value[intLen - xlen] = qWord[0];
 766             rem = qWord[1];
 767             remLong = rem & LONG_MASK;
 768         }
 769 

 770         // Unnormalize
 771         if (shift > 0)
 772             value[0] = rem %= divisor;
 773         else
 774             value[0] = rem;
 775         intLen = (value[0] == 0) ? 0 : 1;
 776 
 777         quotient.normalize();
 778     }
 779 
 780 
 781     /**
 782      * Calculates the quotient and remainder of this div b and places them
 783      * in the MutableBigInteger objects provided.
 784      *
 785      * Uses Algorithm D in Knuth section 4.3.1.
 786      * Many optimizations to that algorithm have been adapted from the Colin
 787      * Plumb C library.
 788      * It special cases one word divisors for speed.
 789      * The contents of a and b are not changed.
 790      *
 791      */
 792     void divide(MutableBigInteger b,
 793                         MutableBigInteger quotient, MutableBigInteger rem) {
 794         if (b.intLen == 0)
 795             throw new ArithmeticException("BigInteger divide by zero");
 796 
 797         // Dividend is zero
 798         if (intLen == 0) {
 799             quotient.intLen = quotient.offset = rem.intLen = rem.offset = 0;
 800             return;
 801         }
 802 
 803         int cmp = compare(b);
 804 
 805         // Dividend less than divisor
 806         if (cmp < 0) {
 807             quotient.intLen = quotient.offset = 0;
 808             rem.copyValue(this);
 809             return;
 810         }
 811         // Dividend equal to divisor
 812         if (cmp == 0) {
 813             quotient.value[0] = quotient.intLen = 1;
 814             quotient.offset = rem.intLen = rem.offset = 0;
 815             return;
 816         }
 817 
 818         quotient.clear();
 819 
 820         // Special case one word divisor
 821         if (b.intLen == 1) {
 822             rem.copyValue(this);
 823             rem.divideOneWord(b.value[b.offset], quotient);
 824             return;

 825         }
 826 
 827         // Copy divisor value to protect divisor
 828         int[] d = new int[b.intLen];
 829         for(int i=0; i<b.intLen; i++)
 830             d[i] = b.value[b.offset+i];
 831         int dlen = b.intLen;
 832 
 833         // Remainder starts as dividend with space for a leading zero
 834         if (rem.value.length < intLen +1)
 835             rem.value = new int[intLen+1];







 836 
 837         for (int i=0; i<intLen; i++)
 838             rem.value[i+1] = value[i+offset];




























 839         rem.intLen = intLen;
 840         rem.offset = 1;
 841 
 842         int nlen = rem.intLen;
 843 
 844         // Set the quotient size

 845         int limit = nlen - dlen + 1;
 846         if (quotient.value.length < limit) {
 847             quotient.value = new int[limit];
 848             quotient.offset = 0;
 849         }
 850         quotient.intLen = limit;
 851         int[] q = quotient.value;
 852 
 853         // D1 normalize the divisor
 854         int shift = 32 - BigInteger.bitLen(d[0]);
 855         if (shift > 0) {
 856             // First shift will not grow array
 857             BigInteger.primitiveLeftShift(d, dlen, shift);
 858             // But this one might
 859             rem.leftShift(shift);
 860         }
 861 
 862         // Must insert leading 0 in rem if its length did not change
 863         if (rem.intLen == nlen) {
 864             rem.offset = 0;
 865             rem.value[0] = 0;
 866             rem.intLen++;
 867         }
 868 
 869         int dh = d[0];
 870         long dhLong = dh & LONG_MASK;
 871         int dl = d[1];
 872         int[] qWord = new int[2];
 873 
 874         // D2 Initialize j
 875         for(int j=0; j<limit; j++) {
 876             // D3 Calculate qhat
 877             // estimate qhat
 878             int qhat = 0;
 879             int qrem = 0;
 880             boolean skipCorrection = false;
 881             int nh = rem.value[j+rem.offset];
 882             int nh2 = nh + 0x80000000;
 883             int nm = rem.value[j+1+rem.offset];
 884 
 885             if (nh == dh) {
 886                 qhat = ~0;
 887                 qrem = nh + nm;
 888                 skipCorrection = qrem + 0x80000000 < nh2;
 889             } else {
 890                 long nChunk = (((long)nh) << 32) | (nm & LONG_MASK);
 891                 if (nChunk >= 0) {


 893                     qrem = (int) (nChunk - (qhat * dhLong));
 894                 } else {
 895                     divWord(qWord, nChunk, dh);
 896                     qhat = qWord[0];
 897                     qrem = qWord[1];
 898                 }
 899             }
 900 
 901             if (qhat == 0)
 902                 continue;
 903 
 904             if (!skipCorrection) { // Correct qhat
 905                 long nl = rem.value[j+2+rem.offset] & LONG_MASK;
 906                 long rs = ((qrem & LONG_MASK) << 32) | nl;
 907                 long estProduct = (dl & LONG_MASK) * (qhat & LONG_MASK);
 908 
 909                 if (unsignedLongCompare(estProduct, rs)) {
 910                     qhat--;
 911                     qrem = (int)((qrem & LONG_MASK) + dhLong);
 912                     if ((qrem & LONG_MASK) >=  dhLong) {
 913                         estProduct = (dl & LONG_MASK) * (qhat & LONG_MASK);
 914                         rs = ((qrem & LONG_MASK) << 32) | nl;
 915                         if (unsignedLongCompare(estProduct, rs))
 916                             qhat--;
 917                     }
 918                 }
 919             }
 920 
 921             // D4 Multiply and subtract
 922             rem.value[j+rem.offset] = 0;
 923             int borrow = mulsub(rem.value, d, qhat, dlen, j+rem.offset);
 924 
 925             // D5 Test remainder
 926             if (borrow + 0x80000000 > nh2) {
 927                 // D6 Add back
 928                 divadd(d, rem.value, j+1+rem.offset);
 929                 qhat--;
 930             }
 931 
 932             // Store the quotient digit
 933             q[j] = qhat;
 934         } // D7 loop on j
 935 
 936         // D8 Unnormalize
 937         if (shift > 0)
 938             rem.rightShift(shift);
 939 
 940         rem.normalize();
 941         quotient.normalize();


 942     }
 943 
 944     /**
 945      * Compare two longs as if they were unsigned.
 946      * Returns true iff one is bigger than two.
 947      */
 948     private boolean unsignedLongCompare(long one, long two) {
 949         return (one+Long.MIN_VALUE) > (two+Long.MIN_VALUE);
 950     }
 951 
 952     /**
 953      * This method divides a long quantity by an int to estimate
 954      * qhat for two multi precision numbers. It is used when
 955      * the signed value of n is less than zero.
 956      */
 957     private void divWord(int[] result, long n, int d) {
 958         long dLong = d & LONG_MASK;
 959 
 960         if (dLong == 1) {
 961             result[0] = (int)n;


 972             r += dLong;
 973             q--;
 974         }
 975         while (r >= dLong) {
 976             r -= dLong;
 977             q++;
 978         }
 979 
 980         // n - q*dlong == r && 0 <= r <dLong, hence we're done.
 981         result[0] = (int)q;
 982         result[1] = (int)r;
 983     }
 984 
 985     /**
 986      * Calculate GCD of this and b. This and b are changed by the computation.
 987      */
 988     MutableBigInteger hybridGCD(MutableBigInteger b) {
 989         // Use Euclid's algorithm until the numbers are approximately the
 990         // same length, then use the binary GCD algorithm to find the GCD.
 991         MutableBigInteger a = this;
 992         MutableBigInteger q = new MutableBigInteger(),
 993                           r = new MutableBigInteger();
 994 
 995         while (b.intLen != 0) {
 996             if (Math.abs(a.intLen - b.intLen) < 2)
 997                 return a.binaryGCD(b);
 998 
 999             a.divide(b, q, r);
1000             MutableBigInteger swapper = a;
1001             a = b; b = r; r = swapper;
1002         }
1003         return a;
1004     }
1005 
1006     /**
1007      * Calculate GCD of this and v.
1008      * Assumes that this and v are not zero.
1009      */
1010     private MutableBigInteger binaryGCD(MutableBigInteger v) {
1011         // Algorithm B from Knuth section 4.5.2
1012         MutableBigInteger u = this;
1013         MutableBigInteger r = new MutableBigInteger();
1014 
1015         // step B1
1016         int s1 = u.getLowestSetBit();
1017         int s2 = v.getLowestSetBit();
1018         int k = (s1 < s2) ? s1 : s2;
1019         if (k != 0) {
1020             u.rightShift(k);
1021             v.rightShift(k);


1052             // step B6
1053             if ((tsign = u.difference(v)) == 0)
1054                 break;
1055             t = (tsign >= 0) ? u : v;
1056         }
1057 
1058         if (k > 0)
1059             u.leftShift(k);
1060         return u;
1061     }
1062 
1063     /**
1064      * Calculate GCD of a and b interpreted as unsigned integers.
1065      */
1066     static int binaryGcd(int a, int b) {
1067         if (b==0)
1068             return a;
1069         if (a==0)
1070             return b;
1071 
1072         int x;
1073         int aZeros = 0;
1074         while ((x = a & 0xff) == 0) {
1075             a >>>= 8;
1076             aZeros += 8;
1077         }
1078         int y = BigInteger.trailingZeroTable[x];
1079         aZeros += y;
1080         a >>>= y;
1081 
1082         int bZeros = 0;
1083         while ((x = b & 0xff) == 0) {
1084             b >>>= 8;
1085             bZeros += 8;
1086         }
1087         y = BigInteger.trailingZeroTable[x];
1088         bZeros += y;
1089         b >>>= y;
1090 
1091         int t = (aZeros < bZeros ? aZeros : bZeros);
1092 
1093         while (a != b) {
1094             if ((a+0x80000000) > (b+0x80000000)) {  // a > b as unsigned
1095                 a -= b;
1096 
1097                 while ((x = a & 0xff) == 0)
1098                     a >>>= 8;
1099                 a >>>= BigInteger.trailingZeroTable[x];
1100             } else {
1101                 b -= a;
1102 
1103                 while ((x = b & 0xff) == 0)
1104                     b >>>= 8;
1105                 b >>>= BigInteger.trailingZeroTable[x];
1106             }
1107         }
1108         return a<<t;
1109     }
1110 
1111     /**
1112      * Returns the modInverse of this mod p. This and p are not affected by
1113      * the operation.
1114      */
1115     MutableBigInteger mutableModInverse(MutableBigInteger p) {
1116         // Modulus is odd, use Schroeppel's algorithm
1117         if (p.isOdd())
1118             return modInverse(p);
1119 
1120         // Base and modulus are even, throw exception
1121         if (isEven())
1122             throw new ArithmeticException("BigInteger not invertible.");
1123 
1124         // Get even part of modulus expressed as a power of 2
1125         int powersOf2 = p.getLowestSetBit();


1135         MutableBigInteger oddPart = modInverse(oddMod);
1136 
1137         // Calculate 1/a mod evenMod
1138         MutableBigInteger evenPart = modInverseMP2(powersOf2);
1139 
1140         // Combine the results using Chinese Remainder Theorem
1141         MutableBigInteger y1 = modInverseBP2(oddMod, powersOf2);
1142         MutableBigInteger y2 = oddMod.modInverseMP2(powersOf2);
1143 
1144         MutableBigInteger temp1 = new MutableBigInteger();
1145         MutableBigInteger temp2 = new MutableBigInteger();
1146         MutableBigInteger result = new MutableBigInteger();
1147 
1148         oddPart.leftShift(powersOf2);
1149         oddPart.multiply(y1, result);
1150 
1151         evenPart.multiply(oddMod, temp1);
1152         temp1.multiply(y2, temp2);
1153 
1154         result.add(temp2);
1155         result.divide(p, temp1, temp2);
1156         return temp2;
1157     }
1158 
1159     /*
1160      * Calculate the multiplicative inverse of this mod 2^k.
1161      */
1162     MutableBigInteger modInverseMP2(int k) {
1163         if (isEven())
1164             throw new ArithmeticException("Non-invertible. (GCD != 1)");
1165 
1166         if (k > 64)
1167             return euclidModInverse(k);
1168 
1169         int t = inverseMod32(value[offset+intLen-1]);
1170 
1171         if (k < 33) {
1172             t = (k == 32 ? t : t & ((1 << k) - 1));
1173             return new MutableBigInteger(t);
1174         }
1175 
1176         long pLong = (value[offset+intLen-1] & LONG_MASK);


1304         }
1305 
1306         // In theory, c may be greater than p at this point (Very rare!)
1307         while (c.compare(p) >= 0)
1308             c.subtract(p);
1309 
1310         return c;
1311     }
1312 
1313     /**
1314      * Uses the extended Euclidean algorithm to compute the modInverse of base
1315      * mod a modulus that is a power of 2. The modulus is 2^k.
1316      */
1317     MutableBigInteger euclidModInverse(int k) {
1318         MutableBigInteger b = new MutableBigInteger(1);
1319         b.leftShift(k);
1320         MutableBigInteger mod = new MutableBigInteger(b);
1321 
1322         MutableBigInteger a = new MutableBigInteger(this);
1323         MutableBigInteger q = new MutableBigInteger();
1324         MutableBigInteger r = new MutableBigInteger();
1325 
1326         b.divide(a, q, r);
1327         MutableBigInteger swapper = b; b = r; r = swapper;


1328 
1329         MutableBigInteger t1 = new MutableBigInteger(q);
1330         MutableBigInteger t0 = new MutableBigInteger(1);
1331         MutableBigInteger temp = new MutableBigInteger();
1332 
1333         while (!b.isOne()) {
1334             a.divide(b, q, r);
1335 
1336             if (r.intLen == 0)
1337                 throw new ArithmeticException("BigInteger not invertible.");
1338 
1339             swapper = r; r = a; a = swapper;

1340 
1341             if (q.intLen == 1)
1342                 t1.mul(q.value[q.offset], temp);
1343             else
1344                 q.multiply(t1, temp);
1345             swapper = q; q = temp; temp = swapper;
1346 

1347             t0.add(q);
1348 
1349             if (a.isOne())
1350                 return t0;
1351 
1352             b.divide(a, q, r);
1353 
1354             if (r.intLen == 0)
1355                 throw new ArithmeticException("BigInteger not invertible.");
1356 
1357             swapper = b; b = r; r = swapper;

1358 
1359             if (q.intLen == 1)
1360                 t0.mul(q.value[q.offset], temp);
1361             else
1362                 q.multiply(t0, temp);
1363             swapper = q; q = temp; temp = swapper;
1364 
1365             t1.add(q);
1366         }
1367         mod.subtract(t1);
1368         return mod;
1369     }
1370 
1371 }


  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 isn't fit into 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 


 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.


 411         return ((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;


 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 


 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) {


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;


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);


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();


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);


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 }