summaryrefslogtreecommitdiff
path: root/ocaml-binary-annot/testsuite/tests/misc/sieve.ml
diff options
context:
space:
mode:
Diffstat (limited to 'ocaml-binary-annot/testsuite/tests/misc/sieve.ml')
-rw-r--r--ocaml-binary-annot/testsuite/tests/misc/sieve.ml56
1 files changed, 56 insertions, 0 deletions
diff --git a/ocaml-binary-annot/testsuite/tests/misc/sieve.ml b/ocaml-binary-annot/testsuite/tests/misc/sieve.ml
new file mode 100644
index 0000000000..450c84f4ce
--- /dev/null
+++ b/ocaml-binary-annot/testsuite/tests/misc/sieve.ml
@@ -0,0 +1,56 @@
+(***********************************************************************)
+(* *)
+(* 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: sieve.ml 7017 2005-08-12 09:22:04Z xleroy $ *)
+
+(* 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 50000);
+ print_newline();
+ exit 0