Sunteți pe pagina 1din 52

Aprobat Decan,

Prof. Univ. Dr. Emil PETRESCU

CODURI LINIARE. CODURI


HAMMING

ÎNDRUMĂTOR ŞTIINŢIFIC, ABSOLVENT,

Lect. dr. Anda-Georgiana OLTEANU Dan FRĂŢILOIU

Bucureşti

2017
Cuprins

Introducere 3

Capitolul 1. Preliminarii 5
1. Inelul claselor de resturi modulo n 5
2. Rezolvarea sistemelor de ecuaţii liniare. Eliminare Gauss 9
3. Spaţii Vectoriale 13
Capitolul 2. Coduri numerice 17
1. Exemple de Coduri Numerice 17
2. Detecţia erorilor 19
Capitolul 3. Coduri liniare 21
1. Noţiuni de bază 21
2. Coduri liniare 24
3. Decodare Coset. Codul Golay 27
Capitolul 4. Coduri Hamming 31
Capitolul 5. Aplicaţii 35
1. USPS Postal Code 36
2. The Universal Product Code 37
3. ISBN-10 38
4. Codul Golay 39
5. Codul Hamming 45
Concluzie 49

Bibliografie 51

1
Introducere

Zilnic, ne ı̂ntâlnim, direct sau indirect, cu o mulţime de coduri numerice sau


coduri liniare. Le găsim pe produsele din magazine, pe spatele coperţilor cărţilor
sau ı̂n multe alte locuri şi ajută atât la clasificarea multor obiecte sau la codarea
şi decodarea biţilor. Această lucrare vizează validitatea codurilor, ı̂n particular,
codurile Golay şi Hamming şi dacă citirea lor este una validă sau nu. De asemenea
şi metode mai eficiente de a detecta şi corecta erori. Vom putea observa cum
metodele simple de verificare a unor coduri au limitări ı̂n privinţa detectării şi
corectării de erori, bazându-se pe o singură cifră de verificare a codului, ı̂n timp
ce metodele mai avansate, cele de la codurile Golay şi Hamming, pot detecta mai
multe erori ı̂ntr-un cod sau dacă nu mai multe, atunci pot detecta cu precizie poziţia
exactă a cifrei din cod transmisă greşit.
În primul capitol prezint conceptul de inel al claselor de resturi modulo n, unde
n ∈ Z+ , ţinând cont că Z+ reprezintă mulţimea tuturor numerelor ı̂ntregi mai mari
sau egale cu 0 şi definim termenii de congruenţă modulo n pentru un număr n ∈ Z+ ,
relaţie de echivalenţă sau o teoremă familiară:
Teoremă. (Teorema de ı̂mpărţire cu rest) Fie a şi n ∈ Z cu n > 0. Există
q, r ∈ Z astfel ı̂ncât a = qn + r şi 0 ≤ r < n.
Mai departe, ne amintim noţiunile de bază despre matrici cum ar fi rangul,
defectul, elimiarea Gauss şi operaţiile elementare pe liniile unei matrici, cum ar fi :
• Înmulţirea unei linii cu un scalar nenul,
• Schimbarea a două linii ı̂ntre ele,
• Înlocuirea unei linii cu suma dintre ea şi multiplul unei alte linii,
pentru a putea rezolva sisteme liniare ca acesta

4x + y − 3z = 2
,
x − 4y + z = 1

căruia ı̂i este ataşată următoarea ecuaţie matriceală


 
  x  
4 1 −3  2
y = .
1 −5 1 1
z
3
În cel de-al doilea capitol, dăm câteva exemple de coduri numerice, codul USPS,
folosit de sistemul poştal al Statelor Unite, codul UPC, cel mai des ı̂ntâlnit cod,
codul de bare de pe produse şi ISBN-10, codul folosit la identificarea cărţilor. Vom
observa că fiecare cod dintre cele discutate va avea ı̂n structura sa o cifra de verifi-
care, menită să eşueze evaluarea codului ı̂n cazul apariţiei erorilor. Un prim exem-
plu de eroare ı̂l poate reprezenta chiar praful, care poate ı̂mpiedica citirea corectă a
unui cod. Cea de-a doua parte a capitolului se va ocupa, strict, de detecţia erorilor
din citirea codurilor.
În cel de-al treilea capitol trecem complet la sistemul binar şi definim noţiunile
de bază ale codurilor liniare, distanţa unui cod si proprietăţile acesteia, definim:
Definiţie. Un cod liniar de lungime n este o submulţime nevidă din Zn2 care este
ı̂nchisă faţă de adunarea ı̂n Zn2 .
În ultima parte a capitolului, vorbim despre decodarea cu cosete unde găsim
metode mult mai eficiente de decodare a unui cod decât căutarea pas cu pas a
fiecărui cuvănt cod pentru a verifica dacă este valid, desigur, acestă verificare fiind
un proces ı̂ncet. Iar ı̂n ı̂ncheierea capitolului, vom analiza codul Golay, un cod
folosit de către NASA pentru a transmite imagini cu planetele Jupiter şi Saturn,
fotografiate de către naveta Voyager ı̂n anii ’70 şi ’80. Codul are un algoritm destul
de uşor de urmărit. Aşadar pentru un cuvânt cod transmis v, ı̂l vom primi greşit
ca w. Cunoaştem matricile H ∈ M12,24 şi B ∈ M12,12 , iar ei reprezintă linia i din
I12 şi bi este linia i a matricei B. Algoritmul va arăta ı̂n felul următor:
(1) Calculăm st = Hwt . Dacă st = 0, atunci w este un cuvânt cod.
(2) Dacă 1 ≤ ρ(s) ≤ 3, atunci v = w + (s, 0).
(3) Dacă există i astfel ı̂ncât ρ(s) > 3 şi ρ(s+bi ) ≤ 2, atunci v = w+(s+bi , ei ).
(4) Dacă nu am determinat v ı̂ncă, calculăm sB, care este egal cu (Bst )t prin
simetria lui B.
(5) Dacă 1 ≤ ρ(sB) ≤ 3, atunci v = w + (0, sB).
(6) Dacă există i astfel ı̂ncât ρ(sB) > 3 şi ρ(sB + bi ) ≤ 2, atunci v = w +
(ei , sB + bi ).
(7) Dacă nu am găsit v până acum, atunci w nu poate fi decodat.
Următorul capitol defineşte codul Hamming, iar toate noţiunile necesare pentru a-l
putea ı̂ntelege au fost deja fixate ı̂n capitolele anterioare. Algoritmul de decodare
a unui cod Hamming de lungime 7, este unul elegant şi mult mai scurt decât cel al
codului Golay, aşadat un scurt rezumat al algoritmului fiind:
• Fie un cuvânt w dat, se calculeaza Hwt
• Dacă produsul este 0, atunci w este un cuvânt cod.
• Dacă produsul nu este 0, atunci este egal cu coloana i a lui H pentru
un ı̂ntreg unic i. Atunci w + ei este un cuvânt cod valid, şi este cel mai
apropiat cuvânt cod de w.
În ultimul capitol, am realizat o aplicaţie multifuncţională ı̂n care am adăugat
algoritmii decodărilor pentru cele trei exemple de coduri numerice, adică: codul
USPS, UPC şi ISBN-10; şi pentru codurile Golay şi Hamming, folosind ca limbaj
de programare C++.

4
CAPITOLUL 1

Preliminarii

1. Inelul claselor de resturi modulo n


În matematica modernă, conceptul de inel al claselor de resturi modulo n a fost
dezvoltat de către Carl Friedrich Gauss, ı̂n cartea sa, Disquisitiones Arithmeticae,
publicată ı̂n 1801. Un prim exemplu despre ce este algebra modulară, o reprezintă
ceasul de 12 ore. Chiar dacă o zi are 24 de ore, pe ceas sunt reprezentate numerele
de la 1 la 12, o dată ajuns la ora 12, ceasul revine, ciclic, la ora 1. Dacă este ora 10,
spre exemplu, peste 3 ore, teoretic va fi ora 13, dar ceasul va indica ora 1, deoarece
la fiecare 12 ore, revine de la ı̂nceput.
Definiţia 1.1. Fie a şi n două numere ı̂ntregi. Spunem că n ı̂l divide pe a (sau a
este divizibil cu n) dacă exista b ∈ Z astfel ı̂ncât a = b · n.
Vom nota cu Z+ , mulţimea tuturor numerelor ı̂ntregi mai mari strict cu 0.
Definiţia 1.2. Fie n ∈ Z+ , spunem că două numere ı̂ntregi a şi b sunt congruente
modulo n dacă b − a este divizibil cu n. Asta se va nota cu: a ≡ b mod n.
Propoziţia 1.3. Relaţia de congruenţă modulo n este o relaţie de echivalenţă pen-
tru oricare n ∈ Z+ .
Pentru o notaţie mai uşoară vom nota clasa de echivalenţă modulo n a unui
număr ı̂ntreg a cu ā, aşadar:

ā = {b ∈ Z : b ≡ a mod n}

Demonstratie. Fie n ∈ Z+ . Trebuie să arătăm că congruenţa modulo n este


reflexivă, simetrică şi tranzitivă.
Pentru reflexivitate, fie a ∈ Z. Atunci a ≡ a mod n deoarece a − a = 0 se
divide cu n având ı̂n vedere că 0 = n · 0.
Apoi, pentru simetrie, presupunem că a, b ∈ Z şi a ≡ b mod n cum b − a este
divizibil cu n, există q ∈ Z astfel ı̂ncât b − a = qn, iar a − b = (−q)n, deci şi a − b
este divizibil cu n. Aşadar, b ≡ a mod n, deci relaţia este simetrică.
În final, pentru a demonstra tranzitivitatea, fie că a, b, c ∈ Z, astfel ı̂ncât a ≡ b
mod n şi b ≡ c mod n. Atunci, prin definiţie, b − a şi c − b sunt ambele divizibile
5
cu n deci există s, t ∈ Z astfel ı̂ncât
b−a = sn
c−b = tn.
Adunând aceste ecuaţii, obţinem c − a = (s + t)n, deci c − a este divizibil cu n, prin
urmare a ≡ c mod n. Demonstrând tranzitivitatea. 

Teorema 1.4. (Teorema de ı̂mpărţire cu rest) Fie a şi n ∈ Z cu n > 0. Există


q, r ∈ Z astfel ı̂ncât a = qn + r şi 0 ≤ r < n.

Demonstratie. Vom folosi proprietatea de bună-ordonare a numerelor ı̂ntregi


care spune că ı̂n orice mulţime nevidă de numere ı̂ntregi pozitive există un cel
mai mic element. Pentru a folosi această proprietate, vom defini

S = {s ∈ Z : s ≤ 0 şi există q ∈ Z astfel ı̂ncât s = a − qn}


În primul rând vom arăta că S este nevidă. Dacă a ≥ 0, atunci a−0·n = a ∈ S.
Dacă a < 0, atunci a − an = a(1 − n) ≥ 0 deoarece n este strict pozitiv. Aşadar,
a − an ∈ S. În orice caz, se observă că S este nevidă. Deci conform proprietăţii
de bună ordonare, S conţine un cel mai mic element căruia ı̂i vom spune r. Din
definiţia lui S, există q ∈ Z astfel ı̂ncât r = a − qn. Atunci am arătat că a = qn + r.
Pentru a arăta că 0 ≤ r < n, observăm că r ≥ 0 pentru că r ∈ S. Dacă r ≥ n,
atunci r − n = a − (q + 1)n ∈ S pentru că r − n ≥ 0. Asta ar fi o contradicţie
pentru că r − n este mai mic decât r şi r era cel mai mic element din S. Aşadar,
r < n cum ne doream.
Deci, deocamdată, avem doi ı̂ntregi q, r şi ştim că a = qn + r şi 0 ≤ r < n.
În continuare, demonstrăm unicitatea lui q şi r. Presupunem că exista q 0 , r0 ∈ Z
unde a = q 0 n + r0 şi 0 ≤ r0 < n. Vom avea q 0 n + r0 = qn + r deci (q 0 − q)n = r − r0 ,
aşadar |q 0 − q|n = |r − r0 |.
Prin urmare r şi r0 sunt amândouă ı̂ntre 0 şi n − 1, diferenţa dintre cele două
este mai mică decât n. Şi pentru că |q 0 − q| · n este un multiplu de n, singura
posibilitate ca ecuaţia de mai sus să fie adevărată este ca ambele părţi ale egalităţii
să fie egale cu 0. Deci r0 = r şi q 0 = q, cu asta arătând unicitatea lui q şi r. 

Lema 1.5. Fie n ∈ Z+ şi a, b ∈ Z. Atunci a ≡ b mod n dacă şi numai dacă a şi
b au acelaşi rest la ı̂mpărţirea la n. Cu alte cuvinte, a ≡ b mod n dacă şi numai
dacă există q, q 0 ∈ Z astfel ı̂ncât a = qn + r şi b = q 0 n + r, cu 0 ≤ r < n.

Demonstratie. Fie n ∈ Z+ şi a, b ∈ Z. Atunci a ≡ b mod n implică b − a e


