home *** CD-ROM | disk | FTP | other *** search
Wrap
package java.math; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.ObjectStreamField; import java.io.StreamCorruptedException; import java.security.SecureRandom; import java.util.Random; public class BigInteger extends Number implements Comparable<BigInteger> { int signum; int[] mag; private int bitCount; private int bitLength; private int lowestSetBit; private int firstNonzeroByteNum; private int firstNonzeroIntNum; private static final long LONG_MASK = 4294967295L; private static long[] bitsPerDigit = new long[]{0L, 0L, 1024L, 1624L, 2048L, 2378L, 2648L, 2875L, 3072L, 3247L, 3402L, 3543L, 3672L, 3790L, 3899L, 4001L, 4096L, 4186L, 4271L, 4350L, 4426L, 4498L, 4567L, 4633L, 4696L, 4756L, 4814L, 4870L, 4923L, 4975L, 5025L, 5074L, 5120L, 5166L, 5210L, 5253L, 5295L}; private static final int SMALL_PRIME_THRESHOLD = 95; private static final int DEFAULT_PRIME_CERTAINTY = 100; private static final BigInteger SMALL_PRIME_PRODUCT = valueOf(152125131763605L); private static volatile Random staticRandom; private static final int MAX_CONSTANT = 16; private static BigInteger[] posConst = new BigInteger[17]; private static BigInteger[] negConst = new BigInteger[17]; public static final BigInteger ZERO; public static final BigInteger ONE; private static final BigInteger TWO; public static final BigInteger TEN; static int[] bnExpModThreshTable; static final byte[] trailingZeroTable; private static String[] zeros; private static int[] digitsPerLong; private static BigInteger[] longRadix; private static int[] digitsPerInt; private static int[] intRadix; private static final long serialVersionUID = -8287574255936472291L; private static final ObjectStreamField[] serialPersistentFields; public BigInteger(byte[] var1) { this.bitCount = -1; this.bitLength = -1; this.lowestSetBit = -2; this.firstNonzeroByteNum = -2; this.firstNonzeroIntNum = -2; if (var1.length == 0) { throw new NumberFormatException("Zero length BigInteger"); } else { if (var1[0] < 0) { this.mag = makePositive(var1); this.signum = -1; } else { this.mag = stripLeadingZeroBytes(var1); this.signum = this.mag.length == 0 ? 0 : 1; } } } private BigInteger(int[] var1) { this.bitCount = -1; this.bitLength = -1; this.lowestSetBit = -2; this.firstNonzeroByteNum = -2; this.firstNonzeroIntNum = -2; if (var1.length == 0) { throw new NumberFormatException("Zero length BigInteger"); } else { if (var1[0] < 0) { this.mag = makePositive(var1); this.signum = -1; } else { this.mag = trustedStripLeadingZeroInts(var1); this.signum = this.mag.length == 0 ? 0 : 1; } } } public BigInteger(int var1, byte[] var2) { this.bitCount = -1; this.bitLength = -1; this.lowestSetBit = -2; this.firstNonzeroByteNum = -2; this.firstNonzeroIntNum = -2; this.mag = stripLeadingZeroBytes(var2); if (var1 >= -1 && var1 <= 1) { if (this.mag.length == 0) { this.signum = 0; } else { if (var1 == 0) { throw new NumberFormatException("signum-magnitude mismatch"); } this.signum = var1; } } else { throw new NumberFormatException("Invalid signum value"); } } private BigInteger(int var1, int[] var2) { this.bitCount = -1; this.bitLength = -1; this.lowestSetBit = -2; this.firstNonzeroByteNum = -2; this.firstNonzeroIntNum = -2; this.mag = stripLeadingZeroInts(var2); if (var1 >= -1 && var1 <= 1) { if (this.mag.length == 0) { this.signum = 0; } else { if (var1 == 0) { throw new NumberFormatException("signum-magnitude mismatch"); } this.signum = var1; } } else { throw new NumberFormatException("Invalid signum value"); } } public BigInteger(String var1, int var2) { this.bitCount = -1; this.bitLength = -1; this.lowestSetBit = -2; this.firstNonzeroByteNum = -2; this.firstNonzeroIntNum = -2; int var3 = 0; int var5 = var1.length(); if (var2 >= 2 && var2 <= 36) { if (var1.length() == 0) { throw new NumberFormatException("Zero length BigInteger"); } else { this.signum = 1; int var6 = var1.lastIndexOf("-"); if (var6 != -1) { if (var6 != 0) { throw new NumberFormatException("Illegal embedded minus sign"); } if (var1.length() == 1) { throw new NumberFormatException("Zero length BigInteger"); } this.signum = -1; var3 = 1; } while(var3 < var5 && Character.digit(var1.charAt(var3), var2) == 0) { ++var3; } if (var3 == var5) { this.signum = 0; this.mag = ZERO.mag; } else { int var4 = var5 - var3; int var7 = (int)(((long)var4 * bitsPerDigit[var2] >>> 10) + 1L); int var8 = (var7 + 31) / 32; this.mag = new int[var8]; int var9 = var4 % digitsPerInt[var2]; if (var9 == 0) { var9 = digitsPerInt[var2]; } int var13; String var10 = var1.substring(var3, var13 = var3 + var9); this.mag[this.mag.length - 1] = Integer.parseInt(var10, var2); if (this.mag[this.mag.length - 1] < 0) { throw new NumberFormatException("Illegal digit"); } else { int var11 = intRadix[var2]; int var12 = 0; while(var13 < var1.length()) { var10 = var1.substring(var13, var13 += digitsPerInt[var2]); var12 = Integer.parseInt(var10, var2); if (var12 < 0) { throw new NumberFormatException("Illegal digit"); } destructiveMulAdd(this.mag, var11, var12); } this.mag = trustedStripLeadingZeroInts(this.mag); } } } } else { throw new NumberFormatException("Radix out of range"); } } BigInteger(char[] var1) { this.bitCount = -1; this.bitLength = -1; this.lowestSetBit = -2; this.firstNonzeroByteNum = -2; this.firstNonzeroIntNum = -2; int var2 = 0; int var4 = var1.length; this.signum = 1; if (var1[0] == '-') { if (var4 == 1) { throw new NumberFormatException("Zero length BigInteger"); } this.signum = -1; var2 = 1; } while(var2 < var4 && Character.digit(var1[var2], 10) == 0) { ++var2; } if (var2 == var4) { this.signum = 0; this.mag = ZERO.mag; } else { int var3 = var4 - var2; int var5; if (var4 < 10) { var5 = 1; } else { int var6 = (int)(((long)var3 * bitsPerDigit[10] >>> 10) + 1L); var5 = (var6 + 31) / 32; } this.mag = new int[var5]; int var9 = var3 % digitsPerInt[10]; if (var9 == 0) { var9 = digitsPerInt[10]; } int var8; this.mag[this.mag.length - 1] = this.parseInt(var1, var2, var8 = var2 + var9); while(var8 < var4) { int var7 = this.parseInt(var1, var8, var8 += digitsPerInt[10]); destructiveMulAdd(this.mag, intRadix[10], var7); } this.mag = trustedStripLeadingZeroInts(this.mag); } } private int parseInt(char[] var1, int var2, int var3) { int var4 = Character.digit(var1[var2++], 10); if (var4 == -1) { throw new NumberFormatException(new String(var1)); } else { for(int var5 = var2; var5 < var3; ++var5) { int var6 = Character.digit(var1[var5], 10); if (var6 == -1) { throw new NumberFormatException(new String(var1)); } var4 = 10 * var4 + var6; } return var4; } } private static void destructiveMulAdd(int[] var0, int var1, int var2) { long var3 = (long)var1 & 4294967295L; long var5 = (long)var2 & 4294967295L; int var7 = var0.length; long var8 = 0L; long var10 = 0L; for(int var12 = var7 - 1; var12 >= 0; --var12) { var8 = var3 * ((long)var0[var12] & 4294967295L) + var10; var0[var12] = (int)var8; var10 = var8 >>> 32; } long var17 = ((long)var0[var7 - 1] & 4294967295L) + var5; var0[var7 - 1] = (int)var17; var10 = var17 >>> 32; for(int var14 = var7 - 2; var14 >= 0; --var14) { var17 = ((long)var0[var14] & 4294967295L) + var10; var0[var14] = (int)var17; var10 = var17 >>> 32; } } public BigInteger(String var1) { this((String)var1, 10); } public BigInteger(int var1, Random var2) { this(1, (byte[])randomBits(var1, var2)); } private static byte[] randomBits(int var0, Random var1) { if (var0 < 0) { throw new IllegalArgumentException("numBits must be non-negative"); } else { int var2 = (int)(((long)var0 + 7L) / 8L); 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.lowestSetBit = -2; this.firstNonzeroByteNum = -2; this.firstNonzeroIntNum = -2; if (var1 < 2) { throw new ArithmeticException("bitLength < 2"); } else { BigInteger var4 = var1 < 95 ? smallPrime(var1, var2, var3) : largePrime(var1, var2, var3); this.signum = 1; this.mag = var4.mag; } } public static BigInteger probablePrime(int var0, Random var1) { if (var0 < 2) { throw new ArithmeticException("bitLength < 2"); } else { return var0 < 95 ? smallPrime(var0, 100, var1) : largePrime(var0, 100, var1); } } private static BigInteger smallPrime(int var0, int var1, Random var2) { int var3 = var0 + 31 >>> 5; int[] var4 = new int[var3]; int var5 = 1 << (var0 + 31 & 31); int var6 = (var5 << 1) - 1; while(true) { for(int var7 = 0; var7 < var3; ++var7) { var4[var7] = var2.nextInt(); } var4[0] = var4[0] & var6 | var5; if (var0 > 2) { var4[var3 - 1] |= 1; } BigInteger var10 = new BigInteger(var4, 1); if (var0 > 6) { long var8 = var10.remainder(SMALL_PRIME_PRODUCT).longValue(); if (var8 % 3L == 0L || var8 % 5L == 0L || var8 % 7L == 0L || var8 % 11L == 0L || var8 % 13L == 0L || var8 % 17L == 0L || var8 % 19L == 0L || var8 % 23L == 0L || var8 % 29L == 0L || var8 % 31L == 0L || var8 % 37L == 0L || var8 % 41L == 0L) { continue; } } if (var0 < 4) { return var10; } if (var10.primeToCertainty(var1, var2)) { return var10; } } } private static BigInteger largePrime(int var0, int var1, Random var2) { BigInteger var3 = (new BigInteger(var0, var2)).setBit(var0 - 1); int[] var10000 = var3.mag; int var10001 = var3.mag.length - 1; var10000[var10001] &= -2; int var4 = var0 / 20 * 64; BitSieve var5 = new BitSieve(var3, var4); BigInteger var6; for(var6 = var5.retrieve(var3, var1, var2); var6 == null || var6.bitLength() != var0; var6 = var5.retrieve(var3, var1, var2)) { var3 = var3.add(valueOf((long)(2 * var4))); if (var3.bitLength() != var0) { var3 = (new BigInteger(var0, var2)).setBit(var0 - 1); } var10000 = var3.mag; var10001 = var3.mag.length - 1; var10000[var10001] &= -2; var5 = new BitSieve(var3, var4); } return var6; } public BigInteger nextProbablePrime() { if (this.signum < 0) { throw new ArithmeticException("start < 0: " + this); } else if (this.signum != 0 && !this.equals(ONE)) { BigInteger var1 = this.add(ONE); if (var1.bitLength() < 95) { if (!var1.testBit(0)) { var1 = var1.add(ONE); } while(true) { if (var1.bitLength() > 6) { long var5 = var1.remainder(SMALL_PRIME_PRODUCT).longValue(); if (var5 % 3L == 0L || var5 % 5L == 0L || var5 % 7L == 0L || var5 % 11L == 0L || var5 % 13L == 0L || var5 % 17L == 0L || var5 % 19L == 0L || var5 % 23L == 0L || var5 % 29L == 0L || var5 % 31L == 0L || var5 % 37L == 0L || var5 % 41L == 0L) { var1 = var1.add(TWO); continue; } } if (var1.bitLength() < 4) { return var1; } if (var1.primeToCertainty(100, (Random)null)) { return var1; } var1 = var1.add(TWO); } } else { if (var1.testBit(0)) { var1 = var1.subtract(ONE); } int var2 = var1.bitLength() / 20 * 64; while(true) { BitSieve var3 = new BitSieve(var1, var2); BigInteger var4 = var3.retrieve(var1, 100, (Random)null); if (var4 != null) { return var4; } var1 = var1.add(valueOf((long)(2 * var2))); } } } else { return TWO; } } boolean primeToCertainty(int var1, Random var2) { int var3 = 0; int var4 = (Math.min(var1, 2147483646) + 1) / 2; int var5 = this.bitLength(); if (var5 < 100) { var3 = (byte)50; var3 = var4 < var3 ? var4 : var3; return this.passesMillerRabin(var3, var2); } else { if (var5 < 256) { var3 = 27; } else if (var5 < 512) { var3 = 15; } else if (var5 < 768) { var3 = 8; } else if (var5 < 1024) { var3 = 4; } else { var3 = 2; } var3 = var4 < var3 ? var4 : var3; return this.passesMillerRabin(var3, var2) && this.passesLucasLehmer(); } } private boolean passesLucasLehmer() { BigInteger var1 = this.add(ONE); int var2; for(var2 = 5; jacobiSymbol(var2, this) != -1; var2 = var2 < 0 ? Math.abs(var2) + 2 : -(var2 + 2)) { } BigInteger var3 = lucasLehmerSequence(var2, var1, this); return var3.mod(this).equals(ZERO); } private static int jacobiSymbol(int var0, BigInteger var1) { if (var0 == 0) { return 0; } else { int var2 = 1; int var3 = var1.mag[var1.mag.length - 1]; if (var0 < 0) { var0 = -var0; int var4 = var3 & 7; if (var4 == 3 || var4 == 7) { var2 = -var2; } } while((var0 & 3) == 0) { var0 >>= 2; } if ((var0 & 1) == 0) { var0 >>= 1; if (((var3 ^ var3 >> 1) & 2) != 0) { var2 = -var2; } } if (var0 == 1) { return var2; } else { if ((var0 & var3 & 2) != 0) { var2 = -var2; } int var7; for(var3 = var1.mod(valueOf((long)var0)).intValue(); var3 != 0; var3 %= var7) { while((var3 & 3) == 0) { var3 >>= 2; } if ((var3 & 1) == 0) { var3 >>= 1; if (((var0 ^ var0 >> 1) & 2) != 0) { var2 = -var2; } } if (var3 == 1) { return var2; } assert var3 < var0; var7 = var3; var3 = var0; var0 = var7; if ((var3 & var7 & 2) != 0) { var2 = -var2; } } return 0; } } } private static BigInteger lucasLehmerSequence(int var0, BigInteger var1, BigInteger var2) { BigInteger var3 = valueOf((long)var0); BigInteger var4 = ONE; BigInteger var6 = ONE; for(int var8 = var1.bitLength() - 2; var8 >= 0; --var8) { BigInteger var5 = var4.multiply(var6).mod(var2); BigInteger var7 = var6.square().add(var3.multiply(var4.square())).mod(var2); if (var7.testBit(0)) { var7 = var2.subtract(var7); var7.signum = -var7.signum; } var7 = var7.shiftRight(1); var4 = var5; var6 = var7; if (var1.testBit(var8)) { var5 = var5.add(var7).mod(var2); if (var5.testBit(0)) { var5 = var2.subtract(var5); var5.signum = -var5.signum; } BigInteger var10 = var5.shiftRight(1); var7 = var7.add(var3.multiply(var5)).mod(var2); if (var7.testBit(0)) { var7 = var2.subtract(var7); var7.signum = -var7.signum; } var7 = var7.shiftRight(1); var4 = var10; var6 = var7; } } return var4; } private static Random getSecureRandom() { if (staticRandom == null) { staticRandom = new SecureRandom(); } return staticRandom; } private boolean passesMillerRabin(int var1, Random var2) { BigInteger var3 = this.subtract(ONE); int var5 = var3.getLowestSetBit(); BigInteger var4 = var3.shiftRight(var5); if (var2 == null) { var2 = getSecureRandom(); } for(int var6 = 0; var6 < var1; ++var6) { BigInteger var7; do { var7 = new BigInteger(this.bitLength(), var2); } while(var7.compareTo(ONE) <= 0 || var7.compareTo(this) >= 0); int var8 = 0; for(BigInteger var9 = var7.modPow(var4, this); (var8 != 0 || !var9.equals(ONE)) && !var9.equals(var3); var9 = var9.modPow(TWO, this)) { if (var8 > 0 && var9.equals(ONE)) { return false; } ++var8; if (var8 == var5) { return false; } } } return true; } private BigInteger(int[] var1, int var2) { this.bitCount = -1; this.bitLength = -1; this.lowestSetBit = -2; this.firstNonzeroByteNum = -2; this.firstNonzeroIntNum = -2; this.signum = var1.length == 0 ? 0 : var2; this.mag = var1; } private BigInteger(byte[] var1, int var2) { this.bitCount = -1; this.bitLength = -1; this.lowestSetBit = -2; this.firstNonzeroByteNum = -2; this.firstNonzeroIntNum = -2; this.signum = var1.length == 0 ? 0 : var2; this.mag = stripLeadingZeroBytes(var1); } BigInteger(MutableBigInteger var1, int var2) { this.bitCount = -1; this.bitLength = -1; this.lowestSetBit = -2; this.firstNonzeroByteNum = -2; this.firstNonzeroIntNum = -2; if (var1.offset <= 0 && var1.value.length == var1.intLen) { this.mag = var1.value; } else { this.mag = new int[var1.intLen]; for(int var3 = 0; var3 < var1.intLen; ++var3) { this.mag[var3] = var1.value[var1.offset + var3]; } } this.signum = var1.intLen == 0 ? 0 : var2; } public static BigInteger valueOf(long var0) { if (var0 == 0L) { return ZERO; } else if (var0 > 0L && var0 <= 16L) { return posConst[(int)var0]; } else { return var0 < 0L && var0 >= -16L ? negConst[(int)(-var0)] : new BigInteger(var0); } } private BigInteger(long var1) { this.bitCount = -1; this.bitLength = -1; this.lowestSetBit = -2; this.firstNonzeroByteNum = -2; this.firstNonzeroIntNum = -2; if (var1 < 0L) { this.signum = -1; var1 = -var1; } else { this.signum = 1; } int var3 = (int)(var1 >>> 32); if (var3 == 0) { this.mag = new int[1]; this.mag[0] = (int)var1; } else { this.mag = new int[2]; this.mag[0] = var3; this.mag[1] = (int)var1; } } private static BigInteger valueOf(int[] var0) { return var0[0] > 0 ? new BigInteger(var0, 1) : new BigInteger(var0); } public BigInteger add(BigInteger var1) { if (var1.signum == 0) { return this; } else if (this.signum == 0) { return var1; } else if (var1.signum == this.signum) { return new BigInteger(add(this.mag, var1.mag), this.signum); } else { int var3 = intArrayCmp(this.mag, var1.mag); if (var3 == 0) { return ZERO; } else { int[] var2 = var3 > 0 ? subtract(this.mag, var1.mag) : subtract(var1.mag, this.mag); var2 = trustedStripLeadingZeroInts(var2); return new BigInteger(var2, var3 * this.signum); } } } private static int[] add(int[] var0, int[] var1) { if (var0.length < var1.length) { int[] var2 = var0; var0 = var1; var1 = var2; } int var11 = var0.length; int var3 = var1.length; int[] var4 = new int[var11]; long var5; for(var5 = 0L; var3 > 0; var4[var11] = (int)var5) { --var11; long var10000 = (long)var0[var11] & 4294967295L; --var3; var5 = var10000 + ((long)var1[var3] & 4294967295L) + (var5 >>> 32); } boolean var7; for(var7 = var5 >>> 32 != 0L; var11 > 0 && var7; var7 = (var4[var11] = var0[var11] + 1) == 0) { --var11; } while(var11 > 0) { --var11; var4[var11] = var0[var11]; } if (var7) { int var8 = var4.length + 1; int[] var9 = new int[var8]; for(int var10 = 1; var10 < var8; ++var10) { var9[var10] = var4[var10 - 1]; } var9[0] = 1; var4 = var9; } return var4; } public BigInteger subtract(BigInteger var1) { if (var1.signum == 0) { return this; } else if (this.signum == 0) { return var1.negate(); } else if (var1.signum != this.signum) { return new BigInteger(add(this.mag, var1.mag), this.signum); } else { int var3 = intArrayCmp(this.mag, var1.mag); if (var3 == 0) { return ZERO; } else { int[] var2 = var3 > 0 ? subtract(this.mag, var1.mag) : subtract(var1.mag, this.mag); var2 = trustedStripLeadingZeroInts(var2); return new BigInteger(var2, var3 * this.signum); } } } private static int[] subtract(int[] var0, int[] var1) { int var2 = var0.length; int[] var3 = new int[var2]; int var4 = var1.length; long var5; for(var5 = 0L; var4 > 0; var3[var2] = (int)var5) { --var2; long var10000 = (long)var0[var2] & 4294967295L; --var4; var5 = var10000 - ((long)var1[var4] & 4294967295L) + (var5 >> 32); } for(boolean var7 = var5 >> 32 != 0L; var2 > 0 && var7; var7 = (var3[var2] = var0[var2] - 1) == -1) { --var2; } while(var2 > 0) { --var2; var3[var2] = var0[var2]; } return var3; } public BigInteger multiply(BigInteger var1) { if (this.signum != 0 && var1.signum != 0) { int[] var2 = this.multiplyToLen(this.mag, this.mag.length, var1.mag, var1.mag.length, (int[])null); var2 = trustedStripLeadingZeroInts(var2); return new BigInteger(var2, this.signum * var1.signum); } else { return ZERO; } } private int[] multiplyToLen(int[] var1, int var2, int[] var3, int var4, int[] var5) { int var6 = var2 - 1; int var7 = var4 - 1; if (var5 == null || var5.length < var2 + var4) { var5 = new int[var2 + var4]; } long var8 = 0L; int var10 = var7; for(int var11 = var7 + 1 + var6; var10 >= 0; --var11) { long var12 = ((long)var3[var10] & 4294967295L) * ((long)var1[var6] & 4294967295L) + var8; var5[var11] = (int)var12; var8 = var12 >>> 32; --var10; } var5[var6] = (int)var8; for(int var16 = var6 - 1; var16 >= 0; --var16) { var8 = 0L; int var17 = var7; for(int var18 = var7 + 1 + var16; var17 >= 0; --var18) { long var13 = ((long)var3[var17] & 4294967295L) * ((long)var1[var16] & 4294967295L) + ((long)var5[var18] & 4294967295L) + var8; var5[var18] = (int)var13; var8 = var13 >>> 32; --var17; } var5[var16] = (int)var8; } return var5; } private BigInteger square() { if (this.signum == 0) { return ZERO; } else { int[] var1 = squareToLen(this.mag, this.mag.length, (int[])null); return new BigInteger(trustedStripLeadingZeroInts(var1), 1); } } private static final int[] squareToLen(int[] var0, int var1, int[] var2) { int var3 = var1 << 1; if (var2 == null || var2.length < var3) { var2 = new int[var3]; } int var4 = 0; int var5 = 0; for(int var6 = 0; var5 < var1; ++var5) { long var7 = (long)var0[var5] & 4294967295L; long var9 = var7 * var7; var2[var6++] = var4 << 31 | (int)(var9 >>> 33); var2[var6++] = (int)(var9 >>> 1); var4 = (int)var9; } var5 = var1; for(int var13 = 1; var5 > 0; var13 += 2) { int var14 = var0[var5 - 1]; var14 = mulAdd(var2, var0, var13, var5 - 1, var14); addOne(var2, var13 - 1, var5, var14); --var5; } primitiveLeftShift(var2, var3, 1); var2[var3 - 1] |= var0[var1 - 1] & 1; return var2; } public BigInteger divide(BigInteger var1) { MutableBigInteger var2 = new MutableBigInteger(); MutableBigInteger var3 = new MutableBigInteger(); MutableBigInteger var4 = new MutableBigInteger(this.mag); MutableBigInteger var5 = new MutableBigInteger(var1.mag); var4.divide(var5, var2, var3); return new BigInteger(var2, this.signum * var1.signum); } public BigInteger[] divideAndRemainder(BigInteger var1) { BigInteger[] var2 = new BigInteger[2]; MutableBigInteger var3 = new MutableBigInteger(); MutableBigInteger var4 = new MutableBigInteger(); MutableBigInteger var5 = new MutableBigInteger(this.mag); MutableBigInteger var6 = new MutableBigInteger(var1.mag); var5.divide(var6, var3, var4); var2[0] = new BigInteger(var3, this.signum * var1.signum); var2[1] = new BigInteger(var4, this.signum); return var2; } public BigInteger remainder(BigInteger var1) { MutableBigInteger var2 = new MutableBigInteger(); MutableBigInteger var3 = new MutableBigInteger(); MutableBigInteger var4 = new MutableBigInteger(this.mag); MutableBigInteger var5 = new MutableBigInteger(var1.mag); var4.divide(var5, var2, var3); return new BigInteger(var3, this.signum); } public BigInteger pow(int var1) { if (var1 < 0) { throw new ArithmeticException("Negative exponent"); } else if (this.signum == 0) { return var1 == 0 ? ONE : this; } else { int var2 = this.signum < 0 && (var1 & 1) == 1 ? -1 : 1; int[] var3 = this.mag; int[] var4 = new int[]{1}; while(var1 != 0) { if ((var1 & 1) == 1) { var4 = this.multiplyToLen(var4, var4.length, var3, var3.length, (int[])null); var4 = trustedStripLeadingZeroInts(var4); } if ((var1 >>>= 1) != 0) { var3 = squareToLen(var3, var3.length, (int[])null); var3 = trustedStripLeadingZeroInts(var3); } } return new BigInteger(var4, var2); } } public BigInteger gcd(BigInteger var1) { if (var1.signum == 0) { return this.abs(); } else if (this.signum == 0) { return var1.abs(); } else { MutableBigInteger var2 = new MutableBigInteger(this); MutableBigInteger var3 = new MutableBigInteger(var1); MutableBigInteger var4 = var2.hybridGCD(var3); return new BigInteger(var4, 1); } } private static int[] leftShift(int[] var0, int var1, int var2) { int var3 = var2 >>> 5; int var4 = var2 & 31; int var5 = bitLen(var0[0]); if (var2 <= 32 - var5) { primitiveLeftShift(var0, var1, var4); return var0; } else if (var4 <= 32 - var5) { int[] var8 = new int[var3 + var1]; for(int var9 = 0; var9 < var1; ++var9) { var8[var9] = var0[var9]; } primitiveLeftShift(var8, var8.length, var4); return var8; } else { int[] var6 = new int[var3 + var1 + 1]; for(int var7 = 0; var7 < var1; ++var7) { var6[var7] = var0[var7]; } primitiveRightShift(var6, var6.length, 32 - var4); return var6; } } static void primitiveRightShift(int[] var0, int var1, int var2) { int var3 = 32 - var2; int var4 = var1 - 1; for(int var5 = var0[var4]; var4 > 0; --var4) { int var6 = var5; var5 = var0[var4 - 1]; var0[var4] = var5 << var3 | var6 >>> var2; } var0[0] >>>= var2; } static void primitiveLeftShift(int[] var0, int var1, int var2) { if (var1 != 0 && var2 != 0) { int var3 = 32 - var2; int var4 = 0; int var5 = var0[var4]; for(int var6 = var4 + var1 - 1; var4 < var6; ++var4) { int var7 = var5; var5 = var0[var4 + 1]; var0[var4] = var7 << var2 | var5 >>> var3; } var0[var1 - 1] <<= var2; } } private static int bitLength(int[] var0, int var1) { return var1 == 0 ? 0 : (var1 - 1 << 5) + bitLen(var0[0]); } public BigInteger abs() { return this.signum >= 0 ? this : this.negate(); } public BigInteger negate() { return new BigInteger(this.mag, -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 var2.equals(ONE) ? ZERO : ONE; } else if (this.equals(ONE)) { return var2.equals(ONE) ? ZERO : ONE; } else if (this.equals(ZERO) && var1.signum >= 0) { return ZERO; } else if (this.equals(negConst[1]) && !var1.testBit(0)) { return var2.equals(ONE) ? ZERO : 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 = var4.oddModPow(var1, var2); } else { int var6 = var2.getLowestSetBit(); BigInteger var7 = var2.shiftRight(var6); BigInteger var8 = ONE.shiftLeft(var6); BigInteger var9 = this.signum >= 0 && this.compareTo(var7) < 0 ? this : this.mod(var7); BigInteger var10 = var7.equals(ONE) ? ZERO : var9.oddModPow(var1, var7); BigInteger var11 = var4.modPow2(var1, var6); BigInteger var12 = var8.modInverse(var7); BigInteger var13 = var7.modInverse(var8); var5 = var10.multiply(var8).multiply(var12).add(var11.multiply(var7).multiply(var13)).mod(var2); } return var3 ? var5.modInverse(var2) : var5; } } private BigInteger oddModPow(BigInteger var1, BigInteger var2) { if (var1.equals(ONE)) { return this; } else if (this.signum == 0) { return ZERO; } else { int[] var3 = (int[])this.mag.clone(); int[] var4 = var1.mag; int[] var5 = var2.mag; int var6 = var5.length; int var7 = 0; int var8 = bitLength(var4, var4.length); if (var8 != 17 || var4[0] != 65537) { while(var8 > bnExpModThreshTable[var7]) { ++var7; } } int var9 = 1 << var7; int[][] var10 = new int[var9][]; for(int var11 = 0; var11 < var9; ++var11) { var10[var11] = new int[var6]; } int var29 = -MutableBigInteger.inverseMod32(var5[var6 - 1]); int[] var12 = leftShift(var3, var3.length, var6 << 5); MutableBigInteger var13 = new MutableBigInteger(); MutableBigInteger var14 = new MutableBigInteger(); MutableBigInteger var15 = new MutableBigInteger(var12); MutableBigInteger var16 = new MutableBigInteger(var5); var15.divide(var16, var13, var14); var10[0] = var14.toIntArray(); if (var10[0].length < var6) { int var17 = var6 - var10[0].length; int[] var18 = new int[var6]; for(int var19 = 0; var19 < var10[0].length; ++var19) { var18[var19 + var17] = var10[0][var19]; } var10[0] = var18; } int[] var34 = squareToLen(var10[0], var6, (int[])null); var34 = montReduce(var34, var5, var6, var29); int[] var37 = new int[var6]; for(int var40 = 0; var40 < var6; ++var40) { var37[var40] = var34[var40]; } for(int var41 = 1; var41 < var9; ++var41) { int[] var20 = this.multiplyToLen(var37, var6, var10[var41 - 1], var6, (int[])null); var10[var41] = montReduce(var20, var5, var6, var29); } int var42 = 1 << (var8 - 1 & 31); int var43 = 0; int var21 = var4.length; int var22 = 0; for(int var23 = 0; var23 <= var7; ++var23) { var43 = var43 << 1 | ((var4[var22] & var42) != 0 ? 1 : 0); var42 >>>= 1; if (var42 == 0) { ++var22; var42 = Integer.MIN_VALUE; --var21; } } --var8; boolean var24 = true; int var45; for(var45 = var8 - var7; (var43 & 1) == 0; ++var45) { var43 >>>= 1; } int[] var25 = var10[var43 >>> 1]; var43 = 0; if (var45 == var8) { var24 = false; } while(true) { --var8; var43 <<= 1; if (var21 != 0) { var43 |= (var4[var22] & var42) != 0 ? 1 : 0; var42 >>>= 1; if (var42 == 0) { ++var22; var42 = Integer.MIN_VALUE; --var21; } } if ((var43 & var9) != 0) { for(var45 = var8 - var7; (var43 & 1) == 0; ++var45) { var43 >>>= 1; } var25 = var10[var43 >>> 1]; var43 = 0; } if (var8 == var45) { if (var24) { var34 = (int[])(([I)var25).clone(); var24 = false; } else { var12 = this.multiplyToLen(var34, var6, var25, var6, var12); var12 = montReduce(var12, var5, var6, var29); var12 = var34; var34 = var12; } } if (var8 == 0) { int[] var26 = new int[2 * var6]; for(int var27 = 0; var27 < var6; ++var27) { var26[var27 + var6] = var34[var27]; } var34 = montReduce(var26, var5, var6, var29); var26 = new int[var6]; for(int var47 = 0; var47 < var6; ++var47) { var26[var47] = var34[var47]; } return new BigInteger(1, var26); } if (!var24) { var12 = squareToLen(var34, var6, var12); var12 = montReduce(var12, var5, var6, var29); var12 = var34; var34 = var12; } } } } private static int[] montReduce(int[] var0, int[] var1, int var2, int var3) { int var4 = 0; int var5 = var2; int var6 = 0; do { int var7 = var0[var0.length - 1 - var6]; int var8 = mulAdd(var0, var1, var6, var2, var3 * var7); var4 += addOne(var0, var6, var2, var8); ++var6; --var5; } while(var5 > 0); while(var4 > 0) { var4 += subN(var0, var1, var2); } while(intArrayCmpToLen(var0, var1, var2) >= 0) { subN(var0, var1, var2); } return var0; } private static int intArrayCmpToLen(int[] var0, int[] var1, int var2) { for(int var3 = 0; var3 < var2; ++var3) { long var4 = (long)var0[var3] & 4294967295L; long var6 = (long)var1[var3] & 4294967295L; if (var4 < var6) { return -1; } if (var4 > var6) { return 1; } } return 0; } private static int subN(int[] var0, int[] var1, int var2) { long var3 = 0L; while(true) { --var2; if (var2 < 0) { return (int)(var3 >> 32); } var3 = ((long)var0[var2] & 4294967295L) - ((long)var1[var2] & 4294967295L) + (var3 >> 32); var0[var2] = (int)var3; } } static int mulAdd(int[] var0, int[] var1, int var2, int var3, int var4) { long var5 = (long)var4 & 4294967295L; long var7 = 0L; var2 = var0.length - var2 - 1; for(int var9 = var3 - 1; var9 >= 0; --var9) { long var10 = ((long)var1[var9] & 4294967295L) * var5 + ((long)var0[var2] & 4294967295L) + var7; var0[var2--] = (int)var10; var7 = var10 >>> 32; } return (int)var7; } static int addOne(int[] var0, int var1, int var2, int var3) { var1 = var0.length - 1 - var2 - var1; long var4 = ((long)var0[var1] & 4294967295L) + ((long)var3 & 4294967295L); var0[var1] = (int)var4; if (var4 >>> 32 == 0L) { return 0; } else { do { --var2; if (var2 < 0) { return 1; } --var1; if (var1 < 0) { return 1; } int var10002 = var0[var1]++; } while(var0[var1] == 0); return 0; } } private BigInteger modPow2(BigInteger var1, int var2) { BigInteger var3 = valueOf(1L); BigInteger var4 = this.mod2(var2); int var5 = 0; int var6 = var1.bitLength(); if (this.testBit(0)) { var6 = var2 - 1 < var6 ? var2 - 1 : var6; } while(var5 < var6) { if (var1.testBit(var5)) { var3 = var3.multiply(var4).mod2(var2); } ++var5; if (var5 < var6) { var4 = var4.square().mod2(var2); } } return var3; } private BigInteger mod2(int var1) { if (this.bitLength() <= var1) { return this; } else { int var2 = (var1 + 31) / 32; int[] var3 = new int[var2]; for(int var4 = 0; var4 < var2; ++var4) { var3[var4] = this.mag[var4 + (this.mag.length - var2)]; } int var5 = (var2 << 5) - var1; var3[0] = (int)((long)var3[0] & (1L << 32 - var5) - 1L); return var3[0] == 0 ? new BigInteger(1, var3) : new BigInteger(var3, 1); } } public BigInteger modInverse(BigInteger var1) { if (var1.signum != 1) { throw new ArithmeticException("BigInteger: modulus not positive"); } else if (var1.equals(ONE)) { return ZERO; } else { BigInteger var2 = this; if (this.signum < 0 || intArrayCmp(this.mag, var1.mag) >= 0) { var2 = this.mod(var1); } if (var2.equals(ONE)) { return ONE; } else { MutableBigInteger var3 = new MutableBigInteger(var2); MutableBigInteger var4 = new MutableBigInteger(var1); MutableBigInteger var5 = var3.mutableModInverse(var4); return new BigInteger(var5, 1); } } } public BigInteger shiftLeft(int var1) { if (this.signum == 0) { return ZERO; } else if (var1 == 0) { return this; } else if (var1 < 0) { return this.shiftRight(-var1); } else { int var2 = var1 >>> 5; int var3 = var1 & 31; int var4 = this.mag.length; Object var5 = null; int[] var10; if (var3 == 0) { var10 = new int[var4 + var2]; for(int var6 = 0; var6 < var4; ++var6) { var10[var6] = this.mag[var6]; } } else { int var11 = 0; int var7 = 32 - var3; int var8 = this.mag[0] >>> var7; if (var8 != 0) { var10 = new int[var4 + var2 + 1]; var10[var11++] = var8; } else { var10 = new int[var4 + var2]; } int var9; for(var9 = 0; var9 < var4 - 1; var10[var11++] = this.mag[var9++] << var3 | this.mag[var9] >>> var7) { } var10[var11] = this.mag[var9] << var3; } return new BigInteger(var10, this.signum); } } public BigInteger shiftRight(int var1) { if (var1 == 0) { return this; } else if (var1 < 0) { return this.shiftLeft(-var1); } else { int var2 = var1 >>> 5; int var3 = var1 & 31; int var4 = this.mag.length; Object var5 = null; if (var2 >= var4) { return this.signum >= 0 ? ZERO : negConst[1]; } else { int[] var10; if (var3 == 0) { int var6 = var4 - var2; var10 = new int[var6]; for(int var7 = 0; var7 < var6; ++var7) { var10[var7] = this.mag[var7]; } } else { int var11 = 0; int var13 = this.mag[0] >>> var3; if (var13 != 0) { var10 = new int[var4 - var2]; var10[var11++] = var13; } else { var10 = new int[var4 - var2 - 1]; } int var8 = 32 - var3; for(int var9 = 0; var9 < var4 - var2 - 1; var10[var11++] = this.mag[var9++] << var8 | this.mag[var9] >>> var3) { } } if (this.signum < 0) { boolean var12 = false; int var14 = var4 - 1; for(int var15 = var4 - var2; var14 >= var15 && !var12; --var14) { var12 = this.mag[var14] != 0; } if (!var12 && var3 != 0) { var12 = this.mag[var4 - var2 - 1] << 32 - var3 != 0; } if (var12) { var10 = this.javaIncrement(var10); } } return new BigInteger(var10, this.signum); } } } int[] javaIncrement(int[] var1) { int var2 = 0; for(int var3 = var1.length - 1; var3 >= 0 && var2 == 0; --var3) { var2 = ++var1[var3]; } if (var2 == 0) { var1 = new int[var1.length + 1]; var1[0] = 1; } return var1; } public BigInteger and(BigInteger var1) { int[] var2 = new int[Math.max(this.intLength(), var1.intLength())]; for(int var3 = 0; var3 < var2.length; ++var3) { var2[var3] = this.getInt(var2.length - var3 - 1) & var1.getInt(var2.length - var3 - 1); } return valueOf(var2); } // $FF: renamed from: or (java.math.BigInteger) java.math.BigInteger public BigInteger method_0(BigInteger var1) { int[] var2 = new int[Math.max(this.intLength(), var1.intLength())]; for(int var3 = 0; var3 < var2.length; ++var3) { var2[var3] = this.getInt(var2.length - var3 - 1) | var1.getInt(var2.length - var3 - 1); } return valueOf(var2); } public BigInteger xor(BigInteger var1) { int[] var2 = new int[Math.max(this.intLength(), var1.intLength())]; for(int var3 = 0; var3 < var2.length; ++var3) { var2[var3] = this.getInt(var2.length - var3 - 1) ^ var1.getInt(var2.length - var3 - 1); } return valueOf(var2); } public BigInteger not() { int[] var1 = new int[this.intLength()]; for(int var2 = 0; var2 < var1.length; ++var2) { var1[var2] = ~this.getInt(var1.length - var2 - 1); } return valueOf(var1); } public BigInteger andNot(BigInteger var1) { int[] var2 = new int[Math.max(this.intLength(), var1.intLength())]; for(int var3 = 0; var3 < var2.length; ++var3) { var2[var3] = this.getInt(var2.length - var3 - 1) & ~var1.getInt(var2.length - var3 - 1); } return valueOf(var2); } public boolean testBit(int var1) { if (var1 < 0) { throw new ArithmeticException("Negative bit address"); } else { return (this.getInt(var1 / 32) & 1 << var1 % 32) != 0; } } public BigInteger setBit(int var1) { if (var1 < 0) { throw new ArithmeticException("Negative bit address"); } else { int var2 = var1 / 32; int[] var3 = new int[Math.max(this.intLength(), var2 + 2)]; for(int var4 = 0; var4 < var3.length; ++var4) { var3[var3.length - var4 - 1] = this.getInt(var4); } var3[var3.length - var2 - 1] |= 1 << var1 % 32; return valueOf(var3); } } public BigInteger clearBit(int var1) { if (var1 < 0) { throw new ArithmeticException("Negative bit address"); } else { int var2 = var1 / 32; int[] var3 = new int[Math.max(this.intLength(), (var1 + 1) / 32 + 1)]; for(int var4 = 0; var4 < var3.length; ++var4) { var3[var3.length - var4 - 1] = this.getInt(var4); } var3[var3.length - var2 - 1] &= ~(1 << var1 % 32); return valueOf(var3); } } public BigInteger flipBit(int var1) { if (var1 < 0) { throw new ArithmeticException("Negative bit address"); } else { int var2 = var1 / 32; int[] var3 = new int[Math.max(this.intLength(), var2 + 2)]; for(int var4 = 0; var4 < var3.length; ++var4) { var3[var3.length - var4 - 1] = this.getInt(var4); } var3[var3.length - var2 - 1] ^= 1 << var1 % 32; return valueOf(var3); } } public int getLowestSetBit() { if (this.lowestSetBit == -2) { if (this.signum == 0) { this.lowestSetBit = -1; } else { int var1; int var2; for(var1 = 0; (var2 = this.getInt(var1)) == 0; ++var1) { } this.lowestSetBit = (var1 << 5) + trailingZeroCnt(var2); } } return this.lowestSetBit; } public int bitLength() { if (this.bitLength == -1) { if (this.signum == 0) { this.bitLength = 0; } else { int var1 = (this.mag.length - 1 << 5) + bitLen(this.mag[0]); if (this.signum < 0) { boolean var2 = bitCnt(this.mag[0]) == 1; for(int var3 = 1; var3 < this.mag.length && var2; ++var3) { var2 = this.mag[var3] == 0; } this.bitLength = var2 ? var1 - 1 : var1; } else { this.bitLength = var1; } } } return this.bitLength; } static int bitLen(int var0) { return var0 < 32768 ? (var0 < 128 ? (var0 < 8 ? (var0 < 2 ? (var0 < 1 ? (var0 < 0 ? 32 : 0) : 1) : (var0 < 4 ? 2 : 3)) : (var0 < 32 ? (var0 < 16 ? 4 : 5) : (var0 < 64 ? 6 : 7))) : (var0 < 2048 ? (var0 < 512 ? (var0 < 256 ? 8 : 9) : (var0 < 1024 ? 10 : 11)) : (var0 < 8192 ? (var0 < 4096 ? 12 : 13) : (var0 < 16384 ? 14 : 15)))) : (var0 < 8388608 ? (var0 < 524288 ? (var0 < 131072 ? (var0 < 65536 ? 16 : 17) : (var0 < 262144 ? 18 : 19)) : (var0 < 2097152 ? (var0 < 1048576 ? 20 : 21) : (var0 < 4194304 ? 22 : 23))) : (var0 < 134217728 ? (var0 < 33554432 ? (var0 < 16777216 ? 24 : 25) : (var0 < 67108864 ? 26 : 27)) : (var0 < 536870912 ? (var0 < 268435456 ? 28 : 29) : (var0 < 1073741824 ? 30 : 31)))); } public int bitCount() { if (this.bitCount == -1) { int var1 = 0; for(int var2 = 0; var2 < this.mag.length; ++var2) { var1 += bitCnt(this.mag[var2]); } if (this.signum < 0) { int var4 = 0; int var3; for(var3 = this.mag.length - 1; this.mag[var3] == 0; --var3) { var4 += 32; } var4 += trailingZeroCnt(this.mag[var3]); this.bitCount = var1 + var4 - 1; } else { this.bitCount = var1; } } return this.bitCount; } static int bitCnt(int var0) { var0 -= (-1431655766 & var0) >>> 1; var0 = (var0 & 858993459) + (var0 >>> 2 & 858993459); var0 = var0 + (var0 >>> 4) & 252645135; var0 += var0 >>> 8; var0 += var0 >>> 16; return var0 & 255; } static int trailingZeroCnt(int var0) { int var1 = var0 & 255; if (var1 != 0) { return trailingZeroTable[var1]; } else { var1 = var0 >>> 8 & 255; if (var1 != 0) { return trailingZeroTable[var1] + 8; } else { var1 = var0 >>> 16 & 255; if (var1 != 0) { return trailingZeroTable[var1] + 16; } else { var1 = var0 >>> 24 & 255; return trailingZeroTable[var1] + 24; } } } } public boolean isProbablePrime(int var1) { if (var1 <= 0) { return true; } else { BigInteger var2 = this.abs(); if (var2.equals(TWO)) { return true; } else { return var2.testBit(0) && !var2.equals(ONE) ? var2.primeToCertainty(var1, (Random)null) : false; } } } public int compareTo(BigInteger var1) { return this.signum == var1.signum ? this.signum * intArrayCmp(this.mag, var1.mag) : (this.signum > var1.signum ? 1 : -1); } private static int intArrayCmp(int[] var0, int[] 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) { long var3 = (long)var0[var2] & 4294967295L; long var5 = (long)var1[var2] & 4294967295L; if (var3 < var5) { return -1; } if (var3 > var5) { return 1; } } return 0; } } public boolean equals(Object var1) { if (var1 == this) { return true; } else if (!(var1 instanceof BigInteger)) { return false; } else { BigInteger var2 = (BigInteger)var1; if (var2.signum == this.signum && var2.mag.length == this.mag.length) { for(int var3 = 0; var3 < this.mag.length; ++var3) { if (var2.mag[var3] != this.mag[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.mag.length; ++var2) { var1 = (int)((long)(31 * var1) + ((long)this.mag[var2] & 4294967295L)); } 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 = (4 * this.mag.length + 6) / 7; String[] var3 = new String[var2]; BigInteger var4 = this.abs(); int var5; BigInteger var11; for(var5 = 0; var4.signum != 0; var4 = var11) { BigInteger var6 = longRadix[var1]; MutableBigInteger var7 = new MutableBigInteger(); MutableBigInteger var8 = new MutableBigInteger(); MutableBigInteger var9 = new MutableBigInteger(var4.mag); MutableBigInteger var10 = new MutableBigInteger(var6.mag); var9.divide(var10, var7, var8); var11 = new BigInteger(var7, var4.signum * var6.signum); BigInteger var12 = new BigInteger(var8, var4.signum * var6.signum); var3[var5++] = Long.toString(var12.longValue(), var1); } StringBuilder var13 = new StringBuilder(var5 * digitsPerLong[var1] + 1); if (this.signum < 0) { var13.append('-'); } var13.append(var3[var5 - 1]); for(int var14 = var5 - 2; var14 >= 0; --var14) { int var15 = digitsPerLong[var1] - var3[var14].length(); if (var15 != 0) { var13.append(zeros[var15]); } var13.append(var3[var14]); } return var13.toString(); } } public String toString() { return this.toString(10); } public byte[] toByteArray() { int var1 = this.bitLength() / 8 + 1; byte[] var2 = new byte[var1]; int var3 = var1 - 1; int var4 = 4; int var5 = 0; for(int var6 = 0; var3 >= 0; --var3) { if (var4 == 4) { var5 = this.getInt(var6++); var4 = 1; } else { var5 >>>= 8; ++var4; } var2[var3] = (byte)var5; } return var2; } public int intValue() { int var1 = 0; var1 = this.getInt(0); return var1; } public long longValue() { long var1 = 0L; for(int var3 = 1; var3 >= 0; --var3) { var1 = (var1 << 32) + ((long)this.getInt(var3) & 4294967295L); } return var1; } public float floatValue() { return Float.parseFloat(this.toString()); } public double doubleValue() { return Double.parseDouble(this.toString()); } private static int[] stripLeadingZeroInts(int[] var0) { int var1 = var0.length; int var2; for(var2 = 0; var2 < var0.length && var0[var2] == 0; ++var2) { } int[] var3 = new int[var0.length - var2]; for(int var4 = 0; var4 < var0.length - var2; ++var4) { var3[var4] = var0[var2 + var4]; } return var3; } private static int[] trustedStripLeadingZeroInts(int[] var0) { int var1 = var0.length; int var2; for(var2 = 0; var2 < var0.length && var0[var2] == 0; ++var2) { } if (var2 <= 0) { return var0; } else { int[] var3 = new int[var0.length - var2]; for(int var4 = 0; var4 < var0.length - var2; ++var4) { var3[var4] = var0[var2 + var4]; } return var3; } } private static int[] stripLeadingZeroBytes(byte[] var0) { int var1 = var0.length; int var2; for(var2 = 0; var2 < var0.length && var0[var2] == 0; ++var2) { } int var3 = (var1 - var2 + 3) / 4; int[] var4 = new int[var3]; int var5 = var1 - 1; for(int var6 = var3 - 1; var6 >= 0; --var6) { var4[var6] = var0[var5--] & 255; int var7 = var5 - var2 + 1; int var8 = Math.min(3, var7); for(int var9 = 8; var9 <= 8 * var8; var9 += 8) { var4[var6] |= (var0[var5--] & 255) << var9; } } return var4; } private static int[] makePositive(byte[] var0) { int var3 = var0.length; int var1; for(var1 = 0; var1 < var3 && var0[var1] == -1; ++var1) { } int var2; for(var2 = var1; var2 < var3 && var0[var2] == 0; ++var2) { } int var4 = var2 == var3 ? 1 : 0; int var5 = (var3 - var1 + var4 + 3) / 4; int[] var6 = new int[var5]; int var7 = var3 - 1; for(int var8 = var5 - 1; var8 >= 0; --var8) { var6[var8] = var0[var7--] & 255; int var9 = Math.min(3, var7 - var1 + 1); if (var9 < 0) { var9 = 0; } for(int var10 = 8; var10 <= 8 * var9; var10 += 8) { var6[var8] |= (var0[var7--] & 255) << var10; } int var12 = -1 >>> 8 * (3 - var9); var6[var8] = ~var6[var8] & var12; } for(int var11 = var6.length - 1; var11 >= 0; --var11) { var6[var11] = (int)(((long)var6[var11] & 4294967295L) + 1L); if (var6[var11] != 0) { break; } } return var6; } private static int[] makePositive(int[] 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; int[] var4 = new int[var0.length - var1 + var3]; for(int var5 = var1; var5 < var0.length; ++var5) { var4[var5 - var1 + var3] = ~var0[var5]; } for(int var6 = var4.length - 1; ++var4[var6] == 0; --var6) { } return var4; } private int intLength() { return this.bitLength() / 32 + 1; } private int signBit() { return this.signum < 0 ? 1 : 0; } private int signInt() { return this.signum < 0 ? -1 : 0; } private int getInt(int var1) { if (var1 < 0) { return 0; } else if (var1 >= this.mag.length) { return this.signInt(); } else { int var2 = this.mag[this.mag.length - var1 - 1]; return this.signum >= 0 ? var2 : (var1 <= this.firstNonzeroIntNum() ? -var2 : ~var2); } } private int firstNonzeroIntNum() { if (this.firstNonzeroIntNum == -2) { int var1; for(var1 = this.mag.length - 1; var1 >= 0 && this.mag[var1] == 0; --var1) { } this.firstNonzeroIntNum = this.mag.length - var1 - 1; } return this.firstNonzeroIntNum; } private void readObject(ObjectInputStream var1) throws IOException, ClassNotFoundException { ObjectInputStream.GetField var2 = var1.readFields(); this.signum = var2.get("signum", -2); byte[] var3 = (byte[])var2.get("magnitude", (Object)null); if (this.signum >= -1 && this.signum <= 1) { if (var3.length == 0 != (this.signum == 0)) { String var5 = "BigInteger: signum-magnitude mismatch"; if (var2.defaulted("magnitude")) { var5 = "BigInteger: Magnitude not present in stream"; } throw new StreamCorruptedException(var5); } else { this.bitCount = this.bitLength = -1; this.lowestSetBit = this.firstNonzeroByteNum = this.firstNonzeroIntNum = -2; this.mag = stripLeadingZeroBytes(var3); } } else { String var4 = "BigInteger: Invalid signum value"; if (var2.defaulted("signum")) { var4 = "BigInteger: Signum not present in stream"; } throw new StreamCorruptedException(var4); } } private void writeObject(ObjectOutputStream var1) throws IOException { ObjectOutputStream.PutField var2 = var1.putFields(); var2.put("signum", this.signum); var2.put("magnitude", this.magSerializedForm()); var2.put("bitCount", -1); var2.put("bitLength", -1); var2.put("lowestSetBit", -2); var2.put("firstNonzeroByteNum", -2); var1.writeFields(); } private byte[] magSerializedForm() { int var1 = this.mag.length == 0 ? 0 : (this.mag.length - 1 << 5) + bitLen(this.mag[0]); int var2 = (var1 + 7) / 8; byte[] var3 = new byte[var2]; int var4 = var2 - 1; int var5 = 4; int var6 = this.mag.length - 1; for(int var7 = 0; var4 >= 0; --var4) { if (var5 == 4) { var7 = this.mag[var6--]; var5 = 1; } else { var7 >>>= 8; ++var5; } var3[var4] = (byte)var7; } return var3; } static { for(int var0 = 1; var0 <= 16; ++var0) { int[] var1 = new int[]{var0}; posConst[var0] = new BigInteger(var1, 1); negConst[var0] = new BigInteger(var1, -1); } ZERO = new BigInteger(new int[0], 0); ONE = valueOf(1L); TWO = valueOf(2L); TEN = valueOf(10L); bnExpModThreshTable = new int[]{7, 25, 81, 241, 673, 1793, Integer.MAX_VALUE}; trailingZeroTable = new byte[]{-25, 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); } 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)}; digitsPerInt = new int[]{0, 0, 30, 19, 15, 13, 11, 11, 10, 9, 9, 8, 8, 8, 8, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5}; intRadix = new int[]{0, 0, 1073741824, 1162261467, 1073741824, 1220703125, 362797056, 1977326743, 1073741824, 387420489, 1000000000, 214358881, 429981696, 815730721, 1475789056, 170859375, 268435456, 410338673, 612220032, 893871739, 1280000000, 1801088541, 113379904, 148035889, 191102976, 244140625, 308915776, 387420489, 481890304, 594823321, 729000000, 887503681, 1073741824, 1291467969, 1544804416, 1838265625, 60466176}; serialPersistentFields = new ObjectStreamField[]{new ObjectStreamField("signum", Integer.TYPE), new ObjectStreamField("magnitude", byte[].class), new ObjectStreamField("bitCount", Integer.TYPE), new ObjectStreamField("bitLength", Integer.TYPE), new ObjectStreamField("firstNonzeroByteNum", Integer.TYPE), new ObjectStreamField("lowestSetBit", Integer.TYPE)}; } }