src/sieve/eratosthenes23.js
import {ptoi23} from './ptoi23.js';
import {ptoi230} from './ptoi230.js';
import {ptoi231} from './ptoi231.js';
import {itop23} from './itop23.js';
import {itop230} from './itop230.js';
import {itop231} from './itop231.js';
/**
* Sieve of Eratosthenes skipping all multiples of 2 and 3.
*
* 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
* 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
*
* 83 85 89 91 95 97 101 103 107 109 113 115 119 121 125 127 131 133 137 139
* 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
*
* 143 145 149 151 155 157 161 163 167 169 173 175 179 181 185 187 191
* 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
*
*
*
* i( 5) = 0
* i(25) = 7
* i(35) = 10 = 7 + 5 - 2
*
* i( 7) = 1
* i(49) = 15
* i(77) = 24 = 15 + 7 + 2
*
* i( 11) = 2
* i(121) = 39
* i(143) = 46 = 39 + 11 - 4
*
* i( 13) = 3
* i(139) = 45
* i(191) = 62 = 45 + 13 + 4
*/
export function __eratosthenes23__(alloc, fill, get, gothrough, usqrt) {
const first = 5;
const eratosthenes23 = function (n, callback) {
let j;
let p;
let l;
if (n <= 2) {
return null;
}
callback(2);
if (n <= 3) {
return null;
}
callback(3);
if (n <= 5) {
return null;
}
const size = ptoi23(n);
const sieve = alloc(size);
fill(sieve, 0, size, true);
const m = ptoi23(usqrt(n));
let i = ptoi230(first);
for (l = 2; ; l += 2) {
if (i >= m) {
break;
}
if (get(sieve, i)) {
p = itop230(i);
callback(p);
j = ptoi231(p * p);
gothrough(sieve, j, size, 2 * p);
gothrough(sieve, j + p - l, size, 2 * p);
}
++i;
if (i >= m) {
break;
}
if (get(sieve, i)) {
p = itop231(i);
callback(p);
j = ptoi231(p * p);
gothrough(sieve, j, size, 2 * p);
gothrough(sieve, j + p + l, size, 2 * p);
}
++i;
}
i = m;
for (;;) {
if (i >= size) {
break;
}
if (get(sieve, i)) {
callback(itop23(i));
}
++i;
if (i >= size) {
break;
}
if (get(sieve, i)) {
callback(itop23(i));
}
++i;
}
return sieve;
};
return eratosthenes23;
}