Universidade Federal de São Carlos Centro de Ciências Exatas e de Tecnologia Departamento de Matemática Códigos Corretores de Erros Autor: Carla Meneghesso Orientador: Prof. Dr. Sadao Massago Disciplina: Trabalho de Conclusão de Curso Curso: Licenciatura em Matemática Professores Responsáveis: Karina Schiabel Silva Sadao Massago Vera Lúcia Carbone São Carlos, 6 de agosto de 2012. i Códigos Corretores de Erros Autor: Carla Meneghesso Orientador: Prof. Dr. Sadao Massago Disciplina: Trabalho de Conclusão de Curso Curso: Licenciatura em Matemática Professores Responsáveis: Karina Schiabel Silva Sadao Massago Vera Lúcia Carbone Instituição: Universidade Federal de São Carlos Centro de Ciências Exatas e de Tecnologia Departamento de Matemática São Carlos, 6 de agosto de 2012. Carla Meneghesso Sadao Massago iii 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 conseguido 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 para acrescentar o código de canal 2 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 o chamado código de Golay que permitia corrigir até três erros. No capı́tulo 1, são apresentados conceitos algébricos que darão suporte aos demais capı́tulos que tratam de códigos detectores e códigos corretores de erros, como anel dos inteiros, classificação e construção de corpos finitos, espaço vetorial, etc. O capı́tulo 2 trata dos códigos binários e como os vetores de códigos são determinados, incluindo o processo de codificação e de decodificação de uma mensagem. No capı́tulo 3 são estudados os códigos detectores de erros, incluindo os códigos bit de paridade. Neste capı́tulo serão dadas aplicações dos códigos detectores de erros, como o UPC (Universal Product Code), o EAN13 e o ISBN (International Standard Book Number). No capı́tulo 4 é feita um abordagem dos códigos corretores de erros, tratando da matriz geradora do código e de teste de paridade no Matlab, Métrica de Hamming, Equivalência de códigos, Código de Hamming, Decodificação, Algoritmo da decodificação, Distâncias mı́nimas e Corretores de erros geométricos. No capı́tulo 5 são estudados os Códigos lineares, a matriz geradora destes códigos, Códigos duais, Códigos de Reed-Muller e Decodificação de Códigos de Reed-Muller. No capı́tulo 6 é feito o estudo dos Códigos cı́clicos e sua decodificação. xiii Sumário 1 Conceitos Preliminares 1 2 Códigos 2.1 Códigos Binários . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 7 3 Códigos Detectores de Erros 9 3.1 Código bit de paridade par (3, 2) . . . . . . . . . . . . . . . . . . . . . . . 9 3.2 Aplicações de Códigos Detectores de Erros . . . . . . . . . . . . . . . . . . 11 4 Códigos Corretores de Erros 4.1 Matriz geradora e de teste de paridade no Matlab . . . . . . 4.2 Métrica de Hamming . . . . . . . . . . . . . . . . . . . . . . 4.3 Códigos de Hamming . . . . . . . . . . . . . . . . . . . . . . 4.4 Decodificação . . . . . . . . . . . . . . . . . . . . . . . . . . 4.5 Algoritmo da Decodificação . . . . . . . . . . . . . . . . . . 4.6 Distâncias Mı́nimas e Corretores de Erros Geometricamente 5 Códigos Lineares 5.1 Equivalência de Códigos . . . . . . . . . 5.2 Matriz Geradora de um Código . . . . . 5.3 Códigos Duais . . . . . . . . . . . . . . . 5.4 Códigos de Reed-Muller . . . . . . . . . 5.5 Decodificação de Códigos de Reed-Muller Referências Bibliográficas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 21 23 25 26 27 28 . . . . . 29 31 32 35 37 39 43 xv Lista de Figuras 1.1 1.2 1.3 Aritmética módulo m . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Aritmética módulo 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Reta numerada enrolada em volta de um cı́rculo . . . . . . . . . . . . . . . 3.1 3.2 3.3 3.4 3.5 Palavras de código de bit de paridade par (3, 2) . . . Exemplo de UPC . . . . . . . . . . . . . . . . . . . . Explicação do código de barras utilizado em produtos Exemplo do código de barras utilizado atualmente . . ISBN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 12 13 14 15 4.1 4.2 4.3 4.4 Procedimento para transmissão de dados . . . . . . . . . . Representação do disco e da esfera de centro em a e raio t Representação geométrica dos códigos corretores de erros . Representação esférica dos códigos corretores de erros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 24 28 28 . . . . . . . . . . 2 2 3 1 Capı́tulo 1 Conceitos Preliminares Para o desenvolvimento do estudo de códigos, precisamos introduzir alguns conceitos básicos de estruturas algébricas, tais como anéis e corpos, o que permitem tratar os conjuntos que possuem operações com propriedades similares. Definição 1.1. Um anel comutativo é um conjunto A munido de duas operações, + : A×A → A (a, b) 7→ a + b e · : A×A → A (a, b) 7→ a · b que chamaremos respectivamente de adição e multiplicação, possuindo as seguintes propriedades: (i) Associatividade da adição: ∀a, b, c ∈ A, (a + b) + c = a + (b + c). (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. (iii) Existência de elemento inverso para a adição: Dado a ∈ A, existe um único elemento chamado simétrico de a e denotado por −a tal que a + (−a) = −a + a = 0. (iv) Comutatividade da adição: ∀a, b ∈ A, a + b = b + a. (v) Associatividade da multiplicação: ∀a, b, c ∈ A, (a.b).c = a.(b.c). (vi) Existência de elemento neutro para a multiplicação: Existe um elemento neutro chamado unidade e denotado por 1 tal que ∀a ∈ A, a.1 = 1.a = a. (vii) Comutatitvidade da multiplicação: ∀a, b ∈ A, a.b = b.a. (viii) Distributividade da multiplicação com relação à adição: ∀a, b, c ∈ A, a.(b + c) = a.b + a.c. 2 1. Conceitos Preliminares Exemplo 1.2. O anel dos inteiros módulo m. O Zm = {0, 1, 2, . . . , m − 1, }, m ≥ 0 possui as operações + e · definidas por: (i) a + b = a + b, (ii) a · b = a · b No exemplo 1.2, o conjunto Zm = {0, 1, 2, . . . , m − 1, } de inteiros módulo m corresponde ao relógio de m horas representado pela Figura 1.1 e o conjunto dos vetores m-ários de comprimento n são denotados por Znm . Os códigos que utilizam os vetores m-ários são chamados códigos m-ários. Figura 1.1: Aritmética módulo m No caso dos inteiros módulo 3, podemos representar o conjunto como um relógio de três horas, como na Figura 1.2 . Figura 1.2: Aritmética módulo 3 Quando calculamos 1 + 2 = 0 interpretamos do seguinte modo: duas horas após 1 hora é 0 hora. Assim, como 24:00 e 12:00 são representados pela mesma marca em um relógio de doze horas, 3 e 0 são equivalentes em um relógio de três horas. Todos os números múltiplos de 3 são equivalentes a 0; os números que são iguais a 1 mais um múltiplo de 3 é equivalente a 1; e 2 é equivalente a qualquer número que seja igual a 2 mais um múltiplo de 3. É como se fosse uma reta numerada enrolada em volta de um cı́rculo como na Figura 1.3. Exemplo 1.3. Em Z53 sejam u = (2, 2, 0, 1, 2) e v = (1, 2, 2, 2, 1). Então: 1. Conceitos Preliminares 3 Figura 1.3: Reta numerada enrolada em volta de um cı́rculo u·v =2·1+2·2+0·2+1·2+2·1 =2+1+0+2+2 =1 Os vetores de código em Z53 são chamados de vetores ternários de comprimento 5. Definição 1.4. Um anel A será chamado de domı́nio de integridade, se possuir a seguinte propriedade: ∀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.5. Um elemento a de um anel A será dito invertı́vel se existir um elemento b ∈ A tal que a · b = 1. Nesse caso, dizemos que b é um inverso de a. Definição 1.6. Um anel onde todo elemento não nulo é invertı́vel é chamado de corpo. Um exemplo de corpo são os inteiros módulo 3 que consistem no conjunto Z3 = {0, 1, 2}, com adição e multiplicação dadas como no exemplo 1.3. A tabela de operação é como segue. Tabela 1.1: Operações de adição e multiplicação em Z3 + 0 1 2 0 0 1 2 1 1 2 0 2 2 0 1 e · 0 1 2 0 0 0 0 1 0 1 2 2 0 2 1 Como os elementos não nulos 1 e 2 são invertı́veis, com inversos respectivamente 1 e 2, temos que Z3 é um corpo. Teorema 1.7. O anel Zm é um corpo se, e somente se, m é um número primo. Exemplo 1.8. Seja b = (b1 , b2 , · · · , bn ) um vetor de Zn3 . Incluindo um dı́gito de checagem ao vetor de código, vamos ter um código com n + 1 termos e pode ser expresso como v = (b1 , b2 , · · · , bn , d) onde d é um dı́gito de checagem de forma que 1 · v = 0 e v é um vetor de código em Zn+1 . O dı́gito de checagem satisfaz 3 4 1. Conceitos Preliminares 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: (A) A cada par u, v de vetores de V corresponde um único vetor u + v ∈ V , chamado soma de u e v, de modo que: (A1) u + v = v + u, ∀ u, v ∈ V (propriedade comutativa). (A2) (u + v) + w = u + (v + w), ∀ u, v, w ∈ V (propriedade associativa). (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. (M) A cada par α ∈ K e v ∈ V , corresponde um vetor α · v ∈ V , denominado produto por escalar de α por v de modo que: (M1) (αβ) · v = α · (β · v), ∀α, β ∈ K e ∀v ∈ V (propriedade associativa). (M2) 1 · v = v, ∀v ∈ V (onde 1 é o elemento identidade de K). 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 . Definição 1.10. Seja V um espaço vetorial sobre um corpo K. Um subconjunto W de V é um subespaço vetorial de V se a restrição das operações de V a W torna esse conjunto um K-espaço vetorial. Note que como Z2 é corpo, Zn2 é um espaço vetorial. Dado um corpo F, V = Fn é um espaço vetorial com produto escalar canônico. No exemplo 1.3, considerando o vetor u = (2, 2, 0, 1, 2), ao somarmos suas coordenadas temos 2 + 2 + 0 + 1 + 2 = 1 e vemos que o dı́gito de checagem deve ser 2 para que a soma das coordenadas com o dı́gito de checagem seja igual a zero módulo Z3 e então o vetor código de checagem é v = (2, 2, 0, 1, 2, 2). Os códigos de checagem de dı́gitos podem detectar erros simples, mas para detectar a troca de duas coordenadas adjacentes, por exemplo, outros tipos de códigos são utilizados. Muitos deles substituem o vetor de checagem 1 por algum outro vetor c cautelosamente escolhido. Como os dados no computador, os dados são codificados usando sequência de 0s e 1s que podem ser associados ao vetor binário v ∈ Zn2 . Por esta razão, o corpo Z2 tem papel importante na teoria de códigos. 1. Conceitos Preliminares 5 Proposição 1.11. Seja A, +, · um anel e seja I um subconjunto de A. Então, I é um subanel de A se e somente se as seguintes condições são verificadas: (i) 0 ∈ I (o elemento neutro de A pertence a I) (ii) x, y ∈ I =⇒ x − y ∈ I (I é fechado para a diferença) (iii) x, y ∈ I =⇒ x · y ∈ I (I é fechado para o produto). Definição 1.12. Seja A um anel e seja I um subanel de A. Dizemos que I é um ideal de A se (i) (x + y) ∈ I, ∀x, y ∈ I (ii) a · x ∈ I, ∀a ∈ A, ∀x ∈ I (simbolicamente A · I ⊂ I e I · A ⊂ I). 6 1. Conceitos Preliminares 7 Capı́tulo 2 Códigos 2.1 Códigos Binários Os códigos binários consistem em vetores cujas coordenadas são iguais a 0 ou 1. Os computadores descrevem dados em termo de 0s e 1s (que podem ser interpretados como desligado/ligado, fechado/aberto, falso/verdadeiro ou não/sim). A aritmética é como segue + 0 0 0 1 1 1 1 0 e · 0 0 0 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 . Exemplo 2.1. Soma em 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) Exemplo 2.3. Sejam u = (1, 1, 0, 1, 0) e v = (0, 1, 1, 1, 0) dois vetores binários de comprimento 5. Determine u.v O cálculo de u.v é feito em Z2 , por isso temos u.v = 1.0 + 1.1 + 0.1 + 1.1 + 0.0 =0+1+0+1+0 =0 8 2. Códigos Para a transmissão de dados, começamos codificando cada “palavra”da mensagem por um vetor binário. Ou seja, converte-se o que se quer transmitir numa sequência de bits que compõe o vetor binário. Definição 2.4. Um código binário é um conjunto de vetores binários (de mesmo comprimento) 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 Códigos Detectores de Erros O Código detector de erros é a representação de uma mensagem que permite detectar erros. Note que no envio de mensagens através de um canal (por exemplo uma linha de telefone, ondas de rádio, um cabo de fibra ótica) podem ocorrer “ruı́dos”, como sinais de interferência ou sujeira. O mesmo ocorre quando se faz a leitura de código de barras, CD/DVD ou HD, na qual o erro pode ser introduzido. O objetivo do código é detectar possı́veis erros na transmissão ou na leitura. Um destes códigos detectores de erros é o bit de paridade, que permite obter um código eficiente e relativamente simples. A seguir faremos uma abordagem do código bit de paridade par (3, 2). 3.1 Código bit de paridade par (3, 2) No código bit de paridade par (3, 2) adiciona-se um bit de paridade no final da mensagem. Esse bit é a soma módulo 2 dos bits da mensagem obtendo-se assim a palavra de código c = [c0 , c1 , c0 + c1 ] Logo, somando-se os dı́gitos temos: ( Soma dos dı́gitos = [número de bits ativo] ×1 = 0 1 se for par se for ı́mpar Logo, a soma de dı́gitos de c sempre é 0. Vejamos na tabela 3.1, as palavras de código para cada mensagem enviada. Este código tem d = 2 e detecta a presença de 1 e 3 bits errados, pois o valor d = 2 garante que erros de 1 bit podem ser detectados, para qualquer código. Neste código é possı́vel também detectar 3 bits errados. A decodificação é realizada recalculando a paridade da mensagem recebida e fazendo a comparação da mesma com o código transmitido. Se as palavras enviada e recebida forem iguais não serão detectados erros, caso contrário poderão ser detectados 1 ou 3 erros na palavra recebida. A figura 3.1 mostra a posição relativa das palavras de código, mostrando que d = 2, pois é necessário percorrer duas arestas do cubo para ir de uma até outra palavra de código. Quando ocorrem um número 10 3. Códigos Detectores de Erros Tabela 3.1: Mensagens e palavras de código para o código bit de paridade par (3, 2) Mensagem Palavra de código 00 000 01 011 10 101 11 110 ı́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. Figura 3.1: Palavras de código de bit de paridade par (3, 2) Vejamos como funcionam os códigos detectores de erros através de alguns exemplos. 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. Tabela 3.2: Comandos codificados como elementos de Z32 Mensagem Código Up (0,0,0) Down (0,1,1) Left (1,0,1) Right (1,1,0) 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 , onde o dı́gito de checagem d é escolhido de k maneira que b1 + b2 + . . . + bn + d = 0 em Zk ou 1.v = 0 onde 1 = (1, 1, . . . , 1) é um vetor com todas as coordenadas iguais a 1. O vetor 1 é chamado vetor de checagem. Quando ocorrem erros, temos que 1 · v 6= 0 para algum v. Nesse projeto, estamos estudando o caso que ocorre apenas um erro. As coordenadas dos vetores de código podem ser elementos do conjunto finito Zk+1 = {0, 1, 2, . . . , k} para k ≥ 2 que é um anel. 3.2 Aplicações de Códigos Detectores de Erros Dentre as aplicações dos Códigos Detectores de Erros estão o UPC (Código Universal de Produto), o EAN-13 (Código de barras) e o ISBN (Padrão Internacional de Numeração de Livros), que são códigos que possuem o dı́gito de checagem. UPC(Universal Product Code) - Código Universal de Produto e EAN-13 Há dois tipos de códigos de barras em uso para identificação dos itens à venda. O UPC é o mais antigo deles, usado inicialmente apenas na América do Norte. Ele utiliza doze dı́gitos (escrito na forma de barras) para ser lidos por uma máquina de luz refletida. Também vem com os números abaixo das barras para ser lidos por um humano quando necessário. Com o tempo, passou-se a usar o EAN-13 que utiliza treze dı́gitos, que permite também distinguir o paı́s de origem do produto. Esse é o que está sendo utilizado no Brasil. Os dois tipos de códigos são muito semelhantes, onde o UPC usa apenas um dı́gito para 12 3. Códigos Detectores de Erros 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 escaneia 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) Depois de um rearranjo, temos 3(v1 + v3 + v5 + v7 + v9 + v11 ) + (v2 + v4 + v6 + v8 + v10 ) + d = 0 onde d é o dı́gito de checagem. Os pesos dos dı́gitos das posições pares e ı́mpares são diferentes para detectar o deslocamento de digitos devido a erros de entrada, como troca de posição de dois dı́gitos consecutivos. O dı́gito de checagem é escolhido de maneira que o lado esquerdo da expressão resulte num múltiplo de 10. 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 . Figura 3.2: Exemplo de UPC Temos que v = (0, 7, 4, 9, 2, 7, 0, 2, 0, 9, 4, d) (3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1), obtemos: e sabendo que c = 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 Como 4 + d = 0 em Z10 , então d deve ser igual a 6. 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 Como c · v 0 = 4 6= 0 em Z10 , então concluı́mos que houve algum erro. Agora suponhamos que um determinado produto está identificado no sistema EAN-13, por uma dada sequência de dı́gitos v = (v1 , v2 , . . . , v12 , d). Os primeiros doze dı́gitos identificam o paı́s de origem, o fabricante e o produto especı́fico, e são determinados a cargo de uma autoridade classificadora em cada paı́s. Veja a figura a seguir. Figura 3.3: Explicação do código de barras utilizado em produtos O décimo terceiro dı́gito, chamado de dı́gito de verificação utilizado para a detecção de erros, e será denotado por d. Denotaremos essa sequência como um vetor α = (v1 , v2 , . . . , v12 , d). O sistema EAN − 13 utiliza o vetor de checagem ou vetor de pesos c = (1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1). A sistemática é a mesma do UPC, mudando apenas o número de dı́gitos do vetor que representa o artigo. Por exemplo, no caso do código da figura que segue, os números indicam o paı́s de origem, o fabricante e o produto são 789500026624. 14 3. Códigos Detectores de Erros Figura 3.4: Exemplo do código de barras utilizado atualmente Vamos determinar o dı́gito de verificação d e fazendo o produto escalar com o vetor de pesos, temos: 7 + (3.8) + 9 + (3.5) + 0 + (3.2) + 6 + (3.6) + 2 + (3.4) + d = 99 + d Logo, deve-se ser d = 1, pois a soma acima deve ser múltiplo de 10. Se fosse qualquer outro número de 0 a 9, não resultaria no múltiplo de 10 e então o computador avisaria que um erro foi cometido. Se mais de um erro for cometido na digitação, provavelmente será detectado, mas isso não é garantido já que eles podem compensar mutuamente e a soma poderia ainda continuar sendo um múltiplo de 10. Veremos a função do vetor de pesos? Se a escolha do dı́gito de verificação fosse feita para a soma das coordenadas de (v1 , v2 , . . . , v12 , d) ser múltiplo de 10, o que equivaleria a considerar o vetor de pesos (1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), ainda poderia detectar um erro. Acontece que há um outro tipo de erro de digitação muito comum, que consiste em digitar todos os números corretamente, mas trocar a ordem de dois dı́gitos consecutivos. Nesse caso o vetor (1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) não detecta o erro. Logo, o sistema de detecção acima não tem a capacidade de detectar todo erro de transposição cometido. A transposição de dois dı́gitos vi e vi+1 não é detectada no EAN-13, se e somente se |vi − vi+1 | = 5 (se vi é ı́mpar, tem-se a diferença com o sinal trocado). ISBN(Intenational Standard Book Number)- Padrão Internacional de Numeração de Livros O ISBN é um outro código de checagem de dı́gito, utilizado universalmente para a classificação de livros. É projetado para detectar mais tipos de erros que o UPC. O vetor de código é um vetor em Z10 11 . As primeiras 9 componentes dão paı́s, editor e informação sobre o livro e a décima componente é o dı́gito de checagem. Para o código ISBN, o vetor de checagem ou vetor peso é 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 Figura 3.5: ISBN (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 Códigos Corretores de Erros 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 Oeste → 7 00 01 Norte Sul 7→ 7→ 10 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 redundâ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 01 10 11 7→ 7→ 7→ 7→ 00000 01011 10110 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 é chamado 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 Figura 4.1: Procedimento para transmissão de dados O funcionamento dos códigos corretores do exemplo do robô é esquematizado a seguir: O esquema acima exemplifica os códigos corretores de erros. Inicialmente, transformamos os dados a serem transmitidos em um código da fonte que é convertido num código de canal, acrescentando-se redundâncias. Ao receber, detecta e corrige os erros e em seguida, o código de canal é decodificado em código da fonte. Neste projeto serão estudados os códigos, denominados códigos simétricos que apresentam as seguintes propriedades: (a) Todos os sı́mbolos (dı́gitos) transmitidos têm a mesma probabilidade de serem recebidos errados e essa probabilidade é pequena; (b) Se um sı́mbolo é recebido errado, a probabilidade de ser qualquer um dos outros sı́mbolos é a mesma. Agora vamos entender matematicamente como funciona o vetor de código e o processo de geração de um código. Seja a nossa mensagem, um vetor x em Zk2 para algum k, e iremos codificá-lo utilizando uma transformação por meio da matriz T : Zk2 → Zn2 para algum n > k T (x) será um vetor de código. Um código pode ser descrito através de uma transformaçã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 c = c 1 2 c = c 1 3 19 c + c = 0 1 2 =⇒ c + c = 0 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 matriz h k × (n =ik) sobre Z2 é dito matriz geradora padrão para o código. Uma matriz P = B In−k é dito matriz de verificação de paridade padrão. G e P são associados ao código T : Z2k → Z2n quando T x = Gt x e P Gt x = 0 ∀x, ou seja, P Gt = 0. No teorema a seguir temos a condição para G ser a matriz geradora padrão para um código binário de correção de erros e como encontramos uma matriz de verificação de paridade padrão associada a P . h i h i Teorema 4.3. Sejam G = Ik A e P = B In−k . P será a matriz de verificação de paridade associada a matriz geradora padrão G se, e somente se, At = B. Além disso, o código binário correspondente (n, k) será um corretor de erros (em uma componente) se, e somente se, as colunas de P forem não nulas e distintas. Demonstração. Chamamos ati a i-ésima linha de uma matriz A e bi , o i-ésima coluna de B. Seja G uma matriz geradora padrão e P uma matriz de verificação de paridade. Vamos assumir que as duas matrizes correspondem ao mesmo código binário. Portanto, para todo x em Zk2 , P G x = 0. Usando a multiplicação por blocos temos: 20 4. Códigos Corretores de Erros P Gt x = h B I i " I At # x = 0 para todo x em Zk2 Ou seja, h B I i " I At # x = (BI + IAt ) x = 0 Para todo x em Zk2 , temos 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 bi = B ei = At ei = ati para todo i Portanto, B=At . # I Reciprocamente, se B = At , PGt = B I = B + At = 0 em Z2 . Agora, t A veremos que se Pi forem não nulas e distintas, então é matriz de paridade para corretor de erros, precisamos verificar que P detecta posição de erros. Seja x, a mensagem em Zk2 e c = Gx. Então terı́amos P c = 0. Se ocorrer um erro na i-ésima posição de c, o código recebido seria c0 = c + ei. Então temos P c0 = P c + P ei = 0 + Pi que é a i-ésima coluna de P . Como todas as coluna sde P são distintas (e não nulas) podemos identificar a posição do erro. h i " 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 = Z32 . Uma destas opções é 2 1 1 0 P= 1 0 1 0 1 1 1 1 1 0 1 0 0 1 0 Isso significa que 1 A= 1 0 e dessa forma, uma matriz geradora é 1 0 0 1 1 1 1 1 1 0 0 1 4.1. Matriz geradora e de teste de paridade no Matlab G= 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 1 0 1 1 0 1 1 0 1 1 1 21 4×7 Para exemplificar como a matriz geradora funciona, vamos considerar x = (0, 1, 0, 1) e codificar como 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 0 P c = 1 0 1 0 0 1 1 1 1 1 1 0 1 0 0 1 0 0 h 0 · 0 1 1 1 1 0 1 0 it = h 0 1 1 it 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 . O código do exemplo 4.4 é chamado de código de Hamming (7,4). Em geral, todos os códigos binários construı́dos dessa forma são chamados de código de Hamming (n, k), o que veremos mais adiante. Um código de Hamming (n, k) tem n = 2n−k − 1. 4.1 Matriz geradora e de teste de paridade no Matlab Vamos determinar a matriz geradora padrão (G) e a matriz de verificação de paridade (H) para um código binário (7, 4), utilizando a função hammgen no Matlab. O parâmetro de entrada é o fator r de desenho do código, tal que (n, k) = (2r − 1, 2r − 1 − r). A " função # A hammgen retorna, além das matrizes H e G definidas neste caso como G = e Ik " # In−k H= , também os valores de n e k. AT 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. 4.2 Métrica de Hamming Seja A um conjunto finito que daqui em diante será chamado de alfabeto. Um código corretor de erros é um subconjunto próprio qualquer de An . Para ter a noção de proximidade entre palavras (sequência de alfabetos), veremos um modo de medir a distância entre palavras. Definição 4.5. Dados dois elementos u, v ∈ An , a distância de Hamming entre u e v é definida como d(u, v) = |{i : ui = vi , 1 ≤ i ≤ n}|. Proposição 4.6. Dados u, v, w ∈ An , valem as seguintes propriedades: (i) Positividade: d(u, v) ≥ 0 e d(u, v) = 0 ⇐⇒ u = v. (ii) Simetria: d(u, v) = d(v, u). (iii) Desigualdade Triangular: d(u, v) ≤ d(u, w) + d(w, v). Logo, a distância de Hamming é uma métrica, também chamados de métrica de Hamming. Definição 4.7. Seja C um código. A distância mı́nima de C é o número 24 4. Códigos Corretores de Erros 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. Definição 4.8. Dado a ∈ An e um número real t > 0, definimos o disco e a esfera de centro em a e raio t como sendo D(a, t) = {u ∈ An : d(u, a) ≤ t}, S(a, t) = {u ∈ An : d(u, a) = t}. respectivamente. A definição 4.8 pode ser representada da seguinte forma: Figura 4.2: Representação do disco e da esfera de centro em a e raio t Como consequência da definição 4.8 e desigualdade triangular, temos: 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 c erros e detectar até d − 1 erros. 2 Demonstração. Se ao transmitirmos uma palavra c do código cometermos t erros com t ≤ κ, originando a palavra r, então d(r, c) = t ≤ κ. Pelo Lema 4.9, a distância de r a qualquer outra palavra do código é maior do que κ. Isso determina c univocamente a partir de r, como sendo o código mais próximo. Por outro lado, dada uma palavra do código, podemos nela introduzir até d − 1 erros sem encontrar uma outra palavra do código, e assim, a detecção do erro será possı́vel. A tabela 4.1 apresenta as capacidades de detecção, correção e detecção e correção simultâneas, em função da distância mı́nima, para alguns valores. Analisando a tabela acima, verificamos que: 4.3. Códigos de Hamming 25 Tabela 4.1: Capacidades de detecção e correção de erros em função da distância mı́nima d Detecção (l) Correção (t) Detecção e Correção simultâneas (l, t) 1 0 0 Não tem 2 1 0 Não tem 3 2 1 Não tem 4 3 1 (2,1) 5 4 2 (3,1) (1) Apenas para d ≥ 4 é que se torna possı́vel a detecção e a correção em simultâneo; (2) A capacidade de detecção é sempre superior à capacidade de correção; (3) Um código com d = 1 não tem capacidade para detectar erros; por exemplo, considerando 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). As capacidades de detecção e correção são obtidos à custa da introdução de redundâncias e dependem da distância mı́nima do código. Aumentar a distância mı́nima melhora as capacidades de detecção e correção, mas em contrapartida diminui a aficiência do código. Os critérios para determinação dos códigos de codificação de canal são: (1) Dado o R, onde R é a medida da eficiência do código, maximizar d; (2) Dada a d minimizar R. Definição 4.11. Seja C ⊂ An um código com distância mı́nima d e seja κ = b d−1 c. O 2 código C será dito perfeito se [ 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. 4.3 Códigos de Hamming Um código de Hamming de ordem m sobre F2 = Z2 é um código com matriz teste de paridade Hm de ordem m × n, cujas colunas são os elementos de F2 m {0} numa ordem qualquer. 26 4. Códigos Corretores de Erros Temos que o comprimento de um código de Hamming de ordem m é n = 2m − 1 e a sua dimensão é κ = n − m = 2m − m − 1. Como veremos no próximo capı́tulo, podemos converter a matriz geradora de verificação de paridade na forma padrão. Considere a matriz 1 0 1 1 1 0 0 H3 = 1 1 0 1 0 1 0 . 0 1 1 1 0 0 1 Essa é a matriz de um código de Hamming (matriz de verificação de paridade) correspondente a m = 3. Proposição 4.12. Todo código de Hammming é perfeito. 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 transmitido 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 e = (101011) − (010011) = (111000). O peso do vetor erro corresponde ao número de erros cometidos durante a transmissão. Seja H a matriz teste de paridade do código, chamamos Hv de sı́ndrome de v. Como Hc = 0, temos que Het = H(r − c) = Hr − Hc = Hr. Portanto, a palavra recebida e o vetor erro têm mesma sı́ndrome. Lema 4.14. Seja C um código linear em K n com capacidade de correção κ. Se r ∈ K n e c ∈ C são tais que d(c, r) ≤ κ então existe um único vetor e com ω(e) ≤ κ, tal que a sı́ndrome é igual à sı́ndrome de r. Além disso, que c = r − e. Cada conjunto da forma v + C é chamado de classe lateral de v segundo C. Note que v + C = C ⇐⇒ v ∈ C. Lema 4.15. Os vetores u e v de K n têm a mesma sı́ndrome se, e somente se, u ∈ v + C. 4.5. Algoritmo da Decodificação 27 Definição 4.16. Um vetor de peso mı́nimo numa classe lateral é chamado de elemento lı́der dessa classe. 4.5 Algoritmo da Decodificação (1) Calcule a sı́ndrome s = Hr. (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 Neste caso d = 3 e, portanto, κ = b d−1 c = 1. 2 Os vetores de peso ≤ 1 com suas respectivas sı́ndromes estão relacionados abaixo Lı́der Sı́ndrome 000000 000 000001 001 000010 010 000100 100 001000 101 010000 011 100000 110 Suponhamos, agora, que a palavra recebida seja (a) r = (100011). Logo, S = Hr = (101) e, portanto, e = (001000). Consequentemente, c = r − e = (101011). (b) r = (111111). Logo, S = Hr = (111), que não se encontra na tabela. Sendo assim, foi cometido mais do que 1 erro na mensagem r. 28 4.6 4. Códigos Corretores de Erros Distâncias Mı́nimas e Corretores de Erros Geometricamente Seja C um código de tripla repetição, temos um subconjunto de Z32 . Podemos representar os vetores de Z32 como vértices de um cubo unitário (figura 4.3(a)). A distância de Hamming entre quaisquer dois vetores x e y é só o caminho mais curto para ir de x até y, passando pelas arestas. O código C corresponde a dois desses vértices, c0 = 000 e c1 = 111. O fato de d(C) = 3 corresponde ao fato de c0 e c1 estarem a três unidades (arestas) um do outro (figura 4.3(b)). Se um vetor recebido x estiver ao máximo de uma unidade de algum desses vetores-códigos e soubermos que ocorreu no máximo um erro, poderemos corretamente decodificar x como o vetor-código mais próximo. Em geral, não podemos desenhar figuras de Zn2 . Figura 4.3: Representação geométrica dos códigos corretores de erros 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). Figura 4.4: Representação esférica dos códigos corretores de erros 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 Neste capı́tulo apresentaremos a classe de códigos denominada de Códigos Lineares. Definição 5.1. Um código C ⊂ K n será chamado de código linear se for um subespaço vetorial de K n . O código do robô citado anteriormente, por exemplo, é um código linear, pois o alfabeto nesse caso é A = F2 , o código é o subespaço vetorial de F52 , que é a imagem da transformação linear T : → F52 F22 (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 κ onde os λi , i = 1, . . . , κ, são elementos de K. Segue daı́ que M = |C| = q κ e, consequentemente, dimK C = κ = logq q κ = logq M. Definição 5.2. Dado x ∈ K n , define-se o peso de x como sendo o número inteiro ω(x) := |{i : xi 6= 0} | = d(x, 0) 30 5. Códigos Lineares onde d representa a métrica de Hamming. Definição 5.3. O peso de um código linear C definido como inteiro ω(C) := min{ω(x) : x ∈ C {0}. Proposição 5.4. 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). Devido o item ii da Proposição 5.4, a distância mı́nima de um código linear C será também chamada de peso do código C. Em álgebra linear, existem duas maneiras práticas de descrever subespaços vetoriais: uma como imagem, e outra como núcleo de transformações lineares. Veremos como se obtém a representação de C como imagem. Escolhemos uma base v1 , v2 , . . . , vκ de C e considere a aplicação linear T : Kκ → Kn x = (x1 , x2 , . . . , xκ ) 7→ (x1 v1 + x2 v2 + · · · + xκ vκ ) Então T é uma transformação linear injetora, cuja imagem é C. Portanto, ter um código C ⊂ K n de dimensão κ é equivalente a ter uma transformação linear injetora 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, e considere a aplicação linear H : C ⊕ C 0 → K n−k u ⊕ v 7→ v 5.1. Equivalência de Códigos 31 Então o núcleo é C. Para saber se c ∈ C, basta verificar se Hv = 0, o que tem custo computacional bem pequeno. 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 O código C é o núcleo da transformação linear H: 5.1 F43 → F23 x = (x1 , . . . , x4 ) 7→ (2x1 + 2x2 + x3 , 2x1 + x2 + x4 ) Equivalência de Códigos A noção de equivalência de códigos usa o conceito de isometria. 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: d(F (x), F (y)) = d(x, y) ∀ x, y ∈ An . Algumas propriedades conhecidas da isometria são: Proposição 5.7. 1. Toda isometria é uma bijeção. 2. A função identidade é uma isometria. 3. Se F é uma isometria, então F −1 é uma isometria. 4. Se F e G são isometrias, então F ◦ G é uma isometria. Dado a permutação π de {1, . . . , n}, denotemos Tπ (a1 , . . . , an ) = (aπ(1) , . . . , aπ(n) ). Se f : A =⇒ A é bijeção, definimos Tfi (a1 , . . . , an ) = (a1 , . . . , f (ai ), . . . , an ). Definição 5.8. Dados dois códigos C e C 0 em An , diremos que C 0 é equivalente a C se existir uma isometria F de An tal que F (C) = C 0 . O estudo mais aprofundado sobre a isometria costuma ser feita em livros sobre espaços métricos. 32 5. Códigos Lineares Teorema 5.9. Seja F : An → An uma isometria, então existem uma permutação π de {1, . . . , n} e bijeções fi de A, i = 1, . . . , n, tais que F = Tπ ◦ Tf11 ◦ · · · ◦ Tfnn . Corolário 5.10. Sejam C e C 0 dois códigos em An . Temos que C e C 0 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}. 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 equivalentes se, e somente se, existir uma permutação π de {1, . . . , n} e elementos c1 , . . . , cn de K\{0} tais que C 0 = {(c1 xπ(1) , . . . , cn xπ(n) ) : (x1 , . . . , xn ) ∈ C}. 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. 5.2 Matriz Geradora de um Código Sejam K um corpo finito com q elementos e C ⊂ K n um código linear. Denominamos parâmetros do código linear C à terna de inteiros (n, κ, d), onde κ é a dimensão de C sobre K, e d representa a distância mı́nima de C (que é igual ao peso ω(C)). O número de elementos M de C é igual a q κ . Seja β = {v1 , . . . , vκ } uma base ordenada de C e considere a matriz G, cujas linhas são os vetores vi = (vi1 , . . . , vin ), i = 1, . . . , κ, isto é, v1 . . G= . = vk v11 v12 · · · v1n .. .. . . .. . . . . vk1 vk2 · · · vkn A matriz G é chamada de matriz geradora de C associada à base β. Considere a transformação linear definida por 5.2. Matriz Geradora de um Código 33 T : Kκ → Kn x 7→ (x1 v1 + · · · + xκ vκ ), Então T (K κ ) = C. Podemos, então, considerar K κ como sendo o código da fonte, C, o código de canal e a transformação T , uma codificação. Duas matrizes geradoras de um mesmo código C podem ser obtidas uma da outra por uma sequência de operações do tipo: (L1) Permutação de duas linhas. (L2) Multiplicação de uma linha por um escalar não nulo. (L3) Adição de um múltiplo escalar de uma linha a outra. Que são as operações elementares usadas no processo de escalonamento. Também podemos construir códigos a partir de matrizes geradoras G. Para isso, tome uma matriz cujas linhas são linearmente independentes e defina um código como sendo a imagem da transformação linear 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 Considerando a transformação linear T : F32 → F52 x 7→ Gt x e seja C = Im(T ), o código associado, por exemplo,a palavra 101 do código da fonte é codificada como 01010. Suponhamos agora que seja dado o código de canal 10101, e que gostarı́amos de decodificá-la, isto é, achar x de F32 tal que 10101 = T (x). Então precisamos resolver o sistema: x1 T G x2 = x3 1 0 1 0 1 34 5. Códigos Lineares (x1 , x2 , x3 )G = (10101), ou seja, x1 + x2 + x3 x2 + x3 x1 + x3 x2 + x3 x1 + x3 = = = = = 1 0 1 0 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 que é a forma padrão. Nesta forma, temos que G0T x = (x1 , x2 , x3 , x2 , x3 ) xG0 = (x1 x2 x3 x2 x3 ) Assim, o vetor x é apenas as três primeiras componentes do vetor a ser decodificado. Logo, a palavra (10101) é facilmente decodificada como (101). 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), onde Idκ é a matriz κ × κ e A, uma matriz κ × (n − κ). Dado um código C, nem sempre é possı́vel obter uma matriz geradora de C na forma padrão. Exemplo 5.14. O código em F52 com matriz geradora 0 0 1 0 1 0 0 0 1 1 ! não poderá ter uma matriz geradora na forma padrão. 5.3. Códigos Duais 35 Mas se efetuar também as permutações nas colunas, podemos obter a matriz 1 0 0 0 1 0 1 0 0 1 ! , que é a matriz geradora na forma padrão de novo código C 0 equivalente a C. De modo geral, além das operações nas linhas, efetuamos também sequências de operações sobre as colunas do tipo: (C1) permutação de duas colunas, (C2) multiplicação de uma coluna por um escalar não nulo, obtemos uma matriz G0 de um código C 0 equivalente a C. Com isso, temos o seguinte resultado: Teorema 5.15. Dado um código C, existe um código equivalente C 0 com matriz geradora na forma padrão. 5.3 Códigos Duais Seja C ⊂ K n um código linear, definimos o código dual como complemento ortogonal. C ⊥ = {v ∈ K n : hu, vi = 0, ∀u ∈ C}. As propriedades do complemento ortogonal costuma ser tratado no texto de álgebra linear. Lema 5.16. 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 ⊥ ⇐⇒ Gx = 0. Proposição 5.17. Seja C ⊂ K n um código de dimensão κ com matriz geradora na forma G = (Idκ |A). Então i) dimC ⊥ = n − κ; ii) H = (−A|Idn−κ ) é uma matriz geradora de C ⊥ . 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 ⊥ ) ii) (Tcj (C))⊥ = Tcj−1 (C ⊥ ) Proposição 5.19. Sejam C e D dois códigos lineares em K n que são linearmente equivalentes, 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 geradora de C ⊥ . Temos então que v ∈ C ⇐⇒ Hv = 0. Isto significa que H é matriz teste de paridade. Exemplo 5.22. Seja dado o código C sobre F2 com matriz geradora 1 0 0 1 1 1 G = 0 1 0 0 1 1 . 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 Dados v = (100111) e v 0 = (010101), como 0 1 0 Hv = 0 e Hv = 1 = 6 0, 0 0 temos que v ∈ C e v 0 ∈ / C. A matriz teste de paridade de um código contém, de maneira bastante simples, informações sobre o valor do peso do código. Teorema 5.23. Seja H a matriz teste de paridade de um código C. Então o peso de C é igual a s se, e somente se, quaisquer s − 1 colunas de H são linearmente independentes. 5.4. Códigos de Reed-Muller 37 Corolário 5.24. (Cota de Singleton) Os parâmetros (n, κ, d) de um código linear satisfazem à desigualdade d ≤ n − κ + 1. Um código será chamado de MDS (Maximum Distance Separable) se valer a igualdade d = n − κ + 1. 5.4 Códigos de Reed-Muller Relembrando que os códigos de Reed-Muller foi usado pela sonda espacial Mariner 9 para transmitir fotos de Marte. Para ser transmitida, cada fotografia foi dividida em elementos pictográficos, ou pixels. Foi sobreposta à fotografia uma grade de 700 × 832 pixels, e en seguida associou-se a cada pixel um entre 64 tons de cinza, variando de brando (0) a preto (63). Sabendo que 64 = 26 , usamos aritmética binária para representar cada uma dessas tonalidades, onde o branco é 000000 e o preto é 111111. Podemos, então, reescrever esses 64 números binários como vetores de Z62 e codificá-los usando um código que corrija tantos erros quanto possı́vel. O código escolhido para ser usado no Mariner 9 pertence a uma grande famı́lia de códigos que são mais facilmente definidos intuitivamente. Definição 5.25. Os códigos de Reed-Muller (de primeira ordem) Rn são definidos indutivamente por: 1 Para n = 0, R0 = Z2 . 2 Para n ≥ 1, Rn é o subespaço de Z2n 2 cuja base é formada por todos os vetores da forma " u u # " e 0 1 # , e 1 é o vetor formado onde u é o vetor da base em Rn−1 , 0 é o vetor nulo de Z2n−1 2 2n−1 por 1s em Z2 . Usando a definição acima, construiremos R1 e R2 , e verificaremos o tipo de vetores que esses códigos contêm. Uma base para R0 = Z2 é somente {1}, portanto, uma base para R1 é (" 1 1 # " , 0 1 #) que gera o código Não há como obter mais nenhum outro vetor através da adição e por isso 38 5. Códigos Lineares (" R1 = 0 0 # " , 0 1 # " , 1 0 # " , #) 1 1 = Z22 Realizando o mesmo procedimento obterı́amos a seguinte base para R2 1 0 0 1 1 0 , , 1 0 1 1 1 1 e pela propriedade do R2 são 0 0 R2 = , 0 0 fechamento para a adição, é fácil ver que os 8 = 23 vetores de 0 0 1 1 , 0 1 0 1 , 0 1 1 0 , 1 0 1 0 , 1 0 0 1 , 1 1 0 0 , 1 1 1 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. x= 1 1 0 1 ⇐⇒ x = 0 0 1 0 Observe que x = x + 1, onde 1 é o vetor formado inteiramente de 1s. Teorema 5.28. Para n ≥ 1, o código de Reed-Muller Rn é um código linear (2n , n + 1) no qual todo vetor de código, exceto o 0 e o 1, tem peso 2n−1 . Demonstração. Para demonstrar esse teorema vamos utilizar indução em n. Para n = 1 temos que R1 = Z22 é um código linear (2, 2) = (21 , 1+1) para o qual todo vetor de código, exceto o 0 e o 1, tem peso 1 = 21−1 . Vamos assumir que o resultado é válido para n = k, ou seja, que Rk é um código linear (2k , k + 1) no qual todo vetor de código, exceto o 0 e o 1, tem peso 2k−1 . Agora, consideremos Rk=k+1 . " # u Por construção, Rk+1 tem uma base formada pelos vetores da forma , onde u é u " # 0 um elemento de Rk , juntamente com o vetor . Pela hipótese de indução, os vetores 1 5.5. Decodificação de Códigos de Reed-Muller 39 2k+1 u, 0 e 1 estão em Z2k 2 ; 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 onde {u1 , . . . , uk+1 } com ci ∈ Z2 . Suponha que v 6= 0, 1 e seja u = c1 u1 + . . . + ck uk+1 . Dessa forma, u é um elemento de Rk . Se ck+2 =0, então u 6= 0, 1, e, portanto, pela hipótese de indução, u tem peso 2k−1 . Mas então v tem peso 2 · 2k−1 = 2k . Se ck+2 = 1, então v tem a forma " # " # " # " # u 0 u u v= + = = u 1 u+1 u onde u é um elemento de Rk . Como w(u) = 2k - w(u) temos que w(v) = w(u) + w (u) = 2k como querı́amos demonstrar. Logo, o teorema é verdadeiro para todo n ≥ 1. Sabemos da introdução desta seção que o Mariner 9 requeria um código com 64 = 26 vetores. Pelo teorema 5.28, o código de Reed-Muller R5 tem dimensão 6 sobre Z2 . 5.5 Decodificação de Códigos de Reed-Muller Definição 5.29. Uma matriz Hn de ordem n é uma matriz n × n formada pelos valores 1 e −1, cujas linhas tomadas duas a duas são ortogonais. 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 Exemplo 5.30. Matrizes de Hadamard de ordem 1, 2 e 4 são dadas por 40 5. Códigos Lineares " H1 = [1] H2 = 1 1 1 -1 # H4 = 1 1 1 1 1 -1 1 -1 1 1 -1 -1 1 -1 -1 1 Uma definição equivalente é Hn é uma matriz n × n com a entrada dos inteiros 1 e −1 tais que Hn HnT = nIn Definição 5.31. A ordenação adequada Pr de r-uplas é a ordenação definida recursivamente pelas regras (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] Note que, se inverter a ordem dos dı́gitos, o P3 corresponde a [000, 001, 010, 011, 100, 101, 110, 111] que é ordem crescente dos números binários associados. Agora seja n = 2r , e sejam u0 , u1 , . . . , un−1 os r-uplas binárias numa ordem correta. Construção da matriz geradora de código Seja Hr , a matriz de verificacao de paridade de Hamming(que não pode ser confundida com matriz de Hadamard). Considere [Hr 0], onde 0 é uma matriz coluna nula. Br é uma matriz ordenada de [Hr 0] segundo a ordenação da definição 5.31. Então a matriz geradora # " 1 de código de Reed-Muller R(1, r) é G = Br ri Seja r o código recebido. Construı́mos o vetor R tal que Ri = (−1) = 1, se r = 0 i −1, se r = 1 i Agora, obtemos o vetor R̂ = HR. Seja k, a coordenada do maior valor absoluto de R̂ e considere o vetor u da k-ésima coordenada de Br (ordenada). O código de canal é P c = ui vi onde vi é a i-ésima linha de Br . 5.5. Decodificação de Códigos de Reed-Muller 41 Exemplo 1 0 1 1 1 0 0 1 1 5.33. R(1, 3). Matriz geradora do código de Hamming será H3 = 1 1 0 0 1 0 1 1 1 0 0 0 1 0 1 0 e [H3 0] = 1 1 0 1 0 1 0 0. 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 vetor u como a k-ésima coluna de Br . Nosso exemplo, será a quarta coluna o 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 [1] GARCIA, A. e LEQUAIN, Y. Elementos de Álgebra. IMPA, Rio de Janeiro, 2006. 326p. [2] GONÇALVES, A. Introdução à Álgebra. IMPA, Rio de Janeiro, 1979. 194p. [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. [7] VANSTONE, S. A. e OORSCHOT, P. C.van. An Introduction to Error Correcting Codes with Applications. Kluwer Academic Publishers, 1989. 289p.