Escolar Documentos
Profissional Documentos
Cultura Documentos
Monografia Carla TCC
Monografia Carla TCC
Dedicatória
Este trabalho dedico aos meus pais Onofre e Maria de Lourdes que me fizeram lutar até
o final apesar de todas as dificuldades e possibilitaram que eu realizasse o meu maior
sonho: estudar.
Agradecimentos
Agradeço aos meus pais Onofre e Maria de Lourdes e ao meu irmão Arthur por me
ajudarem nessa longa caminhada. Sem a minha famı́lia este trabalho não seria possı́vel,
pois me apoiaram e me deram forças para superar momentos difı́ceis.
Agradeço ao Prof. Dr. Sadao Massago pela imprescindı́vel ajuda e tempo dedicados,
pela orientação no desenvolvimento do meu trabalho fosse desenvolvido. Muito obrigada
pela compreensão por eu trabalhar e não pude me dedicar tanto quanto gostaria neste
trabalho.
Agradeço ao meu namorado Carlos Eduardo Domingues Nazário por toda a paciência,
carinho, compreensão e ajuda dedicada, pois sem seu companheirismo eu não teria con-
seguido ir até o fim da graduação. Muitı́ssimo obrigada, pois muitos foram os momentos
que você deixou de buscar seus sonhos para que o meu se realizasse. Sem o seu apoio este
trabalho não existiria.
Este trabalho simboliza a superação de um momento muito delicado da minha vida na
qual aprendi não só a importância da Matemática, mas também que podemos seguir em
frente mesmo que alguns obstáculos tenham surgido e tentado impedir que nossos sonhos
fossem concretizados. A Matemática me conquistou desde o colégio e esta monografia é
uma pequena demonstração de que esta ciência é singular em minha vida.
vi
“Procure ser um homem de valor, em vez de ser um homem de sucesso.”
(Albert Einstein)
viii
ix
Resumo
Neste trabalho serão apresentados conceitos básicos de códigos, vetores para projetar
códigos detectores de erros que podem ocorrer na transmissão de dados e os dı́gitos de
verificação. Posteriormente definimos o que é um código detector de erros, como também
a métrica de Hamming, os parâmetros de um código e equivalência de códigos. Para o
desenvolvimento do projeto foi necessário estudar anéis, corpos e anéis de polinômios para
que pudéssemos descrever os corpos finitos e sua construção. Foram estudados os Códigos
Lineares (Códigos Duais e Códigos de Reed-Muller), Códigos Cı́clicos, decodificação destes
e finalmente trabalhamos com algumas aplicações de códigos. Neste trabalho foi possı́vel
identificar a aplicação da Matemática em mercadorias e transmissão de dados, que é uma
vasta aplicação de conceitos algébricos que facilitam o dia-a-dia das pessoas.
Introdução
Historicamente, a informação por meio de códigos era utilizada com o objetivo de ocultar
uma mensagem, denominados de Criptografia. O enfoque deste projeto não é criptografia,
mas os códigos utilizados quando a informação digital deve ser transmitida com o uso de
meios analógicos tais como a luz, ondas de rádio, gravações eletromagnéticas, etc. Com a
introdução dos computadores no século XX, houve uma necessidade de transmitir grandes
quantidades de dados com rapidez e precisão. Além dos computadores, outros avanços
tecnológicos dependem de códigos, tais como: comunicação via satélite, CD, Códigos
Universais de Produtos (UPC-Universal Product Code) associados aos códigos de barras
e o Padrão Internacional de Numeração de Livros (ISBN- International Standard Book
Number).
Os vetores utilizados para o estudo de códigos não são vetores de Rn , mas vetores
em Fn onde F é um corpo finito. Assim, terão um número finito de possibilidades para
cada componente. Tais vetores dependem de um tipo diferente de aritmética - chamada
aritmética modular.
A teoria moderna de códigos originou-se com o trabalho de Claude Shannon (1916 −
2001), que teve um papel importante na criação da teoria da informação e da base teórica
para os hoje chamados códigos corretores de erros.
A teoria dos códigos vem sendo utilizada com sucesso na nossa história recente. Em
1965, a nave espacial Mariner 4 enviou 22 fotos em preto e branco de Marte com 64
tons de cinza para cada um de seus 200 × 200 pontos, que é um elemento de Z62 . A esses
vetores não acrescentavam-se informações adicionais, pois a transmissão era muito lenta,
demorando em torno de 8 horas para transmitir cada foto.
Em 1972, a nave espacial Mariner 9 transmitiu imagens de Marte com uma resolução
de 700×832 pontos. Como a velocidade da transmissão era maior, o código foi recodificado
através de uma função injetora ϕ : Z62 =⇒ Z32 2 para acrescentar o código de canal
que permite detectar e corrigir até sete erros. O dado recebido era corrigido e decodificado
através de uma transformação ϕ(−1) , obtendo-se o elemento de Z62 que representa o tom
de cinza correspondente. Esse código pertence à famı́lia de códigos chamados de Códigos
de Reed-Muller.
Em 1979, a nave espacial Voyager transmitiu imagens coloridas de Júpiter. Cada
elemento de imagem de uma cor foi representado por uma das 212 = 4096 tonalidades. O
codificador da fonte usava 12 bits binários e o codificador de canal usava 24 bits. Esse era
xii
Sumário
1 Conceitos Preliminares 1
2 Códigos 7
2.1 Códigos Binários . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
5 Códigos Lineares 29
5.1 Equivalência de Códigos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
5.2 Matriz Geradora de um Código . . . . . . . . . . . . . . . . . . . . . . . . 32
5.3 Códigos Duais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
5.4 Códigos de Reed-Muller . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
5.5 Decodificação de Códigos de Reed-Muller . . . . . . . . . . . . . . . . . . . 39
Referências Bibliográficas 43
xv
Lista de Figuras
Capı́tulo 1
Conceitos Preliminares
+ : A×A → A · : A×A → A
e
(a, b) 7→ a + b (a, b) 7→ a · b
que chamaremos respectivamente de adição e multiplicação, possuindo as seguintes pro-
priedades:
(ii) Existência de elemento neutro para a adição: Existe um elemento chamado zero e
denotado por 0, tal que ∀a ∈ A, a + 0 = 0 + a = a.
a + (−a) = −a + a = 0.
(i) a + b = a + b,
(ii) a · b = a · b
∀a, b ∈ A, a 6= 0 e b 6= 0 ⇒ a.b 6= 0.
Como [2] não é invertı́vel, temos que Z4 não é um corpo. Como [2] · [2] = [4] = [0],
temos que esse anel não é um domı́nio de integridade.
Definição 1.6. Um anel onde todo elemento não nulo é invertı́vel é chamado de corpo.
+ 0 1 2 · 0 1 2
0 0 1 2 0 0 0 0
e
1 1 2 0 1 0 1 2
2 2 0 1 2 0 2 1
b1 + b2 + . . . + bn + d = 0 em Z3
Definição 1.9. Um conjunto não vazio V é um espaço vetorial sobre (um corpo) K se
em seus elementos, denominados vetores, estiverem definidas as seguintes operações:
(A3) existe um vetor em V , denominado vetor nulo e denotado por 0, tal que 0 + v = v
∀ v ∈V.
(A4) a cada vetor v ∈ V , existe um vetor em V denotado por −v, tal que v + (−v) = 0.
Além disso, vamos impor que as operações dadas em (A) e (M ) se distribuam, isto é, que
tenham as seguintes propriedades:
(D1) α · (u + v) = α · u + α · v, ∀α ∈ K e ∀u, v ∈ V .
(D2) (α + β) · v = α · v + β · v, ∀α, β ∈ K e ∀v ∈ V .
(i) (x + y) ∈ I, ∀x, y ∈ I
Capı́tulo 2
Códigos
+ 0 1 · 0 1
0 0 1 e 0 0 0
1 1 0 1 0 1
Com tais operações, nosso conjunto de escalares {0, 1} é o conjunto dos inteiros módulo
2 que denotaremos por Z2 .
1+1+0+1=1 e 1+1+1+1=0
Regra de Paridade, ou seja se número de 1’s for par, a soma é 0. Se for ı́mpar, a soma
será 1.
O vetor do espaço vetorial Zn2 (sobre o escalar Z2 ) é o conjunto das n-uplas de 0s e 1s.
Os vetores em Zn2 são chamados de vetores binários de comprimento n.
Exemplo 2.2. Os vetores em Z22 são (0, 0), (0, 1), (1, 0) e (1, 1)
Definição 2.4. Um código binário é um conjunto de vetores binários (de mesmo com-
primento) chamados vetores de códigos. O processo de conversão de uma mensagem em
vetores de código é chamado codificação, e o processo inverso é chamado decodificação.
9
Capı́tulo 3
Tabela 3.1: Mensagens e palavras de código para o código bit de paridade par (3, 2)
ı́mpar de erros sobre qualquer palavra de código, é possı́vel detectá-los, já que resulta
numa palavra que não pertence ao código.
Exemplo 3.1. Desejamos codificar e transmitir uma mensagem que consiste em uma das
palavras up, down, left, right. São quatro palavras, mas acrescentando bit de paridade no
final, teremos quatro vetores de Z32 , como na Tabela 3.2.
Decodificar uma mensagem é simples quando não ocorrem erros na sua transmissão.
Vamos considerar que ocorreu um erro na transmissão, resultando em alteração em
uma das coordenadas do vetor de código e o “down”que é (0, 1, 1), foi recebido como
(1, 1, 1), (0, 0, 1) ou (0, 1, 0). Como nenhum deles é um código válido (up, down, left ou
right), sabemos que ocorreu um erro na transmissão, mas ainda não temos as ferramentas
para detectar onde está o erro.
O exemplo 3.1 é um código detector de erros. Mas o avanço tecnológico permitiu não
somente detectar como também corrigir erros de transmissão. Uma forma de detectar
erros é utilizar o código de checagem de paridade, que consiste na introdução de dı́gito de
3.2. Aplicações de Códigos Detectores de Erros 11
checagem acrescentado a cada vetor para que a paridade, ou número total de 1s, seja um
número par.
Exemplo 3.2. Se a mensagem a ser enviada for o vetor binário (1, 0, 0, 1, 0, 1), que possui
um número ı́mpar de 1s, o dı́gito de checagem será 1, para que o número total de 1s no
vetor de código seja par. Logo, o vetor de código será (1, 0, 0, 1, 0, 1, 1). Se acontecer
algum erro na transmissão da mensagem ele será detectado, pois a paridade do vetor de
código será alterada de par para ı́mpar. Por exemplo, se ocorrer um erro na terceira
coordenada, o vetor de código a ser recebido é (1, 0, 0, 1, 0, 1, 1) e sua paridade é ı́mpar,
pois tem cinco 1s.
Agora veremos o dı́gito de checagem mais geral. Vamos supor a mensagem que se
quer enviar seja o vetor b = (b1 , b2 , . . . , bn ) em Znk . O vetor código de checagem de
paridade é v = (b1 , b2 , . . . , bn , d) em Zn+1
k , onde o dı́gito de checagem d é escolhido de
maneira que
b1 + b2 + . . . + bn + d = 0 em Zk
ou
1.v = 0
identificar o paı́s de origem, enquanto o EAN-13 utiliza dois dı́gitos e portanto possui 13
dı́gitos.
Para compreender o funcionamento dos códigos detectores de erros é preciso entender
como é atribuı́do a cada produto, um dı́gito que permite essa detecção.
Suponhamos que um produto está identificado. O UPC é um código associado aos
códigos de barras encontrados em mercadorias, na qual o leitor do código de barras esca-
neia as barras pretas e brancas que correspondem a um vetor 10-ário
v = (v1 , v2 , . . . , v11 , d) ∈ Z12
10
de comprimento 12. As informações sobre o fabricante e o produto são dadas pelas 11
primeiras componentes. A última componente d é o dı́gito de checagem escolhido de
maneira que c.v = 0 em Z10 , onde o vetor de checagem c é dado por
c = (3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1)
Exemplo 3.3. Seja o UPC como mostrado na Figura 3.3. Vamos verificar se o dı́gito de
checagem realmente é 6, considerando que os cálculos são feitos em Z10 .
c·v =3·0+1·7+3·4+1·9+3·2+1·7+3·0+1·2+3·0+1·0+3·4+1·d
3.2. Aplicações de Códigos Detectores de Erros 13
= 3.(0 + 4 + 2 + 0 + 0 + 4) + 1.(7 + 9 + 7 + 2 + 9 + d)
= 3.(0) + 1.(4) + d
=4+d
Exemplo 3.4. O UPC permite detectar erros simples (erro na coordenada) ou erros
gerados por trocas entre as coordenadas. Vamos supor que no exemplo 3.3, o UPC seja
escrito como v = (0, 7, 4, 2, 9, 7, 0, 2, 0, 9, 4, 6), ou seja, a quarta e a quinta coordenadas
tiveram suas posições invertidas. Fazendo os cálculos em Z10 obtemos:
c · v0 = 3 · 0 + 1 · 7 + 3 · 4 + 1 · 9 + 3 · 2 + 1 · 7 + 3 · 0 + 1 · 2 + 3 · 0 + 1 · 9 + 3 · 4 + 1 · 6
= 3.(0 + 4 + 9 + 0 + 0 + 4) + 1.(7 + 2 + 7 + 2 + 9 + 6)
= 3.(7) + 1.(3)
=4
c = (10, 9, 8, 7, 6, 5, 4, 3, 2, 1)
e a condição é que c.b = 0 em Z11 , ou seja, de que o produto escalar do vetor de código
pelo vetor de checagem seja múltiplo de 11. Sendo o vetor b = (v1 , v2 , v3 , . . . , v9 , d), temos:
c.b = 10.v1 + 9.v2 + 8.v3 + 7.v4 + 6.v5 + 5.v6 + 4.v7 + 3.v8 + 2.v9 + d
onde d é o dı́gito de checagem. Ou seja, d deve ser escolhido de modo que c.b seja
múltiplo de 11. Quando o dı́gito de checagem é 10, utiliza-se o numeral romano X em seu
lugar, pois é preferı́vel que cada componente de um ISBN seja um único dı́gito.
3.2. Aplicações de Códigos Detectores de Erros 15
Exemplo 3.5. Consideramos o ISBN a seguir que tem número igual a 85−244−0169−9.
O dı́gito de verificação final é 9, pois
(8, 5, 2, 4, 4, 0, 1, 6, 9, 9).(10, 9, 8, 7, 6, 5, 4, 3, 2, 1) =
80 + 45 + 16 + 28 + 24 + 0 + 4 + 18 + 18 + 9 = 242, que é um múltiplo de 11.
Segundo Milies [5], autores como D.F. Beckley e J. Verhoeff investigaram os erros
cometidos por operadores humanos. Os erros num único dı́gito e as transposições são os
mais frequentes, atingindo cerca de 80%. A codificação apresentada aqui foi projetada
para detectar tais erros.
17
Capı́tulo 4
Vamos estudar neste capı́tulo códigos corretores de erros, que permitem tanto detectar
como corrigir certos tipos de erros na transmissão ou armazenamento de dados. Para
entender como funcionam, vamos utilizar como exemplo, um robô que se move sobre um
tabuleiro quadriculado e que ao darmos um dos comandos (leste, oeste, norte, sul), o robô
se desloca de uma casa para a outra.
Os quatro comandos acima podem ser codificados como elementos de Z22 , como se
segue:
Leste →
7 00 Norte 7→ 10
Oeste → 7 01 Sul 7→ 11
Cada código que representa um dos comandos acima (00, 01, 10, 11) é chamado de
código da fonte. Suponhamos que os pares ordenados devam ser transmitidos via rádio
que pode sofrer interferências. Suponhamos que ao enviar a mensagem como 00 (ir para
leste), o robô recebeu a mensagem 01 (ir para oeste) o que faria com que fosse para oeste.
Para evitar que a mensagem seja um dos comandos existente, é necessário introduzir re-
dundâncias na codificação para permitir detectar e corrigir erros. Então vamos introduzir
mais dı́gitos aos códigos que representam os comandos, como segue:
00 7→ 00000
01 7→ 01011
10 7→ 10110
11 7→ 11101
Na recodificação acima, as duas primeiras posições são o código da fonte e nas três
posições restantes são redundâncias introduzidas. Este novo código recodificado é cha-
mado de código de canal. Como exemplo, suponhamos que tenha ocorrido um erro na
transmissão do código 10110 e que foi recebido 11110. O código recebido não corresponde
a nenhum dos códigos da tabela, portanto, detectamos erros. O código mais próximo
da mensagem válida, ou seja, o código da tabela que apresenta a menor quantidade de
dı́gitos distintos do código recebido é 10110, que é a palavra transmitida.
18 4. Códigos Corretores de Erros
(a) Todos os sı́mbolos (dı́gitos) transmitidos têm a mesma probabilidade de serem rece-
bidos errados e essa probabilidade é pequena;
T (x) será um vetor de código. Um código pode ser descrito através de uma trans-
formação envolvendo matriz.
h i
Exemplo 4.1. Seja G = 1 1 1 e definimos T : Z2 → Z32 por T (x) = Gt x
Onde elementos de Z2 são matrizes 1 × 1.
A matriz G é chamada de Matriz geradora do código.
Para checar se um vetor recebido é um código, precisamos fazer duas verificações de
c1
paridade. Pela G, é necessário que o vetor recebido c = c2 satisfaça c1 = c2 = c3
c3
2
Em Z , temos
4. Códigos Corretores de Erros 19
c = c c + c = 0
1 2 1 2
=⇒
c = c c + c = 0
1 3 1 3
" #
1 1 0
Se P = , então é equivalente a P · c = 0.
1 0 1
A matriz P é chamada de matriz de verificação de paridade para o código e p · c 6= 0
implica que houve erros." #
0
Observe que P Gt = .
0
Para entender como
funciona, vamos supor que enviamos uma mensagem codificada
1
como (1, 1, 1) = 1
1
Suponha que ocorreu um erro na transmissão e recebemos c0 = (1, 0, 1) Logo,
" # 1 " # " #
1 1 0 1 + 0 · 1 + 0 · 1 1
P · c’ = · 0 = = 6= 0.
1 0 1 1+0·0+1·1 0
1
Logo, c’ não
" pode
# ser um vetor de código. Mas onde estará o erro? Podemos verificar
1
que P · c’ = que é a segunda coluna da matriz de verificação de paridade P. Isso
0
significa que o erro está na segunda coordenada de c’, o que permite corrigir o erro,
invertendo 0 para 1.
Definição 4.2. Se k < n. Um código binário (n, k) dado como T : Zk2 → Zn2 é
h i
dito de comprimento n e dimensão k. Uma matriz G = Ik A , onde A é uma
k×n
h k × (n =ik) sobre Z2 é dito matriz geradora padrão para o código. Uma matriz
matriz
P = B In−k é dito matriz de verificação de paridade padrão.
" #
h i I
P Gt x = B I x = 0 para todo x em Zk2
At
Ou seja,
" #
h i I
B I x = (BI + IAt ) x = 0
At
Bx + At x = 0 =⇒ Bx = −At x = At x
ou
Bx=Ax
Se agora tomarmos x = ei , o i-ésimo vetor de base canônica de Zk2 , vemos que
Exemplo 4.4. Veremos um código corretor de erros que usa três equações para verificação
de paridade, que formam as linhas de P . Então temos n−k = 3 e logo k = n−3. Os vetores
da mensagem pertencem a Zk2 , e queremos que k (portanto n) seja o maior possı́vel para
transmitir mais informações. Pelo Teorema 4.3, as colunas de P precisam ser distintas e
não nulas. O máximo ocorre quando consistem em todos os 23 − 1 = 7 vetores não nulos
de Zn−k
2 = Z32 . Uma destas opções é
1 1 0 1 1 0 0
P= 1 0 1 1 0 1 0
0 1 1 1 0 0 1
0 1 1 1
1 0 0 0 1 1 0
0 1 0 0 1 0 1
G=
0 0 1 0 0 1 1
0 0 0 1 1 1 1 4×7
c = G xt = (0, 1, 0, 1, 0, 1, 0)
Se esse vetor for recebido, será considerado correto, já que P c = 0. Agora, se for
h iT
recebido c’ = 0 1 1 1 0 1 0 , então
1 1 0 1 1 0 0 h it h it
0
P c = 1 0 1 1 0 1 0 · 0 1 1 1 0 1 0 = 0 1 1
0 1 1 1 0 0 1
h i
Como P c0 6= 0, ocorreu um erro. Como o vetor é 0 1 1 , que é a terceira coluna
da matriz P . O erro está na terceira componente de c0 . Alterando essa componente,
recuperamos o vetor de código c. Como as quatro primeiras componentes de um vetor de
código são o vetor de mensagem original,podemos decodificar c e obtemos o vetor original
h iT
x= 0 1 0 1 .
No Matlab executamos a primeira linha, que tem como parâmetro de entrada apenas
r = 3, e os dados de saı́da são H, G e os valores de n e k.
No Matlab também podemos obter uma palavra de código, ou seja, um vetor de código
(código da fonte) acrescido de redundâncias introduzidas, chamadas de código de canal.
Para isso, multiplicamos o vetor de código pela matriz geradora G.
22 4. Códigos Corretores de Erros
4.2. Métrica de Hamming 23
Agora vamos introduzir um erro na palavra de código, trocando o segundo bit desta
através da soma com um padrão de erro. Em seguida, calculamos a sı́ndrome e verificamos
que é a segunda linha de H T , correspondendo ao padrão de erro somado à segunda
palavra.
d = min{d(u, v) : u 6= v com u, v ∈ C e u 6= v }.
No exemplo do robô dado no inı́cio deste capı́tulo, se C é o código do robô, temos que
d = 3.
respectivamente.
Lema 4.9. Seja C um código com distância mı́nima d. Se c e c0 são palavras distintas
de C, então
D(c, κ) ∩ D(c0 , κ) = ∅.
Teorema 4.10. Seja C um código com distância mı́nima d. Então C pode corrigir até
κ = b d−1
2
c erros e detectar até d − 1 erros.
(3) Um código com d = 1 não tem capacidade para detectar erros; por exemplo, con-
siderando as 8 palavras do código binário natural a 3 bit, verifica-se que qualquer
alteração de um bit numa palavra vai produzir outra palavra que pertence ao código;
este erro é indetectável (as palavras de código são excessivamente semelhantes entre
si).
[
D(c, κ) = An .
c∈C
Um código C sobre um alfabeto A possui três parâmetros fundamentais [n, M, d], que
são, respectivamente, o seu comprimento (o número n corresponde ao espaço ambiente
An onde C se encontra), o seu número de elementos e a sua distância mı́nima.
0 1 1 1 0 0 1
Essa é a matriz de um código de Hamming (matriz de verificação de paridade) corres-
pondente a m = 3.
4.4 Decodificação
A decodificação é o procedimento de detecção e correção de erros num determinado código.
Define-se o vetor erro e como sendo a diferença entre o vetor recebido r e o vetor trans-
mitido c, isto é,
e=r−c
Exemplo 4.13. Suponha que num código dado sobre F2 , tenhamos transmitido a palavra
(010011) e foi recebido a palavra recebida tenha sido (101011), então
v + C = C ⇐⇒ v ∈ C.
Definição 4.16. Um vetor de peso mı́nimo numa classe lateral é chamado de elemento
lı́der dessa classe.
(2) Se s está na tabela de cálculo das sı́ndromes, seja l o elemento lı́der da classe
determinada por s; troque r por r − l.
(3) Se s não está na tabela de cálculo das sı́ndromes, então mensagem recebida foram
cometidos mais do que κ erros.
Exemplo 4.17. Considere o código linear (6, 3) definido sobre F2 com matriz teste de
paridade
H=
1 0 1 1 0 0
1 1 0 0 1 0 .
0 1 1 0 0 1
Lı́der Sı́ndrome
000000 000
000001 001
000010 010
000100 100
001000 101
010000 011
100000 110
Considere um código que pode corrigir até κ erros e os vetores-código nos centros
das esferas de raio κ. Os vetores-código estão separados um dos outros por pelo menos
d unidades. Se um vetor recebido x estiver no interior de uma dessas esferas, ele será
decodificado como o vetor correspondente ao centro daquela esfera (veja a figura 4.4).
Esse processo é conhecido como decodificador pelo vizinho mais próximo. A figura
sugere que se um código é capaz de corrigir κ erros, então as “esferas” centradas nos
vetores-código não podem ser tocadas nem sobrepostas, tendo-se d > 2κ.
29
Capı́tulo 5
Códigos Lineares
T : F22 → F52
(x1 , x2 ) 7→ (x1 , x2 , x1 , x1 + x2 , x2 )
Pela definição, todo código linear é um espaço vetorial de dimensão finita. Seja κ a
dimensão do código C e seja {v1 , v2 , . . . , vκ } base C, portanto, todo elemento de C se
escreve de modo único na forma
λ1 v 1 + λ 2 v 2 + · · · + λ κ v κ
M = |C| = q κ
e, consequentemente,
Proposição 5.4. Seja C ⊂ K n um código linear com distância mı́nima d. Temos que
(ii) d = ω(C).
T : Kκ → Kn
x = (x1 , x2 , . . . , xκ ) 7→ (x1 v1 + x2 v2 + · · · + xκ vκ )
T : Kκ → Kn
com C = Im(T ).
Ele é denominado de forma paramétrica, pois os elementos de C são parametrizados
pelos elementos x de K κ . Agora veremos como representar como núcleo da transformação
linear. Tome um subespaço C 0 de K n complementar de C, isto é,
C ⊕ C 0 = K n,
H : C ⊕ C 0 → K n−k
u ⊕ v 7→ v
5.1. Equivalência de Códigos 31
Exemplo 5.5. Considere o corpo finito F3 = {0, 1, 2} = Z3 com três elementos e seja
C ⊂ F43 , o código gerado pelos vetores v1 = 1011 e v2 = 0112. Esse código possui
9(= q κ = 32 ) elementos, por ter dimensão 2 sobre um corpo de 3 elementos. Uma
representação paramétrica é dada por
x1 v1 + x2 v2
H: F43 → F23
x = (x1 , . . . , x4 ) 7→ (2x1 + 2x2 + x3 , 2x1 + x2 + x4 )
Definição 5.6. Sejam A um alfabeto e n um número natural. Diremos que uma função
F : An → An é uma isometria de An se ela preserva a distância de Hamming. Em
sı́mbolos:
Proposição 5.7.
O estudo mais aprofundado sobre a isometria costuma ser feita em livros sobre espaços
métricos.
32 5. Códigos Lineares
F = Tπ ◦ Tf11 ◦ · · · ◦ Tfnn .
Definição 5.11. Seja K um corpo finito. Dois códigos lineares C e C 0 são linearmente
equivalentes se existir uma isometria linear T : K n → K n tal que T (C) = C 0 .
Pelo Teorema 5.9, segue que dois códigos lineares C e C 0 em K n são linearmente equi-
valentes se, e somente se, existir uma permutação π de {1, . . . , n} e elementos c1 , . . . , cn
de K\{0} tais que
Logo, dois códigos são linearmente equivalentes se, e somente se, cada um deles pode
ser obtido do outro por uma sequência de operações do tipo:
i. Multiplicação dos elementos numa dada posição por um escalar não nulo.
ii. Permutação das posições das palavras do código, por uma permutação de
{1, 2, . . . , n} aplicado em todas as palavras do código.
T : Kκ → Kn
x 7→ (x1 v1 + · · · + xκ vκ ),
T : Kκ → Kn
x 7→ Gt x
Exemplo 5.12. Tome K = F2 = Z2 e seja
1 0 1 0 1
G = 1 1 0 1 0 .
1 1 1 1 1
(x1 , x2 , x3 )G = (10101),
ou seja,
x1 + x2 + x3 = 1
x2 + x3 = 0
x1 + x3 = 1
x2 + x3 = 0
x1 + x3 = 1,
Logo x1 = 1, x2 = 0 e x3 = 0.
Observe que efetuando operações sobre as linhas de G do tipo L1, L2 e L3, podemos
converter G na forma
1 0 0 0 0
G0 = 0 1 0 1 0 .
0 0 1 0 1
xG0 = (x1 x2 x3 x2 x3 )
Definição 5.13. Diremos que uma matriz geradora G de um código C está na forma
padrão se tivermos
G = (Idκ |A),
Dado um código C, nem sempre é possı́vel obter uma matriz geradora de C na forma
padrão.
De modo geral, além das operações nas linhas, efetuamos também sequências de
operações sobre as colunas do tipo:
Teorema 5.15. Dado um código C, existe um código equivalente C 0 com matriz geradora
na forma padrão.
C ⊥ = {v ∈ K n : hu, vi = 0, ∀u ∈ C}.
i) C ⊥ é um subespaço vetorial de K n ;
ii) x ∈ C ⊥ ⇐⇒ Gx = 0.
i) dimC ⊥ = n − κ;
Lema 5.18. 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
36 5. Códigos Lineares
i) (Tσ (C))⊥ = Tσ (C ⊥ )
Proposição 5.19. Sejam C e D dois códigos lineares em K n que são linearmente equi-
valentes, então C ⊥ e D⊥ são linearmente equivalentes.
Lema 5.20. Suponha que C seja um código de dimensão κ em K n com matriz geradora
G. Uma matriz H de ordem (n − κ) × n, com coeficientes em K e com linhas linearmente
independentes, é uma matriz geradora de C ⊥ se, e somente se,
GH t = 0.
Proposição 5.21. Seja C um código linear e suponhamos que H seja uma matriz gera-
dora de C ⊥ . Temos então que
v ∈ C ⇐⇒ Hv = 0.
0 0 1 0 1 0
Como G está na forma padrão, podemos usar a Proposição 5.17 (ii) e ter a matriz teste
de paridade
1 0 0 1 0 0
H = 1 1 1 0 1 0 .
1 1 0 0 0 1
0 0
temos que v ∈ C e v 0 ∈
/ C.
d ≤ n − κ + 1.
Definição 5.25. Os códigos de Reed-Muller (de primeira ordem) Rn são definidos indu-
tivamente por:
1 Para n = 0, R0 = Z2 .
" # " #
u 0
e
u 1
Em R1 todo vetor de código tem peso 1, exceto 0 e 1;e, em R2 todo vetor de código
tem peso 2, exceto 0 e 1. Essa é uma propriedade geral dos códigos de Reed-Muller.
Observação 5.26. O complemento de um vetor x de Zn2 é o vetor de x obtido trocando-se
todos os zeros por 1s, e vice-versa.
Exemplo 5.27.
1 0
1
⇐⇒ x = 0
x=
0
1
1 0
2k+1
u, 0 e 1 estão em Z2k2 ; assim os vetores da base para Rk+1 estão em Z"2 .# Além disso,
u
a dimensão de Rk é k + 1, pprtanto, existem k + 1 vetores da forma e mais um,
u
" #
0
. Segue que a dimensão de Rk+1 é k + 2.
1
Finalmente observemos que Rk+1 é um código linear (2k+1 , k + 2). Para a afirmação
final, observe que os vetores de Rk+1 são obtidos por combinação linear dos vetores da
base, e, portanto, são da forma
" # " # " #
u1 uk+1 0
v = c1 + . . . +ck+1 + ck+2
u1 uk+1 1
w(u) = 2k - w(u)
temos que
Isto significa que o produto interno sobre os números reais de linhas distintas é 0.
No caso de dimensão
" ser potências
# de dois, podemos obter recursivamente por
Hn Hn
H1 = [1] e H2n =
Hn −Hn
" # 1 1 1 1
1 1 1 -1 1 -1
H1 = [1] H2 = H4 =
1 -1
1 1 -1 -1
1 -1 -1 1
Hn HnT = nIn
(1) P1 = [0, 1]
(2) Se Pi = [b1 , b2 , . . . , b2i ] então Pi+1 = [b1 0, b2 0, . . . , b2i 0, b1 1, b2 1, . . . , b2i 1], para 1 ≤ i ≤
r − 1.
Se inverter a ordem dos digitos, a ordenação acima é a ordem crescente dos números
binários associados.
Exemplo 5.32.
P1 = [0, 1]
P2 = [00, 10, 01, 11]
P3 = [000, 100, 010, 110, 001, 101, 011, 111]
0 1 1 1 0 0 1 0 1 1 1 0 0 1 0
0 1 0 1 0 1 0 1
Reordenando, temos B3 = 0 0 1 1 0 0 1 1 e consequentemente, a matriz
0 0 0 0 1 1 1 1
1 1 1 1 1 1 1 1
0 1 0 1 0 1 0 1
geradora do código será B3 =
0 0 1 1 0 0 1 1
0 0 0 0 1 1 1 1
Suponha
que foi recebido r = (01110110). Amatriz de Hadamard de ordem 8 é
1 1 1 1 1 1 1 1
1 −1 1 −1 1 −1 1 −1
1 1 −1 −1 1 1 −1 −1
1 −1 −1 1 1 −1 −1 1
H8 =
1 1
1 1 −1 −1 −1 −1
1 −1 1 −1 −1 1 −1 1
1 1 −1 −1 −1 −1 1 1
1 −1 −1 1 −1 1 1 −1
Se r = (01110110) então R = (1, −1, −1, −1, 1, −1, −1, 1), calculamos R̂ = HR. No
nosso exemplo, R̂ = (−2, 2, 2, 6, −2, 2, 2, −2).
Encontre a coordenada que tem o maior
valor absoluto. No exemplo, é k = 4, pois R̂4 = 6.
Considere
o vetor u como a k-ésima coluna de Br . Nosso exemplo, será a quarta coluna
1
que é u = 1
0
P
c= ui vi onde vi é a i-ésima linha de G.
Então c = 1v1 + 1v2 + 0v3 = [01010101] + [00110011] = [01100110] = (01100110).
Temos que o código da fonte é u ∈ Z42 com GT u = c. Logo, u = (0, 1, 1, 0).
43
Referências Bibliográficas
[3] HEFEZ, A.; VILLELA, M.L.T. Códigos Corretores de Erros. Série de Computação
e Matemática. Rio de janeiro: IMPA, 2002. 217p.
[4] LOURENÇO, M. L.; COELHO, F. U.Um curso de Álgebra Linear. EDUSP, São
Paulo, 2005. 261p.
[5] MILIES, C. M. A Matemática dos códigos de barras: detectando erros. RPM 65.
p.38-42.
[6] POOLE, D. Álgebra Linear. São Paulo: Pioneira Thomson Learning, 2004. 690p.