divizibil cu n ceea ce ı̂nseamnă că există t ∈ Z astfel ı̂ncât b − a = tn. Deci conform
teoremei de ı̂mpărţire cu rest putem scrie că a = qn + r şi b = q 0 n + s unde q, q 0 ∈ Z
şi r, s ∈ Z, iar 0 ≤ r, s < n. Putem presupune că r ≤ s. Atunci
tn = b − a = q 0 n + s − (qn + r)
= (q 0 − q)n + (s − r).
Se observă că 0 ≤ s − r < n, deci afirmaţia unicităţii teoremei de ı̂mpărţire
cu rest aplicată ı̂mpărţirii lui b − a cu n, arată că t = q 0 − q şi 0 = s − r, Aşadar
s = r. Aceeaşi concluzie este obţinută, desigur, şi dacă presupunem că s ≤ r. Asta
ne arată că a şi b au acelaşi rest la ı̂mpărţirea la n.
6
Invers, presupunem că a = qn + r şi b = q 0 n + r, iar q, q 0 ∈ Z şi r ∈ Z+ , r < n.
Atunci
b − a = q 0 n + r − (qn + r) = (q 0 − q)n,
deci b − a se divide prin n. Aşadar, a ≡ b mod n. 

Corolar 1.6. Fie n ∈ Z+ . Atunci orice număr ı̂ntreg este congruent modulo n cu
exact un ı̂ntreg din mulţimea {0, . . . , n − 1}.

Demonstratie. Fie n ∈ Z+ . Dacă a ∈ Z, atunci din teorema de ı̂mpărţire cu


rest va rezulta că există q şi r cu a = qn + r şi 0 ≤ r < n. Aşadar, a − r = qn
este divizibil cu n, deci a ≡ r mod n. Dacă s ∈ {0, . . . , n − 1} şi a ≡ s mod n,
atunci Lema 1.5 ne arată că a şi s au acelaşi rest la ı̂mpărţirea la n. Dar, deoarece
s = 0 · n + s şi a = qn + r, Lema 1.5 ne spune că s = r. Deci, există un unic s,
0 ≤ s ≤ n − 1 astfel ı̂ncât a ≡ s mod n. 

Definiţia 1.7. Fie n ∈ Z+ şi a ∈ Z, arbitrar. Unicul număr ı̂ntreg din {0, . . . , n−1}
cu care a este congruent modulo n se numeşte cel mai mic rest a lui a modulo n
Corolar 1.8. Clasele de echivalenţă a ı̂ntregilor modulo n sunt ı̂n corespondenţă
bijectivă cu resturile după ı̂mpărţirea la n.
Aceste resturi sunt mai precis ı̂ntregii din mulţimea Zn , unde Zn = {0, 1, . . . , n−
1}, de unde şi corolarul.
Acum vom discuta despre o generalizare a ceasului aritmetic. Ne amintim că,
să determinăm, spre exemplu, timpul peste 8 ore când ceasul indică ora 10, vom
aduna 8 + 10 obţinând 18 şi scădem 12 ca să obţinem că ora va fi 6. Cu alte
cuvinte, adunăm numerele şi scădem 12 ori de câte ori este nevoie până se obţine o
oră validă. Aceasta este şi ideea din spatele adunării in Zn . Similar, putem defini
şi ı̂nmultirea.
Definiţia 1.9. Fie n ∈ Z+ , iar a şi b elemente ale lui Zn . Atunci a + b = a + b, iar
a · b = ab.
Ceea ce spune definiţia este că pentru a aduna două elemente din Zn , le
reprezentăm ca fiind clasa de echivalenţă a unor ı̂ntregi, după care adunăm ı̂ntregii
şi luăm clasa de echivalenţă a sumei. Similar şi dacă ı̂nmulţim două elemente din
Zn . Vom lua două exemple din Z12 :

8 + 10 = 18 = 6

şi
8 · 10 = 80 = 8.
Aplicând aceste definiţii, obţinem tabelele de adunare şi de ı̂nmulţire pentru
Z2 :

+ mod 2 0 1 · mod 2 0 1
0 0 1 0 0 1
1 1 0 1 0 1
Tabelele de adunare şi ı̂nmulţire pentru Z4 , sunt:
7
+ mod 4 0 1 2 3 · mod 4 0 1 2 3
0 0 1 2 3 0 0 0 0 0
1 1 2 3 0 1 0 1 2 3
2 2 3 0 1 2 0 2 0 2
3 3 0 1 2 3 0 3 2 1
Lema 1.10. Fie n ∈ Z+ . Dacă a, b, c, d ∈ Z cu a ≡ c mod n şi b ≡ d mod n,
atunci a + b ≡ c + d mod n şi ab ≡ cd mod n.
Demonstratie. Fie n ∈ Z+ şi presupunem că a ≡ c mod n şi b ≡ d mod n.
Atunci c − a şi d − b sunt divizibile cu n, deci exista s, t ∈ Z astfel ı̂ncât a − c = sn
şi b − d = tn. Aşadar a = c + sn şi b = d + tn. Dacă adunăm ecuaţiile, obţinem
a + b = (c + sn) + (d + tn) = (c + d) + (s + t)n,
ceea ce arată că (a + b) − (c + d) este un multiplu de n, adică, a + b ≡ c + d mod n.
Analog, dacă ı̂nmulţim ecuaţiile, obţinem
ab = (c + sn) · (d + tn) = cd + ctn + dsn + sntn
= cd + (ct + sd + snt)n
deci ab − cd este un multiplu de n, deci ab ≡ cd mod n. Asta demonstrează
lema. 
În cele mai multe aplicaţii, metoda aleasă pentru a calcula cel mai mare divizor
comun dintre două numere ı̂ntregi este algoritmul lui Euclid. În principiu, prin
factori comuni se poate calcula cel mai mare divizor comun, dar dacă numerele
sunt prea mari, nu mai este eficient din punct de vedere de timp. Algoritmul lui
Euclid are avantajul de calcul uşor; Maple şi alte programe folosesc acest algoritm
pentru calcularea celui mai mare divizor comun.
Algoritmul lui Euclid pentru calcularea celui mai mare divizor comun a două
numere a, b ∈ Z+ constă ı̂n următorii paşi:
(1) a0 = max(a, b);a1 = min(a, b), iar i = 1.
(2) Dacă ai = 0, atunci ai−1 = cmmdc(a, b).
ai−1
(3) Dacă ai 6= 0, se ı̂mparte ai−1 la ai , şi se obţine ai−1 = qai + r.
ai
(4) Se ı̂nlocuieşte i cu i + 1.
(5) ai primeşte valoarea ai = r.
(6) Se ı̂ntoarce la pasul 2.
Exemplul 1.11. Algoritmul funcţionează ı̂n felul următor. Vom afla cmmdc(75432, 19787634)
19787634 = 262 · 75432 + 24450
75432 = 3 · 24450 + 2082
24450 = 11 · 2082 + 1548
2082 = 1 · 1548 + 534
1548 = 2 · 534 + 480
534 = 1 · 480 + 54
480 = 8 · 54 + 54
54 = 1 · 48 + 6
48 = 8·6+0
8
Deci, ultimul rest diferit de 0 este 6, aşadar cel mai mare divizor comun dintre
19787634 şi 75432 este 6.
Lema 1.12. Fie a, b ∈ Z, nu amândouă 0, şi există q, r ∈ Z astfel ı̂ncât b = qa + r.
Atunci cmmdc(a, b) = cmmdc(a, r).
Demonstratie. Fie d = cmmdc(a, b) şi c = cmmdc(a, r). Din b = qa+r observăm
că c divide b deci c ≤ d. Dar r = b − qa deci d divide r şi d ≤ c totodată, deci
d = c. 

2. Rezolvarea sistemelor de ecuaţii liniare. Eliminare Gauss


În această secţiune reamintim câteva noţiuni de bază despre matrici, ı̂n partic-
ular eliminarea Gauss, rangul şi defectul. Grija noastră imediată este cu matricile,
ale căror elemente sunt din Z2 pentru a putea discuta codurile Hamming şi Golay.
Un sistem liniar de ecuaţii este echivalent cu o singură ecuaţie matriceală, AX = b,
unde A este matricea coeficienţilor, X este matricea necunoscutelor, iar b coloana
termenilor liberi. Spre exemplu, sistemul liniar

4x + y − 3z = 2
x − 4y + z = 1
este echivalent cu ecuaţia matriceală
 
  x  
4 1 −3  y = 2
.
1 −5 1 1
z
Metoda principală pentru rezolvarea unui sistem ca acesta este prin eliminare
Gauss pentru matricea extinsă, obtinută din matricea coeficientilor. Ne amintim
că eliminarea Gauss ne cere operaţii pe liniile unei matrici, iar cele trei operaţii
elementare sunt:
• Înmulţirea unei linii cu un scalar nenul,
• Schimbarea a două linii ı̂ntre ele,
• Înlocuirea unei linii cu suma dintre ea şi multiplul unei alte linii.
În aritmetica din Z2 , singurele ı̂nmulţiri valabile sunt cu 0 şi 1, iar 1 + 1 = 0 (deci
1 = −1, aşadar scăderea este aceeaşi operaţie ca adunarea). În acest context, prima
operaţie cu linii de mai sus este nefolositoare, deoarece ı̂nmulţind o linie cu 1 nu
schimbă nimic, iar a treia operaţie se reduce la adunarea ı̂ntre linii.
Definiţia 1.13. O matrice A este eşalonată superior dacă următoarele trei condiţii
sunt satisfăcute:
(1) Prima valoare nenulă de pe fiecare linie este 1. Această poziţie se va numi
1 conducător.
(2) Dacă o coloană conţine un 1 conducător, atunci toate celelalte valori din
coloană sunt 0.
(3) Dacă i > j şi dacă linia i şi linia j conţin un 1 conducător, atunci coloana
care conţine pe 1 conducător al liniei i este mai la dreapta decât coloana
care conţine pe 1 conducător al liniei j.
Pentru a ı̂ntelege condiţia (3) a definiţiei, conducătorii 1 se duc la dreapta cum
mergi dinspre partea de sus spre partea de jos a matricii, deci matricea este ı̂ntr-un
fel ”superior triunghiulară”.
9
Exemplul 1.14. Următoarele matrici din Z2 sunt eşalonate superior
 
  1 0 0
  1 0 1 0
1 1  0 1 1 0   0 1 0 .
 
0 0  0 0 1 
0 0 0 1
0 0 0
Acum vom da câteva exemple de matrici eşalonate superior cu elemente din
Z2 . În fiecare exemplu odată ce avem matricea eşalonată superior, 1 conducători
sunt ı̂ngroşaţi.
Exemplul 1.15. Considerăm matricea
 
1 0 0 1
A =  1 1 0 1 .
0 1 1 1
Reducem matricea folosind paşii următori:
     
1 0 0 1 1 0 0 1 1 0 0 1
L2−L1 L3−L2
 1 1 0 1  ⇒  0 1 0 0  ⇒  0 1 0 0 
0 1 1 1 0 1 1 1 0 0 1 1
Rangul lui A este egal cu 3.
Exemplul 1.16. Considerăm matricea
 
1 1 0 0 1 0
 1 0 1 0 0 1 
A= 0 1
.
1 1 1 0 
0 0 0 1 0 1
Reducem matricea folosind paşii următori:
     
1 1 0 0 1 0 1 1 0 0 1 0 1 0 0 0 0 1
 1 0 1 0 0 1  L2+L1  0 1 1 0 1 1  0 1 1 0 1 1 
 L1+L2


 0 1
 ⇒  ⇒  
1 1 1 0   0 1 1 1 1 0   0 1 1 1 1 0 
0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1
   
1 0 0 0 0 1 1 0 0 0 0 1
L3+L2   0 1 1 0 1 1 
 L4+L3 0 1 1 0 1 1 

⇒  0 0 ⇒  
0 1 0 1   0 0 0 1 0 1 
0 0 0 1 0 1 0 0 0 0 0 0
Rangul lui A este egal cu 3.
Acum vom ilustra cum matricea eşalonată superior oferă soluţia sistemelor de
ecuaţii:
Exemplul 1.17. Sistemul de ecuaţii

 x = 1
x+y = 1
y+z = 1

are matricea extinsă  


1 0 0 1
 1 1 0 1 .
0 1 1 1
10
Reducerea acestei matrici  
1 0 0 1
 0 1 0 0 
0 0 1 1
corespunde sistemului de ecuaţii

 x = 1
y = 0
z = 1

şi aşadar se rezolvă sistemul iniţial.


Exemplul 1.18. Matricea eşalonată superior
 
1 1 0 0 1 0
 1 0 1 0 0 1 
 
 0 1 1 1 1 0 
0 1 1 0 1 1
corespunde sistemului de ecuaţii


 x1 + x2 + x5 = 0
x1 + x3 = 1


 x 2 + x 3 + x4 + x5 = 0
x2 + x3 + x5 = 1.

Reducând matricea obţinem:


 
1 0 1 0 0 1
 0 1 1 0 1 1 
 
 0 0 0 1 0 1 
0 0 0 0 0 0
care corespunde sistemului de ecuaţii

 x1 + x3 = 1
x2 + x3 + x5 = 1
x4 = 1

