Professional Documents
Culture Documents
RESUMO
Neste trabalho apresentamos uma introdução à teoria dos Códigos Corretores de Erros, que é uma parte
da matemática aplicada usada na área de transmissão de informação e que necessita fortemente de
conceitos e resultados da matemática pura, especialmente da álgebra. Falaremos especificamente de uma
classe de códigos corretores de erros, os códigos lineares.
Palavras Chave: Código linear, matriz geradora, decodificação
INTRODUÇÃO
“Suponha que se deseja enviar uma mensagem por um canal de comunicação a cabo de
São Paulo para Uberlândia. Eventualmente esta mensagem pode sofrer interferências
no caminho. Por exemplo, se considerarmos uma mensagem binária (seqüências de 0’s
e 1’s), pode acontecer de um 0 enviado chegar ao destino como 1 ou vice-versa.”
___________________________________________
* Monografia apresentada por Adenilce Oliveira Souza à Faculdade de Matemática, como requisito
parcial para a obtenção do título de Especialista em Matemática.
† Professor orientador: camara@ufu.br
A teoria de códigos foi criada para tentar corrigir estes erros. Um código corretor
de erros é, em essência, um modo organizado de acrescentar algum dado adicional a
cada informação que se queira transmitir ou armazenar e que permita, ao recuperar a
informação, detectar e corrigir erros.
76 FAMAT em Revista - Número 06 - Maio de 2006
CAPÍTULO I
Sistema de Comunicação
Codificador Decodificador
Do Canal Do Canal
Palavra Palavra
código do recebida
canal
Demodulador
Modulador
Canal
Suponha que todos os dados de interesse pudessem ser representados por uma
informação binária, isto é, como uma seqüência de zeros e uns. Esta informação binária
está para ser transmitida através de um canal que causa erros ocasionais. O propósito de
um código é adicionar símbolos extras aos símbolos da informação de modo que os
erros podem ser encontrados e corrigidos no receptor. Isto é, uma seqüência de símbolos
de dados é representada por uma seqüência maior de símbolos com redundância
suficiente para proteger os dados.
Um código binário de tamanho M e comprimento de bloco n é um conjunto de
k palavras de comprimento n, chamadas palavras do código. Geralmente M = 2k para
um inteiro k e o código é denominado de código binário (n,k)
Por exemplo, nós podemos fazer o seguinte código:
00000
01011
C=
10110
11101
00 → 00000
01 → 01011
10 → 10110
11 → 11101
Decodificador Decodificador
de canal da fonte Usuário
10101 00 → 10101
10010
01 → 10010
C=
01110 10 → 01110
11111 11 → 11111
Os dois códigos criados para o exemplo do robô não são códigos bons, pois eles
não são capazes de corrigir muitos tipos de erros. Vamos exemplificar:
Note que no primeiro código a escolha da palavra código 01011 para estimar a
mensagem recebida 11011 é feita de maneira bem natural. De fato, em relação às
palavras do código observamos que:
Nesse caso, não é possível estimar qual foi a palavra código transmitida.
FAMAT em Revista - Número 06 - Maio de 2006 81
d ( 00000, 01011) = 3
d ( 00000, 10110) = 3
d ( 00000, 11101) = 4
d ( 01011, 10110) = 4
d ( 01011, 11101) = 3
d ( 11101, 10110) = 3
Demonstração:
Caso I: ui = vi ui = wi ⇒ wi = vi
ui ≠ wi ⇒ wi ≠ vi
82 FAMAT em Revista - Número 06 - Maio de 2006
Caso II: ui ≠ vi ui = wi ⇒ wi ≠ vi
ui ≠ wi wi ≠ vi
wi = vi
D (a,t) = {u ∈ An : d(u,a) ≤ t}
S (a,t) = {u ∈ An : d(u,a) = t}
ii) Considere F 3 = {(0,0,0) , (1,0,0) , (0,1,0) , (0,0,1) , (1,0,1) , (1,1,0) , (0,1,1) , (1,1,1)}
d ( 00000, 01011) = 3
d ( 00000, 10110) = 3
d ( 00000, 11101) = 4
d ( 01011, 10110) = 4 Distância mínima d = 3
d ( 01011, 11101) = 3
d ( 11101, 10110) = 3
d ( 10101 , 10010) = 3
d ( 10010 , 01110) = 3
d ( 10101 , 01110) = 4
d ( 10010 , 11111) = 4 Distância mínima d = 2
d ( 10101 , 11111) = 2
d ( 01110 , 11111) = 2
M
Nesse caso, para calcular d é necessário calcular distâncias, onde M é o
2
número de palavras do código, o que tem custo computacional elevado.
d(c,c’) ≥ d
d(c, c' )
2
Obs: os raios das circunferências têm medida t.
Demonstração:
∵ x ∉ D(c,t) ∩ D (c’, t)
∵ D(c,t) ∩ D (c’, t) = ∅
d(c,c’) ≥ d
Como D(c,t) ∩ D(c’,t) = ∅ , temos que d(r,c’) > t, para toda palavra c’ ∈ C ,
com c’ ≠ c e, portanto, a decodificação pela vizinhança mais próxima vai corrigir este
erro, pois c está univocamente determinado a partir de r.
d − 1 d −2
Agora se d for par, então
2 = . Conseqüentemente, C pode
2
d −2 d
corrigir erros. Mas, se ocorreu, isso significa que a palavra recebida r tem
2 2
d
d(c,r) = . Se existe alguma palavra c’ ∈ C tal que d(c,c’) = d , teremos que r pode
2
d
estar no “ponto médio” entre c e c’, Nesse caso, d(c’,r) = e o decodificador pode
2
d
detectar que erros ocorreram, mas não pode corrigi-los pois existem duas
2
possibilidades distintas c e c’ para efetuar a decodificação pela vizinhança mais
próxima.
d
d
t 2
2
t
r
86 FAMAT em Revista - Número 06 - Maio de 2006
d
Por outro lado, se mais de erros ocorrem, a palavra recebida r pode estar mais
2
próxima de outra palavra do código que não a correta.
d
d(c,r) > t t
2 r
e d(c’,r) < t
d d
2 2
Nesse caso, a decodificação de r determinará c’ incorretamente. Isto é chamado
erro de decodificação. Em um código eficiente, isto raramente ocorre.
d − 1
Por exemplo em um código com d = 4, é possível corrigir até t =
2 = 1 erro e
d
detectar até = 2 erros. Note que pelo teorema anterior, um código terá maior
2
capacidade de correção de erros quanto maior for a sua distância mínima. Portanto, é
fundamental, para a Teoria de Códigos, poder calcular d, ou pelo menos determinar uma
cota inferior para ele.
d − 1
Definição 1.4: Seja C ⊂ An um código com distância mínima d e seja t =
2 . O
código C será dito perfeito se ∪ D ( c, t ) = A
c∈C
n
FAMAT em Revista - Número 06 - Maio de 2006 87
Exemplos:
2 – Todo código de Hamming é perfeito (falaremos deste tipo de código no capítulo II)
88 FAMAT em Revista - Número 06 - Maio de 2006
CAPÍTULO II
CÓDIGOS LINEARES
Definição 2.2: Dado u ∈ Fn, defini-se o peso de u como sendo o número inteiro:
w(u) := | { i: ui ≠ 0} |
Proposição 2.1: Seja C ⊂ Fn um código linear com distância mínima d . Temos que:
Demonstração:
(ii) Para todo par de elementos u,v ∈ C , com u ≠ v , temos que z = u – v ∈ C . Daí,
d(u,v) = w(z) . Portanto, o conjunto {w(z): z ∈ C –{0} } é igual ao conjunto
{d(u,v) : u,v ∈ C e u ≠ v} e daí d = min {d(u,v) : u,v ∈ C e u ≠ v}=
min {w(z): z ∈ C –{0} }= w(C).
FAMAT em Revista - Número 06 - Maio de 2006 89
T: Fk → Fn
a → u
onde a = (a1, a2, ...., ak) e u = a1v1 + a2v2 + .... + akvk . Temos que T é uma
transformação linear injetora, pois o Ker T = { 0} , tal que Im(T) = C.
Portanto, dar um código C ⊂ Fn de dimensão k é equivalente a dar uma
transformação linear injetora T: Fk → Fn e definir C = Im(T)
T: F22 → F24
(a1,a2) → (a1, a2, a2, a1)
Temos que T(a1,a2) = (0,0,0,0) , se (a1, a2, a2, a1) = 0 , ou seja, a1 = a2 = 0 . Logo,
Ker T = { (0,0) } . Portanto, T é injetora e daí Im T = C ( a imagem de T é um código
C).
Como a1 , a2 ∈ F2 , temos que | C | = 22 = 4 e:
C = { (0,0,0,0) ; (1,0,0,1) ; (0,1,1,0) ; (1,1,1,1) }
d − 1
Além disso, w(C) = 2 e C corrige t =
2 = 0 erros, ou seja, é um código
muito ruim.
Seja β = {v1, v2, ..., vk} uma base ordenada de C e considere a matriz G , cujas
linhas são os vetores vi = (vi1, vi2, ...., vin) ; i = 1,2,...,k , isto é ,
90 FAMAT em Revista - Número 06 - Maio de 2006
1 0 0 1
G =
0 1 1 0
Utilizando esta matriz geradora G para codificar as palavras código da fonte, do
exemplo do robô, teríamos as seguintes palavras do código.
1 0 0 1
(0,0) . G = (0 0 ). = (0 0 0 0 )
0 1 1 0
1 0 0 1
(1,0) . G = (1 0 ). = (1 0 0 1)
0 1 1 0
1 0 0 1
(0,1) . G = (0 1). = (0 1 1 0 )
0 1 1 0
1 0 0 1
(1,1) . G = (1 1). = (1 1 1 1)
0 1 1 0
Codificador Codificador
da fonte do canal
FAMAT em Revista - Número 06 - Maio de 2006 91
T : Fk → Fn
a → aG
Se a = (a1, a2, ..., ak), temos que T(a) = aG = (a1v1 + a2v2 + .... + akvk), ou seja,
T(Fk) = C. Podemos, então, considerar Fk como sendo um código da fonte, C o código
do canal e a transformação T, uma codificação.
Além disso, devemos ressaltar que a matriz geradora G não é única, pois ela
~
depende da base β. Portanto, mudando para uma base β , teremos uma outra matriz
~ ~
geradora G para o mesmo código C. Da álgebra linear, sabemos que podemos obter G
de G através de operações elementares com as linhas de G e vice versa.
Podemos construir códigos a partir de matrizes geradoras G. Para isto, basta
tomar uma matriz cujas linhas sejam linearmente independentes e definir um código
como sendo a imagem da transformação linear T : Fk → Fn
a → aG
d(f(u),f(v)) = d(u,v) ; u, v ∈ Fn
[
G * = Id k A ]
Portanto, dado um código C, existe um código equivalente C’ com matriz geradora
G* na forma padrão.
Exemplo: Dado o código C definido sobre F2 pela matriz G abaixo, encontre um código
C’ equivalente a C, com matriz geradora na forma padrão. T : F4 → F7
1 1 1 0 0 0 0
1 0 0 1 1 0 0
G=
1 0 0 0 0 1 1
0 0
1 0 1 0 1
L 1 1 1 0 0 0 0 c ↔c
1
3 1
1 0 1 0 1 0 0
L
2 1 0 0 1 1 0 0 c5 ↔ c2 c7 ↔ c3
L 1 0 0 0 0 1 1 0 1 1 1 0 0 0
3
L
0 1 0 1 0 1 0
≈ 0 0 1 0 0 1 1 ≈
4 0 0
0 0 1 1 1
c1 c 2 c3 c4 c5 c6 c7
1 0 0 0 1 0 1 1 0 0 0 1 0 1
0 1 0 1 0 0 1 L4 + L2 0 1 0 0 1 1 1
= [Id 4 A ] onde,
0 0 1 0 0 1 1
≈ 0 0 1 0 0 1 1
0 0 0 0
0 0 1 1 1 0 0 1 1 1
1 0 0 0 1 0 1
0 1 0 0 1 1 1
Id 4 = e A=
0 0 1 0
0 1 1
0
0 0 1 kxk = 4x4 1 0 kx ( n − k ) = 4 x3
1
Sejam u = (u1, u2,...,un) e v= (v1, v2 ,..., vn) elementos de Fn. Define-se o produto
interno de u e v como sendo u, v = u1v1+u2v2+....+unvn . Essa operação possui as
seguintes propriedades usuais de um produto interno, ou seja, é simétrica :
u, v = v, u e bilinear u + λw, v = u, v + λ w, v ∀ λ ∈ F
FAMAT em Revista - Número 06 - Maio de 2006 93
Demonstração:
de uma base de C.
Demonstração:
Daí:
94 FAMAT em Revista - Número 06 - Maio de 2006
(
v1 = − a1,k +1.v k +1 + ...... + a1,n .v n ) v1
v k +1
⇒
(
v 2 = − a 2,k +1.v k +1 + ...... + a 2,n .v n ) ⇒
v2 v k +2
= −A .
v = − a
k (
k,k +1.v k +1 + ...... + a k, n .v n )
v
k
v
n
(ii) Temos que as linhas de H são linearmente independentes, devido ao bloco Idn-k .
Portanto geram um subespaço vetorial de dimensão n – k. Temos que a i-ésima linha de
k elementos n − k elementos
k elementos n − k elementos
linha de G, denotada por Gj ; 1 ≤ i ≤ k , será Gj = 0,0,...,1,0,..0,0, a j1 , a j2 ,..., a j,n −k
Posição j
H gera o dual C⊥
G gera o dual (C⊥)⊥
Conseqüentemente:
Proposição 2.5: Seja C um código linear e suponhamos que H seja uma matriz geradora
de C⊥. Temos então que: v ∈ C ⇔ Hvt = 0
1 0 1
1 1 0 1
1 1 1
Nesse caso, temos A = e –At = 0 1 1 1 e daí
0 1 1 1 1 1 0
1 1 0
1 0 0 | 1 1 0 1
H = 0 1 0 | 0 1 1 1 . Além disso,
0 0 1 | 1 1 1 0
1
0
1 0 0 1 1 0 1 1 1 + 1 + 1 1
t
H.v = 0 1 0 0 1 1 1 . 0 = 1 + 1 = 0 ∴v∉C
0 0 1 1 1 1 0 1 1 + 1 0
3x7
0
1 7x1
Vejamos:
Proposição 2.6: Seja H a matriz teste de paridade de um código C. Temos que o peso
de C é maior do que ou igual a s se, e somente se, quaisquer s –1 colunas de H são
linearmente independentes.
Demonstração:
(⇐) (*) Suponhamos que cada conjunto de s – 1 colunas de H é linearmente
independente.
Seja c ∈ C – {0} , c = (c1, c2, ...,cn) e sejam h1, h2, ..., hn as colunas de H.
Como H.ct = 0, temos c1h1 + c2h2 + .... + cnhn = 0 . Além disso, sabemos que w(c) é o
número de ci ≠ 0 ; i = 1,...,n. Logo se w(c) ≤ s – 1, teríamos uma combinação de s – 1 ou
menos colunas de H igual ao vetor nulo, com coeficientes ci não todos nulos. Isto é
um absurdo pois (*). Logo, w(c) ≥ s ∀ c ∈ C e, portanto w(C) ≥ s.
Considere por absurdo que H tenha pelo menos um conjunto com s – 1 colunas
linearmente dependentes, digamos hi1, hi2, ..., hi,s-1. Logo, existiria ci1,ci2,...., ci,s-1 ∈ F,
nem todos nulos , tais que ci1hi1 + ci2hi2 +....+ ci,s-1hi,s-1 = 0 o que é equivalente a H.ct =
0, com c = (0,..., ci1, 0,...., ci,s-1, 0,....,0) ∈ Fn . Nesse caso, c∈ C e w(c) = s – 1, o que é
um absurdo por (**)
Demonstração:
(⇐) (**) Todo conjunto com s –1 colunas de H é LI e existe um conjunto com s colunas
de H que é LD.
Da proposição anterior temos que w(C) ≥ s . Mas w(C) não pode ser estritamente
maior do que s, pois pela proposição anterior , todo conjunto com s colunas de H seria
linearmente independentes. Absurdo por (**) . Portanto , w(C) = s
Demonstração:
2.5 Decodificação
e=r–c
Demonstração
O problema que devemos resolver agora é determinar esse único vetor e a partir
t
de Hr .
Seja v ∈ Fn . Defina: v + C = { v + c : c∈ C}
Propriedades 2.8:
Demonstração:
2 – v + C = v’ + C ⇔ v – v’ ∈ C
3 – (v + C) ∩ (v’ + C) ≠ 0 ⇒ v + C = v’ + C
4 – ∪ ( v + C) = F n
v∈Fn
5 - |(v + C)| = |C| = qk
FAMAT em Revista - Número 06 - Maio de 2006 99
1 0 1 1
Exemplo: Seja C o código gerado sobre F2 pela matriz G = . Logo,
0 1 0 1
00 10 01 11
C = 0000, 1011, 0101, 1110 e as classes laterais segundo C são: qn-k = 24 – 2
= 4
classes. Como F24 tem 16 elementos, cada classe tem 4 elementos. As classes são as
seguintes:
Definição 2.9: Um vetor de peso mínimo numa classe lateral è chamado de elemento
líder dessa classe.
Demonstração:
d − 1 d − 1
Suponhamos u,v ∈ Fn com w (u ) ≤ e w ( v) ≤ . Se u e v são
2 2
u ∈ y + C ⇒ u = y + c1
elementos da mesma classe, então u – v ∈ C , pois v ∈ y + C ⇒ v = y + c 2 . Nesse
u − v = c − c ∈ C
1 2
d − 1 d − 1
caso, w (u − v) ≤ w (u ) − w ( v) ≤ + ≤ d − 1 . Como w(a) ≥ d , ∀ a ∈ C ≠ 0,
2 2
temos que, u – v = 0 ⇒ u = v.
Justificativa:
Exemplo: Considere o código linear definido sobre F2 com matriz teste de paridade
1 0 0 1 0 1
H = 0 1 0 1 1 0 . Note que 3 = n – k , como n = 6, então k = 3. Além disso,
0 0 1 0 1 1
2 a 2, as colunas de H são L.I. e existem três colunas 1, 2 e 4 L.D. Logo, d = 3 pois s – 1
= 2 e portanto, t = 1. Os vetores de F26 com w(u) ≤ 1 e suas respectivas síndromes estão
relacionados na tabela abaixo:
Líder Síndrome
000000 000
000001 101
000010 011
000100 110
001000 001
010000 010
100000 100
b) r = (111111) . Logo, Hrt = (111)t que não se encontra na tabela. Sendo assim, foi
cometido mais do que 1 erro na mensagem r.
Demonstração:
d − 1
No nosso caso t = = 1 . Dado c em F2n , temos que D(c,1) = 1 + n . Portanto,
2
∪ D(c,1) = [1 + n ].2 k
[ ]
= 1 + 2 m − 1 .2 n − m = 2 n e conseqüentemente ∪ D(c,1) = F
n
2 .
c∈C c∈C
102 FAMAT em Revista - Número 06 - Maio de 2006
CAPÍTULO III
1 1 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 0 L1 + L 2
1 0 0 1 0 0 0 1 0 L 2 + L1 0 1 0 1 1 0 0 1 0
G kxn = 1 1 1 0 0 0 0 0 1 L 3 + L1 0 0 1 0 1 0 0 0 1 ≈
0 1 0 1 0 1 0 0 0 ≈ 0 1 0 1 0 1 0 0 0 L4 + L2
0 0 1 1 0 0 1 0 0 0 0 1 1 0 0 1 0 0
1 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 1 0
0 1 0 1 1 0 0 1 0 0 1 0 1 1 0 0 1 0
≈ 0 0 1 0 1 0 0 0 1 ≈ 0 0 1 0 1 0 0 0 1 ≈
0 0 0 0 1 1 0 1 0 0 0 0 0 1 1 0 1 0 L 4 + L5
0 0 1 1 0 0 1 0 0 L 5 + L 3 0
0 0 1 1 0 1 0 1
FAMAT em Revista - Número 06 - Maio de 2006 103
1 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 1 0 L1 + L 4
0 1 0 1 1 0 0 1 0 0 1 0 1 1 0 0 1 0 L2 + L4
≈ 0 0 1 0 1 0 0 0 1 ≈ 0 0 1 0 1 0 0 0 1 ≈
0 0 0 1 0 1 1 1 1 0 0 0 1 0 1 1 1 1
0 0 0 1 1 0 1 0 1 L 5 + L 4 0
0 0 0 1 1 0 1 0
1 0 0 0 0 1 1 0 1 1 0 0 0 0 1 1 0 1
0 1 0 0 1 1 1 0 1 L 2 + L5 0 1 0 0 0 0 1 1 1
≈ 0 0 1 0 1 0 0 0 1 L3 + L5 0 0 1 0 0 1 0 1 1 = G (Id 5 | A 5 x 4 )
0 0 0 1 0 1 1 1 1 ≈ 0 0 0 1 0 1 1 1 1
0 0 0 0 1 1 0 1 0 0 0 0 0 1 1 0 1 0
1 0 1 1 1 | 1 0 0 0 1 0 1 1 1 1 0 0 0
( ) (
H = − A t | Id n −k = − A t | Id 4 ) 1
=
0
1
1
0
1
1
1
0
1
|
|
0
0
1
0
0
1
0 1
=
0 0
1
1
0
1
1
1
0
1
0
0
1
0
0
1
0
0
1 1 1 1 0 | 0 0 0 1 1 1 1 1 0 0 0 0 1
c.1)
c.2)
c.3)
Transmissão
Procura
pelo líder
na tabela
Síndrome H.rt
c=r-e e de r r
Código da
fonte
Usuário
FAMAT em Revista - Número 06 - Maio de 2006 105
c.1)
011001100 110010000 011111001 110010000
100100010 001100100 101101001 100110101
t
Agora pegaremos a palavra recebida r e faremos H . r para acharmos a síndrome
c=r–e
c = (100110101) – (100000000) = (000110101) que representa a letra S
c.2)
c=r–e
c = (001100000) – (000000100) = (001100100) que representa a letra E
c=r–e
c = (110010001) – (0000000001) = (110010000) que representa a letra A
c.3)
c=r–e
c = (111110011) – (0100000000) = (101110011) que representa a letra Q
c=r–e
c = (011011110) – (000001000) = (011010110) que representa a letra U
c=r–e
c = (001101100) – (000001000) = (001100100) que representa a letra E
REFERÊNCIAS BIBLIOGRÁFICAS
[B] BLAHUT, Richard E., Theory and Practice of Error Control Codes, Addison-
Wesley, Reading, Massachusetts, 1984.