You are on page 1of 21

Capı́tulo 9

Códigos cı́clicos

9.1. Códigos cı́clicos


Los códigos cı́clicos son los códigos lineales de mayor interés. En general,
se pueden implementar de un modo más fácil, de ahı́ su importancia desde el
punto de vista práctico. No obstante, también tienen un gran interés teórico.
Si el alfabeto A es un cuerpo, sabemos que An es un espacio vectorial
de dimensión n. Un subespacio S de An se dirá que es cı́clico si tiene la
propiedad siguiente

(a0 , a1 , ...., an−1 ) ∈ S ⇒ (an−1 , a0 , a1 , ..., an−2 ) ∈ S.


Es decir, toda permutación cı́clica de una cadena que pertenece a S también
pertenece a S.

Definición 9.1.1. Un código cı́clico sobre el alfabeto A es cualquier subes-


pacio cı́clico de An .

Ejemplos 9.1.2. 1) Si A es el alfabeto binario y n = 7, el código lineal

C = {(0000000), (1011100), (0101110), (0010111), (1110010), (0111001),

141
142 CAPÍTULO 9. CÓDIGOS CÍCLICOS

(1001011), (1100101)}
es cı́clico.
2) C = {000, 210, 021, 102, 201, 120, 012, 222, 111} es un código cı́clico so-
bre el alfabeto A = Z3 = {0, 1, 2}. Su dimensión es 2, pues está generado por
las cadenas independientes 111 y 210.
En relación con los códigos cı́clicos se plantean las siguientes cuestiones:
a) ¿Cómo se determinan los subespacios cı́clicos de An ?
b) Para un valor de k < n dado, ¿existe algún subespacio cı́clico de An
que tenga por dimensión k?
c) ¿Cuántos subespacios cı́clicos contiene An ?
d) ¿Qué tiene que ocurrir para que un vector junto con sus permutaciones
cı́clicas generen un subespacio cı́clico?

Ejemplo 9.1.3. Si A es el alfabeto binario y n = 6, consideremos el subes-


pacio S generado por los vectores

v1 = (111000), v2 = (011100), v3 = (001110), v4 = (000111).


La base está formada por el vector v1 junto con tres de sus permutaciones
cı́clicas. Sin embargo, el vector v = (101010) = v1 + v2 + v3 pertenece a
S y sólo tiene una permutación cı́clica (010101) con la que determina un
subespacio de dimensión 2.
Terminamos esta sección indicando, sin demostración, que todo código
binario de Hamming es equivalente a uno cı́clico. Si el alfabeto A tiene q
elementos, un código de Hamming de redundancia r sobre dicho alfabeto es
equivalente a un código cı́clico si y sólo si mcd(r, q − 1) = 1

9.2. Subespacios cı́clicos y polinomios


A cada cadena v = (v0 , v1 , .., vn−1 ) de An le asociamos el polinomio v(x) =
v0 +v1 x+· · ·+vn−1 xn−1 . Si realizamos el producto xv(x) resulta el polinomio
9.2. SUBESPACIOS CÍCLICOS Y POLINOMIOS 143

v0 x+v1 x2 +· · ·+vn−2 xn−1 +vn−1 xn . Si en lugar de considerar el anillo A[x] de


todos los polinomios en la indeterminada x, consideramos las clases de restos
módulo f (x) = xn − 1, la clase del polinomio producto xv(x) es la de v0 x +
v1 x2 +· · ·+vn−2 xn−1 +vn−1 , ya que xn ≡ 1 (módulo xn −1). Nótese que la clase
del producto xv(x) tiene un representante que es importante en esta historia:
es el polinomio que le corresponderı́a a la cadena (vn−1 , v0 , v1 , ..., vn−2 ), que
es una permutación cı́clica de v. Esta es la razón de realizar la asociación
siguiente: dada una cadena v = (v0 , v1 , ..., vn−1 ) de An , le asociamos la clase
formada por todos los polinomios que son congruentes, módulo xn − 1, con
v(x) = v0 + v1 x + · · · + vn−1 xn−1 . Es decir, consideramos la aplicación I
definida por

v = (v0 , v1 , .., vn−1 ) ∈ An → [v(x)] ∈ A[x]/(xn − 1).


A[x]/(xn − 1) es el anillo cociente formado por las clases de resto módulo
xn − 1. Hay tantas clases como polinomios de grado menor o igual que n − 1.
Si un polinomio P (x) tiene grado menor que n, él mismo puede tomarse como
representante de su clase. Si su grado es mayor o igual que n, se dividirá por
xn − 1 y el resto de la división
P (x) = (xn − 1)C(x) + R(x)
(que tiene grado menor que n) es un polinomio congruente con P (x) que
puede tomarse como representante de la clase. De esta forma, siempre pode-
mos tomar como representante de una clase un polinomio de grado menor que
n. Por ello, podemos operar con las clases como lo harı́amos con polinomios
de grado menor que n y sólo cuando, al realizar alguna de las operaciones
(suma o producto), obtengamos como resultado un polinomio de grado mayor
o igual que n, dividiremos por xn − 1 para obtener el representante de grado
menor que n de la clase.
Hay, por tanto, una correspondencia biunı́voca entre An y A[x]/(xn −
1). Vamos a aprovechar este hecho para descubrir cómo son los subespacios
cı́clicos de An . Veremos que S es un subespacio cı́clico de An si y sólo si I(S)
es un ideal del anillo cociente.
144 CAPÍTULO 9. CÓDIGOS CÍCLICOS