unde x3 şi x5 sunt arbitrari. Putem scrie cele patru soluţii ale acestui sistem de
ecuaţii, deoarece x3 şi x5 pot avea valorile 0 sau 1:
(x1 , x2 , x3 , x4 , x5 ) = (1 + x3 , 1 + x3 + x5 , x3 , 1, x5 ),
unde x3 ∈ {0, 1} şi x5 ∈ {0, 1}.
Soluţia generală este
(1 + x3 , 1 + x3 + x5 , x3 , 1, x5 ) = (1, 1, 0, 1, 0) + x3 (1, 1, 1, 0, 0) + x5 (0, 1, 0, 0, 1),
astfel ı̂ncât (1, 1, 0, 1, 0), care corespunde valorilor x3 = x5 = 0, să fie o soluţie
particulară a sistemului liniar. Pe de altă parte, vectorii (1, 1, 1, 0, 0), (0, 1, 0, 0, 1)
rezolvă sistemul omogen


 x1 + x2 + x5 = 0
x1 + x3 = 0


 x 2 + x 3 + x4 + x5 = 0
x2 + x3 + x5 = 0.

11
Pe final, ne amintim o teoremă care ne va ajuta să determinăm date numerice
despre codurile de corectare a erorilor. Înainte de a ı̂ncepe teorema, explorăm
contextul in care va fi aplicată şi ne amintim câţiva termeni. Nucleul, sau spaţiul-
nul, al unei matrici A este mulţimea tuturor soluţiilor ecuaţiei omogene AX = 0.
Exemplul 1.19. Daca avem matricea
 
1 0 1 0 1 0 1 0
H =  0 1 1 0 0 1 1 0 ,
0 0 0 1 1 1 1 0
soluţia ecuaţiei omogene, HX = 0, poate fi descrisă sistematic prin determinarea
unei baze pentru nucleul lui H. Deoarece din fiecare alegere distinctă a variabilelor,
x3 , x5 , x6 şi x7 ı̂n Z2 rezultă o soluţie unică pentru HX = 0, obţinem patru soluţii
prin a-i da, succesiv, unei variabile aleatoare, valoarea 1 si celorlalte 0, apoi folosind
x1 = x3 + x5 + x7
x2 = x3 + x6 + x7
x4 = x5 + x6 + x7
pentru a determina valorile variabilelor rămase. Obţinem următorii vectori
       
1 1 0 1
 1   0   1   1 
       
 1   0   0   0 
       
 0 , 1 , 1 , 1 ,
       
 0   1   0   0 
       
 0   0   1   0 
0 0 0 1

care formează baza pentru nucleul lui H. Într-adevăr, soluţia generală a ecuaţiei
HX = 0 este dată de
           
x1 x3 + x5 + x7 1 1 0 1
 x2   x3 + x6 + x7   1   0   1   1 
           
 x3   x 3
  1   0   0   0 
           
 x4  =  x5 + x6 + x7  = x3  0  + x5  1  + x6  1  + x7  1 .
           
 x5   x5   0   1   0   0 
           
 x6   x6   0   0   1   0 
x7 x7 0 0 0 1
Acest exemplu indică faptul general că pentru un sistem omogen AX = 0,
numărul de variabile care nu corespund cu 1 conducători este egal cu dimensiunea
nucleului lui A. Numim aceste variabile, variabile libere, iar celelalte variabile ( care
sunt exact atâtea cât rangul lui A ) ca variabile de bază. Din matricea eşalonată
superior a lui A, variabilele de bază pot fi exprimate ı̂n termeni de variabile libere.
Prin imitarea exemplului de mai sus, se obţine o mulţime distinctă de soluţii pentru
AX = 0, prin a ı̂i da succesiv unei variabile libere valoarea 1 şi celorlalte 0. Apoi
orice soluţie poate fi scrisă, unic, ca o combinaţie liniară a acestor soluţii. În
particular, această mulţime distinctă de soluţii este o bază pentru nucleul lui A,
aşadar numărul variabilelor libere este egal cu dimensiunea nucleului. Deoarece
fiecare variabilă este numărul de coloane al matricii, obţinem importanta teoremă
de rang-defect. Defectul matricii A este dimensiunea nucleului lui A.
12
Teorema 1.20. Fie A o matrice cu m linii şi n coloane. Atunci n este egal cu
suma dintre rangul lui A şi defectul lui A.
Ideea acestei teoreme, este că, ı̂n momentul ı̂n care cunoşti rangul lui A, atunci
poţi calcula imediat şi defectul lui A. Deoarece lucrăm ı̂n Z2 , numărul soluţiilor
pentru AX = 0 este 2defect(A) . În teoria codării acesta ne permite să determinăm
numărul de cuvinte cod dintr-un cod.

3. Spaţii Vectoriale
Într-un spaţiu vectorial V peste corpul comutativ F avem două operaţii, adunarea
cu vectori şi ı̂nmulţirea cu scalari. Operaţia de adunare este o operaţie binară pe V .
Înmulţirea cu scalari este mai diferită, deoarece ı̂n stânga egalului avem un element
scalar din corpul comutativ F şi un vector din V , iar ı̂n dreapta egalului, un vector,
deci ı̂nmulţirea cu scalari este de fapt o funcţie definită pe F × V cu valori ı̂n V .
Pentru a păstra convenţia, scriem această funcţie ca α · v sau mai simplu αv.
Definiţia 1.21. Fie F un corp comutativ. Un F -spaţiu vectorial este o mulţime
nevidă V ı̂mpreună cu operaţia + : V × V → V şi o operaţie · : F × V → V , cu
următoarele proprietăţi:
1. (V, +) grup comutativ,
2. α(u + v) = αu + αv, pentru oricare α ∈ F şi oricare u, v ∈ V ,
3. (α + β)u = αu + βu, pentru oricare α, β ∈ F şi oricare u ∈ V ,
4. (αβ)u = α(βu), pentru oricare αβ ∈ F şi oricare u ∈ V ,
5. 1 · u = u, pentru oricare u ∈ V .
Exemplul 1.22. Pentru un exemplu fundamental, folosim un F -spaţiu vectorial
ı̂n spaţiul F n al n-uplelor de elemente din F . Aşadar,
F n = {(a1 , . . . , an ) : ai ∈ F }.
Operaţiile care-l transformă pe F n ı̂ntr-un spaţiu vectorial sunt operaţiile pe com-
ponente provenite din adunarea şi ı̂nmulţirea ı̂n corpul comutativ F :
(a1 , . . . , an ) + (b1 , . . . , bn ) = (a1 + b1 , . . . , an + bn )
α(a1 , . . . , an ) = (αa1 , . . . , αan ).
Lema 1.23. Fie F un corp comutativ şi V un spaţiu vectorial peste F . Dacă
v ∈ V , atunci 0 · v = 0.
Demonstratie. Fie v ∈ V . Pentru a arăta că 0 · v = 0, trebuie să arătăm că 0 · v
satisface definiţia adunării. Prin utilizarea unei legi de distribuţie, observăm
0·v+v = 0 · v + 1 · v = (0 + 1) · v
= 1 · v = v = 0 + v.
Prin urmare obţinem 0 · v = 0. 
Lema 1.24. Fie F un corp comutativ şi fie V un spaţiu vectorial peste F . Dacă
v ∈ V , atunci (−1) · v = −v.
Demonstratie. Fie v ∈ V . Pentru a demonstra că (−1) · v = −v, trebuie să
arătăm că este inversul adunării cu v. Avem
v + (−1) · v = 1 · v + (−1) · v = (1 + (−1)) · v
= 0·v =0
13
din lema precedentă. Aceste ecuaţii arată ı̂ntr-adevăr că (−1) · v este inversul lui v
ı̂n raport cu adunarea. 

Definiţia 1.25. Fie F un corp comutativ si fie V un spaţiu vectorial peste F . O


submulţime nevidă W a lui V se numeşte subspaţiu a lui V dacă operaţiile pe V
induc operaţii pe W şi dacă W este un spaţiu vectorial peste F ı̂mpreună cu aceste
operaţii.
Lema 1.26. Fie F un corp comutativ şi fie V un spaţiu vectorial peste F . Fie
W o submulţime nenulă din V . Atunci W subspaţiu a lui V , dacă şi numai dacă
ı̂ndeplineşte următoarea proprietate

α · (v + w) = α · v + α · w ∈ W,

unde α ∈ F şi v, w ∈ V .
La ı̂nceputul secţiunii actuale am definit spaţiile vectoriale peste un corp co-
mutativ şi am demonstrat câteva proprietăţi simple. În continuare discutăm cele
mai importante noţiuni asociate cu spaţiile vectoriale, cele care conduc la termenul
de bază.
Definiţia 1.27. Fie F un corp comutativ şi fie V un spaţiu vectorial peste F . Dacă
avem o mulţime finită de vectori {v1 , . . . , vn } din V şi o mulţime finită de scalari
n
P
{a1 , . . . , an } din F , atunci vectorul ai vi se numeşte o combinaţie liniară de vi
i=1
Definiţia 1.28. Fie F un corp comutativ şi fie V un spaţiu vectorial peste F . O
mulţime {v1 , . . . , vn } de elemente din V este liniar independentă dacă şi numai dacă
n
P
pentru orice mulţime de scalari {a1 , . . . , an } astfel ı̂ncât ai vi = 0 atunci fiecare
i=1
ai = 0.
Definiţia 1.29. Fie F un corp comutativ şi fie V un spaţiu vectorial peste F .
O mulţime {v1 , . . . , vn } de elemente din V este o mulţime de generatori pentru V
dacă fiecare element din V poate fi exprimat ca o combinaţie liniară de vectorii
{v1 , . . . , vn }.
Definiţia 1.30. Fie F un corp comutativ şi fie V un spaţiu vectorial peste F . O
submulţime {v1 , . . . , vn } de elemente din V este o bază pentru V dacă este liniar
independentă şi dacă este o mulţime de generatori pentru V .
Exemplul 1.31. Fie H o matrice, iar nucleul lui
 
0 0 0 1 1 1 1
H= 0 1 1 0 0 1 1 ,
1 0 1 0 1 0 1

adică mulţimea de soluţii a ecuaţiei cu matrici Hx = 0, este codul Hamming. Fie


C o mulţime de generatori. C este un subspaţiu din Z72 , pentru a verifica asta,
presupunem că avem v, w ∈ C şi α, β ∈ Z72 , atunci

H(αv + βw) = α(Hv) + β(Hw) = α · 0 + β · 0 = 0.

Aşadar, C este ı̂nchis faţă de adunarea şi ı̂nmulţirea cu scalari, deci este ı̂ntr-adevăr
un subspaţiu din Z72 . Am observat că o soluţie arbitrară (x1 , x2 , x3 , x4 , x5 , x6 , x7 )
14
pentru Hx = 0 satisface
x1 = x3 + x5 + x7 ,
x2 = x3 + x6 + x7 ,
x4 = x5 + x6 + x7 ,
iar x3 , x5 , x6 şi x7 sunt arbitrare. Obţinem patru soluţii dacă alegem o variabilă să
fie 1 şi restul 0. Făcând asta obţinem
c1 = (1, 1, 1, 0, 0, 0, 0)
c2 = (1, 0, 0, 1, 1, 0, 0)
c3 = (0, 1, 0, 1, 0, 1, 0)
c4 = (1, 1, 0, 1, 0, 0, 1).
Susţinem că {c1 , c2 , c3 , c4 } constituie o bază pentru C. Aceasta se observă prin
ecuaţia
           
x1 x3 + x5 + x7 1 1 0 1
 x2   x3 + x6 + x7   1   0   1   1 
           
 x3   x3   1   0   0   0 
           
 x4  =  x5 + x6 + x7  = x3 · 0 +x5 · 1 +x6 · 1 +x7 · 1 ,
           
 x5   x5   0   1   0   0 
           
 x6   x6   0   0   1   0 
x7 x7 0 0 0 1
ce denotă faptul că fiecare soluţie este o combinaţie liniară de {c1 , c2 , c3 , c4 }.
Şi descompunerea elementelor lui C demonstrează, de asemenea, liniar
independenţa mulţimii {c1 , c2 , c3 , c4 } deoarece, dacă o combinaţie liniară a acestor
vectori este egală cu vectorul zero, atunci coordonatele 3,5,6 şi 7 a rezultatului că
cei patru coeficienţi sunt toţi 0.
Asta demonstrează că {c1 , c2 , c3 , c4 } formează o bază pentru C.
Teorema 1.32. Fie F un corp comutativ şi V un spaţiu vectorial peste F . Atunci
V are o bază. În plus, numărul de elemente din orice două baze ale lui V sunt
egale.
Definiţia 1.33. Fie F un corp comutativ şi V un spaţiu vectorial peste F cu o
baza B. Atunci, dimensiunea lui V este cardinalul lui B.
În continuare, arătăm că dacă un spaţiu vectorial din Z2 are dimensiunea n,
atunci cardinalul său, adică numărul de elemente din spaţiul vectorial, este egal cu
2n .
Propoziţia 1.34. Presupunem că V este un spaţiu vectorial peste Z2 . Dacă
dim(V ) = n, atunci |V | = 2n .

Demonstratie. Presupunem că {v1 , . . . , vn } este o bază pentru V . Atunci fiecare


