(*
 * $Id: sieve.ocaml,v 1.10 2001/06/10 04:12:44 doug Exp $
 * http://www.bagley.org/~doug/shootout/
 * based on code from Markus Mottl
 *)

let flags = String.make 8193 'f'

let rec inner_loop k i =
  if k < 8193 then begin
    flags.[k] <- 'f';
    inner_loop (k + i) i
  end

let rec middle_loop i cnt =
  if i < 8193 then
    if flags.[i] = 't' then begin
      inner_loop (i + i) i;
      middle_loop (i + 1) (cnt + 1) end
    else middle_loop (i + 1) cnt
  else cnt

let _ =
  let num =
    try int_of_string Sys.argv.(1)
    with Invalid_argument _ -> 1
  and cnt = ref 0 in
  for iter = 1 to num do
    for i = 2 to 8192 do flags.[i] <- 't' done;
    cnt := middle_loop 2 0;
  done;
  Printf.printf "Count: %d\n" !cnt