From 853504642f93d75f3704393419d22e62dfe2eea0 Mon Sep 17 00:00:00 2001 From: giles Date: Sat, 9 May 2026 21:46:16 +0000 Subject: [PATCH] ocaml: phase 5.1 euler10.ml baseline (sum of primes <= 100 = 1060, scaled-down PE10) Sieve of Eratosthenes followed by a sum loop: let sieve_sum n = let s = Array.make (n + 1) true in s.(0) <- false; s.(1) <- false; for i = 2 to n do if s.(i) then begin let j = ref (i * i) in while !j <= n do s.(!j) <- false; j := !j + i done end done; let total = ref 0 in for i = 2 to n do if s.(i) then total := !total + i done; !total Real PE10 asks for sum below 2,000,000; that's a ~2-3 second loop in native OCaml but minutes-to-hours under our contended-host spec-level evaluator. 100 keeps the run under 3 minutes while still exercising the same algorithm. 110 baseline programs total. --- lib/ocaml/baseline/euler10.ml | 22 ++++++++++++++++++++++ lib/ocaml/baseline/expected.json | 1 + plans/ocaml-on-sx.md | 4 ++++ 3 files changed, 27 insertions(+) create mode 100644 lib/ocaml/baseline/euler10.ml diff --git a/lib/ocaml/baseline/euler10.ml b/lib/ocaml/baseline/euler10.ml new file mode 100644 index 00000000..72b16caa --- /dev/null +++ b/lib/ocaml/baseline/euler10.ml @@ -0,0 +1,22 @@ +let sieve_sum n = + let s = Array.make (n + 1) true in + s.(0) <- false; + s.(1) <- false; + for i = 2 to n do + if s.(i) then begin + let j = ref (i * i) in + while !j <= n do + s.(!j) <- false; + j := !j + i + done + end + done; + let total = ref 0 in + for i = 2 to n do + if s.(i) then total := !total + i + done; + !total + +;; + +sieve_sum 100 diff --git a/lib/ocaml/baseline/expected.json b/lib/ocaml/baseline/expected.json index 99f9f0a7..0bb688fd 100644 --- a/lib/ocaml/baseline/expected.json +++ b/lib/ocaml/baseline/expected.json @@ -26,6 +26,7 @@ "exception_handle.ml": 4, "exception_user.ml": 26, "euler1.ml": 233168, + "euler10.ml": 1060, "euler2.ml": 4613732, "euler5.ml": 232792560, "euler6.ml": 25164150, diff --git a/plans/ocaml-on-sx.md b/plans/ocaml-on-sx.md index d523a6a1..2dddfaff 100644 --- a/plans/ocaml-on-sx.md +++ b/plans/ocaml-on-sx.md @@ -407,6 +407,10 @@ _Newest first._ binary search tree (`type 'a tree = Leaf | Node of 'a * 'a tree * 'a tree`) with insert + in-order traversal. Tests parametric ADT, recursive match, List.append, List.fold_left. +- 2026-05-09 Phase 5.1 — euler10.ml baseline (sum of primes ≤ 100 = + 1060, scaled-down Project Euler #10). Sieve of Eratosthenes + followed by a sum loop. Used 100 instead of 2 million to fit our + contended host's runtime budget. 110 baseline programs total. - 2026-05-09 Phase 5.1 — euler5.ml baseline (Project Euler #5, smallest number divisible by all 1..20 = 232792560). Iteratively takes lcm of running result with i for i=2..n; lcm via gcd via