home *** CD-ROM | disk | FTP | other *** search
- package java.math;
-
- import java.util.Random;
-
- public class BigInteger extends Number {
- private int signum;
- private byte[] magnitude;
- private int bitCount;
- private int bitLength;
- private int firstNonzeroByteNum;
- private int lowestSetBit;
- private static final BigInteger ZERO = new BigInteger(new byte[0], 0);
- private static final int MAX_CONSTANT = 16;
- private static BigInteger[] posConst = new BigInteger[17];
- private static BigInteger[] negConst = new BigInteger[17];
- private static final byte[] bitLen;
- private static final byte[] bitCnt;
- private static final byte[] trailingZeroCnt;
- private static String[] zeros;
- private static final BigInteger ONE;
- private static final BigInteger TWO;
- private static final char ZERO_CHAR;
- private static int[] digitsPerLong;
- private static BigInteger[] longRadix;
-
- public BigInteger(byte[] var1) throws NumberFormatException {
- this.bitCount = -1;
- this.bitLength = -1;
- this.firstNonzeroByteNum = -2;
- this.lowestSetBit = -2;
- if (var1.length == 0) {
- throw new NumberFormatException("Zero length BigInteger");
- } else if (var1[0] < 0) {
- this.magnitude = makePositive(var1);
- this.signum = -1;
- } else {
- this.magnitude = stripLeadingZeroBytes(var1);
- this.signum = this.magnitude.length == 0 ? 0 : 1;
- }
- }
-
- public BigInteger(int var1, byte[] var2) throws NumberFormatException {
- this.bitCount = -1;
- this.bitLength = -1;
- this.firstNonzeroByteNum = -2;
- this.lowestSetBit = -2;
- this.magnitude = stripLeadingZeroBytes(var2);
- if (var1 >= -1 && var1 <= 1) {
- if (this.magnitude.length == 0) {
- this.signum = 0;
- } else if (var1 == 0) {
- throw new NumberFormatException("signum-magnitude mismatch");
- } else {
- this.signum = var1;
- }
- } else {
- throw new NumberFormatException("Invalid signum value");
- }
- }
-
- public BigInteger(String var1, int var2) throws NumberFormatException {
- this.bitCount = -1;
- this.bitLength = -1;
- this.firstNonzeroByteNum = -2;
- this.lowestSetBit = -2;
- int var3 = 0;
- if (var2 >= 2 && var2 <= 36) {
- if (var1.length() == 0) {
- throw new NumberFormatException("Zero length BigInteger");
- } else {
- this.signum = 1;
- if (var1.charAt(0) == '-') {
- if (var1.length() == 1) {
- throw new NumberFormatException("Zero length BigInteger");
- }
-
- this.signum = -1;
- var3 = 1;
- }
-
- while(var3 < var1.length() && var1.charAt(var3) == ZERO_CHAR) {
- ++var3;
- }
-
- if (var3 == var1.length()) {
- this.signum = 0;
- this.magnitude = new byte[0];
- } else {
- int var4 = var1.length() - var3;
- int var5 = var4 % digitsPerLong[var2];
- if (var5 == 0) {
- var5 = digitsPerLong[var2];
- }
-
- int var10;
- String var6 = var1.substring(var3, var10 = var3 + var5);
-
- BigInteger var7;
- long var8;
- for(var7 = valueOf(Long.parseLong(var6, var2)); var10 < var1.length(); var7 = var7.multiply(longRadix[var2]).add(valueOf(var8))) {
- var6 = var1.substring(var10, var10 += digitsPerLong[var2]);
- var8 = Long.parseLong(var6, var2);
- if (var8 < 0L) {
- throw new NumberFormatException("Illegal digit");
- }
- }
-
- this.magnitude = var7.magnitude;
- }
- }
- } else {
- throw new NumberFormatException("Radix out of range");
- }
- }
-
- public BigInteger(String var1) throws NumberFormatException {
- this((String)var1, 10);
- }
-
- public BigInteger(int var1, Random var2) throws IllegalArgumentException {
- this(1, (byte[])randomBits(var1, var2));
- }
-
- private static byte[] randomBits(int var0, Random var1) throws IllegalArgumentException {
- if (var0 < 0) {
- throw new IllegalArgumentException("numBits must be non-negative");
- } else {
- int var2 = (var0 + 7) / 8;
- byte[] var3 = new byte[var2];
- if (var2 > 0) {
- var1.nextBytes(var3);
- int var4 = 8 * var2 - var0;
- var3[0] = (byte)(var3[0] & (1 << 8 - var4) - 1);
- }
-
- return var3;
- }
- }
-
- public BigInteger(int var1, int var2, Random var3) {
- this.bitCount = -1;
- this.bitLength = -1;
- this.firstNonzeroByteNum = -2;
- this.lowestSetBit = -2;
- if (var1 < 2) {
- throw new ArithmeticException("bitLength < 2");
- } else {
- BigInteger var5;
- do {
- var5 = (new BigInteger(var1 - 1, var3)).setBit(var1 - 1);
- var5 = var1 <= 16 ? (var1 > 2 ? var5.setBit(0) : var5) : new BigInteger(plumbGeneratePrime(var5.magnitude), 1);
- } while(var5.bitLength() != var1 || !var5.isProbablePrime(var2));
-
- this.signum = 1;
- this.magnitude = var5.magnitude;
- }
- }
-
- private BigInteger(byte[] var1, int var2) {
- this.bitCount = -1;
- this.bitLength = -1;
- this.firstNonzeroByteNum = -2;
- this.lowestSetBit = -2;
- this.signum = var1.length == 0 ? 0 : var2;
- this.magnitude = var1;
- }
-
- public static BigInteger valueOf(long var0) {
- if (var0 == 0L) {
- return ZERO;
- } else if (var0 > 0L && var0 <= 16L) {
- return posConst[(int)var0];
- } else if (var0 < 0L && var0 >= -16L) {
- return negConst[(int)(-var0)];
- } else {
- byte[] var2 = new byte[8];
-
- for(int var3 = 0; var3 < 8; var0 >>= 8) {
- var2[7 - var3] = (byte)((int)var0);
- ++var3;
- }
-
- return new BigInteger(var2);
- }
- }
-
- private static BigInteger valueOf(byte[] var0) {
- return var0[0] > 0 ? new BigInteger(var0, 1) : new BigInteger(var0);
- }
-
- public BigInteger add(BigInteger var1) throws ArithmeticException {
- if (var1.signum == 0) {
- return this;
- } else if (this.signum == 0) {
- return var1;
- } else if (var1.signum == this.signum) {
- return new BigInteger(plumbAdd(this.magnitude, var1.magnitude), this.signum);
- } else {
- return this.signum < 0 ? plumbSubtract(var1.magnitude, this.magnitude) : plumbSubtract(this.magnitude, var1.magnitude);
- }
- }
-
- public BigInteger subtract(BigInteger var1) {
- return this.add(new BigInteger(var1.magnitude, -var1.signum));
- }
-
- public BigInteger multiply(BigInteger var1) {
- return var1.signum != 0 && this.signum != 0 ? new BigInteger(plumbMultiply(this.magnitude, var1.magnitude), this.signum * var1.signum) : ZERO;
- }
-
- public BigInteger divide(BigInteger var1) throws ArithmeticException {
- if (var1.signum == 0) {
- throw new ArithmeticException("BigInteger divide by zero");
- } else {
- return this.signum == 0 ? ZERO : new BigInteger(plumbDivide(this.magnitude, var1.magnitude), this.signum * var1.signum);
- }
- }
-
- public BigInteger remainder(BigInteger var1) throws ArithmeticException {
- if (var1.signum == 0) {
- throw new ArithmeticException("BigInteger divide by zero");
- } else if (this.signum == 0) {
- return ZERO;
- } else {
- return this.magnitude.length < var1.magnitude.length ? this : new BigInteger(plumbRemainder(this.magnitude, var1.magnitude), this.signum);
- }
- }
-
- public BigInteger[] divideAndRemainder(BigInteger var1) throws ArithmeticException {
- BigInteger[] var2 = new BigInteger[2];
- if (var1.signum == 0) {
- throw new ArithmeticException("BigInteger divide by zero");
- } else {
- if (this.signum == 0) {
- var2[0] = var2[1] = ZERO;
- } else if (this.magnitude.length < var1.magnitude.length) {
- var2[0] = ZERO;
- var2[1] = this;
- } else {
- byte[][] var3 = plumbDivideAndRemainder(this.magnitude, var1.magnitude);
- var2[0] = new BigInteger(var3[0], this.signum * var1.signum);
- var2[1] = new BigInteger(var3[1], this.signum);
- }
-
- return var2;
- }
- }
-
- public BigInteger pow(int var1) throws ArithmeticException {
- if (var1 < 0) {
- throw new ArithmeticException("Negative exponent");
- } else if (this.signum == 0) {
- return var1 == 0 ? ONE : this;
- } else {
- BigInteger var2 = valueOf((long)(var1 < 0 && (var1 & 1) == 1 ? -1 : 1));
- BigInteger var3 = this;
-
- while(var1 != 0) {
- if ((var1 & 1) == 1) {
- var2 = var2.multiply(var3);
- }
-
- if ((var1 >>= 1) != 0) {
- var3 = new BigInteger(plumbSquare(var3.magnitude), 1);
- }
- }
-
- return var2;
- }
- }
-
- public BigInteger gcd(BigInteger var1) {
- if (var1.signum == 0) {
- return this.abs();
- } else {
- return this.signum == 0 ? var1.abs() : new BigInteger(plumbGcd(this.magnitude, var1.magnitude), 1);
- }
- }
-
- public BigInteger abs() {
- return this.signum >= 0 ? this : this.negate();
- }
-
- public BigInteger negate() {
- return new BigInteger(this.magnitude, -this.signum);
- }
-
- public int signum() {
- return this.signum;
- }
-
- public BigInteger mod(BigInteger var1) {
- if (var1.signum <= 0) {
- throw new ArithmeticException("BigInteger: modulus not positive");
- } else {
- BigInteger var2 = this.remainder(var1);
- return var2.signum >= 0 ? var2 : var2.add(var1);
- }
- }
-
- public BigInteger modPow(BigInteger var1, BigInteger var2) {
- if (var2.signum <= 0) {
- throw new ArithmeticException("BigInteger: modulus not positive");
- } else if (var1.signum == 0) {
- return ONE;
- } else {
- boolean var3;
- if (var3 = var1.signum < 0) {
- var1 = var1.negate();
- }
-
- BigInteger var4 = this.signum >= 0 && this.compareTo(var2) < 0 ? this : this.mod(var2);
- BigInteger var5;
- if (var2.testBit(0)) {
- var5 = new BigInteger(plumbModPow(var4.magnitude, var1.magnitude, var2.magnitude), 1);
- } else {
- int var6 = var2.getLowestSetBit();
- BigInteger var7 = var2.shiftRight(var6);
- BigInteger var8 = ONE.shiftLeft(var6);
- BigInteger var9 = new BigInteger(plumbModPow(var4.magnitude, var1.magnitude, var7.magnitude), 1);
- BigInteger var10 = var4.modPow2(var1, var6);
- BigInteger var11 = var8.modInverse(var7);
- BigInteger var12 = var7.modInverse(var8);
- var5 = var9.multiply(var8).multiply(var11).add(var10.multiply(var7).multiply(var12)).mod(var2);
- }
-
- return var3 ? var5.modInverse(var2) : var5;
- }
- }
-
- private BigInteger modPow2(BigInteger var1, int var2) {
- BigInteger var3 = valueOf(1L);
- BigInteger var4 = this.mod2(var2);
-
- while(var1.signum != 0) {
- if (var1.testBit(0)) {
- var3 = var3.multiply(var4).mod2(var2);
- }
-
- var1 = var1.shiftRight(1);
- if (var1.signum != 0) {
- var4 = (new BigInteger(plumbSquare(var4.magnitude), 1)).mod2(var2);
- }
- }
-
- return var3;
- }
-
- private BigInteger mod2(int var1) {
- if (this.bitLength() <= var1) {
- return this;
- } else {
- int var2 = (var1 + 7) / 8;
- byte[] var3 = new byte[var2];
-
- for(int var4 = 0; var4 < var2; ++var4) {
- var3[var4] = this.magnitude[var4 + (this.magnitude.length - var2)];
- }
-
- int var5 = 8 * var2 - var1;
- var3[0] = (byte)(var3[0] & (1 << 8 - var5) - 1);
- return var3[0] == 0 ? new BigInteger(1, var3) : new BigInteger(var3, 1);
- }
- }
-
- public BigInteger modInverse(BigInteger var1) throws ArithmeticException {
- if (var1.signum != 1) {
- throw new ArithmeticException("BigInteger: modulus not positive");
- } else {
- BigInteger var2 = this.remainder(var1);
- if (var2.signum < 0) {
- var2 = var2.add(var1);
- }
-
- if (!var2.gcd(var1).equals(ONE)) {
- throw new ArithmeticException("BigInteger not invertible");
- } else {
- return new BigInteger(plumbModInverse(var2.magnitude, var1.magnitude), 1);
- }
- }
- }
-
- public BigInteger shiftLeft(int var1) {
- if (var1 == 0) {
- return this;
- } else if (var1 < 0) {
- return this.shiftRight(-var1);
- } else {
- int var2 = var1 / 8;
- int var3 = var1 % 8;
- byte[] var4 = new byte[(this.bitLength() + var1) / 8 + 1];
- if (var3 == 0) {
- for(int var5 = var2; var5 < var4.length; ++var5) {
- var4[var4.length - 1 - var5] = this.getByte(var5 - var2);
- }
- } else {
- for(int var6 = var2; var6 < var4.length; ++var6) {
- var4[var4.length - 1 - var6] = (byte)(this.getByte(var6 - var2) << var3 | (var6 == var2 ? 0 : (this.getByte(var6 - var2 - 1) & 255) >> 8 - var3));
- }
- }
-
- return valueOf(var4);
- }
- }
-
- public BigInteger shiftRight(int var1) {
- if (var1 == 0) {
- return this;
- } else if (var1 < 0) {
- return this.shiftLeft(-var1);
- } else if (var1 >= this.bitLength()) {
- return this.signum < 0 ? valueOf(-1L) : ZERO;
- } else {
- int var2 = var1 / 8;
- int var3 = var1 % 8;
- byte[] var4 = new byte[(this.bitLength - var1) / 8 + 1];
- if (var3 == 0) {
- for(int var5 = 0; var5 < var4.length; ++var5) {
- var4[var4.length - 1 - var5] = this.getByte(var2 + var5);
- }
- } else {
- for(int var6 = 0; var6 < var4.length; ++var6) {
- var4[var4.length - 1 - var6] = (byte)((this.getByte(var2 + var6 + 1) << 8 | this.getByte(var2 + var6) & 255) >> var3);
- }
- }
-
- return valueOf(var4);
- }
- }
-
- public BigInteger and(BigInteger var1) {
- byte[] var2 = new byte[Math.max(this.byteLength(), var1.byteLength())];
-
- for(int var3 = 0; var3 < var2.length; ++var3) {
- var2[var3] = (byte)(this.getByte(var2.length - var3 - 1) & var1.getByte(var2.length - var3 - 1));
- }
-
- return valueOf(var2);
- }
-
- // $FF: renamed from: or (java.math.BigInteger) java.math.BigInteger
- public BigInteger method_0(BigInteger var1) {
- byte[] var2 = new byte[Math.max(this.byteLength(), var1.byteLength())];
-
- for(int var3 = 0; var3 < var2.length; ++var3) {
- var2[var3] = (byte)(this.getByte(var2.length - var3 - 1) | var1.getByte(var2.length - var3 - 1));
- }
-
- return valueOf(var2);
- }
-
- public BigInteger xor(BigInteger var1) {
- byte[] var2 = new byte[Math.max(this.byteLength(), var1.byteLength())];
-
- for(int var3 = 0; var3 < var2.length; ++var3) {
- var2[var3] = (byte)(this.getByte(var2.length - var3 - 1) ^ var1.getByte(var2.length - var3 - 1));
- }
-
- return valueOf(var2);
- }
-
- public BigInteger not() {
- byte[] var1 = new byte[this.byteLength()];
-
- for(int var2 = 0; var2 < var1.length; ++var2) {
- var1[var2] = (byte)(~this.getByte(var1.length - var2 - 1));
- }
-
- return valueOf(var1);
- }
-
- public BigInteger andNot(BigInteger var1) {
- byte[] var2 = new byte[Math.max(this.byteLength(), var1.byteLength())];
-
- for(int var3 = 0; var3 < var2.length; ++var3) {
- var2[var3] = (byte)(this.getByte(var2.length - var3 - 1) & ~var1.getByte(var2.length - var3 - 1));
- }
-
- return valueOf(var2);
- }
-
- public boolean testBit(int var1) throws ArithmeticException {
- if (var1 < 0) {
- throw new ArithmeticException("Negative bit address");
- } else {
- return (this.getByte(var1 / 8) & 1 << var1 % 8) != 0;
- }
- }
-
- public BigInteger setBit(int var1) throws ArithmeticException {
- if (var1 < 0) {
- throw new ArithmeticException("Negative bit address");
- } else {
- int var2 = var1 / 8;
- byte[] var3 = new byte[Math.max(this.byteLength(), var2 + 2)];
-
- for(int var4 = 0; var4 < var3.length; ++var4) {
- var3[var3.length - var4 - 1] = this.getByte(var4);
- }
-
- var3[var3.length - var2 - 1] = (byte)(var3[var3.length - var2 - 1] | 1 << var1 % 8);
- return valueOf(var3);
- }
- }
-
- public BigInteger clearBit(int var1) throws ArithmeticException {
- if (var1 < 0) {
- throw new ArithmeticException("Negative bit address");
- } else {
- int var2 = var1 / 8;
- byte[] var3 = new byte[Math.max(this.byteLength(), (var1 + 1) / 8 + 1)];
-
- for(int var4 = 0; var4 < var3.length; ++var4) {
- var3[var3.length - var4 - 1] = this.getByte(var4);
- }
-
- var3[var3.length - var2 - 1] = (byte)(var3[var3.length - var2 - 1] & ~(1 << var1 % 8));
- return valueOf(var3);
- }
- }
-
- public BigInteger flipBit(int var1) throws ArithmeticException {
- if (var1 < 0) {
- throw new ArithmeticException("Negative bit address");
- } else {
- int var2 = var1 / 8;
- byte[] var3 = new byte[Math.max(this.byteLength(), var2 + 2)];
-
- for(int var4 = 0; var4 < var3.length; ++var4) {
- var3[var3.length - var4 - 1] = this.getByte(var4);
- }
-
- var3[var3.length - var2 - 1] = (byte)(var3[var3.length - var2 - 1] ^ 1 << var1 % 8);
- return valueOf(var3);
- }
- }
-
- public int getLowestSetBit() {
- if (this.lowestSetBit == -2) {
- if (this.signum == 0) {
- this.lowestSetBit = -1;
- } else {
- int var1;
- byte var2;
- for(var1 = 0; (var2 = this.getByte(var1)) == 0; ++var1) {
- }
-
- this.lowestSetBit = 8 * var1 + trailingZeroCnt[var2 & 255];
- }
- }
-
- return this.lowestSetBit;
- }
-
- public int bitLength() {
- if (this.bitLength == -1) {
- if (this.signum == 0) {
- this.bitLength = 0;
- } else {
- int var1 = 8 * (this.magnitude.length - 1) + bitLen[this.magnitude[0] & 255];
- if (this.signum < 0) {
- boolean var2 = bitCnt[this.magnitude[0] & 255] == 1;
-
- for(int var3 = 1; var3 < this.magnitude.length && var2; ++var3) {
- var2 = this.magnitude[var3] == 0;
- }
-
- this.bitLength = var2 ? var1 - 1 : var1;
- } else {
- this.bitLength = var1;
- }
- }
- }
-
- return this.bitLength;
- }
-
- public int bitCount() {
- if (this.bitCount == -1) {
- int var1 = 0;
-
- for(int var2 = 0; var2 < this.magnitude.length; ++var2) {
- var1 += bitCnt[this.magnitude[var2] & 255];
- }
-
- if (this.signum < 0) {
- int var3 = 0;
-
- int var4;
- for(var4 = this.magnitude.length - 1; this.magnitude[var4] == 0; --var4) {
- var3 += 8;
- }
-
- var3 += trailingZeroCnt[this.magnitude[var4] & 255];
- this.bitCount = var1 + var3 - 1;
- } else {
- this.bitCount = var1;
- }
- }
-
- return this.bitCount;
- }
-
- public boolean isProbablePrime(int var1) {
- int var2 = var1 / 2;
- if (var2 <= 0) {
- return true;
- } else {
- BigInteger var3 = this.abs();
- if (var3.equals(TWO)) {
- return true;
- } else if (var3.testBit(0) && !var3.equals(ONE)) {
- BigInteger var4 = var3.subtract(ONE);
- int var5 = var4.getLowestSetBit();
- var4 = var4.shiftRight(var5);
- Random var6 = new Random();
-
- for(int var7 = 0; var7 < var2; ++var7) {
- BigInteger var8;
- do {
- var8 = new BigInteger(var3.bitLength(), var6);
- } while(var8.compareTo(ONE) <= 0 || var8.compareTo(var3) >= 0);
-
- int var9 = 0;
-
- for(BigInteger var10 = var8.modPow(var4, var3); (var9 != 0 || !var10.equals(ONE)) && !var10.equals(var3.subtract(ONE)); var10 = var10.modPow(TWO, var3)) {
- if (var9 > 0 && var10.equals(ONE)) {
- return false;
- }
-
- ++var9;
- if (var9 == var5) {
- return false;
- }
- }
- }
-
- return true;
- } else {
- return false;
- }
- }
- }
-
- public int compareTo(BigInteger var1) {
- if (this.signum == var1.signum) {
- return this.signum * byteArrayCmp(this.magnitude, var1.magnitude);
- } else {
- return this.signum > var1.signum ? 1 : -1;
- }
- }
-
- private static int byteArrayCmp(byte[] var0, byte[] var1) {
- if (var0.length < var1.length) {
- return -1;
- } else if (var0.length > var1.length) {
- return 1;
- } else {
- for(int var2 = 0; var2 < var0.length; ++var2) {
- int var3 = var0[var2] & 255;
- int var4 = var1[var2] & 255;
- if (var3 < var4) {
- return -1;
- }
-
- if (var3 > var4) {
- return 1;
- }
- }
-
- return 0;
- }
- }
-
- public boolean equals(Object var1) {
- if (!(var1 instanceof BigInteger)) {
- return false;
- } else {
- BigInteger var2 = (BigInteger)var1;
- if (var2.signum == this.signum && var2.magnitude.length == this.magnitude.length) {
- if (var2 == this) {
- return true;
- } else {
- for(int var3 = 0; var3 < this.magnitude.length; ++var3) {
- if (var2.magnitude[var3] != this.magnitude[var3]) {
- return false;
- }
- }
-
- return true;
- }
- } else {
- return false;
- }
- }
- }
-
- public BigInteger min(BigInteger var1) {
- return this.compareTo(var1) < 0 ? this : var1;
- }
-
- public BigInteger max(BigInteger var1) {
- return this.compareTo(var1) > 0 ? this : var1;
- }
-
- public int hashCode() {
- int var1 = 0;
-
- for(int var2 = 0; var2 < this.magnitude.length; ++var2) {
- var1 = 37 * var1 + (this.magnitude[var2] & 255);
- }
-
- return var1 * this.signum;
- }
-
- public String toString(int var1) {
- if (this.signum == 0) {
- return "0";
- } else {
- if (var1 < 2 || var1 > 36) {
- var1 = 10;
- }
-
- int var2 = (this.magnitude.length + 6) / 7;
- String[] var3 = new String[var2];
- BigInteger var4 = this.abs();
-
- int var5;
- BigInteger[] var6;
- for(var5 = 0; var4.signum != 0; var4 = var6[0]) {
- var6 = var4.divideAndRemainder(longRadix[var1]);
- var3[var5++] = Long.toString(var6[1].longValue(), var1);
- }
-
- StringBuffer var9 = new StringBuffer(var5 * digitsPerLong[var1] + 1);
- if (this.signum < 0) {
- var9.append('-');
- }
-
- var9.append(var3[var5 - 1]);
-
- for(int var7 = var5 - 2; var7 >= 0; --var7) {
- int var8 = digitsPerLong[var1] - var3[var7].length();
- if (var8 != 0) {
- var9.append(zeros[var8]);
- }
-
- var9.append(var3[var7]);
- }
-
- return var9.toString();
- }
- }
-
- public String toString() {
- return this.toString(10);
- }
-
- public byte[] toByteArray() {
- byte[] var1 = new byte[this.byteLength()];
-
- for(int var2 = 0; var2 < var1.length; ++var2) {
- var1[var2] = this.getByte(var1.length - var2 - 1);
- }
-
- return var1;
- }
-
- public int intValue() {
- int var1 = 0;
-
- for(int var2 = 3; var2 >= 0; --var2) {
- var1 = (var1 << 8) + (this.getByte(var2) & 255);
- }
-
- return var1;
- }
-
- public long longValue() {
- long var1 = 0L;
-
- for(int var3 = 7; var3 >= 0; --var3) {
- var1 = (var1 << 8) + (long)(this.getByte(var3) & 255);
- }
-
- return var1;
- }
-
- public float floatValue() {
- return Float.valueOf(this.toString());
- }
-
- public double doubleValue() {
- return Double.valueOf(this.toString());
- }
-
- private static byte[] stripLeadingZeroBytes(byte[] var0) {
- int var1;
- for(var1 = 0; var1 < var0.length && var0[var1] == 0; ++var1) {
- }
-
- byte[] var2 = new byte[var0.length - var1];
-
- for(int var3 = var1; var3 < var0.length; ++var3) {
- var2[var3 - var1] = var0[var3];
- }
-
- return var2;
- }
-
- private static byte[] makePositive(byte[] var0) {
- int var1;
- for(var1 = 0; var1 < var0.length && var0[var1] == -1; ++var1) {
- }
-
- int var2;
- for(var2 = var1; var2 < var0.length && var0[var2] == 0; ++var2) {
- }
-
- int var3 = var2 == var0.length ? 1 : 0;
- byte[] var4 = new byte[var0.length - var1 + var3];
-
- for(int var5 = var1; var5 < var0.length; ++var5) {
- var4[var5 - var1 + var3] = (byte)(~var0[var5]);
- }
-
- for(int var6 = var4.length - 1; ++var4[var6] == 0; --var6) {
- }
-
- return var4;
- }
-
- private int byteLength() {
- return this.bitLength() / 8 + 1;
- }
-
- private int signBit() {
- return this.signum < 0 ? 1 : 0;
- }
-
- private byte signByte() {
- return (byte)(this.signum < 0 ? -1 : 0);
- }
-
- private byte getByte(int var1) {
- if (var1 >= this.magnitude.length) {
- return this.signByte();
- } else {
- byte var2 = this.magnitude[this.magnitude.length - var1 - 1];
- return (byte)(this.signum >= 0 ? var2 : (var1 <= this.firstNonzeroByteNum() ? -var2 : ~var2));
- }
- }
-
- private int firstNonzeroByteNum() {
- if (this.firstNonzeroByteNum == -2) {
- int var1;
- for(var1 = this.magnitude.length - 1; var1 >= 0 && this.magnitude[var1] == 0; --var1) {
- }
-
- this.firstNonzeroByteNum = this.magnitude.length - var1 - 1;
- }
-
- return this.firstNonzeroByteNum;
- }
-
- private static native void plumbInit();
-
- private static native byte[] plumbAdd(byte[] var0, byte[] var1);
-
- private static native BigInteger plumbSubtract(byte[] var0, byte[] var1);
-
- private static native byte[] plumbMultiply(byte[] var0, byte[] var1);
-
- private static native byte[] plumbDivide(byte[] var0, byte[] var1);
-
- private static native byte[] plumbRemainder(byte[] var0, byte[] var1);
-
- private static native byte[][] plumbDivideAndRemainder(byte[] var0, byte[] var1);
-
- private static native byte[] plumbGcd(byte[] var0, byte[] var1);
-
- private static native byte[] plumbModPow(byte[] var0, byte[] var1, byte[] var2);
-
- private static native byte[] plumbModInverse(byte[] var0, byte[] var1);
-
- private static native byte[] plumbSquare(byte[] var0);
-
- private static native byte[] plumbGeneratePrime(byte[] var0);
-
- static {
- for(int var0 = 1; var0 <= 16; ++var0) {
- byte[] var1 = new byte[]{(byte)var0};
- posConst[var0] = new BigInteger(var1, 1);
- negConst[var0] = new BigInteger(var1, -1);
- }
-
- bitLen = new byte[]{0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8};
- bitCnt = new byte[]{0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8};
- trailingZeroCnt = new byte[]{8, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0};
- zeros = new String[64];
- zeros[63] = "000000000000000000000000000000000000000000000000000000000000000";
-
- for(int var2 = 0; var2 < 63; ++var2) {
- zeros[var2] = zeros[63].substring(0, var2);
- }
-
- System.loadLibrary("math");
- plumbInit();
- ONE = valueOf(1L);
- TWO = valueOf(2L);
- ZERO_CHAR = Character.forDigit(0, 2);
- digitsPerLong = new int[]{0, 0, 62, 39, 31, 27, 24, 22, 20, 19, 18, 18, 17, 17, 16, 16, 15, 15, 15, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 12, 12, 12, 12, 12, 12, 12, 12};
- longRadix = new BigInteger[]{null, null, valueOf(4611686018427387904L), valueOf(4052555153018976267L), valueOf(4611686018427387904L), valueOf(7450580596923828125L), valueOf(4738381338321616896L), valueOf(3909821048582988049L), valueOf(1152921504606846976L), valueOf(1350851717672992089L), valueOf(1000000000000000000L), valueOf(5559917313492231481L), valueOf(2218611106740436992L), valueOf(8650415919381337933L), valueOf(2177953337809371136L), valueOf(6568408355712890625L), valueOf(1152921504606846976L), valueOf(2862423051509815793L), valueOf(6746640616477458432L), valueOf(799006685782884121L), valueOf(1638400000000000000L), valueOf(3243919932521508681L), valueOf(6221821273427820544L), valueOf(504036361936467383L), valueOf(876488338465357824L), valueOf(1490116119384765625L), valueOf(2481152873203736576L), valueOf(4052555153018976267L), valueOf(6502111422497947648L), valueOf(353814783205469041L), valueOf(531441000000000000L), valueOf(787662783788549761L), valueOf(1152921504606846976L), valueOf(1667889514952984961L), valueOf(2386420683693101056L), valueOf(3379220508056640625L), valueOf(4738381338321616896L)};
- }
- }
-