57 lines
1.7 KiB
OCaml
57 lines
1.7 KiB
OCaml
(***********************************************************************)
|
|
(* *)
|
|
(* Objective Caml *)
|
|
(* *)
|
|
(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *)
|
|
(* *)
|
|
(* Copyright 1996 Institut National de Recherche en Informatique et *)
|
|
(* en Automatique. All rights reserved. This file is distributed *)
|
|
(* under the terms of the Q Public License version 1.0. *)
|
|
(* *)
|
|
(***********************************************************************)
|
|
|
|
(* $Id$ *)
|
|
|
|
(* Eratosthene's sieve *)
|
|
|
|
(* interval min max = [min; min+1; ...; max-1; max] *)
|
|
|
|
let rec interval min max =
|
|
if min > max then [] else min :: interval (min + 1) max
|
|
|
|
|
|
(* filter p L returns the list of the elements in list L
|
|
that satisfy predicate p *)
|
|
|
|
let rec filter p = function
|
|
[] -> []
|
|
| a::r -> if p a then a :: filter p r else filter p r
|
|
|
|
|
|
(* Application: removing all numbers multiple of n from a list of integers *)
|
|
|
|
let remove_multiples_of n =
|
|
filter (fun m -> m mod n <> 0)
|
|
|
|
|
|
(* The sieve itself *)
|
|
|
|
let sieve max =
|
|
let rec filter_again = function
|
|
[] -> []
|
|
| n::r as l ->
|
|
if n*n > max then l else n :: filter_again (remove_multiples_of n r)
|
|
in
|
|
filter_again (interval 2 max)
|
|
|
|
|
|
let rec do_list f = function
|
|
[] -> ()
|
|
| a::l -> f a; do_list f l
|
|
|
|
|
|
let _ =
|
|
do_list (fun n -> print_int n; print_string " ") (sieve 40000);
|
|
print_newline();
|
|
exit 0
|