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. 


import strutils
 
type LudicArray[N: static int] = array[1..N, int]
 
func initLudicArray[N: static int](): LudicArray[N] =
  ## Initialize an array of ludic numbers.
  result[1] = 1
  for i in 2..N:
    var k = 0
    for j in countdown(i - 1, 2):
      k = k * result[j] div (result[j] - 1) + 1
    result[i] = k + 2
 
 
proc print(text: string; list: openArray[int]) =
  ## Print a text followed by a list of ludic numbers.
  var line = text
  let start = line.len
  for val in list:
    line.addSep(", ", start)
    line.add $val
  echo line
 
 
func isLudic(ludicArray: LudicArray; n, start: Positive): bool =
  ## Check if a number "n" is ludic, starting search from index "start".
  for idx in start..ludicArray.N:
    let val = ludicArray[idx]
    if n == val: return true
    if n < val: break
 
 
when isMainModule:
 
  let ludicArray = initLudicArray[2005]()
 
  print "The 25 first ludic numbers are: ", ludicArray[1..25]
 
  var count = 0
  for n in ludicArray:
    if n > 1000: break
    inc count
  echo "\nThere are ", count, " ludic numbers less or equal to 1000."
 
  print "\nThe 2000th to 2005th ludic numbers are: ", ludicArray[2000..2005]
 
  echo "\nThe triplets of ludic numbers less than 250 are:"
  var line = ""
  for i, n in ludicArray:
    if n >= 244:
      echo line
      break
    if ludicArray.isLudic(n + 2, i + 1) and ludicArray.isLudic(n + 6, i + 2):
      line.addSep(", ")
      line.add "($1, $2, $3)".format(n, n + 2, n + 6)