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 / math / BitSieve.class (.txt) < prev    next >
Encoding:
Java Class File  |  1979-12-31  |  1.5 KB  |  114 lines

  1. package java.math;
  2.  
  3. class BitSieve {
  4.    private long[] bits;
  5.    private int length;
  6.    private static BitSieve smallSieve = new BitSieve();
  7.  
  8.    private BitSieve() {
  9.       this.length = 9600;
  10.       this.bits = new long[unitIndex(this.length - 1) + 1];
  11.       this.set(0);
  12.       int var1 = 1;
  13.       int var2 = 3;
  14.  
  15.       do {
  16.          this.sieveSingle(this.length, var1 + var2, var2);
  17.          var1 = this.sieveSearch(this.length, var1 + 1);
  18.          var2 = 2 * var1 + 1;
  19.       } while(var1 > 0 && var2 < this.length);
  20.  
  21.    }
  22.  
  23.    BitSieve(BigInteger var1, int var2) {
  24.       this.bits = new long[unitIndex(var2 - 1) + 1];
  25.       this.length = var2;
  26.       int var3 = 0;
  27.       int var4 = smallSieve.sieveSearch(smallSieve.length, var3);
  28.       int var5 = var4 * 2 + 1;
  29.       MutableBigInteger var6 = new MutableBigInteger();
  30.       MutableBigInteger var7 = new MutableBigInteger();
  31.  
  32.       do {
  33.          var6.copyValue(var1.mag);
  34.          var6.divideOneWord(var5, var7);
  35.          var3 = var6.value[var6.offset];
  36.          var3 = var5 - var3;
  37.          if (var3 % 2 == 0) {
  38.             var3 += var5;
  39.          }
  40.  
  41.          this.sieveSingle(var2, (var3 - 1) / 2, var5);
  42.          var4 = smallSieve.sieveSearch(smallSieve.length, var4 + 1);
  43.          var5 = var4 * 2 + 1;
  44.       } while(var4 > 0);
  45.  
  46.    }
  47.  
  48.    private static int unitIndex(int var0) {
  49.       return var0 >>> 6;
  50.    }
  51.  
  52.    private static long bit(int var0) {
  53.       return 1L << (var0 & 63);
  54.    }
  55.  
  56.    private boolean get(int var1) {
  57.       int var2 = unitIndex(var1);
  58.       return (this.bits[var2] & bit(var1)) != 0L;
  59.    }
  60.  
  61.    private void set(int var1) {
  62.       int var2 = unitIndex(var1);
  63.       long[] var10000 = this.bits;
  64.       var10000[var2] |= bit(var1);
  65.    }
  66.  
  67.    private int sieveSearch(int var1, int var2) {
  68.       if (var2 >= var1) {
  69.          return -1;
  70.       } else {
  71.          int var3 = var2;
  72.  
  73.          while(this.get(var3)) {
  74.             ++var3;
  75.             if (var3 >= var1 - 1) {
  76.                return -1;
  77.             }
  78.          }
  79.  
  80.          return var3;
  81.       }
  82.    }
  83.  
  84.    private void sieveSingle(int var1, int var2, int var3) {
  85.       while(var2 < var1) {
  86.          this.set(var2);
  87.          var2 += var3;
  88.       }
  89.  
  90.    }
  91.  
  92.    BigInteger retrieve(BigInteger var1, int var2) {
  93.       int var3 = 1;
  94.  
  95.       for(int var4 = 0; var4 < this.bits.length; ++var4) {
  96.          long var5 = ~this.bits[var4];
  97.  
  98.          for(int var7 = 0; var7 < 64; ++var7) {
  99.             if ((var5 & 1L) == 1L) {
  100.                BigInteger var8 = var1.add(BigInteger.valueOf((long)var3));
  101.                if (var8.isProbablePrime(var2)) {
  102.                   return var8;
  103.                }
  104.             }
  105.  
  106.             var5 >>>= 1;
  107.             var3 += 2;
  108.          }
  109.       }
  110.  
  111.       return null;
  112.    }
  113. }
  114.