UNIVERSIDADE ESTADUAL DE SANTA CRUZ
DEPARTAMENTO DE CIÊNCIAS EXATAS E
TECNOLÓGICAS
UMA INTRODUÇÃO À TEORIA DOS CÓDIGOS
CORRETORES DE ERROS
Liliane Xavier Neves
Ilhéus, Bahia
2003
Liliane Xavier Neves
UMA INTRODUÇÃO À TEORIA DOS CÓDIGOS
CORRETORES DE ERROS
Monografia apresentada à Disciplina Seminário em
Matemática do Departamento de Ciências Exatas
e Tecnológicas – DCET, da Universidade Estadual de Santa Cruz – UESC, como um dos prérequisitos para obtenção do grau de Bacharelado
em Matemática.
Ilhéus, Bahia
2003
Liliane Xavier Neves
UMA INTRODUÇÃO À TEORIA DOS CÓDIGOS
CORRETORES DE ERROS
Monografia apresentada, julgada e aprovada pelo Corpo Docente do
Departamento de Ciências Exatas e Tecnológicas da Universidade
Estadual de Santa Cruz como parte dos requisitos de conclusão do curso
de Bacharelado em Matemática.
Jaime Edmundo Apaza Rodriguez, Dr.
Orientador
Eurivalda Ribeiro dos Santos Santana, Msc.
José Reis Damaceno Santos, Msc.
Ilhéus, Bahia
2003
A meus pais, minhas irmãs pelo apoio e compreensão.
Agradeço de coração por todo amor, carinho e
confiança que depositaram em mim.
AGRADECIMENTOS
Agradeço a Deus, fonte que me abasteceu de fé para nunca desistir.
Agradeço também ao meu orientador e amigo Jaime Edmundo Apaza Rodrigues pelas palavras de incentivo e por me fazer descobrir uma área tão
fascinante da Matemática, área essa pela qual me apaixonei.
RESUMO
Neste trabalho apresentamos uma introdução à teoria dos Códigos Corretores de Erros, que é um campo da chamada matemática aplicada muito
usada hoje em dia, basicamente na área de transmissão de informação (em
qualquer uma de suas modalidades), e que usa fortemente conceitos e resultados abstratos da matemática pura (especialmente da álgebra abstrata).
São apresentados alguns tipos de códigos como os lineares, os de Hamming,
os de Reed-Solomon, os cı́clicos e algumas das suas propriedades.
ABSTRACT
In this monograph we are studying an introduction to error corrector
theory that is an field the mathematic applied very used today, principally
in the information transmission (in different forms) and where we are used
notions and results of pure mathematic, especially of abstract algebra. We
are studying some kinds of codes as soon linear codes, Hamming codes,
Reed-Solomon codes, ciclic codes and some properties.
Índice
1 Introdução
2
2 Códigos Corretores de Erros
5
3 Códigos Lineares
8
3.1
Códigos Lineares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8
3.2
Matriz Geradora de um Código . . . . . . . . . . . . . . . . . . . . . . . . 12
3.3
Códigos Duais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3.4
Exemplos de Códigos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.5
Decodificação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
4 Códigos Cı́clicos
30
4.1
Códigos Cı́clicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
4.2
Decodificação em códigos cı́clicos . . . . . . . . . . . . . . . . . . . . . . . 36
Bibliografia
40
2
1
Introdução
A Teoria dos Códigos Corretores de Erros foi fundada pelo matemático Claude Eloowd
Shannon, num trabalho publicado em 1948. Inicialmente, os maiores interessados nessa
teoria foram os matemáticos que a desenvolveram consideravelmente nas décadas de 50 e
60. A partir da década de 70, com as pesquisas espaciais e a grande popularização dos
computadores, essa teoria começou a interessar também aos engenheiros.
Hoje, os códigos corretores de erros participam do nosso cotidiano de inúmeras formas,
estando presentes, por exemplo, sempre que fazemos uso de informações digitalizadas,
tais como assistir a um programa de televisão, falar ao telefone, ouvir um CD de música,
assistir a um filme em DVD, mandar um recado para alguém via pager ou navegar pela
internet.
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.
Façamos dois exemplos para ilustrar os princı́pios dessa teoria.
1) Suponhamos que temos um robô que se move sobre um tabuleiro quadriculado, de
modo que, ao darmos um dos comandos (Leste, Oeste, Norte ou Sul), o robô se desloca
do centro de uma casa para o centro de uma casa contı́gua indicada pelo comando.
Os quatro comandos acima podem ser codificados como elementos do conjunto {0, 1} ×
{0, 1}, como se segue:
Leste −→ 00
N orte −→ 10
Oeste −→ 01
Sul −→ 11
O código do lado direito da tabela é chamado código da fonte. Suponhamos, agora,
que esses pares ordenados devam ser transmitidos via rádio e que o sinal no caminho sofra
interferências. Imaginemos que a mensagem 00 possa, na chegada, ser recebida como 01,
o que faria com que o robô, em vez de ir para Leste, fosse para Oeste. O que se faz, então,
é recodificar as palavras, de modo a introduzir redundâncias que permitam detectar e
3
corrigir erros. Podemos, por exemplo, modificar o nosso código como se segue:
00 −→ 00000
01 −→ 01011
10 −→ 10110
11 −→ 11101
Nessa recodificação, as duas primeiras posições reproduzem o código da fonte, enquanto
que as três posições restantes são redundâncias introduzidas. O novo código introduzido
na recodificação é chamado de código de canal. Suponhamos que se tenha introduzido
um erro ao transmitirmos, por exemplo, a palavra 10110, de modo que a mensagem recebida seja 11110. Comparando essa mensagem com as palavras do código, notamos que
não lhe pertence e, portanto, detectamos erros. A palavra do código mais próxima da
referida mensagem (a que tem menor número de componentes diferentes) é 10110, que é
precisamente a palavra transmitida.
O procedimento acima pode ser esquematizado como mostra a figura abaixo.
[fonte] −→ [codificador da fonte] −→ [codificador de canal]−→ [canal]
↓
[usuário]←−[decodificador da fonte]←−[decodificador de canal]
2) Suponhamos que queremos enviar mensagens (a, b, c) com a, b, c ∈ {0, 1} e digamos
que o nosso canal de comunicações causa um erro em cada seis dı́gitos consecutivos. Se
enviarmos a mensagem pura o receptor vai receber uma mensagem errada a cada duas
enviadas. outra tentativa é repetir cada mensagem, introduzindo redundância, o que não
vale a pena, pois se o receptor recebe, por exemplo, (a, b, c)(a´, b, c), a 6= a0 , como ele
vai saber se o primeiro dı́gito da mensagem é a ou a´? Se repetirmos a mensagem três
vezes, então certamente o receptor saberá qual é a mensagem: (a, b, c)(a´, b, c)(a, b, c).
Para isso tivemos que introduzir seis dı́gitos redundantes em cada mensagem.
O estudo da Teoria dos Códigos está intimamente ligado a uma série de tópicos da
matemática discreta, tais como exponenciais, teoria de grafos, assim como tópicos diversos
como teoria de informação, criptografia e álgebra computacional. O assunto, além de ser
intrinsecamente interessante, tem a virtude de mesclar conceitos e técnicas importantes de
Álgebra Abstrata com aplicações imediatas na vida real, o que mostra como a sofisticação
4
tecnológica torna cada vez mais difusa a fronteira entre a Matemática Pura e a Matemática
Aplicada.
5
2
Códigos Corretores de Erros
Apresento algumas definições que são importantes para o bom entendimento da Teoria
dos códigos corretores de erros:
Definição 1 O alfabeto A é um conjunto finito. Em alguns livros a notação utilizada
para o alfabeto é Fq, onde q é o número de elementos de F.
Definição 2 É uma combinação de elementos do alfabeto.
x = (x1 , x2 , · · · , xn )/xi ∈ A; 1 ≤ i ≤ n.
Definição 3 C ⊂ An /C = {x = (x1 , x2 , · · · , xn ) : xi ∈ A}, onde cada x ∈ C é uma
palavra, ou seja, é uma combinação de elementos do alfabeto e An é um espaço vetorial
com n ∈ N.
Convida-se o leitor a pensar na Lı́ngua Portuguesa como um código. Assim, o alfabeto
definido seria um conjunto, onde seus elementos são letras, e a palavra, uma combinação
delas. É claro que o código será um conjunto formado por essas palavras. Pode-se dizer que
esse é um código corretor de erros, pois, imagine que se escrevermos uma palavra, produzimos a sequência de letras “gatho”. Como este não é um elemento da lı́ngua portuguesa,
que é o nosso código, percebe-se imediatamente que houve erro; e nesse caso a correção é
possı́vel, pois a palavra do nosso código que mais se assemelha a “gatho”é “gato”. Agora
se a palavra “gato”fosse erroneamente escrita como “rato”, ou como “pato”, ou ainda
como “galo”, não detectarı́amos o erro, porque todas são palavras da Lı́ngua Portuguesa.
Então a falha deste código está na proximidade das palavras.
Um modo de medir a distância entre palavras em An é apresentado a seguir.
Definição 4 Dados dois elementos u, v ∈ An , a distância de Hamming entre u e v é
6
definida como
d(u, v) =| {i; ui 6= vi , 1 ≤ i ≤ n} |
Por exemplo, em {0, 1}3 , temos
d(001, 111) = 2
d(000, 111) = 3
d(100, 110) = 1
Como no estudo das métricas estudadas em Topologia, a métrica de Hamming possui as
seguintes propriedades:
Dados u, v, w ∈ An , temos que
i) d(u, v) ≥ 0
Prova: Se u = v, então d(u, v) = d((u1 , ..., un ), (v1 , ..., vn )) = 0, pois u1 = v1 , ..., un =
vn . Se u 6= v então d(u, v) = d((u1 , ..., un ), (v1 , ..., vn )) = | i |> 0, pois 1 ≤ i ≤ n.
ii) d(u, v) = d(v, u)
Prova: d(u, v) = d((u1 , ..., un ), (v1 , ..., vn ))=| {i; ui 6= vi , 1 ≤ i ≤ n} | = | {i; vi 6=
ui , 1 ≤ i ≤ n} |=d((v1 , ..., vn ), (u1 , ..., un ))= d(v,u).
iii) d(u, v) ≤ d(u, w) + d(w, v)
Prova: A contribuição das i-ésimas coordenadas de u e v para d(u, v) é igual a zero
se ui = vi , e igual a um se ui 6= vi . No caso em que a contribuição é zero, certamente a
contribuição das i-ésimas coordenadas a d(u, v) é menor ou igual a das i-ésimas coordenadas a d(u, w) + d(w, v)(= 0, 1 ou 2).
No outro caso, temos que ui 6= vi e, portanto, não podemos ter ui = wi e wi = vi . Conseqüentemente, a contribuição das i-ésimas coordenadas a d(u, w) + d(w, v) é maior ou
igual a 1, que é a contribuição das i-ésimas coordenadas a d(u, v).
Definição 5 Dados um elemento a ∈ An e um número real t > 0, definimos Disco e
Esfera, respectivamente, como:
D(a, t) = {u ∈ An ; d(u, a) ≤ t}
S(a, t) = {u ∈ An ; d(u, a) = t}
7
Definição 6 Seja C um código. A distância mı́nima de C é o número
d = min{d(u, v); u, v ∈ C e u 6= v}
Lema: Seja C um código com distância mı́nima d. Se c e c´são palavras distintas de C,
então:
D(c, k) ∩ D(c0 , k) = ∅
Prova: De fato, se x pertencesse a D(c, k) ∩ D(c0 , k), terı́amos d(x, c) ≤ k e d(x, c0 ) ≤ k,
e portanto, pela simetria e pela desigualdade triangular,
d(c, c0 ) ≤ d(c, x) + d(x, c0 ) ≤ 2k ≤ d − 1,
absurdo, pois d(c, c0 ) ≥ d.
Teorema 1 Seja C um código com distância mı́nima d. Então C pode corrigir até k =
[ d−1
] erros e detectar até d − 1 erros.
2
Por exemplo, no código do robô, a distância mı́nima é d = 3, então, pelo teorema acima,
é possı́vel corrigir até k = [ d−1
] = 1 erro e detectar d − 1 = 2 erros.
2
A demonstração deste teorema será feito depois da definição de “peso de um código” no
capı́tulo 3.
]. O código
Definição 7 Seja C ⊂ An um código com distância mı́nima d e seja k = [ d−1
2
C será dito perfeito se
[
D(c, k) = An
c∈C
Exemplo 1 O código do robô, tão utilizado como exemplo neste trabalho, não é perfeito.
De fato,
C = {00000, 01011, 10110, 11101}
d−1
3−1
k=[
]=[
]=1
2
2
D(c, k) = D(c, 1) = {u ∈ C/d(u, c) ≤ 1} = ∅, ∀ c, u ∈ C,
pois d = min{d(u, v); u, v ∈ C} = 3.
8
3
Códigos Lineares
A classe dos códigos lineares é a classe de códigos mais utilizada na prática. No
capı́tulo 2 vimos que um código C é um subconjunto de um espaço vetorial An , onde A
é um conjunto finito denominado alfabeto. Da mesma forma, um código linear C é um
subconjunto de um espaço vetorial, e mais do que isto, C é um subespaço de um espaço
vetorial An , onde A é um corpo finito.
3.1
Códigos Lineares
Definição 8 Sejam K um corpo finito com q elementos, n um número natural e K n um
espaço vetorial de dimensão n. Um código C ⊂ K n será chamado de código linear se for
um subespaço de K n .
Conhecendo a Álgebra Linear se pode, desde já, observar que os códigos lineares dispõem
de várias propriedades importantes da Matemática, e que serão de grande utilidade para
o desenvolvimento da Teoria dos Códigos. O código do robô citado no capı́tulo anterior,
por exemplo, é um código linear. O alfabeto A2 = {0, 1} é o corpo de Galois, bastante
conhecido pelos matemáticos, e o código utilizado nesse exemplo é subespaço vetorial de
A52 , imagem da transformação linear
T : A22 −→ A52
(x1 , x2 ) 7−→ (x1 , x2 , x1 , x1 + x2 , x2 )
Como todo código linear é um subespaço de um espaço vetorial de dimensão finita, então,
por definição, ele será um espaço vetorial de dimensão finita. Agora, suponha que a
dimensão de um código linear C seja k e que v1 , v2 , ..., vk seja uma de suas bases, portanto
pode-se escrever cada elemento de C de modo único, como uma combinação linear de
9
v1 , v2 , ..., vk . Daı́,
λ1 υ1 + ... + λk υk = υ =
k
X
λi υi
i=1
onde υ C e λi K, i=1, ..., k.
Temos também que a cardinalidade de C é dada por
M = |C| = q k
e que sua dimensão pode ser escrita da seguinte forma:
dimk C = k = logq q k = logq M
Dessa forma, se consegue uma nova forma de calcular a dimensão de um espaço vetorial
C.
Definição 9 Dado x K n , define-se o peso de x como sendo o número inteiro
ω(x) := |{i : xi 6= 0}|
Em outras palavras,
ω(x) = d(x, 0)
onde d representa a métrica de Hamming.
Definição 10 O peso de um código linear C é o inteiro
ω(C) := min{ω(x) : x C − {0}}
Neste caso o zero é excluı́do porque não faz sentido calcular a distância de um vetor a ele
mesmo, já que este cálculo daria zero.
Proposição 1 Seja C ⊂ K n um código linear com distância mı́nima d. Temos que
i) ∀x, y K n , d(x, y) = ω(x − y)
ii) d = ω(C)
Demonstração:
i) Sejam x, y K n , então d(x, y) = |{i : xi 6= yi , 1 ≤ i ≤ n}| = |{i : xi − yi 6= 0, 1 ≤ i ≤ n}|
= ω(x − y).
ii)Seja d a distância mı́nima de um código linear C, então, por definição temos.
d = min{d(x, y) : x, y C e x 6= y}
10
Considere o fato de que z = x − y ∈ C − {0} e d(x, y) = ω(x − y) = ω(z). Dessa forma,
d = min{ω(z) : z C − 0} = ω(C).
A partir dos resultados dessa proposição, nota-se que, em códigos lineares com M
elementos pode-se calcular a distância mı́nima d a partir de M - 1 cálculos de distâncias,
o que é muito trabalhoso se for considerado um código muito grande. Mesmo assim
teremos que desenvolver um outro método mais rápido e eficiente para determinar a
distância mı́nima de um código.
Pela parte (ii) da proposição 1, a distância mı́nima de um código linear C será também
chamada de peso do código C.
Agora que já foi definido o peso de um código linear C, já pode ser demonstrado o
Teorema 1 da introdução. Mas para isso será reescrito o teorema mudando a distância
mı́nima “d”pelo peso de C, ω(C), pois, como vimos na proposição acima d = ω(C).
Teorema 2 Seja C um código de peso ω(C) então C corrige [ ω(C)−1
] erros.
2
Prova: Seja ` =
d−1
2
então 2` + 1 ≤ d. Suponha que C não corrija ` erros e seja y Anq
tal que existam x1 , x2 C, x1 6= x2 com d(xi , y) ≤ `, i=1, 2. Pela propriedade (iii) de
distância de Hamming temos d(x1 , x2 ) ≤ d(x1 , y) + d(y, x2 ) ≤ 2`. Por outro lado como
x1 6= x2 , pela definição de d temos d(x1 , x2 ) ≥ d ≥ 2` + 1, contradição.
Das definições de Álgebra Linear, se pode descrever subespaços vetoriais de duas maneiras; uma como imagem e outra como núcleo de transformações lineares. Esse resultado
significa um salto muito grande na teoria dos códigos corretores, pois antes disso, a informação que se tinha tı́nhamos era a de que um código linear é um subespaço de um
espaço vetorial e essa informação não garante grandes resultados. Mas se pode escrever um código linear como imagem de uma transformação linear ou como o núcleo de
uma transformação, a partir disso, tudo fica mais concreto, pois tem-se agora como fazer
cálculos e o estudo da teoria dos códigos pode avançar muito mais.
Agora, obtêm-se a representação de um código linear C como imagem de uma transformação linear:
Escolha uma base v1 , ..., vn de C e considere a aplicação linear
T : Kk → Kn
x = (x1 , ..., xk ) 7−→ x1 v1 + ... + xk vk
11
T é uma transformação linear injetora.
De fato, sejam x, y K k , então
T (x) = T (y) =⇒ T (x1 , ..., xk ) = T (y1 , ..., yk )
=⇒ x1 v1 + ... + xk vk = y1 v1 + ... + yk vk
(x1 − y1 )v1 + ... + (xk − yk )vk = 0
=⇒ x1 − y1 = 0 =⇒ x1 = y1
..
.
xk − yk = 0 =⇒ xk = yk
Como v1 , ..., vk é base de C, logo é LI. Portanto (x1 , ..., xk ) = (y1 , ..., yk ) ⇒ x = y.
Então pode-se observar que a imagem de T é C, ou em sı́mbolos,
Im(T ) = C
Porém nessa representação é difı́cil decidir se um dado elemento v de K n pertence ou não
a C, pois, para tal é necessário resolver o sistema de n equações e k incógnitas x1 , ..., xk
abaixo
x1 v1 + ... + xk vk
A outra maneira de descrever um código C é através do núcleo de uma transformação
linear. Tome um subespaço C 0 de K n complementar de C, isto é,
C ⊕ C0 = Kn
e considere a aplicação linear
H : C ⊕ C 0 −→ K n−k
u ⊕ v 7−→ v; u Ce v C 0
Se observarmos o núcleo da aplicação H, temos:
Ker(H) = {u ⊕ v : H(u ⊕ v) = v = 0} = {u; u ∈ C}
Portanto o núcleo dessa transformação linear é precisamente C.
12
Dessa forma para determinar se um certo elemento v ∈ K n pertence ou não a C, basta
verificar se H(v) é ou não o vetor nulo de K n−k .
Exemplo 2 Considere o corpo finito com três elementos F3 = {0, 1, 2} e seja C ⊂ F34 o
código de dimensão 2 gerado pelos vetores v1 = 1011 e v2 = 0112. Esse código possui 9
(q k = 32 ) elementos. Nós podemos representar C da seguinte forma
x1 v1 + x2 v2
variando x1 e x2 em F3 ou como núcleo da transformação linear
H : F34 → F32
(x1 , ..., x4 ) 7−→ (2x1 + 2x2 + x3 , 2x1 + x2 + x4 )
Definição 11 Seja K um corpo finito. Dois códigos lineares C e C’são linearmente equivalentes se existir uma isometria linear T : K n −→ K n tal que T (C) = C 0 .
Os resultados obtidos através desta definição são usados como definição de códigos lineares
equivalentes. Um dos resultados é o que segue:
Dois códigos lineares são linearmente equivalentes se, e somente se, cada um deles
pode ser obtido do outro mediante uma sequência de operações do tipo:
(i) Multiplicação dos elementos numa dada posição fixa por um escalar não nulo em todas
as palavras.
(ii) Permutação das posições de todas as palavras do código, mediante uma permutação
fixa de {1, 2, ...,n}.
3.2
Matriz Geradora de um Código
Sejam K um corpo finito com q elementos e C ⊂ K n um código linear. Chama-se
de parâmetros do código linear C à terna de inteiros (n, k, d). Note que o número de
elementos de C é igual a q k .
Seja β = {v1 , ..., vk } uma base de C e considere a matriz G, cujas linhas são os vetores
vi = (vi1 , ..., vin ), i = 1, ..., k, isto é,
  

