(* Programmieraufgabe P-42 (goldbach.ml) *) (* Leonhard Fellermayr *) (* Mat.Nr. 22128130XXXX *) (* =================================================================== Deklaration verschiedener Exceptions =================================================================== *) exception Zu_klein;; exception Ungerade;; exception Goldbach_hatte_Unrecht of int;; (* =================================================================== leicht modifiziert aus Aufgabe P-17 Ÿbernommen =================================================================== *) let rec keineTeiler (n, k) = if k > n-1 then true else n mod k <> 0 && keineTeiler (n, k+1);; (* leicht modifiziert: nur ungerade Primzahlen *) let istOddPrim n = (n > 1) && (n mod 2 <> 0) && (keineTeiler (n, 2));; (* =================================================================== aus Aufgabe P-39 =================================================================== *) let rec suche_summanden n s = if s <= n/2 then [(s,n-s)]@(suche_summanden n (s+1)) else [];; (* =================================================================== goldbachFilter : Filtere aus der Summandenliste l (vgl. Aufgabe P-39) diejenigen Paare, die ungerade Primzahlen sind. Der erste Treffer wird zurŸckgegeben; falls Goldbach Unrecht hatte, erfolgt eine Exception (z. B. 4) =================================================================== *) let rec goldbachFilter n l = match l with (n1,n2)::xs -> if (istOddPrim n1) && (istOddPrim n2) then (n1,n2) else goldbachFilter n xs | [] -> raise (Goldbach_hatte_Unrecht n);; (* =================================================================== goldbach : Benutzer-Funktion =================================================================== *) let goldbach n = match n with n when n < 4 -> raise Zu_klein | n when n mod 2 <> 0 -> raise Ungerade | _ -> goldbachFilter n (suche_summanden n 1);; (* EOF *)