function hamming_demo

	% probabilita` di crossover del BSC
	p = 0.05;

	% capacita` del canale
	C = 1 - entropy([p, 1-p]);
	
	% matrice di controllo di parita` del codice di Hamming
	NmK = 3;
	HT = hamming_parity_check_matrix(NmK);
	
	% costruisci la matrice generatrice
	N = size(HT,1);
	K = N - NmK;
	P = HT(1:K,:);
	G = [eye(K),P];
	
	% attenzione...
	if K/N > C
		fprintf('R > C, non ti aspettare miracoli!');
	end
	
	% parola informativa casuale (il risultato di un operatore
	% relazionale è un logical che vale 0 o 1)
	x = rand(1,K) < 0.5;
	
	% codifica
	c = hamming_encode(x,G);
	
	% canale BSC
	r = BSC(c, p);

	% diamo un'occhiata agli errori eventualmente presenti
	e = mod(c + r,2)
	
	% decodifica a sindrome
	c_est = hamming_decode(r,HT);
	
	% qui siamo solo sicuri che il pattern di errore, se c'e`, e` una
	% parola di codice
	e_est = mod(c + c_est, 2)
end

% decodifica con la sindrome
function c_est = hamming_decode(r,HT)
	
	% inizializzazione "ottimista"
	c_est = r;

	% calcola la sindrome
	s = mod(r*HT,2);
	
	% se la sindrome non e` nulla...
	if sum(s)
		[N,NmK] = size(HT);

		% ...cercala tra le righe di H trasposta...
		for n = 1:N
			if sum(s == HT(n,:)) == NmK

				% ...e modifica il bit corrispondente
				c_est(n) = 1 - c_est(n);
				break
			end
		end
	end
end

% codifica con la matrice generatrice del codice
function c = hamming_encode(x,G)
	c = mod( x*G, 2 );
end