element din V este de forma a1 v1 + . . . + an vn cu scalarii ai ∈ Z2 . Deci, pentru a
produce elemente din V , alegem scalarii. Deoarece |Z2 | = 2, avem două posibilităţi
pentru fiecare ai . Liniar independenţa vectorilor v1 , . . . , vn arată că alegerile dis-
tincte ale celor n scalari a1 , . . . , an , produc vectori distincţi, deci, printr-un principiu
de numărare standard, avem 2 · 2 · . . . · 2 = 2n alegeri totale pentru ai şi prin urmare
|V | = 2n . 
15
Definiţia 1.35. Fie V şi W spaţii vectoriale peste F . O funcţie T : V → W se
numeşte o transformare liniară dacă şi numai dacă
1. T (v1 + v2 ) = T (v1 ) + T (v2 ) pentru oricare v1 , v2 ∈ V ,
2. T (av) = a · T (v) pentru oricare a ∈ F şi oricare v ∈ V .
Observaţia 1.36. Fie A, B ∈ Mn (R), două matrici. A şi B se numesc ma-
trici asemenea dacă şi numai dacă există o matrice X ∈ Mn (R), astfel ı̂ncât
B = X −1 AX.
Ştim că dacă două matrici sunt asemenea, atunci determinanţii şi urmele lor
sunt egale, de unde şi următoarea teoremă.
Teorema 1.37. Fie A, B ∈ Mn (R) două matrici asemenea. Atunci, T r(A) =
T r(B) şi pe lângă urmele lor, şi determinanţii lor sunt egali.

16
CAPITOLUL 2

Coduri numerice

Primul lucru despre care se va discuta va fi matematica codurilor numerice.


O mulţime de lucruri familiare sunt descrise de un cod numeric: coduri poştale,
produse din magazine şi cărţi, pentru a numi câteva dintre ele. O proprietate a
acestor coduri este prezenţa unei cifre extra, denumită cifră de verificare, care are
ca scop detectarea erorilor ı̂n citirea codului. Când un dispozitiv (sau o persoană)
citeşte informaţia, va exista ı̂ntotdeauna o posibilitate ca informaţia să fie citită
incorect. Spre exemplu, umiditatea sau praful pe un dispozitiv de scanare poate
previne citirea corecta a acestuia. Prezenţa cifrei de verificare ne ajută la detectarea
unor erori de scanare. Dacă o eroare este detectată, produsul se va rescana până
când codul corect este citit.

1. Exemple de Coduri Numerice


Există multe tipuri de coduri numerice ı̂n prezent, folosite zilnic. Vom dis-
cuta despre trei dintre aceste coduri numerice şi anume: codul poştal USPS(United
States Postal Service), UPC(Universal Product Code) folosit pentru produse si
ISBN(International Standart Book Number).

a) Codul USPS

USPS-ul foloseşte un cod de bare pentru a citi codurile de pe scrisori. Următorul


exemplu este pentru codul poştal al primăriei oraşului Boston.
Acest cod de bare reprezintă un număr de zece cifre. Sunt 52 de linii in codul
de bare, prima şi ultima reprezintă delimitări, iar restul de 50 cuprind zece grupuri
de câte cinci, iar fiecare grup de câte cinci reprezintă o cifră. Primele nouă cifre ale
17
codului poştal reprezintă adresa propriu-zisă, a zecea cifră fiind cifra de verificare.
Cifra aceasta este calculată ı̂n felul următor: se adună toate cifrele codului respectiv,
iar apoi cifra de verificare este cel mai mic n̂umăr ı̂ntreg diferit de 0 care adunat
la suma totală să dea un număr divizibil cu 10. Spre exemplu, codul poştal al
primăriei oraşului Boston este 02201-1020. Cele nouă cifre adunate fac ı̂n total 8,
aşadar, cifra de verificare va fi 2.
Această metodă ne permite să determinăm cifra de verificare pentru oricare
cod poştal de nouă cifre. Spre exemplu, dacă am ştii doar codul de nouă cifre
02201-1020, cifra de verificare x ar fi un număr ı̂ntre 0 si 9 astfel ca suma
0+2+2+0+1+1+0+2+0+x=8+x
să fie divizibilă cu 10. Deoarece suma este 8+x, singura variantă pentru x este 2.
Scopul cifrei de verificare este de a detecta erori ı̂n citirea codului. Spre exem-
plu, presupunem că am citit codul 022011020 ca 022311020, greşit, prin citirea cifrei
a patra ca fiind 3 ı̂n loc de 0. Suma cifrelor ar fi 0+2+2+3+1+1+0+2+0+2 = 13,
ceea ce nu este divizibil cu 10. Aşadar, scanerul ar detecta o eroare şi codul poştal
ar trebui să fie citit ı̂ncă o dată.

b) Codul UPC

0 13241 54321 2

The Universal Product Code, sau UPC, este codul de bare care apare efectiv
pe toate produsele pe care le cumpărăm zi de zi. Este un cod de 12 cifre, ce constă
ı̂n două blocuri de câte 5 urmate şi precedate de o singura cifră, cum putem observa
ı̂n imaginea de mai sus. Primele şase cifre, identifică ţara şi producătorul, ı̂n timp
ce următoarele cinci identifică produsul ı̂n sine, ultima cifra reprezentând cifra de
verificare.
Un UPC de 12 cifre (a1 , . . . , a12 ) este valid doar dacă suma
3a1 + a2 + 3a3 + a4 + · · · + 3a11 + a12
este divizibilă cu 10. Codul de bare de mai sus este 0 13241 54321 2. Aşadar, suma
codului este
3 · 0 + 1 + 3 · 3 + 2 + 3 · 4 + 1 + 3 · 5 + 4 + 3 · 3 + 2 + 3 · 1 + 2 = 60.
Suma este ı̂ntr-adevăr divizibilă cu 10, deci codul este recunoscut ca fiind un cod
de bare valid.
Ca şi la codul USPS, avem destule informaţii doar din primele 11 cifre, pentru
a determina, unic, cifra de verificare. Spre exemplu, fie codul UPC de mai sus, cu
cifra de verificare x, atunci
3 · 0 + 1 + 3 · 3 + 2 + 3 · 4 + 1 + 3 · 5 + 4 + 3 · 3 + 2 + 3 · 1 + x = 58 + x,
ceea ce face ca x = 2.

c) Codul ISBN
Înainte de anul 2009, cărţile erau identificate printr-un cod de zece cifre, pres-
curtat ISBN-10. Spre exemplu, cartea 1984, publicată de George Orwell, are ca
18
ISBN-10 numărul 0-451-52493-5. Prima cifră reprezintă limba ı̂n care este scrisă
cartea, următorul bloc de cifre identifică scriitorul, al doilea bloc de cifre reprezintă
cartea ı̂n sine, iar ultima cifră este cifra de verificare. În această schema, o cifră
poate fi 0, . . . , 9 sau X, care reprezintă numărul 10. Un cod (a1 , . . . , a10 ) este un
ISBN-10 valid, dacă suma
10a1 + 9a2 + · · · + 2a9 + a10
este divizibilă cu 11. Pentru codul de mai sus, avem
10 · 0 + 9 · 4 + 8 · 5 + 7 · 1 + 6 · 5 + 5 · 2 + 4 · 4 + 3 · 9 + 2 · 3 + 5 = 11 · 17 = 187
deci codul este ı̂ntr-adevăr valid.
Ca şi cu celelalte două exemple, cifra de verificare poate fi descoperită unic,
ţinând cont că este ı̂ntre 0 şi 10. Urmând exemplul de mai sus am avea suma
10 · 0 + 9 · 4 + 8 · 5 + 7 · 1 + 6 · 5 + 5 · 2 + 4 · 4 + 3 · 9 + 2 · 3 + x = 182 + x,
unde 182 + x trebuie să fie strict divizibil cu 11. Deoarece ştim că 11 · 16 = 176,
următorul număr divizibil cu 11 este 187, de unde aflăm că x = 5.

2. Detecţia erorilor
Cifra de verificare nu furnizează informaţii despre identificare; ea este redun-
dantă. Scopul acestei redundanţe ı̂ntr-un număr de identificare este de a detecta
erori ı̂n citirea numărului. Iniţial avem nevoie de o noţiune familiară a produsului
scalar de vectori din Rn ; dacă a = (a1 , . . . , an ) şi b = (b1 , . . . , bn ) sunt n-upluri de
numere reale, fie
Xn
a·b= ai bi = a1 b1 + · · · + an bn .
i=1

Testul pentru validitate ı̂n cele trei scheme este aşadar reprezentat ı̂n termeni de
produs. Un număr de zece cifre, sau mai precis, un 10-uplu a (a ∈ Z10 ) de cifre, este
un cod poştal valid, dacă a · (1, 1, 1, 1, 1, 1, 1, 1, 1, 1) este divizibil cu 10. Deaseme-
nea un UPC este un 12-uplu a de cifre cum ar fi a · (3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1)
dacă este divizibil cu 10. În final, un 10-uplu a este un ISBN-10 valid dacă
a · (10, 9, 8, 7, 6, 5, 4, 3, 2, 1) este divizibil cu 11. Să presupunem că avem un n-uplu
w(denumit şi pondere) ce conţine numere ı̂ntregi pozitive şi fie m ∈ Z+ . Putem
face o schemă cu număr de identificare după cum urmează. Considerăm n-upluri
a = (a1 , . . . , an ) unde 0 ≤ ai ≤ m − 1. Deci a este un număr de identificare valid
dacă a · w = 0 mod n. Ne vom referi la această schemă ca schema cu număr de
identificare cu ponderea w şi ı̂ntregul m. Motivul pentru restricţia pe ai este că ai
şi ai+m sunt egale modulo m. Aşadar, schema nu poate detecta diferenţa dintre
aceste două numere. Pentru a elimina această problemă, trebuie să limităm posi-
bilităţile lui ai astfel ı̂ncât două posibilităţi ale lui ai să poată fi distinse de schemă;
aşadar, oricare două posibilităţi trebuie să fie distincte modulo m.
Propoziţia 2.1. Fie w si m ca mai sus. Atunci, orice eroare din citirea poziţiei i
din a poate fi detectată dacă fiecare wi este relativ prim cu m.

Demonstratie. Fie a = (a1 , . . . , an ) un număr de identificare valid şi numai val-


oarea de pe poziţia i, adică ai , este schimbată ı̂n alt număr, să spunem că bi 6= ai ,
19
iar 0 ≤ bi ≤ m − 1. Dacă w = (w1 , . . . , wn ), atunci, pentru că a este un număr
valid, avem ı̂n Zm
Xn X n
0= ai wi = ai wi ,
i=1 i=1
unde ultima egalitate este obţinută din definiţia operaţiilor ı̂n Zm . Dacă
b = (a1 , . . . , ai−1 , bi , ai+1 , . . . , an )
este numărul obţinut prin ı̂nlocuirea poziţiei i a lui a cu bi , avem  = bi − ai 6= 0
deci bi = ai + . Ţinem cont că 0 ≤ ai , bi ≤ m − 1 aşadar 0 <  ≤ m − 1. Calculul
validării pentru b, devine
i−1
X n
X
b·w = aj wj + bi wi + aj wj
j=1 j=i+1
i−1
X n
X
= aj wj + (ai + )wi + aj wj
j=1 j=i+1
i−1
X n
X
= aj wj + ai wi + wi + aj wj
j=1 j=i+1
= a · w + wi .
Dar a este un număr de identificare valid, deci a · w = 0 şi aşadar b · w = wi .
Presupunem că eroarea este nedetectată, astfel ı̂ncât 0 = b · w = w1 . Dacă wi este
relativ prim cu m, atunci există x ∈ Zm , iar wi x = 1. Înmulţind ambele părţi ale
ecuaţiei 0 = wi cu x şi simplificând, obţinem 0 =  = bi − ai , sau bi = ai . Dar asta
forţează relaţia bi = ai , deoarece amândouă sunt ı̂ntre 0 şi m − 1. Contradicţie,
deci b · w nu poate fi nul şi de aici eroarea ai 7→ bi ı̂n citirea poziţiei i din a va fi
detectată de această schemă de identificare. 
Corolar 2.2. Dacă fiecare element al lui w este relativ prim cu m, atunci schema
numărului de identificare asociată lui w şi m poate detecta o singură eroare ı̂n orice
cifră.
În continuare, arătăm cum un cod ISBN-10, detectează transpoziţia a două
cifre din cadrul său.
Propoziţia 2.3. Presupunem că (a1 , a2 , . . . , an ) este un ISBN-10 valid. Dacă
a1 6= a2 , atunci (a2 , a1 , . . . , an ) nu este un ISBN-10 valid. Aşadar, schema ISBN-
10 detectează transpoziţia primelor două cifre.
Demonstratie. Fie a = (a1 , a2 , . . . , a10 ) un ISBN-10 valid. Dacă
w = (10, 9, 8, 7, 6, 5, 4, 3, 2, 1),
atunci a · w = 0 ∈ Z11 . Presupunem că a1 6= a2 şi construim b = (a2 , a1 , a3 , . . . , a10 ).
Atunci
a·w−b·w = 10a1 + 9a2 − 10a2 − 9a1
= a1 − a2 .
Întrucât a1 6= a2 şi 0 ≤ a1 , a2 ≤ 10, observăm că a1 6= a2 . În consecinţă,
ecuaţia de mai sus arată că a · w − b · w 6= 0, sau b · w 6= a · w = 0. Aşadar, b nu
este un ISBN-10 valid. 
20
CAPITOLUL 3

Coduri liniare

Schemele numerelor de identificare discutate ı̂n capitolul precedent ne oferă


