Advertisement
Guest User

primes.cpp

a guest
Apr 30th, 2016
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.76 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdint.h>
  4. #include <math.h>
  5.  
  6. #define gbit(a, i) (((a)[(i) / 64] >> ((i) % 64)) & 1)
  7. #define tbit(a, i) (a)[(i) / 64] ^= UINT64_C(1) << ((i) % 64)
  8. #define cbit(a, i) (a)[(i) / 64] &= ~(UINT64_C(1) << ((i) % 64))
  9.  
  10. //extern "C"
  11. uint64_t* atkin(uint64_t max, size_t* lenx)
  12. {
  13.     size_t len;
  14.     if (max <= 5) {
  15.         if (max < 2) {
  16.             len = 0;
  17.             return (uint64_t *)malloc(0);
  18.         } else if (max < 3) {
  19.             len = 1;
  20.             uint64_t* primes = (uint64_t *)malloc(1 * sizeof(uint64_t));
  21.             primes[0] = 2;
  22.             return primes;
  23.         } else if (max < 5) {
  24.             len = 2;
  25.             uint64_t* primes = (uint64_t *)malloc(2 * sizeof(uint64_t));
  26.             primes[0] = 2;
  27.             primes[1] = 3;
  28.             return primes;
  29.         } else {
  30.             len = 3;
  31.             uint64_t* primes = (uint64_t *)malloc(3 * sizeof(uint64_t));
  32.             primes[0] = 2;
  33.             primes[1] = 3;
  34.             primes[2] = 5;
  35.             return primes;
  36.         }
  37.     }
  38.     uint64_t* sieve =
  39.         (uint64_t *)calloc(((max + 1) + 63) / 64, sizeof(*sieve));
  40.  
  41.     uint64_t limit = sqrt(max + 1);
  42.     for (uint64_t x = limit; x--;)
  43.     {
  44.         for (uint64_t y = limit; y--;)
  45.         {
  46.             uint64_t index = 4 * x * x + y * y;
  47.             if (index <= max) {
  48.                 int mod = index % 60;
  49.                 if (mod == 1 || mod == 13 || mod == 17 || mod == 29 ||
  50.                     mod == 37 || mod == 41 || mod == 49 || mod == 53) {
  51.                     tbit(sieve, index);
  52.                 }
  53.             }
  54.  
  55.             index = 3 * x * x + y * y;
  56.             if (index <= max) {
  57.                 int mod = index % 60;
  58.                 if (mod == 7 || mod == 19 || mod == 31 || mod == 43) {
  59.                     tbit(sieve, index);
  60.                 }
  61.             }
  62.  
  63.             if (x <= y)
  64.                 continue;
  65.  
  66.             index = 3 * x * x - y * y;
  67.             if (index <= max) {
  68.                 int mod = index % 60;
  69.                 if (mod == 11 || mod == 23 || mod == 47 || mod == 59) {
  70.                     tbit(sieve, index);
  71.                 }
  72.             }
  73.         }
  74.     }    
  75.  
  76.     len = max / 6;
  77.     uint64_t* primes = (uint64_t *)malloc(len * sizeof(uint64_t));
  78.     primes[0] = 2;
  79.     primes[1] = 3;
  80.     primes[2] = 5;
  81.     len = 3;
  82.     for (uint64_t i = 7; i <= limit; i++)
  83.     {
  84.         if (gbit(sieve, i)) {
  85.             uint64_t val = i * i;
  86.             for (uint64_t k = val; k <= max; k += val)
  87.                 cbit(sieve, k);
  88.         }
  89.     }
  90.  
  91.     for (uint64_t i = 7; i <= max; i++)
  92.     {
  93.         if (gbit(sieve, i))
  94.             primes[len++] = i;
  95.     }
  96.  
  97.     free(sieve);
  98.     *lenx = len;
  99.     return primes;
  100. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement