summaryrefslogtreecommitdiffstats
path: root/libjava/classpath/java/math/BigInteger.java
diff options
context:
space:
mode:
Diffstat (limited to 'libjava/classpath/java/math/BigInteger.java')
-rw-r--r--libjava/classpath/java/math/BigInteger.java1328
1 files changed, 664 insertions, 664 deletions
diff --git a/libjava/classpath/java/math/BigInteger.java b/libjava/classpath/java/math/BigInteger.java
index 9d7abc755ac..953e557a811 100644
--- a/libjava/classpath/java/math/BigInteger.java
+++ b/libjava/classpath/java/math/BigInteger.java
@@ -7,7 +7,7 @@ GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
-
+
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
@@ -54,7 +54,7 @@ import java.util.logging.Logger;
* Written using on-line Java Platform 1.2 API Specification, as well
* as "The Java Class Libraries", 2nd edition (Addison-Wesley, 1998) and
* "Applied Cryptography, Second Edition" by Bruce Schneier (Wiley, 1996).
- *
+ *
* Based primarily on IntNum.java BitOps.java by Per Bothner (per@bothner.com)
* (found in Kawa 1.6.62).
*
@@ -84,13 +84,13 @@ public class BigInteger extends Number implements Comparable<BigInteger>
private static final long serialVersionUID = -8287574255936472291L;
- /** We pre-allocate integers in the range minFixNum..maxFixNum.
+ /** We pre-allocate integers in the range minFixNum..maxFixNum.
* Note that we must at least preallocate 0, 1, and 10. */
private static final int minFixNum = -100;
private static final int maxFixNum = 1024;
private static final int numFixNum = maxFixNum-minFixNum+1;
private static final BigInteger[] smallFixNums;
-
+
/** The alter-ego GMP instance for this. */
private transient GMP mpz;
@@ -109,8 +109,8 @@ public class BigInteger extends Number implements Comparable<BigInteger>
else
{
smallFixNums = new BigInteger[numFixNum];
- for (int i = numFixNum; --i >= 0; )
- smallFixNums[i] = new BigInteger(i + minFixNum);
+ for (int i = numFixNum; --i >= 0; )
+ smallFixNums[i] = new BigInteger(i + minFixNum);
ZERO = smallFixNums[-minFixNum];
ONE = smallFixNums[1 - minFixNum];
@@ -260,11 +260,11 @@ public class BigInteger extends Number implements Comparable<BigInteger>
if (signum == 0)
{
- int i;
- for (i = magnitude.length - 1; i >= 0 && magnitude[i] == 0; --i)
- ;
- if (i >= 0)
- throw new NumberFormatException();
+ int i;
+ for (i = magnitude.length - 1; i >= 0 && magnitude[i] == 0; --i)
+ ;
+ if (i >= 0)
+ throw new NumberFormatException();
return;
}
@@ -330,20 +330,20 @@ public class BigInteger extends Number implements Comparable<BigInteger>
while (highbits == 0 && nwords > 0)
{
- highbits = rnd.nextInt();
- --nwords;
+ highbits = rnd.nextInt();
+ --nwords;
}
if (nwords == 0 && highbits >= 0)
{
- ival = highbits;
+ ival = highbits;
}
else
{
- ival = highbits < 0 ? nwords + 2 : nwords + 1;
- words = new int[ival];
- words[nwords] = highbits;
- while (--nwords >= 0)
- words[nwords] = rnd.nextInt();
+ ival = highbits < 0 ? nwords + 2 : nwords + 1;
+ words = new int[ival];
+ words[nwords] = highbits;
+ while (--nwords >= 0)
+ words[nwords] = rnd.nextInt();
}
}
@@ -369,7 +369,7 @@ public class BigInteger extends Number implements Comparable<BigInteger>
}
}
- /**
+ /**
* Return a BigInteger that is bitLength bits long with a
* probability < 2^-100 of being composite.
*
@@ -465,9 +465,9 @@ public class BigInteger extends Number implements Comparable<BigInteger>
// Elements remaining in byte[] are a multiple of 4.
while (nwords > 0)
words[--nwords] = bytes[bptr++] << 24 |
- (bytes[bptr++] & 0xff) << 16 |
- (bytes[bptr++] & 0xff) << 8 |
- (bytes[bptr++] & 0xff);
+ (bytes[bptr++] & 0xff) << 16 |
+ (bytes[bptr++] & 0xff) << 8 |
+ (bytes[bptr++] & 0xff);
return words;
}
@@ -489,30 +489,30 @@ public class BigInteger extends Number implements Comparable<BigInteger>
{
if (nwords == 0)
{
- if (words != null)
- {
- if (ival > 0)
- ival = words[0];
- words = null;
- }
+ if (words != null)
+ {
+ if (ival > 0)
+ ival = words[0];
+ words = null;
+ }
}
else if (words == null
- || words.length < nwords
- || words.length > nwords + 2)
+ || words.length < nwords
+ || words.length > nwords + 2)
{
- int[] new_words = new int [nwords];
- if (words == null)
- {
- new_words[0] = ival;
- ival = 1;
- }
- else
- {
- if (nwords < ival)
- ival = nwords;
- System.arraycopy(words, 0, new_words, 0, ival);
- }
- words = new_words;
+ int[] new_words = new int [nwords];
+ if (words == null)
+ {
+ new_words[0] = ival;
+ ival = 1;
+ }
+ else
+ {
+ if (nwords < ival)
+ ival = nwords;
+ System.arraycopy(words, 0, new_words, 0, ival);
+ }
+ words = new_words;
}
}
@@ -588,19 +588,19 @@ public class BigInteger extends Number implements Comparable<BigInteger>
int i = len;
if (i > 0)
{
- int word = words[--i];
- if (word == -1)
- {
- while (i > 0 && (word = words[i - 1]) < 0)
- {
- i--;
- if (word != -1) break;
- }
- }
- else
- {
- while (word == 0 && i > 0 && (word = words[i - 1]) >= 0) i--;
- }
+ int word = words[--i];
+ if (word == -1)
+ {
+ while (i > 0 && (word = words[i - 1]) < 0)
+ {
+ i--;
+ if (word != -1) break;
+ }
+ }
+ else
+ {
+ while (word == 0 && i > 0 && (word = words[i - 1]) >= 0) i--;
+ }
}
return i + 1;
}
@@ -608,11 +608,11 @@ public class BigInteger extends Number implements Comparable<BigInteger>
private BigInteger canonicalize()
{
if (words != null
- && (ival = BigInteger.wordsNeeded(words, ival)) <= 1)
+ && (ival = BigInteger.wordsNeeded(words, ival)) <= 1)
{
- if (ival == 1)
- ival = words[0];
- words = null;
+ if (ival == 1)
+ ival = words[0];
+ words = null;
}
if (words == null && ival >= minFixNum && ival <= maxFixNum)
return smallFixNums[ival - minFixNum];
@@ -641,17 +641,17 @@ public class BigInteger extends Number implements Comparable<BigInteger>
{
if (x.words == null)
{
- set((long) x.ival + (long) y);
- return;
+ set((long) x.ival + (long) y);
+ return;
}
int len = x.ival;
realloc(len + 1);
long carry = y;
for (int i = 0; i < len; i++)
{
- carry += ((long) x.words[i] & 0xffffffffL);
- words[i] = (int) carry;
- carry >>= 32;
+ carry += ((long) x.words[i] & 0xffffffffL);
+ words[i] = (int) carry;
+ carry >>= 32;
}
if (x.words[len - 1] < 0)
carry--;
@@ -671,15 +671,15 @@ public class BigInteger extends Number implements Comparable<BigInteger>
int i = (int) y;
if ((long) i == y)
{
- ival = i;
- words = null;
+ ival = i;
+ words = null;
}
else
{
- realloc(2);
- words[0] = i;
- words[1] = (int) (y >> 32);
- ival = 2;
+ realloc(2);
+ words[0] = i;
+ words[1] = (int) (y >> 32);
+ ival = 2;
}
}
@@ -698,9 +698,9 @@ public class BigInteger extends Number implements Comparable<BigInteger>
set(y.ival);
else if (this != y)
{
- realloc(y.ival);
- System.arraycopy(y.words, 0, words, 0, y.ival);
- ival = y.ival;
+ realloc(y.ival);
+ System.arraycopy(y.words, 0, words, 0, y.ival);
+ ival = y.ival;
}
}
@@ -711,10 +711,10 @@ public class BigInteger extends Number implements Comparable<BigInteger>
return valueOf((long) k * (long) y.ival + (long) x.ival);
if (k != 1)
{
- if (k == -1)
- y = BigInteger.neg(y);
- else
- y = BigInteger.times(y, valueOf(k));
+ if (k == -1)
+ y = BigInteger.neg(y);
+ else
+ y = BigInteger.times(y, valueOf(k));
}
if (x.words == null)
return BigInteger.add(y, x.ival);
@@ -723,7 +723,7 @@ public class BigInteger extends Number implements Comparable<BigInteger>
// Both are big
if (y.ival > x.ival)
{ // Swap so x is longer then y.
- BigInteger tmp = x; x = y; y = tmp;
+ BigInteger tmp = x; x = y; y = tmp;
}
BigInteger result = alloc(x.ival + 1);
int i = y.ival;
@@ -731,9 +731,9 @@ public class BigInteger extends Number implements Comparable<BigInteger>
long y_ext = y.words[i - 1] < 0 ? 0xffffffffL : 0;
for (; i < x.ival; i++)
{
- carry += ((long) x.words[i] & 0xffffffffL) + y_ext;
- result.words[i] = (int) carry;
- carry >>>= 32;
+ carry += ((long) x.words[i] & 0xffffffffL) + y_ext;
+ result.words[i] = (int) carry;
+ carry >>>= 32;
}
if (x.words[i - 1] < 0)
y_ext--;
@@ -782,16 +782,16 @@ public class BigInteger extends Number implements Comparable<BigInteger>
BigInteger result = BigInteger.alloc(xlen + 1);
if (xwords[xlen - 1] < 0)
{
- negative = true;
- negate(result.words, xwords, xlen);
- xwords = result.words;
+ negative = true;
+ negate(result.words, xwords, xlen);
+ xwords = result.words;
}
else
negative = false;
if (y < 0)
{
- negative = !negative;
- y = -y;
+ negative = !negative;
+ y = -y;
}
result.words[xlen] = MPN.mul_1(result.words, xwords, xlen, y);
result.ival = xlen + 1;
@@ -813,28 +813,28 @@ public class BigInteger extends Number implements Comparable<BigInteger>
int ylen = y.ival;
if (x.isNegative())
{
- negative = true;
- xwords = new int[xlen];
- negate(xwords, x.words, xlen);
+ negative = true;
+ xwords = new int[xlen];
+ negate(xwords, x.words, xlen);
}
else
{
- negative = false;
- xwords = x.words;
+ negative = false;
+ xwords = x.words;
}
if (y.isNegative())
{
- negative = !negative;
- ywords = new int[ylen];
- negate(ywords, y.words, ylen);
+ negative = !negative;
+ ywords = new int[ylen];
+ negate(ywords, y.words, ylen);
}
else
ywords = y.words;
// Swap if x is shorter then y.
if (xlen < ylen)
{
- int[] twords = xwords; xwords = ywords; ywords = twords;
- int tlen = xlen; xlen = ylen; ylen = tlen;
+ int[] twords = xwords; xwords = ywords; ywords = twords;
+ int tlen = xlen; xlen = ylen; ylen = tlen;
}
BigInteger result = BigInteger.alloc(xlen+ylen);
MPN.mul(result.words, xwords, xlen, ywords, ylen);
@@ -858,42 +858,42 @@ public class BigInteger extends Number implements Comparable<BigInteger>
}
private static void divide(long x, long y,
- BigInteger quotient, BigInteger remainder,
- int rounding_mode)
+ BigInteger quotient, BigInteger remainder,
+ int rounding_mode)
{
boolean xNegative, yNegative;
if (x < 0)
{
- xNegative = true;
- if (x == Long.MIN_VALUE)
- {
- divide(valueOf(x), valueOf(y),
- quotient, remainder, rounding_mode);
- return;
- }
- x = -x;
+ xNegative = true;
+ if (x == Long.MIN_VALUE)
+ {
+ divide(valueOf(x), valueOf(y),
+ quotient, remainder, rounding_mode);
+ return;
+ }
+ x = -x;
}
else
xNegative = false;
if (y < 0)
{
- yNegative = true;
- if (y == Long.MIN_VALUE)
- {
- if (rounding_mode == TRUNCATE)
- { // x != Long.Min_VALUE implies abs(x) < abs(y)
- if (quotient != null)
- quotient.set(0);
- if (remainder != null)
- remainder.set(x);
- }
- else
- divide(valueOf(x), valueOf(y),
- quotient, remainder, rounding_mode);
- return;
- }
- y = -y;
+ yNegative = true;
+ if (y == Long.MIN_VALUE)
+ {
+ if (rounding_mode == TRUNCATE)
+ { // x != Long.Min_VALUE implies abs(x) < abs(y)
+ if (quotient != null)
+ quotient.set(0);
+ if (remainder != null)
+ remainder.set(x);
+ }
+ else
+ divide(valueOf(x), valueOf(y),
+ quotient, remainder, rounding_mode);
+ return;
+ }
+ y = -y;
}
else
yNegative = false;
@@ -905,47 +905,47 @@ public class BigInteger extends Number implements Comparable<BigInteger>
boolean add_one = false;
if (r != 0)
{
- switch (rounding_mode)
- {
- case TRUNCATE:
- break;
- case CEILING:
- case FLOOR:
- if (qNegative == (rounding_mode == FLOOR))
- add_one = true;
- break;
- case ROUND:
- add_one = r > ((y - (q & 1)) >> 1);
- break;
- }
+ switch (rounding_mode)
+ {
+ case TRUNCATE:
+ break;
+ case CEILING:
+ case FLOOR:
+ if (qNegative == (rounding_mode == FLOOR))
+ add_one = true;
+ break;
+ case ROUND:
+ add_one = r > ((y - (q & 1)) >> 1);
+ break;
+ }
}
if (quotient != null)
{
- if (add_one)
- q++;
- if (qNegative)
- q = -q;
- quotient.set(q);
+ if (add_one)
+ q++;
+ if (qNegative)
+ q = -q;
+ quotient.set(q);
}
if (remainder != null)
{
- // The remainder is by definition: X-Q*Y
- if (add_one)
- {
- // Subtract the remainder from Y.
- r = y - r;
- // In this case, abs(Q*Y) > abs(X).
- // So sign(remainder) = -sign(X).
- xNegative = ! xNegative;
- }
- else
- {
- // If !add_one, then: abs(Q*Y) <= abs(X).
- // So sign(remainder) = sign(X).
- }
- if (xNegative)
- r = -r;
- remainder.set(r);
+ // The remainder is by definition: X-Q*Y
+ if (add_one)
+ {
+ // Subtract the remainder from Y.
+ r = y - r;
+ // In this case, abs(Q*Y) > abs(X).
+ // So sign(remainder) = -sign(X).
+ xNegative = ! xNegative;
+ }
+ else
+ {
+ // If !add_one, then: abs(Q*Y) <= abs(X).
+ // So sign(remainder) = sign(X).
+ }
+ if (xNegative)
+ r = -r;
+ remainder.set(r);
}
}
@@ -958,19 +958,19 @@ public class BigInteger extends Number implements Comparable<BigInteger>
* @param rounding_mode one of FLOOR, CEILING, TRUNCATE, or ROUND.
*/
private static void divide(BigInteger x, BigInteger y,
- BigInteger quotient, BigInteger remainder,
- int rounding_mode)
+ BigInteger quotient, BigInteger remainder,
+ int rounding_mode)
{
if ((x.words == null || x.ival <= 2)
- && (y.words == null || y.ival <= 2))
+ && (y.words == null || y.ival <= 2))
{
- long x_l = x.longValue();
- long y_l = y.longValue();
- if (x_l != Long.MIN_VALUE && y_l != Long.MIN_VALUE)
- {
- divide(x_l, y_l, quotient, remainder, rounding_mode);
- return;
- }
+ long x_l = x.longValue();
+ long y_l = y.longValue();
+ if (x_l != Long.MIN_VALUE && y_l != Long.MIN_VALUE)
+ {
+ divide(x_l, y_l, quotient, remainder, rounding_mode);
+ return;
+ }
}
boolean xNegative = x.isNegative();
@@ -992,57 +992,57 @@ public class BigInteger extends Number implements Comparable<BigInteger>
int cmpval = MPN.cmp(xwords, xlen, ywords, ylen);
if (cmpval < 0) // abs(x) < abs(y)
{ // quotient = 0; remainder = num.
- int[] rwords = xwords; xwords = ywords; ywords = rwords;
- rlen = xlen; qlen = 1; xwords[0] = 0;
+ int[] rwords = xwords; xwords = ywords; ywords = rwords;
+ rlen = xlen; qlen = 1; xwords[0] = 0;
}
else if (cmpval == 0) // abs(x) == abs(y)
{
- xwords[0] = 1; qlen = 1; // quotient = 1
- ywords[0] = 0; rlen = 1; // remainder = 0;
+ xwords[0] = 1; qlen = 1; // quotient = 1
+ ywords[0] = 0; rlen = 1; // remainder = 0;
}
else if (ylen == 1)
{
- qlen = xlen;
- // Need to leave room for a word of leading zeros if dividing by 1
- // and the dividend has the high bit set. It might be safe to
- // increment qlen in all cases, but it certainly is only necessary
- // in the following case.
- if (ywords[0] == 1 && xwords[xlen-1] < 0)
- qlen++;
- rlen = 1;
- ywords[0] = MPN.divmod_1(xwords, xwords, xlen, ywords[0]);
+ qlen = xlen;
+ // Need to leave room for a word of leading zeros if dividing by 1
+ // and the dividend has the high bit set. It might be safe to
+ // increment qlen in all cases, but it certainly is only necessary
+ // in the following case.
+ if (ywords[0] == 1 && xwords[xlen-1] < 0)
+ qlen++;
+ rlen = 1;
+ ywords[0] = MPN.divmod_1(xwords, xwords, xlen, ywords[0]);
}
else // abs(x) > abs(y)
{
- // Normalize the denominator, i.e. make its most significant bit set by
- // shifting it normalization_steps bits to the left. Also shift the
- // numerator the same number of steps (to keep the quotient the same!).
-
- int nshift = MPN.count_leading_zeros(ywords[ylen - 1]);
- if (nshift != 0)
- {
- // Shift up the denominator setting the most significant bit of
- // the most significant word.
- MPN.lshift(ywords, 0, ywords, ylen, nshift);
-
- // Shift up the numerator, possibly introducing a new most
- // significant word.
- int x_high = MPN.lshift(xwords, 0, xwords, xlen, nshift);
- xwords[xlen++] = x_high;
- }
-
- if (xlen == ylen)
- xwords[xlen++] = 0;
- MPN.divide(xwords, xlen, ywords, ylen);
- rlen = ylen;
- MPN.rshift0 (ywords, xwords, 0, rlen, nshift);
-
- qlen = xlen + 1 - ylen;
- if (quotient != null)
- {
- for (int i = 0; i < qlen; i++)
- xwords[i] = xwords[i+ylen];
- }
+ // Normalize the denominator, i.e. make its most significant bit set by
+ // shifting it normalization_steps bits to the left. Also shift the
+ // numerator the same number of steps (to keep the quotient the same!).
+
+ int nshift = MPN.count_leading_zeros(ywords[ylen - 1]);
+ if (nshift != 0)
+ {
+ // Shift up the denominator setting the most significant bit of
+ // the most significant word.
+ MPN.lshift(ywords, 0, ywords, ylen, nshift);
+
+ // Shift up the numerator, possibly introducing a new most
+ // significant word.
+ int x_high = MPN.lshift(xwords, 0, xwords, xlen, nshift);
+ xwords[xlen++] = x_high;
+ }
+
+ if (xlen == ylen)
+ xwords[xlen++] = 0;
+ MPN.divide(xwords, xlen, ywords, ylen);
+ rlen = ylen;
+ MPN.rshift0 (ywords, xwords, 0, rlen, nshift);
+
+ qlen = xlen + 1 - ylen;
+ if (quotient != null)
+ {
+ for (int i = 0; i < qlen; i++)
+ xwords[i] = xwords[i+ylen];
+ }
}
if (ywords[rlen-1] < 0)
@@ -1056,74 +1056,74 @@ public class BigInteger extends Number implements Comparable<BigInteger>
boolean add_one = false;
if (rlen > 1 || ywords[0] != 0)
{ // Non-zero remainder i.e. in-exact quotient.
- switch (rounding_mode)
- {
- case TRUNCATE:
- break;
- case CEILING:
- case FLOOR:
- if (qNegative == (rounding_mode == FLOOR))
- add_one = true;
- break;
- case ROUND:
- // int cmp = compareTo(remainder<<1, abs(y));
- BigInteger tmp = remainder == null ? new BigInteger() : remainder;
- tmp.set(ywords, rlen);
- tmp = shift(tmp, 1);
- if (yNegative)
- tmp.setNegative();
- int cmp = compareTo(tmp, y);
- // Now cmp == compareTo(sign(y)*(remainder<<1), y)
- if (yNegative)
- cmp = -cmp;
- add_one = (cmp == 1) || (cmp == 0 && (xwords[0]&1) != 0);
- }
+ switch (rounding_mode)
+ {
+ case TRUNCATE:
+ break;
+ case CEILING:
+ case FLOOR:
+ if (qNegative == (rounding_mode == FLOOR))
+ add_one = true;
+ break;
+ case ROUND:
+ // int cmp = compareTo(remainder<<1, abs(y));
+ BigInteger tmp = remainder == null ? new BigInteger() : remainder;
+ tmp.set(ywords, rlen);
+ tmp = shift(tmp, 1);
+ if (yNegative)
+ tmp.setNegative();
+ int cmp = compareTo(tmp, y);
+ // Now cmp == compareTo(sign(y)*(remainder<<1), y)
+ if (yNegative)
+ cmp = -cmp;
+ add_one = (cmp == 1) || (cmp == 0 && (xwords[0]&1) != 0);
+ }
}
if (quotient != null)
{
- quotient.set(xwords, qlen);
- if (qNegative)
- {
- if (add_one) // -(quotient + 1) == ~(quotient)
- quotient.setInvert();
- else
- quotient.setNegative();
- }
- else if (add_one)
- quotient.setAdd(1);
+ quotient.set(xwords, qlen);
+ if (qNegative)
+ {
+ if (add_one) // -(quotient + 1) == ~(quotient)
+ quotient.setInvert();
+ else
+ quotient.setNegative();
+ }
+ else if (add_one)
+ quotient.setAdd(1);
}
if (remainder != null)
{
- // The remainder is by definition: X-Q*Y
- remainder.set(ywords, rlen);
- if (add_one)
- {
- // Subtract the remainder from Y:
- // abs(R) = abs(Y) - abs(orig_rem) = -(abs(orig_rem) - abs(Y)).
- BigInteger tmp;
- if (y.words == null)
- {
- tmp = remainder;
- tmp.set(yNegative ? ywords[0] + y.ival : ywords[0] - y.ival);
- }
- else
- tmp = BigInteger.add(remainder, y, yNegative ? 1 : -1);
- // Now tmp <= 0.
- // In this case, abs(Q) = 1 + floor(abs(X)/abs(Y)).
- // Hence, abs(Q*Y) > abs(X).
- // So sign(remainder) = -sign(X).
- if (xNegative)
- remainder.setNegative(tmp);
- else
- remainder.set(tmp);
- }
- else
- {
- // If !add_one, then: abs(Q*Y) <= abs(X).
- // So sign(remainder) = sign(X).
- if (xNegative)
- remainder.setNegative();
- }
+ // The remainder is by definition: X-Q*Y
+ remainder.set(ywords, rlen);
+ if (add_one)
+ {
+ // Subtract the remainder from Y:
+ // abs(R) = abs(Y) - abs(orig_rem) = -(abs(orig_rem) - abs(Y)).
+ BigInteger tmp;
+ if (y.words == null)
+ {
+ tmp = remainder;
+ tmp.set(yNegative ? ywords[0] + y.ival : ywords[0] - y.ival);
+ }
+ else
+ tmp = BigInteger.add(remainder, y, yNegative ? 1 : -1);
+ // Now tmp <= 0.
+ // In this case, abs(Q) = 1 + floor(abs(X)/abs(Y)).
+ // Hence, abs(Q*Y) > abs(X).
+ // So sign(remainder) = -sign(X).
+ if (xNegative)
+ remainder.setNegative(tmp);
+ else
+ remainder.set(tmp);
+ }
+ else
+ {
+ // If !add_one, then: abs(Q*Y) <= abs(X).
+ // So sign(remainder) = sign(X).
+ if (xNegative)
+ remainder.setNegative();
+ }
}
}
@@ -1220,9 +1220,9 @@ public class BigInteger extends Number implements Comparable<BigInteger>
{
if (exponent <= 0)
{
- if (exponent == 0)
- return ONE;
- throw new ArithmeticException("negative exponent");
+ if (exponent == 0)
+ return ONE;
+ throw new ArithmeticException("negative exponent");
}
if (USING_NATIVE)
@@ -1240,28 +1240,28 @@ public class BigInteger extends Number implements Comparable<BigInteger>
int[] pow2 = new int [blen];
int[] rwords = new int [blen];
int[] work = new int [blen];
- getAbsolute(pow2); // pow2 = abs(this);
+ getAbsolute(pow2); // pow2 = abs(this);
int rlen = 1;
rwords[0] = 1; // rwords = 1;
for (;;) // for (i = 0; ; i++)
{
- // pow2 == this**(2**i)
- // prod = this**(sum(j=0..i-1, (exponent>>j)&1))
- if ((exponent & 1) != 0)
- { // r *= pow2
- MPN.mul(work, pow2, plen, rwords, rlen);
- int[] temp = work; work = rwords; rwords = temp;
- rlen += plen;
- while (rwords[rlen - 1] == 0) rlen--;
- }
- exponent >>= 1;
- if (exponent == 0)
- break;
- // pow2 *= pow2;
- MPN.mul(work, pow2, plen, pow2, plen);
- int[] temp = work; work = pow2; pow2 = temp; // swap to avoid a copy
- plen *= 2;
- while (pow2[plen - 1] == 0) plen--;
+ // pow2 == this**(2**i)
+ // prod = this**(sum(j=0..i-1, (exponent>>j)&1))
+ if ((exponent & 1) != 0)
+ { // r *= pow2
+ MPN.mul(work, pow2, plen, rwords, rlen);
+ int[] temp = work; work = rwords; rwords = temp;
+ rlen += plen;
+ while (rwords[rlen - 1] == 0) rlen--;
+ }
+ exponent >>= 1;
+ if (exponent == 0)
+ break;
+ // pow2 *= pow2;
+ MPN.mul(work, pow2, plen, pow2, plen);
+ int[] temp = work; work = pow2; pow2 = temp; // swap to avoid a copy
+ plen *= 2;
+ while (pow2[plen - 1] == 0) plen--;
}
if (rwords[rlen - 1] < 0)
rlen++;
@@ -1276,11 +1276,11 @@ public class BigInteger extends Number implements Comparable<BigInteger>
throw new ArithmeticException("not invertible");
if (b == 1)
- // Success: values are indeed invertible!
- // Bottom of the recursion reached; start unwinding.
- return new int[] { -prevDiv, 1 };
+ // Success: values are indeed invertible!
+ // Bottom of the recursion reached; start unwinding.
+ return new int[] { -prevDiv, 1 };
- int[] xy = euclidInv(b, a % b, a / b); // Recursion happens here.
+ int[] xy = euclidInv(b, a % b, a / b); // Recursion happens here.
a = xy[0]; // use our local copy of 'a' as a work var
xy[0] = a * -prevDiv + xy[1];
xy[1] = a;
@@ -1295,11 +1295,11 @@ public class BigInteger extends Number implements Comparable<BigInteger>
if (b.isOne())
{
- // Success: values are indeed invertible!
- // Bottom of the recursion reached; start unwinding.
- xy[0] = neg(prevDiv);
+ // Success: values are indeed invertible!
+ // Bottom of the recursion reached; start unwinding.
+ xy[0] = neg(prevDiv);
xy[1] = ONE;
- return;
+ return;
}
// Recursion happens in the following conditional!
@@ -1308,18 +1308,18 @@ public class BigInteger extends Number implements Comparable<BigInteger>
if (a.words == null)
{
int[] xyInt = euclidInv(b.ival, a.ival % b.ival, a.ival / b.ival);
- xy[0] = new BigInteger(xyInt[0]);
+ xy[0] = new BigInteger(xyInt[0]);
xy[1] = new BigInteger(xyInt[1]);
}
else
{
- BigInteger rem = new BigInteger();
- BigInteger quot = new BigInteger();
- divide(a, b, quot, rem, FLOOR);
+ BigInteger rem = new BigInteger();
+ BigInteger quot = new BigInteger();
+ divide(a, b, quot, rem, FLOOR);
// quot and rem may not be in canonical form. ensure
rem.canonicalize();
quot.canonicalize();
- euclidInv(b, rem, quot, xy);
+ euclidInv(b, rem, quot, xy);
}
BigInteger t = xy[0];
@@ -1358,61 +1358,61 @@ public class BigInteger extends Number implements Comparable<BigInteger>
if (y.words == null)
{
- // The result is guaranteed to be less than the modulus, y (which is
- // an int), so simplify this by working with the int result of this
- // modulo y. Also, if this is negative, make it positive via modulo
- // math. Note that BigInteger.mod() must be used even if this is
- // already an int as the % operator would provide a negative result if
- // this is negative, BigInteger.mod() never returns negative values.
+ // The result is guaranteed to be less than the modulus, y (which is
+ // an int), so simplify this by working with the int result of this
+ // modulo y. Also, if this is negative, make it positive via modulo
+ // math. Note that BigInteger.mod() must be used even if this is
+ // already an int as the % operator would provide a negative result if
+ // this is negative, BigInteger.mod() never returns negative values.
int xval = (words != null || isNegative()) ? mod(y).ival : ival;
int yval = y.ival;
- // Swap values so x > y.
- if (yval > xval)
- {
- int tmp = xval; xval = yval; yval = tmp;
- swapped = true;
- }
- // Normally, the result is in the 2nd element of the array, but
- // if originally x < y, then x and y were swapped and the result
- // is in the 1st element of the array.
- result.ival =
- euclidInv(yval, xval % yval, xval / yval)[swapped ? 0 : 1];
-
- // Result can't be negative, so make it positive by adding the
- // original modulus, y.ival (not the possibly "swapped" yval).
- if (result.ival < 0)
- result.ival += y.ival;
+ // Swap values so x > y.
+ if (yval > xval)
+ {
+ int tmp = xval; xval = yval; yval = tmp;
+ swapped = true;
+ }
+ // Normally, the result is in the 2nd element of the array, but
+ // if originally x < y, then x and y were swapped and the result
+ // is in the 1st element of the array.
+ result.ival =
+ euclidInv(yval, xval % yval, xval / yval)[swapped ? 0 : 1];
+
+ // Result can't be negative, so make it positive by adding the
+ // original modulus, y.ival (not the possibly "swapped" yval).
+ if (result.ival < 0)
+ result.ival += y.ival;
}
else
{
- // As above, force this to be a positive value via modulo math.
- BigInteger x = isNegative() ? this.mod(y) : this;
-
- // Swap values so x > y.
- if (x.compareTo(y) < 0)
- {
- result = x; x = y; y = result; // use 'result' as a work var
- swapped = true;
- }
- // As above (for ints), result will be in the 2nd element unless
- // the original x and y were swapped.
- BigInteger rem = new BigInteger();
- BigInteger quot = new BigInteger();
- divide(x, y, quot, rem, FLOOR);
+ // As above, force this to be a positive value via modulo math.
+ BigInteger x = isNegative() ? this.mod(y) : this;
+
+ // Swap values so x > y.
+ if (x.compareTo(y) < 0)
+ {
+ result = x; x = y; y = result; // use 'result' as a work var
+ swapped = true;
+ }
+ // As above (for ints), result will be in the 2nd element unless
+ // the original x and y were swapped.
+ BigInteger rem = new BigInteger();
+ BigInteger quot = new BigInteger();
+ divide(x, y, quot, rem, FLOOR);
// quot and rem may not be in canonical form. ensure
rem.canonicalize();
quot.canonicalize();
- BigInteger[] xy = new BigInteger[2];
- euclidInv(y, rem, quot, xy);
- result = swapped ? xy[0] : xy[1];
+ BigInteger[] xy = new BigInteger[2];
+ euclidInv(y, rem, quot, xy);
+ result = swapped ? xy[0] : xy[1];
- // Result can't be negative, so make it positive by adding the
- // original modulus, y (which is now x if they were swapped).
- if (result.isNegative())
- result = add(result, swapped ? x : y, 1);
+ // Result can't be negative, so make it positive by adding the
+ // original modulus, y (which is now x if they were swapped).
+ if (result.isNegative())
+ result = add(result, swapped ? x : y, 1);
}
-
+
return result;
}
@@ -1450,10 +1450,10 @@ public class BigInteger extends Number implements Comparable<BigInteger>
while (!u.isZero())
{
- if (u.and(ONE).isOne())
- s = times(s, t).mod(m);
- u = u.shiftRight(1);
- t = times(t, t).mod(m);
+ if (u.and(ONE).isOne())
+ s = times(s, t).mod(m);
+ u = u.shiftRight(1);
+ t = times(t, t).mod(m);
}
return s;
@@ -1466,18 +1466,18 @@ public class BigInteger extends Number implements Comparable<BigInteger>
int tmp;
if (b > a)
{
- tmp = a; a = b; b = tmp;
+ tmp = a; a = b; b = tmp;
}
for(;;)
{
- if (b == 0)
- return a;
+ if (b == 0)
+ return a;
if (b == 1)
- return b;
+ return b;
tmp = b;
- b = a % b;
- a = tmp;
- }
+ b = a % b;
+ a = tmp;
+ }
}
public BigInteger gcd(BigInteger y)
@@ -1494,24 +1494,24 @@ public class BigInteger extends Number implements Comparable<BigInteger>
int yval = y.ival;
if (words == null)
{
- if (xval == 0)
- return abs(y);
- if (y.words == null
- && xval != Integer.MIN_VALUE && yval != Integer.MIN_VALUE)
- {
- if (xval < 0)
- xval = -xval;
- if (yval < 0)
- yval = -yval;
- return valueOf(gcd(xval, yval));
- }
- xval = 1;
+ if (xval == 0)
+ return abs(y);
+ if (y.words == null
+ && xval != Integer.MIN_VALUE && yval != Integer.MIN_VALUE)
+ {
+ if (xval < 0)
+ xval = -xval;
+ if (yval < 0)
+ yval = -yval;
+ return valueOf(gcd(xval, yval));
+ }
+ xval = 1;
}
if (y.words == null)
{
- if (yval == 0)
- return abs(this);
- yval = 1;
+ if (yval == 0)
+ return abs(this);
+ yval = 1;
}
int len = (xval > yval ? xval : yval) + 1;
int[] xwords = new int[len];
@@ -1562,12 +1562,12 @@ public class BigInteger extends Number implements Comparable<BigInteger>
int i;
for (i = 0; i < primes.length; i++)
{
- if (words == null && ival == primes[i])
- return true;
+ if (words == null && ival == primes[i])
+ return true;
divide(this, smallFixNums[primes[i] - minFixNum], null, rem, TRUNCATE);
if (rem.canonicalize().isZero())
- return false;
+ return false;
}
// Now perform the Rabin-Miller test.
@@ -1599,23 +1599,23 @@ public class BigInteger extends Number implements Comparable<BigInteger>
// Remark 4.28 states: "...A strategy that is sometimes employed
// is to fix the bases a to be the first few primes instead of
// choosing them at random.
- z = smallFixNums[primes[t] - minFixNum].modPow(m, this);
- if (z.isOne() || z.equals(pMinus1))
- continue; // Passes the test; may be prime.
+ z = smallFixNums[primes[t] - minFixNum].modPow(m, this);
+ if (z.isOne() || z.equals(pMinus1))
+ continue; // Passes the test; may be prime.
- for (i = 0; i < b; )
- {
- if (z.isOne())
- return false;
- i++;
- if (z.equals(pMinus1))
- break; // Passes the test; may be prime.
+ for (i = 0; i < b; )
+ {
+ if (z.isOne())
+ return false;
+ i++;
+ if (z.equals(pMinus1))
+ break; // Passes the test; may be prime.
- z = z.modPow(valueOf(2), this);
- }
+ z = z.modPow(valueOf(2), this);
+ }
- if (i == b && !z.equals(pMinus1))
- return false;
+ if (i == b && !z.equals(pMinus1))
+ return false;
}
return true;
}
@@ -1626,8 +1626,8 @@ public class BigInteger extends Number implements Comparable<BigInteger>
ival = ~ival;
else
{
- for (int i = ival; --i >= 0; )
- words[i] = ~words[i];
+ for (int i = ival; --i >= 0; )
+ words[i] = ~words[i];
}
}
@@ -1637,36 +1637,36 @@ public class BigInteger extends Number implements Comparable<BigInteger>
int xlen;
if (x.words == null)
{
- if (count < 32)
- {
- set((long) x.ival << count);
- return;
- }
- xwords = new int[1];
- xwords[0] = x.ival;
- xlen = 1;
+ if (count < 32)
+ {
+ set((long) x.ival << count);
+ return;
+ }
+ xwords = new int[1];
+ xwords[0] = x.ival;
+ xlen = 1;
}
else
{
- xwords = x.words;
- xlen = x.ival;
+ xwords = x.words;
+ xlen = x.ival;
}
int word_count = count >> 5;
count &= 31;
int new_len = xlen + word_count;
if (count == 0)
{
- realloc(new_len);
- for (int i = xlen; --i >= 0; )
- words[i+word_count] = xwords[i];
+ realloc(new_len);
+ for (int i = xlen; --i >= 0; )
+ words[i+word_count] = xwords[i];
}
else
{
- new_len++;
- realloc(new_len);
- int shift_out = MPN.lshift(words, word_count, xwords, xlen, count);
- count = 32 - count;
- words[new_len-1] = (shift_out << count) >> count; // sign-extend.
+ new_len++;
+ realloc(new_len);
+ int shift_out = MPN.lshift(words, word_count, xwords, xlen, count);
+ count = 32 - count;
+ words[new_len-1] = (shift_out << count) >> count; // sign-extend.
}
ival = new_len;
for (int i = word_count; --i >= 0; )
@@ -1681,21 +1681,21 @@ public class BigInteger extends Number implements Comparable<BigInteger>
set(x);
else
{
- boolean neg = x.isNegative();
- int word_count = count >> 5;
- count &= 31;
- int d_len = x.ival - word_count;
- if (d_len <= 0)
- set(neg ? -1 : 0);
- else
- {
- if (words == null || words.length < d_len)
- realloc(d_len);
- MPN.rshift0 (words, x.words, word_count, d_len, count);
- ival = d_len;
- if (neg)
- words[d_len-1] |= -2 << (31 - count);
- }
+ boolean neg = x.isNegative();
+ int word_count = count >> 5;
+ count &= 31;
+ int d_len = x.ival - word_count;
+ if (d_len <= 0)
+ set(neg ? -1 : 0);
+ else
+ {
+ if (words == null || words.length < d_len)
+ realloc(d_len);
+ MPN.rshift0 (words, x.words, word_count, d_len, count);
+ ival = d_len;
+ if (neg)
+ words[d_len-1] |= -2 << (31 - count);
+ }
}
}
@@ -1711,10 +1711,10 @@ public class BigInteger extends Number implements Comparable<BigInteger>
{
if (x.words == null)
{
- if (count <= 0)
- return valueOf(count > -32 ? x.ival >> (-count) : x.ival < 0 ? -1 : 0);
- if (count < 32)
- return valueOf((long) x.ival << count);
+ if (count <= 0)
+ return valueOf(count > -32 ? x.ival >> (-count) : x.ival < 0 ? -1 : 0);
+ if (count < 32)
+ return valueOf((long) x.ival << count);
}
if (count == 0)
return x;
@@ -1767,57 +1767,57 @@ public class BigInteger extends Number implements Comparable<BigInteger>
buffer.append(Long.toString(longValue(), radix));
else
{
- boolean neg = isNegative();
- int[] work;
- if (neg || radix != 16)
- {
- work = new int[ival];
- getAbsolute(work);
- }
- else
- work = words;
- int len = ival;
-
- if (radix == 16)
- {
- if (neg)
- buffer.append('-');
- int buf_start = buffer.length();
- for (int i = len; --i >= 0; )
- {
- int word = work[i];
- for (int j = 8; --j >= 0; )
- {
- int hex_digit = (word >> (4 * j)) & 0xF;
- // Suppress leading zeros:
- if (hex_digit > 0 || buffer.length() > buf_start)
- buffer.append(Character.forDigit(hex_digit, 16));
- }
- }
- }
- else
- {
- int i = buffer.length();
- for (;;)
- {
- int digit = MPN.divmod_1(work, work, len, radix);
- buffer.append(Character.forDigit(digit, radix));
- while (len > 0 && work[len-1] == 0) len--;
- if (len == 0)
- break;
- }
- if (neg)
- buffer.append('-');
- /* Reverse buffer. */
- int j = buffer.length() - 1;
- while (i < j)
- {
- char tmp = buffer.charAt(i);
- buffer.setCharAt(i, buffer.charAt(j));
- buffer.setCharAt(j, tmp);
- i++; j--;
- }
- }
+ boolean neg = isNegative();
+ int[] work;
+ if (neg || radix != 16)
+ {
+ work = new int[ival];
+ getAbsolute(work);
+ }
+ else
+ work = words;
+ int len = ival;
+
+ if (radix == 16)
+ {
+ if (neg)
+ buffer.append('-');
+ int buf_start = buffer.length();
+ for (int i = len; --i >= 0; )
+ {
+ int word = work[i];
+ for (int j = 8; --j >= 0; )
+ {
+ int hex_digit = (word >> (4 * j)) & 0xF;
+ // Suppress leading zeros:
+ if (hex_digit > 0 || buffer.length() > buf_start)
+ buffer.append(Character.forDigit(hex_digit, 16));
+ }
+ }
+ }
+ else
+ {
+ int i = buffer.length();
+ for (;;)
+ {
+ int digit = MPN.divmod_1(work, work, len, radix);
+ buffer.append(Character.forDigit(digit, radix));
+ while (len > 0 && work[len-1] == 0) len--;
+ if (len == 0)
+ break;
+ }
+ if (neg)
+ buffer.append('-');
+ /* Reverse buffer. */
+ int j = buffer.length() - 1;
+ while (i < j)
+ {
+ char tmp = buffer.charAt(i);
+ buffer.setCharAt(i, buffer.charAt(j));
+ buffer.setCharAt(j, tmp);
+ i++; j--;
+ }
+ }
}
}
@@ -1900,8 +1900,8 @@ public class BigInteger extends Number implements Comparable<BigInteger>
return false;
for (int i = x.ival; --i >= 0; )
{
- if (x.words[i] != y.words[i])
- return false;
+ if (x.words[i] != y.words[i])
+ return false;
}
return true;
}
@@ -1915,7 +1915,7 @@ public class BigInteger extends Number implements Comparable<BigInteger>
}
private static BigInteger valueOf(byte[] digits, int byte_len,
- boolean negative, int radix)
+ boolean negative, int radix)
{
int chars_per_word = MPN.chars_per_word(radix);
int[] words = new int[byte_len / chars_per_word + 1];
@@ -1959,7 +1959,7 @@ public class BigInteger extends Number implements Comparable<BigInteger>
int i;
for (i = 0; i < (n >> 5) ; i++)
if (words[i] != 0)
- return true;
+ return true;
return (n & 31) != 0 && (words[i] & ((1 << (n & 31)) - 1)) != 0;
}
@@ -2000,7 +2000,7 @@ public class BigInteger extends Number implements Comparable<BigInteger>
int excess_bits = il - (ml + 1);
if (excess_bits > 0)
m = ((words == null) ? ival >> excess_bits
- : MPN.rshift_long(words, ival, excess_bits));
+ : MPN.rshift_long(words, ival, excess_bits));
else
m = longValue() << (- excess_bits);
@@ -2008,31 +2008,31 @@ public class BigInteger extends Number implements Comparable<BigInteger>
// any amount, even if it's less than half a step, it overflows.
if (exp == 1023 && ((m >> 1) == (1L << 53) - 1))
{
- if (remainder || checkBits(il - ml))
- return neg ? Double.NEGATIVE_INFINITY : Double.POSITIVE_INFINITY;
- else
- return neg ? - Double.MAX_VALUE : Double.MAX_VALUE;
+ if (remainder || checkBits(il - ml))
+ return neg ? Double.NEGATIVE_INFINITY : Double.POSITIVE_INFINITY;
+ else
+ return neg ? - Double.MAX_VALUE : Double.MAX_VALUE;
}
// Normal round-to-even rule: round up if the bit dropped is a one, and
// the bit above it or any of the bits below it is a one.
if ((m & 1) == 1
- && ((m & 2) == 2 || remainder || checkBits(excess_bits)))
- {
- m += 2;
- // Check if we overflowed the mantissa
- if ((m & (1L << 54)) != 0)
- {
- exp++;
- // renormalize
- m >>= 1;
- }
- // Check if a denormalized mantissa was just rounded up to a
- // normalized one.
- else if (ml == 52 && (m & (1L << 53)) != 0)
- exp++;
- }
-
+ && ((m & 2) == 2 || remainder || checkBits(excess_bits)))
+ {
+ m += 2;
+ // Check if we overflowed the mantissa
+ if ((m & (1L << 54)) != 0)
+ {
+ exp++;
+ // renormalize
+ m >>= 1;
+ }
+ // Check if a denormalized mantissa was just rounded up to a
+ // normalized one.
+ else if (ml == 52 && (m & (1L << 53)) != 0)
+ exp++;
+ }
+
// Discard the rounding bit
m >>= 1;
@@ -2052,14 +2052,14 @@ public class BigInteger extends Number implements Comparable<BigInteger>
int len;
if (this.words == null)
{
- len = 1;
- words[0] = this.ival;
+ len = 1;
+ words[0] = this.ival;
}
else
{
- len = this.ival;
- for (int i = len; --i >= 0; )
- words[i] = this.words[i];
+ len = this.ival;
+ for (int i = len; --i >= 0; )
+ words[i] = this.words[i];
}
if (words[len - 1] < 0)
negate(words, words, len);
@@ -2090,11 +2090,11 @@ public class BigInteger extends Number implements Comparable<BigInteger>
int len = x.ival;
if (x.words == null)
{
- if (len == Integer.MIN_VALUE)
- set(- (long) len);
- else
- set(-len);
- return;
+ if (len == Integer.MIN_VALUE)
+ set(- (long) len);
+ else
+ set(-len);
+ return;
}
realloc(len + 1);
if (negate(words, x.words, len))
@@ -2139,7 +2139,7 @@ public class BigInteger extends Number implements Comparable<BigInteger>
if (USING_NATIVE)
{
BigInteger result = new BigInteger();
- mpz.negate(result.mpz);
+ mpz.negate(result.mpz);
return result;
}
@@ -2193,8 +2193,8 @@ public class BigInteger extends Number implements Comparable<BigInteger>
// If BigInteger is an int, then it is in ival and nbytes will be <= 4.
while (nbytes > 4)
{
- word = words[wptr++];
- for (int i = 4; i > 0; --i, word >>= 8)
+ word = words[wptr++];
+ for (int i = 4; i > 0; --i, word >>= 8)
bytes[--nbytes] = (byte) word;
}
@@ -2234,35 +2234,35 @@ public class BigInteger extends Number implements Comparable<BigInteger>
/** Do one the the 16 possible bit-wise operations of two BigIntegers. */
private static void setBitOp(BigInteger result, int op,
- BigInteger x, BigInteger y)
+ BigInteger x, BigInteger y)
{
if ((y.words != null) && (x.words == null || x.ival < y.ival))
{
- BigInteger temp = x; x = y; y = temp;
- op = swappedOp(op);
+ BigInteger temp = x; x = y; y = temp;
+ op = swappedOp(op);
}
int xi;
int yi;
int xlen, ylen;
if (y.words == null)
{
- yi = y.ival;
- ylen = 1;
+ yi = y.ival;
+ ylen = 1;
}
else
{
- yi = y.words[0];
- ylen = y.ival;
+ yi = y.words[0];
+ ylen = y.ival;
}
if (x.words == null)
{
- xi = x.ival;
- xlen = 1;
+ xi = x.ival;
+ xlen = 1;
}
else
{
- xi = x.words[0];
- xlen = x.ival;
+ xi = x.words[0];
+ xlen = x.ival;
}
if (xlen > 1)
result.realloc(xlen);
@@ -2277,126 +2277,126 @@ public class BigInteger extends Number implements Comparable<BigInteger>
switch (op)
{
case 0: // clr
- ni = 0;
- break;
+ ni = 0;
+ break;
case 1: // and
- for (;;)
- {
- ni = xi & yi;
- if (i+1 >= ylen) break;
- w[i++] = ni; xi = x.words[i]; yi = y.words[i];
- }
- if (yi < 0) finish = 1;
- break;
+ for (;;)
+ {
+ ni = xi & yi;
+ if (i+1 >= ylen) break;
+ w[i++] = ni; xi = x.words[i]; yi = y.words[i];
+ }
+ if (yi < 0) finish = 1;
+ break;
case 2: // andc2
- for (;;)
- {
- ni = xi & ~yi;
- if (i+1 >= ylen) break;
- w[i++] = ni; xi = x.words[i]; yi = y.words[i];
- }
- if (yi >= 0) finish = 1;
- break;
+ for (;;)
+ {
+ ni = xi & ~yi;
+ if (i+1 >= ylen) break;
+ w[i++] = ni; xi = x.words[i]; yi = y.words[i];
+ }
+ if (yi >= 0) finish = 1;
+ break;
case 3: // copy x
- ni = xi;
- finish = 1; // Copy rest
- break;
+ ni = xi;
+ finish = 1; // Copy rest
+ break;
case 4: // andc1
- for (;;)
- {
- ni = ~xi & yi;
- if (i+1 >= ylen) break;
- w[i++] = ni; xi = x.words[i]; yi = y.words[i];
- }
- if (yi < 0) finish = 2;
- break;
+ for (;;)
+ {
+ ni = ~xi & yi;
+ if (i+1 >= ylen) break;
+ w[i++] = ni; xi = x.words[i]; yi = y.words[i];
+ }
+ if (yi < 0) finish = 2;
+ break;
case 5: // copy y
- for (;;)
- {
- ni = yi;
- if (i+1 >= ylen) break;
- w[i++] = ni; xi = x.words[i]; yi = y.words[i];
- }
- break;
+ for (;;)
+ {
+ ni = yi;
+ if (i+1 >= ylen) break;
+ w[i++] = ni; xi = x.words[i]; yi = y.words[i];
+ }
+ break;
case 6: // xor
- for (;;)
- {
- ni = xi ^ yi;
- if (i+1 >= ylen) break;
- w[i++] = ni; xi = x.words[i]; yi = y.words[i];
- }
- finish = yi < 0 ? 2 : 1;
- break;
+ for (;;)
+ {
+ ni = xi ^ yi;
+ if (i+1 >= ylen) break;
+ w[i++] = ni; xi = x.words[i]; yi = y.words[i];
+ }
+ finish = yi < 0 ? 2 : 1;
+ break;
case 7: // ior
- for (;;)
- {
- ni = xi | yi;
- if (i+1 >= ylen) break;
- w[i++] = ni; xi = x.words[i]; yi = y.words[i];
- }
- if (yi >= 0) finish = 1;
- break;
+ for (;;)
+ {
+ ni = xi | yi;
+ if (i+1 >= ylen) break;
+ w[i++] = ni; xi = x.words[i]; yi = y.words[i];
+ }
+ if (yi >= 0) finish = 1;
+ break;
case 8: // nor
- for (;;)
- {
- ni = ~(xi | yi);
- if (i+1 >= ylen) break;
- w[i++] = ni; xi = x.words[i]; yi = y.words[i];
- }
- if (yi >= 0) finish = 2;
- break;
+ for (;;)
+ {
+ ni = ~(xi | yi);
+ if (i+1 >= ylen) break;
+ w[i++] = ni; xi = x.words[i]; yi = y.words[i];
+ }
+ if (yi >= 0) finish = 2;
+ break;
case 9: // eqv [exclusive nor]
- for (;;)
- {
- ni = ~(xi ^ yi);
- if (i+1 >= ylen) break;
- w[i++] = ni; xi = x.words[i]; yi = y.words[i];
- }
- finish = yi >= 0 ? 2 : 1;
- break;
+ for (;;)
+ {
+ ni = ~(xi ^ yi);
+ if (i+1 >= ylen) break;
+ w[i++] = ni; xi = x.words[i]; yi = y.words[i];
+ }
+ finish = yi >= 0 ? 2 : 1;
+ break;
case 10: // c2
- for (;;)
- {
- ni = ~yi;
- if (i+1 >= ylen) break;
- w[i++] = ni; xi = x.words[i]; yi = y.words[i];
- }
- break;
+ for (;;)
+ {
+ ni = ~yi;
+ if (i+1 >= ylen) break;
+ w[i++] = ni; xi = x.words[i]; yi = y.words[i];
+ }
+ break;
case 11: // orc2
- for (;;)
- {
- ni = xi | ~yi;
- if (i+1 >= ylen) break;
- w[i++] = ni; xi = x.words[i]; yi = y.words[i];
- }
- if (yi < 0) finish = 1;
- break;
+ for (;;)
+ {
+ ni = xi | ~yi;
+ if (i+1 >= ylen) break;
+ w[i++] = ni; xi = x.words[i]; yi = y.words[i];
+ }
+ if (yi < 0) finish = 1;
+ break;
case 12: // c1
- ni = ~xi;
- finish = 2;
- break;
+ ni = ~xi;
+ finish = 2;
+ break;
case 13: // orc1
- for (;;)
- {
- ni = ~xi | yi;
- if (i+1 >= ylen) break;
- w[i++] = ni; xi = x.words[i]; yi = y.words[i];
- }
- if (yi >= 0) finish = 2;
- break;
+ for (;;)
+ {
+ ni = ~xi | yi;
+ if (i+1 >= ylen) break;
+ w[i++] = ni; xi = x.words[i]; yi = y.words[i];
+ }
+ if (yi >= 0) finish = 2;
+ break;
case 14: // nand
- for (;;)
- {
- ni = ~(xi & yi);
- if (i+1 >= ylen) break;
- w[i++] = ni; xi = x.words[i]; yi = y.words[i];
- }
- if (yi < 0) finish = 2;
- break;
+ for (;;)
+ {
+ ni = ~(xi & yi);
+ if (i+1 >= ylen) break;
+ w[i++] = ni; xi = x.words[i]; yi = y.words[i];
+ }
+ if (yi < 0) finish = 2;
+ break;
default:
case 15: // set
- ni = -1;
- break;
+ ni = -1;
+ break;
}
// Here i==ylen-1; w[0]..w[i-1] have the correct result;
// and ni contains the correct result for w[i+1].
@@ -2405,13 +2405,13 @@ public class BigInteger extends Number implements Comparable<BigInteger>
switch (finish)
{
case 0:
- if (i == 0 && w == null)
- {
- result.ival = ni;
- return;
- }
- w[i++] = ni;
- break;
+ if (i == 0 && w == null)
+ {
+ result.ival = ni;
+ return;
+ }
+ w[i++] = ni;
+ break;
case 1: w[i] = ni; while (++i < xlen) w[i] = x.words[i]; break;
case 2: w[i] = ni; while (++i < xlen) w[i] = ~x.words[i]; break;
}
@@ -2590,15 +2590,15 @@ public class BigInteger extends Number implements Comparable<BigInteger>
// bit4count[I] is number of '1' bits in I.
private static final byte[] bit4_count = { 0, 1, 1, 2, 1, 2, 2, 3,
- 1, 2, 2, 3, 2, 3, 3, 4};
+ 1, 2, 2, 3, 2, 3, 3, 4};
private static int bitCount(int i)
{
int count = 0;
while (i != 0)
{
- count += bit4_count[i & 15];
- i >>>= 4;
+ count += bit4_count[i & 15];
+ i >>>= 4;
}
return count;
}
@@ -2622,13 +2622,13 @@ public class BigInteger extends Number implements Comparable<BigInteger>
int[] x_words = words;
if (x_words == null)
{
- x_len = 1;
- i = bitCount(ival);
+ x_len = 1;
+ i = bitCount(ival);
}
else
{
- x_len = ival;
- i = bitCount(x_words, x_len);
+ x_len = ival;
+ i = bitCount(x_words, x_len);
}
return isNegative() ? x_len * 32 - i : i;
}
@@ -2646,19 +2646,19 @@ public class BigInteger extends Number implements Comparable<BigInteger>
}
else
{
- s.defaultReadObject();
- if (magnitude.length == 0 || signum == 0)
- {
- this.ival = 0;
- this.words = null;
- }
- else
- {
- words = byteArrayToIntArray(magnitude, signum < 0 ? -1 : 0);
- BigInteger result = make(words, words.length);
- this.ival = result.ival;
- this.words = result.words;
- }
+ s.defaultReadObject();
+ if (magnitude.length == 0 || signum == 0)
+ {
+ this.ival = 0;
+ this.words = null;
+ }
+ else
+ {
+ words = byteArrayToIntArray(magnitude, signum < 0 ? -1 : 0);
+ BigInteger result = make(words, words.length);
+ this.ival = result.ival;
+ this.words = result.words;
+ }
}
}
OpenPOWER on IntegriCloud