posibilitatea de a detecta o eroare ı̂n ı̂nregistrarea sau transmiterea informaţiei.
Totuşi ele sunt limitate, detectând doar erori de cifre individuale sau cifre schimbate
ı̂ntre ele. Şi de asemenea, nu oferă nici o cale de a recupera informaţia pierdută.
Câteva idei mai sofisticare şi concepte matematice ne permit metode de codificare
şi transmitere a informaţiei ı̂n aşa fel ı̂ncât să putem identifica şi corecta erorile
ı̂n acelaşi timp. Exista multe aplicaţii ale acestor coduri de corectare a erorilor,
cum ar fi transmiterea de imagini digitale de la sonde planetare până la vizionarea
filmelor de pe CD-uri sau DVD-uri.

1. Noţiuni de bază
Pentru a discuta despre codurile de corectare a erorilor, trebuie mai ı̂ntâi să
fixăm contextul şi să definim nişte termeni. Vom lucra peste tot ı̂n sistemul binar,
adică ı̂n Z2 . Pentru simplificarea notaţiilor, notăm elementele lui Z2 ca 0 si 1 ı̂n loc
de 0 şi 1. Dacă n ∈ Z+ , atunci mulţimea Zn2 este mulţimea n-uplurilor cu elemente
din Z2 . Elementele din Zn2 se numesc cuvinte (de lungime n). Pentru convenienţă
vom scrie elementele din Zn2 cu notaţia uzuală sau ca o concatenare de cifre. Spre
exemplu, scriem (0, 1, 0, 1) şi 0101 pentru acelaşi 4-uplu. Îi putem adăuga lui Zn2
operaţia de adunare, element cu element şi aşa definim
(a1 , . . . , an ) + (b1 , . . . , bn ) = (a1 + b1 , . . . , an + bn )
O consecinţă a faptului că ı̂n Z2 avem 0 + 0 = 0 = 1 + 1, este că a + a = 0 pentru
oricare a ∈ Zn2 , unde 0 este vectorul (0, . . . , 0) ce conţine toate zerourile.
Definiţia 3.1. Un cod liniar de lungime n este o submulţime nevidă din Zn2 care
este ı̂nchisă faţă de adunarea ı̂n Zn2 .
Chiar dacă există coduri neliniare şi sunt studiate, codurile liniare sunt folosite
mai frecvent ı̂n aplicaţii. Pentru importanţa lor, vom considera numai codurile
liniare de acum ı̂ncolo. Ne vom referi la elementele unui cod ca fiind cuvinte cod.
Exemplul 3.2. Mulţimea {000, 001, 010, 100, 110, 101, 011, 111} = Z32 este un cod
de lungime 3 şi mulţimea {00000, 10101, 01010, 11111} este o submulţime a lui Z52
21
şi de asemenea un cod de lungime 5. Dacă mulţimea de mai sus ar fi schimbată ı̂n
{00000, 10101, 01110, 11111}, aceasta nu ar mai reprezenta şi un cod.
Fie w = a1 . . . an un cuvânt de lungime n. Atunci ponderea lui w este numărul
de cifre din w egale cu 1. Notăm ponderea lui w cu ρ(w). O cale echivalentă şi folos-
itoare pentru a ne gândi la ponderea cuvântului w = a1 . . . an este să considerăm
elementele ai ca ı̂ntregi 0 şi 1 şi să ţinem cont că
n
X
ρ(w) = ai
i=1

Există câteva consecinţe evidente ı̂n urma acestei definiţii. În primul rând, ρ(w) = 0
dacă şi numai dacă w = 0. În al doilea rând, ρ(w) ∈ Z+ . Un lucru important de
ştiut, despre pondere, este relaţia sa cu adunarea. Dacă v, w ∈ Zn2 , atunci
ρ(v + w) ≤ ρ(v) + ρ(w).
Asta este adevărat pentru că pe poziţia i, elementele din v şi w pot fi ambele egale
cu 1 sau 0. Mai precis, scriem xi pentru elementul cu poziţia i a unui cuvânt x.
Aşadar, ponderea lui x este dată de ecuaţia
ρ(x) = |{i : 1 ≤ i ≤ n, xi = 1}|.
Ţinem cont că (v + w)i = vi + wi , astfel ı̂ncât (v + w)i = 1 implică ori vi = 1 ori
wi = 1(dar nu amândouă). Deci,
|{i : 1 ≤ i ≤ n, (v + w)i = 1}| ⊆ |{i : vi = 1}| + |{i : wi = 1}|.
Deoarece |A ∪ B| ≤ |A| + |B| pentru oricare două mulţimi finite A şi B, din incluz-
iunea de mai sus şi descrierea ponderei rezultă că ρ(v + w) ≤ ρ(v) + ρ(w), cum ne
doream. Ideea de pondere ne oferă noţiunea de distanţă ı̂n Zn2 . Dacă v şi w sunt
cuvinte, atunci definim distanţa D(v, w) dintre v şi w ca
D(v, w) = ρ(v + w).
Exemplul 3.3. Fie v = 01101100 şi w = 10010110 două cuvinte din Z82 , atunci
distanţa dintre ele este dată de relaţia
D(v, w) = ρ(v + w)
= ρ(01101100 + 10010110)
= ρ(11111010)
= 1+1+1+1+1+0+1+0=6
Alternativ, D(v, w) este egal cu numărul de poziţii ı̂n care v şi w diferă. Funcţia
D are aceleaşi proprietăţi de bază a distanţei ı̂n spaţiul euclidian. Mai precis,
satisface proprietăţile următoarei leme.
Lema 3.4. Funcţia distanţă D, definită pe Zn2 × Zn2 cu valori ı̂n R satisface
următoarele proprietăţi:
(1) D(v, w) = 0 pentru oricare v ∈ Zn2 ;
(2) Fie v, w ∈ Zn2 ; dacă D(v, w) = 0, atunci v = w;
(3) D(v, w) = D(w, v) pentru oricare v, w ∈ Zn2 ;
(4) D(v, w) ≤ D(v, u) + D(u, w), pentru oricare u, v, w ∈ Zn2 .
Demonstratie. (1) Deoarece v + v = 0, avem
D(v, v) = ρ(v + v) = ρ(0) = 0.
22
(2) Ţinem cont că 0 este singurul cuvânt de pondere 0. Aşadar, dacă D(v, w) =
0, atunci ρ(v + w) = 0, ce ı̂nseamnă că v + w = 0. Dar, adunând w ı̂n
ambele părţi, obţinem că v = w.
(3) Egalitatea D(v, w) = D(w, v) este evidentă pentru că v + w = w + v.
(4) Fie u, v, w ∈ Zn2 , avem, din definiţie şi ponderea unei sume de mai sus,
D(v, w) = ρ(v, w) = ρ((v + u) + (u + w))
≤ ρ(v + u) + ρ(u + v)
= D(v, u) + D(u, w)

Pentru a discuta corectarea erorilor, trebuie mai ı̂ntâi să formalizăm noţiunea.
Fie C un cod: dacă w este un cuvânt, pentru a-l corecta sau decoda, ı̂nseamnă să
selectăm un cuvânt cod v ∈ C astfel ı̂ncât
D(v, w) = min{D(u, w) : u ∈ C}.
Cu alte cuvinte ı̂l decodăm pe w alegând cel mai apropiat cuvânt cod de w, sub
noţiunea noastră de distanţă. Totuşi, cel mai apropiat cuvânt cod nu trebuie sa
fie unic. Când se ı̂ntâmplă asta, fie putem alege aleator cel mai apropiat cuvânt
cod fie nu facem nimic. Ne referim la această noţiune de decodare ca fiind cea mai
probabilă detecţie sau MLD(Maximum Likelihood Detection), presupunerea fiind
că metoda de transmisie a informaţiei este sigură deci dacă o eroare este introdusă,
informaţia corectă este cel mai probabil să fie cuvântul cod care diferă de cuvântul
primit, ı̂n cele mai puţine poziţii.
Definiţia 3.5. Fie C un cod şi fie t ∈ Z+ . Atunci, C este un cod de corectare a t
erori, oricând un cuvânt w diferă de cel mai apropiat cuvânt cod v de o distanţă
cel mult t, atunci v este cel mai apropiat cuvânt cod unic pentru w.
Dacă un cuvânt cod v este transmis şi primit ca w, putem exprima w ca fiind
v + u şi spunem că u = v + w este eroarea ı̂n transmisie. Ca şi cuvânt, eroarea u
are o anumită pondere. Deci C este cod de corectare a t erori dacă pentru fiecare
cuvânt cod v şi fiecare cuvânt u al cărui pondere este cel mult t, atunci v este cel
mai apropiat cuvânt cod unic de v + u.
Aşadar o cale să interpretăm definiţia este că dacă v ar fi un cuvânt cod, şi
dacă w ar fi obţinut prin schimbarea a cel mult t valori din v, atunci v este cel mai
apropiat cuvânt cod de w. Aşadar, prin decodarea MLD, w va fi decodat ca fiind
v.
Definiţia 3.6. Distanţa d a unui cod C este definită astfel
d = min{D(u, v) : u, v ∈ C, u 6= v}.
Din motive intuitive, ar fi mai folositor să ne gândim la cea mai mică distanţă
ca fiind diametrul celui mai mic cerc care să conţină cel puţin două cuvinte cod.
Notăm cu bac cel mai mare număr ı̂ntreg mai mic sau egal cu a.
d−1
Propoziţia 3.7. Fie C un cod de distanţă d şi fixăm t = b c. Atunci C este
2
un cod de corectare a t, erori dar nu un cod de corectare a t + 1 erori.
Demonstratie. Pentru a demonstra prima parte, fie w un cuvânt şi presupunem
că v este un cuvânt cod cu D(v, w) ≤ t. Trebuie să arătăm că v este cel mai
apropiat cuvânt cod unic de w. Astfel demonstrăm că D(u, w) > t pentru oricare
23
cuvânt cod u 6= v. Dacă nu, presupunem că u este un cuvânt cod cu u 6= v şi
D(u, w) ≤ t. Apoi, din inegalitatea triunghiului,
D(u, v) ≤ D(u, w) + D(w, v) ≤ t + t = 2t < d.
Asta fiind o contradicţie a definiţiei lui d. Aşadar, v este ı̂ntr-adevăr cel mai
apropiat cuvânt cod unic de w.

u1

t •
w

•u
2

În continuare, trebuie să arătăm că C nu corectează t + 1 erori. Deoarece codul
are distanţa d, există cuvinte cod u1 , u2 cu d = D(u1 , u2 ); cu alte cuvinte, u1 şi u2
diferă ı̂n exact d poziţii. Fie w un cuvânt cod obţinut, prin schimbarea a t + 1 din
acele d poziţii, din u1 . Avem D(u1 , w) = t + 1 şi D(u2 , w) = d − (t + 1). Deoarece
d−1
t=b c prin presupunerea noastră,
2
d−2 d−1
≤t≤ .
2 2
În particular, d − 2 ≤ 2t astfel ı̂ncât
D(u2 , w) = d − (t + 1) < t + 1.
Aşadar u1 nu este cel mai apropiat cuvânt cod unic de w, deoarece u2 este ı̂n egală
măsură sau mai aproape de w. Deci C nu este un cod de corectare a (t + 1) erori.
t−1
• • •
u1 w u2

2. Coduri liniare
Un cod liniar este un cod C, ca o submulţime din Zn2 , este un subspaţiu din
Zn2 .Vom spune că un cod C(n, k, d) este un cod de lungime n, de dimensiune k,
iar distanţa sa este d.
24
Exemplul 3.8. Dacă A este o matrice m × n peste Z2 , atunci nucleul lui A este
un cod liniar de lungime n, ı̂ntrucât ştim că nucleul unei matrici este ı̂ntotdeauna
un spaţiu vectorial.
Lema 3.9. Dacă C este un cod liniar cu distanţa d, atunci
d = min{ρ(v) : v ∈ C, v 6= 0}.
Demonstratie. Fie e = min{ρ(v) : v ∈ C, v 6= 0}. Fie un vector nenul u ∈ C
putem scrie e = ρ(u). Apoi e = D(v, 0), deoarece 0 ∈ C, observăm că d ≤ e prin
definiţia lui d.
Invers, dacă avem doi vectori distincţi v, w ∈ C, putem scrie d = D(v, w). Apoi
d = ρ(v +w), deoarece C este un cod liniar, v +w ∈ C şi v +w 6= 0 pentru că v 6= w.
Aşadar, prin definiţia lui e, observăm că e ≤ d, deci, d = e, cum ne doream. 
Propoziţia 3.10. Fie G ∈ Mk,n (Z2 ) de rang k şi C = {vG : v ∈ Zk2 }. Fie d
distanţa lui C. Atunci C este un cod liniar (n, k, d) şi G este matricea generatoare
pentru C.
Demonstratie. Ştim din ı̂nmulţirea matricilor că dacă v = (a1 , . . . , ak ) ∈ Zk2 şi
r1 , . . . , rk sunt cele k linii ale lui G, atunci
X
vG = ai ri .
i

În plus, această ecuaţie arată că orice combinaţie liniară de linii din G poate fi
scrisă sub forma vG. Deci, C este generat de liniile lui G astfel ı̂ncât C este un
subspaţiu din Zn2 . Mai mult, deoarece liniile lui G sunt liniar independente, ele
formează o bază pentru C. Aşadar, C are dimensiunea k şi, dacă d este distanţa
lui C, atunci C este un cod (n, k, d). Prin construcţie, G este matricea generatoare
pentru C. 
Teorema 3.11. Fie C un cod liniar (n, k, d) cu matricea generatoare G. Atunci
C = {vG : v ∈ Zk2 }.

