Seção 8.2 Códigos Lineares
Para ganhar mais informação sobre um código particular e desenvolver técnicas mais eficientes de codificação, decodificação e detecção de erros, necessitaremos agregar uma maior estrutura para nossos códigos. Uma forma de conquistar isso é pedir que o código também seja um grupo. Um código de grupo ou código linearé um código que também é um subgrupo de \({\mathbb Z}_2^n\text{.}\)
Para verificar que um código é um código de grupo, só precisamos verificar uma coisa. Se somamos dois elementos no código, o resultado deve ser uma \(n\)-tupla que novamente está no código. Não é necessário verificar que o elemnto inverso da \(n\)-tupla esta no código, pois cada palavra do código é seu próprio inverso, também não é necessário checar que \({\mathbf 0}\) seja uma palavra do código. Por exemplo,
Exemplo 8.2.1.
Suponha que temos um código que consista das seguintes 7-tuplas:
É uma tarefa simples, porém tediosa verificar que este código é um subgrupo de \({\mathbb Z}_2^7\) e que portanto, é um código de grupo. Este código detecta um erro e corrige um erro, mas calcular todas as distâncias entre pares de palavras do código para determinar que \(d_{\min} = 3\) é um processo longo e tedioso. É muito mais simples ver que o peso mínimo de todas as palavras não nulas é 3. Como veremos daqui a pouco, isso não é uma coincidência. Mas a relação entre pesos e distâncias em um código particular é fortemente dependente do fato que o código seja um grupo.
Lema 8.2.2.
Sejam \({\mathbf x}\) e \({\mathbf y}\) \(n\)-tuplas binárias. Então \(w({\mathbf x} + {\mathbf y}) = d({\mathbf x}, {\mathbf y})\text{.}\)
Demonstração.
Suponha que \({\mathbf x}\) e \({\mathbf y}\) são \(n\)-tuplas binárias. Então a distância entre \({\mathbf x}\) e \({\mathbf y}\) é exatamente o número de lugares em que \({\mathbf x}\) e \({\mathbf y}\) diferem. Mas \({\mathbf x}\) e \({\mathbf y}\) diferem em uma coordenada particular se e somente a soma é 1 nessa coordenada, pois
Assim, o peso da soma é igual a distância entra as duas palavras.
Teorema 8.2.3.
Seja \(d_{\min}\) a distância mínima para um código de grupo \(C\text{.}\) Então \(d_{\min}\) é o mínimo de todos os pesos das palavras não nulas em \(C\text{.}\) Isto é,
Demonstração.
Observe que
Subseção 8.2.1 Códigos Lineares
A partir do Exemplo 8.2.1, fica fácil verificar que o peso mínimo diferente de zero é 3, o código realmente detecta e corrige todos os erros individuais. Reduzimos o problema de encontrar “bons” códigos para o de gerar códigos de grupos. Uma forma fácil de gerar códigos de grupo é aplicar um pouco de teoria de matrizes.
Definimos o produto interno de duas \(n\)-tuplas binárias como
donde \({\mathbf x} = (x_1, x_2, \ldots, x_n)^{\rm t}\) e \({\mathbf y} = (y_1, y_2, \ldots, y_n)^{\rm t}\) são vetores coluna. 1 Por exemplo, se \({\mathbf x} = (011001)^{\rm t}\) e \({\mathbf y} = (110101)^{\rm t}\text{,}\) então \({\mathbf x} \cdot {\mathbf y} = 0\text{.}\) Também podemos pensar no produto interno como o produto de um vetor linha com um vetor coluna; isto é,
Exemplo 8.2.4.
Suponha que as palavras a serem codificadas consistem de todas as 3-tuplas binárias e que nosso mecanismo de codificação é o de controle de paridade. Para codificar uma 3-tupla arbitrária, adicionamos o quarto bit para obter um número par de uns. Note que uma \(n\)-tupla arbitrária \({\mathbf x} = (x_1, x_2, \ldots, x_n)^{\rm t}\) tem um número par de uns exatamente quando \(x_1 + x_2 + \cdots + x_n = 0\text{;}\) logo, uma 4-tupla \({\mathbf x} = (x_1, x_2, x_3, x_4)^{\rm t}\) tem um número par de uns se e somente se \(x_1+ x_2+ x_3+ x_4 = 0\text{,}\) ou
Este exemplo nos da esperança de que haja uma conexão entre matrizes e a teoria de códigos.
Seja \({\mathbb M}_{m \times n}({\mathbb Z}_2)\) o conjunto de todas as matrizes de \(m \times n\) com coeficientes em \({\mathbb Z}_2\text{.}\) Fazemos operações entre as matrizes como sempre, exceto que todas operações de soma e produto ocorrem em \({\mathbb Z}_2\text{.}\) Defina o espaço nulo de uma matriz \(H \in {\mathbb M}_{m \times n}({\mathbb Z}_2)\) como o conjunto de todas as \(n\)-tuplas binárias \({\mathbf x}\) tais que \(H{\mathbf x} = {\mathbf 0}\text{.}\) Denotamos o espaço nulo de uma matriz \(H\) por \(\Null(H)\text{.}\)
Exemplo 8.2.5.
Suponha que
Para que uma 5-tupla \({\mathbf x} = (x_1, x_2, x_3, x_4, x_5)^{\rm t}\) esteja no espaço nulo de \(H\text{,}\) \(H{\mathbf x} = {\mathbf 0}\text{.}\) Equivalentemente, devemos satisfazer o seguinte sistema de equações:
O conjunto da 5-tuplas binárias que satisfazem estas equações é
É fácil determinar que este código é um código de grupo.
Teorema 8.2.6.
Seja \(H\) em \({\mathbb M}_{m \times n}({\mathbb Z}_2)\text{.}\) Então o espaço nulo de \(H\) é um código de grupo.
Demonstração.
Como cada elemento de \({\mathbb Z}_2^n\) é seu próprio inverso, o único que precisa ser verificado é o fecho. Sejam \({\mathbf x}, {\mathbf y} \in {\rm Null}(H)\) para alguma matriz \(H\) em \({\mathbb M}_{m \times n}({\mathbb Z}_2)\text{.}\) Então \(H{\mathbf x} = {\mathbf 0}\) e \(H{\mathbf y} = {\mathbf 0}\text{.}\) Assim
Logo, \({\mathbf x} + {\mathbf y}\) está no espaço nulo de \(H\) e portanto é uma palavra do código.
Um código é um código linear se está determinado pelo espaço nulo de alguma matriz \(H \in {\mathbb M}_{m \times n}({\mathbb Z}_2)\text{.}\)
Exemplo 8.2.7.
Seja \(C\) o código dado pela matriz
Suponha que é recebido a 6-tupla \({\mathbf x} = (010011)^{\rm t}\text{.}\) É simplesmente questão de multiplicar matrizes para determinar se \({\mathbf x}\) está ou não no código. Como
a palavra recebida não está no código. Devemos tentar corrigi-la ou pedir que seja transmitida novamente.