v1
v11 v12 . . . v1n
.  .
..
.. 
..  =  ..
G=
.
. 
  

vk
vk1 vk2 . . . vkn
13
A matriz G é chamada de matriz geradora de C associada à base β.
Considere a transformação linear definida por
T : K k −→ K n
x 7−→ xG
Se x = (x1 , ..., xk ), temos que
T (x) = xG = x1 v1 + ... + xk vk
Logo T (K k ) = C. Pode então, se considerar K k como sendo o código da fonte, C, o código
de canal e a transformação T, uma codificação. Note que a matriz G depende da escolha
da base. E lembrando que uma base de um espaço vetorial pode ser obtida de uma outra
qualquer através de sequências de operações como permutação de dois elementos da base,
multiplicação de um elemento da base por um escalar não nulo ou ainda, substituição de
um vetor da base por ele mesmo somado com um múltiplo escalar de outro vetor da base.
Observa-se, então que pode-se construir códigos a partir de matrizes geradoras G.
Para isso, basta tomar uma matriz cujas linhas são linearmente independentes e definir
um código como sendo a imagem da transformação linear
T : K k −→ K n
x 7−→ xG
Exemplo 3 Tome K = F2 e seja


1 0 1 0 1


.
G=
1
1
0
1
0


1 1 1 1 1
Considerando a transformação linear definida por
T : F23 −→ F25
x 7−→ xG
obtêm-se um código C em F25 , imagem de T. A palavra 101 do código da fonte, por
exemplo, é codificada como 01010.
Suponha agora que seja dada a palavra 10101 do código, e decodificá-la, isto é, achar a
14
palavra x de F23 da qual ela se origina por meio de T. Significa, então, resolver o sistema:
(x1 , x2 , x3 )G = (10101),
ou seja,


