(* pour charger le fichier compilé polynome.cmo dans le mode interactif *)
#cd "../3";;
#load "polynome.cmo";;
open Polynome;;
(* l'anneau des entiers *)
module I =
struct
type t = int
let zéro = 0
let unité = 1
let nég x = - x
let plus = ( + )
let mult = ( * )
let equal = ( = )
let string = string_of_int
end;;
(* l'anneau des Z/2Z *)
(* invariant: on maintient la représentation canonique 0 ou 1 *)
module Z_2Z =
struct
type t = int
let zéro = 0
let unité = 1
let plus x y = (x + y) mod 2
let nég x = x
let mult x y = (x * y) mod 2
let equal = ( = )
let string = string_of_int
end;;
(* On abstrait le test pour le répéter avec différents anneaux de base *)
module Test(A: ANNEAU) =
struct
(* les polynômes à coefficients dans A *)
module X = Make (A)(struct let nom_variable = "X" end)
(* A toplevel, poour mettre au point:
let print_X x = Format.print_string (X.string x)
#install_printer print_X
*)
(* on construit (1 + X)(1 - X) = 1 - X^2 *)
let ( ^ ) = X.monôme
let ( + ) = X.plus
let ( * ) = X.mult
let ( - ) p q = p + (X.nég q)
let z = A.unité
let x0, x1, x2 = z^0, z^1, z^2
let p = (x0 + x1) * (x0 - x1)
let q = x0 - x2
let () =
Printf.printf "%s_%s_%s\n"
(X.string p) (if X.equal p q then "=" else "<>") (X.string q)
(* les polynomes à coefficients dans X *)
module Y = Make (X)(struct let nom_variable = "Y" end)
(* Idem
let print x = Format.print_string (Y.string x)
#install_printer print *)
let ( ^^ ) = Y.monôme
let ( ++ ) = Y.plus
let ( ** ) = Y.mult
let ( -- ) p q = p ++ (Y.nég q)
let x1, x2, y1, y2 = x1^^0, x2^^0, x0^^1, x0^^2
let p = (x1 ++ y1) ** (x1 -- y1)
let q = x2 -- y2
let () =
Printf.printf "%s_%s_%s\n"
(Y.string p) (if Y.equal p q then "=" else "<>") (Y.string q)
end;;
(* Le test pour I et pour Z_2Z *)
let () = print_string "\n(*_Dans_l'anneau_des_entier*)\n\n" in
let module T1 = Test(I) in
let () = print_string "\n(*_Dans_l'anneau_Z/2Z_*)\n\n" in
let module T2 = Test(Z_2Z) in
();;
|
|