fork(5) download
  1. // stackoverflow.com/a/69345662/849891
  2. // by stackoverflow.com/users/849891/will-ness
  3.  
  4. function *primesFrom(start) {
  5. console.log("Starting....");
  6. if (start <= 2) { yield 2; }
  7. if (start <= 3) { yield 3; }
  8. if (start <= 5) { yield 5; }
  9. if (start <= 7) { yield 7; }
  10. const sieve = new Map();
  11. const ps = primesFrom(2);
  12. ps.next(); // skip the 2
  13. let p = ps.next().value; // p==3
  14. let psqr = p * p; // 9
  15. let c = psqr; // first candidate, 9
  16. let s = 6; // step
  17. let m = 9; // multiple
  18. while( psqr < start )
  19. {
  20. // must adjust initial state
  21. s = 2 * p;
  22. m = p + s * Math. ceil( (start-p)/s );
  23. while (sieve.has(m)) m += s;
  24. sieve.set(m, s);
  25. p = ps.next().value;
  26. psqr = p * p;
  27. }
  28. if ( start > c) { c = start; }
  29. if ( c%2 === 0 ) { c += 1; }
  30.  
  31. // main loop
  32. for ( ; true ; c += 2 )
  33. {
  34. s = sieve.get(c);
  35. if (s !== undefined) {
  36. sieve.delete(c);
  37. } else if (c < psqr) {
  38. yield c;
  39. continue;
  40. } else { // c == psqr
  41. s = 2 * p;
  42. p = ps.next().value;
  43. psqr = p * p;
  44. }
  45. m = c + s;
  46. while (sieve.has(m)) m += s;
  47. sieve.set(m, s);
  48. }
  49. }
  50.  
  51.  
  52. (function test() {
  53. maxItems = 50;
  54. from = 500000000;
  55. const ps = primesFrom( from );
  56. array = [];
  57. for( i = 0; i < maxItems; i=i+1)
  58. {
  59. p = ps.next().value;
  60. // console.log(p);
  61. array.push( p-from );
  62. }
  63. console.log(array.join(','));
  64. })();
  65.  
Success #stdin #stdout 0.04s 19728KB
stdin
Standard input is empty
stdout
Starting....
Starting....
Starting....
Starting....
Starting....
3,9,41,57,69,71,77,89,93,99,101,117,183,201,227,231,233,261,273,299,317,321,323,353,359,377,387,393,437,443,461,467,483,489,491,507,539,551,587,597,623,659,663,671,681,693,701,723,729,737