home *** CD-ROM | disk | FTP | other *** search
- package symjava.math;
-
- public class BigInteger extends Number {
- private int signum;
- private long magnitude;
- private static final BigInteger ZERO = new BigInteger(0L);
- private static final int MAX_CONSTANT = 16;
- private static BigInteger[] posConst = new BigInteger[17];
- private static BigInteger[] negConst = new BigInteger[17];
- private static final BigInteger ONE;
- private static final BigInteger TWO;
- private static final char ZERO_CHAR;
-
- public BigInteger(String var1, int var2) throws NumberFormatException {
- int var3 = 0;
- if (var2 >= 2 && var2 <= 36) {
- if (var1.length() == 0) {
- throw new NumberFormatException("Zero length BigInteger");
- } else {
- this.signum = 1;
- if (var1.charAt(0) == '-') {
- if (var1.length() == 1) {
- throw new NumberFormatException("Zero length BigInteger");
- }
-
- this.signum = -1;
- var3 = 1;
- }
-
- while(var3 < var1.length() && var1.charAt(var3) == ZERO_CHAR) {
- ++var3;
- }
-
- if (var3 == var1.length()) {
- this.signum = 0;
- this.magnitude = 0L;
- } else {
- int var4 = var1.length() - var3;
- String var5 = var1.substring(var3, var3 + var4);
- this.magnitude = parseLong(var5, var2);
- }
- }
- } else {
- throw new NumberFormatException("Radix out of range");
- }
- }
-
- public BigInteger(String var1) throws NumberFormatException {
- this(var1, 10);
- }
-
- public static BigInteger valueOf(long var0) {
- return new BigInteger(var0);
- }
-
- private BigInteger(long var1) {
- this.magnitude = Math.abs(var1);
- this.signum = 1;
- if (var1 == 0L) {
- this.signum = 0;
- } else {
- if (var1 < 0L) {
- this.signum = -1;
- }
-
- }
- }
-
- public BigInteger add(BigInteger var1) throws ArithmeticException {
- if (var1.signum == 0) {
- return this;
- } else if (this.signum == 0) {
- return var1;
- } else if (var1.signum == this.signum) {
- BigInteger var2 = new BigInteger((this.magnitude + var1.magnitude) * (long)this.signum);
- if (var2.signum != this.signum) {
- throw new ArithmeticException("Overflow");
- } else {
- return var2;
- }
- } else {
- return new BigInteger(this.magnitude * (long)this.signum + var1.magnitude * (long)var1.signum);
- }
- }
-
- public BigInteger subtract(BigInteger var1) {
- return this.add(var1.negate());
- }
-
- public BigInteger multiply(BigInteger var1) throws ArithmeticException {
- if (var1.signum != 0 && this.signum != 0) {
- long var2 = this.magnitude * var1.magnitude;
- if (var2 / this.magnitude == var1.magnitude && var2 % this.magnitude == 0L) {
- return new BigInteger(var2 * (long)this.signum * (long)var1.signum);
- } else {
- throw new ArithmeticException("Overflow");
- }
- } else {
- return ZERO;
- }
- }
-
- public BigInteger divide(BigInteger var1) throws ArithmeticException {
- if (var1.signum == 0) {
- throw new ArithmeticException("BigInteger divide by zero");
- } else {
- return this.signum == 0 ? ZERO : new BigInteger(this.magnitude / var1.magnitude * (long)this.signum * (long)var1.signum);
- }
- }
-
- public BigInteger remainder(BigInteger var1) throws ArithmeticException {
- if (var1.signum == 0) {
- throw new ArithmeticException("BigInteger divide by zero");
- } else {
- return this.signum == 0 ? ZERO : new BigInteger(this.magnitude % var1.magnitude * (long)this.signum);
- }
- }
-
- public BigInteger[] divideAndRemainder(BigInteger var1) throws ArithmeticException {
- BigInteger[] var2 = new BigInteger[2];
- if (var1.signum == 0) {
- throw new ArithmeticException("BigInteger divide by zero");
- } else {
- if (this.signum == 0) {
- var2[0] = var2[1] = ZERO;
- } else {
- var2[0] = new BigInteger(this.magnitude / var1.magnitude * (long)this.signum * (long)var1.signum);
- var2[1] = new BigInteger(this.magnitude % var1.magnitude * (long)this.signum);
- }
-
- return var2;
- }
- }
-
- public boolean testBit(int var1) throws ArithmeticException {
- if (var1 < 0) {
- throw new ArithmeticException("Negative bit address");
- } else {
- return (this.magnitude >> var1 & 1L) != 0L;
- }
- }
-
- public BigInteger pow(int var1) throws ArithmeticException {
- if (var1 < 0) {
- throw new ArithmeticException("Negative exponent");
- } else if (this.signum == 0) {
- return this;
- } else {
- long var2 = (long)(var1 < 0 && (var1 & 1) == 1 ? -1 : 1);
- BigInteger var4 = new BigInteger(var2);
- BigInteger var3 = this;
-
- while(var1 != 0) {
- if ((var1 & 1) == 1) {
- var4 = var4.multiply(var3);
- }
-
- if ((var1 >>= 1) != 0) {
- var3 = (new BigInteger(var3.magnitude)).multiply(new BigInteger(var3.magnitude));
- }
- }
-
- return var4;
- }
- }
-
- public BigInteger abs() {
- return this.signum >= 0 ? this : this.negate();
- }
-
- public BigInteger negate() {
- return new BigInteger(this.magnitude * (long)(-this.signum));
- }
-
- public int signum() {
- return this.signum;
- }
-
- public int compareTo(BigInteger var1) {
- if (this.signum == var1.signum) {
- long var2 = this.magnitude;
- long var4 = var1.magnitude;
- return this.signum * (var2 < var4 ? -1 : (var2 > var4 ? 1 : 0));
- } else {
- return this.signum > var1.signum ? 1 : -1;
- }
- }
-
- private static int longCmp(long var0, long var2) {
- if (var0 < var2) {
- return -1;
- } else {
- return var0 > var2 ? 1 : 0;
- }
- }
-
- public boolean equals(Object var1) {
- if (!(var1 instanceof BigInteger)) {
- return false;
- } else {
- BigInteger var2 = (BigInteger)var1;
- if (var2.signum != this.signum) {
- return false;
- } else {
- return var2.magnitude == this.magnitude;
- }
- }
- }
-
- public BigInteger min(BigInteger var1) {
- return this.compareTo(var1) < 0 ? this : var1;
- }
-
- public BigInteger max(BigInteger var1) {
- return this.compareTo(var1) > 0 ? this : var1;
- }
-
- public int hashCode() {
- return (int)(37L * this.magnitude) * this.signum;
- }
-
- public String toString(int var1) {
- if (this.signum == 0) {
- return "0";
- } else {
- if (var1 < 2 || var1 > 36) {
- var1 = 10;
- }
-
- return Long.toString(this.magnitude * (long)this.signum);
- }
- }
-
- public String toString() {
- return this.toString(10);
- }
-
- public int intValue() {
- return (int)this.magnitude * this.signum;
- }
-
- public long longValue() {
- return this.magnitude * (long)this.signum;
- }
-
- public float floatValue() {
- return Float.valueOf(this.toString());
- }
-
- public double doubleValue() {
- return Double.valueOf(this.toString());
- }
-
- private static byte[] stripLeadingZeroBytes(byte[] var0) {
- int var1;
- for(var1 = 0; var1 < var0.length && var0[var1] == 0; ++var1) {
- }
-
- byte[] var2 = new byte[var0.length - var1];
-
- for(int var3 = var1; var3 < var0.length; ++var3) {
- var2[var3 - var1] = var0[var3];
- }
-
- return var2;
- }
-
- private static long parseLong(String var0, int var1) throws NumberFormatException {
- long var2 = Long.parseLong(var0, var1);
- String var4 = Long.toString(var2);
- if (!var4.equals(var0)) {
- throw new NumberFormatException(var0 + " exceeds maximum precision");
- } else {
- return var2;
- }
- }
-
- static {
- for(int var0 = 1; var0 <= 16; ++var0) {
- posConst[var0] = new BigInteger((long)var0);
- negConst[var0] = new BigInteger((long)(-var0));
- }
-
- ONE = valueOf(1L);
- TWO = valueOf(2L);
- ZERO_CHAR = Character.forDigit(0, 2);
- }
- }
-