Ludic numbers   are related to prime numbers as they are generated by a sieve quite like the Sieve of Eratosthenes is used to generate prime numbers.

The first ludic number is   1.

To generate succeeding ludic numbers create an array of increasing integers starting from   2.

2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 ...
(Loop)

 Take the first member of the resultant array as the next ludic number   2.
 Remove every   2nd   indexed item from the array (including the first).
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 ...
 (Unrolling a few loops...)
 Take the first member of the resultant array as the next ludic number   3.
 Remove every   3rd   indexed item from the array (including the first).
3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 ...
 Take the first member of the resultant array as the next ludic number   5.
 Remove every   5th   indexed item from the array (including the first).
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 ...
 Take the first member of the resultant array as the next ludic number   7.
 Remove every   7th   indexed item from the array (including the first).
7 11 13 17 23 25 29 31 37 41 43 47 53 55 59 61 67 71 73 77 83 85 89 91 97 ...
  ... 
 Take the first member of the current array as the next ludic number   L.
 Remove every   Lth   indexed item from the array (including the first).
  ... 


Task

 Generate and show here the first 25 ludic numbers.
 How many ludic numbers are there less than or equal to 1000?
 Show the 2000..2005th ludic numbers.


Stretch goal

Show all triplets of ludic numbers < 250.

 A triplet is any three numbers     



x
,


{\displaystyle x,}

   



x
+
2
,


{\displaystyle x+2,}

   



x
+
6


{\displaystyle x+6}

      where all three numbers are also ludic numbers. 


$ include "seed7_05.s7i";
 
const func set of integer: ludicNumbers (in integer: n) is func
  result
    var set of integer: ludicNumbers is {1};
  local
    var set of integer: sieve is EMPTY_SET;
    var integer: ludicNumber is 0;
    var integer: number is 0;
    var integer: count is 0;
  begin
    sieve := {2 .. n};
    while sieve <> EMPTY_SET do
      ludicNumber := min(sieve);
      incl(ludicNumbers, ludicNumber);
      count := 0;
      for number range sieve do
        if count rem ludicNumber = 0 then
          excl(sieve, number);
        end if;
        incr(count);
      end for;
    end while;
  end func;
 
const integer: limit is 22000;
const set of integer: ludicNumbers is ludicNumbers(limit);
 
const proc: main is func
  local
    var integer: number is 0;
    var integer: count is 0;
  begin
    write("First 25:");
    for number range ludicNumbers until count = 25 do
      write(" " <& number);
      incr(count);
    end for;
    writeln;
    count := 0;
    for number range ludicNumbers until number > 1000 do
      incr(count);
    end for;
    writeln("Ludics below 1000: " <& count);
    write("Ludic 2000 to 2005:");
    count := 0;
    for number range ludicNumbers until count >= 2005 do
      incr(count);
      if count >= 2000 then
        write(" " <& number);
      end if;
    end for;
    writeln;
    write("Triples below 250:");
    for number range ludicNumbers until number > 250 do
      if number + 2 in ludicNumbers and number + 6 in ludicNumbers then
        write(" (" <& number <& ", " <& number + 2 <& ", " <& number + 6 <& ")");
      end if;
    end for;
    writeln;
  end func;