Recordemos que un subconjunto no vacı́o I de un anillo A se dice que es


un ideal si tiene las propiedades siguientes:
(I1) I es un grupo abeliano para la suma
(I2) Cualesquiera que sean a ∈ A e y ∈ I, se verifica que a · y ∈ A.
Una forma simple de determinar un ideal en cualquier anillo es la si-
guiente: se escoge b ∈ A, b 6= 0 y se define I = {a · b : a ∈ A}. Es inmediato
comprobar que I es un ideal, que recibe el nombre de ideal generado por b. En
general, no es cierto que todo ideal de un anillo cualquiera se pueda obtener
de este modo. Precisamente, cuando un anillo tiene la propiedad de que todos
sus ideales son de esta forma, el anillo se denomina anillo principal.

Teorema 9.2.1. Un subconjunto no vacı́o S de An es un subespacio cı́clico


si y sólo si I(S) es un ideal en A[x]/(xn − 1).

DEMOSTRACIÓN: Supongamos que S es un subespacio cı́clico de An . I(S)


es el conjunto formado por las clases [v(x)], recorriendo v el conjunto S. Es
decir, I(S) = {[v(x)] : v ∈ S}. Si v ∈ S, el producto [x][v(x)] es la clase
[xv(x)] y, según hemos visto antes, se trata de la clase que corresponde al
polinomio vn−1 + v0 x + v1 x2 + · · · + vn−2 xn−1 , que pertenece a I(S) pues
(vn−1 , v0 , v1 , ..., vn−2 ) ∈ S, ya que éste es cı́clico. Este razonamiento puede
repetirse para probar que [xk ][v(x)] ∈ I(S), para cada k ∈ N. Vemos que al
multiplicar un elemento de I(S) por las clases [xk ] el resultado permanece
en I(S). Para terminar, debemos hacer el producto por una clase arbitraria
p
X
[ ak xk ] y comprobar que el resultado permanece en I(S). Esto se sigue
0
fácilmente de la igualdad
p p
X X
[ ak xk ][v(x)] = ak [xk ][v(x)].
0 0

De un modo similar se prueba que, si I(S) es un ideal, entonces S es un


subespacio cı́clico. ¤
9.2. SUBESPACIOS CÍCLICOS Y POLINOMIOS 145

La importancia del resultado anterior radica en el hecho de que se sabe que


el anillo cociente es principal y, por tanto, todos sus ideales están generados
por una clase. Es decir, todos los ideales de A[x]/(xn − 1) son de la forma
I = {[a(x) · g(x)] : a(x) ∈ A[x]}. El polinomio g(x) recibe el nombre de
polinomio generador del ideal. Se sabe que g(x) es el polinomio mónico de
menor grado que puede haber en las clases que pertenecen a I. El Teorema
siguiente muestra que el polinomio (mónico) generador de un ideal debe ser
divisor de xn − 1.

Teorema 9.2.2. Si I es el ideal de A[x]/(xn − 1) generado por el polinomio


mónico g(x), entonces g(x) divide a xn − 1.

DEMOSTRACIÓN: El grado de g(x) es menor que n (recuérdese que en


cada clase hay un polinomio de grado menor o igual que n − 1 y g(x) es el
polinomio de menor grado que podemos encontrar en alguna clase del ideal).
Entonces podemos hacer la división entera de xn − 1 por g(x):

xn − 1 = g(x) · C(x) + R(x),

con R(x) idénticamente nulo o con grado menor que n. Tomando clases en
la igualdad anterior, resulta

0 = [g(x)] · [C(x)] + [R(x)].


Es decir, se tiene [R(x)] = [−C(x)] · [g(x)]. Como I es un ideal, se sigue que
[R(x)] ∈ I, lo que es imposible salvo que sea R(x) ≡ 0, ya que habrı́a en el
ideal una clase con un representante cuyo grado es menor que el de g(x). ¤

Omitimos la prueba, pero de igual forma se demuestra que todo divisor


mónico de xn − 1 es el polinomio generador de un ideal de A[x]/(xn − 1).
Terminamos esta sección probando que la dimensión del ideal I (considerando
su estructura de espacio vectorial) generado por un divisor (mónico) g(x) de
xn − 1 es igual a k, si n − k es el grado de g(x).
146 CAPÍTULO 9. CÓDIGOS CÍCLICOS

Sea I = {[a(x) · g(x)] : a(x) ∈ A[x]}, vamos a comprobar que B =


