<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DZone Snippets: number code</title>
    <link>http://snippets.dzone.com/posts</link>
    <pubDate>Fri, 25 Jul 2008 01:00:35 GMT</pubDate>
    <description>DZone Snippets: number code</description>
    <item>
      <title>Sieve of Zakiya -- Number Theory Sieves (NTS)</title>
      <link>http://snippets.dzone.com/posts/show/5610</link>
      <description>// description of your code here&lt;br /&gt;I present with this Ruby code a new class of Number Theory Sieves (NTS)&lt;br /&gt;to generate primes numbers upto some number N, which I believe now&lt;br /&gt;represent the fastest way to generate prime numbers. The general number&lt;br /&gt;theory can utilize a class of prime generator functions, which have the&lt;br /&gt;same form, and which can be implemented in the same manner. These NTS&lt;br /&gt;can be inherently implemented in parallel with multiple processors.&lt;br /&gt;&lt;br /&gt;The classical brute-force method to generate primes upto some N is the&lt;br /&gt;Sieve of Eratothenes (SoE). In 2002/3 Atkin &amp; Bernstein proposed what has&lt;br /&gt;become known as the Sieve of Atkin (SoA), which was known to be the fastest&lt;br /&gt;method to generate primes. My general number theory based Sieve of Zakiya (SoZ)&lt;br /&gt;represents a multiple times increase in performance over the SoA, while being&lt;br /&gt;easier to understand, code, and extend with newer prime generator functions.&lt;br /&gt;&lt;br /&gt;I also used the number theory to created a primality tester, whose code&lt;br /&gt;is short and elegant, which I also believe is the fastest method to test&lt;br /&gt;for primality while being deterministic. Thus, it should replace other&lt;br /&gt;non-deterministic or probabilistic methods, such as Miller-Rabin, et al.&lt;br /&gt;&lt;br /&gt;I started this work this first week in May 2008, and present this code&lt;br /&gt;herein on Friday, June 6, 2008.&lt;br /&gt;&lt;br /&gt;The development of this work is presented in the paper:&lt;br /&gt;"Ultimate Prime Sieve -- Sieve of Zakiya"&lt;br /&gt;the pdf can be download from here:&lt;br /&gt;&lt;br /&gt;http://www.4shared.com/dir/7467736/97bd7b71/sharing.html&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#!/usr/local/bin/ruby -w&lt;br /&gt;&lt;br /&gt;require 'benchmark' &lt;br /&gt;&lt;br /&gt;class Integer&lt;br /&gt;&lt;br /&gt;   def primes1&lt;br /&gt;      # classical brute-force Sieve of Eratosthenes (SoE)&lt;br /&gt;      # initialze sieve array with all integers starting at i=2&lt;br /&gt;&lt;br /&gt;      sieve = [nil, nil].concat((2..self).to_a)&lt;br /&gt;&lt;br /&gt;      (2 .. Math.sqrt(self).to_i).each do |i|&lt;br /&gt;&lt;br /&gt;         next unless sieve[i]&lt;br /&gt;         (i*i).step(self, i) { |j| sieve[j] = nil }&lt;br /&gt;      end&lt;br /&gt;      sieve.compact!&lt;br /&gt;   end  &lt;br /&gt;&lt;br /&gt;   def primes2&lt;br /&gt;      # classical brute-force Sieve of Eratosthenes (SoE)&lt;br /&gt;      # initialize sieve array with odd integers for odd indexes, then 2&lt;br /&gt;&lt;br /&gt;      sieve = [];  3.step(self, 2) { |i| sieve[i] = i };  sieve[2] = 2&lt;br /&gt;&lt;br /&gt;      3.step(Math.sqrt(self).to_i, 2) do |i| &lt;br /&gt;         next unless sieve[i]&lt;br /&gt;         (i*i).step(self, i&lt;&lt;1) { |j| sieve[j] = nil }&lt;br /&gt;      end&lt;br /&gt;      sieve.compact!&lt;br /&gt;   end &lt;br /&gt;&lt;br /&gt;   def primes3&lt;br /&gt;      # http://everything2.com/index.pl?node_id=1176369&lt;br /&gt;      # all prime candidates &gt; 3 are of form  6*k+1 and 6*k+5&lt;br /&gt;      # initialize sieve array with only these candidate values&lt;br /&gt;      n1, n2 = 1, 5;  sieve = [] &lt;br /&gt;      while n2 &lt; self&lt;br /&gt;         n1 += 6;   n2 += 6;   sieve[n1] = n1;   sieve[n2] = n2&lt;br /&gt;      end&lt;br /&gt;      # now initialize sieve array with first 3 primes, resize array&lt;br /&gt;      sieve[2]=2;  sieve[3]=3;  sieve[5]=5;  sieve=sieve[0..self]&lt;br /&gt;&lt;br /&gt;      5.step(Math.sqrt(self).to_i, 2) do |i| &lt;br /&gt;         next unless sieve[i]&lt;br /&gt;         (i*i).step(self, i&lt;&lt;1) {|j| sieve[j] = nil }&lt;br /&gt;      end   	&lt;br /&gt;      sieve.compact!&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;   def primesP3&lt;br /&gt;      # all prime candidates &gt; 3 are of form  6*k+1 and 6*k+5&lt;br /&gt;      # initialize sieve array with only these candidate values&lt;br /&gt;      n1, n2 = 1, 5;  sieve = [] &lt;br /&gt;      while n2 &lt; self&lt;br /&gt;         n1 += 6;   n2 += 6;   sieve[n1] = n1;  sieve[n2] = n2&lt;br /&gt;      end&lt;br /&gt;      # now initialize sieve array with primes &lt; 6, resize array&lt;br /&gt;      sieve[2]=2;  sieve[3]=3;  sieve[5]=5;  sieve=sieve[0..self]&lt;br /&gt;&lt;br /&gt;      5.step(Math.sqrt(self).to_i, 2) do |i| &lt;br /&gt;         next unless sieve[i]&lt;br /&gt;	 #  p5= 5*i, k = 6*i,  p7 = 7*i  &lt;br /&gt;	 p1 = 5*i;  k = p1+i;  p2 = k+i&lt;br /&gt;	 while p1 &lt;= self&lt;br /&gt;	     sieve[p1] = nil;  sieve[p2] = nil;  p1 += k;  p2 += k&lt;br /&gt;	 end    &lt;br /&gt;      end   	&lt;br /&gt;      sieve.compact!&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   def primesP3a&lt;br /&gt;      # all prime candidates &gt; 3 are of form  6*k+1 and 6*k+5&lt;br /&gt;      # initialize sieve array with only these candidate values&lt;br /&gt;      # where sieve contains the odd integers representatives&lt;br /&gt;      # convert integers to array indices/vals by  i = (n-3)&gt;&gt;1 = (n&gt;&gt;1)-1&lt;br /&gt;      n1, n2 = -1, 1;  lndx= (self-1) &gt;&gt;1;  sieve = []&lt;br /&gt;      while n2 &lt; lndx&lt;br /&gt;         n1 +=3;   n2 += 3;   sieve[n1] = n1;  sieve[n2] = n2&lt;br /&gt;      end&lt;br /&gt;      #now initialize sieve array with (odd) primes &lt; 6, resize array&lt;br /&gt;      sieve[0] =0;  sieve[1]=1;  sieve=sieve[0..lndx-1]&lt;br /&gt;&lt;br /&gt;      5.step(Math.sqrt(self).to_i, 2) do |i|&lt;br /&gt;         next unless sieve[(i&gt;&gt;1) - 1]&lt;br /&gt;	 # p5= 5*i,  k = 6*i,  p7 = 7*i  &lt;br /&gt;	 # p1 = (5*i-3)&gt;&gt;1;  p2 = (7*i-3)&gt;&gt;1;  k = (6*i)&gt;&gt;1&lt;br /&gt;	 i6 = 6*i;  p1 = (i6-i-3)&gt;&gt;1;  p2 = (i6+i-3)&gt;&gt;1;  k = i6&gt;&gt;1&lt;br /&gt;	 while p1 &lt; lndx&lt;br /&gt;	     sieve[p1] = nil;  sieve[p2] = nil;  p1 += k;  p2 += k&lt;br /&gt;	 end    &lt;br /&gt;      end&lt;br /&gt;      return [2] if self &lt; 3&lt;br /&gt;      [2]+([nil]+sieve).compact!.map {|i| (i&lt;&lt;1) +3 }&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;   def primesP5&lt;br /&gt;      # all prime candidates &gt; 5 are of form  30*k+(1,7,11,13,17,19,23,29)&lt;br /&gt;      # initialize sieve array with only these candidate values&lt;br /&gt;      n1, n2, n3, n4, n5, n6, n7, n8 = 1, 7, 11, 13, 17, 19, 23, 29;  sieve = [] &lt;br /&gt;      while n8 &lt; self&lt;br /&gt;         n1 +=30;   n2 += 30;   n3 += 30;   n4 += 30&lt;br /&gt;	 n5 +=30;   n6 += 30;   n7 += 30;   n8 += 30&lt;br /&gt;	 sieve[n1] = n1;  sieve[n2] = n2;  sieve[n3] = n3;  sieve[n4] = n4&lt;br /&gt;	 sieve[n5] = n5;  sieve[n6] = n6;  sieve[n7] = n7;  sieve[n8] = n8&lt;br /&gt;      end&lt;br /&gt;      # now initialize sieve with the primes &lt; 30, resize array&lt;br /&gt;      sieve[2]=2;  sieve[3]=3;  sieve[5]=5;  sieve[7]=7;  sieve[11]=11;  sieve[13]=13&lt;br /&gt;      sieve[17]=17; sieve[19]=19;  sieve[23]=23;  sieve[29]=29;   sieve=sieve[0..self]&lt;br /&gt;&lt;br /&gt;      7.step(Math.sqrt(self).to_i, 2) do |i| &lt;br /&gt;         next unless sieve[i]&lt;br /&gt;	 # p1=7*i, p2=11*i, p3=13*i ---- p6=23*i, p7=29*i, p8=31*i,  k=30*i&lt;br /&gt;	 n6 = 6*i;  p1 = i+n6;  p2 = n6+n6-i;  p3 = p1+n6;  p4 = p2+n6&lt;br /&gt;	 p5 = p3+n6;  p6 = p4+n6;  p7 = p6+n6;  k = p7+i;  p8 = k+i&lt;br /&gt;	 while p1 &lt;= self&lt;br /&gt;	     sieve[p1] = nil;  sieve[p2] = nil;  sieve[p3] = nil;  sieve[p4] = nil&lt;br /&gt;	     sieve[p5] = nil;  sieve[p6] = nil;  sieve[p7] = nil;  sieve[p8] = nil&lt;br /&gt;	     p1 += k; p2 += k; p3 += k; p4 += k; p5 += k; p6 += k; p7 += k; p8 += k&lt;br /&gt;	 end&lt;br /&gt;      end&lt;br /&gt;      sieve.compact!&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;   def primesP5a&lt;br /&gt;      # all prime candidates &gt; 5 are of form  30*k+(1,7,11,13,17,19,23,29)&lt;br /&gt;      # initialize sieve array with only these candidate values&lt;br /&gt;      # where sieve contains the odd integers representatives&lt;br /&gt;      # convert integers to array indices/vals by  i = (n-3)&gt;&gt;1 = n&gt;&gt;1 - 1&lt;br /&gt;      n1, n2, n3, n4, n5, n6, n7, n8 = -1, 2, 4, 5, 7, 8, 10, 13&lt;br /&gt;      lndx= (self-1) &gt;&gt;1;  sieve = []&lt;br /&gt;      while n8 &lt; lndx&lt;br /&gt;         n1 +=15;   n2 += 15;   n3 += 15;   n4 += 15&lt;br /&gt;	 n5 +=15;   n6 += 15;   n7 += 15;   n8 += 15&lt;br /&gt;	 sieve[n1] = n1;  sieve[n2] = n2;  sieve[n3] = n3;  sieve[n4] = n4&lt;br /&gt;	 sieve[n5] = n5;  sieve[n6] = n6;  sieve[n7] = n7;  sieve[n8] = n8&lt;br /&gt;      end&lt;br /&gt;      # now initialize sieve with the (odd) primes &lt; 30, resize array&lt;br /&gt;      sieve[0]=0;  sieve[1]=1;  sieve[2]=2;  sieve[4]=4;  sieve[5]=5&lt;br /&gt;      sieve[7]=7;  sieve[8]=8;  sieve[10]=10;  sieve[13]=13&lt;br /&gt;      sieve = sieve[0..lndx-1]&lt;br /&gt;&lt;br /&gt;      7.step(Math.sqrt(self).to_i, 2) do |i|&lt;br /&gt;         next unless sieve[(i&gt;&gt;1) - 1]&lt;br /&gt;	 # p1=7*i, p2=11*i, p3=13*i ---- p6=23*i, p7=29*i, p8=31*i,  k=30*i&lt;br /&gt;	 # maps to: p1= (7*i-3)&gt;&gt;1, --- p8=(31*i-3)&gt;&gt;1, k=30*i&gt;&gt;1&lt;br /&gt;	 n2=i&lt;&lt;1;  n4=i&lt;&lt;2;  n8=i&lt;&lt;3;  n16=i&lt;&lt;4;  n32=i&lt;&lt;5;  n12=n8+n4&lt;br /&gt;	 p1 = (n8-i-3)&gt;&gt;1;  p2 = (n12-i-3)&gt;&gt;1;  p3 = (n12+i-3)&gt;&gt;1;  p4 = (n16+i-3)&gt;&gt;1&lt;br /&gt;	 p5 = (n16+n4-i-3)&gt;&gt;1;  p6 = (n16+n8-i-3)&gt;&gt;1;  p7 = (n32-n4+i-3)&gt;&gt;1&lt;br /&gt;	 p8 = (n32-i-3)&gt;&gt;1;  k = (n32-n2)&gt;&gt;1&lt;br /&gt;	 while p1 &lt; lndx&lt;br /&gt;	     sieve[p1] = nil;  sieve[p2] = nil;  sieve[p3] = nil;  sieve[p4] = nil&lt;br /&gt;	     sieve[p5] = nil;  sieve[p6] = nil;  sieve[p7] = nil;  sieve[p8] = nil&lt;br /&gt;	     p1 += k;  p2 += k;  p3 += k;  p4 += k;  p5 += k;  p6 += k;  p7 += k;  p8 += k&lt;br /&gt;	 end&lt;br /&gt;      end&lt;br /&gt;      return [2] if self &lt; 3&lt;br /&gt;      [2]+([nil]+sieve).compact!.map {|i| (i&lt;&lt;1) +3 }&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;   def primesP7&lt;br /&gt;      # all prime candidates &gt; 7 are of form  210*k+(1,11,13,17,19,23,29,31,37&lt;br /&gt;      # 41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,121,127,131&lt;br /&gt;      # 137,139,143,149,151,157,163,167,169,173,179,181,187,191,193,197,199,209)&lt;br /&gt;      # initialize sieve array with only these candidate values&lt;br /&gt;      n1, n2, n3, n4, n5, n6, n7, n8, n9, n10 = 1, 11, 13, 17, 19, 23, 29, 31, 37, 41&lt;br /&gt;      n11, n12, n13, n14, n15, n16, n17, n18 = 43, 47, 53, 59, 61, 67, 71, 73&lt;br /&gt;      n19, n20, n21, n22, n23, n24, n25, n26 = 79, 83, 89, 97, 101, 103, 107, 109&lt;br /&gt;      n27, n28, n29, n30, n31, n32, n33, n34 = 113, 127, 131, 137, 139, 149, 151, 157&lt;br /&gt;      n35, n36, n37, n38, n39, n40, n41, n42, n43 = 163, 167, 173, 179, 181, 191, 193, 197, 199&lt;br /&gt;      n44, n45, n46, n47, n48 = 121, 143, 169, 187,  209&lt;br /&gt;      num = self - self[0]^1;  sieve = []&lt;br /&gt;      while n48 &lt; num&lt;br /&gt;         n1  +=210;  n2  += 210;  n3  += 210;  n4  += 210;  n5  += 210&lt;br /&gt;	 n6  +=210;  n7  += 210;  n8  += 210;  n9  += 210;  n10 += 210&lt;br /&gt;         n11 +=210;  n12 += 210;  n13 += 210;  n14 += 210;  n15 += 210&lt;br /&gt;	 n16 +=210;  n17 += 210;  n18 += 210;  n19 += 210;  n20 += 210&lt;br /&gt;         n21 +=210;  n22 += 210;  n23 += 210;  n24 += 210;  n25 += 210&lt;br /&gt;	 n26 +=210;  n27 += 210;  n28 += 210;  n29 += 210;  n30 += 210&lt;br /&gt;         n31 +=210;  n32 += 210;  n33 += 210;  n34 += 210;  n35 += 210&lt;br /&gt;	 n36 +=210;  n37 += 210;  n38 += 210;  n39 += 210;  n40 += 210&lt;br /&gt;	 n41 +=210;  n42 += 210; n43 += 210; n44 += 210; n45 += 210 &lt;br /&gt;	 n46 += 210; n47 += 210; n48 += 210&lt;br /&gt;	 sieve[n1] = n1;    sieve[n2]  = n2;   sieve[n3] = n3;    sieve[n4] = n4&lt;br /&gt;	 sieve[n5] = n5;    sieve[n6]  = n6;   sieve[n7] = n7;    sieve[n8] = n8&lt;br /&gt;	 sieve[n9] = n9;    sieve[n10] = n10;  sieve[n11] = n11;  sieve[n12] = n12&lt;br /&gt;	 sieve[n13] = n13;  sieve[n14] = n14;  sieve[n15] = n15;  sieve[n16] = n16&lt;br /&gt;	 sieve[n17] = n17;  sieve[n18] = n18;  sieve[n19] = n19;  sieve[n20] = n20&lt;br /&gt;	 sieve[n21] = n21;  sieve[n22] = n22;  sieve[n23] = n23;  sieve[n24] = n24&lt;br /&gt;	 sieve[n25] = n25;  sieve[n26] = n26;  sieve[n27] = n27;  sieve[n28] = n28&lt;br /&gt;	 sieve[n29] = n29;  sieve[n30] = n30;  sieve[n31] = n31;  sieve[n32] = n32&lt;br /&gt;	 sieve[n33] = n33;  sieve[n34] = n34;  sieve[n35] = n35;  sieve[n36] = n36&lt;br /&gt;	 sieve[n37] = n37;  sieve[n38] = n38;  sieve[n39] = n39;  sieve[n40] = n40&lt;br /&gt;	 sieve[n41] = n41;  sieve[n42] = n42;  sieve[n43] = n43;  sieve[n44] = n44&lt;br /&gt;         sieve[n45] = n44;  sieve[n46] = n46;  sieve[n47] = n47;  sieve[n48] = n48&lt;br /&gt;      end&lt;br /&gt;      # now initialize sieve with the (odd) primes &lt; 210, resize array&lt;br /&gt;      sieve[2]=2;  sieve[3]=3;  sieve[5]=5;  sieve[7]=7;  sieve[11]=11;  sieve[13]=13&lt;br /&gt;      sieve[17]=17;   sieve[19]=19;   sieve[23]=23;   sieve[29]=29;   sieve[31]=31&lt;br /&gt;      sieve[37]=37;   sieve[41]=41;   sieve[43]=43;   sieve[47]=47;   sieve[53]=53&lt;br /&gt;      sieve[59]=59;   sieve[61]=61;   sieve[67]=67;   sieve[71]=71;   sieve[73]=73&lt;br /&gt;      sieve[79]=79;   sieve[83]=83;   sieve[89]=89;   sieve[97]=97;   sieve[101]=101&lt;br /&gt;      sieve[103]=103; sieve[107]=107; sieve[109]=109; sieve[113]=113; sieve[127]=127&lt;br /&gt;      sieve[131]=131; sieve[137]=137; sieve[139]=139; sieve[149]=149; sieve[151]=151&lt;br /&gt;      sieve[157]=157; sieve[163]=163; sieve[167]=167; sieve[173]=173; sieve[179]=179&lt;br /&gt;      sieve[181]=181; sieve[191]=191; sieve[193]=193; sieve[197]=197; sieve[199]=199&lt;br /&gt;      sieve = sieve[0..self]&lt;br /&gt;      11.step(Math.sqrt(self).to_i, 2) do |i|&lt;br /&gt;         next unless sieve[i]&lt;br /&gt;	 # p1=7*i, p2=11*i, p3=13*i ---- p6=23*i, p7=29*i, p8=31*i,  k=30*i&lt;br /&gt;	 # maps to: p1= (7*i-3)&gt;&gt;1, --- p8=(31*i)&gt;&gt;1, k=30*i&gt;&gt;1&lt;br /&gt;	 #n6=6*i;  n7=n6+i;  n11=n6+n6-i;  n13=n6+n7;  n17=n11+n6&lt;br /&gt;	 #n19=n13+n6;  n23=n17+n6;  n29=n23+n6;  n31=n29+(i&lt;&lt;1)&lt;br /&gt;	 #n4=i&lt;&lt;2;  n8=i&lt;&lt;3;  n16=i&lt;&lt;4;  n7=n8-i;  n11=n7+n4;  n13=n11+(i&lt;&lt;1)&lt;br /&gt;	 #n17=n16+i;  n19=n11+n8;  n23=n16+n7;  n29=n16+n13;  n31=(i&lt;&lt;5)-i&lt;br /&gt;	 p1 = (11*i);   p2 = (13*i);   p3 = (17*i);   p4 = (19*i)  &lt;br /&gt;	 p5 = (23*i);   p6 = (29*i);   p7 = (31*i);   p8 = (37*i) &lt;br /&gt;	 p9 = (41*i);   p10 = (43*i);  p11 = (47*i);  p12 = (53*i) &lt;br /&gt;	 p13 = (59*i);  p14 = (61*i);  p15 = (67*i);  p16 = (71*i) &lt;br /&gt;	 p17 = (73*i);  p18 = (79*i);  p19 = (83*i);  p20 = (89*i) &lt;br /&gt;         p21 = (97*i);  p22 = (101*i); p23 = (103*i); p24 = (107*i) &lt;br /&gt;	 p25 = (109*i); p26 = (113*i); p27 = (127*i); p28 = (131*i) &lt;br /&gt;	 p29 = (137*i); p30 = (139*i); p31 = (149*i); p32 = (151*i) &lt;br /&gt;	 p33 = (157*i); p34 = (163*i); p35 = (167*i); p36 = (173*i) &lt;br /&gt;	 p37 = (179*i); p38 = (181*i); p39 = (191*i); p40 = (193*i) &lt;br /&gt;	 p41 = (197*i); p42 = (199*i); p43 = (211*i)&lt;br /&gt;	 p44 = (121*i); p45 = 143*i;  p46 = 169*i; p47 = 187*i; p48 = 209*i&lt;br /&gt;	 k = (210*i) &lt;br /&gt;	 while p1 &lt;= num&lt;br /&gt;	     sieve[p1] = nil;   sieve[p2] = nil;   sieve[p3] = nil;   sieve[p4] = nil&lt;br /&gt;	     sieve[p5] = nil;   sieve[p6] = nil;   sieve[p7] = nil;   sieve[p8] = nil&lt;br /&gt;	     sieve[p9] = nil;   sieve[p10] = nil;  sieve[p11] = nil;  sieve[p12] = nil&lt;br /&gt;	     sieve[p13] = nil;  sieve[p14] = nil;  sieve[p15] = nil;  sieve[p16] = nil&lt;br /&gt;	     sieve[p17] = nil;  sieve[p18] = nil;  sieve[p19] = nil;  sieve[p20] = nil&lt;br /&gt;	     sieve[p21] = nil;  sieve[p22] = nil;  sieve[p23] = nil;  sieve[p24] = nil&lt;br /&gt;	     sieve[p25] = nil;  sieve[p26] = nil;  sieve[p27] = nil;  sieve[p28] = nil&lt;br /&gt;	     sieve[p29] = nil;  sieve[p30] = nil;  sieve[p31] = nil;  sieve[p32] = nil&lt;br /&gt;	     sieve[p33] = nil;  sieve[p34] = nil;  sieve[p35] = nil;  sieve[p36] = nil&lt;br /&gt;	     sieve[p37] = nil;  sieve[p38] = nil;  sieve[p39] = nil;  sieve[p40] = nil&lt;br /&gt;	     sieve[p41] = nil;  sieve[p42] = nil;  sieve[p43] = nil;  sieve[p44] = nil&lt;br /&gt;             sieve[p45] = nil;  sieve[p46] = nil;  sieve[p47] = nil;  sieve[p48] = nil&lt;br /&gt;	     p1 += k;  p2 += k; p3 += k; p4  += k; p5  +=k; p6 += k; p7 += k&lt;br /&gt;	     p8 += k;  p9 += k; p10 +=k; p11 += k; p12 +=k; p13 +=k; p14 +=k&lt;br /&gt;	     p15 +=k;  p16 +=k; p17 +=k; p18 += k; p19 +=k; p20 +=k; p21 +=k&lt;br /&gt;	     p22 +=k;  p23 +=k; p24 +=k; p25 += k; p26 +=k; p27 +=k; p28 +=k&lt;br /&gt;	     p29 +=k;  p30 +=k; p31 +=k; p32 += k; p33 +=k; p34 +=k; p35 +=k&lt;br /&gt;	     p36 +=k;  p37 +=k; p38 +=k; p39 += k; p40 +=k; p41 +=k; p42 +=k&lt;br /&gt;             p43 +=k;  p44 +=k; p45 +=k; p46 +=k;  p47 +=k; p48 +=k&lt;br /&gt;	 end&lt;br /&gt;      end&lt;br /&gt;      sieve.compact! &lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;   def primesP7a&lt;br /&gt;      # all prime candidates &gt; 7 are of form  210*k+(1,11,13,17,19,23,29,31,37&lt;br /&gt;      # 41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,121,127,131&lt;br /&gt;      # 137,139,143,149,151,157,163,167,169173,179,181,187,191,193,197,199,209)&lt;br /&gt;      # initialize sieve array with only these candidate values&lt;br /&gt;      # where sieve contains the odd integers representatives&lt;br /&gt;      # convert integers to array indices/vals by  i = (n )&gt;&gt;1 = (n&gt;&gt;1)-1&lt;br /&gt;      n1, n2, n3, n4, n5, n6, n7, n8, n9, n10 = -1, 4, 5, 7, 8, 10, 13, 14, 17, 19&lt;br /&gt;      n11, n12, n13, n14, n15, n16, n17, n18 = 20, 22, 25, 28, 29, 32, 34, 35&lt;br /&gt;      n19, n20, n21, n22, n23, n24, n25, n26 = 38, 40, 43, 47, 49, 50, 52, 53&lt;br /&gt;      n27, n28, n29, n30, n31, n32, n33, n34 = 55, 62, 64, 67, 68, 73, 74, 77&lt;br /&gt;      n35, n36, n37, n38, n39, n40, n41, n42, n43 = 80, 82, 85, 88, 89, 94, 95, 97, 98&lt;br /&gt;      n44, n45, n46, n47, n48 = 59, 70, 83, 92, 103&lt;br /&gt;      lndx= (self-1)&gt;&gt;1;  sieve = []&lt;br /&gt;      while n48 &lt; lndx&lt;br /&gt;         n1 +=105;   n2 += 105;   n3 += 105;   n4 += 105;   n5 += 105&lt;br /&gt;	 n6 +=105;   n7 += 105;   n8 += 105;   n9 += 105;   n10 += 105&lt;br /&gt;         n11 +=105;  n12 += 105;  n13 += 105;  n14 += 105;  n15 += 105&lt;br /&gt;	 n16 +=105;  n17 += 105;  n18 += 105;  n19 += 105;  n20 += 105&lt;br /&gt;         n21 +=105;  n22 += 105;  n23 += 105;  n24 += 105;  n25 += 105&lt;br /&gt;	 n26 +=105;  n27 += 105;  n28 += 105;  n29 += 105;  n30 += 105&lt;br /&gt;         n31 +=105;  n32 += 105;  n33 += 105;  n34 += 105;  n35 += 105&lt;br /&gt;	 n36 +=105;  n37 += 105;  n38 += 105;  n39 += 105;  n40 += 105&lt;br /&gt;	 n41 +=105;  n42 += 105;  n43 += 105;  n44 += 105;  n45 += 105&lt;br /&gt;	 n46 +=105;  n47 += 105;  n48 += 105&lt;br /&gt;	 sieve[n1] = n1;    sieve[n2] = n2;    sieve[n3] = n3;    sieve[n4] = n4&lt;br /&gt;	 sieve[n5] = n5;    sieve[n6] = n6;    sieve[n7] = n7;    sieve[n8] = n8&lt;br /&gt;	 sieve[n9] = n9;    sieve[n10] = n10;  sieve[n11] = n11;  sieve[n12] = n12&lt;br /&gt;	 sieve[n13] = n13;  sieve[n14] = n14;  sieve[n15] = n15;  sieve[n16] = n16&lt;br /&gt;	 sieve[n17] = n17;  sieve[n18] = n18;  sieve[n19] = n19;  sieve[n20] = n20&lt;br /&gt;	 sieve[n21] = n21;  sieve[n22] = n22;  sieve[n23] = n23;  sieve[n24] = n24&lt;br /&gt;	 sieve[n25] = n25;  sieve[n26] = n26;  sieve[n27] = n27;  sieve[n28] = n28&lt;br /&gt;	 sieve[n29] = n29;  sieve[n30] = n30;  sieve[n31] = n31;  sieve[n32] = n32&lt;br /&gt;	 sieve[n33] = n33;  sieve[n34] = n34;  sieve[n35] = n35;  sieve[n36] = n36&lt;br /&gt;	 sieve[n37] = n37;  sieve[n38] = n38;  sieve[n39] = n39;  sieve[n40] = n40&lt;br /&gt;	 sieve[n41] = n41;  sieve[n42] = n42;  sieve[n43] = n43;  sieve[n44] = n44 &lt;br /&gt;	 sieve[n45] = n45;  sieve[n46] = n46;  sieve[n47] = n47;  sieve[n48] = n48&lt;br /&gt;      end&lt;br /&gt;      # now initialize sieve with the (odd) primes &lt; 210, resize array&lt;br /&gt;      sieve[0]=0;    sieve[1]=1;    sieve[2]=2;    sieve[4]=4;    sieve[5]=5&lt;br /&gt;      sieve[7]=7;    sieve[8]=8;    sieve[10]=10;  sieve[13]=13;  sieve[14]=14&lt;br /&gt;      sieve[17]=17;  sieve[19]=19;  sieve[20]=20;  sieve[22]=22;  sieve[25]=25&lt;br /&gt;      sieve[28]=28;  sieve[29]=29;  sieve[32]=32;  sieve[34]=34;  sieve[35]=35&lt;br /&gt;      sieve[38]=38;  sieve[40]=40;  sieve[43]=43;  sieve[47]=47;  sieve[49]=49&lt;br /&gt;      sieve[50]=50;  sieve[52]=52;  sieve[53]=53;  sieve[55]=55;  sieve[62]=62&lt;br /&gt;      sieve[64]=64;  sieve[67]=67;  sieve[68]=68;  sieve[73]=73;  sieve[74]=74&lt;br /&gt;      sieve[77]=77;  sieve[80]=80;  sieve[82]=82;  sieve[85]=85;  sieve[88]=88&lt;br /&gt;      sieve[89]=89;  sieve[94]=94;  sieve[95]=95;  sieve[97]=97;  sieve[98]=98; &lt;br /&gt;      sieve = sieve[0..lndx-1]&lt;br /&gt;&lt;br /&gt;      11.step(Math.sqrt(self).to_i, 2) do |i|&lt;br /&gt;         next unless sieve[(i&gt;&gt;1) - 1]&lt;br /&gt;	 # p1=7*i, p2=11*i, p3=13*i ---- p6=23*i, p7=29*i, p8=31*i,  k=30*i&lt;br /&gt;	 # maps to: p1= (7*i-3)&gt;&gt;1, --- p8=(31*i)&gt;&gt;1, k=30*i&gt;&gt;1&lt;br /&gt;	 #n6=6*i;  n7=n6+i;  n11=n6+n6-i;  n13=n6+n7;  n17=n11+n6&lt;br /&gt;	 #n19=n13+n6;  n23=n17+n6;  n29=n23+n6;  n31=n29+(i&lt;&lt;1)&lt;br /&gt;	 #n4=i&lt;&lt;2;  n8=i&lt;&lt;3;  n16=i&lt;&lt;4;  n7=n8-i;  n11=n7+n4;  n13=n11+(i&lt;&lt;1)&lt;br /&gt;	 #n17=n16+i;  n19=n11+n8;  n23=n16+n7;  n29=n16+n13;  n31=(i&lt;&lt;5)-i&lt;br /&gt;	 p1 = (11*i-3)&gt;&gt;1;   p2 = (13*i-3)&gt;&gt;1;   p3 = (17*i-3)&gt;&gt;1;   p4 = (19*i-3)&gt;&gt;1&lt;br /&gt;	 p5 = (23*i-3)&gt;&gt;1;   p6 = (29*i-3)&gt;&gt;1;   p7 = (31*i-3)&gt;&gt;1;   p8 = (37*i-3)&gt;&gt;1&lt;br /&gt;	 p9 = (41*i-3)&gt;&gt;1;   p10 = (43*i-3)&gt;&gt;1;  p11 = (47*i-3)&gt;&gt;1;  p12 = (53*i-3)&gt;&gt;1&lt;br /&gt;	 p13 = (59*i-3)&gt;&gt;1;  p14 = (61*i-3)&gt;&gt;1;  p15 = (67*i-3)&gt;&gt;1;  p16 = (71*i-3)&gt;&gt;1&lt;br /&gt;	 p17 = (73*i-3)&gt;&gt;1;  p18 = (79*i-3)&gt;&gt;1;  p19 = (83*i-3)&gt;&gt;1;  p20 = (89*i-3)&gt;&gt;1&lt;br /&gt;         p21 = (97*i-3)&gt;&gt;1;  p22 = (101*i-3)&gt;&gt;1; p23 = (103*i-3)&gt;&gt;1; p24 = (107*i-3)&gt;&gt;1&lt;br /&gt;	 p25 = (109*i-3)&gt;&gt;1; p26 = (113*i-3)&gt;&gt;1; p27 = (127*i-3)&gt;&gt;1; p28 = (131*i-3)&gt;&gt;1&lt;br /&gt;	 p29 = (137*i-3)&gt;&gt;1; p30 = (139*i-3)&gt;&gt;1; p31 = (149*i-3)&gt;&gt;1; p32 = (151*i-3)&gt;&gt;1&lt;br /&gt;	 p33 = (157*i-3)&gt;&gt;1; p34 = (163*i-3)&gt;&gt;1; p35 = (167*i-3)&gt;&gt;1; p36 = (173*i-3)&gt;&gt;1&lt;br /&gt;	 p37 = (179*i-3)&gt;&gt;1; p38 = (181*i-3)&gt;&gt;1; p39 = (191*i-3)&gt;&gt;1; p40 = (193*i-3)&gt;&gt;1&lt;br /&gt;	 p41 = (197*i-3)&gt;&gt;1; p42 = (199*i-3)&gt;&gt;1; p43 = (211*i-3)&gt;&gt;1; p44 = (121*i-3)&gt;&gt;1&lt;br /&gt;	 p45 = (143*i-3)&gt;&gt;1; p46 = (169*i-3)&gt;&gt;1; p47 = (187*i-3)&gt;&gt;1; p48 = (209*i-3)&gt;&gt;1&lt;br /&gt;	 k = (210*i)&gt;&gt;1&lt;br /&gt;	 while p1 &lt; lndx&lt;br /&gt;	     sieve[p1] = nil;   sieve[p2] = nil;   sieve[p3] = nil;   sieve[p4] = nil&lt;br /&gt;	     sieve[p5] = nil;   sieve[p6] = nil;   sieve[p7] = nil;   sieve[p8] = nil&lt;br /&gt;	     sieve[p9] = nil;   sieve[p10] = nil;  sieve[p11] = nil;  sieve[p12] = nil&lt;br /&gt;	     sieve[p13] = nil;  sieve[p14] = nil;  sieve[p15] = nil;  sieve[p16] = nil&lt;br /&gt;	     sieve[p17] = nil;  sieve[p18] = nil;  sieve[p19] = nil;  sieve[p20] = nil&lt;br /&gt;	     sieve[p21] = nil;  sieve[p22] = nil;  sieve[p23] = nil;  sieve[p24] = nil&lt;br /&gt;	     sieve[p25] = nil;  sieve[p26] = nil;  sieve[p27] = nil;  sieve[p28] = nil&lt;br /&gt;	     sieve[p29] = nil;  sieve[p30] = nil;  sieve[p31] = nil;  sieve[p32] = nil&lt;br /&gt;	     sieve[p33] = nil;  sieve[p34] = nil;  sieve[p35] = nil;  sieve[p36] = nil&lt;br /&gt;	     sieve[p37] = nil;  sieve[p38] = nil;  sieve[p39] = nil;  sieve[p40] = nil&lt;br /&gt;	     sieve[p41] = nil;  sieve[p42] = nil;  sieve[p43] = nil;  sieve[p44] =nil&lt;br /&gt;	     sieve[p45] = nil;  sieve[p46] = nil;  sieve[p47] = nil;  sieve[p48] =nil&lt;br /&gt;	     p1 += k; p2 += k; p3 += k; p4  += k; p5 += k; p6 += k; p7 += k&lt;br /&gt;	     p8 += k; p9 += k; p10 +=k; p11 += k; p12 +=k; p13 +=k; p14 +=k&lt;br /&gt;	     p15 +=k; p16 +=k; p17 +=k; p18 += k; p19 +=k; p20 +=k; p21 +=k&lt;br /&gt;	     p22 +=k; p23 +=k; p24 +=k; p25 += k; p26 +=k; p27 +=k; p28 +=k&lt;br /&gt;	     p29 +=k; p30 +=k; p31 +=k; p32 += k; p33 +=k; p34 +=k; p35 +=k&lt;br /&gt;	     p36 +=k; p37 +=k; p38 +=k; p39 += k; p40 +=k; p41 +=k; p42 +=k&lt;br /&gt;	     p43 +=k; p44 +=k; p45 +=k; p46 += k; p47 +=k; p48 +=k&lt;br /&gt;	 end&lt;br /&gt;      end&lt;br /&gt;      return [2] if self &lt; 3&lt;br /&gt;      [2]+([nil]+sieve).compact!.map {|i| (i&lt;&lt;1) +3 }&lt;br /&gt;   end&lt;br /&gt;   &lt;br /&gt;   def primesP60&lt;br /&gt;      # all prime candidates &gt; 5 are of form  60*k+(1,7,11,13,17,19,23,29,&lt;br /&gt;      # 31,37,41,43,47,49,53,59&lt;br /&gt;      # initialize sieve array with only these candidate values&lt;br /&gt;      n1, n2, n3, n4, n5, n6, n7, n8, n9, n10 = 1, 7, 11, 13, 17, 19, 23, 29, 31, 37&lt;br /&gt;      n11, n12, n13, n14, n15, n16 = 41, 43, 47, 49, 53, 59&lt;br /&gt;      num = self - self[0]^1;  sieve = []&lt;br /&gt;      while n16 &lt; num&lt;br /&gt;         n1 += 60;   n2 += 60;   n3 += 60;   n4 += 60;   n5 += 60&lt;br /&gt;	 n6 += 60;   n7 += 60;   n8 += 60;   n9 += 60;   n10 += 60&lt;br /&gt;         n11 += 60;  n12 += 60;  n13 += 60;  n14 += 60;  n15 += 60;  n16 += 60&lt;br /&gt;	 sieve[n1] = n1;  sieve[n2] = n2;  sieve[n3] = n3;  sieve[n4] = n4&lt;br /&gt;	 sieve[n5] = n5;  sieve[n6] = n6;  sieve[n7] = n7;  sieve[n8] = n8&lt;br /&gt;	 sieve[n9] = n9;  sieve[n10] = n10;  sieve[n11] = n11;  sieve[n12] = n12&lt;br /&gt;	 sieve[n13] = n13; sieve[n14] = n14; sieve[n15] = n15;  sieve[n16] = n16&lt;br /&gt;      end&lt;br /&gt;      # now initialize sieve with the (odd) primes &lt; 210, resize array&lt;br /&gt;      sieve[2]=2;  sieve[3]=3;  sieve[5]=5;  sieve[7]=7;  sieve[11]=11;  sieve[13]=13&lt;br /&gt;      sieve[17]=17;  sieve[19]=19;  sieve[23]=23;  sieve[29]=29;  sieve[31]=31&lt;br /&gt;      sieve[37]=37; sieve[41]=41; sieve[43]=43; sieve[47]=47; sieve[53]=53; sieve[59]=59&lt;br /&gt;      sieve = sieve[0..self]&lt;br /&gt;      7.step(Math.sqrt(self).to_i, 2) do |i|&lt;br /&gt;         next unless sieve[i]&lt;br /&gt;	 # p1=7*i, p2=11*i, p3=13*i ---- p6=23*i, p7=29*i, p8=31*i,  k=30*i&lt;br /&gt;	 # maps to: p1= (7*i-3)&gt;&gt;1, --- p8=(31*i)&gt;&gt;1, k=30*i&gt;&gt;1&lt;br /&gt;	 #n6=6*i;  n7=n6+i;  n11=n6+n6-i;  n13=n6+n7;  n17=n11+n6&lt;br /&gt;	 #n19=n13+n6;  n23=n17+n6;  n29=n23+n6;  n31=n29+(i&lt;&lt;1)&lt;br /&gt;	 #n4=i&lt;&lt;2;  n8=i&lt;&lt;3;  n16=i&lt;&lt;4;  n7=n8-i;  n11=n7+n4;  n13=n11+(i&lt;&lt;1)&lt;br /&gt;	 #n17=n16+i;  n19=n11+n8;  n23=n16+n7;  n29=n16+n13;  n31=(i&lt;&lt;5)-i&lt;br /&gt;	 p1 = 7*i;  p2 = 11*i;  p3 = 13*i;  p4 = 17*i;  p5= 19*i; p6 = 23*i;  p7 = 29*i&lt;br /&gt;	 p8 = 31*i;  p9 = 37*i; p10 = 41*i;  p11 = 43*i; p12 = 47*i; p13 = 53*i; p14 = 59*i&lt;br /&gt;	 p15 = 49*i;  p16 = 61*i; k = 60*i&lt;br /&gt;	 &lt;br /&gt;	 #n2 = i&lt;&lt;1;  n4 = i&lt;&lt;2;  n8 = i&lt;&lt;3;  n16 = i&lt;&lt;4;  n32 = i&lt;&lt;5;  n64 = i&lt;&lt;6&lt;br /&gt;	 #p1 = n8-i;  p2 = n8+n4-i;  p3 = n8+n4+i;  p4 = n16+i;  p5 = n16+n2+i;  p6 = n16+n8-i&lt;br /&gt;	 #p7 = n32-n2-i;  p8 = n32-i;  p9=n32+n4+i;  p10=n32+n8+i;  p11=p2+n32;  p12=n32+n16-i&lt;br /&gt;	 #p13 = p9+n16;  p14 = n64-n4-i;  p15 = n64-n16+i;  p16 = n64-n2-i;  k = n64-n4&lt;br /&gt;	 while p1 &lt; num&lt;br /&gt;	     sieve[p1] = nil;  sieve[p2] = nil;   sieve[p3] = nil;  sieve[p4] = nil&lt;br /&gt;	     sieve[p5] = nil;  sieve[p6] = nil;   sieve[p7] = nil;  sieve[p8] = nil&lt;br /&gt;	     sieve[p9] = nil;  sieve[p10] = nil;  sieve[p11] = nil; sieve[p12] = nil&lt;br /&gt;	     sieve[p13] = nil;  sieve[p14] = nil; sieve[p15] = nil; sieve[p16] = nil&lt;br /&gt;	     p1 += k;  p2 += k;  p3 += k;  p4 += k;  p5 += k; p6 += k; p7 += k; p16 +=k&lt;br /&gt;	     p8 += k;  p9 += k; p10 += k; p11 += k; p12 += k; p13 +=k; p14 +=k; p15 +=k&lt;br /&gt;	 end&lt;br /&gt;      end&lt;br /&gt;      sieve.compact! &lt;br /&gt;   end&lt;br /&gt;  &lt;br /&gt;   def primesP60a&lt;br /&gt;      # all prime candidates &gt; 5 are of form  60*k+(1,7,11,13,17,19,23,29,&lt;br /&gt;      # 31,37,41,43,47,49,53,59&lt;br /&gt;      # initialize sieve array with only these candidate values&lt;br /&gt;      # where sieve contains the odd integers representatives&lt;br /&gt;      # convert integers to array indices/vals by  i = (n-3)&gt;&gt;1 = (n&gt;&gt;1)-1&lt;br /&gt;      n1, n2, n3, n4, n5, n6, n7, n8, n9, n10 = -1, 2, 4, 5, 7, 8, 10, 13, 14, 17&lt;br /&gt;      n11, n12, n13, n14, n15, n16 = 19, 20, 22, 23, 25, 28&lt;br /&gt;      lndx= (self-1) &gt;&gt;1;  sieve = []&lt;br /&gt;      while n16 &lt; lndx&lt;br /&gt;         n1 += 30;   n2 += 30;   n3 += 30;   n4 += 30;   n5 += 30&lt;br /&gt;	 n6 += 30;   n7 += 30;   n8 += 30;   n9 += 30;   n10 += 30&lt;br /&gt;         n11 += 30;  n12 += 30;  n13 += 30;  n14 += 30;  n15 += 30;  n16 += 30&lt;br /&gt;	 sieve[n1] = n1;  sieve[n2] = n2;  sieve[n3] = n3;  sieve[n4] = n4&lt;br /&gt;	 sieve[n5] = n5;  sieve[n6] = n6;  sieve[n7] = n7;  sieve[n8] = n8&lt;br /&gt;	 sieve[n9] = n9;  sieve[n10] = n10;  sieve[n11] = n11;  sieve[n12] = n12&lt;br /&gt;	 sieve[n13] = n13; sieve[n14] = n14; sieve[n15] = n15;  sieve[n16] = n16&lt;br /&gt;      end&lt;br /&gt;      # now initialize sieve with the (odd) primes &lt; 210, resize array&lt;br /&gt;      sieve[0]=0;  sieve[1]=1;  sieve[2]=2;  sieve[4]=4;  sieve[5]=5;  sieve[7]=7&lt;br /&gt;      sieve[8]=8;  sieve[10]=10;  sieve[13]=13;  sieve[14]=14;  sieve[17]=17&lt;br /&gt;      sieve[19]=19; sieve[20]=20; sieve[22]=22;  sieve[25]=25;  sieve[28]=28&lt;br /&gt;      sieve = sieve[0..lndx-1]&lt;br /&gt;      &lt;br /&gt;      7.step(Math.sqrt(self).to_i, 2) do |i|&lt;br /&gt;         next unless sieve[(i&gt;&gt;1)-1]&lt;br /&gt;	 # p1=7*i, p2=11*i, p3=13*i ---- p14=53*i, p15=59*i, p16=61*i,  k=60*i&lt;br /&gt;	 # maps to: p1= (7*i-3)&gt;&gt;1, --- p16=(61*i)&gt;&gt;1, k=60*i&gt;&gt;1 &lt;br /&gt;	 n4=i&lt;&lt;2;  n8=i&lt;&lt;3;  n16=i&lt;&lt;4;  n32=i&lt;&lt;5;  n64=i&lt;&lt;6; n12=n16-n4&lt;br /&gt;	 n19=n16+n4-i;  n37=n32+n4+i;  n41=n32+n8+i;  n43=43*i;  n48=n32+n16;  &lt;br /&gt;	 n53=n64-n12+i;  n60=n64-n4&lt;br /&gt;	 p1 = (n8-i-3)&gt;&gt;1; p2 = (n12-i-3)&gt;&gt;1;  p3 = (n12+i-3)&gt;&gt;1;  p4 = (n16+i-3)&gt;&gt;1&lt;br /&gt;	 p5 = (n19-3)&gt;&gt;1;  p6 = (n16+n8-i-3)&gt;&gt;1; p7 = (n32-n4+i-3)&gt;&gt;1; p8=(n32-i-3)&gt;&gt;1&lt;br /&gt;	 p9 = (n37-3)&gt;&gt;1;  p10 = (n41-3)&gt;&gt;1;   p11 = (n43-3)&gt;&gt;1;   p12 = (n48-i-3)&gt;&gt;1&lt;br /&gt;	 p13 = (n48+i-3)&gt;&gt;1; p14 = (n53-3)&gt;&gt;1; p15 = (n60-i-3)&gt;&gt;1; p16 = (n60+i-3)&gt;&gt;1&lt;br /&gt;	 k = n60&gt;&gt;1&lt;br /&gt;	 while p1 &lt; lndx&lt;br /&gt;	     sieve[p1] = nil;  sieve[p2] = nil;  sieve[p3] = nil;  sieve[p4] = nil&lt;br /&gt;	     sieve[p5] = nil;  sieve[p6] = nil;  sieve[p7] = nil;  sieve[p8] = nil&lt;br /&gt;	     sieve[p9] = nil;  sieve[p10] = nil; sieve[p11] = nil; sieve[p12] = nil&lt;br /&gt;	     sieve[p13] = nil; sieve[p14] = nil; sieve[p15] = nil; sieve[p16] = nil&lt;br /&gt;	     p1 += k; p2 += k;  p3 += k;  p4 += k;  p5 += k; p6 += k; p7 += k; p8 += k&lt;br /&gt;	     p9 += k; p10 += k; p11 += k; p12 += k; p13 +=k; p14 +=k; p15 +=k; p16 += k&lt;br /&gt;	 end&lt;br /&gt;      end&lt;br /&gt;      return [2] if self &lt; 3&lt;br /&gt;      [2]+([nil]+sieve).compact!.map {|i| (i&lt;&lt;1)+3}&lt;br /&gt;   end&lt;br /&gt;   &lt;br /&gt;   def primesP11a&lt;br /&gt;      # all prime candidates &gt; 11 are of form 2311k+(1, 13&lt; resP11 &lt; 2310)&lt;br /&gt;      # uses generalized code with hardcoded arrays supplied, NOT OPTIMIZED!&lt;br /&gt;      # initialize sieve array with only these candidate values&lt;br /&gt;      # where sieve contains the odd integers representations&lt;br /&gt;      # convert integers to array indices/vals by  i = (n-3)&gt;&gt;1 = (n&gt;&gt;1)-1&lt;br /&gt;      # the primes and pcn array are converted values&lt;br /&gt;  &lt;br /&gt;      primes = [0, 1, 2, 4, 5, 7, 8, 10, 13, 14, 17, 19, 20, 22, 25, 28, 29, 32, 34, 35, 38, 40, 43, &lt;br /&gt;      47, 49, 50, 52, 53, 55, 62, 64, 67, 68, 73, 74, 77, 80, 82, 85, 88, 89, 94, 95, 97, 98, 104, &lt;br /&gt;      110, 112, 113, 115, 118, 119, 124, 127, 130, 133, 134, 137, 139, 140, 145, 152, 154, 155, 157, &lt;br /&gt;      164, 167, 172, 173, 175, 178, 182, 185, 188, 190, 193, 197, 199, 203, 208, 209, 214, 215, 218, &lt;br /&gt;      220, 223, 227, 229, 230, 232, 238, 242, 244, 248, 250, 253, 259, 260, 269, 272, 277, 280, 283, &lt;br /&gt;      284, 287, 292, 295, 298, 299, 302, 305, 307, 308, 314, 319, 320, 322, 325, 328, 329, 335, 337, &lt;br /&gt;      340, 344, 349, 353, 358, 362, 365, 368, 370, 374, 377, 379, 383, 385, 392, 397, 403, 404, 409,&lt;br /&gt;      410, 412, 413, 418, 425, 427, 428, 430, 437, 439, 440, 442, 452, 454, 458, 463, 467, 469, 472, &lt;br /&gt;      475, 482, 484, 487, 490, 494, 497, 503, 505, 508, 509, 514, 515, 518, 523, 524, 529, 530, 533, &lt;br /&gt;      542, 544, 545, 547, 550, 553, 557, 560, 563, 574, 575, 580, 584, 589, 592, 595, 599, 605, 607, &lt;br /&gt;      610, 613, 614, 617, 623, 628, 637, 638, 640, 643, 644, 647, 649, 650, 652, 658, 659, 662, 679, &lt;br /&gt;      682, 685, 689, 698, 703, 710, 712, 713, 715, 718, 722, 724, 725, 728, 734, 739, 740, 742, 743, &lt;br /&gt;      745, 748, 754, 760, 764, 770, 773, 775, 778, 782, 784, 788, 790, 797, 799, 802, 803, 805, 808, &lt;br /&gt;      809, 812, 817, 827, 830, 832, 833, 845, 847, 848, 853, 859, 860, 865, 869, 872, 875, 878, 887, &lt;br /&gt;      890, 892, 893, 899, 904, 910, 914, 922, 929, 932, 934, 935, 937, 938, 943, 949, 952, 955, 964, &lt;br /&gt;      965, 973, 974, 985, 988, 992, 995, 997, 998, 1000, 1004, 1007, 1012, 1013, 1018, 1025, 1030, &lt;br /&gt;      1033, 1039, 1040, 1042, 1043, 1048, 1054, 1055, 1063, 1064, 1067, 1069, 1070, 1075, 1079, 1088, &lt;br /&gt;      1100, 1102, 1105, 1109, 1117, 1118, 1120, 1124, 1132, 1133, 1135, 1139, 1142, 1145, 1147, 1153]&lt;br /&gt;      &lt;br /&gt;      residues =[13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, &lt;br /&gt;      103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 169, 173, 179, 181, 191, 193, &lt;br /&gt;      197, 199, 211, 221, 223, 227, 229, 233, 239, 241, 247, 251, 257, 263, 269, 271, 277, 281, 283, &lt;br /&gt;      289, 293, 299, 307, 311, 313, 317, 323, 331, 337, 347, 349, 353, 359, 361, 367, 373, 377, 379, &lt;br /&gt;      383, 389, 391, 397, 401, 403, 409, 419, 421, 431, 433, 437, 439, 443, 449, 457, 461, 463, 467, &lt;br /&gt;      479, 481, 487, 491, 493, 499, 503, 509, 521, 523, 527, 529, 533, 541, 547, 551, 557, 559, 563, &lt;br /&gt;      569, 571, 577, 587, 589, 593, 599, 601, 607, 611, 613, 617, 619, 629, 631, 641, 643, 647, 653, &lt;br /&gt;      659, 661, 667, 673, 677, 683, 689, 691, 697, 701, 703, 709, 713, 719, 727, 731, 733, 739, 743, &lt;br /&gt;      751, 757, 761, 767, 769, 773, 779, 787, 793, 797, 799, 809, 811, 817, 821, 823, 827, 829, 839, &lt;br /&gt;      841, 851, 853, 857, 859, 863, 871, 877, 881, 883, 887, 893, 899, 901, 907, 911, 919, 923, 929, &lt;br /&gt;      937, 941, 943, 947, 949, 953, 961, 967, 971, 977, 983, 989, 991, 997, 1003, 1007, 1009, 1013, &lt;br /&gt;      1019, 1021, 1027, 1031, 1033, 1037, 1039, 1049, 1051, 1061, 1063, 1069, 1073, 1079, 1081, 1087,&lt;br /&gt;      1091, 1093, 1097, 1103, 1109, 1117, 1121, 1123, 1129, 1139, 1147, 1151, 1153, 1157, 1159, 1163, &lt;br /&gt;      1171, 1181, 1187, 1189, 1193, 1201, 1207, 1213, 1217, 1219, 1223, 1229, 1231, 1237, 1241, 1247, &lt;br /&gt;      1249, 1259, 1261, 1271, 1273, 1277, 1279, 1283, 1289, 1291, 1297, 1301, 1303, 1307, 1313, 1319, &lt;br /&gt;      1321, 1327, 1333, 1339, 1343, 1349, 1357, 1361, 1363, 1367, 1369, 1373, 1381, 1387, 1391, 1399, &lt;br /&gt;      1403, 1409, 1411, 1417, 1423, 1427, 1429, 1433, 1439, 1447, 1451, 1453, 1457, 1459, 1469, 1471, &lt;br /&gt;      1481, 1483, 1487, 1489, 1493, 1499, 1501, 1511, 1513, 1517, 1523, 1531, 1537, 1541, 1543, 1549, &lt;br /&gt;      1553, 1559, 1567, 1571, 1577, 1579, 1583, 1591, 1597, 1601, 1607, 1609, 1613, 1619, 1621, 1627, &lt;br /&gt;      1633, 1637, 1643, 1649, 1651, 1657, 1663, 1667, 1669, 1679, 1681, 1691, 1693, 1697, 1699, 1703, &lt;br /&gt;      1709, 1711, 1717, 1721, 1723, 1733, 1739, 1741, 1747, 1751, 1753, 1759, 1763, 1769, 1777, 1781, &lt;br /&gt;      1783, 1787, 1789, 1801, 1807, 1811, 1817, 1819, 1823, 1829, 1831, 1843, 1847, 1849, 1853, 1861, &lt;br /&gt;      1867, 1871, 1873, 1877, 1879, 1889, 1891, 1901, 1907, 1909, 1913, 1919, 1921, 1927, 1931, 1933, &lt;br /&gt;      1937, 1943, 1949, 1951, 1957, 1961, 1963, 1973, 1979, 1987, 1993, 1997, 1999, 2003, 2011, 2017, &lt;br /&gt;      2021, 2027, 2029, 2033, 2039, 2041, 2047, 2053, 2059, 2063, 2069, 2071, 2077, 2081, 2083, 2087, &lt;br /&gt;      2089, 2099, 2111, 2113, 2117, 2119, 2129, 2131, 2137, 2141, 2143, 2147, 2153, 2159, 2161, 2171, &lt;br /&gt;      2173, 2179, 2183, 2197, 2201, 2203, 2207, 2209, 2213, 2221, 2227, 2231, 2237, 2239, 2243, 2249, &lt;br /&gt;      2251, 2257, 2263, 2267, 2269, 2273, 2279, 2281, 2287, 2291, 2293, 2297, 2309]&lt;br /&gt;      &lt;br /&gt;      pcn = [-1, 5, 7, 8, 10, 13, 14, 17, 19, 20, 22, 25, 28, 29, 32, 34, 35, 38, 40, 43, 47, 49, 50, &lt;br /&gt;      52, 53, 55, 62, 64, 67, 68, 73, 74, 77, 80, 82, 83, 85, 88, 89, 94, 95, 97, 98, 104, 109, 110, &lt;br /&gt;      112, 113, 115, 118, 119, 122, 124, 127, 130, 133, 134, 137, 139, 140, 143, 145, 148, 152, 154, &lt;br /&gt;      155, 157, 160, 164, 167, 172, 173, 175, 178, 179, 182, 185, 187, 188, 190, 193, 194, 197, 199, &lt;br /&gt;      200, 203, 208, 209, 214, 215, 217, 218, 220, 223, 227, 229, 230, 232, 238, 239, 242, 244, 245, &lt;br /&gt;      248, 250, 253, 259, 260, 262, 263, 265, 269, 272, 274, 277, 278, 280, 283, 284, 287, 292, 293, &lt;br /&gt;      295, 298, 299, 302, 304, 305, 307, 308, 313, 314, 319, 320, 322, 325, 328, 329, 332, 335, 337, &lt;br /&gt;      340, 343, 344, 347, 349, 350, 353, 355, 358, 362, 364, 365, 368, 370, 374, 377, 379, 382, 383, &lt;br /&gt;      385, 388, 392, 395, 397, 398, 403, 404, 407, 409, 410, 412, 413, 418, 419, 424, 425, 427, 428, &lt;br /&gt;      430, 434, 437, 439, 440, 442, 445, 448, 449, 452, 454, 458, 460, 463, 467, 469, 470, 472, 473, &lt;br /&gt;      475, 479, 482, 484, 487, 490, 493, 494, 497, 500, 502, 503, 505, 508, 509, 512, 514, 515, 517, &lt;br /&gt;      518, 523, 524, 529, 530, 533, 535, 538, 539, 542, 544, 545, 547, 550, 553, 557, 559, 560, 563, &lt;br /&gt;      568, 572, 574, 575, 577, 578, 580, 584, 589, 592, 593, 595, 599, 602, 605, 607, 608, 610, 613, &lt;br /&gt;      614, 617, 619, 622, 623, 628, 629, 634, 635, 637, 638, 640, 643, 644, 647, 649, 650, 652, 655, &lt;br /&gt;      658, 659, 662, 665, 668, 670, 673, 677, 679, 680, 682, 683, 685, 689, 692, 694, 698, 700, 703, &lt;br /&gt;      704, 707, 710, 712, 713, 715, 718, 722, 724, 725, 727, 728, 733, 734, 739, 740, 742, 743, 745, &lt;br /&gt;      748, 749, 754, 755, 757, 760, 764, 767, 769, 770, 773, 775, 778, 782, 784, 787, 788, 790, 794, &lt;br /&gt;      797, 799, 802, 803, 805, 808, 809, 812, 815, 817, 820, 823, 824, 827, 830, 832, 833, 838, 839, &lt;br /&gt;      844, 845, 847, 848, 850, 853, 854, 857, 859, 860, 865, 868, 869, 872, 874, 875, 878, 880, 883, &lt;br /&gt;      887, 889, 890, 892, 893, 899, 902, 904, 907, 908, 910, 913, 914, 920, 922, 923, 925, 929, 932, &lt;br /&gt;      934, 935, 937, 938, 943, 944, 949, 952, 953, 955, 958, 959, 962, 964, 965, 967, 970, 973, 974, &lt;br /&gt;      977, 979, 980, 985, 988, 992, 995, 997, 998, 1000, 1004, 1007, 1009, 1012, 1013, 1015, 1018, &lt;br /&gt;      1019, 1022, 1025, 1028, 1030, 1033, 1034, 1037, 1039, 1040, 1042, 1043, 1048, 1054, 1055, 1057, &lt;br /&gt;      1058, 1063, 1064, 1067, 1069, 1070, 1072, 1075, 1078, 1079, 1084, 1085, 1088, 1090, 1097, 1099, &lt;br /&gt;      1100, 1102, 1103, 1105, 1109, 1112, 1114, 1117, 1118, 1120, 1123, 1124, 1127, 1130, 1132, 1133, &lt;br /&gt;      1135, 1138, 1139, 1142, 1144, 1145, 1147, 1153]&lt;br /&gt;&lt;br /&gt;      # now initialize modPn, lndx and sieve then find prime candidates&lt;br /&gt;      # set initial prime candidates to (converted) residue values&lt;br /&gt;      lndx= (self-1)&gt;&gt;1;   mod = 2310;  m = mod&gt;&gt;1;   sieve = []&lt;br /&gt;      while pcn.last &lt; lndx&lt;br /&gt;	  pcn.each_index {|j| n = pcn[j]+m;  sieve[n] = n;  pcn[j] = n }&lt;br /&gt;      end&lt;br /&gt;      # now initialize sieve with the (odd) primes &lt; modPn, resize array&lt;br /&gt;      primes.each {|p| sieve[p] = p };   sieve = sieve[0..lndx-1]&lt;br /&gt;&lt;br /&gt;      # perform sieve with residue elements resPn+(modPn+1)&lt;br /&gt;      residues &lt;&lt; (mod + 1)&lt;br /&gt;      13.step(Math.sqrt(self).to_i, 2) do |i|&lt;br /&gt;          next unless sieve[(i&gt;&gt;1)-1]&lt;br /&gt;	  # p1=res1*i, p2=res2*i, p3=res3*i -- pN-1=res(N-1)*i, pN=resN*i, k=mod*i&lt;br /&gt;	  # maps to: p1= (res1*i-3)&gt;&gt;1, --- pN=(((mod+1)-3)*i)&gt;&gt;1, k=m*i&gt;&gt;1&lt;br /&gt;          res = residues.map{|prm| (prm*i&gt;&gt;1)-1};   k = (mod*i)&gt;&gt;1&lt;br /&gt;          while res[0] &lt; lndx&lt;br /&gt;	      res.each_index {|j| sieve[res[j]] = nil;  res[j] += k }&lt;br /&gt;	  end&lt;br /&gt;      end&lt;br /&gt;      return [2] if self &lt; 3&lt;br /&gt;      [2]+([nil]+sieve).compact!.map {|i| (i&lt;&lt;1) +3 }&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;   def primesPn(input=nil)&lt;br /&gt;      # generalized Sieve of Zakiya, takes an input prime or modulus&lt;br /&gt;      # all prime candidates &gt; Pn are of form modPn*k+[1, res(Pn)]&lt;br /&gt;      # initialize sieve array with only these candidate values&lt;br /&gt;      # where sieve contains the odd integers representations&lt;br /&gt;      # convert integers to array indices/vals by  i = (n-3)&gt;&gt;1 = (n&gt;&gt;1)-1&lt;br /&gt;&lt;br /&gt;      # if no input value then just perform SoZ P7a as reference sieve&lt;br /&gt;      return  primesP7a  if  input == nil&lt;br /&gt;&lt;br /&gt;      seeds = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61]&lt;br /&gt;      mcps = [289, 391, 481, 493, 529, 559, 629, 667, 793, 841, 893, 899, 923, 961, &lt;br /&gt;              1037, 1121, 1189, 1273, 1349, 1387, 1411, 1417, 1469, 1517, 1643, 1681, &lt;br /&gt;              1751, 1781, 1817, 1829, 1919, 2021]&lt;br /&gt;		  &lt;br /&gt;      # if input is a prime number, determine modulus = P!(n) and seed primes&lt;br /&gt;      if input&amp;1 == 1&lt;br /&gt;          # find seed primes &lt;= Pn,  compute modPn&lt;br /&gt;	  return 'INVALID OR TOO LARGE PRIME' if !seeds.include? input&lt;br /&gt;          seeds = seeds[0 .. seeds.index(input)];   mod = seeds.inject {|a,b| a*b}&lt;br /&gt;      else  # if input a modulus (even number), determine seed primes for it&lt;br /&gt;	   md,  pp, mod = 2, 3, input&lt;br /&gt;	   seeds[1..-1].each {|i| md *=i;  break if mod &lt; md;  pp = i}&lt;br /&gt;	   seeds = seeds[0 .. seeds.index(pp)]&lt;br /&gt;      end&lt;br /&gt;&lt;br /&gt;      # create array of prime residues for primes Pn &lt; pk &lt; modPn&lt;br /&gt;      primes = mod.primesP7a;    residues  = primes - seeds&lt;br /&gt;&lt;br /&gt;      # find modular compliments of primes [1, Pn &lt; p &lt; modPn] if necessary&lt;br /&gt;      mcp = [];  tmp = [1]+residues&lt;br /&gt;      while !tmp.empty?;  b = mod - tmp.shift;  mcp &lt;&lt; b unless tmp.delete(b)  end&lt;br /&gt;&lt;br /&gt;      residues.concat(mcp).sort!;  residues.concat(mcps).sort! if [11, 2310].include? input&lt;br /&gt;      &lt;br /&gt;      # now initialize modPn, lndx and sieve then find prime candidates&lt;br /&gt;      # set initial prime candidates to (converted) residue values&lt;br /&gt;      lndx= (self-1)&gt;&gt;1;   m=mod&gt;&gt;1;   sieve = []&lt;br /&gt;      pcn = [-1]+residues.map {|t| (t&gt;&gt;1)-1}&lt;br /&gt;      while pcn.last &lt; lndx&lt;br /&gt;	  pcn.each_index {|j| n = pcn[j]+m;  sieve[n] = n;  pcn[j] = n }&lt;br /&gt;      end&lt;br /&gt;      # now initialize sieve with the (odd) primes &lt; modPn, resize array&lt;br /&gt;      primes[1..-1].each {|x| p =(x-3)&gt;&gt;1;  sieve[p] = p };   sieve = sieve[0..lndx-1]&lt;br /&gt;&lt;br /&gt;      # perform sieve with residue elements resPn+(modPn+1)&lt;br /&gt;      residues &lt;&lt; (mod + 1);   res0 = residues[0]&lt;br /&gt;      res0.step(Math.sqrt(self).to_i, 2) do |i|&lt;br /&gt;          next unless sieve[(i&gt;&gt;1)-1]&lt;br /&gt;	  # p1=res1*i, p2=res2*i, p3=res3*i -- pN-1=res(N-1)*i, pN=resN*i, k=mod*i&lt;br /&gt;	  # maps to: p1= (res1*i-3)&gt;&gt;1, --- pN=(((mod+1)-3)*i)&gt;&gt;1, k=mod*i&gt;&gt;1&lt;br /&gt;          res = residues.map{|prm| (prm*i-3)&gt;&gt;1};   k = (mod*i)&gt;&gt;1&lt;br /&gt;          while res[0] &lt; lndx&lt;br /&gt;	      res.each_index {|j| sieve[res[j]] = nil;  res[j] += k }&lt;br /&gt;	  end&lt;br /&gt;      end&lt;br /&gt;      return [2] if self &lt; 3&lt;br /&gt;      [2]+([nil]+sieve).compact!.map {|i| (i&lt;&lt;1) +3 }&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;   def primz?&lt;br /&gt;      # number theory based deterministic primality tester&lt;br /&gt;      n = self.abs&lt;br /&gt;      return true  if [2, 3, 5].include? n&lt;br /&gt;      return false if n == 1 || n &amp; 1 == 0&lt;br /&gt;      return false if n &gt; 5 &amp;&amp; ( ! [1, 5].include?(n%6) || n%5 == 0)&lt;br /&gt;&lt;br /&gt;      7.step(Math.sqrt(n).to_i,2) do |i|&lt;br /&gt;	 #  p5= 5*i,  k = 6*i,  p7 = 7*i  &lt;br /&gt;	 p1 = 5*i;  k = p1+i;  p2 = k+i&lt;br /&gt;	 return false if  [(n-p1)%k , (n-p2)%k].include? 0&lt;br /&gt;      end   	&lt;br /&gt;      return true&lt;br /&gt;   end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   def sieveOfAtkin(num)&lt;br /&gt;&lt;br /&gt;      num += 1&lt;br /&gt;      lng = (num&gt;&gt;1)-1+(num&amp;1)&lt;br /&gt;      sieve = [nil]*(lng + 1)&lt;br /&gt;&lt;br /&gt;      x_max, x2  = Math.sqrt((num-1) / 4.0).to_i, 0&lt;br /&gt;      4.step( 8*x_max + 1, 8) do |xd|&lt;br /&gt;          x2 += xd;    y_max = Math.sqrt(num-x2).to_i&lt;br /&gt;          n, n_diff = x2 + y_max**2, (y_max &lt;&lt; 1) - 1&lt;br /&gt;          if n&amp;1 == 0  then  n -= n_diff;   n_diff -= 2  end&lt;br /&gt;          ((n_diff - 1) &lt;&lt; 1).step( -2, -8)  do |d|&lt;br /&gt;              m = n%12&lt;br /&gt;              if (m == 1 or m == 5) then m= n &gt;&gt; 1;  sieve[m] = !sieve[m]  end&lt;br /&gt;	      #if [1,5].include? m then m = n &gt;&gt; 1;  sieve[m] = !sieve[m]  end&lt;br /&gt;              n -= d&lt;br /&gt;	  end&lt;br /&gt;      end&lt;br /&gt;&lt;br /&gt;      x_max,  x2 = Math.sqrt((num-1) / 3.0).to_i, 0&lt;br /&gt;      3.step(6*x_max + 1, 6) do |xd|&lt;br /&gt;          x2 += xd;    y_max = Math.sqrt(num-x2).to_i&lt;br /&gt;          n,  n_diff = x2 + y_max**2, (y_max &lt;&lt; 1) - 1&lt;br /&gt;          if n&amp;1 == 0  then  n -= n_diff;   n_diff -= 2  end&lt;br /&gt;          ((n_diff - 1) &lt;&lt; 1).step( -2, -8) do |d|&lt;br /&gt;              if (n%12 == 7) then  m = n &gt;&gt; 1;  sieve[m] = !sieve[m]  end&lt;br /&gt;              n -= d&lt;br /&gt;	  end&lt;br /&gt;      end&lt;br /&gt;&lt;br /&gt;      x_max, y_min, x2, xd = ((2 + Math.sqrt(4-8*(1-num))) / 4).to_i, -1, 0, 3&lt;br /&gt;      (1 ... x_max + 1).each do |x|&lt;br /&gt;          x2 += xd;   xd += 6&lt;br /&gt;	  y_min = (((Math.sqrt(x2 - num).ceil - 1) &lt;&lt; 1) - 2) &lt;&lt; 1  if x2 &gt;= nu&lt;br /&gt;          n, n_diff = ((x*x + x) &lt;&lt; 1) - 1, (((x-1) &lt;&lt; 1) - 2) &lt;&lt; 1&lt;br /&gt;          (n_diff).step(y_min-1, -8) do |d|&lt;br /&gt;              if (n%12 == 11)  then  m = n &gt;&gt; 1;  sieve[m] = !sieve[m]  end&lt;br /&gt;              n += d&lt;br /&gt;	  end&lt;br /&gt;      end&lt;br /&gt;&lt;br /&gt;      return [2]  if num-1 &lt; 3&lt;br /&gt;      primes = [2,3]&lt;br /&gt;&lt;br /&gt;      (2 ...  (Math.sqrt(num).to_i+ 1) &gt;&gt; 1).each do |n|&lt;br /&gt;          next unless sieve[n]&lt;br /&gt;	  i = (n &lt;&lt; 1) +1;   j= i*i;   primes &lt;&lt; i&lt;br /&gt;          (j).step(num-1, j &lt;&lt; 1) { |k| sieve[k&gt;&gt;1] = nil }&lt;br /&gt;      end&lt;br /&gt;&lt;br /&gt;      s = Math.sqrt(num).to_i + 1&lt;br /&gt;      s += 1  if  s&amp;1 == 0&lt;br /&gt;      s.step(num-1, 2) {|i| primes &lt;&lt; i  if sieve[i&gt;&gt;1] }&lt;br /&gt;&lt;br /&gt;      return primes&lt;br /&gt;    end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;def tm(code); s=Time.now; eval code; Time.now-s end&lt;br /&gt;def primesxy(x,y);  (x..y).map {|p| p.primz? ? p : nil }.compact!  end&lt;br /&gt;&lt;br /&gt;limit= 10_000_001&lt;br /&gt;ret1, ret2, ret3, ret4, ret5, ret6, ret7, ret8, ret9 = nil&lt;br /&gt;&lt;br /&gt;Benchmark.bm(14) do |t| &lt;br /&gt;   t.report("primes up to #{limit}: ") do ret1 = sieveOfAtkin(limit)end&lt;br /&gt;   t.report("primes up to #{limit}: ") do ret2 = limit.primesP60a end&lt;br /&gt;   t.report("primes up to #{limit}: ") do ret3 = limit.primesPn(3) end&lt;br /&gt;   t.report("primes up to #{limit}: ") do ret4 = limit.primesPn(5) end&lt;br /&gt;   t.report("primes up to #{limit}: ") do ret5 = limit.primesPn(7) end&lt;br /&gt;   t.report("primes up to #{limit}: ") do ret6 = limit.primesPn(11) end&lt;br /&gt;   t.report("primes up to #{limit}: ") do ret7 = limit.primesP3a end&lt;br /&gt;   t.report("primes up to #{limit}: ") do ret8 = limit.primesP5a end&lt;br /&gt;   t.report("primes up to #{limit}: ") do ret9 = limit.primesP7a end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;#p ret1.first(10)&lt;br /&gt;puts;  p ret1.last(10);  p ret1.size&lt;br /&gt;&lt;br /&gt;#p ret2.first(10)&lt;br /&gt;puts;  p ret2.last(10);  p ret2.size&lt;br /&gt;&lt;br /&gt;#p ret3.first(10)&lt;br /&gt;puts;  p ret3.last(10);  p ret3.size&lt;br /&gt;&lt;br /&gt;#p ret4.first(10)&lt;br /&gt;puts;  p ret4.last(10);  p ret4.size&lt;br /&gt;&lt;br /&gt;#p ret5.first(10)&lt;br /&gt;puts;  p ret5.last(10);  p ret5.size&lt;br /&gt;&lt;br /&gt;#p ret6.first(10)&lt;br /&gt;puts;  p ret6.last(10);  p ret6.size&lt;br /&gt;&lt;br /&gt;#p ret7.first(10)&lt;br /&gt;puts;  p ret7.last(10);  p ret7.size&lt;br /&gt;&lt;br /&gt;#p ret8.first(10)&lt;br /&gt;puts;  p ret8.last(10);  p ret8.size&lt;br /&gt;&lt;br /&gt;#p ret9.first(10)&lt;br /&gt;puts;  p ret9.last(10);  p ret9.size&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Fri, 06 Jun 2008 22:47:09 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5610</guid>
      <author>jzakiya (Jabari Zakiya)</author>
    </item>
    <item>
      <title>First n primes in Ruby</title>
      <link>http://snippets.dzone.com/posts/show/5380</link>
      <description>&lt;code&gt;&lt;br /&gt;&lt;br /&gt;#!/usr/local/bin/ruby -w&lt;br /&gt;&lt;br /&gt;require 'benchmark' &lt;br /&gt;&lt;br /&gt;class Integer    &lt;br /&gt;   def prime?         # cf. http://snippets.dzone.com/posts/show/4636&lt;br /&gt;     n = self.abs()&lt;br /&gt;     return true if n == 2&lt;br /&gt;     return false if n == 1 || n &amp; 1 == 0&lt;br /&gt;     d = n-1&lt;br /&gt;     d &gt;&gt;= 1 while d &amp; 1 == 0&lt;br /&gt;     20.times do                               # 20 = k from above&lt;br /&gt;       a = rand(n-2) + 1&lt;br /&gt;       t = d&lt;br /&gt;       y = ModMath.pow(a,t,n)                  # implemented below&lt;br /&gt;       while t != n-1 &amp;&amp; y != 1 &amp;&amp; y != n-1&lt;br /&gt;         y = (y * y) % n&lt;br /&gt;         t &lt;&lt;= 1&lt;br /&gt;       end&lt;br /&gt;       return false if y != n-1 &amp;&amp; t &amp; 1 == 0&lt;br /&gt;     end&lt;br /&gt;     return true&lt;br /&gt;   end&lt;br /&gt;end&lt;br /&gt; &lt;br /&gt;module ModMath&lt;br /&gt;   def ModMath.pow(base, power, mod)&lt;br /&gt;     result = 1&lt;br /&gt;     while power &gt; 0&lt;br /&gt;       result = (result * base) % mod if power &amp; 1 == 1&lt;br /&gt;       base = (base * base) % mod&lt;br /&gt;       power &gt;&gt;= 1;&lt;br /&gt;     end&lt;br /&gt;     result&lt;br /&gt;   end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class Integer&lt;br /&gt;&lt;br /&gt;   def primes   # cf. http://snippets.dzone.com/posts/show/3734&lt;br /&gt;&lt;br /&gt;      sieve = []&lt;br /&gt;      3.step(self, 2) { |i| sieve[i] = i }&lt;br /&gt;      sieve[1] = nil&lt;br /&gt;      sieve[2] = 2&lt;br /&gt;&lt;br /&gt;      3.step(Math.sqrt(self).floor, 2) do |i| &lt;br /&gt;         next unless sieve[i]&lt;br /&gt;         (i*i).step(self, i) do |j|&lt;br /&gt;            sieve[j] = nil&lt;br /&gt;         end&lt;br /&gt;      end&lt;br /&gt;&lt;br /&gt;      sieve.compact!&lt;br /&gt;&lt;br /&gt;   end &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   def primes2       # cf. http://snippets.dzone.com/posts/show/3734&lt;br /&gt;&lt;br /&gt;      primes = [nil, nil].concat((2..self).to_a)&lt;br /&gt;&lt;br /&gt;      (2 .. Math.sqrt(self)).each do |i|&lt;br /&gt;         next unless primes[i]&lt;br /&gt;            (i*i).step(self, i) do |j|&lt;br /&gt;               primes[j] = nil&lt;br /&gt;            end&lt;br /&gt;      end&lt;br /&gt;	&lt;br /&gt;      primes.compact!&lt;br /&gt;&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class Integer&lt;br /&gt;&lt;br /&gt;   @primes_cache ||= 100.primes&lt;br /&gt;   #@primes_cache ||= [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31]&lt;br /&gt;   class &lt;&lt; self; attr_accessor :primes_cache; end&lt;br /&gt;&lt;br /&gt;   @nthprime_limit ||= 5_000_000&lt;br /&gt;   class &lt;&lt; self; attr_reader :nthprime_limit; end&lt;br /&gt;   #class &lt;&lt; self; attr_accessor :nthprime_limit; end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   def sieve_size&lt;br /&gt;      num = self.to_i.abs&lt;br /&gt;      logn = Math.log(num)&lt;br /&gt;      if num &lt; 15985     # cf. http://primes.utm.edu/howmany.shtml&lt;br /&gt;         ( num * (logn + Math.log(logn) - 1 + 1.8 * Math.log(logn) / logn) ).floor&lt;br /&gt;      else&lt;br /&gt;         ( num * (logn + Math.log(logn) - 0.9427) ).floor&lt;br /&gt;      end&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   def nthprime&lt;br /&gt;&lt;br /&gt;      num = self.to_i.abs&lt;br /&gt;&lt;br /&gt;      # set a limit; cf. http://primes.utm.edu/nthprime/: The 5,000,000th prime is 86,028,121.&lt;br /&gt;      raise "#{num}: number too big for Integer#nthprime" if num &gt; Integer.nthprime_limit      &lt;br /&gt;&lt;br /&gt;      primes_cache_size = Integer.primes_cache.size&lt;br /&gt;&lt;br /&gt;      if num &gt; primes_cache_size&lt;br /&gt;&lt;br /&gt;         # optional; cf. Integer#nthprime_add and Integer#nthprime_add_mr below&lt;br /&gt;         if num &gt;= 50_000 &amp;&amp; num &lt; 100_000 &amp;&amp; (num - primes_cache_size) &lt; 5000 then return num.nthprime_add end&lt;br /&gt;         if num &gt;= 100_000 &amp;&amp; num &lt; 200_000 &amp;&amp; (num - primes_cache_size) &lt; 15000 then return num.nthprime_add end&lt;br /&gt;         if num &gt;= 200_000 &amp;&amp; (num - primes_cache_size) &lt; 35000 then return num.nthprime_add end&lt;br /&gt;         &lt;br /&gt;         logn = Math.log(num)&lt;br /&gt;&lt;br /&gt;         if num &lt; 15985       # cf. http://primes.utm.edu/howmany.shtml&lt;br /&gt;            limit = ( num * (logn + Math.log(logn) - 1 + 1.8 * Math.log(logn) / logn) ).floor&lt;br /&gt;            Integer.primes_cache = limit.primes&lt;br /&gt;         else&lt;br /&gt;            limit = ( num * (logn + Math.log(logn) - 0.9427) ).floor&lt;br /&gt;            Integer.primes_cache = limit.primes&lt;br /&gt;         end&lt;br /&gt;&lt;br /&gt;=begin&lt;br /&gt;         elsif num &gt;= 15985 &amp;&amp; num &lt;= 1_000_000&lt;br /&gt;            limit = ( num * (logn + Math.log(logn) - 0.9427) ).floor&lt;br /&gt;            Integer.primes_cache = limit.primes&lt;br /&gt;         elsif num &gt; 1_000_000&lt;br /&gt;            Integer.primes_cache = 20_000_000.primes&lt;br /&gt;         end&lt;br /&gt;=end&lt;br /&gt;&lt;br /&gt;      else&lt;br /&gt;         return Integer.primes_cache.at(num-1)&lt;br /&gt;      end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      if num &lt;= Integer.primes_cache.size&lt;br /&gt;         return Integer.primes_cache.at(num-1)&lt;br /&gt;      end&lt;br /&gt;&lt;br /&gt;      if Integer.primes_cache.size &gt; 2_500_000&lt;br /&gt;         num.nthprime_add_mr &lt;br /&gt;      else&lt;br /&gt;         num.nthprime_add   # faster for a (relatively) small prime cache&lt;br /&gt;      end&lt;br /&gt;&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   def nthprime_add       #  add primes to Integer.primes_cache up to the nth prime&lt;br /&gt;&lt;br /&gt;      num = self.to_i.abs&lt;br /&gt;&lt;br /&gt;      if num &lt;= Integer.primes_cache.size&lt;br /&gt;         return Integer.primes_cache.at(num-1)&lt;br /&gt;      end&lt;br /&gt;&lt;br /&gt;      last_prime = Integer.primes_cache.last&lt;br /&gt;      last_prime_divmod = last_prime.divmod(6)&lt;br /&gt;&lt;br /&gt;      if last_prime_divmod.last == 1&lt;br /&gt;         i = last_prime_divmod.first&lt;br /&gt;         Integer.primes_cache.pop      # avoid a duplicate prime&lt;br /&gt;      else&lt;br /&gt;         i = last_prime_divmod.first + 1&lt;br /&gt;      end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      while Integer.primes_cache.size &lt; num&lt;br /&gt;&lt;br /&gt;         n1 = 6*i+1       # cf. http://betterexplained.com/articles/another-look-at-prime-numbers/ and&lt;br /&gt;         n2 = n1+4        # http://everything2.com/index.pl?node_id=1176369&lt;br /&gt;         i += 1&lt;br /&gt;&lt;br /&gt;         [n1, n2].each do |p| &lt;br /&gt;&lt;br /&gt;            next if p % 5 == 0 || p % 7 == 0&lt;br /&gt;&lt;br /&gt;            next_num_sqrt = Math.sqrt(p).floor&lt;br /&gt;&lt;br /&gt;            Integer.primes_cache.each do |d| &lt;br /&gt;               if d &gt; next_num_sqrt &lt;br /&gt;                  Integer.primes_cache &lt;&lt; p&lt;br /&gt;                  #print "\r\e[0K#{Integer.primes_cache.size}"&lt;br /&gt;                  #$stdout.flush&lt;br /&gt;                  break&lt;br /&gt;               elsif p % d == 0&lt;br /&gt;                  break&lt;br /&gt;               end  &lt;br /&gt;            end&lt;br /&gt;         end   # each  &lt;br /&gt;&lt;br /&gt;      end  # while&lt;br /&gt;&lt;br /&gt;      return Integer.primes_cache.at(num-1)&lt;br /&gt;&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   def nthprime_add_mr       #  add Miller-Rabin primes to Integer.primes_cache up to the nth prime&lt;br /&gt;&lt;br /&gt;      num = self.to_i.abs&lt;br /&gt;&lt;br /&gt;      if num &lt;= Integer.primes_cache.size&lt;br /&gt;         return Integer.primes_cache.at(num-1)&lt;br /&gt;      end&lt;br /&gt;&lt;br /&gt;      last_prime = Integer.primes_cache.last&lt;br /&gt;      last_prime_divmod = last_prime.divmod(6)&lt;br /&gt;&lt;br /&gt;      if last_prime_divmod.last == 1&lt;br /&gt;         i = last_prime_divmod.first&lt;br /&gt;         Integer.primes_cache.pop&lt;br /&gt;      else&lt;br /&gt;         i = last_prime_divmod.first + 1&lt;br /&gt;      end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      while Integer.primes_cache.size &lt; num&lt;br /&gt;&lt;br /&gt;         search_next_prime = true&lt;br /&gt;&lt;br /&gt;         while search_next_prime&lt;br /&gt;&lt;br /&gt;            n1 = 6*i+1       &lt;br /&gt;            n2 = n1+4        &lt;br /&gt;            i += 1&lt;br /&gt;&lt;br /&gt;            [n1, n2].each do |p| &lt;br /&gt;&lt;br /&gt;               next if p % 5 == 0 || p % 7 == 0&lt;br /&gt;&lt;br /&gt;               if p.prime?&lt;br /&gt;                  Integer.primes_cache &lt;&lt; p&lt;br /&gt;                  search_next_prime = false&lt;br /&gt;                  #print "\r\e[0K#{Integer.primes_cache.size}"&lt;br /&gt;                  #$stdout.flush&lt;br /&gt;               end&lt;br /&gt;            end&lt;br /&gt;         end&lt;br /&gt;&lt;br /&gt;      end  #  first while loop&lt;br /&gt;&lt;br /&gt;      return Integer.primes_cache.at(num-1)&lt;br /&gt;&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#------------------------------------------- some additional prime methods&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   def next_primes_in_cache    # next primes in Integer.primes_cache&lt;br /&gt;&lt;br /&gt;      search_next_primes = self.to_i.abs&lt;br /&gt;&lt;br /&gt;      last_prime = Integer.primes_cache.last&lt;br /&gt;      last_prime_divmod = last_prime.divmod(6)&lt;br /&gt;&lt;br /&gt;      if last_prime_divmod.last == 1&lt;br /&gt;         i = last_prime_divmod.first&lt;br /&gt;         Integer.primes_cache.pop&lt;br /&gt;      else&lt;br /&gt;         i = last_prime_divmod.first + 1&lt;br /&gt;      end&lt;br /&gt;&lt;br /&gt;      while search_next_primes &gt; 0&lt;br /&gt;&lt;br /&gt;         n1 = 6*i+1       &lt;br /&gt;         n2 = n1+4        &lt;br /&gt;         i += 1&lt;br /&gt;&lt;br /&gt;         [n1, n2].each do |p| &lt;br /&gt;&lt;br /&gt;            next if p % 5 == 0 || p % 7 == 0&lt;br /&gt;            next_num_sqrt = Math.sqrt(p).floor&lt;br /&gt;&lt;br /&gt;            Integer.primes_cache.each do |d| &lt;br /&gt;               if d &gt; next_num_sqrt &lt;br /&gt;                  Integer.primes_cache &lt;&lt; p&lt;br /&gt;                  search_next_primes -= 1&lt;br /&gt;                  #print "\r\e[0K#{Integer.primes_cache.size}"&lt;br /&gt;                  #$stdout.flush&lt;br /&gt;                  break&lt;br /&gt;               elsif p % d == 0&lt;br /&gt;                  break&lt;br /&gt;               end  &lt;br /&gt;            end&lt;br /&gt;         end &lt;br /&gt;      end   # while&lt;br /&gt;&lt;br /&gt;      Integer.primes_cache.last(self.to_i.abs)&lt;br /&gt;&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   def next_mr_prime     # next Miller-Rabin prime&lt;br /&gt;     &lt;br /&gt;      last_num = self.to_i.abs&lt;br /&gt;      last_num_divmod = last_num.divmod(6)&lt;br /&gt;&lt;br /&gt;      if last_num_divmod.last == 1&lt;br /&gt;         i = last_num_divmod.first&lt;br /&gt;      else&lt;br /&gt;         i = last_num_divmod.first + 1&lt;br /&gt;      end&lt;br /&gt;&lt;br /&gt;      next_prime = nil&lt;br /&gt;      search_next_prime = true&lt;br /&gt;&lt;br /&gt;      while search_next_prime&lt;br /&gt;&lt;br /&gt;         n1 = 6*i+1       &lt;br /&gt;         n2 = n1+4        &lt;br /&gt;         i += 1&lt;br /&gt;&lt;br /&gt;         [n1, n2].each do |p| &lt;br /&gt;&lt;br /&gt;            next if p % 5 == 0 || p % 7 == 0&lt;br /&gt;&lt;br /&gt;            if p &gt; last_num &amp;&amp; p.prime?&lt;br /&gt;               next_prime = p&lt;br /&gt;               search_next_prime = false &lt;br /&gt;               break&lt;br /&gt;            end&lt;br /&gt;         end&lt;br /&gt;      end&lt;br /&gt;&lt;br /&gt;         next_prime&lt;br /&gt;&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   def next_mr_primes(n)     # next Miller-Rabin primes&lt;br /&gt;&lt;br /&gt;      last_num = self.to_i.abs&lt;br /&gt;      last_num_divmod = last_num.divmod(6)&lt;br /&gt;&lt;br /&gt;      if last_num_divmod.last == 1&lt;br /&gt;         i = last_num_divmod.first&lt;br /&gt;      else&lt;br /&gt;         i = last_num_divmod.first + 1&lt;br /&gt;      end&lt;br /&gt;&lt;br /&gt;      next_primes = []&lt;br /&gt;      search_next_primes = n.to_i.abs&lt;br /&gt;&lt;br /&gt;      while search_next_primes &gt; 0&lt;br /&gt;&lt;br /&gt;         n1 = 6*i+1      &lt;br /&gt;         n2 = n1+4       &lt;br /&gt;         i += 1&lt;br /&gt;&lt;br /&gt;         [n1, n2].each do |p| &lt;br /&gt;&lt;br /&gt;            next if p % 5 == 0 || p % 7 == 0&lt;br /&gt;&lt;br /&gt;            if p &gt; last_num &amp;&amp; p.prime?&lt;br /&gt;               next_primes &lt;&lt; p&lt;br /&gt;               search_next_primes -= 1 &lt;br /&gt;            end&lt;br /&gt;         end&lt;br /&gt;      end&lt;br /&gt;&lt;br /&gt;      next_primes&lt;br /&gt;&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;num1 = 10_000&lt;br /&gt;num1 = 1_000&lt;br /&gt;num1 = 5_000&lt;br /&gt;&lt;br /&gt;num2 = 210_349&lt;br /&gt;num2 = 100_125&lt;br /&gt;num2 = 55_000&lt;br /&gt;&lt;br /&gt;ret1 = nil&lt;br /&gt;ret2 = nil&lt;br /&gt;ret3 = nil&lt;br /&gt;ret4 = nil&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Benchmark.bm(16) do |t| &lt;br /&gt;&lt;br /&gt;   t.report("first #{num1} primes: ") do&lt;br /&gt;      ret1 = num1.nthprime_add&lt;br /&gt;   end &lt;br /&gt;&lt;br /&gt;   Integer.primes_cache.clear&lt;br /&gt;   Integer.primes_cache.concat(100.primes)&lt;br /&gt;&lt;br /&gt;   t.report("first #{num1} primes: ") do&lt;br /&gt;      ret2 = num1.nthprime_add_mr&lt;br /&gt;   end &lt;br /&gt;&lt;br /&gt;   Integer.primes_cache.clear&lt;br /&gt;   Integer.primes_cache.concat(100.primes)&lt;br /&gt;&lt;br /&gt;   t.report("first #{num1} primes: ") do&lt;br /&gt;      ret3 = num1.nthprime&lt;br /&gt;   end &lt;br /&gt;&lt;br /&gt;   Integer.primes_cache.clear&lt;br /&gt;   Integer.primes_cache.concat(100.primes)&lt;br /&gt;&lt;br /&gt;   t.report("first #{num2} primes: ") do&lt;br /&gt;      ret4 = num2.nthprime&lt;br /&gt;   end &lt;br /&gt;&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;puts&lt;br /&gt;puts "the #{num1}th prime number: #{ret1}"&lt;br /&gt;puts "the #{num1}th prime number: #{ret2}"&lt;br /&gt;puts "the #{num1}th prime number: #{ret3}"&lt;br /&gt;puts "the #{num2}th prime number: #{ret4}"&lt;br /&gt;puts&lt;br /&gt;puts "the #{num1}th prime: #{Integer.primes_cache.at(num1-1)}"&lt;br /&gt;puts "the #{num2}th prime: #{Integer.primes_cache.at(num2-1)}"&lt;br /&gt;puts&lt;br /&gt;p Integer.primes_cache.first(10)&lt;br /&gt;p Integer.primes_cache.last(10)&lt;br /&gt;p Integer.primes_cache.size&lt;br /&gt;puts&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;p 15.next_primes_in_cache&lt;br /&gt;&lt;br /&gt;puts 594_213.next_mr_prime&lt;br /&gt;&lt;br /&gt;p 149_137.next_mr_primes(5)&lt;br /&gt;&lt;br /&gt;puts&lt;br /&gt;p 1_000.sieve_size&lt;br /&gt;p 1_000_000.sieve_size&lt;br /&gt;p 2_500_000.sieve_size&lt;br /&gt;p 5_000_000.sieve_size&lt;br /&gt;p 10_000_000.sieve_size&lt;br /&gt;p 100_000_000.sieve_size&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;=begin&lt;br /&gt;&lt;br /&gt;# check with primegen.c, http://cr.yp.to/primegen.html&lt;br /&gt;primes 2 48611 | nl | tail -n 1&lt;br /&gt;primes 2 104729 | nl | tail -n 1&lt;br /&gt;primes 2 679277 | nl | tail -n 1&lt;br /&gt;primes 2 1301423 | nl | tail -n 1&lt;br /&gt;primes 2 2903603 | nl | tail -n 1&lt;br /&gt;primes 1303129 1303283 | nl&lt;br /&gt;primes 594213 $((594213 + 500)) | head -n 1&lt;br /&gt;primes 149137 $((149137 + 1000)) | head -n 5&lt;br /&gt;&lt;br /&gt;# further prime tools from http://libtom.org&lt;br /&gt;- LibTomMath&lt;br /&gt;   bn_mp_prime_is_prime.c&lt;br /&gt;   bn_mp_prime_miller_rabin.c&lt;br /&gt;- TomsFastMath&lt;br /&gt;   fp_isprime.c&lt;br /&gt;   fp_prime_miller_rabin.c&lt;br /&gt;&lt;br /&gt;=end&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Thu, 17 Apr 2008 20:32:45 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5380</guid>
      <author>ntk ()</author>
    </item>
    <item>
      <title>Print a binary number in C</title>
      <link>http://snippets.dzone.com/posts/show/4716</link>
      <description>These are two functions that print the binary representation of an integer. The first simply prints it out, while the second only prints out the relevant digits (i.e. cuts the first x 0 digits) in groups of four.&lt;br /&gt;&lt;br /&gt;Explanation &lt;a href="http://compprog.wordpress.com/2007/10/29/bit-operations/"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#include &lt;stdio.h&gt;&lt;br /&gt;&lt;br /&gt;/* Print n as a binary number */&lt;br /&gt;void printbitssimple(int n) {&lt;br /&gt;	unsigned int i;&lt;br /&gt;	i = 1&lt;&lt;(sizeof(n) * 8 - 1);&lt;br /&gt;&lt;br /&gt;	while (i &gt; 0) {&lt;br /&gt;		if (n &amp; i)&lt;br /&gt;			printf("1");&lt;br /&gt;		else&lt;br /&gt;			printf("0");&lt;br /&gt;		i &gt;&gt;= 1;&lt;br /&gt;	}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/* Print n as a binary number */&lt;br /&gt;void printbits(int n) {&lt;br /&gt;	unsigned int i, step;&lt;br /&gt;&lt;br /&gt;	if (0 == n) { /* For simplicity's sake, I treat 0 as a special case*/&lt;br /&gt;		printf("0000");&lt;br /&gt;		return;&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	i = 1&lt;&lt;(sizeof(n) * 8 - 1);&lt;br /&gt;&lt;br /&gt;	step = -1; /* Only print the relevant digits */&lt;br /&gt;	step &gt;&gt;= 4; /* In groups of 4 */&lt;br /&gt;	while (step &gt;= n) {&lt;br /&gt;		i &gt;&gt;= 4;&lt;br /&gt;		step &gt;&gt;= 4;&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	/* At this point, i is the smallest power of two larger or equal to n */&lt;br /&gt;	while (i &gt; 0) {&lt;br /&gt;		if (n &amp; i)&lt;br /&gt;			printf("1");&lt;br /&gt;		else&lt;br /&gt;			printf("0");&lt;br /&gt;		i &gt;&gt;= 1;&lt;br /&gt;	}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int main(int argc, char *argv[]) {&lt;br /&gt;	int i;&lt;br /&gt;	for (i = 0; i &lt; 16; ++i) {&lt;br /&gt;		printf("%d = ", i);&lt;br /&gt;		printbitssimple(i);&lt;br /&gt;		printf("\n");&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Tue, 30 Oct 2007 11:53:18 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4716</guid>
      <author>scvalex (Alexandru Scvortov)</author>
    </item>
    <item>
      <title>Random numbers in Ruby</title>
      <link>http://snippets.dzone.com/posts/show/4697</link>
      <description>&lt;code&gt;&lt;br /&gt;&lt;br /&gt;# Pseudo random number generator&lt;br /&gt;# From: http://gnuvince.wordpress.com/2005/11/24/pseudo-random-number-generator&lt;br /&gt;# Author: Vincent Foley-Bourgon&lt;br /&gt;&lt;br /&gt;def random_number&lt;br /&gt;  t = Time.now.to_f / (Time.now.to_f % Time.now.to_i)&lt;br /&gt;  random_seed = t * 1103515245 + 12345;&lt;br /&gt;  (random_seed / 65536) % 32768;&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;10.times { puts random_number }&lt;br /&gt;&lt;br /&gt;cnt = Array.new(10,0)&lt;br /&gt;20000.times { cnt[(random_number % 10).to_i] += 1 }&lt;br /&gt;p cnt&lt;br /&gt;puts&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# Ruby Gaussian Random Number Generator&lt;br /&gt;# Author: Glenn&lt;br /&gt;# http://webhost101.net/rails/typo/articles/2007/07/31/ruby-gaussian-random-number-generator&lt;br /&gt;&lt;br /&gt;def gaussian_rand &lt;br /&gt;   u1 = u2 = w = g1 = g2 = 0  # declare&lt;br /&gt;   begin&lt;br /&gt;     u1 = 2 * rand - 1&lt;br /&gt;     u2 = 2 * rand - 1&lt;br /&gt;     w = u1 * u1 + u2 * u2&lt;br /&gt;   end while w &gt;= 1&lt;br /&gt;   &lt;br /&gt;   w = Math::sqrt( ( -2 * Math::log(w)) / w )&lt;br /&gt;   g2 = u1 * w;&lt;br /&gt;   g1 = u2 * w;&lt;br /&gt;   # g1 is returned  &lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;sum = 0&lt;br /&gt;sumsq = 0&lt;br /&gt;n = 1000&lt;br /&gt;0.upto(n) do &lt;br /&gt;  #r = gaussian_rand&lt;br /&gt;  r = gaussian_rand * 100 + 50   # new_random_number = gaussian_rand * standard_deviation + average&lt;br /&gt;  #puts r&lt;br /&gt;  sum += r&lt;br /&gt;  sumsq += (r*r)&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;ave = sum/n&lt;br /&gt;stddev = Math::sqrt(sumsq/n - ave * ave)&lt;br /&gt;puts "Average = #{ave}"&lt;br /&gt;puts "StdDev = #{stddev}"&lt;br /&gt;puts&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# Random Number Generator&lt;br /&gt;# http://scutigena.sourceforge.net/test-random.html&lt;br /&gt;# http://scutigena.sourceforge.net/sources/ruby-1.7.2/random.html&lt;br /&gt;# $Id: random.ruby,v 1.2 2003/12/30 01:25:05 davidw Exp $&lt;br /&gt;&lt;br /&gt;IM = 139968&lt;br /&gt;IA = 3877&lt;br /&gt;IC = 29573&lt;br /&gt;&lt;br /&gt;$last = 42.0&lt;br /&gt;def gen_random (max) (max * ($last = ($last * IA + IC) % IM)) / IM end&lt;br /&gt;&lt;br /&gt;10.times do&lt;br /&gt;    puts gen_random(100000.0)&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;printf "%.5f\n", gen_random(100.0)&lt;br /&gt;puts&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# From: http://matt.blogs.it/entries/00002641.html&lt;br /&gt;# Author: Matt Mower&lt;br /&gt;# cf. http://www.taygeta.com/random/gaussian.html&lt;br /&gt;# cf. http://www.bearcave.com/misl/misl_tech/wavelets/hurst/random.html&lt;br /&gt;&lt;br /&gt;def box_mueller( mean = 0.0, stddev = 1.0 )&lt;br /&gt;  x1 = 0.0, x2 = 0.0, w = 0.0&lt;br /&gt;&lt;br /&gt;  until w &gt; 0.0 &amp;&amp; w &lt; 1.0&lt;br /&gt;    x1 = 2.0 * rand - 1.0&lt;br /&gt;    x2 = 2.0 * rand - 1.0&lt;br /&gt;    w = ( x1 * x2 ) + ( x2 * x2 )&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  w = Math.sqrt( -2.0 * Math.log( w ) / w )&lt;br /&gt;  r = x1 * w&lt;br /&gt;&lt;br /&gt;  mean + r * stddev&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;10.times { puts box_mueller(5.0, 1.0) }&lt;br /&gt;puts&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# Generating random numbers with a specified distribution&lt;br /&gt;# From: http://www.cs.nyu.edu/~michaels/blog/?p=24&lt;br /&gt;# Author: Michael Schidlowsky&lt;br /&gt;&lt;br /&gt;def gen&lt;br /&gt;  (x=rand)&gt;0.5 ? x : (x &lt; rand/2.0) ? 1.0 - x : x&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;def gen2&lt;br /&gt;   (x = rand) &amp;&amp; rand ? 1.0 - x : x&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;def compute_distribution(numSamples, &amp;block)&lt;br /&gt;   samples = []&lt;br /&gt;   values = 10&lt;br /&gt;   numSamples.times{samples &lt;&lt; yield}&lt;br /&gt;   dist = Array.new(values, 0)&lt;br /&gt;   samples.each{ |s| dist[(s*values).floor] += 1 }&lt;br /&gt;   dist&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;p compute_distribution(1000){rand}&lt;br /&gt;p compute_distribution(1000){gen}&lt;br /&gt;p compute_distribution(1000) { gen2 }&lt;br /&gt;puts&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# Random number generation for a triangular distribution&lt;br /&gt;# From: http://www.brighton-webs.co.uk/distributions/triangular.asp&lt;br /&gt;# cf. http://en.wikipedia.org/wiki/Triangular_distribution&lt;br /&gt;&lt;br /&gt;def rng(m, low, high)&lt;br /&gt;&lt;br /&gt;   # cf. the parameter info at http://www.brighton-webs.co.uk/distributions/triangular.asp&lt;br /&gt;   return nil unless high &gt; low &amp;&amp; m &gt; low &amp;&amp; m &lt; high    &lt;br /&gt;&lt;br /&gt;   u = rand&lt;br /&gt;&lt;br /&gt;   if u &lt;= (m-low)/(high-low)&lt;br /&gt;      r = low+ Math.sqrt(u*(high-low)*(m-low))&lt;br /&gt;   else&lt;br /&gt;      r = high - Math.sqrt((1.0-u)*(high-low)*(high-m))&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;10.times do&lt;br /&gt;  #puts rng(0.0, -25.0, 25.0)&lt;br /&gt;  puts rng(50.0, 25.0, 75.0)&lt;br /&gt;end&lt;br /&gt;puts&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# From: http://www.ruby-forum.com/topic/95931&lt;br /&gt;# Author: Christoffer Lern&#246;&lt;br /&gt;&lt;br /&gt;class Range&lt;br /&gt;  def rand&lt;br /&gt;    return first if exclude_end? &amp;&amp; last == first&lt;br /&gt;    Kernel::rand(last - first + (exclude_end? ? 0 : 1)) + first&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;r1 = -9..9&lt;br /&gt;r2 = -90...100&lt;br /&gt;p r1.rand, r2.rand&lt;br /&gt;&lt;br /&gt;r3 = 0..9&lt;br /&gt;&lt;br /&gt;num = []&lt;br /&gt;10.times do&lt;br /&gt;   num &lt;&lt; r3.rand&lt;br /&gt;   if num.first.zero? then num.shift; redo end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;p num&lt;br /&gt;puts num.to_s.to_i&lt;br /&gt;puts&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# See:&lt;br /&gt;# http://redcorundum.blogspot.com/2008/01/randomizing-array-revisited.html&lt;br /&gt;# http://redcorundum.blogspot.com/2006/12/randomizing-array-and-other-faqs.html&lt;br /&gt;# http://szeryf.wordpress.com/2007/06/19/a-simple-shuffle-that-proved-not-so-simple-after-all/&lt;br /&gt;&lt;br /&gt;class Array&lt;br /&gt;  def shuffle&lt;br /&gt;    array = dup&lt;br /&gt;    size.downto 2 do |j|&lt;br /&gt;      r = rand j&lt;br /&gt;      array[j-1], array[r] = array[r], array[j-1]&lt;br /&gt;    end&lt;br /&gt;    array&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;array = (1..50).to_a&lt;br /&gt;&lt;br /&gt;10.times { p array.shuffle.first(10) }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#-------------------&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class RNG&lt;br /&gt;&lt;br /&gt;   def num(min=8,max=min+5,iter=1)&lt;br /&gt;&lt;br /&gt;      return nil unless min.is_a?(Integer) &amp;&amp; max.is_a?(Integer) &amp;&amp; max &gt; min &amp;&amp; iter.is_a?(Integer)&lt;br /&gt;&lt;br /&gt;      ret = []&lt;br /&gt;      stats = Hash.new(0)     # optional; cf. stats[random_num] += 1&lt;br /&gt;      digits = Array(0..9).sort_by {rand}&lt;br /&gt;      #digits = (Array(0..9) * (rand(4)+1)).sort_by {rand}&lt;br /&gt;      digits_size = digits.size&lt;br /&gt;&lt;br /&gt;      iter.times do&lt;br /&gt;         count = 0&lt;br /&gt;         len = min + rand(max-min+1)&lt;br /&gt;         ar = []&lt;br /&gt;         while count &lt; len&lt;br /&gt;            i = rand(digits_size)    # get a random array index&lt;br /&gt;            random_num = digits.at(i)&lt;br /&gt;            stats[random_num] += 1&lt;br /&gt;            ar &lt;&lt; random_num&lt;br /&gt;            digits = digits.sort_by {rand}&lt;br /&gt;            count += 1&lt;br /&gt;            if count == 1 &amp;&amp; ar.first.zero? then ar.shift; stats[0] -= 1; count = 0 end&lt;br /&gt;         end&lt;br /&gt;         ret &lt;&lt; ar.to_s.to_i&lt;br /&gt;      end  # iter&lt;br /&gt;      #ret&lt;br /&gt;      ret &lt;&lt; stats   # optional&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;puts&lt;br /&gt;&lt;br /&gt;min = 8&lt;br /&gt;max = 13&lt;br /&gt;iter = 10000&lt;br /&gt;result =  RNG.new.num(min, max, iter)&lt;br /&gt;stats = result.pop&lt;br /&gt;&lt;br /&gt;t = 0&lt;br /&gt;stats.each_value { |v| t += v }  # get the overall frequency&lt;br /&gt;&lt;br /&gt;n = 0&lt;br /&gt;t = t * 1.0&lt;br /&gt;m = t / 10.0 &lt;br /&gt;&lt;br /&gt;stats.sort.each do |k,v| &lt;br /&gt;   i = (v / t) * 100.0&lt;br /&gt;   x = v &gt; m ? v - m : m - v&lt;br /&gt;   y = (x / m) * 100.0&lt;br /&gt;   n += i&lt;br /&gt;   puts "#{k}  ::  #{"%.2f" % m}  ::  #{v}  ::  #{"%.2f" % i} %  ::  #{ "%.2f" % ((m-v) * -1) }  ::  #{"%.2f" % y} %"&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;puts n, m, t&lt;br /&gt;&lt;br /&gt;puts&lt;br /&gt;puts RNG.new.num(20, 25, 10)[0..-2]&lt;br /&gt;&lt;br /&gt;puts&lt;br /&gt;rn = RNG.new.num(80, 100)&lt;br /&gt;puts rn[0..-2]&lt;br /&gt;p rn.last&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;</description>
      <pubDate>Wed, 24 Oct 2007 19:01:38 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4697</guid>
      <author>ntk ()</author>
    </item>
    <item>
      <title>Lottery</title>
      <link>http://snippets.dzone.com/posts/show/4668</link>
      <description>&lt;br /&gt;Author:   ntk&lt;br /&gt;License:   &lt;a href="http://www.opensource.org/licenses/mit-license.php"&gt;The MIT License&lt;/a&gt;, Copyright (c) 2007 ntk&lt;br /&gt;Inspired by:   &lt;a href="http://www.random.org/quick-pick/"&gt;Lottery Quick Pick&lt;/a&gt; &lt;br /&gt;Hints:   &lt;a href="http://en.wikipedia.org/wiki/Lottery_mathematics"&gt;Lottery mathematics&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;class Lottery&lt;br /&gt;&lt;br /&gt;   def playing(i=1, n1=0, r1=0..0, n2=0, r2=0..0)&lt;br /&gt;&lt;br /&gt;      return nil unless i.is_a?(Integer) &amp;&amp; n1.is_a?(Integer) &amp;&amp; n1 &gt; 0 &amp;&amp; r1.is_a?(Range) &amp;&amp; n2.is_a?(Integer) &amp;&amp; r2.is_a?(Range)&lt;br /&gt;      stats = Hash.new(0)   # optional; stores the frequency of picked numbers, cf. stats[random_num] += 1&lt;br /&gt;      ret = []&lt;br /&gt;&lt;br /&gt;      random_procs = [ &lt;br /&gt;         lambda { |a,n| a.slice!(rand(n)) },      # a is an array, n an integer&lt;br /&gt;         lambda { |a,n| a.slice!(rand(n) * -1) }, &lt;br /&gt;         lambda { |a,n| a.slice!((rand(n) * -1) + rand(n)) },&lt;br /&gt;         lambda { |a,n| a.slice!((rand(n) - rand(n))) }, &lt;br /&gt;         lambda { |a,n| a.reverse!.slice!(rand(n)) },&lt;br /&gt;         lambda { |a,n| a.reverse!.slice!(rand(n) * -1) }, &lt;br /&gt;         lambda { |a,n| a.reverse!.slice!((rand(n) * -1) + rand(n)) },&lt;br /&gt;         lambda { |a,n| a.reverse!.slice!((rand(n) - rand(n))) } &lt;br /&gt;      ] &lt;br /&gt;&lt;br /&gt;      i.times do&lt;br /&gt;         numbers = r1.to_a.sort_by {rand}&lt;br /&gt;         num = numbers.size&lt;br /&gt;         ar = []&lt;br /&gt;         count = 0&lt;br /&gt;&lt;br /&gt;         while count &lt; n1 + n2&lt;br /&gt;&lt;br /&gt;            count += 1&lt;br /&gt;&lt;br /&gt;            if count &gt; n1 &amp;&amp; n2 &gt; 0&lt;br /&gt;               numbers2 = r2.to_a&lt;br /&gt;               numbers2 = (numbers &amp; numbers2).sort_by {rand} &lt;br /&gt;               num2 = numbers2.size&lt;br /&gt;               count2 = 0&lt;br /&gt;               while count2 &lt; n2&lt;br /&gt;                  count2 += 1&lt;br /&gt;                  i = rand(random_procs.size)   # get a random array index for random_procs array&lt;br /&gt;                  random_procs = random_procs.sort_by {rand}      &lt;br /&gt;                  random_num = random_procs.at(i).call(numbers2, num2)&lt;br /&gt;                  stats[random_num] += 1&lt;br /&gt;                  ar &lt;&lt; random_num&lt;br /&gt;                  numbers2 = numbers2.sort_by {rand}&lt;br /&gt;                  num2 -= 1&lt;br /&gt;               end   # while&lt;br /&gt;&lt;br /&gt;               if count2 &gt; 1 then count += (count2-1) end  &lt;br /&gt;               #break   # alternative&lt;br /&gt;              &lt;br /&gt;            else&lt;br /&gt;&lt;br /&gt;               i = rand(random_procs.size)                               &lt;br /&gt;               random_procs = random_procs.sort_by {rand}  &lt;br /&gt;  &lt;br /&gt;               random_num = random_procs.at(i).call(numbers, num)&lt;br /&gt;               stats[random_num] += 1&lt;br /&gt;               ar &lt;&lt; random_num&lt;br /&gt;&lt;br /&gt;=begin&lt;br /&gt;              if rand(num) % (rand(num) + 1) == rand(num)               #  alternative&lt;br /&gt;                  random_num = random_procs.at(i).call(numbers, num)&lt;br /&gt;                  stats[random_num] += 1&lt;br /&gt;                  ar &lt;&lt; random_num&lt;br /&gt;               else&lt;br /&gt;                  random_num = numbers.slice!(rand(num))&lt;br /&gt;                  stats[random_num] += 1&lt;br /&gt;                  ar &lt;&lt; random_num&lt;br /&gt;               end&lt;br /&gt;=end&lt;br /&gt;&lt;br /&gt;               numbers = numbers.sort_by {rand}&lt;br /&gt;               num -= 1&lt;br /&gt;&lt;br /&gt;            end          # if&lt;br /&gt;         end             # while&lt;br /&gt;         ret &lt;&lt; ar&lt;br /&gt;      end&lt;br /&gt;      #ret&lt;br /&gt;      ret &lt;&lt; stats   # optional&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;puts&lt;br /&gt;puts "UK National Lottery, German Lotto 6/49, ..."&lt;br /&gt;&lt;br /&gt;ndraws = 10&lt;br /&gt;result = Lottery.new.playing(ndraws, 6, 1..49)&lt;br /&gt;stats = result.pop&lt;br /&gt;&lt;br /&gt;result.each do |t| &lt;br /&gt;   puts t.sort.join('-')&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;puts&lt;br /&gt;n = 0&lt;br /&gt;stats.sort.each do |k,v| &lt;br /&gt;   i = (v / (ndraws * 6.0) ) * 100.0&lt;br /&gt;   n += i&lt;br /&gt;   puts "#{k} :: #{v} :: #{i}%"&lt;br /&gt;end&lt;br /&gt;p n&lt;br /&gt;&lt;br /&gt;puts&lt;br /&gt;puts "US Powerball Lottery"&lt;br /&gt;Lottery.new.playing(ndraws, 5, 1..55, 1, 1..42)[0..-2].each do |t| &lt;br /&gt;   n = t.pop&lt;br /&gt;   puts "#{t.sort.join('-')}  and  #{n}"&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;puts&lt;br /&gt;puts "Mega Millions"&lt;br /&gt;Lottery.new.playing(ndraws, 5, 1..56, 1, 1..46)[0..-2].each do |t| &lt;br /&gt;   n = t.pop&lt;br /&gt;   puts "#{t.sort.join('-')}  and  #{n}"&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;puts&lt;br /&gt;puts "EuroMillions"&lt;br /&gt;Lottery.new.playing(ndraws, 5, 1..50, 2, 1..9)[0..-2].each do |t| &lt;br /&gt;   n1 = t.pop&lt;br /&gt;   n2 = t.pop&lt;br /&gt;   puts "#{t.sort.join('-')}  and  #{n1}-#{n2}"&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;puts&lt;br /&gt;puts "US Powerball Lottery"&lt;br /&gt;&lt;br /&gt;ndraws = 10&lt;br /&gt;nums = [5, 23, 25, 33, 34]&lt;br /&gt;pb = 31&lt;br /&gt;&lt;br /&gt;matches = []&lt;br /&gt;n = 0&lt;br /&gt;&lt;br /&gt;Lottery.new.playing(ndraws, 5, 1..55, 1, 1..42)[0..-2].each do |t| &lt;br /&gt;   i = t.pop&lt;br /&gt;   t = t.sort&lt;br /&gt;   if (t &amp; nums).size &gt; matches.size || ( matches.size == 0 &amp;&amp; i == pb )&lt;br /&gt;      matches = t &amp; nums &lt;br /&gt;      i == pb ? n = i : n = 0&lt;br /&gt;   end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;if pb == n &amp;&amp; !matches.empty?&lt;br /&gt;   puts "Your numbers: #{nums.join('-')} and #{pb}\nYour matches: #{matches.join('-')} and #{n}"&lt;br /&gt;elsif pb == n &amp;&amp; matches.empty?&lt;br /&gt;   puts "Your numbers: #{nums.join('-')} and #{pb}\nYour matches: [] and #{n}"&lt;br /&gt;else&lt;br /&gt;   puts "Your numbers: #{nums.join('-')} and #{pb}\nYour matches: #{matches.join('-')}"&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;</description>
      <pubDate>Thu, 18 Oct 2007 12:30:09 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4668</guid>
      <author>ntk ()</author>
    </item>
    <item>
      <title>Generate prime numbers</title>
      <link>http://snippets.dzone.com/posts/show/4189</link>
      <description>GenPrime(int n) generates all prime numbers smaller or equal to n, storing them in prime[]. NrPrime is the number of prime numbers calculated.&lt;br /&gt;&lt;br /&gt;This uses the "Primes Sieve of Eratosthenes".&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#include &lt;string.h&gt;&lt;br /&gt;&lt;br /&gt;int prime[78498]; // 78498 is the number of prime numbers smaller than 1 000 000.&lt;br /&gt;int nrPrime = 0;&lt;br /&gt;&lt;br /&gt;void genPrime(int n) {&lt;br /&gt;  char p[1000001];&lt;br /&gt;&lt;br /&gt;  memset(p, 1, sizeof(char) * (n + 1));&lt;br /&gt;&lt;br /&gt;  p[1] = 0;&lt;br /&gt;&lt;br /&gt;  int i = 2;&lt;br /&gt;  for (; i &lt;= n; ++i)&lt;br /&gt;    if (p[i]) {&lt;br /&gt;      prime[nrPrime] = i;&lt;br /&gt;      ++nrPrime;&lt;br /&gt;      int j = i * 2;&lt;br /&gt;      while (j &lt;= n) {&lt;br /&gt;        p[j] = 0;&lt;br /&gt;        j += i;&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Fri, 22 Jun 2007 14:33:42 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4189</guid>
      <author>scvalex (Alexandru Scvortov)</author>
    </item>
    <item>
      <title>Javascript: convert integer to word (e.g. 18 -&gt; "eighteen")</title>
      <link>http://snippets.dzone.com/posts/show/3710</link>
      <description>// Convert a positive integer less than 1000 to its word representation.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;var units = new Array ("Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen", "Nineteen");&lt;br /&gt;var tens = new Array ("Twenty", "Thirty", "Forty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety");&lt;br /&gt;&lt;br /&gt;function num(it) {&lt;br /&gt;	var theword = "";&lt;br /&gt;	var started;&lt;br /&gt;	if (it&gt;999) return "Lots";&lt;br /&gt;	if (it==0) return units[0];&lt;br /&gt;	for (var i = 9; i &gt;= 1; i--){&lt;br /&gt;		if (it&gt;=i*100) {&lt;br /&gt;			theword += units[i];&lt;br /&gt;			started = 1;&lt;br /&gt;			theword += " hundred";&lt;br /&gt;			if (it!=i*100) theword += " and ";&lt;br /&gt;			it -= i*100;&lt;br /&gt;			i=0;&lt;br /&gt;		}&lt;br /&gt;	};&lt;br /&gt;	&lt;br /&gt;	for (var i = 9; i &gt;= 2; i--){&lt;br /&gt;		if (it&gt;=i*10) {&lt;br /&gt;			theword += (started?tens[i-2].toLowerCase():tens[i-2]);&lt;br /&gt;			started = 1;&lt;br /&gt;			if (it!=i*10) theword += "-";&lt;br /&gt;			it -= i*10;&lt;br /&gt;			i=0&lt;br /&gt;		}&lt;br /&gt;	};&lt;br /&gt;	&lt;br /&gt;	for (var i=1; i &lt; 20; i++) {&lt;br /&gt;		if (it==i) {&lt;br /&gt;			theword += (started?units[i].toLowerCase():units[i]);&lt;br /&gt;		}&lt;br /&gt;	};&lt;br /&gt;	return theword;&lt;br /&gt;}&lt;/code&gt;</description>
      <pubDate>Tue, 20 Mar 2007 22:15:23 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/3710</guid>
      <author>maximile (Max Williams)</author>
    </item>
    <item>
      <title>Zeropad a number</title>
      <link>http://snippets.dzone.com/posts/show/3219</link>
      <description>Pads a string with 0's until the given length limit is met&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;?php&lt;br /&gt;function zeropad($number, $limit) {&lt;br /&gt;  return (strlen($number) &gt;= $limit) ? $number : zeropad("0" . $number, $limit);&lt;br /&gt;}&lt;br /&gt;?&gt;&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Mon, 01 Jan 2007 23:19:29 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/3219</guid>
      <author>albert006 (Albert Peschar)</author>
    </item>
    <item>
      <title>Bash: checking if a variable is a number</title>
      <link>http://snippets.dzone.com/posts/show/3143</link>
      <description>Shellscript checking if a variable is a number&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#!/bin/bash&lt;br /&gt;read VARIABLE&lt;br /&gt;if [ $VARIABLE -eq $VARIABLE 2&gt; /dev/null ]; then&lt;br /&gt;echo $VARIABLE is a number&lt;br /&gt;else&lt;br /&gt;echo $VARIABLE is not a number&lt;br /&gt;fi&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Wed, 13 Dec 2006 18:54:32 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/3143</guid>
      <author>Grzechu (Grzegorz Rumatowski)</author>
    </item>
    <item>
      <title>BigNumber //JavaScript Class</title>
      <link>http://snippets.dzone.com/posts/show/2206</link>
      <description>&lt;a href="http://jsfromhell.com/classes/bignumber"&gt;&lt;br /&gt;Offers a extremely high precision level to make mathematical operations. For integers there is no limits and for floating point numbers, the class allows setting the maximum precision.&lt;br /&gt;&lt;br /&gt;[UPDATED CODE AND HELP CAN BE FOUND HERE]&lt;br /&gt;&lt;br /&gt;The class always returns new instances of BigNumber on the operations, so to the set value of a object, use the "set" method.&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;//+ Jonas Raoni Soares Silva&lt;br /&gt;//@ http://jsfromhell.com/classes/bignumber [v1.0]&lt;br /&gt;&lt;br /&gt;BigNumber = function(n, p, r){&lt;br /&gt;    var o = this, i;&lt;br /&gt;    if(n instanceof BigNumber){&lt;br /&gt;        for(i in {precision: 0, roundType: 0, _sign: 0, _dec: 0}) o[i] = n[i];&lt;br /&gt;        o._buffer = n._buffer.slice();&lt;br /&gt;        return;&lt;br /&gt;    }&lt;br /&gt;    o.precision = isNaN(p = Math.abs(p)) ? BigNumber.defaultPrecision : p;&lt;br /&gt;    o.roundType = isNaN(r = Math.abs(r)) ? BigNumber.defaultRoundType : r;&lt;br /&gt;    o._sign = (n += "").charAt(0) == "-";&lt;br /&gt;    o._dec = ((n = n.replace(/[^\d.]/g, "").split(".", 2))[0] = n[0].replace(/^0+/, "") || "0").length;&lt;br /&gt;    for(i = (n = o._buffer = (n.join("") || "0").split("")).length; i; n[--i] = +n[i]);&lt;br /&gt;    o.round();&lt;br /&gt;};&lt;br /&gt;with({$: BigNumber, o: BigNumber.prototype}){&lt;br /&gt;    $.ROUND_HALF_EVEN = ($.ROUND_HALF_DOWN = ($.ROUND_HALF_UP = ($.ROUND_FLOOR = ($.ROUND_CEIL = ($.ROUND_DOWN = ($.ROUND_UP = 0) + 1) + 1) + 1) + 1) + 1) + 1;&lt;br /&gt;    $.defaultPrecision = 40;&lt;br /&gt;    $.defaultRoundType = $.ROUND_HALF_UP;&lt;br /&gt;    o.add = function(n){&lt;br /&gt;        if(this._sign != (n = new BigNumber(n))._sign) return n._sign = !n._sign, this.subtract(n);&lt;br /&gt;        var o = new BigNumber(this), a = o._buffer, b = n._buffer, la = o._dec,&lt;br /&gt;        lb = n._dec, n = Math.max(la, lb), i, r;&lt;br /&gt;        la != lb &amp;&amp; ((lb = la - lb) &gt; 0 ? o._zeroes(b, lb, 1) : o._zeroes(a, -lb, 1));&lt;br /&gt;        i = (la = a.length) == (lb = b.length) ? a.length : ((lb = la - lb) &gt; 0 ? o._zeroes(b, lb) : o._zeroes(a, -lb)).length;&lt;br /&gt;        for(r = 0; i; r = (a[--i] = a[i] + b[i] + r) / 10 &gt;&gt;&gt; 0, a[i] %= 10);&lt;br /&gt;        return r &amp;&amp; ++n &amp;&amp; a.unshift(r), o._dec = n, o.round();&lt;br /&gt;    };&lt;br /&gt;    o.subtract = function(n){&lt;br /&gt;        if(this._sign != (n = new BigNumber(n))._sign) return n._sign = !n._sign, this.add(n);&lt;br /&gt;        var o = new BigNumber(this), x = o.compare(n) + 1, a = x ? o : n, b = x ? n : o, la = a._dec, lb = b._dec, n = la, i, j;&lt;br /&gt;        a = a._buffer, b = b._buffer, la != lb &amp;&amp; ((lb = la - lb) &gt; 0 ? o._zeroes(b, lb, 1) : o._zeroes(a, -lb, 1));&lt;br /&gt;        for(i = (la = a.length) == (lb = b.length) ? a.length : ((lb = la - lb) &gt; 0 ? o._zeroes(b, lb) : o._zeroes(a, -lb)).length; i;){&lt;br /&gt;            if(a[--i] &lt; b[i]){&lt;br /&gt;                for(j = i; j &amp;&amp; !a[--j]; a[j] = 9);&lt;br /&gt;                --a[j], a[i] += 10;&lt;br /&gt;            }&lt;br /&gt;            b[i] = a[i] - b[i];&lt;br /&gt;        }&lt;br /&gt;        return o._sign = !x, o._dec = n, o._buffer = b, o.round();&lt;br /&gt;    };&lt;br /&gt;    o.multiply = function(n){&lt;br /&gt;        var o = new BigNumber(this), r = o.compare(n = new BigNumber(n)) + 1, a = (r ? o : n)._buffer,&lt;br /&gt;        b = (r ? n : o)._buffer, la = a.length, lb = b.length, x = new BigNumber, i, j, s;&lt;br /&gt;        for(i = lb; i; x.set(x.add(new BigNumber(s.join("")))))&lt;br /&gt;            for(s = (new Array(lb - --i)).join("0").split(""), r = 0, j = la; j;&lt;br /&gt;            r += a[--j] * b[i], s.unshift(r % 10), r = r / 10 &gt;&gt;&gt; 0);&lt;br /&gt;        return r &amp;&amp; x._buffer.unshift(r), o._dec = (o._buffer = x._buffer).length - la - lb + o._dec + n._dec, o.round();&lt;br /&gt;    };&lt;br /&gt;    o.divide = function(n){&lt;br /&gt;        if((n = new BigNumber(n)) == "0") throw new Error("division by 0");&lt;br /&gt;        var o = new BigNumber(this), a = o._buffer, b = n._buffer, la = a.length - o._dec,&lt;br /&gt;        lb = b.length - n._dec, s = a._sign != b._sign, dec = 0, buffer = [], x = new BigNumber, y, i;&lt;br /&gt;        la != lb &amp;&amp; ((lb = la - lb) &gt; 0 ? o._zeroes(b, lb) : o._zeroes(a, -lb));&lt;br /&gt;        o._dec = a.length, n._dec = b.length;&lt;br /&gt;        b = n, a._sign = false, b._sign = false;&lt;br /&gt;        while(o != 0 &amp;&amp; (buffer.length - dec) &lt;= o.precision){&lt;br /&gt;            x.set(0);&lt;br /&gt;            for(i = 0; o.compare(y = x.add(b)) + 1 &amp;&amp; ++i; x.set(y));&lt;br /&gt;            if(!i){&lt;br /&gt;                do ++i, o._buffer.push(0), ++o._dec;&lt;br /&gt;                while(o.compare(b) &lt; 0);&lt;br /&gt;                !dec &amp;&amp; (!buffer.length &amp;&amp; buffer.push(0), dec = buffer.length);&lt;br /&gt;                o._zeroes(buffer, --i);&lt;br /&gt;                continue;&lt;br /&gt;            }&lt;br /&gt;            o.set(o.subtract(x)), buffer.push(i);&lt;br /&gt;        }&lt;br /&gt;        return o._buffer = buffer, o._dec = dec ? dec : buffer.length, o.round();&lt;br /&gt;    };&lt;br /&gt;    o.mod = function(n){&lt;br /&gt;        return this.subtract(this.divide(n).intPart().multiply(n));&lt;br /&gt;    };&lt;br /&gt;    o.pow = function(n){&lt;br /&gt;        var o = new BigNumber(this), i;&lt;br /&gt;        if(n == 0) return o.set(1);&lt;br /&gt;        for(i = Math.abs(n); --i; o.set(o.multiply(this)));&lt;br /&gt;        return n &lt; 0 ? o.set((new BigNumber(1)).divide(o)) : o;&lt;br /&gt;    };&lt;br /&gt;    o.set = function(n){&lt;br /&gt;        return this.constructor(n), this;&lt;br /&gt;    };&lt;br /&gt;    o.compare = function(n){&lt;br /&gt;        var a = this, la = this._dec, b = n, lb = n._dec, i, l;&lt;br /&gt;        if(la != lb) return la &gt; lb ? 1 : -1;&lt;br /&gt;        for(la = (a = a._buffer).length, lb = (b = b._buffer).length, i = -1, l = Math.min(la, lb); ++i &lt; l;)&lt;br /&gt;            if(a[i] != b[i]) return a[i] &gt; b[i] ? 1 : -1;&lt;br /&gt;        return la != lb ? la &gt; lb ? 1 : -1 : 0;&lt;br /&gt;    }&lt;br /&gt;    o.negate = function(){&lt;br /&gt;        var n = new BigNumber(this); return n._sign ^= 1, n;&lt;br /&gt;    };&lt;br /&gt;    o.abs = function(){&lt;br /&gt;        var n = new BigNumber(this); return n._sign = 0, n;&lt;br /&gt;    };&lt;br /&gt;    o.intPart = function(){&lt;br /&gt;        return new BigNumber((this._sign ? "-" : "") + (this._buffer.slice(0, this._dec).join("") || "0"));&lt;br /&gt;    };&lt;br /&gt;    o.valueOf = o.toString = function(){&lt;br /&gt;        var o = this;&lt;br /&gt;        return (o._sign ? "-" : "") + (o._buffer.slice(0, o._dec).join("") || "0") + (o._dec != o._buffer.length ? "." + o._buffer.slice(o._dec).join("") : "");&lt;br /&gt;    };&lt;br /&gt;    o._zeroes = function(n, l, t){&lt;br /&gt;        var s = ["push", "unshift"][t || 0];&lt;br /&gt;        for(++l; --l;  n[s](0));&lt;br /&gt;        return n;&lt;br /&gt;    };&lt;br /&gt;    o.round = function(){&lt;br /&gt;        if("_rounding" in this) return this;&lt;br /&gt;        var $ = BigNumber, r = this.roundType, b = this._buffer, d, p, n, x;&lt;br /&gt;        for(this._rounding = true; this._dec &gt; 1 &amp;&amp; !b[0]; --this._dec, b.shift());&lt;br /&gt;        for(d = this._dec, p = this.precision + d, n = b[p]; b.length &gt; d &amp;&amp; !b[b.length -1]; b.pop());&lt;br /&gt;        x = (this._sign ? "-" : "") + (p - d ? "0." + this._zeroes([], p - d - 1).join("") : "") + 1;&lt;br /&gt;        if(b.length &gt; p){&lt;br /&gt;            n &amp;&amp; (r == $.DOWN ? false : r == $.UP ? true : r == $.CEIL ? !this._sign&lt;br /&gt;            : r == $.FLOOR ? this._sign : r == $.HALF_UP ? n &gt;= 5 : r == $.HALF_DOWN ? n &gt; 5&lt;br /&gt;            : r == $.HALF_EVEN ? n &gt;= 5 &amp;&amp; b[p - 1] &amp; 1 : false) &amp;&amp; this.add(x);&lt;br /&gt;            b.splice(p, b.length - p);&lt;br /&gt;        }&lt;br /&gt;        return delete this._rounding, this;&lt;br /&gt;    };&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Usage&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;br /&gt;&lt;br /&gt;var x = new BigNumber("10"), y = new BigNumber("-2");&lt;br /&gt;alert(x.pow(y));&lt;br /&gt;alert(x.pow(1234));&lt;br /&gt;&lt;br /&gt;alert((new BigNumber("99999999999999999999999999999999999")).add("999999999999999999999999999.99999999999999999"));&lt;br /&gt;&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Thu, 15 Jun 2006 20:19:36 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/2206</guid>
      <author>jonasraoni (Jonas Raoni Soares Silva)</author>
    </item>
  </channel>
</rss>
