70 lines
1.7 KiB
OCaml
70 lines
1.7 KiB
OCaml
type vecteur = int;;
|
|
type matrice = int list;;
|
|
|
|
(* Zolie fonction d'affichage (h=nombre de lignes) *)
|
|
(* L'algorithme est moche, mais y a pas trop d'autre solution que de arrayiser la liste, c'est stoqué dans le mauvais sens *)
|
|
let nthOfBinarint i n = if ((0b1 lsl n) land i)=0 then "0" else "1";;
|
|
let print_matrice h (matl:matrice) :unit =
|
|
let mat = Array.of_list matl in
|
|
let l = Array.length mat in
|
|
print_string "┌";
|
|
for i=0 to (l-1) do
|
|
print_string (nthOfBinarint mat.(i) 0)
|
|
done;
|
|
print_endline "┐";
|
|
for j=1 to (h-2) do
|
|
print_string "│";
|
|
for i=0 to (l-1) do
|
|
print_string (nthOfBinarint mat.(i) j)
|
|
done;
|
|
print_endline "│";
|
|
done;
|
|
print_string "└";
|
|
for i=0 to (l-1) do
|
|
print_string (nthOfBinarint mat.(i) (h-1))
|
|
done;
|
|
print_endline "┘";;
|
|
let print_vecteur h x = print_matrice h [x];;
|
|
|
|
(* Effectue le produit matriciel 'matrice' . 'vecteur' *)
|
|
let produit (matrice:matrice) (vecteur:vecteur) :vecteur =
|
|
let rec auxiliaire resultat_partiel masque = function
|
|
| [] -> resultat_partiel
|
|
| colonne :: reste ->
|
|
let resultat =
|
|
if masque mod 2 = 1
|
|
then (lxor) colonne resultat_partiel
|
|
else resultat_partiel
|
|
in auxiliaire resultat (masque / 2) reste
|
|
in auxiliaire 0 vecteur matrice
|
|
;;
|
|
|
|
(* Ne calcul papy *)
|
|
let deux_puissance = (lsl) 1;;
|
|
|
|
|
|
(* Construit la matrice identité de taille d.d *)
|
|
let identite d =
|
|
let rec sub acc = function
|
|
| p when p >= 0 -> sub ((deux_puissance p) :: acc) (p-1)
|
|
| _ -> acc
|
|
in sub [] (d-1)
|
|
;;
|
|
|
|
|
|
(* Change l'état du 'i'-eme bit *)
|
|
let changer_bit i = (lxor) (deux_puissance i);;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
(* Vérifie que 'y' respecte toutes les contraintes de 'cs' *)
|
|
(* Est-ce que pour tout P dans cs, P(cs) ? *)
|
|
let respecter y cs =
|
|
let ny = (lnot) y in
|
|
List.fold_right (fun c b -> b && (land) c ny > 0) cs true
|
|
;;
|
|
|