home *** CD-ROM | disk | FTP | other *** search
/ Sky at Night 2007 June / SAN CD 6-2007 CD-ROM 25.iso / pc / Software / AstroGrav_Win / Java / jre1.6.0 / lib / rt.jar / java / math / BitSieve.class (.txt) < prev    next >
Encoding:
Java Class File  |  2006-11-29  |  1.6 KB  |  116 lines

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