• Nenhum resultado encontrado

Aplicações da álgebra linear aos códigos corretores de erros

N/A
N/A
Protected

Academic year: 2021

Share "Aplicações da álgebra linear aos códigos corretores de erros"

Copied!
66
0
0

Texto

(1)

UNIVERSIDADE FEDERAL FLUMINENSE INSTITUTO DE CIÊNCIAS EXATAS

CURSO DE BACHARELADO EM MATEMÁTICA

João Vitor Medeiros Domingos

APLICAÇÕES DA ÁLGEBRA LINEAR AOS CÓDIGOS CORRETORES DE

ERROS

VOLTA REDONDA-RJ 2017

(2)

João Vitor Medeiros Domingos

APLICAÇÕES DA ÁLGEBRA LINEAR AOS CÓDIGOS

CORRETORES DE ERROS

Trabalho de Conclusão de Curso na área de conhecimento Matemática Pura, apresentado ao Curso de Matemática, ICEx, da Universidade Federal Fluminense, como parte dos requisitos necessários à obtenção do título de Bacharel em Matemática.

Orientadora:

Profa. Dra. Rosemary Miguel Pires

Volta Redonda-RJ

2017

(3)

Ficha Catalográfica elaborada pela Biblioteca do Aterrado de Volta Redonda da UFF

D671 Domingos, João Vitor Medeiros

Aplicações da álgebra linear aos códigos corretores de erros / João Vitor Medeiros Domingos. – 2017.

64 f.

Orientador: Rosemary Miguel Pires

Trabalho de Conclusão de Curso (Bacharelado em Matemática) – Departamento de Matemática, Instituto de Ciências Exatas, Universidade Federal Fluminense, Volta Redonda, 2017.

1. Código de controle de erros. 2. Códigos Lineares. 3. Códigos Cíclicos. 4. Polinômio. I. Universidade Federal Fluminense. II. Pires, Rosemary Miguel, orientador. III. Título.

CDD 512.5

(4)

João Vitor Medeiros Domingos

APLICAÇÕES DA ÁLGEBRA LINEAR AOS CÓDIGOS

CORRETORES DE ERROS

Trabalho de Conclusão de Curso na área de conhecimento Matemática Pura, apresentado ao Curso de Matemática, ICEx, da Universidade Federal Fluminense, como parte dos requisitos necessários à obtenção do título de Bacharel em Matemática.

Trabalho aprovado em 11 de janeiro de 2017.

Profa. Dra. Rosemary Miguel Pires Universidade Federal Fluminense

Profa. Dra. Edilaine Ervilha Nobili Universidade Federal Fluminense

Prof. Ms. Carlos Henrique Pereira do Nascimento

Universidade Federal Fluminense

Volta Redonda-RJ

2017

(5)
(6)

Agradecimentos

Agradeço a minha família, principalmente aos meus pais por me ajudarem durante todo o curso.

(7)

Resumo

Ao enviarmos um comando através de um canal, seja ele, um sinal de rádio, uma mensagem por meio de um celular ou computador, ou até mesmo uma comunicação via satélite, estão suscetíveis a sofrer uma interferência, ou seja a mensagem original pode ser recebida com algum erro. Detectar e corrigir estes tipos de erros é um dos objetivos centrais da Teoria de Códigos Corretores de Erros. Focamos, neste trabalho, em dois tipos especiais de códigos corretores de erros: Códigos Lineares e Códigos Cíclicos. Os Códigos Lineares são caracterizados a partir de uma transformação linear e uma matriz geradora, cujo objetivo é usar elementos da Álgebra Linear para codificação e decodificação de mensagens. Para facilitar a decodificação de uma mensagem usaremos uma matriz chamada matriz teste de paridade a qual é uma matriz geradora de um código dual do código original. Assim tornando possível e viável a decodificação. Já os Códigos Cíclicos são caracterizados a partir de um polinômio gerador em um ideal de um anel de polinômios. Para estudar códigos cíclicos iremos introduzir um conceito preliminar sobre polinômios, para assim podermos observar a natureza da matriz geradora e matriz teste de paridade de um código cíclico. Neste trabalho iremos explorar os dois códigos citados acima de modo que possamos codificar e decodificar mensagens e corrigir seus respectivos erros de transmissão.

(8)

Abstract

When we send a comand through of a channel, be him, a radio signal, a cell phone message or computer message, even a satellite comunication, they are susceptible to interference, that is, the original message could be recived with an error. Detect and correct these kind of erros is one of the central objectives of Correcting Erros Codes Theory. In this wokr we focus in two kinds of Correcting Codes, they are: Linear Codes and Cyclic Codes. Linear Codes are caracterized from a linear transformation and a generating matrix, whose objective is use Linear Algebra elements to code and decode message. In order to facilitate the decodification of a message we will use a matrix called Parity check matrix which is a generating matrix of a dual code from original code. Thus making it possible and viable the decoding. Already the Cyclic Codes are caracterized from a generated polynomial of a ideal of a polynomial ring. In order to study cyclic codes we will introduce a preliminary concept about polynimal, so that we can observe the nature of the generated matrix and parity check matrix of a cyclic code. In this work we will explore those two codes above mentioned so that we can code and decode messages and correct their respctive transmission erros.

(9)

Sumário

1 INTRODUÇÃO . . . . 8

2 INTRODUÇÃO AOS CÓDIGOS CORRETORES DE ERROS . . . . 10

2.1 Conceitos Iniciais . . . 10

2.2 Métrica de Hamming . . . 11

2.3 Equivalência de Códigos . . . 13

3 CÓDIGOS LINEARES . . . 16

3.1 Códigos Lineares . . . 16

3.1.1 Representação de um Código Linear como Imagem de uma Transformação Linear . . . 18

3.1.2 Representação de um Código Linear como Núcleo de uma Transformação Linear . . . 18

3.2 Equivalência Linear . . . 19

3.3 Matrizes Geradoras. . . 20

3.4 Códigos Duais . . . 24

3.5 Exemplos de Códigos Lineares: Códigos de Hamming. . . 30

3.6 Decodificação . . . 30

4 POLINÔMIOS . . . 37

4.1 O Algoritmo da Divisão para Polinômios . . . 37

4.2 Fatorização . . . 42

4.3 Classe de Congruência Polinomial . . . 44

4.4 Ideais de um Anel . . . 48

5 CÓDIGOS CÍCLICOS . . . 52

5.1 Definições Preliminares . . . 52

5.2 Caracterização dos Códigos Cíclicos . . . 53

5.3 Decodificação em Códigos Cíclicos . . . 55

6 ESTUDO DE CÓDIGOS CÍCLICOS NO CASO BINÁRIO . . . 58

7 CONCLUSÃO E TRABALHOS FUTUROS . . . 63

(10)

8

1 Introdução

Várias pesquisas têm sido desenvolvidas sobre a Teoria de Códigos Corretores de Erros nas últimas décadas. Esta teoria tem como grandes pioneiros Marcel J. E. Golay, Richard W. Hamming e C. E. Shannon. De forma resumida, vamos apresentar algumas das ideias desenvolvidas por estes pesquisadores. Hamming, em meados de 1947, era motivado pela ideia de que se um computador podia detectar erros de digitação , por que não podíamos localizar a posição de um erro e corrigi-lo? (Vale lembrar que na década de 40 os computadores eram máquinas muito caras e apenas instituições de grande porte como o governo ou as universidades tinham condições de mantê-los (2).) Com esta ideia ele desenvolveu um código capaz de detectar até dois erros e corrigir um erro, se ele for único. À medida que sua pesquisa evoluía surgiu uma questão relacionada a possibilidade de criar códigos mais eficientes que àquele proposto inicialmente. Em 1948, Shannon respondeu a questão indiretamente e com isto, ele deu início a dois novos campos de pesquisa em matemática: a teoria de códigos (em conjunto com o trabalho de Hamming) e a Teoria da Informação. Conforme (2), a partir destas pesquisas houve um desenvolvimento contínuo e significativo da Teoria de Códigos até hoje. Mais adiante, Golay extendeu um dos resultados dados no artigo de Shannon em 1948 e desenvolveu vários códigos importantes na teoria de códigos.

