Ultimate Prime Sieve -- Sieve Of Zakiya (SoZ)

jzakiya jzakiya at gmail.com
Fri Jun 13 13:38:36 EDT 2008


On Jun 13, 1:12 pm, jzakiya <jzak... at gmail.com> wrote:
> This is to announce the release of my paper "Ultimate Prime Sieve --
> Sieve of Zakiiya (SoZ)" in which I show and explain the development of
> a class of Number Theory Sieves to generate prime numbers.   I used
> Ruby 1.9.0-1 as my development environment on a P4 2.8 Ghz laptop.
>
> You can get the pdf of my paper and Ruby and Python source from here:
>
> http://www.4shared.com/dir/7467736/97bd7b71/sharing.html
>
> Below is a sample of one of the simple prime generators. I did a
> Python version of this in my paper (see Python source too).  The Ruby
> version below is the minimum array size version, while the Python has
> array of size N (I made no attempt to optimize its implementation,
> it's to show the method).
>
> class Integer
>    def primesP3a
>       # all prime candidates > 3 are of form  6*k+1 and 6*k+5
>       # initialize sieve array with only these candidate values
>       # where sieve contains the odd integers representatives
>       # convert integers to array indices/vals by  i = (n-3)>>1 =
> (n>>1)-1
>       n1, n2 = -1, 1;  lndx= (self-1) >>1;  sieve = []
>       while n2 < lndx
>          n1 +=3;   n2 += 3;   sieve[n1] = n1;  sieve[n2] = n2
>       end
>       #now initialize sieve array with (odd) primes < 6, resize array
>       sieve[0] =0;  sieve[1]=1;  sieve=sieve[0..lndx-1]
>
>       5.step(Math.sqrt(self).to_i, 2) do |i|
>          next unless sieve[(i>>1) - 1]
>          # p5= 5*i,  k = 6*i,  p7 = 7*i
>          # p1 = (5*i-3)>>1;  p2 = (7*i-3)>>1;  k = (6*i)>>1
>          i6 = 6*i;  p1 = (i6-i-3)>>1;  p2 = (i6+i-3)>>1;  k = i6>>1
>          while p1 < lndx
>              sieve[p1] = nil;  sieve[p2] = nil;  p1 += k;  p2 += k
>          end
>       end
>       return [2] if self < 3
>       [2]+([nil]+sieve).compact!.map {|i| (i<<1) +3 }
>    end
> end
>
> def primesP3(val):
>     # all prime candidates > 3 are of form  6*k+(1,5)
>     # initialize sieve array with only these candidate values
>     n1, n2 = 1, 5
>     sieve = [False]*(val+6)
>     while  n2 < val:
>         n1 += 6;   n2 += 6;  sieve[n1] = n1;   sieve[n2] = n2
>     # now load sieve with seed primes 3 < pi < 6, in this case just 5
>     sieve[5] = 5
>
>     for i in range( 5, int(ceil(sqrt(val))), 2) :
>        if not sieve[i]:  continue
>        #  p1= 5*i,  k = 6*i,  p2 = 7*i,
>        p1 = 5*i;  k = p1+i;  p2 = k+i
>        while p2 <= val:
>           sieve[p1] = False;  sieve[p2] = False;  p1 += k;  p2 += k
>        if p1 <= val:  sieve[p1] = False
>
>     primes = [2,3]
>     if val < 3 : return [2]
>     primes.extend( i for i in range(5, val+(val&1), 2)  if sieve[i] )
>
>     return primes
>
> Now to generate an array of the primes up to some N just do:
>
> Ruby:    10000001.primesP3a
> Python: primesP3a(10000001)
>
> The paper presents benchmarks with Ruby 1.9.0-1 (YARV).  I would love
> to see my various prime generators benchmarked with optimized
> implementations in other languages.  I'm hoping Python gurus will do
> better than I, though the methodology is very very simple, since all I
> do is additions, multiplications, and array reads/writes.
>
> Have fun with the code.  ;-)
>

CORRECTION:

http://cr.yp.to/primegen.html   NOT  "primesgen"

 Jabari Zakiya




More information about the Python-list mailing list