let divisible_by n = List.filter (fun m -> m mod n <> 0) let range a b = let rec range_iter a b accum = if b < a then accum else range_iter a (b - 1) (b :: accum) in range_iter a b [] let sieve max = let rec sieve_aux = function | [] -> [] | x :: xs as l -> if x * x > max then l else x :: sieve_aux (divisible_by x xs) in sieve_aux (range 2 max)