A partir das décadas de 50 e 60 muitos matemáticos se interessaram pelo estudo da Teoria de Códigos e a partir da década de 70, devido as pesquisas espaciais e a grande popularização dos computadores, os engenheiros também começaram a manifestar interesse nesta área de estudo. Atualmente, os códigos corretores de erros são utilizados sempre que se deseja transmitir ou armazenar dados, garantindo, assim, sua confiabilidade ((3)).Além disso, o campo de pesquisa é muito amplo em várias áreas do conhecimento, tais como matemática, computação, estatística e outras.

Conforme (2), na transmissão de dados, na vida real, podem ocorrer alguns pro-blemas que façam com que a mensagem recebida seja diferente daquela que foi enviada. O objetivo da teoria é desenvolver métodos para a detecção e a correção de erros. Com este objetivo, baseados em (2) e (3), iremos apresentar os principais conceitos e resultados básicos para o desenvolvimento deste estudo e de descrever alguns tipos mais simples de códigos corretores de erros: os códigos lineares e os códigos cíclicos.

Com base no livro (3), será estudado a teoria referente aos códigos corretores de erros, dando ênfase aos códigos lineares e cíclicos. Para o desenvolvimento desta etapa, é necessário entender como se dá a construção de um código corretor de erros.

(11)

Capítulo 1. Introdução 9

corretores de erros de modo geral, em seguida, começaremos o estudo de códigos lineares, aplicando conceitos da Álgebra Linear para construção do mesmo.

Na segunda parte deste trabalho apresentaremos conceitos de polinômios, pois com isso iremos caracterizar e construir códigos cíclicos.

Na terceira parte deste trabalho iremos aplicar o estudo de códigos cíclicos para o caso particular em que o alfabeto possui apenas dois elementos.

(12)

10

2 Introdução aos Códigos Corretores de Erros

Iremos ver neste capítulo conceitos gerais da teoria de códigos, tais como definição de código corretor de erros, peso, distância mínima, métrica de Hamming, alguns exemplos de códigos e teoremas importantes da teoria de códigos.

2.1

Conceitos Iniciais

Para definirmos um código corretor de erros, considere um conjunto finito A chamado de alfabeto e denotemos por |A| = q o número de elementos de A.

Um código corretor de erros é um subconjunto próprio C de An, isto é

C ⊂ An= A × A × . . . × A

| {z }

n vezes

para algum n ∈ N, onde N representa o conjunto dos números naturais. Quando o número de elementos do alfabeto de um código é q podemos chamá-lo de código q-ário.

Uma palavra de comprimento n é uma sequência finita de n símbolos do alfabeto. Assim, 0001, 1110, 0000 são palavras de 4 dígitos (referentes ao alfabeto A = {0, 1}. As palavras de comprimento n pertencem a An.

O exemplo abaixo é conhecido como Código do Robô, cujo alfabeto é o conjunto A = F2 = {0, 1}, que é um exemplo de código binário.

Exemplo 1. Código do Robô:

Suponhamos que temos um robô onde cada valor abaixo indica uma direção que o robô deve seguir.

Leste −→ 00 N orte −→ 10 Oeste −→ 01 Sul −→ 11

O código formado pelos valores 00, 01,10,11, é chamado de código da fonte. Supo-nhamos, agora, que enviamos um comando ao robô e que o sinal no caminho sofra uma interferência, isto é, um comando enviado como 00, foi recebido como 01.

Uma maneira de se corrigir esse erro é modificando o código conforme a correspon-dência abaixo:

00 7→ 00000 01 7→ 01011

(13)

Capítulo 2. Introdução aos Códigos Corretores de Erros 11

10 7→ 10110 11 7→ 11101

Observamos que, nesta recodificação, os dois primeiros dígitos reproduzem o código da fonte e os três últimos são apenas redundâncias. O novo código introduzido na recodificação é comumente chamado de código de canal, notamos que 11110 não pertence ao código e, assim detectamos erros. A palavra do código que mais se aproxima de 11110, ou seja, com menor número de componente diferentes é 10110, que é precisamente a palavra transmitida.

2.2

Métrica de Hamming

Segue abaixo um modo para calcularmos a distância entre palavras.

Dados dois elementos u, v ∈ An, a distância de Hamming entre u e v é definida como: d(u, v) = |{i : ui 6= vi}| Por exemplo, d(001, 111) = 2 d(000, 111) = 3 d(1010, 0101) = 4 d(u, u) = 0 ∀u ∈ An

Temos que a distância de Hamming conforme ((3), Proposição 1, p. 5) satisfaz as seguintes propriedades ∀u, v, w ∈ An

i) Positividade: d(u, v) ≥ 0 e d(u, v) = 0 se, e somente se, u = v. ii) Simetria: d(u, v) = d(v, u)

iii) Desigualdade Triangular: d(u, v) ≤ d(u, w) + d(w, v)

Com base na propriedade acima, e dados a ∈ An e t > 0, podemos definir disco e

esfera de centro a e raio t como sendo respectivamente os seguintes conjuntos

D(a, t) = {u ∈ An : d(u, a) ≤ t}, S(a, t) = {u ∈ An: d(u, a) = t}.

Esses conjuntos são finitos e o próximo lema, cuja demonstração podemos encontrar em ((3), p.5), nos fornece suas cardinalidades.

(14)

Capítulo 2. Introdução aos Códigos Corretores de Erros 12

Lema 1. Para todo c ∈ An e todos número natural r > 0, temos que

|D(c, r)| = r X i=0   n i  (q − 1)i

Definição 1. Seja C um código. A distância mínima de C é o número

d = min{d(u, v)|u, v ∈ C, u 6= v}.

Seja k ∈ Z, onde Z é o conjunto dos números inteiros, e dado um código C com distância mínima d, definimos

k = " d − 1 2 # ,

como sendo a capacidade do código e [t] representa a parte inteira de um número real t.

Lema 2. 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, k) ∩ D(c0, k) = ∅ Demonstração. Ver ((3), p.6).

Segue abaixo, um resultado que nos ajudará na detecção e correção de erros e na verificação a eficiência do código.

Teorema 1. Seja C um código com distância mínima d. Então C pode corrigir até k = hd−12 i erros e detectar até d − 1 erros.

Demonstração. Se ao transmitirmos uma palavra c do código cometemos t erros com t ≤ k, recebemos a palavra r, então d(r, c) = t ≤ k; enquanto que, pelo Lema 2, a distância de r a qualquer outra palavra do código é maior do que k. Isso determina c univocamente a partir de r.

Por outro lado, dada uma palavra do código podemos nela introduzir até d − 1 erros sem encontrar outra palavra do código, e assim, a detecção do erro será possível.

Para exemplificarmos, consideremos o Código do Robô visto acima. Calculando a distância mínima obtemos d = 3. Logo, pelo Teorema 1 o código detecta até d − 1 = 2 erros e pode corrigir até k =hd−12 i= 1 erros.

O teorema acima nos mostra a importância de sabermos a distância mínima de um código. Também vemos que quanto maior for a distância mínima de um código, maior será a capacidade de detectar e corrigir erros. Então um código eficiente é aquele que maximiza sua distância mínima. Logo, um problema da Teoria de Códigos é encontrar a distância mínima d, de modo eficiente.

(15)

Capítulo 2. Introdução aos Códigos Corretores de Erros 13

Definição 2. Seja C ⊂ An um código com distância mínima d e k =hd−1

2 i . O código será dito perfeito se [ c∈C D(c, k) = An

O teorema acima nos permite traçar uma estratégia para detecção e correção de erros. Seja C um código com distância mínima d e k como antes. Para mais detalhes veja ((3)).

Observe que quando um receptor recebe uma palavra r, uma das seguintes situações é verificada:

i) A palavra r encontra-se num disco de raio k em torno de uma palavra c do código (essa palavra é única, pela demonstração do Teorema 1). Nesse caso substitui-se r

por c.

ii) A palavra r não se encontra em nenhum disco de raio k em torno de uma palavra c do código. Nesse caso, não é possível decodificar r com boa precisão.

Note que em i) não temos tanta certeza se c foi a palavra transmitida, pois poderíamos ter cometido mais do que k erros na transmissão, assim afastando r da palavra transmitida e aproximando-a de alguma outra palavra do código. Note também que a hipótese ii) não ocorre em códigos perfeitos.

Um exemplo de código perfeito são os Códigos de Hamming que iremos ver no próximo capítulo.

Abaixo, mostremos que o Código do Robô não é perfeito.

Temos que o código possui quatro palavras que são: c1 = 00000, c2 = 01011,

