home *** CD-ROM | disk | FTP | other *** search
/ Symantec Visual Cafe for Java 2.5 / symantec-visual-cafe-2.5-database-dev-edition.iso / Visual Cafe Pro v1.0 / VISCAFE.BIN / SQL.ZIP / symjava / math / BigInteger.class (.txt) < prev   
Encoding:
Java Class File  |  1997-06-11  |  4.2 KB  |  289 lines

  1. package symjava.math;
  2.  
  3. public class BigInteger extends Number {
  4.    private int signum;
  5.    private long magnitude;
  6.    private static final BigInteger ZERO = new BigInteger(0L);
  7.    private static final int MAX_CONSTANT = 16;
  8.    private static BigInteger[] posConst = new BigInteger[17];
  9.    private static BigInteger[] negConst = new BigInteger[17];
  10.    private static final BigInteger ONE;
  11.    private static final BigInteger TWO;
  12.    private static final char ZERO_CHAR;
  13.  
  14.    public BigInteger(String var1, int var2) throws NumberFormatException {
  15.       int var3 = 0;
  16.       if (var2 >= 2 && var2 <= 36) {
  17.          if (var1.length() == 0) {
  18.             throw new NumberFormatException("Zero length BigInteger");
  19.          } else {
  20.             this.signum = 1;
  21.             if (var1.charAt(0) == '-') {
  22.                if (var1.length() == 1) {
  23.                   throw new NumberFormatException("Zero length BigInteger");
  24.                }
  25.  
  26.                this.signum = -1;
  27.                var3 = 1;
  28.             }
  29.  
  30.             while(var3 < var1.length() && var1.charAt(var3) == ZERO_CHAR) {
  31.                ++var3;
  32.             }
  33.  
  34.             if (var3 == var1.length()) {
  35.                this.signum = 0;
  36.                this.magnitude = 0L;
  37.             } else {
  38.                int var4 = var1.length() - var3;
  39.                String var5 = var1.substring(var3, var3 + var4);
  40.                this.magnitude = parseLong(var5, var2);
  41.             }
  42.          }
  43.       } else {
  44.          throw new NumberFormatException("Radix out of range");
  45.       }
  46.    }
  47.  
  48.    public BigInteger(String var1) throws NumberFormatException {
  49.       this(var1, 10);
  50.    }
  51.  
  52.    public static BigInteger valueOf(long var0) {
  53.       return new BigInteger(var0);
  54.    }
  55.  
  56.    private BigInteger(long var1) {
  57.       this.magnitude = Math.abs(var1);
  58.       this.signum = 1;
  59.       if (var1 == 0L) {
  60.          this.signum = 0;
  61.       } else {
  62.          if (var1 < 0L) {
  63.             this.signum = -1;
  64.          }
  65.  
  66.       }
  67.    }
  68.  
  69.    public BigInteger add(BigInteger var1) throws ArithmeticException {
  70.       if (var1.signum == 0) {
  71.          return this;
  72.       } else if (this.signum == 0) {
  73.          return var1;
  74.       } else if (var1.signum == this.signum) {
  75.          BigInteger var2 = new BigInteger((this.magnitude + var1.magnitude) * (long)this.signum);
  76.          if (var2.signum != this.signum) {
  77.             throw new ArithmeticException("Overflow");
  78.          } else {
  79.             return var2;
  80.          }
  81.       } else {
  82.          return new BigInteger(this.magnitude * (long)this.signum + var1.magnitude * (long)var1.signum);
  83.       }
  84.    }
  85.  
  86.    public BigInteger subtract(BigInteger var1) {
  87.       return this.add(var1.negate());
  88.    }
  89.  
  90.    public BigInteger multiply(BigInteger var1) throws ArithmeticException {
  91.       if (var1.signum != 0 && this.signum != 0) {
  92.          long var2 = this.magnitude * var1.magnitude;
  93.          if (var2 / this.magnitude == var1.magnitude && var2 % this.magnitude == 0L) {
  94.             return new BigInteger(var2 * (long)this.signum * (long)var1.signum);
  95.          } else {
  96.             throw new ArithmeticException("Overflow");
  97.          }
  98.       } else {
  99.          return ZERO;
  100.       }
  101.    }
  102.  
  103.    public BigInteger divide(BigInteger var1) throws ArithmeticException {
  104.       if (var1.signum == 0) {
  105.          throw new ArithmeticException("BigInteger divide by zero");
  106.       } else {
  107.          return this.signum == 0 ? ZERO : new BigInteger(this.magnitude / var1.magnitude * (long)this.signum * (long)var1.signum);
  108.       }
  109.    }
  110.  
  111.    public BigInteger remainder(BigInteger var1) throws ArithmeticException {
  112.       if (var1.signum == 0) {
  113.          throw new ArithmeticException("BigInteger divide by zero");
  114.       } else {
  115.          return this.signum == 0 ? ZERO : new BigInteger(this.magnitude % var1.magnitude * (long)this.signum);
  116.       }
  117.    }
  118.  
  119.    public BigInteger[] divideAndRemainder(BigInteger var1) throws ArithmeticException {
  120.       BigInteger[] var2 = new BigInteger[2];
  121.       if (var1.signum == 0) {
  122.          throw new ArithmeticException("BigInteger divide by zero");
  123.       } else {
  124.          if (this.signum == 0) {
  125.             var2[0] = var2[1] = ZERO;
  126.          } else {
  127.             var2[0] = new BigInteger(this.magnitude / var1.magnitude * (long)this.signum * (long)var1.signum);
  128.             var2[1] = new BigInteger(this.magnitude % var1.magnitude * (long)this.signum);
  129.          }
  130.  
  131.          return var2;
  132.       }
  133.    }
  134.  
  135.    public boolean testBit(int var1) throws ArithmeticException {
  136.       if (var1 < 0) {
  137.          throw new ArithmeticException("Negative bit address");
  138.       } else {
  139.          return (this.magnitude >> var1 & 1L) != 0L;
  140.       }
  141.    }
  142.  
  143.    public BigInteger pow(int var1) throws ArithmeticException {
  144.       if (var1 < 0) {
  145.          throw new ArithmeticException("Negative exponent");
  146.       } else if (this.signum == 0) {
  147.          return this;
  148.       } else {
  149.          long var2 = (long)(var1 < 0 && (var1 & 1) == 1 ? -1 : 1);
  150.          BigInteger var4 = new BigInteger(var2);
  151.          BigInteger var3 = this;
  152.  
  153.          while(var1 != 0) {
  154.             if ((var1 & 1) == 1) {
  155.                var4 = var4.multiply(var3);
  156.             }
  157.  
  158.             if ((var1 >>= 1) != 0) {
  159.                var3 = (new BigInteger(var3.magnitude)).multiply(new BigInteger(var3.magnitude));
  160.             }
  161.          }
  162.  
  163.          return var4;
  164.       }
  165.    }
  166.  
  167.    public BigInteger abs() {
  168.       return this.signum >= 0 ? this : this.negate();
  169.    }
  170.  
  171.    public BigInteger negate() {
  172.       return new BigInteger(this.magnitude * (long)(-this.signum));
  173.    }
  174.  
  175.    public int signum() {
  176.       return this.signum;
  177.    }
  178.  
  179.    public int compareTo(BigInteger var1) {
  180.       if (this.signum == var1.signum) {
  181.          long var2 = this.magnitude;
  182.          long var4 = var1.magnitude;
  183.          return this.signum * (var2 < var4 ? -1 : (var2 > var4 ? 1 : 0));
  184.       } else {
  185.          return this.signum > var1.signum ? 1 : -1;
  186.       }
  187.    }
  188.  
  189.    private static int longCmp(long var0, long var2) {
  190.       if (var0 < var2) {
  191.          return -1;
  192.       } else {
  193.          return var0 > var2 ? 1 : 0;
  194.       }
  195.    }
  196.  
  197.    public boolean equals(Object var1) {
  198.       if (!(var1 instanceof BigInteger)) {
  199.          return false;
  200.       } else {
  201.          BigInteger var2 = (BigInteger)var1;
  202.          if (var2.signum != this.signum) {
  203.             return false;
  204.          } else {
  205.             return var2.magnitude == this.magnitude;
  206.          }
  207.       }
  208.    }
  209.  
  210.    public BigInteger min(BigInteger var1) {
  211.       return this.compareTo(var1) < 0 ? this : var1;
  212.    }
  213.  
  214.    public BigInteger max(BigInteger var1) {
  215.       return this.compareTo(var1) > 0 ? this : var1;
  216.    }
  217.  
  218.    public int hashCode() {
  219.       return (int)(37L * this.magnitude) * this.signum;
  220.    }
  221.  
  222.    public String toString(int var1) {
  223.       if (this.signum == 0) {
  224.          return "0";
  225.       } else {
  226.          if (var1 < 2 || var1 > 36) {
  227.             var1 = 10;
  228.          }
  229.  
  230.          return Long.toString(this.magnitude * (long)this.signum);
  231.       }
  232.    }
  233.  
  234.    public String toString() {
  235.       return this.toString(10);
  236.    }
  237.  
  238.    public int intValue() {
  239.       return (int)this.magnitude * this.signum;
  240.    }
  241.  
  242.    public long longValue() {
  243.       return this.magnitude * (long)this.signum;
  244.    }
  245.  
  246.    public float floatValue() {
  247.       return Float.valueOf(this.toString());
  248.    }
  249.  
  250.    public double doubleValue() {
  251.       return Double.valueOf(this.toString());
  252.    }
  253.  
  254.    private static byte[] stripLeadingZeroBytes(byte[] var0) {
  255.       int var1;
  256.       for(var1 = 0; var1 < var0.length && var0[var1] == 0; ++var1) {
  257.       }
  258.  
  259.       byte[] var2 = new byte[var0.length - var1];
  260.  
  261.       for(int var3 = var1; var3 < var0.length; ++var3) {
  262.          var2[var3 - var1] = var0[var3];
  263.       }
  264.  
  265.       return var2;
  266.    }
  267.  
  268.    private static long parseLong(String var0, int var1) throws NumberFormatException {
  269.       long var2 = Long.parseLong(var0, var1);
  270.       String var4 = Long.toString(var2);
  271.       if (!var4.equals(var0)) {
  272.          throw new NumberFormatException(var0 + " exceeds maximum precision");
  273.       } else {
  274.          return var2;
  275.       }
  276.    }
  277.  
  278.    static {
  279.       for(int var0 = 1; var0 <= 16; ++var0) {
  280.          posConst[var0] = new BigInteger((long)var0);
  281.          negConst[var0] = new BigInteger((long)(-var0));
  282.       }
  283.  
  284.       ONE = valueOf(1L);
  285.       TWO = valueOf(2L);
  286.       ZERO_CHAR = Character.forDigit(0, 2);
  287.    }
  288. }
  289.