#!/usr/bin/env gbs3

Sub GetPrimes(N As Integer) As Integer[]

  Dim aRes As New Integer[]
  Dim S As Integer[]
  Dim I, J, M As Integer
  Dim iMRoot, iHalf As Integer

  If N < 2 Then Return aRes

  If N = 2 Then Return [2]

  S = New Integer[(N - 3 + 1) \ 2]
  For J = 3 To N Step 2
    S[I] = J
    Inc I
  Next

  iMRoot = Sqr(N)
  iHalf = S.Max
  I = 0
  M = 3

  While M <= iMRoot

    If S[I] Then
      
      For J = (M * M - 3) \ 2 To iHalf Step M
        S[J] = 0
      Next
      
    Endif

    Inc I
    M = 2 * I + 3

  Wend

  aRes.Add(2)
  For I = 0 To S.Max
    J = S[I]
    If J Then aRes.Add(J)
  Next

  Return aRes

End

Dim aRes As Integer[]
Dim I As Integer
'dim T as Float = Timer

For I = 1 To 5
  aRes = GetPrimes(10000000)
  Print aRes.Count
Next

'Print Format(Timer - T, "0.000 s")

Error CStr(Jit.Time)