Demonstratie. Fie v ∈ Zk2 , un vector linie, atunci vG este o combinaţie liniară


a liniilor lui G. Deoarece v ∈ Zk2 , aceasta rezultă ı̂n generarea liniilor lui G, care
sunt, prin definiţie, C. 
Dacă C este un cod, vom defini codul dual ca
C ⊥ = {v ∈ Zn2 : v · c = 0 pentru oricare c ∈ C}.
Lema 3.12. Fie C un cod liniar. Atunci C ⊥ este un cod liniar. În plus, dacă
{c1 , . . . , ck } este o bază pentru C, atunci v ∈ C ⊥ dacă şi numai dacă v · ci = 0
pentru oricare i.
Demonstratie. Pentru a arăta că C ⊥ este liniar, trebuie să arătăm că este ı̂nchis
sub adunare. Fie v, w ∈ C ⊥ , atunci, pentru oricare c ∈ C, avem, v·c = 0 şi w·c = 0.
Prin urmare,
(v + w) · c = v · c + w · c = 0 + 0 = 0.
Deci, v + w ∈ C ⊥ . În continuare, fie {c1 , . . . , ck } o bază pentru C, dacă v ∈ C ⊥ ,
atunci c · v = 0 pentru orice c ∈ C. Deoarece, elementele ci aparţin lui C, asta
implică v · ci = 0 pentru orice i. Invers, dacă v este un cuvânt astfel ı̂ncât v · ci = 0
25
pentru orice i, atunci fie c ∈ C. Fie ai ∈ Z2 , putem scrie c = a1 c1 + . . . + ak ck ,
atunci
v·c = v · (a1 c1 + . . . + ak ck ) = v · (a1 c1 ) + . . . + v · (ak ck )
= a1 (v · c1 ) + . . . + ak (v · ck ) = a1 0 + . . . + ak 0 = 0.

Aşadar, v ∈ C , asta demonstrează că
C ⊥ = {v ∈ Zn2 : v · ci = 0 pentru oricare i}.

Iniţial am construit coduri ca nuclee de matrici. În continuare, dacă C este un
cod (n, k, d), atunci, o matrice H se numeşte o matrice de paritate pentru C dacă
H este o matrice (n − k) × n a cărei nucleu este exact C, cu elementele sale scrise
pe coloane. Alternativ, spunem că H este o matrice de paritate pentru C dacă C
este nucleul lui H şi dacă liniile lui H sunt liniar independente.
Teorema 3.13. Fie C un cod liniar de lungime n şi dimensiune k cu matricea
generatoare G şi matricea de paritate H. Atunci
1. HGt = 0.
2. H este o matrice generatoare pentru C ⊥ şi G este o matrice de paritate
pentru C ⊥ .
3. Codul liniar C ⊥ are dimensiunea n − k.
4. (C ⊥ )⊥ = C.
5. Dacă H 0 este o matrice generatoare pentru C ⊥ şi G0 este o matrice de
paritate pentru C ⊥ , atunci H 0 este o matrice de paritate pentru C şi G0
este o matrice generatoare pentru C.
Demonstratie. 1. Fie v ∈ Zk2 , atunci vG ∈ C, aşadar, prin definiţia ma-
tricii de paritate, H(vG)t = 0. Dar (vG)t = Gt v t , deci, (HGt )v t = 0.
Întrucât v poate fi orice element din Zk2 , observăm că, pentru orice vector
coloană x, (HGt )x = 0. Dacă ei este vectorul coloană cu 1 pe poziţia
i şi 0 ı̂n rest, observăm că 0 = (HGT )ei , iar acest produs este coloana
i a lui HGt . Deoarece asta este adevărat pentru oricare i, observăm că
HGt = 0. Asta demonstrează prima proprietate.
2. Pentru cea de-a doua, ţinem cont ca trebuie să demonstrăm doar că C ⊥
este nucleul lui G şi că liniile lui H formează o bază pentru C ⊥ . Pentru
această primă parte, fie v ∈ C ⊥ , pentru a demonstra că v este nucleul,
trebuie arătat că Gv t = 0. Totuşi, elementul i din Gv t este produsul liniei
i, ri , din G cu v t . Cu alte cuvinte, este ri · v. În orice caz, deoarece liniile
lui G formează o bază pentru C, observăm că ri · v = 0, deci Gv t = 0.
3. Ca o consecinţă pentru că ştim că nucleul lui G este C ⊥ , demonstrăm
proprietatea a 3-a. Din teorema dimensiunii, n este suma dintre defect
şi rangul lui G. Prin definiţie, imaginea lui G este C, deci dimensiunea
sa este k. Aşadar, nucleul are dimensiunea n − k, dar, acest spaţiu este
C ⊥ , deci dim(C ⊥ ) = n − k. Pentru a finaliza demonstraţia proprietăţii
2, trebuie să arătăm că liniile lui H formează o bază pentru C ⊥ , pentru
că ştim că liniile sunt independente, trebuie doar să mai vedem ca ele
ı̂l generează pe C ⊥ . În primul rând, arătăm ca liniile sunt elemente din
C ⊥ . Întrucât H este matricea de verificare a parităţii pentru C, dacă
v ∈ C, atunci Hv t = 0. Deoarece asta este adevărat pentru orice v ∈ C,
26
observăm cum liniile din H sunt elemente din C ⊥ . Deci, imaginea lui H ⊥
este regăsită ı̂n C ⊥ . Totuşi, ambele spaţii au dimensiunea n − k, folosim
presupunerea că liniile lui H sunt liniar independente pentru a observa
că imaginea lui H are dimensiunea n − k. Din asta, deducem că C ⊥ este
imaginea lui H. Deci, liniile lui H formează o bază pentru C ⊥ , ceea ce
arată că H este o matrice generatoare pentru C ⊥ .
4. Pentru a demonstra proprietatea a 4-a, ţinem cont că incluziunea C ⊆
(C ⊥ )⊥ se regăseşte ı̂n definiţia: dacă c ∈ C, atunci c · v = 0 pentru oricare
v ∈ C ⊥ , prin definiţia lui C ⊥ . Asta trebuie să vedem că c ∈ (C ⊥ )⊥ .
Totuşi, din proprietatea 3, observăm că dimensiunea lui (C ⊥ )⊥ este n −
(n − k) = k, care este dimensiunea lui C. Din incluziunea C ⊆ (C ⊥ )⊥
deducem că C = (C ⊥ )⊥ .
5. În sfârşit, proprietatea 5 se deduce din afirmaţiile anterioare, ţinând cont
că H 0 este o matrice generatoare pentru C ⊥ , atunci este şi o matrice
de verificare a parităţii pentru (C ⊥ )⊥ = C, şi dacă G0 este o matrice
de verificare a parităţii pentru C ⊥ , atunci este şi o matrice generatoare
pentru (C ⊥ )⊥ = C.


3. Decodare Coset. Codul Golay


Pentru a aplica MLD, ceea ce trebuie să facem, având un cuvânt w, este să
căutam prin toate cuvintele cod pentru a găsi acel cuvânt cod c cel mai apropiat
de w. Acesta poate fi un proces destul de ı̂ncet. Există, totuşi, metode mult mai
eficiente, presupunând că avem codul construit ı̂ntr-o manieră similara cu cea a
codului Hamming, spre exemplu, cum ar fi codul C obţinut ca nucleul unei matrici
m × n, H:
C = {v ∈ Zn2 : Hv t = 0}
şi aşadar are lungimea n şi dimensiunea egală cu nucleul lui H. Fixăm simbolurile
C şi H să conţină această semnificaţie ı̂n această secţiune.
Definiţia 3.14. Fie w un cuvânt. Atunci cosetul C + w a lui w este mulţimea
{c + w : c ∈ C}.
Ne amintim două lucruri despre C. În primul rând, prin definiţie, vectorul 0
este un element al codului, deoarece H0 = 0. De aici observăm că w ∈ C + w,
deoarece w = 0 + w. În al doilea rând, dacă u, v ∈ C presupunerea noastră despre
liniaritate necesită ca u + v ∈ C(adică, H(u + v)t = Hut + Hv t = 0 + 0 = 0).
Acum vom discuta despre o proprietate importantă a cosetelor, mai precis că
oricare două cosete sunt fie egale fie disjuncte. De fapt, cosetele sunt clasele de
echivalenţă pentru următoarea relaţie de echivalenţă definită pe Zn2 :
Două cuvinte x şi y sunt ı̂nrudite dacă x + y ∈ C.
Notăm asta cu x ∼ y. Pentru a demonstra că aceasta este o relaţie de echivalenţă,
trebuie să verificăm cele trei proprietăţi de reflexivitate, simetrie şi tranzitivitate.
Pentru reflexivitate ne aducem aminte că pentru adunare pentru orice x ∈ Zn2 avem
x + x = 0, care este un element din C. Aşadar x ∼ x. În continuare, presupunem
că x ∼ y. Pentru a verifica simetria, trebuie arătat că y ∼ x. Ştim că x ∼ y, deci
x + y ∈ C. Însă, x + y = y + x; deci, ı̂ntrucât y + x ∈ C, avem y ∼ x. În final,
pentru tranzitivitate, presupunem că x ∼ y şi y ∼ z. Atunci x + y ∈ C şi y + z ∈ C.
27
Adunând aceste cuvinte cod, avem
(x + y) + (y + z) = x + (y + y) + z = x + 0 + z = x + z,
din proprietăţiile adunării cu vectori. Deoarece rezultatul, x + z, este un element
din C, avem x ∼ z cum ne doream. Deci ∼ este o relaţie de echivalenţă.
Clasa de echivalenţă a unui cuvânt x este
{y : y ∼ x} = {y : x + y ∈ C} = {y : există c ∈ C astfel ı̂ncât y = c + x}
= C + x.
A treia egalitate urmează deoarece dacă x + y = c, atunci y = c + x.
Propoziţia 3.15. Dacă x şi y sunt cuvinte, atunci C + x = C + y dacă şi numai
dacă Hxt = Hy t .
Demonstratie. Presupunem prima oară că C + x = C + y. Atunci x ∼ y implică
Hxt = Hy t , deci x+y ∈ C. Prin definiţia lui C, avem H(x+y)t = 0. În continuare
ajungem la Hxt + Hy t = 0, ţinând cont că (x + y)t = xt + y t , deci Hxt = Hy t .
Invers, presupunem că Hxt = Hy t . Atunci Hxt + Hy t = 0, sau H(x + y)t = 0.
Această ecuaţie arată că x + y ∈ C, şi că x ∼ y. Din această relaţie dintre x şi y,
obţinem C + x = C + y, ı̂ntrucât acestea sunt clasele de echivalenţă ale lui x şi y,
iar aceste clase sunt egale cât timp x şi y sunt ı̂nrudite. 

În continuare discutăm despre un cod de lungime 24, folosit de NASA ı̂n anii
’70 şi ’80 pentru a transmite imagini cu Jupiter si Saturn, fotografiate de naveta
Voyager. Acest cod, numit codul Golay extins, este mulţimea de soluţii a ecuaţiei
cu matrici Hxt = 0, unde H este matricea 12×24, H = [I|B], iar partea din stânga
este matricea identitate 12 × 12, iar partea din dreapta este matricea 12 × 12
 
1 1 0 1 1 1 0 0 0 1 0 1
 1 0 1 1 1 0 0 0 1 0 1 1 
 
 0 1 1 1 0 0 0 1 0 1 1 1 
 
 1 1 1 0 0 0 1 0 1 1 0 1 
 
 1 1 0 0 0 1 0 1 1 0 1 1 
 
 1 0 0 0 1 0 1 1 0 1 1 1 
B=  .
 0 0 0 1 0 1 1 0 1 1 1 1 

 0 0 1 0 1 1 0 1 1 1 0 1 
 
 0 1 0 1 1 0 1 1 1 0 0 1 
 
 1 0 1 1 0 1 1 1 0 0 0 1 
 
 0 1 1 0 1 1 1 0 0 0 1 1 
1 1 1 1 1 1 1 1 1 1 1 0
Fotografiile erau făcute folosind 4096 de culori. Fiecare culoare era codată
cu un cuvânt cod din codul Golay. Prin rezolvarea ecuaţiei cu matrici Hxt = 0,
putem observa clar că sunt 4096 de cuvinte cod. În plus, o verificare anostă a
fiecărui cuvânt cod arată că distanţa codului Golay este d = 8. Aşadar, codul
poate corecta până la b(8 − 1)/3c = 3 erori, prin urmare până la 3 din 24 de cifre
ale unui cuvânt cod pot fi corupte, iar informaţia originală tot poate fi regăsită.
Pentru că acest cod poate corecta mai mult de o eroare, orice procedură de
decodare este, fără o ı̂ndoială, mai complicată decât pentru codul Hamming.
Pentru a lucra mai convenabil cu acest cod, scriem un cuvânt u = (u1 , u2 ),
unde u1 constă ı̂n primele 12 cifre, iar u2 ı̂n ultimele 12 cifre.
28
Deoarece H = [I|B], observăm că u ∈ C dacă şi numai dacă Hut = 0 şi este
adevărat dacă şi numai dacă ut1 + But2 = 0. Pentru un cuvânt w, următorii paşi
sunt folosiţi pentru a-l decoda. Notăm cu v cuvântul cod obţinut din w. Ca de
obicei, ei reprezintă 12-uplul cu cifra 1 pe poziţia i şi 0 pe restul, ı̂n timp ce bi
reprezintă linia i a matricii B.
(1) Calculăm st = Hwt . Dacă st = 0, atunci w este un cuvânt cod.
(2) Dacă 1 ≤ ρ(s) ≤ 3, atunci v = w + (s, 0).
(3) Dacă există i astfel ı̂ncât ρ(s) > 3 şi ρ(s+bi ) ≤ 2, atunci v = w+(s+bi , ei ).
(4) Dacă nu am determinat v ı̂ncă, calculăm sB, care este egal cu (Bst )t prin
simetria lui B.
(5) Dacă 1 ≤ ρ(sB) ≤ 3, atunci v = w + (0, sB).
(6) Dacă există i astfel ı̂ncât ρ(sB) > 3 şi ρ(sB + bi ) ≤ 2, atunci v = w +
(ei , sB + bi ).
(7) Dacă nu am găsit v până acum, atunci w nu poate fi decodat.