{[g(x)], [xg(x)], ..., [xk−1 g(x)]} es una base de I, considerado como espacio
vectorial sobre el cuerpo A.
k−1
X
a) Independencia lineal. Supongamos que [ λi xi g(x)] = 0 y probemos
i=0
que λi = 0, para cada i = 0, 1, .., k − 1. Veamos cómo se prueba que λk−1 =
0. La clase nula sólo contiene los múltiplos de xn − 1, por tanto, el único
polinomio con grado menor que n que contiene dicha clase es el polinomio
Xk−1
nulo. Como el grado de la suma λi xi g(x) es menor o igual que k − 1 + n −
i=0
k−1
X
k = n−1, se sigue que debe ser idénticamente nulo el polinomio λi xi g(x).
i=0
En particular, es nulo el coeficiente lı́der que es igual a λk−1 . Razonando de
esta forma se puede ir probando que son nulos uno a uno los λi .
b) Sistema generador. Consideremos, en primer lugar, una clase con re-
presentante de la forma a(x) · g(x), siendo a(x) un polinomio de grado menor
k−1
X
que k. Entonces a(x) = ai xi , luego
i=0

k−1
X k−1
X
i
[a(x) · g(x)] = [ ai x g(x)] = ai [xi g(x)].
i=0 i=0

Por tanto, en este caso, queda probado que B es un sistema generador. Con-
sideremos ahora una clase [a(x) · g(x)] con a(x) un polinomio de grado mayor
o igual que k. Ahora el grado de a(x) · g(x) es mayor o igual que k + n − k = n
y, por tanto, podemos hacer la división entera de a(x) · g(x) entre xn − 1:

a(x) · g(x) = (xn − 1) · C(x) + R(x),

siendo el grado de R(x) menor que n o R(x) idénticamente nulo. Como g(x)
es divisor de xn − 1, se sigue de la igualdad anterior que g(x) divide al resto
R(x). Esto prueba que la clase [R(x)] es la misma que la dada [a(x)·g(x)], pero
R(x) tiene la ventaja de que puede expresarse en la forma R(x) = b(x) · g(x)
9.3. SUBESPACIOS CÍCLICOS DE AN 147

con el grado de b(x) menor que k y puede aplicarse el caso anterior para
probar que [a(x) · g(x)] = [R(x)] es combinación lineal de los elementos de
B.

9.3. Subespacios cı́clicos de An


Si S es un subespacio cı́clico de An , hemos probado que I(S), es decir,
el propio S mirado como un subconjunto de A[x]/(xn − 1), es un ideal. Por
tanto, I(S) está generado por un polinomio mónico g(x) que es divisor de
xn − 1. Si el grado de g(x) es n − k, entonces k es la dimensión de I(S) como
subespacio vectorial del anillo cociente y, por tanto, también es la dimensión
de S (I es un isomorfismo). Hemos visto que una base de I(S) está dada
por las clases [g(x)], [xg(x)], ..., [xk−1 g(x)]. Para obtener una base de S, basta
escribir los coeficientes de los polinomios xi g(x) (i = 0, .., k − 1) en orden
creciente de las potencias de x. Como estos polinomios tienen grado menor o
igual que i + (n − k) ≤ k − 1 + n − k = n − 1, no hay que hacer la reducción
P
módulo xn − 1. Entonces, si g(x) = xn−k + 0n−k−1 ci xi , una base de S está
dada por

c0 c1 c2 ..... cn−k−1 1 0 0.... 0 0


0 c0 c1 ......, cn−k−2 cn−k−1 1 0 .... 0
0 0 c0 c1 ....... cn−k−1 1 0 ... 0
.... .... ..... .... .... .... .... ... ... ...
0 0 ... 0 c0 c1 c2 ..... cn−k−1 1
Nótese que se trata del vector (c0 , c1 , ...., cn−k−1 , 1, 0, 0, ..., 0) y k − 1 de sus
permutaciones cı́clicas .

9.4. Codificación con un código cı́clico


Suponemos en toda la sección que C es un (n, k)-código cı́clico sobre
el alfabeto A. Como su dimensión es k, el polinomio generador g(x) tiene
148 CAPÍTULO 9. CÓDIGOS CÍCLICOS

grado n − k. Vamos a ver cómo se codifica ”polinómicamente” con un código


cı́clico. Según acabamos de ver, una matriz generadora es la formada por
los polinomios g(x), xg(x), x2 g(x), ..., xk−1 g(x). Los mensajes a codificar los
denotaremos por a(x) y no son otra cosa que los polinomios de grado menor o
igual que k − 1. El mensaje codificado de a(x) es a(x)g(x), es decir, la cadena
formada por los coeficientes del polinomio producto a(x) · g(x), dispuestos en
orden creciente de las potencias de x. Como el grado de a(x) · g(x) es menor
o igual que k − 1 + n − k = n − 1, no hay que hacer la reducción módulo
Xk−1 k−1
X
i
n
x − 1. Nótese que, si a(x) = ai x , entonces a(x)g(x) = ai xi · g(x) es
0 0
una combinación lineal de los polinomios básicos y, por tanto, a(x) · g(x) es
una palabra-código (la codificación del mensaje a(x)).
Ahora vamos a ver una forma de obtener una matriz generadora de la
forma G = [R Ik ], donde Ik denota la matriz unidad de orden k. Hacemos la
división entera de xn−k+i por g(x), para i = 0, 1, ..., k − 1:

xn−k+i = g(x) · C(x) + Ri (x),

donde Ri (x) es idénticamente nulo o tiene grado menor que n − k. Tenemos


