home *** CD-ROM | disk | FTP | other *** search
- package java.math;
-
- class MutableBigInteger {
- int[] value;
- int intLen;
- int offset = 0;
- private static final long LONG_MASK = 4294967295L;
-
- MutableBigInteger() {
- this.value = new int[1];
- this.intLen = 0;
- }
-
- MutableBigInteger(int var1) {
- this.value = new int[1];
- this.intLen = 1;
- this.value[0] = var1;
- }
-
- MutableBigInteger(int[] var1, int var2) {
- this.value = var1;
- this.intLen = var2;
- }
-
- MutableBigInteger(int[] var1) {
- this.value = var1;
- this.intLen = var1.length;
- }
-
- MutableBigInteger(BigInteger var1) {
- this.value = (int[])var1.mag.clone();
- this.intLen = this.value.length;
- }
-
- MutableBigInteger(MutableBigInteger var1) {
- this.intLen = var1.intLen;
- this.value = new int[this.intLen];
-
- for(int var2 = 0; var2 < this.intLen; ++var2) {
- this.value[var2] = var1.value[var1.offset + var2];
- }
-
- }
-
- void clear() {
- this.offset = this.intLen = 0;
- int var1 = 0;
-
- for(int var2 = this.value.length; var1 < var2; ++var1) {
- this.value[var1] = 0;
- }
-
- }
-
- void reset() {
- this.offset = this.intLen = 0;
- }
-
- final int compare(MutableBigInteger var1) {
- if (this.intLen < var1.intLen) {
- return -1;
- } else if (this.intLen > var1.intLen) {
- return 1;
- } else {
- for(int var2 = 0; var2 < this.intLen; ++var2) {
- int var3 = this.value[this.offset + var2] + Integer.MIN_VALUE;
- int var4 = var1.value[var1.offset + var2] + Integer.MIN_VALUE;
- if (var3 < var4) {
- return -1;
- }
-
- if (var3 > var4) {
- return 1;
- }
- }
-
- return 0;
- }
- }
-
- private final int getLowestSetBit() {
- if (this.intLen == 0) {
- return -1;
- } else {
- int var1;
- for(var1 = this.intLen - 1; var1 > 0 && this.value[var1 + this.offset] == 0; --var1) {
- }
-
- int var2 = this.value[var1 + this.offset];
- return var2 == 0 ? -1 : (this.intLen - 1 - var1 << 5) + BigInteger.trailingZeroCnt(var2);
- }
- }
-
- private final int getInt(int var1) {
- return this.value[this.offset + var1];
- }
-
- private final long getLong(int var1) {
- return (long)this.value[this.offset + var1] & 4294967295L;
- }
-
- final void normalize() {
- if (this.intLen == 0) {
- this.offset = 0;
- } else {
- int var1 = this.offset;
- if (this.value[var1] == 0) {
- int var2 = var1 + this.intLen;
-
- do {
- ++var1;
- } while(var1 < var2 && this.value[var1] == 0);
-
- int var3 = var1 - this.offset;
- this.intLen -= var3;
- this.offset = this.intLen == 0 ? 0 : this.offset + var3;
- }
- }
- }
-
- private final void ensureCapacity(int var1) {
- if (this.value.length < var1) {
- this.value = new int[var1];
- this.offset = 0;
- this.intLen = var1;
- }
-
- }
-
- int[] toIntArray() {
- int[] var1 = new int[this.intLen];
-
- for(int var2 = 0; var2 < this.intLen; ++var2) {
- var1[var2] = this.value[this.offset + var2];
- }
-
- return var1;
- }
-
- void setInt(int var1, int var2) {
- this.value[this.offset + var1] = var2;
- }
-
- void setValue(int[] var1, int var2) {
- this.value = var1;
- this.intLen = var2;
- this.offset = 0;
- }
-
- void copyValue(MutableBigInteger var1) {
- int var2 = var1.intLen;
- if (this.value.length < var2) {
- this.value = new int[var2];
- }
-
- for(int var3 = 0; var3 < var2; ++var3) {
- this.value[var3] = var1.value[var1.offset + var3];
- }
-
- this.intLen = var2;
- this.offset = 0;
- }
-
- void copyValue(int[] var1) {
- int var2 = var1.length;
- if (this.value.length < var2) {
- this.value = new int[var2];
- }
-
- for(int var3 = 0; var3 < var2; ++var3) {
- this.value[var3] = var1[var3];
- }
-
- this.intLen = var2;
- this.offset = 0;
- }
-
- boolean isOne() {
- return this.intLen == 1 && this.value[this.offset] == 1;
- }
-
- boolean isZero() {
- return this.intLen == 0;
- }
-
- boolean isEven() {
- return this.intLen == 0 || (this.value[this.offset + this.intLen - 1] & 1) == 0;
- }
-
- boolean isOdd() {
- return (this.value[this.offset + this.intLen - 1] & 1) == 1;
- }
-
- boolean isNormal() {
- if (this.intLen + this.offset > this.value.length) {
- return false;
- } else if (this.intLen == 0) {
- return true;
- } else {
- return this.value[this.offset] != 0;
- }
- }
-
- public String toString() {
- BigInteger var1 = new BigInteger(this, 1);
- return var1.toString();
- }
-
- void rightShift(int var1) {
- if (this.intLen != 0) {
- int var2 = var1 >>> 5;
- int var3 = var1 & 31;
- this.intLen -= var2;
- if (var3 != 0) {
- int var4 = BigInteger.bitLen(this.value[this.offset]);
- if (var3 >= var4) {
- this.primitiveLeftShift(32 - var3);
- --this.intLen;
- } else {
- this.primitiveRightShift(var3);
- }
-
- }
- }
- }
-
- void leftShift(int var1) {
- if (this.intLen != 0) {
- int var2 = var1 >>> 5;
- int var3 = var1 & 31;
- int var4 = BigInteger.bitLen(this.value[this.offset]);
- if (var1 <= 32 - var4) {
- this.primitiveLeftShift(var3);
- } else {
- int var5 = this.intLen + var2 + 1;
- if (var3 <= 32 - var4) {
- --var5;
- }
-
- if (this.value.length < var5) {
- int[] var6 = new int[var5];
-
- for(int var7 = 0; var7 < this.intLen; ++var7) {
- var6[var7] = this.value[this.offset + var7];
- }
-
- this.setValue(var6, var5);
- } else if (this.value.length - this.offset >= var5) {
- for(int var8 = 0; var8 < var5 - this.intLen; ++var8) {
- this.value[this.offset + this.intLen + var8] = 0;
- }
- } else {
- for(int var9 = 0; var9 < this.intLen; ++var9) {
- this.value[var9] = this.value[this.offset + var9];
- }
-
- for(int var10 = this.intLen; var10 < var5; ++var10) {
- this.value[var10] = 0;
- }
-
- this.offset = 0;
- }
-
- this.intLen = var5;
- if (var3 != 0) {
- if (var3 <= 32 - var4) {
- this.primitiveLeftShift(var3);
- } else {
- this.primitiveRightShift(32 - var3);
- }
-
- }
- }
- }
- }
-
- private int divadd(int[] var1, int[] var2, int var3) {
- long var4 = 0L;
-
- for(int var6 = var1.length - 1; var6 >= 0; --var6) {
- long var7 = ((long)var1[var6] & 4294967295L) + ((long)var2[var6 + var3] & 4294967295L) + var4;
- var2[var6 + var3] = (int)var7;
- var4 = var7 >>> 32;
- }
-
- return (int)var4;
- }
-
- private int mulsub(int[] var1, int[] var2, int var3, int var4, int var5) {
- long var6 = (long)var3 & 4294967295L;
- long var8 = 0L;
- var5 += var4;
-
- for(int var10 = var4 - 1; var10 >= 0; --var10) {
- long var11 = ((long)var2[var10] & 4294967295L) * var6 + var8;
- long var13 = (long)var1[var5] - var11;
- var1[var5--] = (int)var13;
- var8 = (var11 >>> 32) + ((var13 & 4294967295L) > ((long)(~((int)var11)) & 4294967295L) ? 1L : 0L);
- }
-
- return (int)var8;
- }
-
- private final void primitiveRightShift(int var1) {
- int[] var2 = this.value;
- int var3 = 32 - var1;
- int var4 = this.offset + this.intLen - 1;
-
- for(int var5 = var2[var4]; var4 > this.offset; --var4) {
- int var6 = var5;
- var5 = var2[var4 - 1];
- var2[var4] = var5 << var3 | var6 >>> var1;
- }
-
- int var10001 = this.offset;
- var2[var10001] >>>= var1;
- }
-
- private final void primitiveLeftShift(int var1) {
- int[] var2 = this.value;
- int var3 = 32 - var1;
- int var4 = this.offset;
- int var5 = var2[var4];
-
- for(int var6 = var4 + this.intLen - 1; var4 < var6; ++var4) {
- int var7 = var5;
- var5 = var2[var4 + 1];
- var2[var4] = var7 << var1 | var5 >>> var3;
- }
-
- int var10001 = this.offset + this.intLen - 1;
- var2[var10001] <<= var1;
- }
-
- void add(MutableBigInteger var1) {
- int var2 = this.intLen;
- int var3 = var1.intLen;
- int var4 = this.intLen > var1.intLen ? this.intLen : var1.intLen;
- int[] var5 = this.value.length < var4 ? new int[var4] : this.value;
- int var6 = var5.length - 1;
-
- long var7;
- for(var7 = 0L; var2 > 0 && var3 > 0; var5[var6--] = (int)var7) {
- --var2;
- --var3;
- var7 = ((long)this.value[var2 + this.offset] & 4294967295L) + ((long)var1.value[var3 + var1.offset] & 4294967295L) + (var7 >>> 32);
- }
-
- while(var2 > 0) {
- --var2;
- var7 = ((long)this.value[var2 + this.offset] & 4294967295L) + (var7 >>> 32);
- var5[var6--] = (int)var7;
- }
-
- while(var3 > 0) {
- --var3;
- var7 = ((long)var1.value[var3 + var1.offset] & 4294967295L) + (var7 >>> 32);
- var5[var6--] = (int)var7;
- }
-
- if (var7 >>> 32 > 0L) {
- ++var4;
- if (var5.length < var4) {
- int[] var9 = new int[var4];
-
- for(int var10 = var4 - 1; var10 > 0; --var10) {
- var9[var10] = var5[var10 - 1];
- }
-
- var9[0] = 1;
- var5 = var9;
- } else {
- var5[var6--] = 1;
- }
- }
-
- this.value = var5;
- this.intLen = var4;
- this.offset = var5.length - var4;
- }
-
- int subtract(MutableBigInteger var1) {
- MutableBigInteger var2 = this;
- int[] var3 = this.value;
- int var4 = this.compare(var1);
- if (var4 == 0) {
- this.reset();
- return 0;
- } else {
- if (var4 < 0) {
- var2 = var1;
- var1 = this;
- }
-
- int var5 = var2.intLen;
- if (var3.length < var5) {
- var3 = new int[var5];
- }
-
- long var6 = 0L;
- int var8 = var2.intLen;
- int var9 = var1.intLen;
-
- int var10;
- for(var10 = var3.length - 1; var9 > 0; var3[var10--] = (int)var6) {
- --var8;
- --var9;
- var6 = ((long)var2.value[var8 + var2.offset] & 4294967295L) - ((long)var1.value[var9 + var1.offset] & 4294967295L) - (long)((int)(-(var6 >> 32)));
- }
-
- while(var8 > 0) {
- --var8;
- var6 = ((long)var2.value[var8 + var2.offset] & 4294967295L) - (long)((int)(-(var6 >> 32)));
- var3[var10--] = (int)var6;
- }
-
- this.value = var3;
- this.intLen = var5;
- this.offset = this.value.length - var5;
- this.normalize();
- return var4;
- }
- }
-
- private int difference(MutableBigInteger var1) {
- MutableBigInteger var2 = this;
- int var3 = this.compare(var1);
- if (var3 == 0) {
- return 0;
- } else {
- if (var3 < 0) {
- var2 = var1;
- var1 = this;
- }
-
- long var4 = 0L;
- int var6 = var2.intLen;
-
- for(int var7 = var1.intLen; var7 > 0; var2.value[var2.offset + var6] = (int)var4) {
- --var6;
- --var7;
- var4 = ((long)var2.value[var2.offset + var6] & 4294967295L) - ((long)var1.value[var1.offset + var7] & 4294967295L) - (long)((int)(-(var4 >> 32)));
- }
-
- while(var6 > 0) {
- --var6;
- var4 = ((long)var2.value[var2.offset + var6] & 4294967295L) - (long)((int)(-(var4 >> 32)));
- var2.value[var2.offset + var6] = (int)var4;
- }
-
- var2.normalize();
- return var3;
- }
- }
-
- void multiply(MutableBigInteger var1, MutableBigInteger var2) {
- int var3 = this.intLen;
- int var4 = var1.intLen;
- int var5 = var3 + var4;
- if (var2.value.length < var5) {
- var2.value = new int[var5];
- }
-
- var2.offset = 0;
- var2.intLen = var5;
- long var6 = 0L;
- int var8 = var4 - 1;
-
- for(int var9 = var4 + var3 - 1; var8 >= 0; --var9) {
- long var10 = ((long)var1.value[var8 + var1.offset] & 4294967295L) * ((long)this.value[var3 - 1 + this.offset] & 4294967295L) + var6;
- var2.value[var9] = (int)var10;
- var6 = var10 >>> 32;
- --var8;
- }
-
- var2.value[var3 - 1] = (int)var6;
-
- for(int var16 = var3 - 2; var16 >= 0; --var16) {
- var6 = 0L;
- int var11 = var4 - 1;
-
- for(int var12 = var4 + var16; var11 >= 0; --var12) {
- long var13 = ((long)var1.value[var11 + var1.offset] & 4294967295L) * ((long)this.value[var16 + this.offset] & 4294967295L) + ((long)var2.value[var12] & 4294967295L) + var6;
- var2.value[var12] = (int)var13;
- var6 = var13 >>> 32;
- --var11;
- }
-
- var2.value[var16] = (int)var6;
- }
-
- var2.normalize();
- }
-
- void mul(int var1, MutableBigInteger var2) {
- if (var1 == 1) {
- var2.copyValue(this);
- } else if (var1 == 0) {
- var2.clear();
- } else {
- long var3 = (long)var1 & 4294967295L;
- int[] var5 = var2.value.length < this.intLen + 1 ? new int[this.intLen + 1] : var2.value;
- long var6 = 0L;
-
- for(int var8 = this.intLen - 1; var8 >= 0; --var8) {
- long var9 = var3 * ((long)this.value[var8 + this.offset] & 4294967295L) + var6;
- var5[var8 + 1] = (int)var9;
- var6 = var9 >>> 32;
- }
-
- if (var6 == 0L) {
- var2.offset = 1;
- var2.intLen = this.intLen;
- } else {
- var2.offset = 0;
- var2.intLen = this.intLen + 1;
- var5[0] = (int)var6;
- }
-
- var2.value = var5;
- }
- }
-
- void divideOneWord(int var1, MutableBigInteger var2) {
- long var3 = (long)var1 & 4294967295L;
- if (this.intLen == 1) {
- long var13 = (long)this.value[this.offset] & 4294967295L;
- var2.value[0] = (int)(var13 / var3);
- var2.intLen = var2.value[0] == 0 ? 0 : 1;
- var2.offset = 0;
- this.value[0] = (int)(var13 - (long)var2.value[0] * var3);
- this.offset = 0;
- this.intLen = this.value[0] == 0 ? 0 : 1;
- } else {
- if (var2.value.length < this.intLen) {
- var2.value = new int[this.intLen];
- }
-
- var2.offset = 0;
- var2.intLen = this.intLen;
- int var5 = 32 - BigInteger.bitLen(var1);
- int var6 = this.value[this.offset];
- long var7 = (long)var6 & 4294967295L;
- if (var7 < var3) {
- var2.value[0] = 0;
- } else {
- var2.value[0] = (int)(var7 / var3);
- var6 = (int)(var7 - (long)var2.value[0] * var3);
- var7 = (long)var6 & 4294967295L;
- }
-
- int var9 = this.intLen;
- int[] var10 = new int[2];
-
- while(true) {
- --var9;
- if (var9 <= 0) {
- if (var5 > 0) {
- this.value[0] = var6 % var1;
- } else {
- this.value[0] = var6;
- }
-
- this.intLen = this.value[0] == 0 ? 0 : 1;
- var2.normalize();
- return;
- }
-
- long var11 = var7 << 32 | (long)this.value[this.offset + this.intLen - var9] & 4294967295L;
- if (var11 >= 0L) {
- var10[0] = (int)(var11 / var3);
- var10[1] = (int)(var11 - (long)var10[0] * var3);
- } else {
- this.divWord(var10, var11, var1);
- }
-
- var2.value[this.intLen - var9] = var10[0];
- var6 = var10[1];
- var7 = (long)var6 & 4294967295L;
- }
- }
- }
-
- void divide(MutableBigInteger var1, MutableBigInteger var2, MutableBigInteger var3) {
- if (var1.intLen == 0) {
- throw new ArithmeticException("BigInteger divide by zero");
- } else if (this.intLen == 0) {
- var2.intLen = var2.offset = var3.intLen = var3.offset = 0;
- } else {
- int var4 = this.compare(var1);
- if (var4 < 0) {
- var2.intLen = var2.offset = 0;
- var3.copyValue(this);
- } else if (var4 == 0) {
- var2.value[0] = var2.intLen = 1;
- var2.offset = var3.intLen = var3.offset = 0;
- } else {
- var2.clear();
- if (var1.intLen == 1) {
- var3.copyValue(this);
- var3.divideOneWord(var1.value[var1.offset], var2);
- } else {
- int[] var5 = new int[var1.intLen];
-
- for(int var6 = 0; var6 < var1.intLen; ++var6) {
- var5[var6] = var1.value[var1.offset + var6];
- }
-
- int var7 = var1.intLen;
- if (var3.value.length < this.intLen + 1) {
- var3.value = new int[this.intLen + 1];
- }
-
- for(int var8 = 0; var8 < this.intLen; ++var8) {
- var3.value[var8 + 1] = this.value[var8 + this.offset];
- }
-
- var3.intLen = this.intLen;
- var3.offset = 1;
- int var9 = var3.intLen;
- int var10 = var9 - var7 + 1;
- if (var2.value.length < var10) {
- var2.value = new int[var10];
- var2.offset = 0;
- }
-
- var2.intLen = var10;
- int[] var11 = var2.value;
- int var12 = 32 - BigInteger.bitLen(var5[0]);
- if (var12 > 0) {
- BigInteger.primitiveLeftShift(var5, var7, var12);
- var3.leftShift(var12);
- }
-
- if (var3.intLen == var9) {
- var3.offset = 0;
- var3.value[0] = 0;
- ++var3.intLen;
- }
-
- int var13 = var5[0];
- long var14 = (long)var13 & 4294967295L;
- int var16 = var5[1];
- int[] var17 = new int[2];
-
- for(int var18 = 0; var18 < var10; ++var18) {
- int var19 = 0;
- int var20 = 0;
- boolean var21 = false;
- int var22 = var3.value[var18 + var3.offset];
- int var23 = var22 + Integer.MIN_VALUE;
- int var24 = var3.value[var18 + 1 + var3.offset];
- if (var22 == var13) {
- var19 = -1;
- var20 = var22 + var24;
- var21 = var20 + Integer.MIN_VALUE < var23;
- } else {
- long var25 = (long)var22 << 32 | (long)var24 & 4294967295L;
- if (var25 >= 0L) {
- var19 = (int)(var25 / var14);
- var20 = (int)(var25 - (long)var19 * var14);
- } else {
- this.divWord(var17, var25, var13);
- var19 = var17[0];
- var20 = var17[1];
- }
- }
-
- if (var19 != 0) {
- if (!var21) {
- long var34 = (long)var3.value[var18 + 2 + var3.offset] & 4294967295L;
- long var27 = ((long)var20 & 4294967295L) << 32 | var34;
- long var29 = ((long)var16 & 4294967295L) * ((long)var19 & 4294967295L);
- if (this.unsignedLongCompare(var29, var27)) {
- --var19;
- var20 = (int)(((long)var20 & 4294967295L) + var14);
- if (((long)var20 & 4294967295L) >= var14) {
- var29 = ((long)var16 & 4294967295L) * ((long)var19 & 4294967295L);
- var27 = ((long)var20 & 4294967295L) << 32 | var34;
- if (this.unsignedLongCompare(var29, var27)) {
- --var19;
- }
- }
- }
- }
-
- var3.value[var18 + var3.offset] = 0;
- int var35 = this.mulsub(var3.value, var5, var19, var7, var18 + var3.offset);
- if (var35 + Integer.MIN_VALUE > var23) {
- this.divadd(var5, var3.value, var18 + 1 + var3.offset);
- --var19;
- }
-
- var11[var18] = var19;
- }
- }
-
- if (var12 > 0) {
- var3.rightShift(var12);
- }
-
- var3.normalize();
- var2.normalize();
- }
- }
- }
- }
-
- private boolean unsignedLongCompare(long var1, long var3) {
- return var1 + Long.MIN_VALUE > var3 + Long.MIN_VALUE;
- }
-
- private void divWord(int[] var1, long var2, int var4) {
- long var5 = (long)var4 & 4294967295L;
- if (var5 == 1L) {
- var1[0] = (int)var2;
- var1[1] = 0;
- } else {
- long var7 = (var2 >>> 1) / (var5 >>> 1);
-
- long var9;
- for(var9 = var2 - var7 * var5; var9 < 0L; --var7) {
- var9 += var5;
- }
-
- while(var9 >= var5) {
- var9 -= var5;
- ++var7;
- }
-
- var1[0] = (int)var7;
- var1[1] = (int)var9;
- }
- }
-
- MutableBigInteger hybridGCD(MutableBigInteger var1) {
- MutableBigInteger var2 = this;
- MutableBigInteger var3 = new MutableBigInteger();
-
- MutableBigInteger var5;
- for(MutableBigInteger var4 = new MutableBigInteger(); var1.intLen != 0; var4 = var5) {
- if (Math.abs(var2.intLen - var1.intLen) < 2) {
- return var2.binaryGCD(var1);
- }
-
- var2.divide(var1, var3, var4);
- var5 = var2;
- var2 = var1;
- var1 = var4;
- }
-
- return var2;
- }
-
- private MutableBigInteger binaryGCD(MutableBigInteger var1) {
- MutableBigInteger var2 = this;
- new MutableBigInteger();
- MutableBigInteger var4 = new MutableBigInteger();
- int var5 = this.getLowestSetBit();
- int var6 = var1.getLowestSetBit();
- int var7 = var5 < var6 ? var5 : var6;
- if (var7 != 0) {
- this.rightShift(var7);
- var1.rightShift(var7);
- }
-
- boolean var8 = var7 == var5;
- MutableBigInteger var9 = var8 ? var1 : this;
-
- int var11;
- for(int var10 = var8 ? -1 : 1; (var11 = var9.getLowestSetBit()) >= 0; var9 = var10 >= 0 ? var2 : var1) {
- var9.rightShift(var11);
- if (var10 > 0) {
- var2 = var9;
- } else {
- var1 = var9;
- }
-
- if (var2.intLen < 2 && var1.intLen < 2) {
- int var12 = var2.value[var2.offset];
- int var13 = var1.value[var1.offset];
- var12 = binaryGcd(var12, var13);
- var4.value[0] = var12;
- var4.intLen = 1;
- var4.offset = 0;
- if (var7 > 0) {
- var4.leftShift(var7);
- }
-
- return var4;
- }
-
- if ((var10 = var2.difference(var1)) == 0) {
- break;
- }
- }
-
- if (var7 > 0) {
- var2.leftShift(var7);
- }
-
- return var2;
- }
-
- static int binaryGcd(int var0, int var1) {
- if (var1 == 0) {
- return var0;
- } else if (var0 == 0) {
- return var1;
- } else {
- int var2;
- int var3;
- for(var3 = 0; (var2 = var0 & 255) == 0; var3 += 8) {
- var0 >>>= 8;
- }
-
- byte var4 = BigInteger.trailingZeroTable[var2];
- var3 += var4;
- var0 >>>= var4;
-
- int var5;
- for(var5 = 0; (var2 = var1 & 255) == 0; var5 += 8) {
- var1 >>>= 8;
- }
-
- var4 = BigInteger.trailingZeroTable[var2];
- var5 += var4;
- var1 >>>= var4;
- int var6 = var3 < var5 ? var3 : var5;
-
- while(var0 != var1) {
- if (var0 + Integer.MIN_VALUE > var1 + Integer.MIN_VALUE) {
- for(var0 -= var1; (var2 = var0 & 255) == 0; var0 >>>= 8) {
- }
-
- var0 >>>= BigInteger.trailingZeroTable[var2];
- } else {
- for(var1 -= var0; (var2 = var1 & 255) == 0; var1 >>>= 8) {
- }
-
- var1 >>>= BigInteger.trailingZeroTable[var2];
- }
- }
-
- return var0 << var6;
- }
- }
-
- MutableBigInteger mutableModInverse(MutableBigInteger var1) {
- if (var1.isOdd()) {
- return this.modInverse(var1);
- } else if (this.isEven()) {
- throw new ArithmeticException("BigInteger not invertible.");
- } else {
- int var2 = var1.getLowestSetBit();
- MutableBigInteger var3 = new MutableBigInteger(var1);
- var3.rightShift(var2);
- if (var3.isOne()) {
- return this.modInverseMP2(var2);
- } else {
- MutableBigInteger var4 = this.modInverse(var3);
- MutableBigInteger var5 = this.modInverseMP2(var2);
- MutableBigInteger var6 = modInverseBP2(var3, var2);
- MutableBigInteger var7 = var3.modInverseMP2(var2);
- MutableBigInteger var8 = new MutableBigInteger();
- MutableBigInteger var9 = new MutableBigInteger();
- MutableBigInteger var10 = new MutableBigInteger();
- var4.leftShift(var2);
- var4.multiply(var6, var10);
- var5.multiply(var3, var8);
- var8.multiply(var7, var9);
- var10.add(var9);
- var10.divide(var1, var8, var9);
- return var9;
- }
- }
- }
-
- MutableBigInteger modInverseMP2(int var1) {
- if (this.isEven()) {
- throw new ArithmeticException("Non-invertible. (GCD != 1)");
- } else if (var1 > 64) {
- return this.euclidModInverse(var1);
- } else {
- int var2 = inverseMod32(this.value[this.offset + this.intLen - 1]);
- if (var1 < 33) {
- var2 = var1 == 32 ? var2 : var2 & (1 << var1) - 1;
- return new MutableBigInteger(var2);
- } else {
- long var3 = (long)this.value[this.offset + this.intLen - 1] & 4294967295L;
- if (this.intLen > 1) {
- var3 |= (long)this.value[this.offset + this.intLen - 2] << 32;
- }
-
- long var5 = (long)var2 & 4294967295L;
- var5 *= 2L - var3 * var5;
- var5 = var1 == 64 ? var5 : var5 & (1L << var1) - 1L;
- MutableBigInteger var7 = new MutableBigInteger(new int[2]);
- var7.value[0] = (int)(var5 >>> 32);
- var7.value[1] = (int)var5;
- var7.intLen = 2;
- var7.normalize();
- return var7;
- }
- }
- }
-
- static int inverseMod32(int var0) {
- int var1 = var0 * (2 - var0 * var0);
- var1 *= 2 - var0 * var1;
- var1 *= 2 - var0 * var1;
- var1 *= 2 - var0 * var1;
- return var1;
- }
-
- static MutableBigInteger modInverseBP2(MutableBigInteger var0, int var1) {
- return fixup(new MutableBigInteger(1), new MutableBigInteger(var0), var1);
- }
-
- private MutableBigInteger modInverse(MutableBigInteger var1) {
- MutableBigInteger var2 = new MutableBigInteger(var1);
- MutableBigInteger var3 = new MutableBigInteger(this);
- MutableBigInteger var4 = new MutableBigInteger(var2);
- SignedMutableBigInteger var5 = new SignedMutableBigInteger(1);
- SignedMutableBigInteger var6 = new SignedMutableBigInteger();
- Object var7 = null;
- Object var8 = null;
- int var9 = 0;
- if (var3.isEven()) {
- int var10 = var3.getLowestSetBit();
- var3.rightShift(var10);
- ((MutableBigInteger)var6).leftShift(var10);
- var9 = var10;
- }
-
- while(!var3.isOne()) {
- if (var3.isZero()) {
- throw new ArithmeticException("BigInteger not invertible.");
- }
-
- if (var3.compare(var4) < 0) {
- MutableBigInteger var11 = var3;
- var3 = var4;
- var4 = var11;
- SignedMutableBigInteger var12 = var6;
- var6 = var5;
- var5 = var12;
- }
-
- if (((var3.value[var3.offset + var3.intLen - 1] ^ var4.value[var4.offset + var4.intLen - 1]) & 3) == 0) {
- var3.subtract(var4);
- var5.signedSubtract(var6);
- } else {
- var3.add(var4);
- var5.signedAdd(var6);
- }
-
- int var13 = var3.getLowestSetBit();
- var3.rightShift(var13);
- ((MutableBigInteger)var6).leftShift(var13);
- var9 += var13;
- }
-
- while(var5.sign < 0) {
- var5.signedAdd(var2);
- }
-
- return fixup(var5, var2, var9);
- }
-
- static MutableBigInteger fixup(MutableBigInteger var0, MutableBigInteger var1, int var2) {
- MutableBigInteger var3 = new MutableBigInteger();
- int var4 = -inverseMod32(var1.value[var1.offset + var1.intLen - 1]);
- int var5 = 0;
-
- for(int var6 = var2 >> 5; var5 < var6; ++var5) {
- int var7 = var4 * var0.value[var0.offset + var0.intLen - 1];
- var1.mul(var7, var3);
- var0.add(var3);
- --var0.intLen;
- }
-
- int var9 = var2 & 31;
- if (var9 != 0) {
- int var8 = var4 * var0.value[var0.offset + var0.intLen - 1];
- var8 &= (1 << var9) - 1;
- var1.mul(var8, var3);
- var0.add(var3);
- var0.rightShift(var9);
- }
-
- while(var0.compare(var1) >= 0) {
- var0.subtract(var1);
- }
-
- return var0;
- }
-
- MutableBigInteger euclidModInverse(int var1) {
- MutableBigInteger var2 = new MutableBigInteger(1);
- var2.leftShift(var1);
- MutableBigInteger var3 = new MutableBigInteger(var2);
- MutableBigInteger var4 = new MutableBigInteger(this);
- MutableBigInteger var5 = new MutableBigInteger();
- MutableBigInteger var6 = new MutableBigInteger();
- var2.divide(var4, var5, var6);
- MutableBigInteger var7 = var2;
- var2 = var6;
- var6 = var7;
- MutableBigInteger var8 = new MutableBigInteger(var5);
- MutableBigInteger var9 = new MutableBigInteger(1);
- MutableBigInteger var10 = new MutableBigInteger();
-
- while(!var2.isOne()) {
- var4.divide(var2, var5, var6);
- if (var6.intLen == 0) {
- throw new ArithmeticException("BigInteger not invertible.");
- }
-
- var7 = var6;
- var6 = var4;
- var4 = var7;
- if (var5.intLen == 1) {
- var8.mul(var5.value[var5.offset], var10);
- } else {
- var5.multiply(var8, var10);
- }
-
- var7 = var5;
- var5 = var10;
- var10 = var7;
- var9.add(var5);
- if (var4.isOne()) {
- return var9;
- }
-
- var2.divide(var4, var5, var6);
- if (var6.intLen == 0) {
- throw new ArithmeticException("BigInteger not invertible.");
- }
-
- var7 = var2;
- var2 = var6;
- var6 = var7;
- if (var5.intLen == 1) {
- var9.mul(var5.value[var5.offset], var10);
- } else {
- var5.multiply(var9, var10);
- }
-
- var7 = var5;
- var5 = var10;
- var10 = var7;
- var8.add(var5);
- }
-
- var3.subtract(var8);
- return var3;
- }
- }
-