29
CAPITOLUL 4

Coduri Hamming

Codul Hamming, descoperit independent de Hamming şi Golay, a fost primul


exemplu de un cod de corectare a erorilor. Fie
 
0 0 0 1 1 1 1
H= 0 1 1 0 0 1 1 
1 0 1 0 1 0 1
o matrice Hamming. Observăm că pe coloanele acestei matrici găsim reprezentarea
ı̂n bază 2 a numerelor de la 1 la 7. Codul Hamming C, de lungime 7 este nucleul
lui H. Mai precis,
C = {v ∈ Z72 : Hv t = 0}.
Cum cifra de verificare reduntantă a unui număr de identificare permite detecţia
unor erori prin eşuarea unui produs scalar să fie egal cu 0, vom vedea că un cod
definit ca nucleul unei matrice poate introduce destule redundanţe pentru a permite
corectarea anumitor erori. Înainte de a trece la subiectul acesta, folosim eliminarea
Gauss pentru a obţine mai multe informaţii detaliate despre codul Hamming. Re-
zolvând sistemul liniar de mai sus Hx = 0 obţinem soluţia
         
x1 1 1 0 1
 x2   1   0   1   1 
         
 x3   1   0   0   0 
         
 x4  = x3  0  + x5  1  + x6  1  + x7  1  .
         
 x5   0   1   0   0 
         
 x6   0   0   1   0 
x7 0 0 0 1
Aşadar, C are dimensiunea 4, iar mulţimea {1110000, 1001100, 0101010, 1101001}
formează o bază pentru C. Dacă am scrie toate cele 16 cuvinte cod ı̂n C, am
descoperi că distanţa lui C este exact 3.
Codurile liniare ca C sunt identificate de lungimea lor, de dimensiunea şi de
distanţa minimă. Deci ne referim la C ca un cod (7, 4, 3), pentru că lungimea sa
este 7, dimensiunea 4, iar distanţa este egală cu 3.
31
Codul C are un algoritm de decodare foarte elegant, pe care-l vom descrie
acum. Fie {e1 , . . . , en } baza standard pentru Z72 . Evidenţiem un fapt a ı̂nmulţirii
matricilor: Heti este egal cu coloana i a lui H. Mai mult, notăm că cei şapte vectori
nenuli din Z32 sunt exact cele şapte coloane ale lui H.
Presupunem că v este un cuvânt cod care este transmis ca un cuvânt w 6= v şi
că exact o singură eroare s-a făcut ı̂n timpul transmisiei. Apoi există i astfel ı̂ncât
w = v + ei . Totuşi, nu ştim ı̂ncă cât este i, deci nu putem ı̂ncă să determinăm v
din w. Dar,
Hwt = H(v + ei )t = Hv t + Hwit = Heti ,
iar Heti este coloana i a lui H. Aşadar i este determinat prin calcularea lui Hwt
şi comparând rezultatul cu coloanele lui H. Numărul coloanei lui H dat de Hwt
este exact i. Apoi w este decodat ca w + ei , care trebuie sa fie egal cu v deoarece
am presupus că o singura că o singură eroare a fost făcută ı̂n transmisie. Pentru a
rezuma acest algoritm de decodare a erorilor:
• Fie un cuvânt w dat, se calculeaza Hwt
• Dacă produsul este 0, atunci w este un cuvânt cod.
• Dacă produsul nu este 0, atunci este egal cu coloana i a lui H pentru
un ı̂ntreg unic i. Atunci w + ei este un cuvânt cod valid, şi este cel mai
apropiat cuvânt cod de w.
Putem generaliza construcţia codurilor Hamming binare ı̂n coduri Hamming q-
are, unde codul Hamming [n, k] este acum un spaţiu liniar peste un corp comutativ
de caracteristică q, iar q este prim. Fie un număr natural r, r 6= 0, alegem un
r-uplu, nenul, de elemente din Zq . Alegem alt r-uplu din Zq dar liniar independent
faţă de primul. Continuăm să alegem r-upluri ı̂n aşa fel ı̂ncât oricare două dintre
ele să fie liniar independente ı̂ntre ele până nu mai putem găsi altele. Aranjăm
aceste r-upluri pe coloanele unei matrici M .
Există q r − 1 r-upluri nenule posibile, iar fiecare alegere, elimină multiplii săi
nenuli (q − 1) din a fi consideraţi. Aşadar, numărul de coloane ale matricii noastre
este (q r − 1)/(q − 1). Definim codul liniar pentru care M să fie matricea de paritate
ca fiind codul Hamming [(q r − 1)/(q − 1), (q r − 1)/(q − 1) − r] q-ar. Ne amintim
că matricea de paritate este matricea generatoare a codului dual, care ı̂n acest caz
are dimensiunea r, de unde şi dimensiunea codului Hamming generat, trebuie să
fie n − r = (q r − 1)/(q − 1) − r.
Exemplul 4.1. Un cod Hamming [4, 2] 3-ar poate fi dat de matricea de paritate
 
1 1 2 0
0 1 1 1
ce are codul Hamming ataşat:

{(0000), (0121), (0212),


(1011), (2022), (1102),
(2201), (1220), (2110)}.
Acelaşi cod Hamming rezultă şi din matricea de paritate:
 
0 1 1 1
1 0 1 2
32
Aceste coduri q-are sunt de asemenea coduri de corectare a unei erori, bazându-
ne pe faptul că un cuvânt cod este la cel puţin distanţa 3 de un alt cuvănt cod, care
la rândul său se bazează pe constructia matricii de paritate. Mai specific, pentru
că nu există două coloane din matricea de paritate care să fie liniar dependente
ı̂nseamnă că distanţa minimă ı̂ntre oricare doua cuvinte cod este de cel puţin 3.
Definiţia 4.2. O sferă de rază θ centrată ı̂n x este definită astfel:

Sθ (x) = {y ∈ Znq |dH (x, y) ≤ θ}.

Fie x ∈ Znq , |S0 (x) = 1|, acel 1 fiind doar x. Există (q −1) căi de a schimba orice
coordonată x şi a obţine un nou cuvânt codşi n posibile coordonate de schimbat,
n
prin urmare |S1 (x)| = 1 + n(q − 1). Există căi de a alege două coordonate
2
să se schimbe şi (q − 1)2 căi pentru a le schimba pe ele, deci
 
n
|S2 (x)| = 1 + n(q − 1) + (q − 1)2 .
2

Iar ı̂n general,


θ  
X n
|Sθ (x)| = (q − 1)i .
i
i=

Din
T discuţia precedentă, un cod este un corector de t erori, dacă şi numai dacă
St (x) St (y) = ∅, oricând x 6= y. Aşadar, dacă C este un cod corector de t erori,
|C| · |St (x)| ≤ |Zq |n , pentru orice x, deoarece cardinalul unei sfere nu depinde de
alegerea lui x.
Definiţia 4.3. Un cod corector de t erori se numeşte perfect dacă

|C| · |St (x)| ≤ |Zq |n ,

sau dacă
t  
n
X n
|C| = |Zq | / (q − 1)i
i
i=0

Codul Hamming C are o proprietate adiţională: fiecare cuvânt este la ı̂n


distanţa cel mult 1 de un cuvânt cod. Pentru a vedea asta, presupunem că w
este un cuvânt. Dacă Hwt = 0, atunci w este un cuvânt cod. Dacă nu, atunci Hwt
este un 3-uplu nenul. Aşadar, este egal cu o coloană din H, spunem că Hwt este egal
cu coloana i a lui H. Iar Hwt = Heti , deci H(wt + eti ) = 0, astfel ı̂ncât w + ei ∈ C.
Cuvântul w + ei este, apoi, un cuvânt cod la distanţa 1 de w. Deci ştim că un cod
care corectează t erori şi pentru care fiecare cuvânt este la distanţa cel mult t de un
cuvânt cod oarecare, se numeşte perfect. Deci, aşadar avem următoarea propoziţie.
Propoziţia 4.4. Codurile Hamming sunt coduri perfecte de corectare a unei erori.

Demonstratie. Trebuie verificat că


1  
X n
|C| · (q − 1)i = |Zq |n .
i
i=0

33
Termenul din dreapta egalului este egal cu q n , unde n = (q r − 1)/(q − 1). Partea
din stânga este
(q r − 1)
 
n−r n−r
q (1 + n(q − 1)) = q 1+ (q − 1)
(q − 1)
= q n−r (1 + (q r − 1))
= q n−r (q r )
= qn .
Deci, codurile Hamming sunt coduri perfecte de corectare a unei erori. 
n n
Definiţia 4.5. Un cod de acoperire t este un cod C ⊂ A pentru care A =
S
{St (x)|x ∈ C}.
Propoziţia 4.6. Dacă C este un cod de acoperire t, atunci |C| · |St (x)| ≥ |Zq |n .
Definiţia 4.7. Dacă există egalitate ı̂n ultima propoziţie, atunci C se numeşte cod
de acoperire t, perfect.
Desigur, codurile de corectare a t erori, coincid cu cele de acoperire t. De
asemenea, este cunoscut că singurele coduri perfecte de corectare a unei erori, sunt
codurile Hamming. Astfel de coduri sunt foarte utile deoarece procesul de decodare
va obţine ı̂ntotdeauna un cuvânt cod.

34
CAPITOLUL 5

Aplicaţii

În capitolul următor vom construi un program pe baza C/C++, ce poate de-
coda cele cinci tipuri de coduri despre care am vorbit ı̂n capitolele anterioare: USPS
Postal Code, The Universal Product Code, ISBN-10, Codul Golay şi Codul Ham-
ming. Programul este scris având la bază funcţia switch, ce permite alegerea tipului
de decodare la rularea programului.

#include <iostream>

using namespace std;

int main()
{
int sa=0,sb=0,sc=0;
int a[10],b[12],c[10];
int i,x,j;
int B[12][12];
int H[12][24];
int w[24],s[12],s0=0,sbi[12],sbi0=0,w0=0;
int ei[12],sB[12],sB0=0,sBbi[12],sBbi0=0;
int Hamm[3][7]={{0,0,0,1,1,1,1},{0,1,1,0,0,1,1},{1,0,1,0,1,0,1}};
int y[7],Hw[3],e[7],Hw0=0;
cout<<"Alegeti un tip de cod de decodat:"<<endl;
cout<<"1.USPS Postal Code"<<endl;
cout<<"2.The Universal Product Code"<<endl;
cout<<"3.ISBN-10"<<endl;
cout<<"4.Codul Golay"<<endl;
cout<<"5.Codul Hamming"<<endl;
cout<<"Optiunea aleasa este: ";
cin>>x;

35
switch(x)
{
case 1: Programul de decodare pentru USPS Postal Code
case 2: Programul de decodare pentru The Universal Product Code
case 3: Programul de decodare pentru ISBN-10
case 4: Programul de decodare pentru Codul Golay
case 5: Programul de decodare pentru Codul Hamming
}
}
În prima parte a programului, se declara variabilele ce vor urma să fie folosite
imediat şi ţinem cont că matricile H şi B, ce reprezintă matricile de la Codul Golay,
sunt iniţializate complet ı̂n cadrul programului dar au fost scrise restrâns din punct
de vedere estetic.

Fiecare opţiune de case din switch se ocupă ı̂n parte de fiecare cod, iar ı̂n cele
ce urmează le vom discuta pe rând.

1. USPS Postal Code


Programul citeşte de la tastatură codul de 10 cifre conform codului USPS,
urmând mai apoi să calculeze suma acestuia şi să verifice că este un cod valid dacă
şi numai dacă acesta este divizibil cu 10.
case 1:
cout<<"Introduceti codul de 10 cifre:"<<endl;
for(i=0;i<10;i++)
cin>>a[i];
for(i=0;i<10;i++)
sa=sa+a[i];
if(sa%10==0)
cout<<"Codul introdus este valid";
else
cout<<"Codul introdus nu este valid";
break;
36
Putem observa cum introducerea codului din exemplul anterior, returnează
validitatea codului nostru, aşa cum era de aşteptat.

2. The Universal Product Code


Următorul case se ocupă de codul de bare pe care-l găsim pe toate produsele
cu care ne ı̂ntâlnim zi de zi. Ne amintim că un UPC de 12 cifre (a1 , . . . , a12 ) este
valid doar dacă suma

3a1 + a2 + 3a + 3 + a4 + · · · + 3a11 + a12

