home *** CD-ROM | disk | FTP | other *** search
/ PC Pro 1999 April / DPPCPRO0499.ISO / April / Notes / 50b2wic.exe / DATA1.CAB / NotesProgramFilesJavaSupport / rt.jar / java / lang / FDBigInt.class (.txt) < prev    next >
Encoding:
Java Class File  |  1998-04-23  |  5.0 KB  |  359 lines

  1. package java.lang;
  2.  
  3. class FDBigInt {
  4.    int nWords;
  5.    int[] data;
  6.    private static boolean debugging;
  7.  
  8.    public static void setDebugging(boolean var0) {
  9.       debugging = var0;
  10.    }
  11.  
  12.    public FDBigInt(int var1) {
  13.       this.nWords = 1;
  14.       this.data = new int[1];
  15.       this.data[0] = var1;
  16.    }
  17.  
  18.    public FDBigInt(long var1) {
  19.       this.data = new int[2];
  20.       this.data[0] = (int)var1;
  21.       this.data[1] = (int)(var1 >>> 32);
  22.       this.nWords = this.data[1] == 0 ? 1 : 2;
  23.    }
  24.  
  25.    public FDBigInt(FDBigInt var1) {
  26.       this.data = new int[this.nWords = var1.nWords];
  27.       System.arraycopy(var1.data, 0, this.data, 0, this.nWords);
  28.    }
  29.  
  30.    private FDBigInt(int[] var1, int var2) {
  31.       this.data = var1;
  32.       this.nWords = var2;
  33.    }
  34.  
  35.    public void lshiftMe(int var1) throws IllegalArgumentException {
  36.       if (var1 <= 0) {
  37.          if (var1 != 0) {
  38.             throw new IllegalArgumentException("negative shift count");
  39.          }
  40.       } else {
  41.          int var2 = var1 >> 5;
  42.          int var3 = var1 & 31;
  43.          int var4 = 32 - var3;
  44.          int[] var5 = this.data;
  45.          int[] var6 = this.data;
  46.          if (this.nWords + var2 + 1 > var5.length) {
  47.             var5 = new int[this.nWords + var2 + 1];
  48.          }
  49.  
  50.          int var7 = this.nWords + var2;
  51.          int var8 = this.nWords - 1;
  52.          if (var3 == 0) {
  53.             System.arraycopy(var6, 0, var5, var2, this.nWords);
  54.             var7 = var2 - 1;
  55.          } else {
  56.             int var11;
  57.             int var10002;
  58.             for(var5[var7--] = var6[var8] >>> var4; var8 >= 1; var5[var11] = var10002 | var6[var8] >>> var4) {
  59.                var11 = var7--;
  60.                var10002 = var6[var8] << var3;
  61.                --var8;
  62.             }
  63.  
  64.             var5[var7--] = var6[var8] << var3;
  65.          }
  66.  
  67.          while(var7 >= 0) {
  68.             var5[var7--] = 0;
  69.          }
  70.  
  71.          this.data = var5;
  72.  
  73.          for(this.nWords += var2 + 1; this.nWords > 1 && this.data[this.nWords - 1] == 0; --this.nWords) {
  74.          }
  75.  
  76.       }
  77.    }
  78.  
  79.    public int normalizeMe() throws IllegalArgumentException {
  80.       int var2 = 0;
  81.       int var3 = 0;
  82.       int var4 = 0;
  83.  
  84.       int var1;
  85.       for(var1 = this.nWords - 1; var1 >= 0 && (var4 = this.data[var1]) == 0; --var1) {
  86.          ++var2;
  87.       }
  88.  
  89.       if (var1 < 0) {
  90.          throw new IllegalArgumentException("zero value");
  91.       } else {
  92.          this.nWords -= var2;
  93.          if ((var4 & -268435456) != 0) {
  94.             for(var3 = 32; (var4 & -268435456) != 0; --var3) {
  95.                var4 >>>= 1;
  96.             }
  97.          } else {
  98.             while(var4 <= 1048575) {
  99.                var4 <<= 8;
  100.                var3 += 8;
  101.             }
  102.  
  103.             while(var4 <= 134217727) {
  104.                var4 <<= 1;
  105.                ++var3;
  106.             }
  107.          }
  108.  
  109.          if (var3 != 0) {
  110.             this.lshiftMe(var3);
  111.          }
  112.  
  113.          return var3;
  114.       }
  115.    }
  116.  
  117.    public FDBigInt mult(int var1) {
  118.       long var2 = (long)var1;
  119.       int[] var4 = new int[var2 * ((long)this.data[this.nWords - 1] & 4294967295L) > 268435455L ? this.nWords + 1 : this.nWords];
  120.       long var5 = 0L;
  121.  
  122.       for(int var7 = 0; var7 < this.nWords; ++var7) {
  123.          var5 += var2 * ((long)this.data[var7] & 4294967295L);
  124.          var4[var7] = (int)var5;
  125.          var5 >>>= 32;
  126.       }
  127.  
  128.       if (var5 == 0L) {
  129.          return new FDBigInt(var4, this.nWords);
  130.       } else {
  131.          var4[this.nWords] = (int)var5;
  132.          return new FDBigInt(var4, this.nWords + 1);
  133.       }
  134.    }
  135.  
  136.    public FDBigInt mult(FDBigInt var1) {
  137.       int[] var2 = new int[this.nWords + var1.nWords];
  138.  
  139.       for(int var3 = 0; var3 < this.nWords; ++var3) {
  140.          long var4 = (long)this.data[var3] & 4294967295L;
  141.          long var6 = 0L;
  142.  
  143.          int var8;
  144.          for(var8 = 0; var8 < var1.nWords; ++var8) {
  145.             var6 += ((long)var2[var3 + var8] & 4294967295L) + var4 * ((long)var1.data[var8] & 4294967295L);
  146.             var2[var3 + var8] = (int)var6;
  147.             var6 >>>= 32;
  148.          }
  149.  
  150.          var2[var3 + var8] = (int)var6;
  151.       }
  152.  
  153.       int var9;
  154.       for(var9 = var2.length - 1; var9 > 0 && var2[var9] == 0; --var9) {
  155.       }
  156.  
  157.       return new FDBigInt(var2, var9 + 1);
  158.    }
  159.  
  160.    public FDBigInt add(FDBigInt var1) {
  161.       long var7 = 0L;
  162.       int[] var3;
  163.       int[] var4;
  164.       int var5;
  165.       int var6;
  166.       if (this.nWords >= var1.nWords) {
  167.          var3 = this.data;
  168.          var5 = this.nWords;
  169.          var4 = var1.data;
  170.          var6 = var1.nWords;
  171.       } else {
  172.          var3 = var1.data;
  173.          var5 = var1.nWords;
  174.          var4 = this.data;
  175.          var6 = this.nWords;
  176.       }
  177.  
  178.       int[] var9 = new int[var5];
  179.  
  180.       int var2;
  181.       for(var2 = 0; var2 < var5; ++var2) {
  182.          var7 += (long)var3[var2] & 4294967295L;
  183.          if (var2 < var6) {
  184.             var7 += (long)var4[var2] & 4294967295L;
  185.          }
  186.  
  187.          var9[var2] = (int)var7;
  188.          var7 >>= 32;
  189.       }
  190.  
  191.       if (var7 != 0L) {
  192.          int[] var10 = new int[var9.length + 1];
  193.          System.arraycopy(var9, 0, var10, 0, var9.length);
  194.          var10[var2++] = (int)var7;
  195.          return new FDBigInt(var10, var2);
  196.       } else {
  197.          return new FDBigInt(var9, var2);
  198.       }
  199.    }
  200.  
  201.    public FDBigInt sub(FDBigInt var1) {
  202.       int[] var2 = new int[this.nWords];
  203.       int var4 = this.nWords;
  204.       int var5 = var1.nWords;
  205.       int var6 = 0;
  206.       long var7 = 0L;
  207.  
  208.       int var3;
  209.       for(var3 = 0; var3 < var4; ++var3) {
  210.          var7 += (long)this.data[var3] & 4294967295L;
  211.          if (var3 < var5) {
  212.             var7 -= (long)var1.data[var3] & 4294967295L;
  213.          }
  214.  
  215.          if ((var2[var3] = (int)var7) == 0) {
  216.             ++var6;
  217.          } else {
  218.             var6 = 0;
  219.          }
  220.  
  221.          var7 >>= 32;
  222.       }
  223.  
  224.       if (var7 != 0L) {
  225.          throw new RuntimeException("Assertion botch: borrow out of subtract");
  226.       } else {
  227.          while(var3 < var5) {
  228.             if (var1.data[var3++] != 0) {
  229.                throw new RuntimeException("Assertion botch: negative result of subtract");
  230.             }
  231.          }
  232.  
  233.          return new FDBigInt(var2, var4 - var6);
  234.       }
  235.    }
  236.  
  237.    public int cmp(FDBigInt var1) {
  238.       int var2;
  239.       if (this.nWords > var1.nWords) {
  240.          int var3 = var1.nWords - 1;
  241.  
  242.          for(var2 = this.nWords - 1; var2 > var3; --var2) {
  243.             if (this.data[var2] != 0) {
  244.                return 1;
  245.             }
  246.          }
  247.       } else if (this.nWords < var1.nWords) {
  248.          int var5 = this.nWords - 1;
  249.  
  250.          for(var2 = var1.nWords - 1; var2 > var5; --var2) {
  251.             if (var1.data[var2] != 0) {
  252.                return -1;
  253.             }
  254.          }
  255.       } else {
  256.          var2 = this.nWords - 1;
  257.       }
  258.  
  259.       while(var2 > 0 && this.data[var2] == var1.data[var2]) {
  260.          --var2;
  261.       }
  262.  
  263.       int var6 = this.data[var2];
  264.       int var4 = var1.data[var2];
  265.       if (var6 < 0) {
  266.          return var4 < 0 ? var6 - var4 : 1;
  267.       } else {
  268.          return var4 < 0 ? -1 : var6 - var4;
  269.       }
  270.    }
  271.  
  272.    public int quoRemIteration(FDBigInt var1) throws IllegalArgumentException {
  273.       if (this.nWords != var1.nWords) {
  274.          throw new IllegalArgumentException("disparate values");
  275.       } else {
  276.          int var2 = this.nWords - 1;
  277.          long var3 = ((long)this.data[var2] & 4294967295L) / (long)var1.data[var2];
  278.          long var5 = 0L;
  279.  
  280.          for(int var7 = 0; var7 <= var2; ++var7) {
  281.             var5 += ((long)this.data[var7] & 4294967295L) - var3 * ((long)var1.data[var7] & 4294967295L);
  282.             this.data[var7] = (int)var5;
  283.             var5 >>= 32;
  284.          }
  285.  
  286.          if (var5 != 0L) {
  287.             for(long var8 = 0L; var8 == 0L; --var3) {
  288.                var8 = 0L;
  289.  
  290.                for(int var10 = 0; var10 <= var2; ++var10) {
  291.                   var8 += ((long)this.data[var10] & 4294967295L) + ((long)var1.data[var10] & 4294967295L);
  292.                   this.data[var10] = (int)var8;
  293.                   var8 >>= 32;
  294.                }
  295.  
  296.                if (var8 != 0L && var8 != 1L) {
  297.                   throw new RuntimeException("Assertion botch: " + var8 + " carry out of division correction");
  298.                }
  299.             }
  300.          }
  301.  
  302.          long var13 = 0L;
  303.  
  304.          for(int var15 = 0; var15 <= var2; ++var15) {
  305.             var13 += 10L * ((long)this.data[var15] & 4294967295L);
  306.             this.data[var15] = (int)var13;
  307.             var13 >>= 32;
  308.          }
  309.  
  310.          if (var13 != 0L) {
  311.             throw new RuntimeException("Assertion botch: carry out of *10");
  312.          } else {
  313.             return (int)var3;
  314.          }
  315.       }
  316.    }
  317.  
  318.    public long longValue() {
  319.       int var1;
  320.       for(var1 = this.nWords - 1; var1 > 1; --var1) {
  321.          if (this.data[var1] != 0) {
  322.             throw new RuntimeException("Assertion botch: value too big");
  323.          }
  324.       }
  325.  
  326.       switch (var1) {
  327.          case 0:
  328.             return (long)this.data[0] & 4294967295L;
  329.          case 1:
  330.             if (this.data[1] < 0) {
  331.                throw new RuntimeException("Assertion botch: value too big");
  332.             }
  333.  
  334.             return (long)this.data[1] << 32 | (long)this.data[0] & 4294967295L;
  335.          default:
  336.             throw new RuntimeException("Assertion botch: longValue confused");
  337.       }
  338.    }
  339.  
  340.    public String toString() {
  341.       StringBuffer var1 = new StringBuffer(30);
  342.       var1.append('[');
  343.       int var2 = Math.min(this.nWords - 1, this.data.length - 1);
  344.       if (this.nWords > this.data.length) {
  345.          var1.append("(" + this.data.length + "<" + this.nWords + "!)");
  346.       }
  347.  
  348.       while(var2 > 0) {
  349.          var1.append(Integer.toHexString(this.data[var2]));
  350.          var1.append(' ');
  351.          --var2;
  352.       }
  353.  
  354.       var1.append(Integer.toHexString(this.data[0]));
  355.       var1.append(']');
  356.       return new String(var1);
  357.    }
  358. }
  359.