Códigos Cíclicos: Definição TÉCNICAS DE CODIFICAÇÃO DE SINAIS • Um código de bloco linear é um código cíclico se cada deslocamento cíclico das palavras-código é também uma palavra-código. Vantagens: – Descrição algébrica elegante • c(x) = m(x)g(x), g(x) → polinômio gerador • c(x)h(x) = 0 mod (xn − 1) → h(x) polinômio de verificação de paridade • c(β1) = 0, ..., c(βt) = 0, onde βi ∈ GF(pm) CÓDIGOS CÍCLICOS – Codificação e cálculo de síndromes utilizando registradores de deslocamento – Correção de surtos de erros – Correção de erros aleatórios através da solução de equações de polinômios Evelio M. G. Fernández - 2010 Deslocamentos Cíclicos de n-uplas e Polinômios Deslocamentos Cíclicos de n-uplas e Polinômios x·v(x): deslocamento cíclico no tempo ou rotação à direita sujeita à condição, C: (n, k), C: SubEsp Vn Se v = (v0 , v1 , K , vn −1 ) ∈ C : código cíclico, então deslocamentos cíclicos de v também pertencem a C, isto é: x n = 1 ou x n − 1 = 0 → x ⋅ v(x ) = v0 x + v1 x 2 + L + vn −1 { x n −1 x =1 = vn −1 + v0 x + v1 x 2 + L + vn − 2 x n −1 = v1 (x ) ∈ C (vn −1 , v0 , v1 , v2 ,K , vn− 2 ) ⎫ (vn −2 , vn −1 , v0 , v1 ,K, vn−3 )⎪⎪ multiplicação módulo x n −1 ⎬∈C ⎪ (v1 , v2 K vn−2 ,K, vn−1 , v0 )⎭⎪ M M x v(x ) = xv1 (x ) 2 = vn −1 x + v0 x 2 + v1 x 3 + L + vn −3 x n −1 + vn −2 { xn =1 Representação Polinomial: v = (v0 , v1 ,K , vn −1 ) ↔ v( x ) = v0 + v1 x + v2 x + L + vn −1 x 2 onde: x = variável auxiliar vi ∈ GF(q); q primo. n −1 = vn − 2 + vn −1 x + v0 x 2 + v1 x 3 + L + vn −3 x n −1 = v2 (x ) ∈ C : Código Cíclico {v(x ), xv(x ), x v(x ),K}mod x 2 n −1 ∈ C Isto é, para ∀i o polinômio x i v(x ) mod x n −1∈C . 1 Corpos Finitos Corpos Finitos • Um corpo finito com q elementos é chamado de GF(q) (Galois Field) • Teorema: A característica, λ, de um corpo finito é um número primo • GF(p) = inteiros com aritmética módulo um número primo, p • Teorema: Seja a um elemento diferente de zero em GF(q). Então, a(q−1) = 1 • GF(pm) = polinômios sobre GF(p) com aritmética módulo um polinômio primo de grau m (extension field) • Teorema: Seja a um elemento diferente de zero em GF(q). Seja n a ordem de a. Então, n divide q−1 • Todo corpo finito é o espaço vetorial de m-uplas sobre o corpo GF(p) de inteiros com aritmética módulo um número primo p. Portanto, GF(q) = GF(pm) • Resultado: Se a ordem de a for q−1, então a é um elemento primitivo de GF(q) Aritmética de Corpos Finitos Aritmética de Corpos Finitos • Polinômios com uma variável X e coeficientes em um corpo F (denotados por F[x]), são expressões da forma f ( X ) = f 0 + f1 X + f 2 X 2 + L + f n X n • O grau de f(X) é a maior potência de X (com coeficiente de X ≠ 0) • Polinômio mônico: O coeficiente da maior potência de X é 1 ⇒ Todos os polinômios diferentes de zero sobre GF(2) são mônicos • Para qualquer dividendo f(X) ∈ F[x] e divisor diferente de zero, g(X) ∈ F[x] existirão um par de polinômios únicos q(X), cociente e r(X), resto, tal que Definição: Seja p(X) um polinômio de grau m sobre GF(2). Se p(X) não for divisível por nenhum polinômio sobre GF(2) de grau m – 1 ou menos, então p(X) é irredutível sobre GF(2). Resultado: Qualquer polinômio irredutível sobre GF(2) de grau m divide X2 m −1 +1 f ( X ) = q( X )g ( X ) + r ( X ), onde deg r ( X ) < deg g ( X ) 2 Aritmética de Corpos Finitos Definição: Seja p(X) um polinômio irredutível de grau m sobre GF(2); então, p(X) divide Xn + 1 para n = 2m – 1. Se este valor de n for o menor inteiro positivo para o qual p(X) divide xn + 1, então p(X) é um polinômio primitivo de grau m sobre GF(2) 000 001 010 011 100 101 110 111 000 000 001 010 011 100 101 110 111 001 001 000 011 010 101 100 111 110 010 010 011 000 001 110 111 100 101 011 100 101 110 010 101 100 111 001 110 111 100 000 111 110 101 111 000 001 010 110 001 000 011 101 010 011 000 + 0 1 2 3 4 5 6 7 0 0 1 2 3 4 5 6 7 1 1 2 3 4 5 6 7 0 2 2 3 4 5 6 7 0 1 3 3 4 5 6 7 0 1 2 4 4 5 6 7 0 1 2 3 5 5 6 7 0 1 2 3 4 6 6 7 0 1 2 3 4 5 7 7 0 1 2 3 4 5 6 × 0 1 2 3 4 5 6 7 0 0 0 0 0 0 0 0 0 1 0 1 2 3 4 5 6 7 2 0 2 4 6 0 2 4 6 3 0 3 6 1 4 7 2 5 4 0 4 0 0 0 4 0 4 5 0 5 2 3 4 1 6 3 6 0 6 4 6 0 6 4 2 7 0 7 6 1 4 3 2 1 Operação de “Multiplicação” das 3-uplas Soma Módulo-2 (Bit-a-Bit) 011 100 101 110 Produto Módulo-8 Soma Módulo-8 100 011 010 001 111 111 110 101 100 011 010 001 000 001 010 011 100 101 110 111 001 001 010 011 100 101 110 111 010 010 100 110 011 001 111 101 011 011 110 101 111 100 001 010 100 100 011 111 110 010 101 001 101 101 001 100 010 111 011 110 110 110 111 001 101 011 010 100 111 111 101 010 001 110 100 011 3 Construção de GF(2m) Representação Definição: 111 ⇔ α 2 + α + 1 110 ⇔ α 2 + α 101 ⇔ α 2 + 1 100 ⇔ α 2 011 ⇔ α + 1 010 ⇔ α 001 ⇔ 1 000 ⇔ 0 Um elemento de GF(2m) de ordem 2m – 1 é um elemento primitivo. ⇒ se α é um elemento primitivo em GF(2m), então as potências distintas de α geram todos os elementos (diferentes de zero) de GF(2m). Definição: Um polinômio irredutível, p(x), de grau m sobre GF(2) é um polinômio primitivo se tiver como raiz um elemento primitivo de GF(2m) Propriedades de GF(2m) Teorema: Teorema: Seja f(X) um polinômio com coeficientes em GF(2). Seja β um elemento de GF(2m). Se β é uma raiz de f(X), então para qualquer l ≥ 0 , l β 2 é também uma raiz de f(X) O elemento Propriedades de GF(2m) β2 l é chamado de conjugado de β. Os 2m – 1 elementos diferentes de zero de GF(2m) compõem todas as raízes de X 2 m −1 +1 → O elemento 0 de GF(2m) é a raiz de X. Portanto, Corolário: m Os elementos de GF(2m) compõem todas as raízes de X 2 + X ⇒ β pode ser uma raiz de um polinômio sobre GF(2) de grau menor que 2m 4 Propriedades de GF(2m) Polinômio Gerador Definição: Seja β um elemento de GF(2m). O polinômio minimal, φ(X), de β é o polinômio de menor grau com coeficientes em GF(2) tal que φ(β) = 0. Teorema: Sejam φ(X) o polinômio minimal de um elemento β em e GF(2m) e e o menor inteiro tal que β 2 = β . Então: e −1 ( φ (X ) = ∏ X + β 2 i =0 i ) Polinômio Gerador Seja C um código cíclico (n, k) sobre GF(q) • Existe um polinômio mônico g(x), chamado de polinômio gerador, tal que uma n-upla c(x) é uma palavra-código se e somente se g(x) for um divisor de c(x). • O polinômio gerador é único. • O grau do polinômio gerador é n − k. • g(x) é o polinômio código de menor grau entre todos os polinômios código. • O polinômio gerador é um divisor de xn − 1. Matriz Geradora não Sistemática g ( x ) = 1 + g1 x + g 2 x 2 + L + g n − k x n − k c( x ) = a ( x) g ( x ) mod x n − 1∈C : ( n, k ) • Código cíclico C: (n, k) gerado por g(x) de grau r = n − k onde: Grau [c(x)] ≤ n – 1. Grau [g(x)] = n – k. Grau [a(x)] ≤ k – 1. a(x): polinômio em x associado à mensagem a ser codificada em c(x). Seja a ( x) = a0 + a1 x + a2 x 2 + L + ak −1 x k −1 a ( x ) g ( x ) = a0 { g ( x) + a1 xg ( x) + L + ak −1 x k −1 g ( x) 123 1 424 3 ∈C ∈C ∈C ⎡ g (x ) ⎤ ⎡ g 0 ⎢ xg ( x ) ⎥ ⎢ 0 ⎥=⎢ M M G=⎢ ⎢ x k − 2 g ( x )⎥ ⎢ 0 ⎢ k −1 ⎥ ⎢ ⎣ x g ( x )⎦ ⎣ 0 g1 L g r 0 0 0 0 ⎤ g 0 g1 L g r 0 0 0 ⎥ M O O L O O M⎥ 0 0 g 0 g1 L g r 0 ⎥ ⎥ 0 0 0 g 0 g1 L g r ⎦ Portanto: a(x)g(x) = combinação linear de palavras código que resulta em uma outra palavra código de C. 5 Código Cíclico Sistemático Procedimento para Codificação Sistemática ⎛ ⎞ ⎜ ⎟ v = ⎜ b0 , b1 ,K, bn −k −1 , m0 , m1 ,K, mk −1 ⎟ 1 4 4 2 4 4 3 1 4 4 2 4 4 3 ⎜ n− k bits de cheque ⎟ k bits de mensagem ⎜ ⎟ ⎝ de paridade ⎠ 1. m( x) x n −k = ? 2. Resto da divisão Seja m(x): polinômio-mensagem, 3. b( x) + x n− k m( x) = v( x) m( x) = m0 + m1 x + L + mk −1 x k −1 → v(x): polinômio código de código sistemático. EXEMPLO: v( x) = b0 + b1 x + L + bn − k −1 x n− k −1 + m0 x n− k + m1 x n − k +1 + L mk −1 x k −1 1444424444 3 1444442444443 b( x) m( x) = 1 + x 3 , g ( x) = 1 + x + x 3 , código cíclico C: (7, 4). x n− k m ( x ) Se v(x) = a(x)g(x) ⇒ x n − k m( x ) = b( x ) ? g ( x) Palavra código correspondente à m(x)? x n − k m( x ) b( x ) = a ( x) − g ( x) g ( x) a(x) tal que a(x)g(x) = v(x)? Polinômio de Verificação de Paridade Codificador de um Código Cíclico (n, k) x − 1 = h( x ) g ( x) n ou: ( ) h( x) g ( x) mod x n − 1 = 0 g(x): polinômio gerador de C: (n, k) h(x): polinômio de verificação de paridade de C: (n, k) Grau [g(x)] = n – k Grau [h(x)] = k Teorema 4.7 (Lin & Costelo, pág. 94): Seja C: (n, k) um código cíclico q-ário com polinômio gerador g(x), em GF(q). O código dual de C é também cíclico e é gerado pelo polinômio ( ), hk ( x) = x h x k −1 b0 b1 b2 bn-k-2 bn-k-1 x n− k m( x ) onde hk (x) é o polinômio recíproco do polinômio de verificação de paridade do código C. 6 Codificador do Código Cíclico (7, 4) Circuito de Cálculo das Síndromes r(x) s0 Cálculo de Síndromes Código (7, 4) s1 sn-k-1 Capacidade de Detecção de Erros • Um código cíclico (n, k) é capaz de detectar qualquer surto de erros de comprimento n − k ou menor, incluindo surtos do tipo end-around. • A fração de surtos não detectáveis de comprimento n − k +1 é 2 − (n − k − 1) • Para l > n − k +1, a fração de surtos não detectáveis de comprimento l é 2 − (n − k) 7 Decodificação de Códigos Cíclicos Decodificação de Códigos Cíclicos • Passo 1: Calcular a síndrome de r(x) e armazenar r(x) no registrador • Passo 2: Determinar padrão de erro. A saída do detector é 1 se e somente se a síndrome no registrador corresponde a um padrão de erro corrigível contendo um erro na posição xn − 1 • Passo 3: O buffer e o registrador de síndrome são deslocados uma posição à direita. A saída do detector faz a correção do primeiro símbolo (se en − 1 = 1) e também é realimentada no registrador de síndrome. Nova síndrome corresponde à r(x) deslocado • Passo 4: Detectar se xn − 2 (agora na última posição) é um símbolo errado. Repetir passos 2 e 3. O segundo símbolo é corrigido da mesma forma que o anterior. • Passo 5: Decodificar o vetor recebido símbolo a símbolo da forma descrita anteriormente Decodificador de Meggitt para o Código Cíclico (7, 4) Processo de Correção de Erros 8 BCH bound Códigos Cíclicos Binários vistos a partir de GF(2m) • Teorema: Seja g(x) o polinômio gerador de um código cíclico binário de comprimento n = 2m − 1 com zeros β1,..., βr em GF(2m). O polinômio c(x) sobre GF(2) é um polinômio código se e somente se c(β1) = c(β2) = ··· = c(βr) = 0 onde c(βi) é avaliado em GF(2m) Se um código cíclico linear é construído de forma que: • Cada palavra-código tem n bits; • β é um elemento de ordem n em GF(2m); • O polinômio gerador do código, g(x), inclui, entre suas raízes, (δ - 1) potências consecutivas de β. Então, • É garantido que o código tem distância mínima igual a δ ou maior. Construção de Códigos BCH • Para cada raiz β incluída em g(x), existe um polinômio minimal f(r)(x) que tem βr como raiz [i.e., f(r)(βr) = 0] e com coeficientes em GF(2). r • O polinômio gerador, com coeficientes binários, que contém todas as raízes necessárias pode ser obtido como sendo o mínimo comum múltiplo (LCM) de todos os polinômios minimais correspondentes às raízes utilizadas: Tipos de Códigos BCH • Se β é um elemento primitivo de GF(2m), o código BCH resultante é chamado de código BCH primitivo e as suas palavras-código têm comprimento 2m – 1 bits. • Se β não é um elemento primitivo de GF(2m), o código BCH resultante é chamado de código BCH não primitivo e as suas palavras-código têm comprimento igual à ordem de β. • Se b = 0, a primeira das (δ - 1) potências de β será β1 = β, ⇒ código BCH no sentido estrito. • Se b ≠ 0, ⇒ código BCH no sentido amplo. g(x) = LCM{f(b+1)(x), f(b+2)(x), ..., f(b+δ-1)(x)} 9 Códigos BCH Binários Primitivos Elementos de GF(24) Para qualquer m ≥ 3 e t ≤ 2m − 1, existe um código BCH com os seguinte parâmetros: n = 2m − 1 , n − k ≤ mt, dmin ≥ 2t + 1 O polinômio gerador do código, g(x), é o polinômio de menor grau sobre GF(2) contendo α , α 2 , α 3 ,L , α 2t como raízes, onde α é um elemento primitivo de GF(2m) Decodificação de Códigos BCH 1. Computar as síndromes S = (S1, S2, ..., S2t) a partir de r(x) 2. Determinar σ(x) a partir de S1, S2, ..., S2t 3. Determinar as localizações dos erros, β1, β2, ..., βυ encontrando as raízes de σ(x) e corrigir os erros em r(x) Códigos BCH Primitivos sobre GF(q) Seja α um elemento primitivo em GF(qm ). O polinômio gerador, g(x), de um código BCH qário primitivo corretor de t erros é o polinômio de menor grau sobre GF(q) contendo α , α 2 , α 3 ,L , α 2t como raízes. Seja φi(x) o polinômio minimal de αi, 1 ≤ i ≤ 2t. Então, g(x) = LCM{φ1(x), φ2(x), ..., φ2t(x)} 10 Códigos de Reed-Solomon Um código de Reed-Solomon (ou código RS) é um código BCH primitivo (não binário) de comprimento n = q – 1 sobre GF(q). O polinômio gerador desse código tem a forma ( )( ) ( Desempenho de Códigos RS sobre GF(26) com n = 31, considerando modulação 32-FSK ) g (x ) = x − α x − α 2 L x − α 2t = g 0 + g1 x + g 2 x 2 + L + g 2t −1 x 2t −1 + x 2t onde α é um elemento primitivo de GF(q), d é a distância mínima do código e gi ∈ GF(q) Desempenho de Códigos RS sobre GF(26) com n = 31, considerando modulação 32-FSK Desempenho de Códigos RS com R = 7/8 11 Desempenho de Códigos RS com n = 64 Decodificador de Códigos BCH q-ários Desempenho de Códigos RS com n = 31 e Modulação BPSK Desempenho de Códigos de Reed-Solomon 12