x1 + x2 + x3 = 1






x2 + x3 = 0



x1 + x3 = 1





x2 + x3 = 0






x1 + x3 = 1
cuja solução é x1 = 1, x3 = 0 e x2 = 0.
O sistema de equações do exemplo, em particular, foi fácil de resolver, mas, em geral,
dada uma matriz G mais complexa, a resolução do sistema de equações associado pode
ser muito mais trabalhosa. Entretanto, efetuando operações sobre as linhas de G, pode-se
colocar G na forma


1 0 0 0 0


.
G0 = 
0
1
0
1
0


0 0 1 0 1
Note que

xG0 = x1 x2

1
0
0
0
0

  = x1 x2 x3 x2 x3
x3 
0
1
0
1
0


0 0 1 0 1
e, portanto, obtém-se o vetor x tomando apenas as três primeiras componentes do vetor
a ser decodificado. Logo, a palavra (10101) é facilmente decodificada como (101).
Definição 12 Uma matriz G geradora de um código C está na forma padrão se tivermos
G = (Idk |A)
onde Idk é a matriz identidade k × k e A, uma matriz k × (n − k).
Mas mesmo com um código C, nem sempre é possı́vel achar uma matriz geradora de
C na forma padrão. Por exemplo, o código em F25 de matriz geradora
!
0 0 1 0 1
0 0 0 1 1
15
nunca poderá ter uma matriz na forma padrão, pois não temos como colocá-la na forma
(Idk |A). No entanto, efetuando também permutações das colunas de G, podemos obter
a matriz
!
1 0 0 0 1
,
0 1 0 0 1
que é a matriz geradora na forma padrão de um código C’ equivalente a C.
De modo geral, efetuando também sequências de operações sobre a matriz geradora
G de um código linear C, como permutação de duas colunas ou multiplicação de uma
coluna por um escalar não nulo, obtemos uma matriz G’ de um código C’ equivalente a
C. Note que efetuar essas operações numa base de C implica efetuá-las em todas as palavras de C, pois todas elas são escritas como combinação linear dos elementos da base de C.
Teorema 3 Dado um código C, existe um código equivalente C’ com matriz geradora na
forma padrão.
Demonstração: Seja G uma matriz geradora de C. Mostraremos que com a seqüência de
operações listadas abaixo, podemos colocar G na forma padrão.
(i) Permutação de duas linhas.
(ii) Multiplicação de uma linha por um escalar não nulo.
(iii) Adição de um múltiplo escalar de uma linha a outra.
(iv) Permutação de duas colunas.
Suponhamos


g11 g12 . . . g1n
 .
..
.. 
.
G=
.
. 
 .
.
gk1 gk2 . . . gkn
Como a primeira linha de G não é nula, pois os vetores linhas de G são linearmente
independentes, por meio de (iv), podemos supor g11 6= 0. Agora, multiplicando a pri−1
meira linha por g11
, podemos por 1 no lugar de g11 (operação (ii)). Somando à segunda,
terceira, etc. linhas, respectivamente, a primeira linha multiplicada respectivamente por
16
(−1)g21 , (−1)g31 , etc.(operações (iii)),

1

0

.
 ..

0
obtemos uma matriz

b12 . . . b1n

b22 . . . b2n 

.
..
.. 
.
. 

bk2 . . . bkn
Agora, na segunda linha dessa matriz, temos certamente um elemento não nulo que,
por meio de uma operação(iv), pode ser colocado na segunda linha e segunda coluna.
Multiplicando a segunda linha pelo inverso desse elemento, a matriz se transforma em


1 c12 c13 . . . c1n


0 1 c

.
.
.
c
23
2n 



0 c32 c33 . . . c3n  .


 .. ..

.
.
.
.
. .

.
.


0 ck2 ck3 . . . ckn
Novamente, usando as operações (iii), obtemos a

1 0 d13 . . .

0 1 d
23 . . .


0 0 d33 . . .

 .. .. ..
. . .

matriz

d1n

d2n 


d3n 

.. 
. 

0 0 dk3 . . . dkn
e assim sucessivamente, até encontrarmos uma matriz na forma padrão
G0 = (Idk |A).
Sejam u = (u1 , ..., un ) e v = (v1 , ..., vn ) elementos de K n , define-se o produto interno
de u e v como sendo
hu, vi = u1 v1 + ... + un vn .
Essa operação possui as propriedades usuais de um produto interno:
(i) Simétrica
hu, vi = hv, ui
(ii)Bilinear
hu + λw, vi = hu, vi + λhw, vi, ∀λK.
17
3.3
Códigos Duais
Seja C ⊂ K n um código linear. Chamamos de Código Dual do código C o conjunto
C ⊥ = {vK n : hv, ui = 0, ∀u ∈ C}.
Pela definição podemos observar que C ⊥ é ortogonal a C.
Lema 1: Se C ⊂ K n é um código linear, com matriz geradora G, então
(i) C ⊥ é um subespaço vetorial de K n ;
(ii)x ∈ C ⊥ ⇐⇒ Gxt = 0.
Prova:
(i) Sejam dados u, v ∈ C ⊥ e λ ∈ K. Temos, para todo x ∈ C, que
hu + λv, xi = hu, xi + λhv, xi = 0 + λ0 = 0
Portanto, u + λv ∈ C ⊥ e C ⊥ é um subespaço vetorial de K n ;
(ii) x ∈ C ⊥ se, e somente se x é ortogonal a u, ∀u ∈ C se, e somente se x é ortogonal a
todos os elementos de uma base de C, o que é equivalente a dizer que Gxt = 0, pois as
linhas de G são uma base de C.
Como C ⊥ é um subespaço vetorial de K n , como foi demonstrado acima, podemos
concluir que um código dual é também um código linear.
Proposição 2 Seja C ⊂ K n um código de dimensão k com matriz geradora G = (Idk |
A), na forma padrão. Então
(i) dim C ⊥ = n − k.
(ii) H = (−At | Idn−k ) é uma matriz geradora de C ⊥ .
Prova:
(i) Pelo Lema 1, x = (x1 , ..., xn ) pertence a C ⊥ se, e somente se, Gxt = 0. Como G está
na forma padrão, isso equivale a ter
 


x1
xk−1
.


 ..  = −A  ... 
 


xk
xn
Portanto, C ⊥ possui q n−k elementos, que são justamente as possı́veis escolhas arbitrárias
de xk−1 , ..., xn . Logo, C ⊥ tem dimensão n − k.
(ii) É evidente que as linhas de H são linearmente independentes(por causa do bloco
18
Idn−k ), portanto geram um subespaço vetorial de dimensão n - k. Como as linhas de H
são ortogonais às linhas de G, temos que o espaço gerado pelas linhas de H está contido
em C ⊥ ; e como esses dois subespaços têm a mesma dimensão, eles coincidem, provando
assim que H = (−At |Idn−k )é uma matriz geradora de C ⊥ .
Lema 2: Seja C um código linear em K n . Para toda permutação σ de {1, ..., n}, para
todo C ∈ K∗ e para todo j = 1, ..., n temos que
(i) (Tσ (C))⊥ = Tσ (C ⊥ )
(ii) (Tcj (C))⊥ = Tcj−1 (C ⊥ )
Prova:
(i) Seja x ∈ (Tσ (C))⊥ , então hx, ui = 0, ∀u ∈ Tσ (C). Assim, hx, vi = 0, ∀v ∈ B, sendo B
uma base do código Tσ (C). Portanto Gxt = 0, onde G é a matriz geradora de Tσ (C) e
suas linhas são uma base de Tσ (C).
(ii) Segue de (i).
Proposição 3 Sejam C e D dois códigos lineares em K n . Se C e D são linearmente
equivalentes, então C ⊥ e D⊥ são linearmente equivalentes.
Prova: Para essa demonstração precisaremos do seguinte resultado:
Sejam C e C’ dois códigos em An . Temos que C e C’ são equivalentes se, e somente
se, existem uma permutação π de {1, ..., n} e bijeções f1 , ..., fn de A tais que
C 0 = {(fπ(1) (xπ(1) ), ..., fπ(n) (xπ(n) )) : (x1 , ..., xn ) ∈ C}.
Se C e D são linearmente equivalentes existem uma permutação σ de {1, 2, ..., n} e elementos c1 , ..., cn ∈ K ∗ tais que
D = Tσ ◦ Tc11 ◦ ... ◦ Tcnn (C).
Daı́, levando em conta o lema 2, se segue o resultado, pois
D⊥ = (Tσ ◦ Tc11 ◦ ... ◦ Tcnn (C))⊥ = Tσ ◦ Tc1−1 ◦ ... ◦ Tcn−1
(C ⊥ ).
n
1
Corolário 1 Se D é um código linear em K n de dimensão k, então D⊥ é um código de
dimensão n − k.
Prova: O código D é equivalente a um código C, também de dimensão k, com matriz
geradora na forma padrão e, portanto, segue que dimC ⊥ = n − k. Pela Proposição 2,
temos que D⊥ é equivalente a C ⊥ e, portanto, também tem dimensão n − k.
19
Lema 3: Suponha que C seja um código de dimensão k em K n com matriz geradora
G. Uma matriz H de ordem (n − k) × n, com coeficientes em K e com linhas linearmente
independentes, é uma matriz geradora de C ⊥ se, e somente se,
G · H t = 0.
Prova: As linhas de H geram um subespaço vetorial de K n de dimensão n - k, portanto,
igual a dimensão de C ⊥ . Por outro lado, representando por h1 , ..., hn−k e por g1 , ..., g k ,
respectivamente, as linhas de H e de G, temos que
(G · H t )i,j = hgi , hj i.
Portanto, G · H t = 0 equivale a dizer que todos os vetores do subespaço gerado pelas
linhas de H estão em C ⊥ . Por outro lado, esse subespaço tem a mesma dimensão de C ⊥ ,
logo,
G · H t = 0 ⇐⇒ C ⊥
é gerado pelas linhas de H.
Corolário 2 (C ⊥ )⊥ = C.
Prova: Sejam G e H respectivamente matrizes geradoras de C e C ⊥ . Logo, G · H t = 0.
Tomando transpostas nessa última igualdade, temos que H · Gt = 0, logo, G é matriz
geradora de (C ⊥ )⊥ , daı́ (C ⊥ )⊥ = C.
Proposição 4 Seja C um código linear e suponhamos que H seja uma matriz geradora
de C ⊥ . Temos então que
v ∈ C ⇐⇒ Hv t = 0.
Prova: Temos, pelo corolário acima e pelo Lema 1(ii), v ∈ C se, e somente se, v ∈ (C ⊥ )⊥
se, e somente se, Hv t = 0.
A proposição 4 caracteriza os elementos de um código C por uma condição de anulamento. A matriz geradora H de C ⊥ é chamada de matriz teste de paridade de C.
Para verificar se um determinado vetor v em K n pertence ou não a um código C com matriz
geradora G, é preciso verificar se o sistema de n equações com k incógnitas x = (x1 , ..., xk ),
dado por
xG = v,
20
admite solução. Como já observamos nos resultados anteriores, essa questão requer um
custo computacional muito elevado para ser respondida. Mas, com a matriz teste de
paridade H, a solução pode ser encontrada bem mais rapidamente verificando se é nulo o
vetor Hv t . A esse vetor Hv t , chamamos de sı́ndrome de v.
Exemplo 4 Seja dado o código C sobre F2 com

1 0 0 1

G=
0 1 0 0
0 0 1 0
matriz geradora

1 1

1 1
.
1 0
Como G está na forma padrão, é fácil calcular uma matriz teste de paridade H. Então,
temos que

1 0 0 1 0 0



H = 1 1 1 0 1 0
.
1 1 0 0 0 1

Dados v = (100111) e v 0 = (010101), como
 
0



Hv t = 
0
 
0
e
 
1
 
0 t

