Diamo ora due esempi di struttura di gruppo.
Anche se un gruppo G non è abeliano, può ancora accadere che ci sia un insieme di elementi di G che commutano con tutto in G. Questo insieme è chiamato centro di G. Il centro C è un sottogruppo di G. Prova:
Ora supponiamo che f sia una funzione il cui dominio e intervallo sono entrambi G. Un periodo di f è un elemento a∈G tale che f(x)=f(ax) per tutti x∈G. L’insieme P dei periodi di f è un sottogruppo di G. Prova:
I gruppi finiti sono generati finitamente
Abbiamo visto che i gruppi ciclici sono generati da un solo elemento. Quando è possibile scrivere ogni elemento di un gruppo G come prodotto di un sottoinsieme (non necessariamente proprio) A di G allora diciamo che A genera G e scriviamo questo come G=⟨A⟩. La prova più “beh, duh” che vedrai mai è la prova che tutti i gruppi finiti sono generati da un insieme generatore finito:
Lascia che G sia finito. Ogni elemento di G è un prodotto di altri due elementi di G quindi G=⟨G⟩. QED.
Finiamo questo articolo con un’applicazione.
Comunicazione resistente agli errori
Il modo più semplice per trasmettere informazioni digitali è codificarle in stringhe binarie di lunghezza fissa. Nessuno schema di comunicazione è completamente libero da interferenze, quindi c’è sempre la possibilità che i dati sbagliati vengano ricevuti. Il metodo della decodifica a massima verosimiglianza è un approccio semplice ed efficace per individuare e correggere gli errori di trasmissione.
Lasciamo che 𝔹ⁿ sia l’insieme delle stringhe binarie, o parole, di lunghezza n. È facile dimostrare che 𝔹ⁿ è un gruppo abeliano sotto addizione binaria senza trasporto (così che per esempio 010+011=001). Si noti che ogni elemento è il suo inverso. Un codice C è un sottoinsieme di 𝔹ⁿ. Il seguente è un esempio di codice in 𝔹⁶:
C = {000000, 001011, 010110, 011101, 100101, 101110, 110011, 111000}
Gli elementi di un codice sono chiamati codewords. Solo le parole in codice saranno trasmesse. Si dice che si verifica un errore quando un’interferenza cambia un bit in una parola trasmessa. La distanza d(a,b) tra due codici a e b è il numero di cifre in cui due codici differiscono. La distanza minima di un codice è la più piccola distanza tra due qualsiasi dei suoi codici. Per l’esempio di codice appena citato, la distanza minima è tre.
Nel metodo di decodifica a massima verosimiglianza, se riceviamo una parola x, che può contenere errori, il ricevitore dovrebbe interpretare x come la parola di codice a tale che d(a,x) sia un minimo. Mostrerò che per un codice di distanza minima m questo può sempre (1) rilevare errori che cambiano meno di m bit e (2) correggere errori che cambiano ½(m-1) o meno bit.
Nel nostro codice di esempio, m=3 e la sfera di raggio ½(m-1)=1 intorno alla parola chiave 011101 è {011101, 111101, 001101, 011001, 010101, 011111, 011100}. Quindi, se il ricevitore riceve una qualsiasi di queste parole, sa che avrebbe dovuto ricevere 011101.
Quindi tutto questo va bene, ma cosa ha a che fare con la teoria dei gruppi? La risposta è nel modo in cui produciamo effettivamente i codici con cui questo metodo funziona.
È possibile che un codice in 𝔹ⁿ formi un sottogruppo. In questo caso diciamo che il codice è un codice di gruppo. I codici di gruppo sono gruppi finiti, quindi sono finitamente generati. Vedremo come produrre un codice trovando un insieme generatore.
Un codice può essere specificato in modo che i primi bit di ogni parola di codice sono chiamati bit di informazione e i bit alla fine sono chiamati bit di parità. Nel nostro esempio di codice C, i primi tre bit sono bit di informazione e gli ultimi tre sono bit di parità. I bit di parità soddisfano le equazioni di controllo di parità. Per un codice A₁A₂A₃A₄A₅A₆ le equazioni di parità sono A₄=A₁+A₂, A₅=A₂+A₃, e A₆=A₁+A₃. Le equazioni di parità forniscono un altro livello di protezione contro gli errori: se una qualsiasi delle equazioni di parità non è soddisfatta allora si è verificato un errore.
Ecco cosa facciamo. Supponiamo di volere delle parole chiave con m bit di informazione e n bit di parità. Per generare un codice di gruppo, scriviamo una matrice con m righe e m+n colonne. Nel blocco formato dalle prime m colonne, scrivete la matrice identità m×m. Nella colonna j per m+1≤j≤m_n, scrivere un 1 nella kesima riga se Aₖ appare nell’equazione di parità per il bit di parità Aⱼ e 0 altrimenti. Nel nostro codice di esempio, la matrice è:
Tale matrice è chiamata matrice generatrice del codice di gruppo. Si può verificare direttamente che le righe generano C:
Le righe di qualsiasi matrice generatrice formano un insieme generatore per un codice di gruppo C. Prova:
Identità e inversi: Qualsiasi riga aggiunta a se stessa dà l’identità, una stringa composta da tutti zeri.
Chiusura: Se A,B∈C allora A e B sono somme di righe della matrice generatrice quindi A+B è anche una somma di righe della matrice generatrice. Quindi A+B∈C.
Questo ci permette di generare un codice, ora mostrerò come generare un codice utile.
Definire il peso w(x) come il numero di uno in x. Per esempio, w(100101)=3. È ovvio che w(x)=d(x,0) dove 0 è una parola le cui cifre sono tutti zeri. Il peso minimo W di un codice è il peso della parola di codice non zero con il minor numero di uno nel codice. Per un codice di distanza minima m, d(x,0)≥m quindi w(x)≥m e quindi W=m.
Ricordiamo che perché una parola sia considerata un codeword, deve soddisfare un insieme di equazioni di controllo di parità. Per il nostro codice di esempio, queste sono A₄=A₁+A₂, A₅=A₂+A₃, e A₆=A₁+A₃. Possiamo anche scriverli come un sistema lineare:
che può essere scritto in termini di prodotti punto:
O in forma più compatta come Ha=0 dove a=(A₁,A₂,A₃,A₄,A₅,A₆) e H è la matrice di controllo di parità del codice:
Si può verificare per calcolo diretto che se w(a)≤2 allora non possiamo avere Ha=0. In generale, il peso minimo è t+1 dove t è il numero più piccolo tale che qualsiasi insieme di t colonne di H non sommano a zero (cioè sono linearmente indipendenti). Dimostrare questo ci porterebbe un po’ troppo lontano nell’algebra lineare.
Se questo vi spaventa, non preoccupatevi. Possiamo produrre alcuni codici molto buoni senza di esso, approfittando del fatto che il risultato che ho appena menzionato implica che se ogni colonna di H non è zero e nessuna colonna è uguale, allora il peso minimo, e quindi la distanza minima del codice, è almeno tre. Questo è molto buono: se ci si aspetta che il nostro sistema di comunicazione abbia un errore di bit per ogni cento parole trasmesse, allora solo una su diecimila parole trasmesse avrà un errore non corretto e una su un milione di parole trasmesse avrà un errore non rilevato.
Ora abbiamo una ricetta per produrre un codice utile per lo schema di rilevamento della massima verosimiglianza per le parole in codice contenenti m bit di informazione e n bit di parità:
Crea una matrice con m+n colonne e n righe. Riempite la matrice con gli uni e gli zeri in modo che non ci siano due colonne uguali e nessuna colonna sia composta solo da zeri.
Ogni riga della matrice di controllo di parità risultante corrisponde a una delle equazioni del bit di parità. Scriveteli come un sistema di equazioni e risolvete in modo che ogni bit di parità sia scritto in termini di bit di informazione.
Create una matrice con m+n colonne e m righe. Nel blocco formato dalle prime m colonne, scrivete la matrice d’identità m×m. Nella colonna j per m+1≤j≤m_n, scrivete un 1 nella kesima riga se Aₖ appare nell’equazione di parità per il bit di parità Aⱼ e 0 altrimenti.
Le righe di questa matrice sono i generatori di un gruppo di codice con distanza minima almeno tre. Questo è il codice che useremo.
Come esempio, supponiamo che io abbia bisogno di un semplice codice di otto parole e che io abbia bisogno solo di qualche rilevamento di errore di base e non di correzione, quindi posso cavarmela con una distanza minima di due. Voglio tre bit di informazione e due bit di parità. Scrivo la seguente matrice di controllo di parità:
Ci sono due coppie di colonne che sono uguali, quindi il più piccolo t per cui qualsiasi insieme di t colonne è linearmente indipendente è uno, quindi il peso minimo, e quindi la distanza minima che avrò, è due. Le righe rappresentano le equazioni di controllo di parità A₄=A₁+A₃ e A₅=A₁+A₂+A₃. La mia matrice generatrice è dunque:
E le righe di questa matrice generano il gruppo di codici:
{00000, 00111, 01001, 01110, 10011, 10100, 111010, 11101}
Riservazioni conclusive
L’algebra astratta è un argomento profondo con implicazioni di vasta portata, ma è anche molto facile da imparare. A parte qualche accenno di passaggio all’algebra lineare, quasi tutto quello che ho discusso qui è accessibile a qualcuno che ha avuto solo l’algebra del liceo.
Quando ho avuto l’idea di scrivere questo articolo volevo davvero parlare del cubo di Rubik, ma alla fine ho voluto scegliere un esempio che potesse essere trattato solo con le idee più basilari della teoria dei gruppi. Inoltre, c’è così tanto da dire sul gruppo del cubo di Rubik che merita un pezzo a sé stante, che arriverà presto.
I miei corsi universitari di algebra astratta erano basati sul libro A Book of Abstract Algebra di Charles Pinter, che è un trattamento accessibile. Gli esempi in questo articolo sono stati tutti presi in prestito con qualche modifica da Pinter.
Come nota finale, tutte le immagini che non sono citate sono il mio lavoro originale e possono essere usate con attribuzione. Come sempre, apprezzo qualsiasi correzione o richiesta di chiarimento.