home *** CD-ROM | disk | FTP | other *** search
/ S283 Planetary Science &n…he Search for Life DVD 2 / DVD-ROM.iso / install / jre1_3 / lib / rt.jar / java / math / BigInteger.class (.txt) < prev    next >
Encoding:
Java Class File  |  1979-12-31  |  19.5 KB  |  1,786 lines

  1. package java.math;
  2.  
  3. import java.io.IOException;
  4. import java.io.ObjectInputStream;
  5. import java.io.StreamCorruptedException;
  6. import java.util.Random;
  7.  
  8. public class BigInteger extends Number implements Comparable {
  9.    int signum;
  10.    transient int[] mag;
  11.    private byte[] magnitude;
  12.    private int bitCount;
  13.    private int bitLength;
  14.    private int lowestSetBit;
  15.    private int firstNonzeroByteNum;
  16.    private transient int firstNonzeroIntNum;
  17.    private static final long LONG_MASK = 4294967295L;
  18.    private static BigInteger smallPrimeProduct = valueOf(1685106581L);
  19.    private static final int MAX_CONSTANT = 16;
  20.    private static BigInteger[] posConst = new BigInteger[17];
  21.    private static BigInteger[] negConst = new BigInteger[17];
  22.    public static final BigInteger ZERO;
  23.    public static final BigInteger ONE;
  24.    private static final BigInteger TWO;
  25.    static int[] bnExpModThreshTable;
  26.    static final byte[] trailingZeroTable;
  27.    private static String[] zeros;
  28.    private static int[] digitsPerLong;
  29.    private static BigInteger[] longRadix;
  30.    private static final long serialVersionUID = -8287574255936472291L;
  31.  
  32.    public BigInteger(byte[] var1) {
  33.       this.bitCount = -1;
  34.       this.bitLength = -1;
  35.       this.lowestSetBit = -2;
  36.       this.firstNonzeroByteNum = -2;
  37.       this.firstNonzeroIntNum = -2;
  38.       if (var1.length == 0) {
  39.          throw new NumberFormatException("Zero length BigInteger");
  40.       } else {
  41.          if (var1[0] < 0) {
  42.             this.mag = makePositive(var1);
  43.             this.signum = -1;
  44.          } else {
  45.             this.mag = stripLeadingZeroBytes(var1);
  46.             this.signum = this.mag.length == 0 ? 0 : 1;
  47.          }
  48.  
  49.       }
  50.    }
  51.  
  52.    private BigInteger(int[] var1) {
  53.       this.bitCount = -1;
  54.       this.bitLength = -1;
  55.       this.lowestSetBit = -2;
  56.       this.firstNonzeroByteNum = -2;
  57.       this.firstNonzeroIntNum = -2;
  58.       if (var1.length == 0) {
  59.          throw new NumberFormatException("Zero length BigInteger");
  60.       } else {
  61.          if (var1[0] < 0) {
  62.             this.mag = makePositive(var1);
  63.             this.signum = -1;
  64.          } else {
  65.             this.mag = trustedStripLeadingZeroInts(var1);
  66.             this.signum = this.mag.length == 0 ? 0 : 1;
  67.          }
  68.  
  69.       }
  70.    }
  71.  
  72.    public BigInteger(int var1, byte[] var2) {
  73.       this.bitCount = -1;
  74.       this.bitLength = -1;
  75.       this.lowestSetBit = -2;
  76.       this.firstNonzeroByteNum = -2;
  77.       this.firstNonzeroIntNum = -2;
  78.       this.mag = stripLeadingZeroBytes(var2);
  79.       if (var1 >= -1 && var1 <= 1) {
  80.          if (this.mag.length == 0) {
  81.             this.signum = 0;
  82.          } else {
  83.             if (var1 == 0) {
  84.                throw new NumberFormatException("signum-magnitude mismatch");
  85.             }
  86.  
  87.             this.signum = var1;
  88.          }
  89.  
  90.       } else {
  91.          throw new NumberFormatException("Invalid signum value");
  92.       }
  93.    }
  94.  
  95.    private BigInteger(int var1, int[] var2) {
  96.       this.bitCount = -1;
  97.       this.bitLength = -1;
  98.       this.lowestSetBit = -2;
  99.       this.firstNonzeroByteNum = -2;
  100.       this.firstNonzeroIntNum = -2;
  101.       this.mag = stripLeadingZeroInts(var2);
  102.       if (var1 >= -1 && var1 <= 1) {
  103.          if (this.mag.length == 0) {
  104.             this.signum = 0;
  105.          } else {
  106.             if (var1 == 0) {
  107.                throw new NumberFormatException("signum-magnitude mismatch");
  108.             }
  109.  
  110.             this.signum = var1;
  111.          }
  112.  
  113.       } else {
  114.          throw new NumberFormatException("Invalid signum value");
  115.       }
  116.    }
  117.  
  118.    public BigInteger(String var1, int var2) {
  119.       this.bitCount = -1;
  120.       this.bitLength = -1;
  121.       this.lowestSetBit = -2;
  122.       this.firstNonzeroByteNum = -2;
  123.       this.firstNonzeroIntNum = -2;
  124.       int var3 = 0;
  125.       if (var2 >= 2 && var2 <= 36) {
  126.          if (var1.length() == 0) {
  127.             throw new NumberFormatException("Zero length BigInteger");
  128.          } else {
  129.             this.signum = 1;
  130.             if (var1.charAt(0) == '-') {
  131.                if (var1.length() == 1) {
  132.                   throw new NumberFormatException("Zero length BigInteger");
  133.                }
  134.  
  135.                this.signum = -1;
  136.                var3 = 1;
  137.             }
  138.  
  139.             while(var3 < var1.length() && Character.digit(var1.charAt(var3), var2) == 0) {
  140.                ++var3;
  141.             }
  142.  
  143.             if (var3 == var1.length()) {
  144.                this.signum = 0;
  145.                this.mag = ZERO.mag;
  146.             } else {
  147.                int var4 = var1.length() - var3;
  148.                int var5 = var4 % digitsPerLong[var2];
  149.                if (var5 == 0) {
  150.                   var5 = digitsPerLong[var2];
  151.                }
  152.  
  153.                int var10;
  154.                String var6 = var1.substring(var3, var10 = var3 + var5);
  155.  
  156.                BigInteger var7;
  157.                long var8;
  158.                for(var7 = valueOf(Long.parseLong(var6, var2)); var10 < var1.length(); var7 = var7.multiply(longRadix[var2]).add(valueOf(var8))) {
  159.                   var6 = var1.substring(var10, var10 += digitsPerLong[var2]);
  160.                   var8 = Long.parseLong(var6, var2);
  161.                   if (var8 < 0L) {
  162.                      throw new NumberFormatException("Illegal digit");
  163.                   }
  164.                }
  165.  
  166.                this.mag = var7.mag;
  167.             }
  168.          }
  169.       } else {
  170.          throw new NumberFormatException("Radix out of range");
  171.       }
  172.    }
  173.  
  174.    public BigInteger(String var1) {
  175.       this((String)var1, 10);
  176.    }
  177.  
  178.    public BigInteger(int var1, Random var2) {
  179.       this(1, (byte[])randomBits(var1, var2));
  180.    }
  181.  
  182.    private static byte[] randomBits(int var0, Random var1) {
  183.       if (var0 < 0) {
  184.          throw new IllegalArgumentException("numBits must be non-negative");
  185.       } else {
  186.          int var2 = (var0 + 7) / 8;
  187.          byte[] var3 = new byte[var2];
  188.          if (var2 > 0) {
  189.             var1.nextBytes(var3);
  190.             int var4 = 8 * var2 - var0;
  191.             var3[0] = (byte)(var3[0] & (1 << 8 - var4) - 1);
  192.          }
  193.  
  194.          return var3;
  195.       }
  196.    }
  197.  
  198.    public BigInteger(int var1, int var2, Random var3) {
  199.       this.bitCount = -1;
  200.       this.bitLength = -1;
  201.       this.lowestSetBit = -2;
  202.       this.firstNonzeroByteNum = -2;
  203.       this.firstNonzeroIntNum = -2;
  204.       if (var1 < 2) {
  205.          throw new ArithmeticException("bitLength < 2");
  206.       } else {
  207.          if (var1 < 95) {
  208.             this.initToSmallPrime(var1, var2, var3);
  209.          } else {
  210.             this.initToLargePrime(var1, var2, var3);
  211.          }
  212.  
  213.       }
  214.    }
  215.  
  216.    private void initToSmallPrime(int var1, int var2, Random var3) {
  217.       int var4 = var1 + 31 >>> 5;
  218.       this.mag = new int[var4];
  219.       this.signum = 1;
  220.       int var5 = 1 << (var1 + 31 & 31);
  221.       int var6 = (var5 << 1) - 1;
  222.  
  223.       while(true) {
  224.          for(int var7 = 0; var7 < var4; ++var7) {
  225.             this.mag[var7] = var3.nextInt();
  226.          }
  227.  
  228.          this.mag[0] = this.mag[0] & var6 | var5;
  229.          if (var1 > 2) {
  230.             int[] var10000 = this.mag;
  231.             var10000[var4 - 1] |= 1;
  232.          }
  233.  
  234.          if (var1 > 6) {
  235.             long var8 = this.remainder(smallPrimeProduct).longValue();
  236.             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) {
  237.                continue;
  238.             }
  239.          }
  240.  
  241.          if (this.isProbablePrime(var2)) {
  242.             return;
  243.          }
  244.       }
  245.    }
  246.  
  247.    private void initToLargePrime(int var1, int var2, Random var3) {
  248.       BigInteger var4 = (new BigInteger(var1, var3)).setBit(var1 - 1);
  249.       int[] var10000 = var4.mag;
  250.       int var10001 = var4.mag.length - 1;
  251.       var10000[var10001] &= -2;
  252.       int var5 = var1 / 20 * 64;
  253.       BitSieve var6 = new BitSieve(var4, var5);
  254.  
  255.       BigInteger var7;
  256.       for(var7 = var6.retrieve(var4, var2); var7 == null || var7.bitLength() != var1; var7 = var6.retrieve(var4, var2)) {
  257.          var4 = var4.add(valueOf((long)(2 * var5)));
  258.          if (var4.bitLength() != var1) {
  259.             var4 = (new BigInteger(var1, var3)).setBit(var1 - 1);
  260.          }
  261.  
  262.          var10000 = var4.mag;
  263.          var10001 = var4.mag.length - 1;
  264.          var10000[var10001] &= -2;
  265.          var6 = new BitSieve(var4, var5);
  266.       }
  267.  
  268.       this.signum = 1;
  269.       this.mag = var7.mag;
  270.    }
  271.  
  272.    private BigInteger(int[] var1, int var2) {
  273.       this.bitCount = -1;
  274.       this.bitLength = -1;
  275.       this.lowestSetBit = -2;
  276.       this.firstNonzeroByteNum = -2;
  277.       this.firstNonzeroIntNum = -2;
  278.       this.signum = var1.length == 0 ? 0 : var2;
  279.       this.mag = var1;
  280.    }
  281.  
  282.    private BigInteger(byte[] var1, int var2) {
  283.       this.bitCount = -1;
  284.       this.bitLength = -1;
  285.       this.lowestSetBit = -2;
  286.       this.firstNonzeroByteNum = -2;
  287.       this.firstNonzeroIntNum = -2;
  288.       this.signum = var1.length == 0 ? 0 : var2;
  289.       this.mag = stripLeadingZeroBytes(var1);
  290.    }
  291.  
  292.    BigInteger(MutableBigInteger var1, int var2) {
  293.       this.bitCount = -1;
  294.       this.bitLength = -1;
  295.       this.lowestSetBit = -2;
  296.       this.firstNonzeroByteNum = -2;
  297.       this.firstNonzeroIntNum = -2;
  298.       if (var1.offset <= 0 && var1.value.length == var1.intLen) {
  299.          this.mag = var1.value;
  300.       } else {
  301.          this.mag = new int[var1.intLen];
  302.  
  303.          for(int var3 = 0; var3 < var1.intLen; ++var3) {
  304.             this.mag[var3] = var1.value[var1.offset + var3];
  305.          }
  306.       }
  307.  
  308.       this.signum = var1.intLen == 0 ? 0 : var2;
  309.    }
  310.  
  311.    public static BigInteger valueOf(long var0) {
  312.       if (var0 == 0L) {
  313.          return ZERO;
  314.       } else if (var0 > 0L && var0 <= 16L) {
  315.          return posConst[(int)var0];
  316.       } else {
  317.          return var0 < 0L && var0 >= -16L ? negConst[(int)(-var0)] : new BigInteger(var0);
  318.       }
  319.    }
  320.  
  321.    private BigInteger(long var1) {
  322.       this.bitCount = -1;
  323.       this.bitLength = -1;
  324.       this.lowestSetBit = -2;
  325.       this.firstNonzeroByteNum = -2;
  326.       this.firstNonzeroIntNum = -2;
  327.       if (var1 < 0L) {
  328.          this.signum = -1;
  329.          var1 = -var1;
  330.       } else {
  331.          this.signum = 1;
  332.       }
  333.  
  334.       int var3 = (int)(var1 >>> 32);
  335.       if (var3 == 0) {
  336.          this.mag = new int[1];
  337.          this.mag[0] = (int)var1;
  338.       } else {
  339.          this.mag = new int[2];
  340.          this.mag[0] = var3;
  341.          this.mag[1] = (int)var1;
  342.       }
  343.  
  344.    }
  345.  
  346.    private static BigInteger valueOf(int[] var0) {
  347.       return var0[0] > 0 ? new BigInteger(var0, 1) : new BigInteger(var0);
  348.    }
  349.  
  350.    public BigInteger add(BigInteger var1) {
  351.       if (var1.signum == 0) {
  352.          return this;
  353.       } else if (this.signum == 0) {
  354.          return var1;
  355.       } else if (var1.signum == this.signum) {
  356.          return new BigInteger(add(this.mag, var1.mag), this.signum);
  357.       } else {
  358.          int var3 = intArrayCmp(this.mag, var1.mag);
  359.          if (var3 == 0) {
  360.             return ZERO;
  361.          } else {
  362.             int[] var2 = var3 > 0 ? subtract(this.mag, var1.mag) : subtract(var1.mag, this.mag);
  363.             var2 = trustedStripLeadingZeroInts(var2);
  364.             return new BigInteger(var2, var3 * this.signum);
  365.          }
  366.       }
  367.    }
  368.  
  369.    private static int[] add(int[] var0, int[] var1) {
  370.       if (var0.length < var1.length) {
  371.          int[] var2 = var0;
  372.          var0 = var1;
  373.          var1 = var2;
  374.       }
  375.  
  376.       int var11 = var0.length;
  377.       int var3 = var1.length;
  378.       int[] var4 = new int[var11];
  379.  
  380.       long var5;
  381.       for(var5 = 0L; var3 > 0; var4[var11] = (int)var5) {
  382.          --var11;
  383.          long var10000 = (long)var0[var11] & 4294967295L;
  384.          --var3;
  385.          var5 = var10000 + ((long)var1[var3] & 4294967295L) + (var5 >>> 32);
  386.       }
  387.  
  388.       boolean var7;
  389.       for(var7 = var5 >>> 32 != 0L; var11 > 0 && var7; var7 = (var4[var11] = var0[var11] + 1) == 0) {
  390.          --var11;
  391.       }
  392.  
  393.       while(var11 > 0) {
  394.          --var11;
  395.          var4[var11] = var0[var11];
  396.       }
  397.  
  398.       if (var7) {
  399.          int var8 = var4.length + 1;
  400.          int[] var9 = new int[var8];
  401.  
  402.          for(int var10 = 1; var10 < var8; ++var10) {
  403.             var9[var10] = var4[var10 - 1];
  404.          }
  405.  
  406.          var9[0] = 1;
  407.          var4 = var9;
  408.       }
  409.  
  410.       return var4;
  411.    }
  412.  
  413.    public BigInteger subtract(BigInteger var1) {
  414.       if (var1.signum == 0) {
  415.          return this;
  416.       } else if (this.signum == 0) {
  417.          return var1.negate();
  418.       } else if (var1.signum != this.signum) {
  419.          return new BigInteger(add(this.mag, var1.mag), this.signum);
  420.       } else {
  421.          int var3 = intArrayCmp(this.mag, var1.mag);
  422.          if (var3 == 0) {
  423.             return ZERO;
  424.          } else {
  425.             int[] var2 = var3 > 0 ? subtract(this.mag, var1.mag) : subtract(var1.mag, this.mag);
  426.             var2 = trustedStripLeadingZeroInts(var2);
  427.             return new BigInteger(var2, var3 * this.signum);
  428.          }
  429.       }
  430.    }
  431.  
  432.    private static int[] subtract(int[] var0, int[] var1) {
  433.       int var2 = var0.length;
  434.       int[] var3 = new int[var2];
  435.       int var4 = var1.length;
  436.  
  437.       long var5;
  438.       for(var5 = 0L; var4 > 0; var3[var2] = (int)var5) {
  439.          --var2;
  440.          long var10000 = (long)var0[var2] & 4294967295L;
  441.          --var4;
  442.          var5 = var10000 - ((long)var1[var4] & 4294967295L) + (var5 >> 32);
  443.       }
  444.  
  445.       for(boolean var7 = var5 >> 32 != 0L; var2 > 0 && var7; var7 = (var3[var2] = var0[var2] - 1) == -1) {
  446.          --var2;
  447.       }
  448.  
  449.       while(var2 > 0) {
  450.          --var2;
  451.          var3[var2] = var0[var2];
  452.       }
  453.  
  454.       return var3;
  455.    }
  456.  
  457.    public BigInteger multiply(BigInteger var1) {
  458.       if (this.signum != 0 && var1.signum != 0) {
  459.          int[] var2 = this.multiplyToLen(this.mag, this.mag.length, var1.mag, var1.mag.length, (int[])null);
  460.          var2 = trustedStripLeadingZeroInts(var2);
  461.          return new BigInteger(var2, this.signum * var1.signum);
  462.       } else {
  463.          return ZERO;
  464.       }
  465.    }
  466.  
  467.    private int[] multiplyToLen(int[] var1, int var2, int[] var3, int var4, int[] var5) {
  468.       int var6 = var2 - 1;
  469.       int var7 = var4 - 1;
  470.       if (var5 == null || var5.length < var2 + var4) {
  471.          var5 = new int[var2 + var4];
  472.       }
  473.  
  474.       long var8 = 0L;
  475.       int var10 = var7;
  476.  
  477.       for(int var11 = var7 + 1 + var6; var10 >= 0; --var11) {
  478.          long var12 = ((long)var3[var10] & 4294967295L) * ((long)var1[var6] & 4294967295L) + var8;
  479.          var5[var11] = (int)var12;
  480.          var8 = var12 >>> 32;
  481.          --var10;
  482.       }
  483.  
  484.       var5[var6] = (int)var8;
  485.  
  486.       for(int var18 = var6 - 1; var18 >= 0; --var18) {
  487.          var8 = 0L;
  488.          int var13 = var7;
  489.  
  490.          for(int var14 = var7 + 1 + var18; var13 >= 0; --var14) {
  491.             long var15 = ((long)var3[var13] & 4294967295L) * ((long)var1[var18] & 4294967295L) + ((long)var5[var14] & 4294967295L) + var8;
  492.             var5[var14] = (int)var15;
  493.             var8 = var15 >>> 32;
  494.             --var13;
  495.          }
  496.  
  497.          var5[var18] = (int)var8;
  498.       }
  499.  
  500.       return var5;
  501.    }
  502.  
  503.    private BigInteger square() {
  504.       if (this.signum == 0) {
  505.          return ZERO;
  506.       } else {
  507.          int[] var1 = squareToLen(this.mag, this.mag.length, (int[])null);
  508.          return new BigInteger(trustedStripLeadingZeroInts(var1), 1);
  509.       }
  510.    }
  511.  
  512.    private static final int[] squareToLen(int[] var0, int var1, int[] var2) {
  513.       int var3 = var1 << 1;
  514.       if (var2 == null || var2.length < var3) {
  515.          var2 = new int[var3];
  516.       }
  517.  
  518.       int var4 = 0;
  519.       int var5 = 0;
  520.  
  521.       for(int var6 = 0; var5 < var1; ++var5) {
  522.          long var7 = (long)var0[var5] & 4294967295L;
  523.          long var9 = var7 * var7;
  524.          var2[var6++] = var4 << 31 | (int)(var9 >>> 33);
  525.          var2[var6++] = (int)(var9 >>> 1);
  526.          var4 = (int)var9;
  527.       }
  528.  
  529.       int var12 = var1;
  530.  
  531.       for(int var8 = 1; var12 > 0; var8 += 2) {
  532.          int var13 = var0[var12 - 1];
  533.          var13 = mulAdd(var2, var0, var8, var12 - 1, var13);
  534.          addOne(var2, var8 - 1, var12, var13);
  535.          --var12;
  536.       }
  537.  
  538.       primitiveLeftShift(var2, var3, 1);
  539.       var2[var3 - 1] |= var0[var1 - 1] & 1;
  540.       return var2;
  541.    }
  542.  
  543.    public BigInteger divide(BigInteger var1) {
  544.       MutableBigInteger var2 = new MutableBigInteger();
  545.       MutableBigInteger var3 = new MutableBigInteger();
  546.       MutableBigInteger var4 = new MutableBigInteger(this.mag);
  547.       MutableBigInteger var5 = new MutableBigInteger(var1.mag);
  548.       var4.divide(var5, var2, var3);
  549.       return new BigInteger(var2, this.signum * var1.signum);
  550.    }
  551.  
  552.    public BigInteger[] divideAndRemainder(BigInteger var1) {
  553.       BigInteger[] var2 = new BigInteger[2];
  554.       MutableBigInteger var3 = new MutableBigInteger();
  555.       MutableBigInteger var4 = new MutableBigInteger();
  556.       MutableBigInteger var5 = new MutableBigInteger(this.mag);
  557.       MutableBigInteger var6 = new MutableBigInteger(var1.mag);
  558.       var5.divide(var6, var3, var4);
  559.       var2[0] = new BigInteger(var3, this.signum * var1.signum);
  560.       var2[1] = new BigInteger(var4, this.signum);
  561.       return var2;
  562.    }
  563.  
  564.    public BigInteger remainder(BigInteger var1) {
  565.       MutableBigInteger var2 = new MutableBigInteger();
  566.       MutableBigInteger var3 = new MutableBigInteger();
  567.       MutableBigInteger var4 = new MutableBigInteger(this.mag);
  568.       MutableBigInteger var5 = new MutableBigInteger(var1.mag);
  569.       var4.divide(var5, var2, var3);
  570.       return new BigInteger(var3, this.signum);
  571.    }
  572.  
  573.    public BigInteger pow(int var1) {
  574.       if (var1 < 0) {
  575.          throw new ArithmeticException("Negative exponent");
  576.       } else if (this.signum == 0) {
  577.          return var1 == 0 ? ONE : this;
  578.       } else {
  579.          int var2 = this.signum < 0 && (var1 & 1) == 1 ? -1 : 1;
  580.          int[] var3 = this.mag;
  581.          int[] var4 = new int[]{1};
  582.  
  583.          while(var1 != 0) {
  584.             if ((var1 & 1) == 1) {
  585.                var4 = this.multiplyToLen(var4, var4.length, var3, var3.length, (int[])null);
  586.             }
  587.  
  588.             if ((var1 >>>= 1) != 0) {
  589.                var3 = squareToLen(var3, var3.length, (int[])null);
  590.             }
  591.          }
  592.  
  593.          var4 = trustedStripLeadingZeroInts(var4);
  594.          return new BigInteger(var4, var2);
  595.       }
  596.    }
  597.  
  598.    public BigInteger gcd(BigInteger var1) {
  599.       if (var1.signum == 0) {
  600.          return this.abs();
  601.       } else if (this.signum == 0) {
  602.          return var1.abs();
  603.       } else {
  604.          MutableBigInteger var2 = new MutableBigInteger(this);
  605.          MutableBigInteger var3 = new MutableBigInteger(var1);
  606.          MutableBigInteger var4 = var2.hybridGCD(var3);
  607.          return new BigInteger(var4, 1);
  608.       }
  609.    }
  610.  
  611.    private static int[] leftShift(int[] var0, int var1, int var2) {
  612.       int var3 = var2 >>> 5;
  613.       int var4 = var2 & 31;
  614.       int var5 = bitLen(var0[0]);
  615.       if (var2 <= 32 - var5) {
  616.          primitiveLeftShift(var0, var1, var4);
  617.          return var0;
  618.       } else if (var4 <= 32 - var5) {
  619.          int[] var8 = new int[var3 + var1];
  620.  
  621.          for(int var9 = 0; var9 < var1; ++var9) {
  622.             var8[var9] = var0[var9];
  623.          }
  624.  
  625.          primitiveLeftShift(var8, var8.length, var4);
  626.          return var8;
  627.       } else {
  628.          int[] var6 = new int[var3 + var1 + 1];
  629.  
  630.          for(int var7 = 0; var7 < var1; ++var7) {
  631.             var6[var7] = var0[var7];
  632.          }
  633.  
  634.          primitiveRightShift(var6, var6.length, 32 - var4);
  635.          return var6;
  636.       }
  637.    }
  638.  
  639.    static void primitiveRightShift(int[] var0, int var1, int var2) {
  640.       int var3 = 32 - var2;
  641.       int var4 = var1 - 1;
  642.  
  643.       for(int var5 = var0[var4]; var4 > 0; --var4) {
  644.          int var6 = var5;
  645.          var5 = var0[var4 - 1];
  646.          var0[var4] = var5 << var3 | var6 >>> var2;
  647.       }
  648.  
  649.       var0[0] >>>= var2;
  650.    }
  651.  
  652.    static void primitiveLeftShift(int[] var0, int var1, int var2) {
  653.       if (var1 != 0 && var2 != 0) {
  654.          int var3 = 32 - var2;
  655.          int var4 = 0;
  656.          int var5 = var0[var4];
  657.  
  658.          for(int var6 = var4 + var1 - 1; var4 < var6; ++var4) {
  659.             int var7 = var5;
  660.             var5 = var0[var4 + 1];
  661.             var0[var4] = var7 << var2 | var5 >>> var3;
  662.          }
  663.  
  664.          var0[var1 - 1] <<= var2;
  665.       }
  666.    }
  667.  
  668.    private static int bitLength(int[] var0, int var1) {
  669.       return var1 == 0 ? 0 : (var1 - 1 << 5) + bitLen(var0[0]);
  670.    }
  671.  
  672.    public BigInteger abs() {
  673.       return this.signum >= 0 ? this : this.negate();
  674.    }
  675.  
  676.    public BigInteger negate() {
  677.       return new BigInteger(this.mag, -this.signum);
  678.    }
  679.  
  680.    public int signum() {
  681.       return this.signum;
  682.    }
  683.  
  684.    public BigInteger mod(BigInteger var1) {
  685.       if (var1.signum <= 0) {
  686.          throw new ArithmeticException("BigInteger: modulus not positive");
  687.       } else {
  688.          BigInteger var2 = this.remainder(var1);
  689.          return var2.signum >= 0 ? var2 : var2.add(var1);
  690.       }
  691.    }
  692.  
  693.    public BigInteger modPow(BigInteger var1, BigInteger var2) {
  694.       if (var2.signum <= 0) {
  695.          throw new ArithmeticException("BigInteger: modulus not positive");
  696.       } else if (var1.signum == 0) {
  697.          return var2.equals(ONE) ? ZERO : ONE;
  698.       } else if (this.equals(ONE)) {
  699.          return var2.equals(ONE) ? ZERO : ONE;
  700.       } else if (this.equals(ZERO) && var1.signum >= 0) {
  701.          return ZERO;
  702.       } else if (this.equals(negConst[1]) && !var1.testBit(0)) {
  703.          return var2.equals(ONE) ? ZERO : ONE;
  704.       } else {
  705.          boolean var3;
  706.          if (var3 = var1.signum < 0) {
  707.             var1 = var1.negate();
  708.          }
  709.  
  710.          BigInteger var4 = this.signum >= 0 && this.compareTo(var2) < 0 ? this : this.mod(var2);
  711.          BigInteger var5;
  712.          if (var2.testBit(0)) {
  713.             var5 = var4.oddModPow(var1, var2);
  714.          } else {
  715.             int var6 = var2.getLowestSetBit();
  716.             BigInteger var7 = var2.shiftRight(var6);
  717.             BigInteger var8 = ONE.shiftLeft(var6);
  718.             BigInteger var9 = this.signum >= 0 && this.compareTo(var7) < 0 ? this : this.mod(var7);
  719.             BigInteger var10 = var7.equals(ONE) ? ZERO : var9.oddModPow(var1, var7);
  720.             BigInteger var11 = var4.modPow2(var1, var6);
  721.             BigInteger var12 = var8.modInverse(var7);
  722.             BigInteger var13 = var7.modInverse(var8);
  723.             var5 = var10.multiply(var8).multiply(var12).add(var11.multiply(var7).multiply(var13)).mod(var2);
  724.          }
  725.  
  726.          return var3 ? var5.modInverse(var2) : var5;
  727.       }
  728.    }
  729.  
  730.    private BigInteger oddModPow(BigInteger var1, BigInteger var2) {
  731.       if (var1.equals(ONE)) {
  732.          return this;
  733.       } else if (this.signum == 0) {
  734.          return ZERO;
  735.       } else {
  736.          int[] var3 = (int[])this.mag.clone();
  737.          int[] var4 = var1.mag;
  738.          int[] var5 = var2.mag;
  739.          int var6 = var5.length;
  740.          int var7 = 0;
  741.  
  742.          int var8;
  743.          for(var8 = bitLength(var4, var4.length); var8 > bnExpModThreshTable[var7]; ++var7) {
  744.          }
  745.  
  746.          int var9 = 1 << var7;
  747.          int[][] var10 = new int[var9][];
  748.  
  749.          for(int var11 = 0; var11 < var9; ++var11) {
  750.             var10[var11] = new int[var6];
  751.          }
  752.  
  753.          int var12 = -MutableBigInteger.inverseMod32(var5[var6 - 1]);
  754.          int[] var13 = leftShift(var3, var3.length, var6 << 5);
  755.          MutableBigInteger var14 = new MutableBigInteger();
  756.          MutableBigInteger var15 = new MutableBigInteger();
  757.          MutableBigInteger var16 = new MutableBigInteger(var13);
  758.          MutableBigInteger var17 = new MutableBigInteger(var5);
  759.          var16.divide(var17, var14, var15);
  760.          var10[0] = var15.toIntArray();
  761.          if (var10[0].length < var6) {
  762.             int var18 = var6 - var10[0].length;
  763.             int[] var19 = new int[var6];
  764.  
  765.             for(int var20 = 0; var20 < var10[0].length; ++var20) {
  766.                var19[var20 + var18] = var10[0][var20];
  767.             }
  768.  
  769.             var10[0] = var19;
  770.          }
  771.  
  772.          int[] var38 = squareToLen(var10[0], var6, (int[])null);
  773.          var38 = montReduce(var38, var5, var6, var12);
  774.          int[] var41 = new int[var6];
  775.  
  776.          for(int var44 = 0; var44 < var6; ++var44) {
  777.             var41[var44] = var38[var44];
  778.          }
  779.  
  780.          for(int var21 = 1; var21 < var9; ++var21) {
  781.             int[] var22 = this.multiplyToLen(var41, var6, var10[var21 - 1], var6, (int[])null);
  782.             var10[var21] = montReduce(var22, var5, var6, var12);
  783.          }
  784.  
  785.          int var45 = 1 << (var8 - 1 & 31);
  786.          int var23 = 0;
  787.          int var24 = var4.length;
  788.          int var25 = 0;
  789.  
  790.          for(int var26 = 0; var26 <= var7; ++var26) {
  791.             var23 = var23 << 1 | ((var4[var25] & var45) != 0 ? 1 : 0);
  792.             var45 >>>= 1;
  793.             if (var45 == 0) {
  794.                ++var25;
  795.                var45 = Integer.MIN_VALUE;
  796.                --var24;
  797.             }
  798.          }
  799.  
  800.          --var8;
  801.          boolean var28 = true;
  802.  
  803.          int var27;
  804.          for(var27 = var8 - var7; (var23 & 1) == 0; ++var27) {
  805.             var23 >>>= 1;
  806.          }
  807.  
  808.          int[] var29 = var10[var23 >>> 1];
  809.          var23 = 0;
  810.          if (var27 == var8) {
  811.             var28 = false;
  812.          }
  813.  
  814.          while(true) {
  815.             --var8;
  816.             var23 <<= 1;
  817.             if (var24 != 0) {
  818.                var23 |= (var4[var25] & var45) != 0 ? 1 : 0;
  819.                var45 >>>= 1;
  820.                if (var45 == 0) {
  821.                   ++var25;
  822.                   var45 = Integer.MIN_VALUE;
  823.                   --var24;
  824.                }
  825.             }
  826.  
  827.             if ((var23 & var9) != 0) {
  828.                for(var27 = var8 - var7; (var23 & 1) == 0; ++var27) {
  829.                   var23 >>>= 1;
  830.                }
  831.  
  832.                var29 = var10[var23 >>> 1];
  833.                var23 = 0;
  834.             }
  835.  
  836.             if (var8 == var27) {
  837.                if (var28) {
  838.                   var38 = (int[])var29.clone();
  839.                   var28 = false;
  840.                } else {
  841.                   var13 = this.multiplyToLen(var38, var6, var29, var6, var13);
  842.                   var13 = montReduce(var13, var5, var6, var12);
  843.                   var13 = var38;
  844.                   var38 = var13;
  845.                }
  846.             }
  847.  
  848.             if (var8 == 0) {
  849.                int[] var30 = new int[2 * var6];
  850.  
  851.                for(int var31 = 0; var31 < var6; ++var31) {
  852.                   var30[var31 + var6] = var38[var31];
  853.                }
  854.  
  855.                var38 = montReduce(var30, var5, var6, var12);
  856.                var30 = new int[var6];
  857.  
  858.                for(int var32 = 0; var32 < var6; ++var32) {
  859.                   var30[var32] = var38[var32];
  860.                }
  861.  
  862.                return new BigInteger(1, var30);
  863.             }
  864.  
  865.             if (!var28) {
  866.                var13 = squareToLen(var38, var6, var13);
  867.                var13 = montReduce(var13, var5, var6, var12);
  868.                var13 = var38;
  869.                var38 = var13;
  870.             }
  871.          }
  872.       }
  873.    }
  874.  
  875.    private static int[] montReduce(int[] var0, int[] var1, int var2, int var3) {
  876.       int var4 = 0;
  877.       int var5 = var2;
  878.       int var6 = 0;
  879.  
  880.       do {
  881.          int var7 = var0[var0.length - 1 - var6];
  882.          int var8 = mulAdd(var0, var1, var6, var2, var3 * var7);
  883.          var4 += addOne(var0, var6, var2, var8);
  884.          ++var6;
  885.          --var5;
  886.       } while(var5 > 0);
  887.  
  888.       while(var4 > 0) {
  889.          var4 += subN(var0, var1, var2);
  890.       }
  891.  
  892.       while(intArrayCmpToLen(var0, var1, var2) >= 0) {
  893.          subN(var0, var1, var2);
  894.       }
  895.  
  896.       return var0;
  897.    }
  898.  
  899.    private static int intArrayCmpToLen(int[] var0, int[] var1, int var2) {
  900.       for(int var3 = 0; var3 < var2; ++var3) {
  901.          long var4 = (long)var0[var3] & 4294967295L;
  902.          long var6 = (long)var1[var3] & 4294967295L;
  903.          if (var4 < var6) {
  904.             return -1;
  905.          }
  906.  
  907.          if (var4 > var6) {
  908.             return 1;
  909.          }
  910.       }
  911.  
  912.       return 0;
  913.    }
  914.  
  915.    private static int subN(int[] var0, int[] var1, int var2) {
  916.       long var3 = 0L;
  917.  
  918.       while(true) {
  919.          --var2;
  920.          if (var2 < 0) {
  921.             return (int)(var3 >> 32);
  922.          }
  923.  
  924.          var3 = ((long)var0[var2] & 4294967295L) - ((long)var1[var2] & 4294967295L) + (var3 >> 32);
  925.          var0[var2] = (int)var3;
  926.       }
  927.    }
  928.  
  929.    static int mulAdd(int[] var0, int[] var1, int var2, int var3, int var4) {
  930.       long var5 = (long)var4 & 4294967295L;
  931.       long var7 = 0L;
  932.       var2 = var0.length - var2 - 1;
  933.  
  934.       for(int var9 = var3 - 1; var9 >= 0; --var9) {
  935.          long var10 = ((long)var1[var9] & 4294967295L) * var5 + ((long)var0[var2] & 4294967295L) + var7;
  936.          var0[var2--] = (int)var10;
  937.          var7 = var10 >>> 32;
  938.       }
  939.  
  940.       return (int)var7;
  941.    }
  942.  
  943.    static int addOne(int[] var0, int var1, int var2, int var3) {
  944.       var1 = var0.length - 1 - var2 - var1;
  945.       long var4 = ((long)var0[var1] & 4294967295L) + ((long)var3 & 4294967295L);
  946.       var0[var1] = (int)var4;
  947.       if (var4 >>> 32 == 0L) {
  948.          return 0;
  949.       } else {
  950.          do {
  951.             --var2;
  952.             if (var2 < 0) {
  953.                return 1;
  954.             }
  955.  
  956.             --var1;
  957.             if (var1 < 0) {
  958.                return 1;
  959.             }
  960.  
  961.             int var10002 = var0[var1]++;
  962.          } while(var0[var1] == 0);
  963.  
  964.          return 0;
  965.       }
  966.    }
  967.  
  968.    private BigInteger modPow2(BigInteger var1, int var2) {
  969.       BigInteger var3 = valueOf(1L);
  970.       BigInteger var4 = this.mod2(var2);
  971.       int var5 = 0;
  972.       int var6 = var1.bitLength();
  973.       if (this.testBit(0)) {
  974.          var6 = var2 - 1 < var6 ? var2 - 1 : var6;
  975.       }
  976.  
  977.       while(var5 < var6) {
  978.          if (var1.testBit(var5)) {
  979.             var3 = var3.multiply(var4).mod2(var2);
  980.          }
  981.  
  982.          ++var5;
  983.          if (var5 < var6) {
  984.             var4 = var4.square().mod2(var2);
  985.          }
  986.       }
  987.  
  988.       return var3;
  989.    }
  990.  
  991.    private BigInteger mod2(int var1) {
  992.       if (this.bitLength() <= var1) {
  993.          return this;
  994.       } else {
  995.          int var2 = (var1 + 31) / 32;
  996.          int[] var3 = new int[var2];
  997.  
  998.          for(int var4 = 0; var4 < var2; ++var4) {
  999.             var3[var4] = this.mag[var4 + (this.mag.length - var2)];
  1000.          }
  1001.  
  1002.          int var5 = (var2 << 5) - var1;
  1003.          var3[0] = (int)((long)var3[0] & (1L << 32 - var5) - 1L);
  1004.          return var3[0] == 0 ? new BigInteger(1, var3) : new BigInteger(var3, 1);
  1005.       }
  1006.    }
  1007.  
  1008.    public BigInteger modInverse(BigInteger var1) {
  1009.       if (var1.signum != 1) {
  1010.          throw new ArithmeticException("BigInteger: modulus not positive");
  1011.       } else if (var1.equals(ONE)) {
  1012.          return ZERO;
  1013.       } else {
  1014.          BigInteger var2 = this;
  1015.          if (this.signum < 0 || intArrayCmp(this.mag, var1.mag) >= 0) {
  1016.             var2 = this.mod(var1);
  1017.          }
  1018.  
  1019.          if (var2.equals(ONE)) {
  1020.             return ONE;
  1021.          } else {
  1022.             MutableBigInteger var3 = new MutableBigInteger(var2);
  1023.             MutableBigInteger var4 = new MutableBigInteger(var1);
  1024.             MutableBigInteger var5 = var3.mutableModInverse(var4);
  1025.             return new BigInteger(var5, 1);
  1026.          }
  1027.       }
  1028.    }
  1029.  
  1030.    public BigInteger shiftLeft(int var1) {
  1031.       if (this.signum == 0) {
  1032.          return ZERO;
  1033.       } else if (var1 == 0) {
  1034.          return this;
  1035.       } else if (var1 < 0) {
  1036.          return this.shiftRight(-var1);
  1037.       } else {
  1038.          int var2 = var1 >>> 5;
  1039.          int var3 = var1 & 31;
  1040.          int var4 = this.mag.length;
  1041.          Object var5 = null;
  1042.          int[] var10;
  1043.          if (var3 == 0) {
  1044.             var10 = new int[var4 + var2];
  1045.  
  1046.             for(int var6 = 0; var6 < var4; ++var6) {
  1047.                var10[var6] = this.mag[var6];
  1048.             }
  1049.          } else {
  1050.             int var11 = 0;
  1051.             int var7 = 32 - var3;
  1052.             int var8 = this.mag[0] >>> var7;
  1053.             if (var8 != 0) {
  1054.                var10 = new int[var4 + var2 + 1];
  1055.                var10[var11++] = var8;
  1056.             } else {
  1057.                var10 = new int[var4 + var2];
  1058.             }
  1059.  
  1060.             int var9;
  1061.             for(var9 = 0; var9 < var4 - 1; var10[var11++] = this.mag[var9++] << var3 | this.mag[var9] >>> var7) {
  1062.             }
  1063.  
  1064.             var10[var11] = this.mag[var9] << var3;
  1065.          }
  1066.  
  1067.          return new BigInteger(var10, this.signum);
  1068.       }
  1069.    }
  1070.  
  1071.    public BigInteger shiftRight(int var1) {
  1072.       if (var1 == 0) {
  1073.          return this;
  1074.       } else if (var1 < 0) {
  1075.          return this.shiftLeft(-var1);
  1076.       } else {
  1077.          int var2 = var1 >>> 5;
  1078.          int var3 = var1 & 31;
  1079.          int var4 = this.mag.length;
  1080.          Object var5 = null;
  1081.          if (var2 >= var4) {
  1082.             return this.signum >= 0 ? ZERO : negConst[1];
  1083.          } else {
  1084.             int[] var10;
  1085.             if (var3 == 0) {
  1086.                int var6 = var4 - var2;
  1087.                var10 = new int[var6];
  1088.  
  1089.                for(int var7 = 0; var7 < var6; ++var7) {
  1090.                   var10[var7] = this.mag[var7];
  1091.                }
  1092.             } else {
  1093.                int var11 = 0;
  1094.                int var13 = this.mag[0] >>> var3;
  1095.                if (var13 != 0) {
  1096.                   var10 = new int[var4 - var2];
  1097.                   var10[var11++] = var13;
  1098.                } else {
  1099.                   var10 = new int[var4 - var2 - 1];
  1100.                }
  1101.  
  1102.                int var8 = 32 - var3;
  1103.  
  1104.                for(int var9 = 0; var9 < var4 - var2 - 1; var10[var11++] = this.mag[var9++] << var8 | this.mag[var9] >>> var3) {
  1105.                }
  1106.             }
  1107.  
  1108.             if (this.signum < 0) {
  1109.                boolean var12 = false;
  1110.                int var14 = var4 - 1;
  1111.  
  1112.                for(int var15 = var4 - var2; var14 >= var15 && !var12; --var14) {
  1113.                   var12 = this.mag[var14] != 0;
  1114.                }
  1115.  
  1116.                if (!var12 && var3 != 0) {
  1117.                   var12 = this.mag[var4 - var2 - 1] << 32 - var3 != 0;
  1118.                }
  1119.  
  1120.                if (var12) {
  1121.                   var10 = this.javaIncrement(var10);
  1122.                }
  1123.             }
  1124.  
  1125.             return new BigInteger(var10, this.signum);
  1126.          }
  1127.       }
  1128.    }
  1129.  
  1130.    int[] javaIncrement(int[] var1) {
  1131.       boolean var2 = false;
  1132.       int var3 = 0;
  1133.  
  1134.       for(int var4 = var1.length - 1; var4 >= 0 && var3 == 0; --var4) {
  1135.          var3 = ++var1[var4];
  1136.       }
  1137.  
  1138.       if (var3 == 0) {
  1139.          var1 = new int[var1.length + 1];
  1140.          var1[0] = 1;
  1141.       }
  1142.  
  1143.       return var1;
  1144.    }
  1145.  
  1146.    public BigInteger and(BigInteger var1) {
  1147.       int[] var2 = new int[Math.max(this.intLength(), var1.intLength())];
  1148.  
  1149.       for(int var3 = 0; var3 < var2.length; ++var3) {
  1150.          var2[var3] = this.getInt(var2.length - var3 - 1) & var1.getInt(var2.length - var3 - 1);
  1151.       }
  1152.  
  1153.       return valueOf(var2);
  1154.    }
  1155.  
  1156.    // $FF: renamed from: or (java.math.BigInteger) java.math.BigInteger
  1157.    public BigInteger method_0(BigInteger var1) {
  1158.       int[] var2 = new int[Math.max(this.intLength(), var1.intLength())];
  1159.  
  1160.       for(int var3 = 0; var3 < var2.length; ++var3) {
  1161.          var2[var3] = this.getInt(var2.length - var3 - 1) | var1.getInt(var2.length - var3 - 1);
  1162.       }
  1163.  
  1164.       return valueOf(var2);
  1165.    }
  1166.  
  1167.    public BigInteger xor(BigInteger var1) {
  1168.       int[] var2 = new int[Math.max(this.intLength(), var1.intLength())];
  1169.  
  1170.       for(int var3 = 0; var3 < var2.length; ++var3) {
  1171.          var2[var3] = this.getInt(var2.length - var3 - 1) ^ var1.getInt(var2.length - var3 - 1);
  1172.       }
  1173.  
  1174.       return valueOf(var2);
  1175.    }
  1176.  
  1177.    public BigInteger not() {
  1178.       int[] var1 = new int[this.intLength()];
  1179.  
  1180.       for(int var2 = 0; var2 < var1.length; ++var2) {
  1181.          var1[var2] = ~this.getInt(var1.length - var2 - 1);
  1182.       }
  1183.  
  1184.       return valueOf(var1);
  1185.    }
  1186.  
  1187.    public BigInteger andNot(BigInteger var1) {
  1188.       int[] var2 = new int[Math.max(this.intLength(), var1.intLength())];
  1189.  
  1190.       for(int var3 = 0; var3 < var2.length; ++var3) {
  1191.          var2[var3] = this.getInt(var2.length - var3 - 1) & ~var1.getInt(var2.length - var3 - 1);
  1192.       }
  1193.  
  1194.       return valueOf(var2);
  1195.    }
  1196.  
  1197.    public boolean testBit(int var1) {
  1198.       if (var1 < 0) {
  1199.          throw new ArithmeticException("Negative bit address");
  1200.       } else {
  1201.          return (this.getInt(var1 / 32) & 1 << var1 % 32) != 0;
  1202.       }
  1203.    }
  1204.  
  1205.    public BigInteger setBit(int var1) {
  1206.       if (var1 < 0) {
  1207.          throw new ArithmeticException("Negative bit address");
  1208.       } else {
  1209.          int var2 = var1 / 32;
  1210.          int[] var3 = new int[Math.max(this.intLength(), var2 + 2)];
  1211.  
  1212.          for(int var4 = 0; var4 < var3.length; ++var4) {
  1213.             var3[var3.length - var4 - 1] = this.getInt(var4);
  1214.          }
  1215.  
  1216.          var3[var3.length - var2 - 1] |= 1 << var1 % 32;
  1217.          return valueOf(var3);
  1218.       }
  1219.    }
  1220.  
  1221.    public BigInteger clearBit(int var1) {
  1222.       if (var1 < 0) {
  1223.          throw new ArithmeticException("Negative bit address");
  1224.       } else {
  1225.          int var2 = var1 / 32;
  1226.          int[] var3 = new int[Math.max(this.intLength(), (var1 + 1) / 32 + 1)];
  1227.  
  1228.          for(int var4 = 0; var4 < var3.length; ++var4) {
  1229.             var3[var3.length - var4 - 1] = this.getInt(var4);
  1230.          }
  1231.  
  1232.          var3[var3.length - var2 - 1] &= ~(1 << var1 % 32);
  1233.          return valueOf(var3);
  1234.       }
  1235.    }
  1236.  
  1237.    public BigInteger flipBit(int var1) {
  1238.       if (var1 < 0) {
  1239.          throw new ArithmeticException("Negative bit address");
  1240.       } else {
  1241.          int var2 = var1 / 32;
  1242.          int[] var3 = new int[Math.max(this.intLength(), var2 + 2)];
  1243.  
  1244.          for(int var4 = 0; var4 < var3.length; ++var4) {
  1245.             var3[var3.length - var4 - 1] = this.getInt(var4);
  1246.          }
  1247.  
  1248.          var3[var3.length - var2 - 1] ^= 1 << var1 % 32;
  1249.          return valueOf(var3);
  1250.       }
  1251.    }
  1252.  
  1253.    public int getLowestSetBit() {
  1254.       if (this.lowestSetBit == -2) {
  1255.          if (this.signum == 0) {
  1256.             this.lowestSetBit = -1;
  1257.          } else {
  1258.             int var1;
  1259.             int var2;
  1260.             for(var1 = 0; (var2 = this.getInt(var1)) == 0; ++var1) {
  1261.             }
  1262.  
  1263.             this.lowestSetBit = (var1 << 5) + trailingZeroCnt(var2);
  1264.          }
  1265.       }
  1266.  
  1267.       return this.lowestSetBit;
  1268.    }
  1269.  
  1270.    public int bitLength() {
  1271.       if (this.bitLength == -1) {
  1272.          if (this.signum == 0) {
  1273.             this.bitLength = 0;
  1274.          } else {
  1275.             int var1 = (this.mag.length - 1 << 5) + bitLen(this.mag[0]);
  1276.             if (this.signum < 0) {
  1277.                boolean var2 = bitCnt(this.mag[0]) == 1;
  1278.  
  1279.                for(int var3 = 1; var3 < this.mag.length && var2; ++var3) {
  1280.                   var2 = this.mag[var3] == 0;
  1281.                }
  1282.  
  1283.                this.bitLength = var2 ? var1 - 1 : var1;
  1284.             } else {
  1285.                this.bitLength = var1;
  1286.             }
  1287.          }
  1288.       }
  1289.  
  1290.       return this.bitLength;
  1291.    }
  1292.  
  1293.    static int bitLen(int var0) {
  1294.       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))));
  1295.    }
  1296.  
  1297.    public int bitCount() {
  1298.       if (this.bitCount == -1) {
  1299.          int var1 = 0;
  1300.  
  1301.          for(int var2 = 0; var2 < this.mag.length; ++var2) {
  1302.             var1 += bitCnt(this.mag[var2]);
  1303.          }
  1304.  
  1305.          if (this.signum < 0) {
  1306.             int var3 = 0;
  1307.  
  1308.             int var4;
  1309.             for(var4 = this.mag.length - 1; this.mag[var4] == 0; --var4) {
  1310.                var3 += 32;
  1311.             }
  1312.  
  1313.             var3 += trailingZeroCnt(this.mag[var4]);
  1314.             this.bitCount = var1 + var3 - 1;
  1315.          } else {
  1316.             this.bitCount = var1;
  1317.          }
  1318.       }
  1319.  
  1320.       return this.bitCount;
  1321.    }
  1322.  
  1323.    static int bitCnt(int var0) {
  1324.       var0 -= (-1431655766 & var0) >>> 1;
  1325.       var0 = (var0 & 858993459) + (var0 >>> 2 & 858993459);
  1326.       var0 = var0 + (var0 >>> 4) & 252645135;
  1327.       var0 += var0 >>> 8;
  1328.       var0 += var0 >>> 16;
  1329.       return var0 & 255;
  1330.    }
  1331.  
  1332.    static int trailingZeroCnt(int var0) {
  1333.       int var1 = var0 & 255;
  1334.       if (var1 != 0) {
  1335.          return trailingZeroTable[var1];
  1336.       } else {
  1337.          var1 = var0 >>> 8 & 255;
  1338.          if (var1 != 0) {
  1339.             return trailingZeroTable[var1] + 8;
  1340.          } else {
  1341.             var1 = var0 >>> 16 & 255;
  1342.             if (var1 != 0) {
  1343.                return trailingZeroTable[var1] + 16;
  1344.             } else {
  1345.                var1 = var0 >>> 24 & 255;
  1346.                return trailingZeroTable[var1] + 24;
  1347.             }
  1348.          }
  1349.       }
  1350.    }
  1351.  
  1352.    public boolean isProbablePrime(int var1) {
  1353.       int var2 = (var1 + 1) / 2;
  1354.       if (var2 <= 0) {
  1355.          return true;
  1356.       } else {
  1357.          BigInteger var3 = this.abs();
  1358.          if (var3.equals(TWO)) {
  1359.             return true;
  1360.          } else if (var3.testBit(0) && !var3.equals(ONE)) {
  1361.             BigInteger var4 = var3.subtract(ONE);
  1362.             int var5 = var4.getLowestSetBit();
  1363.             var4 = var4.shiftRight(var5);
  1364.             Random var6 = new Random();
  1365.  
  1366.             for(int var7 = 0; var7 < var2; ++var7) {
  1367.                BigInteger var8;
  1368.                do {
  1369.                   var8 = new BigInteger(var3.bitLength(), var6);
  1370.                } while(var8.compareTo(ONE) <= 0 || var8.compareTo(var3) >= 0);
  1371.  
  1372.                int var9 = 0;
  1373.  
  1374.                for(BigInteger var10 = var8.modPow(var4, var3); (var9 != 0 || !var10.equals(ONE)) && !var10.equals(var3.subtract(ONE)); var10 = var10.modPow(TWO, var3)) {
  1375.                   if (var9 > 0 && var10.equals(ONE)) {
  1376.                      return false;
  1377.                   }
  1378.  
  1379.                   ++var9;
  1380.                   if (var9 == var5) {
  1381.                      return false;
  1382.                   }
  1383.                }
  1384.             }
  1385.  
  1386.             return true;
  1387.          } else {
  1388.             return false;
  1389.          }
  1390.       }
  1391.    }
  1392.  
  1393.    public int compareTo(BigInteger var1) {
  1394.       return this.signum == var1.signum ? this.signum * intArrayCmp(this.mag, var1.mag) : (this.signum > var1.signum ? 1 : -1);
  1395.    }
  1396.  
  1397.    public int compareTo(Object var1) {
  1398.       return this.compareTo((BigInteger)var1);
  1399.    }
  1400.  
  1401.    private static int intArrayCmp(int[] var0, int[] var1) {
  1402.       if (var0.length < var1.length) {
  1403.          return -1;
  1404.       } else if (var0.length > var1.length) {
  1405.          return 1;
  1406.       } else {
  1407.          for(int var2 = 0; var2 < var0.length; ++var2) {
  1408.             long var3 = (long)var0[var2] & 4294967295L;
  1409.             long var5 = (long)var1[var2] & 4294967295L;
  1410.             if (var3 < var5) {
  1411.                return -1;
  1412.             }
  1413.  
  1414.             if (var3 > var5) {
  1415.                return 1;
  1416.             }
  1417.          }
  1418.  
  1419.          return 0;
  1420.       }
  1421.    }
  1422.  
  1423.    public boolean equals(Object var1) {
  1424.       if (var1 == this) {
  1425.          return true;
  1426.       } else if (!(var1 instanceof BigInteger)) {
  1427.          return false;
  1428.       } else {
  1429.          BigInteger var2 = (BigInteger)var1;
  1430.          if (var2.signum == this.signum && var2.mag.length == this.mag.length) {
  1431.             for(int var3 = 0; var3 < this.mag.length; ++var3) {
  1432.                if (var2.mag[var3] != this.mag[var3]) {
  1433.                   return false;
  1434.                }
  1435.             }
  1436.  
  1437.             return true;
  1438.          } else {
  1439.             return false;
  1440.          }
  1441.       }
  1442.    }
  1443.  
  1444.    public BigInteger min(BigInteger var1) {
  1445.       return this.compareTo(var1) < 0 ? this : var1;
  1446.    }
  1447.  
  1448.    public BigInteger max(BigInteger var1) {
  1449.       return this.compareTo(var1) > 0 ? this : var1;
  1450.    }
  1451.  
  1452.    public int hashCode() {
  1453.       int var1 = 0;
  1454.  
  1455.       for(int var2 = 0; var2 < this.mag.length; ++var2) {
  1456.          var1 = (int)((long)(31 * var1) + ((long)this.mag[var2] & 4294967295L));
  1457.       }
  1458.  
  1459.       return var1 * this.signum;
  1460.    }
  1461.  
  1462.    public String toString(int var1) {
  1463.       if (this.signum == 0) {
  1464.          return "0";
  1465.       } else {
  1466.          if (var1 < 2 || var1 > 36) {
  1467.             var1 = 10;
  1468.          }
  1469.  
  1470.          int var2 = (4 * this.mag.length + 6) / 7;
  1471.          String[] var3 = new String[var2];
  1472.          BigInteger var4 = this.abs();
  1473.  
  1474.          int var5;
  1475.          BigInteger var11;
  1476.          for(var5 = 0; var4.signum != 0; var4 = var11) {
  1477.             BigInteger var6 = longRadix[var1];
  1478.             MutableBigInteger var7 = new MutableBigInteger();
  1479.             MutableBigInteger var8 = new MutableBigInteger();
  1480.             MutableBigInteger var9 = new MutableBigInteger(var4.mag);
  1481.             MutableBigInteger var10 = new MutableBigInteger(var6.mag);
  1482.             var9.divide(var10, var7, var8);
  1483.             var11 = new BigInteger(var7, var4.signum * var6.signum);
  1484.             BigInteger var12 = new BigInteger(var8, var4.signum * var6.signum);
  1485.             var3[var5++] = Long.toString(var12.longValue(), var1);
  1486.          }
  1487.  
  1488.          StringBuffer var13 = new StringBuffer(var5 * digitsPerLong[var1] + 1);
  1489.          if (this.signum < 0) {
  1490.             var13.append('-');
  1491.          }
  1492.  
  1493.          var13.append(var3[var5 - 1]);
  1494.  
  1495.          for(int var14 = var5 - 2; var14 >= 0; --var14) {
  1496.             int var15 = digitsPerLong[var1] - var3[var14].length();
  1497.             if (var15 != 0) {
  1498.                var13.append(zeros[var15]);
  1499.             }
  1500.  
  1501.             var13.append(var3[var14]);
  1502.          }
  1503.  
  1504.          return var13.toString();
  1505.       }
  1506.    }
  1507.  
  1508.    public String toString() {
  1509.       return this.toString(10);
  1510.    }
  1511.  
  1512.    public byte[] toByteArray() {
  1513.       int var1 = this.bitLength() / 8 + 1;
  1514.       byte[] var2 = new byte[var1];
  1515.       int var3 = var1 - 1;
  1516.       int var4 = 4;
  1517.       int var5 = 0;
  1518.  
  1519.       for(int var6 = 0; var3 >= 0; --var3) {
  1520.          if (var4 == 4) {
  1521.             var5 = this.getInt(var6++);
  1522.             var4 = 1;
  1523.          } else {
  1524.             var5 >>>= 8;
  1525.             ++var4;
  1526.          }
  1527.  
  1528.          var2[var3] = (byte)var5;
  1529.       }
  1530.  
  1531.       return var2;
  1532.    }
  1533.  
  1534.    public int intValue() {
  1535.       int var1 = 0;
  1536.       var1 = this.getInt(0);
  1537.       return var1;
  1538.    }
  1539.  
  1540.    public long longValue() {
  1541.       long var1 = 0L;
  1542.  
  1543.       for(int var3 = 1; var3 >= 0; --var3) {
  1544.          var1 = (var1 << 32) + ((long)this.getInt(var3) & 4294967295L);
  1545.       }
  1546.  
  1547.       return var1;
  1548.    }
  1549.  
  1550.    public float floatValue() {
  1551.       return Float.valueOf(this.toString());
  1552.    }
  1553.  
  1554.    public double doubleValue() {
  1555.       return Double.valueOf(this.toString());
  1556.    }
  1557.  
  1558.    private static int[] stripLeadingZeroInts(int[] var0) {
  1559.       int var1 = var0.length;
  1560.  
  1561.       int var2;
  1562.       for(var2 = 0; var2 < var0.length && var0[var2] == 0; ++var2) {
  1563.       }
  1564.  
  1565.       int[] var3 = new int[var0.length - var2];
  1566.  
  1567.       for(int var4 = 0; var4 < var0.length - var2; ++var4) {
  1568.          var3[var4] = var0[var2 + var4];
  1569.       }
  1570.  
  1571.       return var3;
  1572.    }
  1573.  
  1574.    private static int[] trustedStripLeadingZeroInts(int[] var0) {
  1575.       int var1 = var0.length;
  1576.  
  1577.       int var2;
  1578.       for(var2 = 0; var2 < var0.length && var0[var2] == 0; ++var2) {
  1579.       }
  1580.  
  1581.       if (var2 <= 0) {
  1582.          return var0;
  1583.       } else {
  1584.          int[] var3 = new int[var0.length - var2];
  1585.  
  1586.          for(int var4 = 0; var4 < var0.length - var2; ++var4) {
  1587.             var3[var4] = var0[var2 + var4];
  1588.          }
  1589.  
  1590.          return var3;
  1591.       }
  1592.    }
  1593.  
  1594.    private static int[] stripLeadingZeroBytes(byte[] var0) {
  1595.       int var1 = var0.length;
  1596.  
  1597.       int var2;
  1598.       for(var2 = 0; var2 < var0.length && var0[var2] == 0; ++var2) {
  1599.       }
  1600.  
  1601.       int var3 = (var1 - var2 + 3) / 4;
  1602.       int[] var4 = new int[var3];
  1603.       int var5 = var1 - 1;
  1604.  
  1605.       for(int var6 = var3 - 1; var6 >= 0; --var6) {
  1606.          var4[var6] = var0[var5--] & 255;
  1607.          int var7 = var5 - var2 + 1;
  1608.          int var8 = Math.min(3, var7);
  1609.  
  1610.          for(int var9 = 8; var9 <= 8 * var8; var9 += 8) {
  1611.             var4[var6] |= (var0[var5--] & 255) << var9;
  1612.          }
  1613.       }
  1614.  
  1615.       return var4;
  1616.    }
  1617.  
  1618.    private static int[] makePositive(byte[] var0) {
  1619.       int var3 = var0.length;
  1620.  
  1621.       int var1;
  1622.       for(var1 = 0; var1 < var3 && var0[var1] == -1; ++var1) {
  1623.       }
  1624.  
  1625.       int var2;
  1626.       for(var2 = var1; var2 < var3 && var0[var2] == 0; ++var2) {
  1627.       }
  1628.  
  1629.       int var4 = var2 == var3 ? 1 : 0;
  1630.       int var5 = (var3 - var1 + var4 + 3) / 4;
  1631.       int[] var6 = new int[var5];
  1632.       int var7 = var3 - 1;
  1633.  
  1634.       for(int var8 = var5 - 1; var8 >= 0; --var8) {
  1635.          var6[var8] = var0[var7--] & 255;
  1636.          int var9 = Math.min(3, var7 - var1 + 1);
  1637.          if (var9 < 0) {
  1638.             var9 = 0;
  1639.          }
  1640.  
  1641.          for(int var10 = 8; var10 <= 8 * var9; var10 += 8) {
  1642.             var6[var8] |= (var0[var7--] & 255) << var10;
  1643.          }
  1644.  
  1645.          int var11 = -1 >>> 8 * (3 - var9);
  1646.          var6[var8] = ~var6[var8] & var11;
  1647.       }
  1648.  
  1649.       for(int var12 = var6.length - 1; var12 >= 0; --var12) {
  1650.          var6[var12] = (int)(((long)var6[var12] & 4294967295L) + 1L);
  1651.          if (var6[var12] != 0) {
  1652.             break;
  1653.          }
  1654.       }
  1655.  
  1656.       return var6;
  1657.    }
  1658.  
  1659.    private static int[] makePositive(int[] var0) {
  1660.       int var1;
  1661.       for(var1 = 0; var1 < var0.length && var0[var1] == -1; ++var1) {
  1662.       }
  1663.  
  1664.       int var2;
  1665.       for(var2 = var1; var2 < var0.length && var0[var2] == 0; ++var2) {
  1666.       }
  1667.  
  1668.       int var3 = var2 == var0.length ? 1 : 0;
  1669.       int[] var4 = new int[var0.length - var1 + var3];
  1670.  
  1671.       for(int var5 = var1; var5 < var0.length; ++var5) {
  1672.          var4[var5 - var1 + var3] = ~var0[var5];
  1673.       }
  1674.  
  1675.       for(int var6 = var4.length - 1; ++var4[var6] == 0; --var6) {
  1676.       }
  1677.  
  1678.       return var4;
  1679.    }
  1680.  
  1681.    private int intLength() {
  1682.       return this.bitLength() / 32 + 1;
  1683.    }
  1684.  
  1685.    private int signBit() {
  1686.       return this.signum < 0 ? 1 : 0;
  1687.    }
  1688.  
  1689.    private int signInt() {
  1690.       return this.signum < 0 ? -1 : 0;
  1691.    }
  1692.  
  1693.    private int getInt(int var1) {
  1694.       if (var1 < 0) {
  1695.          return 0;
  1696.       } else if (var1 >= this.mag.length) {
  1697.          return this.signInt();
  1698.       } else {
  1699.          int var2 = this.mag[this.mag.length - var1 - 1];
  1700.          return this.signum >= 0 ? var2 : (var1 <= this.firstNonzeroIntNum() ? -var2 : ~var2);
  1701.       }
  1702.    }
  1703.  
  1704.    private int firstNonzeroIntNum() {
  1705.       if (this.firstNonzeroIntNum == -2) {
  1706.          int var1;
  1707.          for(var1 = this.mag.length - 1; var1 >= 0 && this.mag[var1] == 0; --var1) {
  1708.          }
  1709.  
  1710.          this.firstNonzeroIntNum = this.mag.length - var1 - 1;
  1711.       }
  1712.  
  1713.       return this.firstNonzeroIntNum;
  1714.    }
  1715.  
  1716.    private void readObject(ObjectInputStream var1) throws IOException, ClassNotFoundException {
  1717.       var1.defaultReadObject();
  1718.       if (this.signum >= -1 && this.signum <= 1) {
  1719.          if (this.magnitude.length == 0 != (this.signum == 0)) {
  1720.             throw new StreamCorruptedException("BigInteger: signum-magnitude mismatch");
  1721.          } else {
  1722.             this.bitCount = this.bitLength = -1;
  1723.             this.lowestSetBit = this.firstNonzeroByteNum = -2;
  1724.             this.mag = stripLeadingZeroBytes(this.magnitude);
  1725.             this.magnitude = null;
  1726.          }
  1727.       } else {
  1728.          throw new StreamCorruptedException("BigInteger: Invalid signum value");
  1729.       }
  1730.    }
  1731.  
  1732.    private synchronized Object writeReplace() {
  1733.       if (this.magnitude == null) {
  1734.          this.magnitude = this.magSerializedForm();
  1735.       }
  1736.  
  1737.       return this;
  1738.    }
  1739.  
  1740.    private byte[] magSerializedForm() {
  1741.       int var1 = this.mag.length == 0 ? 0 : (this.mag.length - 1 << 5) + bitLen(this.mag[0]);
  1742.       int var2 = (var1 + 7) / 8;
  1743.       byte[] var3 = new byte[var2];
  1744.       int var4 = var2 - 1;
  1745.       int var5 = 4;
  1746.       int var6 = this.mag.length - 1;
  1747.  
  1748.       for(int var7 = 0; var4 >= 0; --var4) {
  1749.          if (var5 == 4) {
  1750.             var7 = this.mag[var6--];
  1751.             var5 = 1;
  1752.          } else {
  1753.             var7 >>>= 8;
  1754.             ++var5;
  1755.          }
  1756.  
  1757.          var3[var4] = (byte)var7;
  1758.       }
  1759.  
  1760.       return var3;
  1761.    }
  1762.  
  1763.    static {
  1764.       for(int var0 = 1; var0 <= 16; ++var0) {
  1765.          int[] var1 = new int[]{var0};
  1766.          posConst[var0] = new BigInteger(var1, 1);
  1767.          negConst[var0] = new BigInteger(var1, -1);
  1768.       }
  1769.  
  1770.       ZERO = new BigInteger(new int[0], 0);
  1771.       ONE = valueOf(1L);
  1772.       TWO = valueOf(2L);
  1773.       bnExpModThreshTable = new int[]{7, 25, 81, 241, 673, 1793, Integer.MAX_VALUE};
  1774.       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};
  1775.       zeros = new String[64];
  1776.       zeros[63] = "000000000000000000000000000000000000000000000000000000000000000";
  1777.  
  1778.       for(int var2 = 0; var2 < 63; ++var2) {
  1779.          zeros[var2] = zeros[63].substring(0, var2);
  1780.       }
  1781.  
  1782.       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};
  1783.       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)};
  1784.    }
  1785. }
  1786.