c3 = 10110, c4 = 11101.

Agora calculemos o disco em torno de cada palavra do código, lembrando que k = 1. Com simples cálculos, D(c1, k) possui 6 elementos, e o mesmo acontece com os discos em

torno das outras palavras do código. Logo, comoS

c∈CD(c, k) possui 24 elementos e A5 possui 32 elementos, concluimos

que o Código do Robô não é perfeito.

2.3

Equivalência de Códigos

Definiremos nessa seção a noção de equivalência entre códigos, e usaremos o conceito de isometria para isto. Primeiramente, listemos quais são os parâmetros que determinam o comportamento de um código C: número q de elementos de A; o comprimento n das palavras do código; o número M = |C| de palavras que compõem o código; e a

(16)

Capítulo 2. Introdução aos Códigos Corretores de Erros 14

distância mínima d. Através destes parâmetros, podemos denominar um código q-ário de comprimento n com M palavras e distância mínima d por (n,M,d)-código.

Definição 3. Sejam A um alfabeto e n ∈ N. Diremos que uma função F : An−→ An é

uma isometria de An se ela preserva a distância de Hamming. Ou seja,

d(F (x), F (y)) = d(x, y); ∀x, y ∈ An

Descreveremos abaixo alguns resultados para isometrias, cujas demonstrações podem ser encontradas em ((3)).

Proposição 1. Toda isometria de An é uma bijeção de An.

Proposição 2. i) A função identidade de An é uma isometria.

ii) Se F é uma isometria de An, então F−1 é uma isometria de An.

iii) Se F e G são isometrias de An, então F ◦ G é uma isometria de An.

Com as duas proposições acima podemos definir equivalência entre códigos.

Definição 4. Dados dois códigos C e C0 em An, diremos que C0 é equivalente a C se existir uma isometria F de An tal que F (C) = C0

Segue da Proposição 2que a equivalência de códigos é uma relação de equivalência, isto é:

i) Reflexiva: todo código é equivalente a si próprio.

ii) Simétrica: se C0 é equivalente a C, então C é equivalente a C0.

iii) Transitiva: Se C00 é equivalente a C0 e C0 é equivalente a C, então C00 é equivalente a C.

Segue abaixo dois exemplos importantes de isometria.

Exemplo 2. Se f : A −→ A é uma bijeção, e i é um número inteiro tal que 1 ≤ i ≤ n, a aplicação

Ti

f : An −→ An

(a1, ..., an) 7→ (a1, ..., f (ai), ..., an)

(17)

Capítulo 2. Introdução aos Códigos Corretores de Erros 15

Exemplo 3. Se π é uma bijeção do conjunto {1, ..., n} nele próprio, também chamada de

permutação de {1, ..., n}, a aplicação permutação de coordenadas

: An −→ An

(a1, ..., an) 7→ (aπ(1), ..., aπ(n))

é uma isometria.

Para encerramos esta seção, enunciaremos um Teorema e seu respectivo Corolário, cujas demonstrações podem ser encontradas em ((3), p.10).

Teorema 2. 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 ◦ . . . ◦ T n fn

Corolário 1. Sejam C e C0 dois códigos em An. Temos que C e C0 são equivalentes se, e somente se, existem uma permutação π de {1, ..., n} e bijeções f1, ..., fn de A tais que

C0 = {fπ(1)(xπ(1)), ..., fπ(n)(xπ(n)) : (x1, ..., xn) ∈ C}

Através deste Corolário, dois códigos serão equivalentes se, e somente, se um deles pode ser obtido do outro mediante a uma sequência de operações do tipo:

i) Substituição das letras numa dada posição fixa em todas as palavras do código por meio de uma bijeção de A. Em outras palavras, substituir todo o c = c1c2...cn ∈ C

por cσ(1)cσ(2)...cσ(n) , onde σ é uma permutação dos ındices {1, 2, ..., n};

ii) Permutação das posições das letras em todas as palavras do código, mediante a uma permutação fixa de {1, ..., n}. Em outras palavras, substituir todo o c = c1c2...cn ∈ C

por π1(c12(c2)...πn(cn), onde π1, π2, ..., πn são permutações do alfabeto A.

A seguir temos um exemplo de códigos equivalentes.

Exemplo 4. Mostre que os códigos binários C1 = {000, 111}, C2 = {001, 110} e C3 =

{100, 011} são todos equivalentes.

C2 é obtido de C1 trocando os símbolos 0 e 1 do alfabeto na terceira coordenada,

isto é, aplicou-se a operação ii) vista acima com π3 dada por π3(0) = 1 e π3(1) = 0;

C3 é obtido de C2 trocando a primeira e a terceira coordenadas das palavras do

código, isto é, aplicou-se a operação i) vista acima com σ =

  1 2 3 3 2 1  .

(18)

16

3 Códigos Lineares

Temos na prática que a classe de códigos mais utilizada é a classe dos Códigos Lineares. Assim, segue abaixo alguns resultados envolvendo Códigos Lineares.

Denotaremos por K um corpo finito com q elementos tomado como alfabeto. Da Álgebra Linear, sabemos que, para cada número natural n, Kn é um K-espaço vetorial de dimensão n.

Algumas definições básicas da Álgebra e da Álgebra Linear serão admitidas nesta monografia, tais como definições de anéis e corpos, espaço vetorial sobre um corpo e outras.

3.1

Códigos Lineares

Definição 5. Um código C ⊂ Kn será chamado de código linear se for um subespaço vetorial de Kn.

Denotamos por Fn um corpo que possui n elementos e por Fmn o espaço vetorial

sobre Fn, onde cada elemento possui m coordenadas.

Observemos que o Código do Robô é um exemplo de código linear, onde o alfabeto A = F2 e o código é o subespaço vetorial de F52, imagem da transformação linear

T : F22 −→ F 5 2

(x1, x2) 7→ (x1, x2, x1, x1+ x2, x2)

Temos que todo código linear é por definição um espaço vetorial de dimensão finita. Seja k a dimensão do código C e seja {v1, ..., vk} uma de suas bases. Portanto, todo

elemento v de C é combinação linear dos elementos da base de C, ou seja, existem únicos λi ∈ K, i = 1, ..., k, tais que

v = λ1v1 + λ2v2+ ... + λkvk.

Como para cada λi ∈ K, i = 1, ..., k existem q possibilidades, obtemos:

M = |C| = qk.

A partir disto, podemos, ao descrever o Código, citar apenas a sua dimensão. Além disso, obtemos:

(19)

Capítulo 3. Códigos Lineares 17

dimKC = k = logqqk = logqM.

Vimos que conhecendo a dimensão do código linear C, podemos obter o valor do parâmetro M . Assim, podemos determinar um código q-ário através dos parâmetros n,k e d, ou seja, podemos definir o código como um (n,k,d)-código.

A seguir definimos peso de um código linear, e relacionamos com a definição de distância mínima.

Definição 6. Dado x ∈ Kn, define-se o peso de x = (x1, ..., xn) como sendo o número

inteiro

w(x) := |{i : xi 6= 0}|.

Em outras palavras,temos que,

w(x) = d(x, 0), onde d representa a métrica de Hamming.

Definição 7. O peso de um código linear C é o inteiro

w(C) := min{w(x) : x ∈ C \ {0}}

Proposição 3. Seja C ⊂ Kn um código linear com distância mínima d. Temos que

i)∀x,y ∈ Kn, d(x,y) = w(x-y) ii)d = w(C).

Demonstração. O item i) segue imediatamente das definições da métrica de Hamming e da de peso de um código. O item ii) decorre do fato que, para todo par de elementos x,y em C com x 6= y, tem-se z = x − y ∈ C \ {0} e d(x, y) = w(z).

Exemplo 5. Encontremos a distância mínima do código C = {0000, 1011, 0110, 1101}.

Para isto, basta calcularmos o peso de cada palavra não nula do código. w(1011) = 3, w(0110) = 2, w(1101) = 3,

portanto a distância mínima de C é 2.

Temos que a Proposição acima relaciona peso com distância a fim de encontrar a distância mínima de maneira mais eficiente. Com isso podemos chamar a distância

mínima de um código C como o peso do código C.

Em Álgebra Linear conhecemos essencialmente duas maneiras de descrever subes-paços vetoriais C de um espaço vetorial Kn, são elas: núcleo de uma transformação e

imagem de uma transformação. Nas próximas seções, mostraremos como, a partir disso, obtemos códigos lineares.