entonces
xn−k+i − Ri (x) = g(x) · C(x) ∈ C.
Si consideramos la matriz G cuyas filas son los coeficientes en orden cre-
ciente de los polinomios xn−k+i − Ri (x), esta matriz tiene la forma indicada
(la matriz R tiene por filas los coeficientes de −Ri (x)). Con esta matriz
generadora, al codificar un mensaje m = (a0 , a1 , ..., ak−1 ), resulta la palabra-
código c = (s0 , s1 , ..., sn−k−1 , a0 , a1 , ..., ak−1 ). Vemos que los dı́gitos del men-
saje original aparecen tal cual al final del mensaje codificado. Los dı́gitos
iniciales s0 , .., sn−k−1 son los dı́gitos de control que en forma polinómica se
k−1
X
corresponden con la suma − ai Ri (x).
0

Ejemplo 9.4.1. Consideremos el código binario cı́clico C(7, 4) generado por


g(x) = 1 + x + x3 .
9.5. DECODIFICACIÓN DE UN CÓDIGO CÍCLICO 149

Si queremos codificar el mensaje m = (1001), consideramos el polinomio


m(x) = 1 + x3 y hacemos el producto m(x)g(x) = 1 + x + x4 + x6 . El mensaje
codificado es c = (1100101).

9.5. Decodificación de un código cı́clico


Iniciamos esta sección probando que los errores a ráfagas de longitud
t ≤ n − k son detectados. Nótese que, realizando un número adecuado de
permutaciones cı́clicas, toda ráfaga cı́clica de longitud t se convierte en una
cadena que tiene n − t ceros al principio. De esta idea se sigue fácilmente que
toda ráfaga cı́clica de longitud t se puede expresar en la forma xi p(x), con
p(x) un polinomio de grado menor que t.

Ejemplo 9.5.1. Consideremos la cadena y = 0100000100. Se trata de una


ráfaga cı́clica de longitud 5. Con 8 permutaciones cı́clicas sucesivas se con-
vierte en la cadena 0000010001, que puede expresarse en la forma polinómica
siguiente x5 (1+ x4 ). Aplicando a esta otras dos permutaciones cı́clicas la con-
vertimos en la original. Por tanto, nuestra cadena inicial se puede expresar
como y(x) = x7 (1 + x4 ).

Teorema 9.5.2. Sea C un código cı́clico generado por el polinomio g(x) de


grado n − k, siendo n la longitud. C no puede contener una ráfaga cı́clica de
longitud t ≤ n − k y, por tanto, detecta cualquier error que sea una ráfaga
cı́clica de longitud menor o igual que n − k.

DEMOSTRACIÓN: Según acabamos de ver, una ráfaga cı́clica de longitud


t puede expresarse en forma polinómica como xi p(x), siendo p(x) un poli-
nomio de grado menor que t. Desde luego p(x) no puede pertenecer al código
por tener menos grado que el polinomio generador. Entonces tampoco puede
pertenecer xi p(x), ya que realizando n − i permutaciones cı́clicas obtenemos
p(x), que no pertenece. Para terminar, vamos a probar que se detectan todos
150 CAPÍTULO 9. CÓDIGOS CÍCLICOS

los errores que sean ráfagas cı́clicas de longitud menor o igual que n − k. Si
se emite una palabra-código c y se produce uno de tales errores e, entonces
recibimos y = c+e. y no puede pertenecer al código, ya que entonces también
pertenecerı́a e = y − c. ¤

Consideremos un código cı́clico C(n, k) sobre el alfabeto A y con poli-


nomio generador g(x) de grado n − k. Sabemos encontrar una matriz gene-
radora de la forma G = [−R Ik ], donde R es una matriz cuyas filas son los
coeficientes de los restos Ri (x) obtenidos al hacer la división entera de xn−k+i
por g(x). A partir de esta matriz, podemos determinar una matriz de control
para el código de la forma H = [In−k Rt ] (recuérdese que HGt = 0). Para
cada cadena y ∈ An , el sı́ndrome de y viene dado por s = Hy t . Se trata
de una columna de n − k componentes. El teorema siguiente nos da una
interpretación polinomial del sı́ndrome.

Teorema 9.5.3. Si y(x) y s(x) son las representaciones polinómicas de y y


s, respectivamente, entonces s(x) es el resto de dividir y(x) por g(x).

DEMOSTRACIÓN: Sea y(x) = a0 + a1 x + a2 x2 + · · · + an−1 xn−1 . Nótese que


la representación polinómica de la columna i de H,para i ≤ n − k − 1, es el
polinomio xi , mientras que se trata del polinomio Ri−n+k (x) para i ≥ n − k.
Entonces, se tiene

n−1
X n−k−1
X n−1
X
t i
s(x) = H · y = ai ci = ai x + ai Ri−n+k (x) = (9.1)
i=0 i=0 i=n−k

n−k−1
X
= ai xi − an−k (xn−k + C0 (x)g(x)) + · · · − an−1 (xn−1 + Ck−1 (x)g(x)) =
i=0

= y(x) − (an−k C0 (x) + · · · + an−1 Ck−1 (x))g(x).


Hemos obtenido la identidad

s(x) = y(x) − g(x)(an−k C0 (x) + · · · + an−1 Ck−1 (x))g(x),


9.5. DECODIFICACIÓN DE UN CÓDIGO CÍCLICO 151

de donde se sigue

y(x) = g(x)(−an−k C0 (x) − · · · − an−1 Ck−1 (x))g(x) + s(x),


Ahora basta notar que el grado de s(x) es menor o igual que n − k − 1 para
convencernos que la igualdad anterior es la división entera de y(x) entre g(x).
En efecto, en la igualdad (9.1) todos los polinomios Ri (x) tienen grado menor
o igual que n − k − 1 por ser los restos de divisiones por g(x). ¤

Nuestro objetivo ahora consiste en determinar los sı́ndromes de las per-


mutaciones cı́clicas de y. Concretamente, vamos a probar que el sı́ndrome de
xy(x), que denotaremos por s1 (x), está relacionado con s(x) por la fórmula
(
xs(x) si grad(s(x)) < n − k − 1
s1 (x) = (9.2)
xs(x) − sn−k−1 g(x) si grad(s(x)) = n − k − 1.

Para probar esta relación, partimos de la división entera de y(x) por g(x):

y(x) = g(x)C(x) + s(x). (9.3)

Sabemos, por el Teorema anterior, que s(x) es el sı́ndrome de y(x). Si mul-


tiplicamos la igualdad anterior por x, resulta

xy(x) = g(x)C(x)x + xs(x). (9.4)

Si xs(x) tiene grado menor o igual que n − k − 1, entonces el teorema prece-


dente nos garantiza que xs(x) es el sı́ndrome de xy(x), por ser el resto de la
división de xy(x) por g(x). Pero el grado de xs(x) puede ser igual a n − k − 1.
Si este es el caso, procederemos como sigue. Expresamos s(x) en la forma
n−k−2
X
s(x) = ŝ(x) + sn−k−1 xn−k−1 , donde ŝ(x) = si xi y g(x) = ĝ(x) + xn−k ,
i=0
n−k−1
X
donde ĝ(x) = gi xi . Calculamos xs(x):
i=0

xs(x) = xŝ(x) + sn−k−1 xn−k .


152 CAPÍTULO 9. CÓDIGOS CÍCLICOS

Como xn−k = g(x) − ĝ(x), sustituyendo en la igualdad anterior, obtenemos

xs(x) = xŝ(x) + sn−k−1 (g(x) − ĝ(x)) = sn−k−1 g(x) + (xŝ(x) − sn−k−1 ĝ(x)).

Sustituyendo la expresión obtenida de xs(x) en (9.4), resulta

xy(x) = g(x)C(x)x + sn−k−1 g(x) + xŝ(x) − sn−k−1 ĝ(x) =


³ ´
= g(x) xC(x) + sn−k−1 + s1 (x),
donde s1 (x) = xŝ(x) − sn−k−1 ĝ(x). Como el grado de s1 (x) es menor o igual
que n − k − 1, se sigue que la igualdad
³ ´
xy(x) = g(x) xC(x) + sn−k−1 + s1 (x)

es la división entera de xy(x) por g(x). Esto permite afirmar, en virtud del
teorema precedente, que s1 (x) es el sı́ndrome de xy(x), con lo que queda
probada la relación (??)

9.6. Decodificación cı́clica


En principio, el proceso de decodificación con un código cı́clico sigue el
esquema sı́ndrome-lı́der válido para cualquier código lineal. Hemos visto que
su mayor inconveniente radica en el enorme tamaño de la tabla necesaria
para desarrollar el método. No obstante, en el caso de los códigos cı́clicos
hay la posibilidad de reducir de forma importante el tamaño de la tabla. El
método que vamos a desarrollar a continuación se denomina decodificación
cı́clica.
Se construye una tabla reducida de sı́ndromes y lı́deres que contenga
únicamente a los lı́deres cuya coordenada última es no nula. Por ello, cuando
se calcula el sı́ndrome de una cadena recibida cuya última componente es
correcta, éste no aparece en la tabla reducida pues, en caso contrario, al co-
rregir la cadena con el lı́der correspondiente alteramos la última componente
y hemos supuesto que era correcta. Una vez elaborada la tabla reducida, se
procede como sigue.
9.6. DECODIFICACIÓN CÍCLICA 153

Recibida una cadena y = c + e = y0 , y1 , y2 , .., yn−1 (con un número de


errores t menor o igual que la capacidad correctora del código), supongamos
que la componente errónea que está situada más a la derecha es yk . Aplicando
n − k − 1 permutaciones cı́clicas a la cadena y, ésta se convierte en otra, que
denotamos por π h (y) = π h (c) + π h (e), con la última componente errónea. El
sı́ndrome s(π h ((y)) sı́ aparecerá en la tabla reducida, lo que permite corrigir
π h (y) con el lı́der correspondiente, obteniendo una palabra-código d. Como
el código es cı́clico, π h (c) es una palabra-código. Por otra parte, es obvio que
ω(e) = ω(π h (e)) ≤ t. Como d(π h (c), π h (y)) = ω(π h (e)) ≤ t, se sigue que
también d(d, π h (y)) ≤ t. Por tanto, se tiene
³d − 1´
d(d, π h (c)) ≤ d(d, π h (y)) + d(π h (y), π h (c)) ≤ 2t ≤ 2 = d − 1 < d,
2
lo que es imposible, salvo que d = π h (c).
Vemos, pues, que hemos sido capaces de determinar correctamente π h (c),
es decir, conocemos una permutación cı́clica de la palabra-código buscada.
Para determinar c, basta aplicar k + 1 permutaciones cı́clicas sucesivas a
π h (c). El razonamiento anterior tiene el inconveniente de que no conocemos
la posición que ocupa el error que está situado más a la derecha, pero este
inconveniente puede subsanarse en la práctica procediendo como se indica a
continuación.
1) Se van calculando los sı́ndromes de las permutaciones cı́clicas de la
palabra recibida y = c + e hasta encontrar el primero que aparece en la tabla
reducida: s(π h (y)).
2) Corregimos π h (y) con el lı́der correspondiente de la tabla y obtenemos
π h (c).
3) Se hacen n − h permutaciones cı́clicas a π h (c) y encontramos c.
Si se quiere realizar estas operaciones de un modo automático, deberemos
introducir un contador que recoja el número de permutaciones cı́clicas que
aplicamos a y, hasta que encontramos el primer sı́ndrome que pertenece a la
tabla reducida.
154 CAPÍTULO 9. CÓDIGOS CÍCLICOS

