#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 moyenne x y z = if (x+y+z)<2 then 0 else 1 ;; 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 3do 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) 24 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 transfo_quelc_mat4 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 ;; 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.(2-(!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 decompo_image m (*décompose les éléments matrice couleur en un tableau de 3 composantes sous la forme [|RRR;GGG;BBB]|*) = let n=(nb_li m) and p=(nb_col m) in let a= make_matrix n p [|0;0;0|] in for i=0 to n-1 do for j=0 to p-1 do a.(i).(j) <- compo m.(i).(j) done done ; a ;; let decompo_separ 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 decompo_image_separ 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) <- decompo_separ m.(i).(j) done done ; a ;; let image_to_bin_separ m = let a=decompo_image_separ 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)) 4 ; b.(i).(j).(2*k+1)<-int_to_bin (snd a.(i).(j).(k)) 4 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|]; [|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|]; [|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).(6*j+24*k+l) done done done done ; a ;; open_graph "80x40+10-10";; draw_image (make_image drapeau_français) 20 20 ;; let image_to_bin_redon m = let a=decompo_image_separ m in let n=(nb_li m) and p=(nb_col m) in let b=make_matrix n p [|[||];[||];[||];[||];[||];[||];[||];[||];[||];[||];[||];[||];|] in for i=0 to n-1 do for j=0 to p-1 do b.(i).(j)<- [|[||];[||];[||];[||];[||];[||];[||];[||];[||];[||];[||];[||];|] 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).(4*k)<-int_to_bin (fst a.(i).(j).(k)) 4 ;b.(i).(j).(4*k+1)<-int_to_bin (fst a.(i).(j).(k)) 4; b.(i).(j).(4*k+2)<-int_to_bin (fst a.(i).(j).(k)) 4 ; b.(i).(j).(4*k+3)<-int_to_bin (snd a.(i).(j).(k)) 4 done done done; b ;; image_to_bin_redon [|[|(rgb 18 55 35)|]|] ;; let simplifier_matrice_redon m = let n=(nb_li m) and p=(nb_col m) in let a=make_matrix n (48*p) 0 in for i=0 to n-1 do for j=0 to p-1 do for k=0 to 11 do for l=0 to 3 do a.(i).(48*j+4*k+l)<- m.(i).(j).(k).(l) done done done done ; a ;; simplifier_matrice_redon ( image_to_bin_redon [|[|red|]|]);; image_to_bin_redon [|[|red|]|];; simplifier_matrice_redon ( image_to_bin_redon [|[|(rgb 18 55 35);red|]|] );; image_to_bin_redon [|[|(rgb 18 55 35);red|]|];; let remplace_matrice_redon m = let n=(nb_li m) and p=(nb_col m) in let a=make_matrix n (p/48) [|[|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/48)-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;|]; |] done done ; for i=0 to n-1 do for j=0 to p/48-1 do for k=0 to 11 do for l=0 to 3 do a.(i).(j).(k).(l)<- m.(i).(12*j+4*k+l) done done done done ; a ;; let transfo_mat4_quelc matrice p = let n = nb_li matrice in let r = make_matrix (4*n/p) p matrice.(0).(0) and k=ref 0 and l = ref 0 in for i = 0 to n-1 do for j = 0 to 3 do r.(!k).(!l) <- matrice.(i).(j) ; if !l=p-1 then (l:=0 ; incr k) else incr l done done;r;; correction (cod_h (transfo_quelc_mat4(simplifier_matrice_redon (image_to_bin_redon [|[| red|]|]))));; simplifier_matrice_redon (image_to_bin_redon [|[| red|]|]);; corrige (remplace_matrice_redon(transfo_mat4_quelc (correction (cod_h (transfo_quelc_mat4(simplifier_matrice_redon (image_to_bin_redon [|[| red|]|]))))) 288));; simplifier_matrice_redon (image_to_bin_redon [|[| red|]|]);; transfo_mat4_quelc (correction (cod_h (transfo_quelc_mat4(simplifier_matrice_redon (image_to_bin_redon [|[| red|]|]))))) 288;; remplace_matrice_redon(transfo_mat4_quelc (correction (cod_h (transfo_quelc_mat4(simplifier_matrice_redon (image_to_bin_redon [|[| red|]|]))))) 1 ) ;; bin_to_image( corrige( remplace_matrice_redon( (simplifier_matrice_redon (image_to_bin_redon [|[|black;white|]|])))));; image_to_bin_redon [|[|(rgb 18 55 35);red|]|];; image_to_bin [|[|(rgb 18 55 35);red|]|];; let corrige m = let n=(nb_li m) and p=(nb_col m) in let a=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/24 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|]|] done done ; for i=0 to n-1 do for j=0 to p-1 do for k=0 to 2 do for l=0 to 3 do a.(i).(j).(2*k).(l) <-moyenne m.(i).(j).(4*k).(l) m.(i).(j).(4*k+1).(l) m.(i).(j).(4*k+2).(l); a.(i).(j).(2*k+1).(l)<- m.(i).(j).(4*k+3).(l) done done done done; a ;; let bin_to_image m = let n=nb_li m and p=nb_col m in let a=make_matrix n p white in for i=0 to n-1 do for j=0 to p-1 do a.(i).(0)<-rgb (16*(bin_to_int m.(i).(j).(0))+bin_to_int m.(i).(j).(1)) (16*(bin_to_int m.(i).(j).(2))+bin_to_int m.(i).(j).(3)) (16*(bin_to_int m.(i).(j).(4))+bin_to_int m.(i).(j).(5)) done done ; a ;; bin_to_image( corrige( remplace_matrice_redon( transfo_mat4_quelc( correction(err(cod_h( transfo_quelc_mat4( simplifier_matrice_redon( image_to_bin_redon [|[|(rgb 18 55 35);red|]|] ) ) ))1 3 ) ) 48) )) ;; open_graph "";; draw_image (make_image (bin_to_image( corrige( remplace_matrice_redon( transfo_mat4_quelc( correction(err(cod_h( transfo_quelc_mat4( simplifier_matrice_redon( image_to_bin_redon carre_rouge ) ) ))1 30 ) ) 48) )) )) 10 20 ;; draw_image (make_image (bin_to_image( corrige( remplace_matrice_redon( transfo_mat4_quelc( correction(err(cod_h( transfo_quelc_mat4( simplifier_matrice_redon( image_to_bin_redon carre_rouge ) ) ))1 30 ) ) 48) )) )) 20 20 ;; let carre_rouge = make_matrix 10 10 red ;; draw_image (make_image carre_rouge) 10 20 ;; bin_to_image( corrige( remplace_matrice_redon( transfo_mat4_quelc( correction(err(cod_h( transfo_quelc_mat4( simplifier_matrice_redon( image_to_bin_redon carre_rouge ) ) ))1 3 ) ) 48) ));; open_graph "";; draw_image (make_image (bin_to_image( corrige( remplace_matrice_redon( transfo_mat4_quelc( correction(err(cod_h( transfo_quelc_mat4( simplifier_matrice_redon( image_to_bin_redon carre_rouge ) ) ))1 30 ) ) 48) )) )) 40 50 ;;