(20)

Capítulo 3. Códigos Lineares 18

3.1.1

Representação de um Código Linear como Imagem de uma

Transforma-ção Linear

Vejamos como se obtém a representação de C como imagem de uma transformação linear. Escolha uma base {v1, ..., vk} de C e considere a aplicação linear

T : Kk−→ Kn

x = (x1, ..., xk) 7−→ x1v1+ ... + xkvk

Observemos que T é uma transformação linear injetora, Im(T ) = C.

Portanto, dar um código C ⊂ Kn de dimensão k é equivalente a dar uma

transfor-mação linear injetora

T : Kk−→ Kn

e definir C = Im(T ). Essa é a forma paramétrica do subespaço C, pois os elementos de C são parametrizados pelos elementos x de Kk através de T , o que torna fácil gerar todos os

elemento de C. Note que nessa representação é, porém, díficil decidir se um dado elemento v de Kn pertence ou não a C, pois, para tal, é necessário resolver o sistema de n equações

nas k incógnitas x1, ..., xk abaixo

x1v1, ..., xkvk= v

Essa solução, em geral, representa um custo computacional muito elevado. Veremos neste trabalho uma outra estratégia usada para decidir se um vetor pertence ou não ao código linear, através de uma matriz conhecida como Matriz Teste de Paridade.

3.1.2

Representação de um Código Linear como Núcleo de uma Transformação

Linear

A outra maneira de descrevermos um código C é através do núcleo de uma transformação linear. Sendo assim, tome um subespaço C0 de Kn complementar de C, isto

é,

C ⊕ C0 = Kn e considere a aplicação linear

H : C ⊕ C0 −→ Kn−k

(21)

Capítulo 3. Códigos Lineares 19

cujo núcleo é precisamente C. Computacinalmente, é muito mais simples determinar se um certo elemento x ∈ Kn pertence ou não a C; para isto, basta verificar se H(x) é ou

não o vetor nulo de Kn−k, o que tem um custo bem pequeno.

Exemplo 6. Dada a transformação linear

T : F62 −→ F 3 2

(x1, ..., x6) 7→ (x1+ x4, x1+ x2+ x3+ x5, x1+ x2+ x6)

Defina C como sendo o núcleo de T . Decida se os vetores 100111 e 010101 pertencem ou não a C.

Resolução: Defina C = N uc(T ) = {u ∈ F6

2 : T (u) = (0, 0, 0)}, isto é, T(x1, ..., x6) = (0, 0, 0) ⇒ (x1+ x4, x1+ x2+ x3+ x5, x1+ x2+ x6) = (0, 0, 0), ou seja,            x1+ x4 = 0 x1+ x2+ x3+ x5 = 0 x1+ x2+ x6 = 0

A solução deste sistema é:

x4 = x1

x5 = −x1− x2− x3

x6 = −x1− x2

Logo C = N uc(T ) = {(x1, x2, x3, −x1, −x1− x2− x3, −x1− x2) : x1, x2, x3 ∈ F2}.

Assim, a base de C = N uc(T ) é {(100111), (010011), (001010)}

Com simples cálculos, observamos que 100111 pertence a C, pois é um elemento da base de C, e que 010101 não pertence a C,

T (010101) = (110) 6= (000),

3.2

Equivalência Linear

Definição 8. Seja K um corpo finito. Dois códigos lineares C e C0 são linearmente

equivalentes se existir uma isometria linear T : Kn−→ Kn tal que T (C) = C0.

Como ilustração, sejam os três seguintes códigos ternários, de comprimento 3: C1 = {000, 121, 212} , C2 = {000, 111, 222} e C3 = {001, 122, 210}.

(22)

Capítulo 3. Códigos Lineares 20

De acordo com a Definição 4 e o Teorema 2, estes três códigos são equivalentes entre si, pois:

i) C2 é obtido de C1 aplicando a permutação de símbolos π2 =

  0 1 2 0 2 1   na segunda coordenada.

ii) C3 é obtido de C2 aplicando a permutação de símbolos π3 =

  0 1 2 1 2 0   na terceira coordenada.

No entanto, os códigos C1 e C2 são lineares, mas C3 não é. O que nos permite

termos um código linear equivalente a um código que não seja linear. Queremos restringir as operações permitidas na noção de equivalência dada, de forma que ainda possamos obter códigos lineares.

Se π é uma permutação de {1,...n}, então Tπ, definida no Exemplo 3, é linear.

Temos também que, se fi : K −→ K, i = 1, ..., n são bijeções, então Tπ◦ Tf11 ◦ ... ◦ T n fn é

linear se, e somente, se cada fi é linear. Sabemos também que uma função f : K −→ K é

linear se, e somente se, existe um elemento c ∈ K tal que f (x) = cx ∀x ∈ K.

Das observações acima e do Teorema 2, segue que dois códigos lineares C e C0 em Kn são linearmente equivalentes se, e somente se, existem uma permutação π de {1, ..., n}

e elementos c1, ..., cn de K \ {0} tais que,

C0 = {(c1xπ(1), ..., cnxπ(n)) : (x1, ..., xn) ∈ C}.

O resultado abaixo nos mostra como encontrar códigos lineares equivalentes. Dois códigos lineares são linearmente equivalentes se, e somente se, cada um deles pode ser obtido do outro mediante uma sequencia de operações do tipo:

i) Multiplicação dos elementos numa dada posição fixa por um escalar não nulo em todas as palavras.

ii) Permutação das posições de todas as palavras do código, mediante uma permutação fixa de {1, ..., n}.

3.3

Matrizes Geradoras

Sejam K o corpo finito com q elementos e C ⊂ Kn um códigos linear. Lembremos

(23)

Capítulo 3. Códigos Lineares 21

C sobre K, e d representa a distância mínima de C, que é também igual ao peso w(C) do código C. Lembremos que o número de elementos M de C é igual a qk.

Seja β = {v1, ..., vk} uma base ordenada de C e considere a matriz G, cujas linhas

são vetores vi = (vi1, ..., vin) i = 1, ..., k, isto é,

G =      v1 .. . 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:

T : Kk−→ Kn

x 7−→ xG

Se x = (x1, ..., xk), temos que

T (x) = xG = x1v1 + ... + xkvk

logo T (Kk) = C. Podemos, então, considerar Kk como sendo o código da fonte, C, o

código de canal e a transformação T , uma codificação.

Exemplo 7. Seja a transformação linear:

T : F32 −→ F 5 2

(x1, x2, x3) 7→ (x1, x3, x1+ x2, x2+ x3, x2)

Seja C = Im(T ). Sejam {e1, e2, e3} base canônica de F32 e {f1, f2, f3, f4, f5} base canônica

de F52.

Vamos encontrar a matriz G da transformação linear T .

T (e1) = (10100) T (e3) = (00111) T (e3) = (01010) Logo, G =      1 0 1 0 0 0 0 1 1 1 0 1 0 1 0     

(24)

Capítulo 3. Códigos Lineares 22

Note que a matriz G não é univocamente determinada por C, pois ela depende da escolha da base β. Temos ainda, que uma base de um espaço vetorial pode ser obtida de uma outra qualquer através de sequencias de operações do tipo:

-permutação de dois elementos da base;

-multiplicação de um elemento da base por um escalar não nulo;

-substituição de um vetor da base por ele mesmo somado com um múltiplo escalar de outro vetor da base.

Segue, então, que duas matrizes geradoras de um mesmo código C podem ser obtidas uma da outra por uma sequencia 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

Inversamente, podemos construir códigos a partir de matrizes geradoras G. Para isso, basta tomar uma matriz cujas linhas são linearmente independentes e definir um código como sendo a imagem da transformação linear

T : Kk−→ Kn

x 7−→ xG.

Exemplo 8. Tome K = F2 e seja

G =      1 0 1 0 1 1 1 0 1 0 1 1 1 1 1      .

Considerando a transformação linear

T : F32 −→ F52

x 7−→ xG obtemos um código C em F5

2, imagem de T . A palavra 101 do código da fonte, por exempĺo,

é codificada como 01010.

Suponhamos agora que seja dada a palavra 10101 do código, e que gostaríamos de decodificá-la, isto é, achar a palavra x de F3

2 da qual ela se origina por meio de T . Então

(25)