este divizibilă cu 10. Ceea ce verifică şi programul următor:

case 2:
cout<<"Introduceti codul de 12 cifre:"<<endl;
for(i=0;i<12;i++)
cin>>b[i];
for(i=0;i<12;i++)
{
if(i%2==0)
sb=sb+3*b[i];
else
sb=sb+b[i];
}
if(sb%10==0)
cout<<"Codul introdus este valid";
else
cout<<"Codul introdus nu este valid";
break;
37
Introducerea unui cod valid, 0-13241-54321-2, ı̂n urma algoritmului, afişează
mesajul dorit.

3. ISBN-10
Codul ISBN-10, ce se află pe spatele fiecărei cărţi şi cu care putem identifica,
unic, fiecare carte ı̂n parte, este un cod de 10 cifre (a1 , . . . , a10 ) şi este valid dacă
suma

10a1 + 9a2 + · · · + 2a9 + a10

este divizibilă cu 11, unde a1 , . . . , a10 pot avea următoarele valori 1, . . . , 9, X, iar
X reprezintă numărul 10.
Algoritmul decodării unui ISBN-10 este următorul:
case 3:
cout<<"Introduceti codul de 10 cifre:"<<endl;
for(i=0;i<10;i++)
cin>>c[i];
for(i=0;i<10;i++)
{
for(j=10;j>0;j--)
{
sc=sc+j*c[i];
}
}
if(sc%11==0)
cout<<"Codul introdus este valid";
else
cout<<"Codul introdus nu este valid";
break;
38
Am furnizat ISBN-ul cărţii din exemplul de mai sus pentru a fi sigur că algo-
ritmul programului funcţionează.

4. Codul Golay
Pentru o mai uşoară ı̂ntelegere a programului, ne vom aduce aminte despre
algoritmul folosit la decodarea codului Golay, acesta fiind:
(1) Calculăm st = Hwt . Dacă st = 0, atunci w este un cuvânt cod.
(2) Dacă 1 ≤ ρ(s) ≤ 3, atunci v = w + (s, 0).
(3) Dacă există i astfel ı̂ncât ρ(s) > 3 şi ρ(s+bi ) ≤ 2, atunci v = w+(s+bi , ei ).
(4) Dacă nu am determinat v ı̂ncă, calculăm sB, care este egal cu (Bst )t prin
simetria lui B.
(5) Dacă 1 ≤ ρ(sB) ≤ 3, atunci v = w + (0, sB).
(6) Dacă există i astfel ı̂ncât ρ(sB) > 3 şi ρ(sB + bi ) ≤ 2, atunci v = w +
(ei , sB + bi ).
(7) Dacă nu am găsit v până acum, atunci w nu poate fi decodat.
În prima secţiune de program, iniţializăm codul nostru, calculăm st = Hwt şi ı̂n
acelaşi timp când facem schimbarea ı̂n baza 2 a lui s, ı̂i calculăm şi ponderea de
fiecare dată când ı̂ntâmpinăm un element egal cu 1, pentru a rezolva pasul 1.
case 4:
cout<<"Se va lucra numai in baza 2, introduceti codul de 24 cifre: "<<endl;
for(i=0;i<24;i++)
cin>>w[i];
cout<<endl<<"Codul dumneavoastra este: ";
for(i=0;i<24;i++)
{
if(w[i]%2==0)
w[i]=0;
else
w[i]=1;
cout<<w[i];
}
39
for(i=0;i<12;i++)
for(j=0;j<24;j++)
{
s[i]=s[i]+H[i][j]*w[j];
}
/*Pasul 1*/
for(i=0;i<12;i++)
{
if(s[i]%2==0)
s[i]=0;
else
{
s[i]=1;
s0++;
}
}
if(s0==0)
{
cout<<"Codul introdus este un cuvant cod valid."<<endl<<endl;
break;
}
În cea de-a doua secţiune de program, verificăm dacă ponderea lui s, adică ρ(s),
are valoarea cuprinsă ı̂ntre 1 şi 3, iar dacă este adevărat, urmează decodarea lui w
ca fiind v = w + (s, 0).
/*Pasul 2*/
if(1<=s0 && s0<=3)
{
for(i=0;i<24;i++)
{
if(i<12)
w[i]=w[i]+s[i];
if(w[i]%2==0)
w[i]=0;
else
w[i]=1;
}
cout<<endl<<"Cuvantul cod decodat la pasul 2 este: ";
for(i=0;i<24;i++)
cout<<w[i];
cout<<endl<<endl;
break;
}
Pentru următorul pas, căutăm o linie din B astfel ı̂ncât ρ(s + bi ) ≤ 2, iar dacă
am găsit o linie care să ı̂ndeplinească inegalitatea, atunci decodăm w ca fiind v =
w + (s + bi , ei ).
/*Pasul 3*/
for(i=0;i<12;i++)
{
40
for(j=0;j<12;j++)
{
sbi[j]=s[j]+B[i][j];
if(sbi[j]%2==0)
sbi[j]=0;
else
{
sbi[j]=1;
sbi0++;
}
}
if(sbi0<=2)
{
for(j=0;j<12;j++)
{
if(j==i)
ei[j]=1;
else
ei[j]=0;
}
for(j=0;j<24;j++)
{
if(j<12)
w[j]=w[j]+sbi[j];
else
w[j]=w[j]+ei[j-12];
if(w[j]%2==0)
w[j]=0;
else
w[j]=1;
}
cout<<"Cuvantul cod decodat la pasul 3 este: ";
for(j=0;j<24;j++)
cout<<w[j];
cout<<endl<<endl;
break;
}
}
În continuare, pentru paşii 4 şi 5, calculăm vectorul sB şi de asemenea, când ı̂l
trecem ı̂n baza 2, ı̂i calculăm şi ponderea, care, evident, dacă este cuprinsă ı̂ntre 1
şi 3, obţinem codul decodat v = w + (0, sB).

/*Pasul 4-5*/
for(i=0;i<12;i++)
{
for(j=0;j<12;j++)
{
sB[i]=sB[i]+s[j]*B[j][i];
41
}
if(sB[i]%2==0)
sB[i]=0;
else
{
sB[i]=1;
sB0++;
}
}
if(1<=sB0 && sB0<=3)
{
for(i=0;i<24;i++)
{
if(i>11)
w[i]=w[i]+sB[i-12];
if(w[i]%2==0)
w[i]=0;
else
w[i]=1;
}
cout<<"Cuvantul cod decodat la pasul 5 este: ";
for(i=0;i<24;i++)
cout<<w[i];
cout<<endl<<endl;
break;
}
În secţiunea următoare, din nou căutăm o linie din matricea B care să ı̂ndeplinească
condiţia ρ(sB + bi ) ≤ 2, pentru a putea decoda v = w + (ei , sB + bi ).
În cazul ı̂n care, ı̂n niciunul dintre paşii anteriori, codul nu a putut fi decodat,
programul va returna un mesaj ce indică eşuarea decodării lui w.

/*Pasul 6*/
if(sB0>3)
{
for(i=0;i<12;i++)
{
for(j=0;j<12;j++)
{
sBbi[j]=sB[j]+B[i][j];
if(sBbi[j]%2==0)
sBbi[j]=0;
else
{
sBbi[j]=1;
sBbi0++;
}
}
42
if(sBbi0<=2)
{
for(j=0;j<12;j++)
{
if(j==i)
ei[j]=1;
else
ei[j]=0;
}
for(j=0;j<24;j++)
{
if(j<12)
w[j]=w[j]+ei[j];
else
w[j]=w[j]+sBbi[j-12];
if(w[j]%2==0)
w[j]=0;
else
w[j]=1;
}
cout<<"Cuvantul cod decodat la pasul 6 este: ";
for(j=0;j<24;j++)
cout<<w[j];
cout<<endl<<endl;
break;
}
}
}
cout<<endl<<"Codul introdus nu poate fi decodat."<<endl<<endl;
break;

43
În primul exemplu am optat ca verificarea programului să constea ı̂n folosirea unui
cod valid din start, iar acesta a returnat mesajul de validitate.

Pentru cel de-al doilea exemplu am ales un cod invalid şi observăm cum decodarea
sa durează mai mult, deci ı̂i oferă mici dificultăţi programului, dar acesta este de-
codat de la pasul 2 ı̂mpreună cu afişarea codului corectat.

44
5. Codul Hamming
Un cod Hamming are următorul algoritm de decodare:
• Fie un cuvânt w dat, se calculeaza Hwt
• Dacă produsul este 0, atunci w este un cuvânt cod.
• Dacă produsul nu este 0, atunci este egal cu coloana i a lui H pentru
un ı̂ntreg unic i. Atunci w + ei este un cuvânt cod valid, şi este cel mai
apropiat cuvânt cod de w.
Se poate observa că ı̂n prima secţiune de program, după introducerea codului pe
care dorim să-l decodăm, calculăm vectorul Hwt , iar dacă ponderea sa este egală
cu 0, atunci ştim că am primit de la tastatură un cod valid.
case 5:
/*Pasul 1-2*/
cout<<"Introduceti codul de 7 cifre: "<<endl;
for(i=0;i<7;i++)
cin>>y[i];
cout<<"Codul dumneavoastra este: ";
for(i=0;i<7;i++)
{
if(y[i]%2==0)
y[i]=0;
else
y[i]=1;
cout<<y[i];
}
cout<<endl<<endl;
for(i=0;i<3;i++)
{
for(j=0;j<7;j++)
Hw[i]=Hw[i]+Hamm[i][j]*y[j];
if(Hw[i]%2==0)
Hw[i]=0;
else
{
Hw[i]=1;
Hw0++;
}
}
if(Hw0==0)
{
cout<<"Cuvantul cod introdus este valid.";
break;
}

45
Dacă ponderea vectorului Hwt , nu este egală cu 0, atunci ştim că vectorul calculat,
este egal cu una dintre coloanele lui H şi verificăm pe rând coloanele până când
condiţia este ı̂ndeplinită.
/*Pasul 3*/
for(i=0;i<7;i++)
{
if(Hw[0]==Hamm[0][i] && Hw[1]==Hamm[1][i] && Hw[2]==Hamm[2][i])
{
for(j=0;j<7;j++)
{
if(j==i)
e[j]=1;
else
e[j]=0;
}
for(j=0;j<7;j++)
{
y[j]=y[j]+e[j];
if(y[j]%2==0)
y[j]=0;
else
y[j]=1;
}
cout<<"Eroarea se afla pe pozitia "<<i+1<<" din codul introdus, ";
cout<<"iar cuvantul cod decodat este: ";
for(j=0;j<7;j++)
cout<<y[j];
cout<<endl<<endl;
}
}

46
De asemenea, ca la exemplul codului Golay, şi aici pentru o verificare uşoară
a funcţionării programului, am ales un cod deja valid, adică 0111100, pentru a
observa ce va returna programul.

Cum ştim că exemplul anterior a returnat un cod valid, am ales să schimb
a patra cifră din cod, deci din 0111100 l-am schimbat ı̂n 0110100, iar programul
anunţă poziţia corectă pe care s-a efectuat eroare şi imediat după, codul decodat.

47
Concluzie

Folosind metodele de verificare a unor coduri din exemplele codurilor numerice,


USPS, UPC şi ISBN-10 am putut observa că ele sunt limitate la o singură metodă
de corectare a erorilor. Folosind cifra de verificare de la finalul oricărui cod, ı̂n
cazul unei singure erori, aceasta reprezintă singurul mijloc de detecţie şi de aflare
a codului exact.
Mai departe, codul Golay, datorită structurii si algoritmului său, ne permite să
detectăm până la 3 erori ı̂ntr-un cod, un plus faţă de metodele codurilor numerice,
dar unul lent. Pe de altă parte, codul Hamming poate detecta şi corecta o singură
eroare, fiind un cod perfect de corectare a unei erori, are un algoritm uşor de
implementat şi ı̂n acelaşi timp determina si poziţia exactă a erorii din cod.
Îndată ce am executat programul, pentru codurile Hamming şi Golay, am putut
trage concluzia asupra diferenţei dintre cele două pentru că putem observa cum un
cod Hamming este mai uşor şi mai rapid de decodat, deci executarea se face ı̂ntr-un
timp mai scurt, ı̂n timp ce executarea programului pentru codul Golay este mai
lentă datorită algoritmului mai complicat şi numărului de calcule pe care acesta le
implică.

49
Bibliografie

[1] V. Balan, Algebră Liniară, note de curs.


[2] V. Balan, Calcul matriceal cu aplicaţii, note de curs.
[3] J. Fiedler, Hamming Codes, note de curs.
[4] D.R. Finston, P.J. Morandi, Abstract Algebra Structure and Application,
Springer International Publishing Switzerland, 2014.
[5] D.C. Hankerson, G. Hoffman, D.A. Leonard, C.C. Lindner, K.T. Phelps,
C.A. Rodger, J.R. Wall, Coding Theory and Cryptography: The Essen-
tials, Second Edition, CRC Press, New York, 2000.
[6] I.N. Herstein, Topics in Algebra, Second Edition, Xerox Corporation,
1975.
[7] J. Talbot, D. Welsh, Complexity and Cryptography: An Introduction,
Cambridge University Press, Cambridge, 2006.
[8] http://www.codeblocks.org/
[9] http://www.cplusplus.com/

51

S-ar putea să vă placă și