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 / lang / FDBigInt.class (.txt) < prev    next >
Encoding:
Java Class File  |  1979-12-31  |  4.2 KB  |  409 lines

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