Advertisement
P_P

primes < 2^16

P_P
Apr 1st, 2018
471
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.63 KB | None | 0 0
  1. // https://codereview.stackexchange.com/q/127024
  2.  
  3. using System; // i7-4790@3.6
  4. using u16 = System.UInt16;
  5.  
  6. class Program
  7. {
  8. static void Main()
  9. {
  10. u16[] p = primes(); Console.WriteLine(p[6541]);
  11. var sw = System.Diagnostics.Stopwatch.StartNew();
  12. for (int i = 1000; i > 0; i--) primes();
  13. Console.WriteLine(sw.Elapsed); // 70 μs
  14.  
  15. u16 m = 65535; p = primes(m); sw.Restart();
  16. for (int i = 1000; i > 0; i--) primes(m);
  17. Console.WriteLine(sw.Elapsed + "\n"); // 69 μs
  18.  
  19. for (m = 0; ; m <<= 1, m |= 1)
  20. {
  21. p = primes(m);
  22. Console.WriteLine(p.Length + " p's <= " + m);
  23. if (m == 65535) break;
  24. } Console.Read();
  25. }
  26.  
  27. static u16[] primes() { return primes(65521); }
  28.  
  29. static u16[] primes(u16 u)
  30. {
  31. if (u < 5) return u < 2 ? new u16[0] : u < 3 ?
  32. new u16[] { 2 } : new u16[] { 2, 3 };
  33. int a = 1, b = 1, c = 1, m = u, d = m; d += d & 1; d >>= 1;
  34. var x = new int[c += d >> 5]; x[0] = 1 << 24;
  35. for (/* */; a < c; a += 7) x[a] = 0x08102040;
  36. for (a = 2; a < c; a += 7) x[a] = 0x40810204;
  37. for (a = 3; a < c; a += 7) x[a] = 0x04081020;
  38. for (a = 4; a < c; a += 7) x[a] = 0x20408102;
  39. for (a = 5; a < c; a += 7) x[a] = 0x02040810;
  40. for (a = 6; a < c; a += 7) x[a] = 0x10204081;
  41. for (a = 7; a < c; a += 7) x[a] = ~0x7EFDFBF7; a = 7;
  42. while ((c = (a += 0x5A28A6 >> (3 * (b++ & 7)) & 7) * a) <= m)
  43. if ((x[a >> 6] & 1 << (a >> 1)) == 0)
  44. for (c >>= 1; c < d; c += a) x[c >> 5] |= 1 << c;
  45. var p = new u16[6542]; p[0] = 2; p[1] = 3; p[2] = 5;
  46. for (c = 3, a = 1; a + 30 <= m; )
  47. {
  48. if ((x[(a += 6) >> 6] & 1 << (a >> 1)) == 0) p[c++] = (u16)a;
  49. if ((x[(a += 4) >> 6] & 1 << (a >> 1)) == 0) p[c++] = (u16)a;
  50. if ((x[(a += 2) >> 6] & 1 << (a >> 1)) == 0) p[c++] = (u16)a;
  51. if ((x[(a += 4) >> 6] & 1 << (a >> 1)) == 0) p[c++] = (u16)a;
  52. if ((x[(a += 2) >> 6] & 1 << (a >> 1)) == 0) p[c++] = (u16)a;
  53. if ((x[(a += 4) >> 6] & 1 << (a >> 1)) == 0) p[c++] = (u16)a;
  54. if ((x[(a += 6) >> 6] & 1 << (a >> 1)) == 0) p[c++] = (u16)a;
  55. if ((x[(a += 2) >> 6] & 1 << (a >> 1)) == 0) p[c++] = (u16)a;
  56. }
  57. for (b = 0; ; )
  58. {
  59. if ((a += 0x5A28A6 >> (3 * (b++ & 7)) & 7) > m) break;
  60. if ((x[a >> 6] & 1 << (a >> 1)) == 0) p[c++] = (u16)a;
  61. }
  62. Array.Resize(ref p, c); return p;
  63. }
  64. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement