#open "graphics";; let identite n = let a = (make_matrix n n) 0 in for i=0 to n-1 do a.(i).(i)<-1 done ; a ;; let sigma a b f = let s=ref 0 in for i=a to b do s:= !s+(f i) done ; !s ;; let nb_li = vect_length ;; let nb_col m = vect_length (m.(0));; let s_mat a b = if (nb_col a)<>(nb_col b) then failwith "somme matricielle non définie car nombre de colones différent" else if (nb_li a)<>(nb_li b) then failwith "somme matricielle non définie car nombre de lignes différent" else let p=nb_col a in let n=nb_li a in let m=make_matrix n p 0 in for i=0 to n-1 do for j=0 to p-1 do m.(i).(j)<-(a.(i).(j)+b.(i).(j)) mod 2 done done ; m ;; let s_mat_li a b i = let m = make_matrix (nb_li a) (nb_col a) 0 in for j=0 to (nb_col a)-1 do m.(i).(j)<-(a.(i).(j)+b.(0).(j)) mod 2 done ; m ;; let s_ele_mat m = let c=ref 0 in for i=0 to nb_li m -1 do for j=0 to nb_col m -1 do c:=!c+m.(i).(j) done done ; !c ;; let p_mat a b = if (nb_col a)<>(nb_li b) then failwith "produit matriciel non défini" else let n=nb_li a in let p=nb_col a in let q=nb_col b in let M = make_matrix n q 0 in for i=0 to n-1 do for j=0 to q-1 do M.(i).(j) <- ((sigma 0 (p-1) (fun k -> a.(i).(k)*b.(k).(j))) mod 2 ) done done ; M ;; let gen_h = [|[|1;0;0;0;1;1;0|]; [|0;1;0;0;1;0;1|]; [|0;0;1;0;0;1;1|]; [|0;0;0;1;1;1;1|]|] ;; let cod_h m= p_mat m gen_h ;; let mat_ctrl_h = [|[|1;1;0|]; [|1;0;1|]; [|0;1;1|]; [|1;1;1|]; [|1;0;0|]; [|0;1;0|]; [|0;0;1|];|];; let ctrl_h m = p_mat m mat_ctrl_h ;; let decod m (*supprime les bits de parité*) = let p = make_matrix (nb_li m) 4 0 in for i=0 to (nb_li m)-1 do for j=0 to 3 do p.(i).(j) <- m.(i).(j) done done; p;; let correction m (*décodage par syndrome à améliorer*) = let p=ref (decod m) in for i=0 to (nb_li m)-1 do if ctrl_h m == [|[|0; 0; 0|]|] || ctrl_h m == [|[|1; 0; 0|]|] || ctrl_h m == [|[|0; 1; 0|]|] || ctrl_h m == [|[|0; 0; 1|]|] then () else if ctrl_h m = [|[|1; 1; 0|]|] then p:= (s_mat_li (decod m) [|[|1; 0; 0; 0|]|] i) else if ctrl_h m = [|[|1; 0; 1|]|] then p:= (s_mat_li (decod m) [|[|0; 1; 0; 0|]|] i) else if ctrl_h m = [|[|0; 1; 1|]|] then p:= (s_mat_li (decod m) [|[|0; 0; 1; 0|]|] i) else if ctrl_h m = [|[|1; 1; 1|]|] then p:= (s_mat_li (decod m) [|[|0; 0; 0; 1|]|] i) done; !p ;; let err m x y (*génère sur un matrice des erreurs à un taux de x/y*) = let a = make_matrix (nb_li m) (nb_col m) 0 in for i=0 to (nb_li m)-1 do for j=0 to (nb_col m)-1 do let b=random__int y in if b0 do res.(!i)<-(!m mod 2) ; m:=!m/2 ; incr i done ; res ;; let bin_to_int m = let a=ref 0 in for i=0 to 23 do a:=!a+m.(i)*(puiss2 i) done ; !a ;; let conv_color_bin m = let p = make_matrix (nb_li m) (nb_col m) [||] in for i=0 to (nb_li m)-1 do for j=0 to (nb_col m)-1 do p.(i).(j)<- int_to_bin m.(i).(j) done done ; p ;; let conv_bin_color m = let p = make_matrix (nb_li m) (nb_col m) (white) in for i=0 to (nb_li m)-1 do for j=0 to (nb_col m)-1 do p.(i).(j)<- (bin_to_int m.(i).(j)) done done ; p ;; let convert_one_bit_rbg m (*obsolète*) = let p = make_matrix (vect_length m) (nb_col m) white in for i=0 to (nb_li m)-1 do for j=0 to (nb_col m)-1 do if m.(i).(j)=1 then p.(i).(j)<-black done done ; p ;; let n_lignes m = let n=nb_li m and m=nb_col m in match n*m mod 4 with |0-> n*m/4 |_-> n*m/4 + 1 ;; let transforme_matrice m = let p=nb_col m and n=nb_li m and k=ref 0 and l=ref 0 in let resultat = ref (make_matrix (n_lignes m) 4 0) in for i=0 to (n-1) do for j=0 to (p-1) do (!resultat).(!k).(!l) <- m.(i).(j) ; if !l=3 then (l:=0 ; incr k) else incr l done done; !resultat ;; let drapeau_français = let a=make_matrix 160 300 blue in for i=100 to 199 do for j=0 to 159 do a.(j).(i)<-white done done ; for i=200 to 299 do for j=0 to 159 do a.(j).(i)<-red done done ; a ;; open_graph "80x40+10-10";; draw_image (make_image drapeau_français) 10 20 ;; draw_image (make_image (conv_bin_color (err_bin (conv_color_bin drapeau_français) 1 20))) 10 20 ;;