Ejemplo 9.6.1. Consideremos el código de Hamming H3 cuya matriz de


control tiene la forma
 
1 0 0 1 0 1 1
 
H= 0 1 0 1 1 1 0 
0 0 1 0 1 1 1
En este caso n = 7 y n − k = 3, por tanto, k = 4 es la dimensión del
código. El número de palabras-código es M = 2k = 16 y el número de cadenas
posibles es 27 = 128. Entonces el número de clases adjuntas es 128/16 = 8.
La tabla completa de sı́ndromes y lı́deres es la siguiente
Sı́ndrome Lı́der
000 0000000
100 1000000
010 0100000
001 0010000
110 0001000
011 0000100
111 0000010
101 0000001
Mientras que la tabla reducida tiene la forma simple siguiente

Sı́ndrome Lı́der
101 0000001

Supongamos que se transmite por el canal la palabra-código c = 1001011


y se recibe y = 1001111. Procedemos a calcular los sı́ndromes de las sucesivas
permutaciones cı́clicas de y hasta que se obtenga uno que pertenece a la tabla
reducida

π h (y) Sı́ndrome
1001111 011
1100111 111
1110011 101
9.7. EL MÉTODO DE CAPTURA DEL ERROR 155

Vemos que el sı́ndrome de π 2 (y) está en la tabla reducida y podemos corregirla


con el correspondiente lı́der 0000001, resultando π 2 (c) = π 2 (c) + 0000001 =
1110010. Haciendo 5 permutaciones cı́clicas sucesivas de esta cadena, obte-
nemos c = 1001011.

9.7. El método de captura del error

Definición 9.7.1. Diremos que una cadena c = c1 c2 · · · cn contiene una serie


cı́clica de k ceros si en la cadena existen k ceros consecutivos (en sentido
amplio, es decir, los ceros pueden estar al final de la cadena y enlazar con
ceros del principio).

Ejemplos 9.7.2. 1. c = 01000101 es una cadena con una serie cı́clica de tres
ceros.
2. c = 00110100 es una cadena con una serie cı́clica de 4 ceros.

Nótese que toda ráfaga cı́clica de longitud t contiene una serie cı́clica de
n − t ceros.

Lema 9.7.3. Sea C un código lineal con distancia mı́nima d. En una clase
adjunta no puede haber dos cadenas con peso menor o igual que [ d−1
2
].

DEMOSTRACIÓN: Sean x e y dos cadenas diferentes tales que ω(x), ω(y) ≤


t = [ d−1
2
]. Si pertenecen a la misma clase adjunta, entonces x − y ∈ C. Por
otra parte, se tiene

d−1
ω(x − y) ≤ ω(x) + ω(y) ≤ 2t ≤ 2( ) = d − 1,
2
lo que es imposible por ser el peso mı́nimo del código d. ¤
156 CAPÍTULO 9. CÓDIGOS CÍCLICOS

Consideremos un código lineal C(n, k) con distancia mı́nima d = 2t + 1


y con una matriz de control de la forma H = [In−k A]. Si se transmite por
el canal una palabra-código c y se produce un error e, se recibe una cadena
y = c+e. Supongamos que el error tiene peso menor o igual que t y calculemos
su sı́ndrome
s = Hy t = H(c + e)t = Het .

Si ê = (st , 0), entonces se tiene


à !
s
H êt = [In−k A] = In−k s + A · 0 = s.
0

Vemos que los sı́ndromes de e y ê coinciden. Si suponemos que ω(s) ≤ t,


entonces ω(ê) ≤ t. Como e y ê pertenecen a la misma clase adjunta (por
tener el mismo sı́ndrome) y ambos tienen peso menor o igual que t, se sigue
del Lema anterior que deben ser iguales: e = ê. Seguidamente, vamos a tratar
de sacarle partido a este hecho en relación con los códigos cı́clicos.
Sea e un error que posee una serie cı́clica de k ceros y con peso ω(e) ≤ t.
Haciendo un número i conveniente de permutaciones cı́clicas a e, lo conver-
timos en una cadena con k ceros en los últimos lugares. xe(x) es, en forma
polinómica el resultado de aplicar a e(x) las i permutaciones cı́clicas. La for-
ma matricial de xe(x) será (b, O), donde O es una matriz columna de k ceros.
Si denotamos por si el sı́ndrome de xi e(x), veamos que su peso es menor o
igual que t:
à !
b
si = [In−k A] = In−k b = b.
0
Por tanto, el número de componentes no nulas de si (x) es igual al número de
elementos no nulos que hay en b, que es el peso de xi e(x) = ω(e) ≤ t. Ahora
podemos aplicar a la cadena xi e(x) (que tiene un sı́ndrome si co peso menor
o igual que t) el resultado precedente para deducir que

xi e(x) = (sti , 0).


9.7. EL MÉTODO DE CAPTURA DEL ERROR 157

De esta forma, hemos encontrado una expresión para xi e(x) que nos va a
permitir encontrar el propio e. Como xn es congruente con 1 módulo xn − 1,
se tiene

e(x) = xn e(x) = xn−i (xi e(x)) = xn−i (sti , 0).


Es decir, si i es el número de permutaciones cı́clicas que permite convertir e
en una cadena con k ceros al final, entonces se obtiene e(x) haciendo n − i
permutaciones cı́clicas a (sti , 0).
Veamos cómo se procede en la práctica. Consideremos un código cı́cli-
co C(n, k) con polinomio generador g(x) de grado n − k y distancia mı́ni-
ma d = 2t + 1. Si se transmite la palabra-código c y se recibe y = c + e,
el error cometido es e. Si ω(e) ≤ t = [ d−1 2
], entonces sabemos que el e-
rror puede corregirse. Pero ahora vamos a decodificar por el procedimiento
anterior. Para ello, hay que estar seguros de que el error poese una serie
cı́clica de k ceros (esto no es un grave condicionamiento ya que e es una
cadena con muchos ceros). Con esto asegurado, procedemos a calcular los
sı́ndromes s0 (x), s1 (x), ..., de y(x), xy(x), x2 y(x), .... (los si (x) se determinan
mediante la relación de recurrencia que hemos estudiado con anterioridad).
Cuando encontremos el primer si (x) con peso menor o igual que t, ponemos
e(x) = xn−i (sti , 0) y se decodifica poniendo c(x) = y(x) − e(x). La idea básica
es la siguiente: como sabemos que e(x) tiene una serie cı́clica de k ceros,
debe haber un valor de i tal que al aplicar i permutaciones cı́clicas a e(x) lo
convierte en una cadena con k ceros al final y, según hemos visto, el sı́ndrome
si (x) debe tener peso menor o igual que t, lo que nos permitı́a encontrar el
valor de e(x). Nosotros no conocemos el error e y, por tanto, tampoco sabe-
mos el valor de i. Por ello, vamos calculando los sucesivos sı́ndromes hasta
hallar el primero cuyo peso es menor o igual que t.

Ejemplo 9.7.4. Consideremos el código binario cı́clico C(7, 4) generado por


el polinomio generador g(x) = 1 + x + x3 . Usar el método captura del error
para decodificar: a) y = 1101001, b) y = 0001111.
158 CAPÍTULO 9. CÓDIGOS CÍCLICOS

Primero buscamos una matriz generadora de la forma G = [A Ik ]. Para


ello, debemos hacer las divisiones enteras de xn−k+i por g(x), para i =
0, 1, .., k − 1. En nuestro caso n − k = 3 y encontramos los resultados sigui-
entes:

x3 = g(x) · 1 + (−x − 1), x4 = g(x) · x + (−x2 − x),

x5 = g(x) · (x2 − 1) + (−x2 + x + 1), x6 = g(x) · (x3 − x − 1) + (x2 + 1).

Recordemos que la matriz G tiene por filas los coeficientes, en orden creciente
de las potencias de x, de los polinomios xn−k+i −Ri (x), siendo Ri (x) los restos
de las divisiones anteriores. Por tanto, la matriz generadora buscada es
 
1 1 0 1 0 0 0
 0 1 1 0 1 0 0 
 
G= 
 1 1 1 0 0 1 0 
1 0 1 0 0 0 1
Ahora debemos encontrar una matriz de control. Sabemos que tiene la forma
H = [In−k At ], luego se trata de la matriz
 
1 0 0 1 0 1 1
 
H= 0 1 0 1 1 1 0 
0 0 1 0 1 1 1
Se trata de la matriz de control de un código de Hamming H(7, 4), luego es
1-corrector y su distancia mı́nima es d = 3. Podemos aplicar el método de
captura del error con t = 1. Si el error tiene peso 1, e es una cadena de 7
ceros y unos con un sólo 1 en un lugar desconocido. Entonces es obvio que
e es una cadena con una serie cı́clica de 6 ceros. Como 6 ≥ k = 4, puede
aplicarse el método para determinar el error e.
a) y = 1101001. Usamos la notación polinómica y(x) = 1 + x + x3 + x6 y
determinamos su sı́ndrome haciendo la división entera por g(x):

y(x) = g(x) · (x3 + x) + (1 + x2 ).


9.8. CÓDIGOS CÍCLICOS CON MATLAB 159