Capítulo 3. Códigos Lineares 23  x1 x2 x3  G = (10101), ou seja,                            x1+ x2+ x3 = 1 x2+ x3 = 0 x1+ x3 = 1 x2+ x3 = 0 x1+ x3 = 1 .

Com simples cálculos obtemos a solução: x1 = 1, x3 = 0, x2 = 0

Esse sistema particular de equações foi fácil de se resolver, mas, em geral, dada uma matriz G mais complexa, a resolução do sistema de equações associado pode ser muito trabalhosa.

Observe, entretanto que, efetuando operações sobre as linhas de G do tipo (L1), (L2) e (L3), podemos colocar G na forma

G0 =      1 0 0 0 0 0 1 0 1 0 0 0 1 0 1      Note que xG0 = x1 x2 x3 x2 x3 

e, portanto, obtém-se o vetor x tomando apenas as três primeiras componentes do vetor a ser decodificado. Logo, a palavra (10101) é facilmente decodificada como (101).

Definição 9. Diremos que uma matriz geradora G de um código C está na forma padrão

se tivermos

G = (Idk|A)

onde Idk é a matriz identidade k × k e A, uma matriz k × (n − k).

Dado um código C, nem sempre é possível achar uma matriz geradora de C na forma padão. Por exemplo, o código em F52 de matriz geradora

  0 0 1 0 1 0 0 0 1 1  

(26)

Capítulo 3. Códigos Lineares 24

nunca poderá ter uma matriz geradora na forma padrão.

No entanto, efetuando também permutações das colunas de G, podemos obter a matriz   1 0 0 0 1 0 1 0 0 1  

que é a matriz geradora na forma padrão de um código C0 equivalente a C.

De modo mais geral, efetuando também sequencias de operações sobre a matriz geradora G de um código linear C, 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 C0 equivalente a C.

Permitindo-se, também, a utilização de operações do tipo (C1) acima, temos o seguinte resultado:

Teorema 3. Dado um código C, existe um código equivalente C0 com matriz geradora na forma padrão

Demonstração. Ver ((3), p.87).

3.4

Códigos Duais

Sejam u = (u1, ..., un) e v = (v1, ..., vn) elementos de Kn. Define-se o produto

interno de u e v como sendo

< u, v >= u1v1+ ... + unvn.

Essa operação possui as propriedades usuais de um produto interno, ou seja, é simétrica

< u, v >=< v, u > e bilinear

< u + λw, v >=< u, v > +λ < w, v > para todo λ ∈ K

Seja C ⊂ Kn um código linear, define-se

(27)

Capítulo 3. Códigos Lineares 25

Lema 3. Se C ⊂ Kn é um código linear, com matriz geradora G, então

i) Cé um subespaço vetorial de Kn;

ii) x ∈ C⇔ Gxt= 0

Demonstração. i) Sejam dados u, v ∈ Ce λ ∈ K. Temos, para todo x ∈ C, que < u + λv, x >=< u, x > +λ < v, x >= 0

e, portanto, u + λv ∈ C, provando que Cé um subespaço vetorial de Kn.

ii) x ∈ Cse, e somente se, x é ortogonal a todos os elementos de C se, e somente se, x é ortogonal a todos os elementos de uma base de C, o que é equivalente a dizer que Gxt= 0, pois as linhas de G são uma base de C.

O subespaço vetorial Cde Kn, ortogonal a C, é também um código linear que

será chamado de código dual de C

Proposição 4. Seja C ⊂ Kn um código de dimensão k com matriz geradora G = (Idk|A),

na forma padrão. Então i) dimC= n − k.

ii) H = (−At|Idn−k) é uma matriz geradora de C.

Demonstração. i) Pelo Lema 3, x = (x1, ..., xn) pertence a Cse, e somente se, Gxt= 0.

Como G está na forma padrão, isto equivale a ter

     x1 .. . xk      = −A      xk+1 .. . xn     

Portanto Cpossui qn−k elementos, que são justamente as possíveis escolhas

arbitrárias de xk+1, ..., xn. Logo, Ctem dimensão n − k.

ii) É evidente que as linhas de H são linearmente independentes (por causa do bloco Idn−k), e portanto, geram um subespaço vetorial de dimensão n − k. Como as linhas

de H são ortogonais as linhas de G, isto é, HGt = 0, temos que o espaço gerado pelas

linhas de H está contido em C⊥; e como esses dois subespaços tem mesma dimensão, eles coincidem, provando assim que H = (−At|Id

n−k) é uma matriz geradora de C⊥.

(28)

Capítulo 3. Códigos Lineares 26

: Kn −→ Kn

(x1, ..., xn) 7−→ (xσ(1), ..., xσ(n))

onde σ é uma permutação de 1, ..., n, e Tj

c : Kn−→ Kn

(x1, ..., xj, ..., xn) 7−→ (x1, ..., cxj, ..., xn)

onde c ∈ Ke j = 1, ..., n.

O próximo lema nos dirá como se relaciona a dualidade com a equivalência de códigos lineares.

Lema 4. Seja C um código linear em Kn. Para toda permutação σ de 1, ..., n, para todo

c ∈ Ke para todo j = 1, ..., n temos que i) (Tσ(C))= Tσ(C).

ii) (Tj c(C))

= Tj

c−1(C).

Proposição 5. Sejam C e D dois códigos lineares em Kn. Se C e D são linearmente

equivalentes, então Ce Dsão linearmente equivalentes. Demonstração. Ver ((3), p.90).

Corolário 2. Se D é um código linear em Kn de dimensão k, então Dé um código de

dimensão n − k.

Demonstração. Pelo Teorema 3, o código D é equivalente e um código C, também de dimensão k, com matriz geradora na forma padrão e, portanto, pela Proposição 4, segue que dimC= n − k. Pela Proposição 5, temos que Dé equivalente a C⊥ e, portanto, também tem dimensão n − k

Lema 5. Suponha que C seja um código de dimensão k em Kn com matriz geradora G.

Uma matriz H de ordem (n − k) × n, com coeficientes em K e com linhas linearmente independentes, é uma matriz geradora de Cse, e somente se,

G.Ht= 0

Demonstração. As linhas de H geram um subespaço vetorial de Kn de dimensão n − k, portanto, igual a dimensão de C. Por outro lado, representando por h1, ..., hn−k e por

g1, ..., gk, respectivamente, as linhas de H e de G, temos que

(29)

Capítulo 3. Códigos Lineares 27

Portanto, (G.Ht) = 0 equivale a dizer que todos os vetores do subespaço gerado

pelas linhas de H estão em C⊥ pelo Lema 3. Por outro lado, esse subespaço tem a mesma dimensão de C⊥, logo,

(G.Ht) = 0 ⇔ Cé gerado pelas linhas de H.

Corolário 3. (C⊥)⊥= C

Demonstração. Sejam G e H respectivamente matrizes geradoras de C e C⊥. Logo, (G.Ht) = 0. Tomando transpostas nessa última igualdade, temos que H.Gt = 0, logo, G é

matriz geradora de (C⊥)⊥, daí seguindo o resultado.

Proposição 6. Seja C um código linear e suponhamos que H seja uma matriz geradora

de C. Temos então que

v ∈ C ⇔ Hvt = 0

Demonstração. Temos, pelo Corolário acima e Lema3(ii), v ∈ C se, e somente, v ∈ (C⊥)⊥ se, e somente se, Hvt= 0

A Proposição acima nos permite caracterizar os elementos de um código C por uma condição de anulamento. A matriz geradora H de Cé chamada de matriz teste

de paridade de C.

Observe que, para verificarmos se um elemento v ∈ Kn pertence ou não a C com

matriz geradora G, basta verificar se

xG = v,

admite solução. Em geral, é bastante custoso computacionalmente encontrar essa solução, pois esse sistema possui n equações com k incógnitas x = (x1, ..., xk). Para evitar esse

custo, trabalhamos com a matriz teste de paridade, pois a solução pode ser encontrada mais facilmente. Basta verificar se Hvt= 0.

Dados um código C com matriz teste de paridade H e um vetor v ∈ Kn, chamamos

o vetor Hvt de síndrome de v

Exemplo 9. Seja C o código binário gerado pela matriz

G =         1 1 1 0 1 1 0 1 0 0 1 1 1 0 1 1 0 1 0 1 1 1 0 1         e verifique se v = (100110) e v0 = (010101), pertencem a C.

(30)

Capítulo 3. Códigos Lineares 28

Resolução:

Para verificarmos se v = (100110) e v0 = (010101), pertencem a C, precisamos encontrar a matriz teste de paridade, para isto, G precisa estar na forma padrão.

Segue abaixo G na forma padrão:

G =         1 0 0 0 1 1 0 1 0 0 1 1 0 0 1 0 1 1 0 0 0 1 0 1        

Logo, pela Proposição 4(ii), obtemos a matriz teste de paridade: H =   1 1 1 0 1 0 1 1 1 1 0 1  

Agora verifiquemos se v = (100110) e v0 = (010101), pertencem a C. Hvt=   0 0   e Hv0t =   1 1   Portanto v ∈ C e v0 ∈ C/

Proposição 7. Seja H a matriz teste de paridade de um código C. Temos que o peso

de C é maior do que ou igual a s se, e somente se, quaisquer s − 1 colunas de H são linearmente independentes.

Demonstração. Suponhamos, inicialmente, que cada conjunto de s − 1 colunas de H é linearmente independente. Seja c = (c1, ..., cn) uma palavra não nula de C, e sejam h1, ..., hn

as colunas de H. Como Hct= 0, temos que

0 = H.ct=Xcihi (3.1)

Visto que w(c) é o número de componentes não nulas de c, segue que se w(c) ≤ s−1, teríamos por (3.1) uma combinação nula de um número t, com 1 ≤ t ≤ s − 1, de colunas de H, o que é contraditório. Logo, w(C) ≥ s.

Reciprocamente, suponhamos que w(C) ≥ s. Suponhamos também, por absurdo, que H tenha s − 1 colunas linearmente dependentes, digamos hi1, hi2, ..., his−1. Logo, existiriam ci1, ..., cis−1, no corpo, nem todos nulos, tais que

ci1h

i1 + ... + c

(31)

Capítulo 3. Códigos Lineares 29

Portanto, c = (0, ..., ci1, 0, ..., cis−1, 0, ..., 0) ∈ C e consequentemente, w(c) ≤ s − 1 < s, o que seria um absurdo.

Teorema 4. Seja H a matriz teste de paridade de um código C. Temos que o peso de C

é igual a s se, e somente, quaisquer s − 1 colunas de H são linearmente independentes e existem s colunas de H linearmente dependentes.

Demonstração. De fato, suponhamos que w(C) = s, logo todo conjunto de s − 1 colunas de H é linearmente independente. Por outro lado, existem s colunas de H linearmente dependentes, pois, caso contrário, pela Proposição 7, teríamos w(C) ≥ s + 1.

Reciprocamente, suponhamos que todo conjunto de s − 1 vetores colunas de H é linearmente independente e existem s colunas linearmente dependentes. Logo, da Proposição7, temos que w(C) ≥ s. Mas w(c) não pode ser maior do que s, pois, neste caso, novamente a Proposição 7 nos diria que todo conjunto com s colunas de H é linearmente independente, o que é uma contradição.

Corolário 4 (Cota de Singleton). Os parâmetros (n, d, k) de um código linear satisfazem

à desigualdade

d ≤ n − k + 1 .

Demonstração. Se H é uma matriz teste de paridade, ela tem posto n − k. Como, pelo Teorema 4, d − 1 é menor ou igual ao posto de H, segue a desigualdade.

Um código será chamado de MDS(Maximum Distance Separable) se valer a igual-dade d = n − k + 1

Exemplo 10. Seja C o código binário do exemplo anterior. Vamos determinar a dimensão,

o número de elementos e a distância mínima de C

Resolução:

Temos que a dimensão de C é igual a 4, pois G possui 4 linhas linearmente independentes. O número de elementos de C é igual a 16. Temos que a matriz teste de paridade H de C é: H =   1 1 1 0 1 0 1 1 1 1 0 1  

Pelo Teorema4 , para descobrir o valor do peso do código, precisamos descobrir s colunas de H linearmente dependentes de forma que quaisquer s − 1 colunas de H sejam linearmente independentes. Como H possui duas colunas linearmente dependentes, tal que quaisquer uma coluna seja linearmente independente, então a distância mínima é d = 2.

(32)

Capítulo 3. Códigos Lineares 30

3.5

Exemplos de Códigos Lineares: Códigos de Hamming

Seja H uma matriz cujas colunas são todos os vetores não nulos do espaço vetorial Fm2 . Portanto H tem m linhas e 2m − 1 colunas. Além disso, como os vetores da base

canônica {e1, ..., em} são colunas de H, a matriz identidade Idm é uma submatriz de H com

determinante det(Idm) = 1 6= 0. Portanto as m linhas de H são linearmente independentes,

e H é uma matriz teste de paridade de um código binário.

Exemplo 11. Um Código de Hamming de ordem m sobre F2 é um código com matriz

teste de paridade Hm de ordem m × n, cujas colunas são os elementos de Fm2 \ {0} numa

ordem qualquer.

A definição acima de Hm determina o código C a menos de equivalência.

Temos, portanto, que o comprimento de um código de Hamming de ordem m é n = 2m− 1 e, portanto, a sua dimensão é k = n − m = 2m− m − 1.

Para exemplificarmos numericamente, considere a matriz

H =      1 0 1 1 1 0 0 1 1 0 1 0 1 0 0 1 1 1 0 0 1     

Essa é a matriz de um código de Hamming com m = 3

Temos que por ((3), Proposição 6, p.94) todo código de Hamming é perfeito.

3.6

Decodificação

Chama-se decodificação ao procedimento de detecção e correção de erros num determinado código. O método geral de decodificação para códigos lineares que usaremos é um aperfeiçoamento de um método desenvolvido por D. Slepian do Laborátorio de Bell na década de 60. O método original Slepian tinha um custo computacional muito elevado e os aperfeiçoamentos tinham como objetivo reduzir esse custo segundo (3).

Inicialmente, define-se o vetor erro e como sendo a diferença entre o vetor recebido r e o vetor transmitido c, isto é,

e = r − c

Por exemplo, se, num dado código sobre F2, tenhamos transmitido a palavra

(010011) e a palavra recebida tenha sido (101011) então

e = (101011) − (010011) = (111000).

Note que o peso do vetor erro e corresponde ao número de erros cometidos numa palavra entre a transmissão e a recepção.

(33)

Capítulo 3. Códigos Lineares 31

Seja H a matriz teste de paridade do código. Como Hct= 0, temos que

Het = H(rt− ct) = Hrt− Hct= Hrt (3.2)

Portanto a palavra recebida e o vetor erro tem a mesma síndrome. Denotemos por hi a i-ésima coluna de H. Se e = (α

1...αn), então n

X i=1

αihi = Het= Hrt

Lema 6. Seja C um código linear em Kn com capacidade de correção k. Se r ∈ Kn e c ∈ C são tais que d(c, r) ≤ k, então existe um único vetor e com w(e) ≤ k, cuja síndrome é igual à síndrome de r e tal que c = r − e.

Demonstração. De fato, e = r − c satisfaz a propriedade w(e) = w(r − c) = d(c, r) ≤ k e por 3.2 temos que e possui a mesma síndrome de r. Para provar a unicidade, suponhamos que e = (α1, ..., αn) e e0 = (α01, ..., α

0

n) sejam tais que w(e) ≤ k e w(e

0) ≤ k e tenham a

mesma síndrome que r. Então, se H é uma matriz teste de paridade de C, temos Het = He0t =⇒ n X i=1 αihi = n X i=1 α0ihi

o que nos dá uma relação de dependência linear entre 2k(≤ d − 1) colunas de H. Como quaisquer d − 1 colunas de H são linearmente independentes, temos que αi = α0i para todo

i, logo e = e0.

O problema que se coloca, então, é como determinar esse único vetor e a partir de Hrt.

Exemplo 12. Determinação de e quando w(e) ≤ 1. Suponhamos que o código C tenha

distância mínima d ≥ 3 e que o vetor erro e, introduzido entre a palavra transmitida c e a palavra recebida r, seja tal que w(e) ≤ 1. Isto é, o canal introduziu no máximo um erro.

Se Het= 0, então r ∈ C e se toma c = r.

Suponhamos Het6= 0. Então w(e) = 1 e, portanto, e tem apenas uma coordenada não nula. Nesse caso, consideremos que e = (0, ..., α, ..., 0) com α 6= 0 na i-ésima posição. Logo,

Het = αhi,

onde hi é a i-ésima coluna de H. Portanto, não conhecendo e, mas conhecendo