H(v ) = 
1 6= 0,
0
temos que v ∈ C e v 0 6∈ C.
Proposição 5 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.
Prova: Suponhamos que cada cada conjunto de s - 1 colunas de H é linearmente independente. Seja c = (c1 , ..., cn ) uma palavra não nula de C, e sejam h1 , ..., hn as colunas de H.
Como Hct = 0, temos que
0 = H · ct =
X
ci hi .
Visto que ω(c) é o número de componentes não nulas de c, segue que se ω(c) ≤ s − 1,
terı́amos, pela igualdade acima, uma combinação nula de um número t, com 1 ≤ t ≤
s − 1, de colunas de H, o que é contraditório. Logo, ω(c) ≥ s e, portanto, ω(C) ≥ s.
21
Reciprocamente, suponhamos que ω(C) ≥ s. Suponhamos também, por absurdo, que H
tenha s - 1 colunas linearmente dependentes, digamos hi1 , hi2 , ..., his−1 . Logo, existiriam
ci1 , ..., cis−1 , no corpo, nem todos nulos, tais que
ci1 hi1 + ... + cis−1 his−1 = 0.
Portanto, c = (0, ..., ci1 , 0, ..., cis−1 , 0, ..., 0) ∈ C e conseqüentemente, ω(c) ≤ s − 1 < s, o
que seria um absurdo.
Teorema 4 Seja H uma matriz teste de paridade de um código C. Temos que o peso de
C é igual a s se, e somente se, quaisquer s - 1 colunas de H são linearmente independentes
e existem s colunas de H linearmente dependentes.
Prova: Suponhamos que ω(C) = s, logo, todo conjunto de s -1 colunas de H é linearmente
independente. Por outro lado, existem s colunas de H linearmente dependentes, pois, caso
contrário, pela proposição 4, terı́amos ω(C) ≥ s + 1.
Reciprocamente, suponhamos que todo conjunto de s-1 vetores colunas de H é linearmente
independente e existem s colunas linearmente dependentes. Logo, da proposição 5, temos
que ω(C) ≥ s. Mas ω(C) não pode ser maior do que s, pois, neste caso, novamente a
proposição 5 nos diria que todo conjunto com s colunas de H é linearmnete independente,
o que é uma contradição.
Corolário 3 (Cota de Singleton) Os parâmetros (n, k, d) de um código linear satisfazem
à desigualdade
d ≤ n − k + 1.
Prova: Se H é uma matriz teste de paridade, ela tem posto n - k. Como, pelo teorema 2,
d - 1 é menor ou igual ao posto de H. Portanto, d ≤ n − k + 1.
3.4
Exemplos de Códigos
Códigos de Hamming:Um código de Hamming de ordem m sobre F2 é um código
com matriz teste de paridade Hm de ordem m × n, cujas colunas são os elementos de
F2m − {0} numa ordem qualquer.
Temos que o comprimento de um código de Hamming de ordem m é n = 2m − 1 e a
sua dimensão é k = n − m= 2m − m − 1.
22
Proposição 6 Todo código de Hamming é perfeito.
Prova: Como d=3, temos que k = [ d−1
]=[ 3−1
] = 1.
2
2
Dado c em F2n , temos que:
|D(c, 1)| =
1
X
n
!
(q − 1)i =
!
(2 − 1)0 +
n
!
(2 − 1)1 = 1 +
1
0
i
i=0
n
n!
=1+n
(n − 1)!
Portanto,
|
[
D(c, 1)| = [1 + n] · 2k = [1 + 2m − 1] · 2n−m = 2n ,
c∈C
e conseqüentemente
[
D(c, 1) = F2n .
c∈C
Proposição 7 Um código será chamado de MDS (Maximum Distance Separable) se valer
a igualdade d = n − k + 1. Verificaremos que um código de Hamming de ordem m é MDS
se, e somente se, m = 2.
Prova:(=⇒) Suponhamos que o código de Hamming C de ordem m é MDS, então d =
n − k + 1=⇒ n − k = d − 1.
Sabemos que, num código de Hamming, k = n − m e d = 3. Então,
m=n−k =d−1=3−1=2
(⇐=) Sendo m=2 temos, k = n - 2= 1, pois n = 3. Logo,d ≤ 3 − 1 + 1 = 3 =⇒ d ≤ 3.
Daı́, se d=2 temos k = [ d−1
] = 0, impossı́vel, pois k=1. Se d=1, temos k = [ d−1
] = 0, o
2
2
que não pode como vimos acima. Portanto d=3.
Códigos de Reed-Solomon: Seja K um corpo finito e considere o K-espaço vetorial
K[X]k−1 dos polinômios em K[X] de grau menor ou igual a k − 1, incluindo o polinômio
nulo, isto é,
K[X]k−1 = {P ∈ K[X] : gr(P ) ≤ k − 1} ∪ {0}.
Esse espaço vetorial tem dimensão k com uma base dada por {1, X, X 2 , ..., X k−1 }.
Sejam n um inteiro, tal que n ≥ k, e α1 , ..., αn elementos distintos de K. A função definida
por
T : K[X]k−1 −→ K n
P 7−→ (P (α1 ), ..., P (αn ))
23
é uma transformação linear.
Verificação: Sejam P1 , P2 ∈ K[X]k−1 , temos que λP2 ∈ K[X]k−1 , daı́
T (P1 + λP2 ) = (P1 + λP2 )(α1 ), ..., (P1 + λP2 )(αn ) =
= (P1 (α1 ), ..., P1 (αn )) + (λP2 (α1 ), ..., λP2 (αn )) =
= (P1 (α1 ), ..., P1 (αn )) + λ(P2 (α1 ), ..., P2 (αn )) =
= T (P1 ) + λT (P2 ).
Além disso, T é injetora. De fato,
KerT = {P ∈ K[X]k−1 : P (α1 ) = ... = P (αn ) = 0} = {0},
pois um polinômio não nulo P de grau menor do que k não pode ter n raı́zes distintas,
pois ele só pode possuir no máximo k raı́zes e definimos anteriormente que n ≥ k.
Portanto, a imagem C de T é um código linear de comprimento n e dimensão k. Podemos
considerar K[X]k−1 como código da fonte, Im(T ) = C como código de canal e, a transformação T como uma codificação. O código de Reed-Solomon é definido por α1 , ..., αn .
Uma matriz geradora do código C é dada por



1
1

T (1)



α1
α2
 T (X)  


  2
G=
α22
 =  α1
..


.
..

 
 ...
.

k−1
T (X )
k−1
k−1
α1
α1
...
1


αn 


2 
. . . αn 
.. 
. 

. . . αnk−1 .
...
Considere uma palavra não nula c de C. Então, existe P ∈ K[X]k−1 tal que
c = (P (α1 ), ..., P (αn )).
Logo,
ω(c) = |{i ∈ {1, ..., n} : P (αi ) 6= 0}| =
n − |{i ∈ {1, ..., n} : P (αi ) = 0}| ≥ n − gr(P ) ≥ n − (k − 1) = n − k + 1
Logo,
d≥n−k+1
24
Pela cota de Singleton, sabemos que
d ≤ n − k + 1.
Portanto,
d=n−k+1
Vamos agora determinar uma matriz geradora de C na forma padrão:
Considere para j = 1, ..., k os polinômios
pj (X) =
(X − α1 )...(X − αj )...(X − αk )
.
(αj − α1 )...(αj − αj−1 )(αj − αj+1 )...(αj − αk )
Logo, pj (αi )=δi,j . Temos que {p1 (X), ..., pk (X)} é uma base de K[X]k−1 , portanto, obtemos a seguinte matriz geradora G0 de C:


T (p1 )
 . 
. 
G0 = 
 .  = (Idk |A),
T (pk )
onde


A=

p1 (αk+1 ) . . . p1 (αn )


... 
.
pk (αk+1 ) . . . pk (αn )
...
Portanto, G0 é uma matriz geradora de C na forma padrão. Podemos, ainda, pelo teorema
de Interpolação de Lagrange, decidir se um dado vetor pertence ou não ao código de ReedSolomon C.
De fato, pelo teorema, existe um único polinômio P (X) ∈ K[X]k−1 tal que P (αi ) = βi , i =
1, ..., k (sendo v = (β1 , ..., βn) ∈ K n ). Portanto,
v ∈ C ⇐⇒ (β1 , ..., βn) = (P (α1 ), ..., P (αn )),
ou seja,
P (αk+j ) = βk+j , j = 1, ..., n − k.
Exemplo 5 Considere K = F7 = Z7 , k = 4, n = 6 e α1 = 30 = 1,α2 = 31 = 3,α3 =
32 = 2,α4 = 33 = 6,α5 = 34 = 4 e α6 = 35 = 5. Portanto, o código de Reed-Solomon
de comprimento 6, de dimensão 4 e definido por α1 , α2 , α3 , α4 , α5 , α6 tem uma matriz
25
geradora

1 1 1 1

30 31 32 33

G=
30 312 34 36

30
33
1
4
3
38
36 39 312


1
1
 

5
3  1
=

310 
 1
315
1
1 1 1 1
3 2 6 4
2 4 1 2
6 1 6 1

1

5


4

6
e possui distância mı́nima d = n − k + 1 = 3.
3.5
Decodificação
Decodificação é o procedimento de detecção e correção de erros num determinado
código. O método geral de decodificação para códigos lineares que desenvolveremos é um
aperfeiçoamento de um método inventado por D. Slepian do Laboratório Bell na década
de 60.
Inicialmente, define-se o vetor erro e como sendo a diferença entre o vetor recebido r e o
vetor transmitido c, isto é,
e = r − c.
Exemplo 6 Num dado código sobre F2 , tenhamos transmitido a palavra (010011) e a
palavra recebida tenha sido (101011), então
e = (101011) − (010011) = (111000).
Seja H a matriz teste de paridade do código. Como Hct = 0, temos que
Het = H(rt − ct ) = Hrt − Hct = Hrt .
Portanto, a palavra recebida e o vetor erro têm a mesma sı́ndrome.
Denotemos por hi a i-ésima coluna de H. Se e=(α1 ...αn ) então
n
X
αi hi = Het = Hrt .
i=1
Lema 4: Seja C um código linear em K n com capacidade de correção k. Se r ∈ K n e
c ∈ C são tais que d(c, r) ≤ k, então existe um único vetor e com ω(e) ≤ k cuja sı́ndrome
é igual à sı́ndrome de r e tal que c = r - e.
Demonstração: De fato, c = r - e tem a propriedade do Lema, já que ω(e) = d(c, r) ≤ k.
Para provar a unicidade, suponha que e= (α1 ...αn ) e e’= (α10 ...αn0 ) sejam tais que ω(e) ≤ k
e ω(e’) ≤ k e tenham a mesma sı́ndrome que r. Então, se H é uma matriz teste de paridade
26
de C, temos
t
0t
He = He =⇒
n
X
i
αi h =
i=1
n
X
αi0 hi ,
i=1
o que nos dá uma relação de dependência linear entre 2k(≤ d − 1) colunas de H. Como
quaisquer d-1 colunas de H são linearmente independentes, temos que αi = αi0 para todo
i, logo e = e’.
Veja, como podemos determinar esse único vetor e a partir de Hrt no exemplo seguinte.
Exemplo 7 Determinação de e quando ω(e) ≤ 1.
Suponhamos que o código C tenha distância mı́nima d ≥ 3 e que o vetor erro e,
introduzido entre a palavra transmitida c e a palavra recebida r, seja tal que ωe ≤ 1.
Isto é, o canal introduziu no máximo um erro.
Se Het = 0, então r ∈ C e se toma c = r.
Suponhamos Het 6= 0, então ωe = 1 e, portanto, e tem apenas uma coordenada não
nula. Nesse caso, consideremos que e = (0, ..., α, ..., 0) com α 6= 0 na i-ésima posição.
Logo,
Het = αhi ,
onde hi é a i-ésima coluna de H. Portanto, não conhecendo e, mas conhecendo
Het = Hrt = αhi ,
podemos determinar e como sendo o vetor com todas as componentes nulas exceto a
i-ésima componente que é α. Note que i acima é bem determinado, pois d ≥ 3.
Como ilustração, considere o código do robô C. Esse código tem matriz teste de
paridade


1 0 1 0 0



H=
1 1 0 1 0 .
0 1 0 0 1
Seja r= (10100) uma palavra recebida, logo,
 
0
 
t
t
4

He = Hr = 
1 = 1.h .
0
27
Portanto, e= (00010) e, conseqüentemente,
c = r − e = (10110).
Agora, com base no exemplo anterior, estabeleceremos o algoritmo de decodificação em
códigos corretores de um erro.
Seja H a matriz teste de paridade do código C e seja r um vetor recebido. (Suponha
d ≥ 3)
(i)Calcule Hrt .
(ii)Se Hrt = 0, aceite r como a palavra transmitida.
(iii)Se Hrt = s 6= 0 compare s com colunas de H.
(iv) Se existirem i e α tais que st = αhi , para αK, então e é a n-upla com α na posição
i e zeros nas outras posições. Corrija r pondo c = r − e.
(v) Se o contrário de (iv) ocorrer, então mais de um erro foi cometido.
Seja C ⊂ K n um código corretor de erro com matriz teste de paridade H. Sejam d
]. Recorde que e e e têm a mesma sı́ndrome e, se
a distância mı́nima de C e k = [ d−1
2
ωe = d(r, c) < k, então e é univocamente determinado por r.
Seja v ∈ K n . Defina
v + C = v + c : c ∈ C.
Lema 5: Os vetores u e v de K n têm a mesma sı́ndrome se, e somente se, u ∈ v + C.
Demonstração: Hut = Hv t ⇐⇒ H(u − v)t = 0 ⇐⇒ u − v ∈ C ⇐⇒ u ∈ v + C.
Exemplo 8 Seja C o (4,2)- código gerado sobre F2 pela matriz
!
1 0 1 1
.
0 1 0 1
Logo,
C = {0000, 1011, 0101, 1110},
e as classes laterais segundo C são
0000 + C = {0000, 1011, 0101, 1110}
1000 + C = {1000, 0011, 1101, 0110}
0100 + C = {0100, 1111, 0001, 1010}
0010 + C = {0010, 1001, 0111, 1100}.
28
O Lema acima estabelece uma correspondência 1 a 1 entre classes laterais e sı́ndromes.
Todos os elementos de uma classe lateral têm a mesma sı́ndrome, e elementos de classes
laterais distintas possuem sı́ndromes distintas.
Definição 13 Um vetor de peso mı́nimo numa classe lateral é chamado de elemento
mı́nimo dessa classe.
No exemplo acima, temos que: 0000 é lı́der de C, 1000 é lı́der de 1000 + C, 0100 e 0001
são lı́deres de 0100+C, e 0010 é lı́der de 0010 + C.
Proposição 8 Seja C um código linear em K n com distância mı́nima d. Se u ∈ K n é tal
que
d−1
] = k,
2
então u é o único elemento lı́der de sua classe.
ω(u) ≤ [
Prova: Suponhamos que u, v ∈ K n com ω(u) ≤ [ d−1
] e ω(v) ≤ [ d−1
]. Se u − v ∈ C, então
2
2
ω(u − v) ≤ ω(u) + ω(v) ≤ [
d−1
d−1
]+[
] ≤ d − 1;
2
2
Logo, u − v = 0 e, portanto, u = v.
Comentário: Para achar lı́deres de classes, tomamos os elementos u tais que ω(u) ≤
[ d−1
].
2
Cada um desses elementos é lı́der de uma e somente uma classe. Esses lı́deres são
todos aqueles de peso menor ou igual a [ d−1
], os outros lı́deres não serão considerados.
2
Vamos agora discutir um algoritmo de correção de mensagens que tenham sofrido um
].
número de erros menor ou igual à capacidade de correção do código, que é k = [ d−1
2
Preparação: Determine todos os elementos u de K n , tal que ω(u) ≤ k. Em seguida,
calcule as sı́ndromes desses elementos e coloque esses dados numa tabela. Seja r uma
palavra recebida.
O Algoritmo de Decodificação
(1) Calcule a sı́ndrome st = Hrt .
(2) Se s está na tabela, seja l o elemento lı́der da classe determinada por s; troque r por
r−l
(3) Se s não está na tabela, então na mensagem recebida foram cometidos mais do que k
erros.
29
Justificativa: Dado r, sejam c e e, respectivamente, a mensagem transmitida e o vetor
erro. Como Het = Hrt , temos que a classe lateral onde e se encontra está determinada
pela sı́ndrome de r. Se ω(e) ≤ k, temos que e é o único elemento lı́der l de sua classe
e, portanto, é conhecido e se encontra na tabela. Conseqüentemente, pelo Lema 4, c =
r − e = r − é determinado.
Exemplo 9 Considere (6,3) código linear definido sobre F2 com matriz teste de paridade


1 0 0 1 0 1


.
H=
0
1
0
1
1
0


0 0 1 0 1 1
Nesse caso d = 3 e, portanto, k = [ d−1
] = 1.
2
Os vetores de peso menor ou igual a um com as 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
Suponhamos, agora, que a palavra recebida seja
(a) r = (100011). Logo, Hrt = (010)t e, portanto, e= (010000). Conseqüentemente,
c = r − e = (110011).
(b)r = (110011). Logo, Hrt = (111)t , que não se encontra na tabela. Sendo assim, foi
cometido mais do que um erro na mensagem r.
30
4
Códigos Cı́clicos
4.1
Códigos Cı́clicos
Essa é uma classe de códigos muito utilizada nas aplicações por possuı́rem bons algoritmos de codificação e de decodificação. No que se segue, K é um corpo finito e as
coordenadas de K n serão representadas por (x0 , ..., xn−1 ).
Definição 14 Um código linear C ⊂ K n será chamado de código cı́clico se, para c =
(c0 , ..., cn−1 ) pertence a C, o vetor (cn−1 , c0 , ..., cn−2 ) pertence a C.
Equivalentemente, o código linear C será um código cı́clico se, dada a permutação π de
{0, ..., n − 1} definida por

i − 1, se i ≥ 1
π(i) =
n − 1, se i = 0,
e sendo
Tpi (c0 , c1 , ..., cn−1 ) = (cn−1 , c0 , ..., cn−2 )
temos que Tπc ∈ C para todo c ∈ C; ou seja, Tπ C ⊂ C.
Exemplo 10 Seja v ∈ K n . O espaço vetorial
hvi = Kv + KTπ v + ... + KTπn−1 v
é claramente um código cı́clico (Tπn ) = Id. Em particular, é cı́clico o código C = h0i = {0}.
Como exemplo numérico considere K = F2 e seja v = (10011001) ∈ K 8 .Temos que
hvi = K(10011001) + K(11001100) + K(01100110) + K(00110011).
A técnica para lidar com os códigos cı́clicos consiste em enriquecer a estrutura de espaço
vetorial de K n como se segue.
31
Defina Rn como sendo o anel das classes residuais em K[X] módulo X n − 1; isto é,
Rn = K[X](X
n −1)
.
Um elemento de Rn é, portanto, um conjunto da forma
[f (X)] = {f (X) + g(X)(X n − 1) : g(X) ∈ K[X]};
e a adição e a multiplicação em Rn são respectivamente definidas por
[f1 (X)] + [f2 (X)] = [f1 (X) + f2 (X)],
e por
[f1 (X)] · [f2 (X)] = [f1 (X) · f2 (X)].
Recorde também que Rn munido da multiplicação por escalares λ ∈ K, definida por
λ[f (X)] = [λf (X)],
é um K-espaço vetorial de dimensão n com base 1, [X], ..., [X n−1 ] e como tal, é isomorfo
a K n através da transformação linear
ν : K n −→
Rn
(a0 , ..., an−1 ) 7−→ [a0 + a1 X + ... + an−1 X n−1 ].
Então, todo código linear C ⊂ K n pode ser transportado para Rn mediante o isomorfismo
ν para ser estudado. A vantagem de Rn sobre K n é que, no primeiro, temos, além da
estrutura de espaço vetorial, uma estrutura adicional de anel.
Vamos determinar matrizes geradoras e matrizes teste de paridade de códigos cı́clicos.
Para isso vamos caracterizar os códigos cı́clicos em Rn .
Primeiramente, note que a ação de Tπ em K n traduz-se, por meio de ν, na multiplicação
por [X] em Rn .
De fato, tomando c = (c0 , ..., cn−1) , temos
Tπ (c) = (cn−1 , c0 , ..., cn−2
e
ν(Tπ (c)) = [cn−1 + c0 X + ... + cn−2 X n−1 ] =
[X][c0 + c1 X + ... + cn−1 X n−1 ] = [X]ν(c).
32
Lema 1: Seja V um subespaço vetorial de Rn . Então, V é um ideal de Rn se, e
somente se, V é fechado pela multiplicação por [X].
Prova: Suponhamos que V seja um ideal de Rn .
Da definição de ideal, segue que
[X][f (X)] ∈ V para todo [f (X)] ∈ V .
Reciprocamente, suponhamos que V seja fechado pela multiplicação por [X]. É suficiente mostrar que [g(X)][f (X)] ∈ V para todo [g(X)] ∈ Rn e todo [f (X)] ∈ V .
Seja [f (X)] ∈ V . Como V é um subespaço de Rn , é claro que a[f (X)] ∈ V , para todo
a ∈ K. Como por hipótese,
[Xf (X)] = [X][f (X)] ∈ V,
então
[X 2 f (X)] = [X][Xf (X)] ∈ V.
Indutivamente, obtemos, para todo m ∈ N , que
[X m f (X)] = [X m ][f (X)] ∈ V.
Agora, escrevendo [g(X)] = [a0 + a1 X + ... + an−1 X n−1 ], temos que
[g(X)][f (X)] = [g(X)f (X)] = [(a0 + a1 X + .... + an−1 X n−1 )f (X)] =
a0 [f (X)] + a1 [X][f (X)] + .... + an−1 [X n−1 ][f (X)] ∈ V,
pois V é subespaço e cada parcela da última expressão pertence a V.
Teorema 5 Um subespaço C de K n é um código cı́clico se, e somente se, ν(C) é um ideal
de Rn .
As definições enunciadas acima, juntamente com o Lema 1, provam o resultado do Teorema 1.
Portanto, temos que um código C em K n é cı́clico se, e somente se, ν(C) = I([g(X)]),
onde g(X) ∈ K[X] é um divisor de X n − 1.
Seja p= car(K). Se n = mps com m e p primos entre si, temos que
s
X n − 1 = (X m − 1)p .
33
Como (X m − 1)0 = mX m−1 6= 0, o polinômio X m − 1 não tem fator não constante em comum com a sua derivada, portanto, não possui fator múltiplo algum. Conseqüentemente,
X m − 1 = f1 ...fr ,
onde os fi são polinômios mônicos, irredutı́veis e dois a dois distintos. Logo, a decomposição em fatores irredutı́veis de X n − 1 é
s
s
X n − 1 = f1p ...frp .
Segue, então, que o polinômio X n − 1 tem exatamente (ps + 1)r divisores mônicos. Temos
então, que Rn possui precisamente (ps + 1)r ideais. Em particular, se MDC(n,p)=1, segue
que Rn tem precisamente 2r ideais.
Note que Rn não é um domı́nio de integridade, pois temos, por exemplo,
[X − 1] · [X n−1 + X n−2 + ... + X + 1] = [X n − 1] = 0.
No que se segue, g(X)denotará sempre um divisor de X n − 1, e poremos
h(X) =
Xn − 1
.
g(X)
Teorema 6 Seja I = I([g(X)]), onde g(X) é um divisor de X n − 1 de grau s. Temos que
[g(X)], [Xg(X)], [X 2 g(X)], ..., [X n−s−1 g(X)] é uma base de I como espaço vetorial sobre
K.
Prova: Os elementos acima são linearmente independentes. De fato, suponhamos que
a0 [g(X)]a1 [Xg(X)] + ... + an−s−1 [X n−s−1 g(X)] = [0].
logo,
[g(X)][a0 + a1 X + ... + an−s−1 X n−s−1 ] = [0].
Portanto, para algum d(X) ∈ K[X], temos que
g(X)(a0 + a1 X + ... + an−s−1 X n−s−1 ) = d(X) · (X n − 1).
Daı́ segue que
(a0 + a1 X + ... + an−s−1 X n−s−1 ) = d(X · h(X)).
Como o grau de H(X)é n-s, devemos ter a0 + a1 X + ... + an−s−1 X n−s−1 = 0, e conseqüentemente, a0 = a1 = ... = an−s−1 = 0.
34
Os elementos acima geram I sobre K. De fato, se [f (X)] ∈ I, temos que
f (X) ≡ d(X) · g(X)mod(X n − 1),
Pelo algoritimo da divisão, temos que d(X) = h(X) · c(X) + r(X), com r(X)= a0 + a1 X +
... + an−s−1 X n−s−1 . Logo,
f (X) ≡ d(X) · g(X) ≡ c(X) · h(X) · g(X) + r(X) · g(X)mod(X n − 1)
e portanto,
f (X) ≡ c(X)(X n − 1) + r(X) · g(X) ≡ r(X) · g(X)mod(X n − 1).
Conseqüentemente,
[f (X)] = a0 [g(X)] + a1 [Xg(X)] + ... + an−s−1 [X n−s−1 g(X)].
Corolário 4 Dado um código cı́clico C, existe v ∈ C tal que C = hvi.
Prova: Seja I = ν(C). Logo, I é gerado como K-espaço vetorial por
[g(X)], [Xg(X)], ..., [X n−s−1 g(X)],
onde g(X)é um divisor de X n − 1. Portanto, colocando v = ν −1 ([g(X)]), temos que C é
gerado por v, Tπ v, ..., Tπn−s−1 v, e portanto, C = hvi.
Corolário 5 Seja g(X) = g0 + g1 X + ... + gs X s um divisor de X n − 1 de grau s. Se
I = I([g(X)]), então
dimk I = n − s,
e o código C = ν −1 (I) tem matriz geradora

 

−1
ν ([g(X)])
g0 g1 . . . gs 0 . . . 0

 

−1
 ν (X[g(X)])   0 g0 g1 . . . gs . . . 0 

 

G=
=.
.
.
.
.
.
.
..
..
..
..
.. 

  ..

 

−1
n−s−1
ν ([X
g(X)])
0 . . . 0 g0 . . .
gs
Dado um polinômio h(X) = h0 +h1 X +...+ht X t que divide X n −1, o polinômio recı́proco
de h(X),
h∗ (X) = X t h(1/X) = ht + ht−1 X + ... + h0 X t ,
é também um divisor de X n −1, e portanto, é o polinômio gerador de algum código cı́clico.
35
Teorema 7 Seja C = ν −1 (I) um código cı́clico, onde I = I([g(X)]), com g(X) um divisor
de X n − 1. Então C ⊥ é cı́clico e C ⊥ =ν −1 (J), onde J = I([h∗ (X)]).
Prova: Ponhamos
g(X) = g0 + g1 X + ... + gs X s e h(X) = h0 + h1 X + ... + hn−s X n−s .
Note que gr(h(X))= n-s, e portanto, hn−s 6= 0.
Sejam


g0 g1 . . . gs 0 . . . 0


 0 g0 g1 . . . gs . . . 0 


G=.

.
.
.
.
..
..
..
.. 
 ..


0 . . . 0 g0 . . .
gs
e







hn−s hn−s−1
...
h0
0
...
h0 . . .
..
.
0
..
.
hn−s
..
.
hn−s−1
..
.
0
...
0
hn−s . . .
...
0


0

.
.. 
.

h0
As linhas de H são linearmente independentes. Seja {e1 , ..., en } a base canônica de K n .
A i-ésima linha de G é
Gi = g0 ei + g1 ei + ... + gs ei+s , 1 ≤ i ≤ n − s,
e a j-ésima coluna de H t é
Hj = hn−s ej + hn−s−1 ej+1 + ... + h0 ej+n−s , 1 ≤ j ≤ s.
Suponhamos que i ≤ j. O produto interno de Gi por Hj é dado por
gj−i hn−s + gj−i+1 hn−s−1 + ... + g0 hj−i ,
onde j − i = 0, ..., s − 1. Mas a soma acima é exatamente o coeficiente de X n−s+j−i no
produto de g(X) · h(X)(= X n − 1). Como 1 ≤ n − s + j − i ≤ n − 1, temos que esse
coeficiente é igual a zero. O caso j ≤ i é análogo. Fica, então, provado que G · H t = 0, e
36
portanto, H é uma matriz geradora de C ⊥ . Agora,


ν −1 ([h∗ (X)])


 ν −1 (X[h∗ (X)]) 


H=
,
.
..




ν −1 ([X n−s−1 h∗ (X)])
portanto, temos que C ⊥ = ν −1 (J), onde J = I([h ∗ (X)]).
Corolário 6 A matriz teste de paridade de C = ν −1 (I), em que I = I([g(X)]) é dada
por

hn−s hn−s−1



H=


onde
...
h0
0
...
h0 . . .
..
.
0
..
.
hn−s
..
.
hn−s−1
..
.
0
...
0
...
hn−s . . .
0


0

,
.. 
.

h0
Xn − 1
= h0 + h1 X + ... + hn−s X n−s .
g(X)
Este corolário já foi provado no teorema imediatamente anterior.
4.2
Decodificação em códigos cı́clicos
Seja,
]
µ : K s −→ K[Xs−1 ⊂ K[X]
(a0 , ..., as−1 ) 7−→
s−1
X
ai X i
i=0
o isomorfismo de K-espaços vetoriais, onde K[X]s−1 é o espaço vetorial dos polinômios de
grau menor ou igual a s-1.
Teorema 8 Seja C ⊂ K n um código cı́clico. Suponhamos que C = ν −1 (I), onde I =
I([g(X)]), com g(X) um divisor de X n − 1. Seja R a matriz (n − s) × s cuja i-ésima linha
é
Ri = −µ−1 (ri (X)), 1 ≤ i ≤ n − s,
onde ri (X) é resto da divisão de X s−1+i por g(X). Então, (R | Idn−s ) é uma matriz geradora de C.
37
Prova: Sejam qi (X) e ri (X) o quociente e o resto da divisão de X s−1+i por g(X). Logo,
X s−1+i = g(X)qi (X) + ri (X), com Ri (X) = 0 ou degri (X) ≤ s − 1.
Portanto, [X s−1+i − ri (X)] pertence a I, e é evidente que esses vetores para i = 1, ..., n − s
são linearmente independentes sobre K. Como ν([X s−1+i − ri (X)]) = es−1+i − µ−1 (ri (X)),
temos que a matriz


1 0 ... 0


 −µ−1 (r2 (X)) 0 1 . . . 0



..
.. ..
.. 

.
. .
.


−1
−µ (rn−s (X)) 0 0 . . . 1
−µ−1 (r1 (X))
é uma matriz geradora de C.
Discutiremos, agora, o algoritmo de codificação.
Os elementos de C podem ser considerados como codificação do código da fonte K n−s .
Dado (a1 , ..., an−s ) ∈ K n−s , esse vetor pode ser codificado como elemento de C:
(a1 , ..., an−s )(R|Idn−s ) = (b0 , ..., bs−1 , a1 , ..., an−s ),
onde
(b0 , ..., bs−1 ) = −a1 µ−1 (r1 (X)) − ... − an−s µ−1 (rn−s (X)) =
n−s
X
−µ (
ai ri (X)).
−1
i=1
Exemplo 11 Considere o polinômio X 7 − 1 sobre F2 . A fatoração de X 7 − 1 é dada por
X 7 − 1 = (1 + X)(1 + X + X 3 )(1 + X 2 + X3).
Vamos considerar o código C ⊂ F27 gerado pelo polinômio g(X) = 1 + X + X 3 . A
dimensão de C é 4. Agora, determinaremos uma matriz geradora desse código na forma
padrão:
X 3 = (X 3 + X + 1) + (X + 1)
X 4 = (X 3 + X + 1)X + (X 2 + X)
X 5 = (X 3 + X + 1) + (X 2 + 1) + (X 2 + X + 1)
X 6 = (X 3 + X + 1) + (X 3 + X + 1) + (X 2 + 1).
38
Logo, temos que uma matriz geradora

1

0

G0 = 
1

1
de C é dada por
1 0 1 0 0
1 1 0 1 0
1 1 0 0 1
0 1 0 0 0

0

0

.
0

1
Suponha que seja dado o vetor (a1 , a2 , a3 , a4 ) ∈ F24 , do código da fonte, então a
codificação desse vetor é dada por
(b0 , b1 , b2 , a1 , a2 , a3 , a4 ),
onde b0 , b1 e b2 são os coeficientes do polinômio
a1 (X + 1) + a2 (X 2 + X) + a3 (X 2 + X + 1) + a4 (X 2 + 1) =
a1 + a3 + a4 + (a1 + a2 + a3 )X + (a2 + a3 + a4 )X 2 .
Portanto a codificação de (a1 , a2 , a3 , a4 ) é
(a1 + a3 + a4 , a1 + a2 + a3 , a2 + a3 + a4 , a1 , a2 , a3 , a4 ).
Teorema 9 Seja C ⊂ K n um código cı́clico gerado por um polinômio mônico g(X) com
matriz geradora na forma padrão (R | Id) e matriz teste de paridade H = (Id | −Rt ). Se
v = (υ0 , ..., υn−1 )inK n , então a sı́ndrome de v com relação à matriz H é dada por
µ−1 (r(X)),
onde r(X) é o resto da divisão de υ0 + υ1 (X) + ... + υn−1 X n−1 por g(X).
Prova:A sı́ndrome de v é o vetor
(Id| − Rt )v t =
(µ−1 (1), µ−1 (X), ..., µ−1 (X s−1 ), µ−1 (r1 (X)), ..., µ−1 (rn−s (X)))v t =
µ(−1)(υ0 + υ1 (X) + ... + υs−1 X s−1 + υs r1 (X) + ... + υn−1 rn−s (X)),
o que implica o resultado, visto que
r(X) = υ0 + υ1 (X) + ... + υs−1 X s−1 + υs r1 (X) + ... + υn−1 rn−s (X)
é o resto da divisão de υ0 + υ1 (X) + ... + υn−1 X n−1 por g(X).
Exemplo 12 Considere o código do exemplo anterior. A matriz teste de paridade asso-
39
ciada a G0 é a matriz


1 0 0 1 0 1 1


.
H=
0
1
0
1
1
1
0


0 0 1 0 1 1 1
Dado o vetor (1101001) ∈ F28 , a sua sı́ndrome relativa a H é dada por µ−1 (r(X)),
onde r(X) é o resto da divisão de 1 + X + X 3 + X 6 por g(X) = 1 + X + X 3 . Portanto,
r(X) = X 2 + 1, e conseqüentemente, a sı́ndrome é (101).
40
Bibliografia
[1] Hefez, Abramo; Códigos Corretores de Erros; Rio de Janeiro, 2002, (Coleção
Matemática Universitária).
[2] Voloch, José Felipe Códigos Corretores de Erros, Rio de Janeiro, CNPq: IMPA,
(Coleção Matemática Universitária).
[3] Blake, Ian F; An Introduction to Algebraic Combinatorial Coding Theory; Academic
Press.
[4] Pretzel, Oliver; Codes and Algebraic Curves; Oxford Lectures Series in Mathematics
and its Applications, Clarendon Press, Oxford, 1998.
[5] Shannon, Claude Eloowd; A Matematical Theory of Communication; Bell System
Tech. vol. 27 (1948) 379 - 423, 623 - 656.
[6] Goppa, V. D., Geometry and Codes, Mathematics and its Applications; vol. 24,
Kluwer, Dordricht, 1991.
[7] Hoholdt, van Lint and Pellikam; Algebraic Geometry Codes; Handbook on Coding
Theory (V.S.Pless, W.C. Huffman, Eds), Elvesier, 1998.
[8] H. Stichtenoth; Algebraic Function Fields and Codes; Springer - Verlag, 1993.
[9] Burgess, Walty; Matrices and Coding Theory - A very brief introduction; University
of Ottawa (pre-print).
[10] Lint, J. H. Van; Introduction to Coding Theory; Springs - Verlag, N. Y., 1982.
[11] Matthew E. Jachn; Introduction to Algebraic Coding Theory with emphases on
Algorithmic Decoding of the Reed - Solomon Codes; April. 2003, (paper)
[12] Boswell, Dustin; An Introduction to Coding Theory; 2001, (pre-print)
[13] Ward, Harold W; An Introduction to Algebraic Coding Theory; (pre-print)
[14] Kim, Seon Jeong; Introduction to Coding Theory and Algebraic Geometric Codes;
Proccedings of Workshops in Pure Mathematics, vol. 18, part I (1998).
[15] S.C. Coutinho; Números Inteiros e Criptografia RSA; Série de Computação e
Matemática, IMPA/SBM, 1997.
Download

Uma Introdução à Teoria dos Códigos Corretores de Erros