Por tanto, el sı́ndrome es s0 (x) = 1 + x2 , cuyo peso es 2. Tenemos que seguir


calculando los sı́ndromes de xi y(x), que denotamos por si (x), hasta encontrar
el primero que tiene peso menor o igual que 1. Para determinar los sucesivos
sı́ndromes, usamos la relación de recurrencia (??):

(
xs(x) si grad(s(x)) < n − k − 1
s1 (x) =
xs(x) − sn−k−1 g(x) si grad(s(x)) = n − k − 1.

Como el coeficiente lı́der de s0 (x) es 1, s1 (x) = xs(x)−1·g(x) = 1. Vemos que


el peso es uno, luego e(x) = x7−1 s1 (x) = x6 . Es decir, el error viene dado por
e = 00000001 y se decodifica y por c = y −e = 1101001−0000001 = 1101000.
b) y = 0001111. Ahora y(x) = x3 + x4 + x5 + x6 . Hacemos la división por
g(x) para obtener el sı́ndrome s0 (x):

y(x) = g(x) · (x3 + x2 + 1) + (1 + x + x2 ).

Como s0 (x) = 1 + x + x2 tiene peso 3 debemos seguir. La relación de recu-


rrencia nos permite obtener s1 (x) = xs0 (x) − 1g(x) = 1 + x2 . Buscamos el
siguiente sı́ndrome: s2 (x) = xs1 (x) − 1g(x) = 1. Como el peso de s2 (x) es 1,
hemos terminado. El error viene dado por e(x) = x7−2 s2 (x) = x5 . Entonces
se decodifica poniendo c = y − e = 0001111 − 0000010 = 0001101.

9.8. Códigos cı́clicos con MATLAB


La función cyclpoly produce el polinomio generador del código cı́clico.
Concretamente, en pantalla aparece una fila con los coeficientes en orden
creciente de las potencias de x.
>> g=cyclpoly(7,3)
ans 1 0 1 1 1
que son los coeficientes del polinomio generador, g(x), de un código cı́clico
C(7, 3). Es decir, g(x) = 1+x2 +x3 +x4 . Para obtener las matrices generadoras
y de control, se procede como sigue
160 CAPÍTULO 9. CÓDIGOS CÍCLICOS

>>[parmat,genmat]=cyclgen(7,g)
ans
parmat =
 
1 0 0 0 1 1 0
 0 1 0 0 0 1 1 
 
 
 0 0 1 0 1 1 1 
0 0 0 1 1 0 1
genmat =  
1 0 1 1 1 0 0
 
 1 1 1 0 0 1 0 
0 1 1 1 0 0 1
Nótese que la matriz generadora tiene la forma estándar G = [BI3 ]. Para
codificar un mensaje con un código cı́clico, MATLAB dispone de la función
encode:
>> n=7;k=3;
g=cyclpoly(7,3);
[parmat,genmat]=cyclgen(7,g);
msg=[1 0 1];
codmsg=encode(msg,n,k,’cyclic’,g)
ans
codmsg = [1 1 0 0 1 0 1].
Para decodificar un mensaje recibido se usa la función decode:
>> x=decode(codmsg,7,3,’cyclic’,g)

9.9. Ejercicios
1. Comprobar que g(x) = 1 + x2 + x3 + x4 es un divisor de f (x) = x7 − 1 y
determinar el ideal generado por g(x).

2. Determinar el número de subespacios cı́clicos de cada uno de los siguientes


espacios vectoriales: a) A8 , siendo A el alfabeto binario, b) A4 , siendo
A = {0, 1, 2} = Z3 .
9.9. EJERCICIOS 161

3. Determinar el polinomio generador y la dimensión del menor código cı́clico


binario que contiene: a) c = 1010011, b) c = 0011010.

4. El polinomio g(x) = 1 + x3 + x6 genera un código binario cı́clico C(9, 3).


a) Escribe una matriz generadora de la forma G = [R I3 ] para C. b)
Determina una matriz de control H y encuentra los sı́ndromes de dos
formas diferentes.

5. Sea G una matriz generadora de un código lineal C con la propiedad de


que cualquier permutación cı́clica de una fila de G es también una palabra-
código. Probar que C es un código cı́clico.

6. El polinomio g(x) = 1 + x + x2 + x3 + x6 genera un código cı́clico binario


C(15, 9). Codificar los siguientes mensajes polinómicos: a) 1 + x2 + x5 + x8 ,
b) 1 + x + x2 .

7. Consideremos el código del ejercicio anterior. Encontrar una matriz gene-


radora de la forma G = [R Ik ] y codificar los mensajes polinómicos.

8. Un código cı́clico binario C(7, 4) está generado por el polinomio g(x) =


1+ x+x3 . Decodificar cada uno de las cadenas recibidas usando el método
de captura del error”: a) y = 1101011, b) y = 0101111.

9. Sea g(x) el polinomio generador de un código cı́clico binario C. Denotamos


por CP el conjunto formado por las palabras-código de peso par. ¿Es
CP un código cı́clico? Si la respuesta es afirmativa, obtener un polinomio
generador para CP .

10. Elaborar un programa para decodificar un mensaje codificado con un


código cı́clico por el procedimiento de decodificación cı́clica.

You might also like