Het= Hrt= αhi,

podemos determinar e como sendo o vetor com todas as componentes nulas exceto a i-ésima componente que é α. Note que i acima é bem determinado, pois d ≥ 3.

(34)

Capítulo 3. Códigos Lineares 32

Exemplo 13. Seja C o Código do Robô. Esse código tem matriz teste de paridade

H =      1 0 1 0 0 1 1 0 1 0 0 1 0 0 1     

Seja r = (10100) uma palavra recebida, logo,

Het = Hrt=      0 1 0      = 1.h4 Portanto, e = (00010) e, consequentemente, c = r − e = (10110)

Com isso, conforme (3), podemos estabelecemos um algoritmo de decodificação em códigos corretores de um erro.

Seja H a matriz teste de paridade do código C e seja r um vetor recebido. (Suponha d ≥ 3).

i) Calcule Hrt.

ii) Se Hrt= 0, aceite r como sendo a palavra transmitida.

iii) Se Hrt= st 6= 0, compare st com as colunas de H.

iv) Se existirem i e α tais que st = αhi, para α ∈ K, então e é a n-upla com α na

posição i e zeros nas outras posições. Corrija r pondo c = r − e. v) Se o contrário de (iv) ocorrer, então mais de um erro foi cometido.

Esse algoritmo pode ser aplicado no caso dos códigos de Hamming como segue. Ordene os vetores colunas de Hm do seguinte modo: se v ∈ Fm2 \ {0}. Logo,

v = (v1, ..., vm) com vi = 0, 1, então coloque o vetor v em Hm na coluna de ordem

i = v1+ v221+ v322+ ... + vm2m−1.

Note que, na condição (iv) em códigos binários, α é necessariamente igual a 1. Suponhamos, agora, que Hmrt6= 0, logo Hmrt= st é a coluna de Hm de ordem

(35)

Capítulo 3. Códigos Lineares 33

e, portanto, o vetor erro correspondente é:

e = ej = (0, ..., 0, 1, 0, ..., 0)

com 1 na j-ésima componente.

Exemplo 14. No código de Hamming de ordem 3, tomemos a matriz teste de paridade

H3 =      1 0 1 0 1 0 1 0 1 1 0 0 1 1 0 0 0 1 1 1 1      . Se r = (1010011), então H3rt=      1 1 0      , logo, j = 1 + 2 = 3 e, portanto, e = (0010000) e c = (1000011).

Voltemos agora ao caso geral. Seja C ⊂ Knum código corretor de erros com matriz

teste de paridade H. Sejam d a distância mínima de C e k = hd−12 i. Recorde que e e r tem a mesma síndrome e, se w(e) = d(r, c) ≤ k, então e é univocamente determinado por r.

Seja v ∈ Kn. Defina

v + C = {v + c : c ∈ C}.

Lema 7. Os vetores u e v de Kn tem a mesma síndrome se, e somente se, u ∈ v + C

Demonstração. Hut= Hvt⇔ H(u − v)t = 0 ⇔ u − v ∈ C ⇔ u ∈ v + C

Proposição 8. Seja C um (n, k)-código linear e v, v0 ∈ Kn . Temos que

i) v + C = v0+ C ⇔ v − v0 ∈ C.

ii) (v + C) ∩ (v0 + C) 6= ∅ =⇒ v + C = v0 + C. iii) S

v∈Kn(v + C) = Kn.

iv) |(v + C)| = |C| = qk.

Cada conjunto da forma v + C é chamada de classe lateral de v segundo C. Note que

(36)

Capítulo 3. Códigos Lineares 34

Segue imediatamente de (ii)-(iv) acima que o número de classes laterias segundo C é

qn qk = q

n−k

Exemplo 15.

Seja C o (4,2)-código gerado sobre F2 pela matriz

G =   1 0 1 1 0 1 0 1   Logo, C = {0000, 1011, 0101, 1110} e as classes laterais segundo C são

0000 + C = {0000, 1011, 0101, 1110} 1000 + C = {1000, 0011, 1101, 0110} 0100 + C = {0100, 1111, 0001, 1010} 0010 + C = {0010, 1001, 0111, 1100}

Note que o Lema7 estabelece uma correspondência 1 a 1 entre classes laterais e síndromes. Todos os elementos de uma classe lateral tem a mesma síndrome, e elementos de classes laterais distintas possuem síndromes distintas.

Definição 10. Um vetor de peso mínimo numa classe lateral é chamado de elemento

lider dessa classe.

No código do exemplo acima, temos que: 0000 é líder de C, 1000 é líder de 1000 + C, 0100 e 0001 são líderes de 0100 + C, e 0010 é líder de 0010 + C.

Segue abaixo uma proposição de suma importância, pois irá nos ajudar quando formos decodificar uma mensagem.

Proposição 9. Seja C um código linear em Kn com distância mínima d. Se u ∈ Kn é

tal que w(u) ≤ " d − 1 2 # = k então u é o único elemento líder de sua classe.

Demonstração. Suponhamos que u, v ∈ Kn com w(u) ≤hd−1

2

i

(37)

Capítulo 3. Códigos Lineares 35 Se u − v ∈ C, então w(u − v) ≤ w(u) + w(v) ≤ " d − 1 2 # + " d − 1 2 # ≤ d − 1 logo, u − v = 0 e, portanto, u = v.

Para achar líderes de classes, tomamos os elementos u tais que w(u) ≤hd−12 i. Cada um desses elementos é líder de uma e somente uma classe. Esses líderes são todos aqueles de peso ≤hd−12 i.

Vamos agora discutir um algoritmo de correção de mensagens que tenham sofrido um número de erros menor ou igual à capacidade de correção do código, que é k =hd−12 i.

Preparação: Determine todos os elementos u ∈ Kn, tal que w(u) ≤ k. Em seguida, calcule as síndromes desses elementos e coloque esse dados numa tabela. Seja r uma palavra recebida. Aplique o seguinte Algoritmo de Decodificação:

O Algoritmo de Decodificação

(1) Calcule a síndrome st= Hrt.

(2) Se s está na tabela, seja l o elemento líder da classe determinada por s; troque r por r − l.

(3) Se s não está na tabela, então na mensagem recebida foram cometidos mais do que k erros.

Justificativa: Dado r, sejam c e e, respectivamente, a mensagem transmitida

e o vetor erro. Como Het = Hrt, temos que a classe lateral onde e se encontra está

determinada pela síndrome de r. Se w(e) ≤ k, temos que e é o único elemento líder l de sua classe e, portanto, é conhecido e se encontra na tabela. Consequentemente, pelo Lema

6, c = r − e = r − l é determinado.

Exemplo 16. Considere o (6,3)-código linear definido sobre F2 com matriz teste de

paridade H =      1 0 0 1 0 1 0 1 0 1 1 0 0 0 1 0 1 1     

Nesse caso d = 3 e, portanto, k =hd−1

2

i

(38)

Capítulo 3. Códigos Lineares 36

Os vetores de peso ≤ 1 com as suas respectivas síndromes estão relacionados na tabela abaixo: líder síndrome 000000 000 000001 101 000010 011 000100 110 001000 001 010000 010 100000 100

Suponhamos, agora, que a palavra recebida seja

(a) r = (100011). Neste caso, Hrt = (010)te, portanto, e = (010000). Consequentemente,

c = r − e = (110011).

(b) r = (111111). Neste caso, Hrt= (111)t, que não se encontra na tabela. Sendo assim, foi cometido mais do que 1 erro na mensagem r.

(39)

37

4 Polinômios

Com este capítulo objetivamos apresentar algumas definições e resultados sobre polinômios necessários para o estudo do tema Códigos Cíclicos, que será introduzido no próximo capítulo. Inicialmente, vamos começar com alguns conceitos básicos da teoria de polinômios. Estaremos nos baseando em (1).

Uma função polinomial (real) f é uma aplicação da reta R nela mesma, onde o valor, f (x), da função f em todo número (real) x é dado pela fórmula que é uma combinação linear de potências de inteiros não negativos de x.

Uma expressão, tal como x3+ 1 ou x6− 3x2+ 1

2, o qual é uma combinação linear

