From 00ffba930661165274ad77ef7d9b4ad159a08feb Mon Sep 17 00:00:00 2001 From: giles Date: Sat, 9 May 2026 21:35:59 +0000 Subject: [PATCH] ocaml: phase 5.1 euler5.ml baseline (smallest multiple of 1..20 = 232792560) Iteratively takes lcm of running result with i: let rec gcd a b = if b = 0 then a else gcd b (a mod b) let lcm a b = a * b / gcd a b let euler5 n = let r = ref 1 in for i = 2 to n do r := lcm !r i done; !r euler5 20 = 232792560 = 2^4 * 3^2 * 5 * 7 * 11 * 13 * 17 * 19 Tests gcd_lcm composition (iter 140) on a fresh problem. 109 baseline programs total. --- lib/ocaml/baseline/euler5.ml | 11 +++++++++++ lib/ocaml/baseline/expected.json | 1 + plans/ocaml-on-sx.md | 6 ++++++ 3 files changed, 18 insertions(+) create mode 100644 lib/ocaml/baseline/euler5.ml diff --git a/lib/ocaml/baseline/euler5.ml b/lib/ocaml/baseline/euler5.ml new file mode 100644 index 00000000..949015a3 --- /dev/null +++ b/lib/ocaml/baseline/euler5.ml @@ -0,0 +1,11 @@ +let rec gcd a b = if b = 0 then a else gcd b (a mod b) +let lcm a b = a * b / gcd a b +let euler5 n = + let r = ref 1 in + for i = 2 to n do + r := lcm !r i + done; + !r +;; + +euler5 20 diff --git a/lib/ocaml/baseline/expected.json b/lib/ocaml/baseline/expected.json index 95229766..99f9f0a7 100644 --- a/lib/ocaml/baseline/expected.json +++ b/lib/ocaml/baseline/expected.json @@ -27,6 +27,7 @@ "exception_user.ml": 26, "euler1.ml": 233168, "euler2.ml": 4613732, + "euler5.ml": 232792560, "euler6.ml": 25164150, "euler9.ml": 31875000, "expr_eval.ml": 16, diff --git a/plans/ocaml-on-sx.md b/plans/ocaml-on-sx.md index 5b89f459..d523a6a1 100644 --- a/plans/ocaml-on-sx.md +++ b/plans/ocaml-on-sx.md @@ -407,6 +407,12 @@ _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 — 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 + Euclidean. 232792560 = 2^4 * 3^2 * 5 * 7 * 11 * 13 * 17 * 19. + Tests two-line gcd/lcm + for-loop accumulator pattern. 109 + baseline programs total. - 2026-05-09 Phase 5.1 — partition.ml baseline (stable partition by predicate, 30*100 + 25 = 3025). Two ref lists accumulating in reverse, then List.rev'd — preserves original order. Test: