From 320d78a9935006858b1f13261b1b14aa212ac086 Mon Sep 17 00:00:00 2001 From: giles Date: Sat, 9 May 2026 22:21:16 +0000 Subject: [PATCH] ocaml: phase 5.1 euler3.ml baseline (largest prime factor of 13195 = 29) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PE3's worked example. Trial-division streaming: when the current factor divides m, divide and update largest; otherwise bump factor: let largest_prime_factor n = let m = ref n in let factor = ref 2 in let largest = ref 0 in while !m > 1 do if !m mod !factor = 0 then begin largest := !factor; m := !m / !factor end else factor := !factor + 1 done; !largest largest_prime_factor 13195 = 29 (= 5 * 7 * 13 * 29) The full PE3 number 600851475143 exceeds JS safe-int (2^53 ≈ 9e15 in float terms; 6e11 is fine but the intermediate 'i mod !factor' on the way to 6857 can overflow precision). 13195 keeps the program portable across hosts. 113 baseline programs total. --- lib/ocaml/baseline/euler3.ml | 15 +++++++++++++++ lib/ocaml/baseline/expected.json | 1 + plans/ocaml-on-sx.md | 6 ++++++ 3 files changed, 22 insertions(+) create mode 100644 lib/ocaml/baseline/euler3.ml diff --git a/lib/ocaml/baseline/euler3.ml b/lib/ocaml/baseline/euler3.ml new file mode 100644 index 00000000..e8b5c730 --- /dev/null +++ b/lib/ocaml/baseline/euler3.ml @@ -0,0 +1,15 @@ +let largest_prime_factor n = + let m = ref n in + let factor = ref 2 in + let largest = ref 0 in + while !m > 1 do + if !m mod !factor = 0 then begin + largest := !factor; + m := !m / !factor + end else factor := !factor + 1 + done; + !largest + +;; + +largest_prime_factor 13195 diff --git a/lib/ocaml/baseline/expected.json b/lib/ocaml/baseline/expected.json index 1db73d94..1ffa7432 100644 --- a/lib/ocaml/baseline/expected.json +++ b/lib/ocaml/baseline/expected.json @@ -28,6 +28,7 @@ "euler1.ml": 233168, "euler10.ml": 1060, "euler2.ml": 4613732, + "euler3.ml": 29, "euler4_small.ml": 9009, "euler5.ml": 232792560, "euler6.ml": 25164150, diff --git a/plans/ocaml-on-sx.md b/plans/ocaml-on-sx.md index 1f39a248..5b103d9c 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 — euler3.ml baseline (largest prime factor of + 13195 = 29; PE3's worked example). Trial-division streaming: when + the current factor divides m, divide and update largest; otherwise + bump factor. Numbers like 600851475143 (the actual PE3) exceed JS + safe-int (2^53 ≈ 9e15), so 13195 keeps the program portable. 113 + baseline programs total. - 2026-05-09 Phase 5.1 — euler7.ml baseline (100th prime = 541; scaled-down PE7 which asks for the 10001st = 104743). Trial- division within an outer while loop searching forward from 2,