Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // https://codereview.stackexchange.com/q/127024
- using System; // i7-4790@3.6
- using u16 = System.UInt16;
- class Program
- {
- static void Main()
- {
- u16[] p = primes(); Console.WriteLine(p[6541]);
- var sw = System.Diagnostics.Stopwatch.StartNew();
- for (int i = 1000; i > 0; i--) primes();
- Console.WriteLine(sw.Elapsed); // 70 μs
- u16 m = 65535; p = primes(m); sw.Restart();
- for (int i = 1000; i > 0; i--) primes(m);
- Console.WriteLine(sw.Elapsed + "\n"); // 69 μs
- for (m = 0; ; m <<= 1, m |= 1)
- {
- p = primes(m);
- Console.WriteLine(p.Length + " p's <= " + m);
- if (m == 65535) break;
- } Console.Read();
- }
- static u16[] primes() { return primes(65521); }
- static u16[] primes(u16 u)
- {
- if (u < 5) return u < 2 ? new u16[0] : u < 3 ?
- new u16[] { 2 } : new u16[] { 2, 3 };
- int a = 1, b = 1, c = 1, m = u, d = m; d += d & 1; d >>= 1;
- var x = new int[c += d >> 5]; x[0] = 1 << 24;
- for (/* */; a < c; a += 7) x[a] = 0x08102040;
- for (a = 2; a < c; a += 7) x[a] = 0x40810204;
- for (a = 3; a < c; a += 7) x[a] = 0x04081020;
- for (a = 4; a < c; a += 7) x[a] = 0x20408102;
- for (a = 5; a < c; a += 7) x[a] = 0x02040810;
- for (a = 6; a < c; a += 7) x[a] = 0x10204081;
- for (a = 7; a < c; a += 7) x[a] = ~0x7EFDFBF7; a = 7;
- while ((c = (a += 0x5A28A6 >> (3 * (b++ & 7)) & 7) * a) <= m)
- if ((x[a >> 6] & 1 << (a >> 1)) == 0)
- for (c >>= 1; c < d; c += a) x[c >> 5] |= 1 << c;
- var p = new u16[6542]; p[0] = 2; p[1] = 3; p[2] = 5;
- for (c = 3, a = 1; a + 30 <= m; )
- {
- if ((x[(a += 6) >> 6] & 1 << (a >> 1)) == 0) p[c++] = (u16)a;
- if ((x[(a += 4) >> 6] & 1 << (a >> 1)) == 0) p[c++] = (u16)a;
- if ((x[(a += 2) >> 6] & 1 << (a >> 1)) == 0) p[c++] = (u16)a;
- if ((x[(a += 4) >> 6] & 1 << (a >> 1)) == 0) p[c++] = (u16)a;
- if ((x[(a += 2) >> 6] & 1 << (a >> 1)) == 0) p[c++] = (u16)a;
- if ((x[(a += 4) >> 6] & 1 << (a >> 1)) == 0) p[c++] = (u16)a;
- if ((x[(a += 6) >> 6] & 1 << (a >> 1)) == 0) p[c++] = (u16)a;
- if ((x[(a += 2) >> 6] & 1 << (a >> 1)) == 0) p[c++] = (u16)a;
- }
- for (b = 0; ; )
- {
- if ((a += 0x5A28A6 >> (3 * (b++ & 7)) & 7) > m) break;
- if ((x[a >> 6] & 1 << (a >> 1)) == 0) p[c++] = (u16)a;
- }
- Array.Resize(ref p, c); return p;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement