@number-theoretic/primes Home Manual Reference Source

src/sieve/eratosthenes23.js

  1. import {ptoi23} from './ptoi23.js';
  2. import {ptoi230} from './ptoi230.js';
  3. import {ptoi231} from './ptoi231.js';
  4. import {itop23} from './itop23.js';
  5. import {itop230} from './itop230.js';
  6. import {itop231} from './itop231.js';
  7.  
  8. /**
  9. * Sieve of Eratosthenes skipping all multiples of 2 and 3.
  10. *
  11. * 5 7 11 13 17 19 23 25 29 31 35 37 41 43 47 49 53 55 59 61 65 67 71 73 77 79
  12. * 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
  13. *
  14. * 83 85 89 91 95 97 101 103 107 109 113 115 119 121 125 127 131 133 137 139
  15. * 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
  16. *
  17. * 143 145 149 151 155 157 161 163 167 169 173 175 179 181 185 187 191
  18. * 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
  19. *
  20. *
  21. *
  22. * i( 5) = 0
  23. * i(25) = 7
  24. * i(35) = 10 = 7 + 5 - 2
  25. *
  26. * i( 7) = 1
  27. * i(49) = 15
  28. * i(77) = 24 = 15 + 7 + 2
  29. *
  30. * i( 11) = 2
  31. * i(121) = 39
  32. * i(143) = 46 = 39 + 11 - 4
  33. *
  34. * i( 13) = 3
  35. * i(139) = 45
  36. * i(191) = 62 = 45 + 13 + 4
  37. */
  38.  
  39. export function __eratosthenes23__(alloc, fill, get, gothrough, usqrt) {
  40. const first = 5;
  41.  
  42. const eratosthenes23 = function (n, callback) {
  43. let j;
  44. let p;
  45. let l;
  46.  
  47. if (n <= 2) {
  48. return null;
  49. }
  50.  
  51. callback(2);
  52.  
  53. if (n <= 3) {
  54. return null;
  55. }
  56.  
  57. callback(3);
  58.  
  59. if (n <= 5) {
  60. return null;
  61. }
  62.  
  63. const size = ptoi23(n);
  64.  
  65. const sieve = alloc(size);
  66. fill(sieve, 0, size, true);
  67.  
  68. const m = ptoi23(usqrt(n));
  69. let i = ptoi230(first);
  70.  
  71. for (l = 2; ; l += 2) {
  72. if (i >= m) {
  73. break;
  74. }
  75.  
  76. if (get(sieve, i)) {
  77. p = itop230(i);
  78.  
  79. callback(p);
  80.  
  81. j = ptoi231(p * p);
  82.  
  83. gothrough(sieve, j, size, 2 * p);
  84. gothrough(sieve, j + p - l, size, 2 * p);
  85. }
  86.  
  87. ++i;
  88.  
  89. if (i >= m) {
  90. break;
  91. }
  92.  
  93. if (get(sieve, i)) {
  94. p = itop231(i);
  95.  
  96. callback(p);
  97.  
  98. j = ptoi231(p * p);
  99.  
  100. gothrough(sieve, j, size, 2 * p);
  101. gothrough(sieve, j + p + l, size, 2 * p);
  102. }
  103.  
  104. ++i;
  105. }
  106.  
  107. i = m;
  108.  
  109. for (;;) {
  110. if (i >= size) {
  111. break;
  112. }
  113.  
  114. if (get(sieve, i)) {
  115. callback(itop23(i));
  116. }
  117.  
  118. ++i;
  119.  
  120. if (i >= size) {
  121. break;
  122. }
  123.  
  124. if (get(sieve, i)) {
  125. callback(itop23(i));
  126. }
  127.  
  128. ++i;
  129. }
  130.  
  131. return sieve;
  132. };
  133.  
  134. return eratosthenes23;
  135. }