polytest.ml
(* 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
();;