#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 binaire 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 (*convertit une matrice couleur en une matrice de tableaux binaires*) = 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 (*transforme une matrice quelconque en une matrice à 4 colones*) = 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 carré = let c=make_matrix 301 301 white in for i=0 to 300 do if i mod 4 = 0 then (for j=i to 300-i do c.(i).(j) for j=300-i to i do c.(i).(j)done ; c ;; 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 ;; let compo n (*donne les composantes rgb d'une couleur*) = let res=make_vect 3 0 and m= ref n and i=ref 0 in while !m>0 do res.(!i)<-(!m mod 256) ; m:=!m/256 ; incr i done ; res ;; let decompo_16 n (*décompose une composante en un couple (q,r) de 16*)= (n/16 , (n mod 16)) ;; let décompo c (*décompose une couleur en un tableau de 3 composantes sous la forme (q,r)*)= let a=compo c in let m=[|(0,0);(0,0);(0,0)|] in for i=0 to 2 do m.(i)<-decompo_16 a.(i) done ; m ;; let décompo_image m (*décompose les éléments matrice couleur en un tableau de 3 composantes sous la forme (q,r)*) = let n=(nb_li m) and p=(nb_col m) in let a= make_matrix n p [|0, 0; 0, 0; 0, 0|] in for i=0 to n-1 do for j=0 to p-1 do a.(i).(j) <- décompo m.(i).(j) done done ; a ;; let image_to_bin m = let a=décompo_image m in let n=(nb_li m) and p=(nb_col m) in let b=make_matrix n p [|[|0;0;0;0|];[|0;0;0;0|];[|0;0;0;0|];[|0;0;0;0|];[|0;0;0;0|];[|0;0;0;0|]|] in for i=0 to n-1 do for j=0 to p-1 do b.(i).(j)<- [|[|0;0;0;0|];[|0;0;0;0|];[|0;0;0;0|];[|0;0;0;0|];[|0;0;0;0|];[|0;0;0;0|]|] done done; for i=0 to n-1 do for j=0 to p-1 do for k=0 to 2 do b.(i).(j).(2*k)<-int_to_bin (fst a.(i).(j).(k)) ; b.(i).(j).(2*k+1)<-int_to_bin (snd a.(i).(j).(k)) done done done; b ;; let simplifier_matrice m = let n=(nb_li m) and p=(nb_col m) in let a=make_matrix n (144*p) 0 in for i=0 to n-1 do for j=0 to p-1 do for k=0 to 5 do for l=0 to 23 do a.(i).(6*j+24*k+l)<- m.(i).(j).(k).(l) done done done done ; a ;; let remplace_matrice m = let n=(nb_li m) and p=(nb_col m) in let a=make_matrix n (p/144) [|[|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0|]; [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0|]; [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0|]; [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0|]; [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0|]; [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0|]|] in for i=0 to n-1 do for j=0 to p/144-1 do a.(i).(j)<- [|[|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0|]; [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0|]; [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0|]; [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0|]; [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0|]; [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0|]|] done done ; for i=0 to n-1 do for j=0 to p/144-1 do for k=0 to 5 do for l=0 to 23 do a.(i).(j).(k).(l)<- m.(i).(24*j+6*k+l) done done done done ; a ;;