de potências não negativas de x (que, por consequência, define uma função polinomial) é usualmente referida como um polinômio com coeficientes em R. É também possível considerar polinômios com diferentes tipos de coeficientes, por exemplo, coeficientes os quais são números complexos ou podemos apenas considerar polinômios com coeficientes racionais, etc. Em tais casos nos referimos a polinômios com coeficientes emC ou Q, etc. Um polinômio típico, pode então, ser escrito da seguinte forma:

a0x0+ a1x1+ ... + aixi+ ...

Se an 6= 0, em outras palavras, se xn é a maior potência de x que aparece no

polinômio, então chamamos anxn e an o termo principal e coeficiente principal,

respectivamente e dizemos que o grau de f(x) é n o qual denotamos por ∂f (x) = n. Por exemplo, o grau do polinômio x3+ 2x − 1 é 3.

Denotamos o conjunto de todos os polinômios os quais possuem como coeficientes números reais por R[x]. O “x” que aparece na expressão de um polinômio deve ser pensado como uma variável que pode ser substituída por um número arbitrário α. Nós descrevemos esse passo como avaliar o polinômio em x = α e escrevemos f (α) para o número obtido quando substituímos toda ocorrência de x na expressão de f(x) por α.

Vamos nos preocupar com a questão geral de onde o gráfico de uma expressão polinomial intercepta o eixo x: dizemos que o número real α é um zero (ou raíz) do polinômio f(x) se f (α) = 0.

A partir de agora, iremos demonstrar alguns teoremas e proposições, assim como exibir alguns exemplos usando polinômios.

4.1

O Algoritmo da Divisão para Polinômios

(40)

Capítulo 4. Polinômios 38

Definição 11. Dizemos que o polinômio g(x) divide o polinômio f(x) se existe um polinômio

q(x) tal que f(x)=q(x)g(x).

Proposição 10. Sejam s(x) e t(x) polinômios de grau n e m respectivamente, onde

s(x) = a0x0 + a1x1+ ... + anxn e t(x) = b0x0+ b1x1 + ... + bmxm, com an6= 0 e bm 6= 0.

Assuma que n ≥ m. Então o grau do polinômio u(x) = s(x) − (an

bm

)xn−mt(x) é estritamente menor que o grau de s(x).

Demonstração. Podemos observar que s(x) e xn−mt(x) são ambos de grau n (note que o termo principal de xn−mt(x) é b

mxmxn−m = bmxn), o grau de u(x) pode ser no máximo

n. Entretanto, o coeficiente de xn em s(x) é a

n e o coeficiente desta potência de x no

polinômio (bman)xn−mt(x) é (an

bm)bm = an. Portanto o coeficiente de x

n em u(x) é zero, e o

grau de u(x) é menor que n.

Teorema 5. (Teorema da Divisão para Polinômios) Sejam f(x) e g(x) polinômios (com

coeficientes reais) com ∂g(x) ≥ 0 (isto é, g(x) não é um polinômio constante). Então existem polinômios q(x) e r(x) tal que f(x)=q(x)g(x) + r(x), onde ∂r(x) < ∂g(x).

Demonstração. Para provar esse teorema, iremos mostrar a existência e unicidade, isto é, vamos provar que existem polinômios q(x) e r(x) e que estes são únicos.

Sejam f(x) = a0+ a1x + ... + anxn e g(x) = b0+ b1x + ... + bmxm, onde ∂g(x) = m.

Primeiramente vamos provar a existência: Se f(x)=0 basta tomar q(x)=r(x)=0. Suponhamos f (x) 6= 0 e grau de f (x) = n.

Assim ∂f (x) = n. Se n < m, basta tomar q(x) = 0 e r(x)=f(x). Assim podemos assumir n ≥ m.

Seja f1(x) = anb−1m xn−mg(x) + f1(x). Podemos observar que ∂f1(x) < ∂f (x). Vamos

demonstrar o teorema por indução sobre n.

Se n = 0, n ≥ m ⇒ m = 0 e portanto f(x)=a0 6= 0, g(x)=b0 6= 0 e teremos,

f(x)=a0b−10 g(x).

Tomando g(x) = a0b−10 e r(x) = 0. Pela igualdade f1(x) = f(x) - anb−1mxn−me ∂f1(x) < ∂f (x)

= n temos pela hipótese de indução que: ∃ q1(x), r1(x) tais que f1(x) = q1(x)g(x) + r1(x)

onde r1(x) = 0 ou ∂r1(x) < ∂g(x). Segue-se então que: f (x) = (q1(x) + anb−1m xn−m)g(x) +

r1(x), e portanto, tomando q(x) = q1(x) + anb−1m xn−m e r(x) = r1(x) provamos a existência

dos polinômios q(x) e r(x) tais que f(x) = q(x)g(x) + r(x) e r(x) = 0 ou ∂r(x) < ∂g(x). Agora vamos mostrar a unicidade.

(41)

Capítulo 4. Polinômios 39

Sejam q1(x), q2(x), r1(x) e r2(x) tais que f (x) = q1(x)g(x) + r1(x) = q2(x)g(x) +

r2(x), onde ri(x) = 0 ou ∂ri(x) < ∂g(x), com i = 1, 2. Daí segue-se que (q1(x)−q2(x))g(x) =

r2(x) − r1(x). Mas se q1(x) 6= q2(x) o grau do polinômio do lado esquerdo desta igualdade

é maior do que ∂g(x), entretanto, por hipótese, ∂(r2(x) − r1(x) < ∂g(x), logo temos uma

contradição. Portanto q1(x) = q2(x). Daí temos que

r1(x) = f (x) − q1(x)g(x) = f (x) − q2(x)g(x) = r2(x)

. Concluindo então nossa demonstração.

Corolário 5. Dado um polinômio f(x), o valor x = α é um zero de f(x) se, e somente se,

f(x) é divisível por x − α.

Demonstração. (⇒) Primeiramente suponha que α é um zero de f(x). Aplicando o teorema da divisão com g(x) = x - α, então f(x) = g(x)q(x) + r(x), onde r(x) = 0 ou ∂r(x) < ∂g(x). Como ∂g(x) = 1, então r(x) é uma constante c, logo f(x) = (x - α)q(x) + c. Avaliando em x = α, obtemos f (α − α)q(α) + c. Sabemos por hipótese que f (α) = 0 (pois α é um zero de f(x)), então obtemos c = 0, ou seja, concluímos que x - α divide f(x).

(⇐) Se f(x) é divisível por x - α, temos que f(x) = (x - α)q(x), para algum polinômio q(x). Considerando x = α, obtemos f (α) = (α − α)q(α) = 0q(α) = 0. Portanto α é um zero de f(x).

Proposição 11. Sejam f(x) e g(x) polinômios não nulos. Então existe um polinômio d(x)

tal que

(i) d(x) divide ambos f(x) e g(x).

(ii) se c(x) é qualquer polinômio que divide ambos f(x) e g(x), então c(x) divide d(x). Demonstração. Sejam S o conjunto de polinômios de grau maior que zero da forma f(x)r(x) + g(x)s(x) variando ao longo do conjunto de todos os polinômios. Considere o conjunto D de inteiros composto pelos graus dos polinômios em S. Como f(x) = 1.f(x) + 0, o grau de f(x) está em D, logo D é um conjunto não vazio de inteiros não negativos. Agora aplicamos o princípio da ordenação ao conjunto D para selecionar um polinômio d(x) em S tal que o grau de d(x) seja o menor inteiro em D. Como d(x) ∈ S, temos que d(x)=f(x)r(x) + g(x)s(x) para algum polinômio r(x) e s(x). Mostraremos então que d(x) tem as propriedades (i) e (ii).

Se o polinômio c(x) divide f(x), temos que f(x) = c(x)u(x) e se c(x) divide g(x), temos que g(x) = c(x)v(x), daí segue-se

d(x) = f(x)r(x) + g(x)s(x) = c(x)u(x)r(x) + c(x)v(x)s(x) ⇒ d(x) = c(x)(u(x)r(x) + v(x)s(x))

Referências

Documentos relacionados

Esse capítulo apresenta alguns trabalhos relevantes na área de códigos corretores de erros em hardware, dando ênfase aos algoritmos de Reed-Solomon e BCH, utilizados para atividades

O estudo de sistemas de equações lineares é de fundamental importância na Álgebra Linear. Resolvendo sistemas de equações lineares podemos determinar: a dependência ou

A álgebra linear é o ramo da matemática que estuda os espaços vetoriais, ou espaços lineares, além de funções lineares que associam vetores entre dois espaços vetoriais, e esses