Otra construcción de códigos array cíclicos, MDS y LDPC J.

Anuncio
XXI Congreso de Ecuaciones Diferenciales y Aplicaciones
XI Congreso de Matemática Aplicada
Ciudad Real, 21-25 septiembre 2009
(pp. 1–8)
Otra construcción de códigos array cíclicos, MDS y LDPC
J.-J. Climent y S. Díaz
Departament de Ciència de la Computació i Intel·ligència Artificial, Universitat d’Alacant,
Ap. correus 99, E-03080 Alacant. E-mails: [email protected], [email protected].
Palabras clave:
código array, código cíclico, código MDS, array de índices, logaritmo de Zech
Resumen
En este artículo presentamos un método para construir el array de índices de un
código array cíclico y LDPC. Esta construcción utiliza el logaritmo de Zech para
definir una partición de las columnas de la matriz de control del código. Dadas las
propiedades de este logaritmo, en algunos casos el código resultante es también un
código array MDS. Además, proporcionamos un algoritmo basado en el método de
Gauss, para comprobar si el código obtenido es MDS o no.
1
Introducción
Los códigos array son códigos correctores de errores y de borrones. Tienen aplicaciones
importantes en comunicación y sistemas de almacenamiento [3, 9, 10] y han sido ampliamente estudiados [1, 2, 4]. Una propiedad muy común de los códigos array es el hecho
de que los algoritmos de codificación y decodificación usan sólo operaciones XOR, así los
códigos array que son MDS son más eficientes en términos de complejidad computacional
que los códigos de Reed-Solomon [3]. Además, los códigos MDS ofrecen la máxima protección contra fallos de dispositivo dada una cantidad de redundancia. Se pueden ver algunas
construcciones de códigos array MDS en [1, 2, 5, 7, 9, 10]. En este artículo proporcionamos
una construcción para obtener códigos array cíclicos y algunas veces MDS.
El resto del artículo está organizado de la siguiente forma: En la sección 2 presentamos algunas definiciones básicas y la notacián utilizada. En la sección 3 introducimos la
construcción del array de índices de un código array, utilizando los logaritmos de Zech
para definir los elementos del array. Los códigos obtenidos son LDPC y cíclicos. Podemos
elegir cuantos unos queremos que contengan las columnas. Dependiendo de este número,
el código obtenido será algunas veces MDS.
1
J.-J. Climent y S. Díaz
2
Preliminares
Supongamos que Fq es el cuerpo de Galois de q elementos. Es bien conocido que Fbq ≈ Fqb .
Denotamos también por hni el conjunto {0, 1, 2, 3, . . . , n}. Dada una matriz de tamaño
m × n la numeración de las filas comienza en 0 y termina en m − 1 y la de las columnas
comienza en 0 y termina en n − 1.
Definición 1: Sea b un entero positivo. Dado un código C de longitud n sobre Fbq , podemos
considerar las palabras de C como palabras de Fnb
q . Decimos que C es un código array
b
lineal de longitud n sobre Fq si es un código lineal de longitud nb sobre Fq .
C
Si dim C es la dimensión de C como espacio vectorial sobre Fq , entonces k = dim
es la
b
dimensión normalizada de C, y así los parámetros del código serán [n, k, d], donde d es
la distancia mínima (medida sobre Fbq ).
Definición 2: Sea C un [n, k]-código array lineal sobre Fbq y H = [hi,j ] una matriz de
control de tamaño (n − k) × n sobre Fbq o, equivalentemente, de tamaño (nb − kb) × nb
sobre Fq . Llamamos array de índices AH al array asociado a la matriz H, de tamaño
b × n, que tiene en la posición (i, j) el conjunto {t | ht,i+bj = 1}, es decir, los índices de las
filas de H que tienen un 1 en la columna i + bj.
Cuando tenemos una matriz de control, o una generadora, de un código, éste está
unívocamente definido. Ocurre lo mismo con el array de índices, que nos indica en que
posiciones de la matriz de control, o de la generadora, están los elementos no nulos. Veamos
un ejemplo.
Ejemplo 1: Consideremos
control es

1 0 0
 0 0 1

 0 0 0
H=
 0 0 1

 0 1 0
0 1 0
el [18, 12]-código lineal C sobre F2 , una de cuyas matrices de
0
1
0
0
0
0
1
0
0
0
0
1
0
0
1
0
1
0
0
0
1
0
0
0
1
1
0
0
0
0
0
0
0
1
0
1
0
0
0
1
0
0
0
1
1
0
0
0
1
0
0
0
1
0
0
0
0
0
1
0
0
0
1
1
0
0
0
1
0
0
0
1
0
0
0
0
0
1
0
0
0
1
1
0
1
0
1
0
0
0




.



Podemos ver el código también como un [6, 4]-código sobre F32 . Por tanto, el array de
índices será de tamaño 3 × 6 y tendrá la siguiente forma:
0
1
2
3
4
5
AH = 4, 5 5, 0 0, 1 1, 2 2, 3 3, 4
1, 3 2, 4 3, 5 4, 0 5, 1 0, 2
En general, podemos realizar esta construcción para cualquier [n, k]-código lineal sobre
Fq no array, siendo b simplemente un divisor n. A partir de ahora hablaremos sólo de array
cuando queramos referirnos a array de índices.
A continuación, recordamos el concepto de logaritmo de Zech que utilizaremos para
nuestros resultados. Sea α un elemento primitivo de Fq , sabemos que
Fq = {0, 1, α, α2 , · · · , αq−2 }.
2
Otra construcción de códigos array cíclicos, MDS y LDPC
Esta representación de Fq es bastante útil a la hora de realizar el producto entre dos
elementos del cuerpo ya que:
αi αj = α(i+j) mod (q−1)
Sin embargo, no es tan sencillo para la suma de dos elementos del cuerpo. Ahora bien, si
i < j entonces
αi + αj = αi (1 + αj−i ).
Como 1 + αj−i ∈ Fq , tenemos que 1 + αj−i = αt para algún t. De aquí la necesidad de
introducir la siguiente definición.
Definición 3: Consideremos α un elemento primitivo del cuerpo Fq . Si x ∈ hq−2i, decimos
que Zα (x) ∈ hq − 2i ∪ {∞} es el logaritmo de Zech de x en la base α si
αx + 1 = αZα (x) ,
donde, por cuestiones de notación, suponemos que 0 = α∞ .
3
Resultados
En esta sección construimos un tipo de códigos array binarios, LDPC que también son
cíclicos y en algunos casos MDS, para lo cual construimos el array correspondiente a una
matriz de control H de dicho código.
En todo lo que sigue p será un número primo, n = p − 1 y supongamos que n = br,
con b y r números enteros mayores que 1. Nuestro código será de longitud n sobre Fb2 y
de dimensión normalizada k = n − r. Por lo tanto, la matriz de control H será de tamaño
(n − k) × n sobre Fb2 o, equivalentemente, de tamaño (nb − kb) × nb sobre F2 . Esta matriz
contendrá las n columnas de la matriz identidad y el resto de columnas contendrán r unos
cada una.
Supongamos también que α es un elemento primitivo de Fp y consideremos los subconjuntos de Zn
Ei = {i, i + b, i + 2b, . . . , i + (r − 1)b} con i ∈ hb − 1i.
Claramente, estos conjuntos constituyen una partición de Zn , es decir, de los exponentes
de los elementos de F?p expresados como potencias de α.
S
Consideremos la aplicación Φ : Zn −→ Z?n {∞} dada por Φ(x) = Zα (x), donde Zα (x)
es el logaritmo de Zech de x en la base α. Puesto que
n
α 2 + 1 = p − 2 + 1 = 0 = α∞
(véase [6]) tenemos que Φ( n2 ) = ∞. Además es fácil comprobar que n2 ∈ E n2 mod b , por lo
que eliminamos este conjunto y aplicamos Φ al resto.
Denotemos por Di = Φ(Ei ) para i = 0, 1, . . . , b − 1 pero i 6= n2 mod b. El array AH
3
J.-J. Climent y S. Díaz
tendrá la forma siguiente:
0
D0
D1
..
.
D p−1 −1
2
D p−1 +1
2
..
.
Db−1
···
···
···
1
2
D0 + 1
D0 + 2
D1 + 1
D1 + 2
..
..
.
.
D p−1 −1 + 1 D p−1 −1 + 2
2
2
D p−1 +1 + 1 D p−1 +1 + 2
2
2
..
..
.
.
Db−1 + 1
Db−1 + 2
···
···
···
p−3
p−2
D0 + p − 3
D0 + p − 2
D1 + p − 3
D1 + p − 2
..
..
.
.
D p−1 −1 + p − 3 D p−1 −1 + p − 2
2
2
D p−1 +1 + p − 3 D p−1 +1 + p − 2
2
2
..
..
.
.
Db−1 + p − 3
Db−1 + p − 2
(1)
A partir de este array podemos obtener la matriz H del código. Veamos un ejemplo.
Ejemplo 2: Tomemos p = 11, por lo tanto, n = 10. Sean r = 2 y b = 5. Entonces
E0 = {0, 5}, E1 = {1, 6}, E2 = {2, 7}, E3 = {3, 8} y E4 = {4, 9},
que claramente forman una partición de Z10 .
Calculamos la tabla de logaritmos de Zech para F11 tomando como elemento primitivo α = 2:
x
0
Zα (x) 1
1
8
2
4
3
6
4 5 6 7 8 9
9 ∞ 5 3 2 7
De acuerdo con lo dicho anteriormente eliminamos el conjunto E0 = {0, 5} y aplicando el
logaritmo de Zech al resto obtenemos
D1 = {5, 8}, D2 = {3, 4}, D3 = {2, 6} y D4 = {7, 9}.
Con estos conjuntos obtenemos la primera columna del array y, a partir de ella, el resto de
columnas tal como indicamos en la expresión (1). Por tanto, el array será:
0
5, 8
3, 4
2, 6
7, 9
1
6, 9
4, 5
3, 7
8, 0
2
7, 0
5, 6
4, 8
9, 1
3
8, 1
6, 7
5, 9
0, 2
4
9, 2
7, 8
6, 0
1, 3
5
0, 3
8, 9
7, 1
2, 4
6
1, 4
9, 0
8, 2
3, 5
7
2, 5
0, 1
9, 3
4, 6
8
3, 6
1, 2
0, 4
5, 7
9
4, 7
2, 3
1, 5
6, 8
El número de unos de una matriz que viene determinada por su array es el número de elementos
que hay en este array. Llamamos densidad del código a dicho número.
Por la forma que tiene el array de la construcción anterior, podemos establecer el siguiente
resultado, cuya prueba es inmediata.
Teorema 1: El número de unos de cada fila de la matriz de control H asociada a un array del
tipo (1) es n − r + 1.
3.1
Ciclicidad
En esta sección vamos a probar la ciclicidad de los códigos que se obtienen con la anterior construcción. Para ello, primero recordamos algunos resultados.
Definición 4: Decimos que un código C de longitud n sobre Fbq es cíclico si (c0 , c1 , . . . , cn−1 ) ∈ C
implica que (cn−1 , c0 , c1 , . . . , cn−2 ) ∈ C.
4
Otra construcción de códigos array cíclicos, MDS y LDPC
En lo que sigue supondremos que H es la matriz de control de un código array y P es la matriz
que mueve cíclicamente b veces las columnas de H, es decir, si consideramos H = [H0 |H1 | . . . |Hn−1 ],
con Hi un bloque de tamaño (nb − kb) × b, entonces HP = [Hn−1 |H0 |H1 | . . . |Hn−2 ]. La ciclicidad
de un código está relacionada con la siguiente propiedad de las columnas de H.
Teorema 2: Un código C con matriz de control H es cíclico si y sólo si existe una matriz invertible
L de tamaño (nb − kb) × (nb − kb) tal que HP = LH.
Teorema 3: Un código C con matriz de control H es cíclico si y sólo si existe una matriz invertible
LP de tamaño (nb − kb) × (nb − kb) tal que HP = LP H, donde LP mueve las filas cíclicamente
(nb − kb)/n posiciones hacia abajo.
Por tanto, como consecuencia inmediata del resultado anterior tenemos el corolario siguiente.
Corolario 1: Sea AH el array de un [n, k]-código array lineal C sobre Fbq . C es cíclico si y sólo si
al sumar (nb − kb)/n a todos los elementos del array, el resultado es un movimiento cíclico en los
columnas de AH .
El ejemplo siguente nos ayudará a entender estos conceptos.
Ejemplo 3: Consideremos el array AH y la matriz H del ejemplo 1. En este caso n = 6, b = 3 y
k = 4, por tanto, si sumamos 1 a todos los elementos del array obtenemos el nuevo array
1
2
3
4
5
0
5, 0 0, 1 1, 2 2, 3 3, 4 4, 5
2, 4 3, 5 4, 0 5, 1 0, 2 1, 3
que se corresponde con la matriz

0 1 0 0 1
 1 0 0 0 1

 0 0 1 1 0

 0 0 0 0 0

 0 0 1 0 0
0 1 0 0 0
0
0
0
1
0
1
0
0
0
1
0
0
0
1
1
0
0
0
1
0
0
0
1
0
0
0
0
0
1
0
0
0
1
1
0
0
0
1
0
0
0
1
0
0
0
0
0
1
0
0
0
1
1
0
1
0
1
0
0
0
1
0
0
0
0
0
0
0
0
0
1
1
0
1
0
1
0
0




,



que se obtiene trasladando el primer bloque al final. Por lo tanto el código que define este array es
un código cíclico.
En nuestro caso, n = br por lo que habrá que sumar 1 a todos los elementos del array, siempre
trabajando sobre Zn . Si nos fijamos en la forma del array (1) y le sumamos una unidad a todos
los elementos del array, observamos que la primera columna se convierte en en la última columna:
1
2
D0 + 1
D0 + 2
D1 + 1
D1 + 2
..
..
.
.
p−1
p−1
D −1 + 1 D −1 + 2
2
2
D p−1 +1 + 1 D p−1 +1 + 2
2
2
..
..
.
.
Db−1 + 1
Db−1 + 2
···
···
···
···
···
···
p−2
0
D0 + p − 2
D0
D1 + p − 2
D1
..
..
.
.
p−1
p−1
D −1 + p − 2 D −1
2
2
D p−1 +1 + p − 2 D p−1 +1
2
2
..
..
.
.
Db−1 + p − 2
Db−1
Este hecho unido con el corolario anterior nos permite afirmar que los códigos obtenidos con
esta construcción son cíclicos.
5
J.-J. Climent y S. Díaz
3.2
MDS
Es bien conocido que para cualquier [n, k, d]-código se satisface que d ≤ n − k + 1. Dicha cota se
conoce con el nombre de cota de Singleton. Si un código alcanza dicha cota con igualdad decimos
que es un código de máxima distancia de separación (MDS).
Teorema 4 (Proposición 2.4 de [8]): Un [n, k]-código lineal C sobre Fq es MDS si y sólo si
n − k columnas de H son linealmente independientes.
La generalización de este resultado para códigos array la proporciona el resultado siguiente.
Corolario 2 (Proposición 3.1 de [5]): Sea H = [H1 |H2 | . . . |Hn ] la matriz de control de un
[n, k]-código array lineal sobre Fbq , con k = n − r, donde cada Hi es de tamaño rb × b sobre Fq .
Entonces C es MDS si y sólo si tomando r submatrices Hi las rb columnas correspondientes forman
un conjunto linealmente independiente sobre Fq .
Nuestro siguiente objetivo es tratar de averiguar si un código array es MDS sin necesidad de
trabajar con una matriz de control. Si queremos ver si un [n, n − r]-código array es MDS a partir
del array, debemos tomar todas las posibles combinaciones de r columnas de éste. Aplicamos el
método de Gauss para todas las combinaciones del array; posteriormente diremos cómo hacerlo.
Si en algunas de las combinaciones el resultado es un array en el que una de las celdas está vacía,
entonces las columnas correspondientes de la matriz de control no son linealmente independientes
y, como indica la proposición anterior, el código no es MDS. En el siguiente ejemplo mostramos
cómo aplicar el método de Gauss por columnas directamente sobre el array, sin necesidad de usar
la matriz.
Ejemplo 4: Tomamos una matriz M y su correspondiente array AM . Aplicamos el método de
Gauss por columnas a la matriz y a su vez vemos que cambios produce cada paso en el array.


1 0 0 0 0 1
 0 1 1 1 0 0 


0
1
 0 1 0 0 0 1 
 −→ AM = 1, 2, 3 3, 4, 5
M =
 0 1 1 0 1 0 


1, 3, 5 0, 2, 4
 0 0 0 0 1 1 
0 0 1 0 1 0
En primer lugar, utilizamos la columna cero para eliminar todos los 1 que hay en la fila cero.
Esto se traduce, en términos de array, en utilizar la celda que contiene al 0 para eliminar todos los
0 de otras celdas. Una vez dado este paso ya no volveremos a utilizar ni a cambiar la columna, o
celda, utilizada (escribimos dichos elementos en negrita). El resultado que obtenemos es:


1 0 0 0 0 0
 0 1 1 1 0 0 


0
1
 0 1 0 0 0 1 

 −→ 1, 2, 3 3, 4, 5
 0 1 1 0 1 0 


1, 3, 5 2, 4
 0 0 0 0 1 1 
0 0 1 0 1 0
A continuación, utilizamos la columna tres, que tiene un 1 en la posición uno, para eliminar
todos los 1 que hay en la fila uno. Esto es, tomaremos la celda que contiene solamente al 1 para
eliminar todos los 1 de otras celdas. El resultado es:


1 0 0 0 0 0
 0 0 0 1 0 0 


0
1
 0 1 0 0 0 1 
 −→ 2, 3 3, 4, 5

 0 1 1 0 1 0 


3, 5 2, 4
 0 0 0 0 1 1 
0 0 1 0 1 0
6
Otra construcción de códigos array cíclicos, MDS y LDPC
Para eliminar los 1 de la fila dos elegimos, por ejemplo, la columna uno. Debemos tener cuidado,
porque esta columna posee un 1 en otra posición, además de en la segunda posición. En términos
de array, esto es, usar el conjunto {2, 3} para eliminar todos los 2 que hay en el resto de celdas, pero
arrastrando el 3, es decir, añadiendo el 3 a las demás celdas que contienen un 2, o eliminándolo si
ya estuviera.


1 1 0 0 0 0
 0 0 0 1 0 0 


0
1
 0 1 0 0 0 0 
 −→ 2,3 3, 4, 5

 0 1 1 0 1 1 


3, 5 3, 4
 0 0 0 0 1 1 
0 0 1 0 1 0
Para eliminar los 1 de la fila tres, podemos elegir la columna dos, la cuatro o la cinco. Elegimos,
por ejemplo, la columna dos. Sucede lo mismo que antes, la columna posee dos 1. En el array
usaremos el conjunto {3, 5} para eliminar todos los 3 que hay en el resto de celdas, pero arrastrando
el 5, es decir, añadiendo el 5 a las demás celdas que contienen un 3, o eliminándolo si ya estuviera.


1 0 0 0 0 0
 0 0 0 1 0 0 


0
1
 0 1 0 0 0 0 
 −→ 2,3 4

 0 1 1 0 0 0 


3,5 4, 5
 0 0 0 0 1 1 
0 0 1 0 0 1
Actuamos de modo similar para los 1 de la fila cuatro. Tomamos la columna cuatro para
eliminar todos los 1 que hay en esta fila. Esto es, tomar la celda que contiene solamente al 4 para
eliminar el resto de 4 que haya en las restantes celdas.


1 0 0 0 0 0
 0 0 0 1 0 0 


0
1
 0 1 0 0 0 0 
 −→ 2,3 4

 0 1 1 0 0 0 


3,5 4, 5
 0 0 0 0 1 0 
0 0 1 0 0 1
Si reordenamos la columnas podemos obtener

1 0 0 0 0 0
 0 1 0 0 0 0

 0 0 1 0 0 0

 0 0 1 1 0 0

 0 0 0 0 1 0
0 0 0 1 0 1
la forma escalonada de la matriz.




 −→



0 3, 5
1
4
2, 3 5
Una vez que ya sabemos como aplicar el método de Gauss a un array, sin necesidad de implementar la matriz correspondiente, podemos saber si un código array es MDS siguiendo los pasos
mencionados anteriormente.
Ejemplo 5: Consideremos el código cuyo array es
AH =
0
1
2
3
4
5
1, 2, 5 2, 3, 0 3, 4, 1 4, 5, 2 5, 0, 3 0, 1, 4
y comprobemos si es MDS. Los parámetros del código
son n = 6, k = 3, r = 3 y b = 2. Tenemos
que aplicar el método de Gauss para todas las nr = 20 combinaciones posibles de columnas. En
7
J.-J. Climent y S. Díaz
este caso el código no es MDS, ya que obtenemos una combinación en la que al aplicar el método
de Gauss obtenemos una columna completamente nula:
0
1
4
1, 2, 5 2, 3, 0 5, 0, 3
Gauss
−→
0
1
4
2, 5 3, 5 −−
Queda por establecer una demostración formal de las condiciones que deben cumplir los parámetros para poder afirmar que el código es MDS.
Agradecimientos
Este trabajo ha sido parcialmente subvencionado por el proyecto MTM2008-06674-C02-01 del
Ministerio de Ciencia e Innovación del Gobierno de España. Además, la investigación de Sara Díaz
ha sido financiada con una ayuda de la Generalitat Valenciana destinada a la formación de doctores
(Ref. BFPI/2008/138).
Referencias
[1] M. Blaum, J. Brady, J. Bruck y J. Menon. EVENODD: An efficient scheme for tolerating double
disk failures in RAID architectures. IEEE Transactions on Computers, 42(2): 192–202 (1995).
[2] M. Blaum, J. Bruck y A. Vardy. MDS array codes with independent parity symbols. IEEE
Transactions on Information Theory, 42(2): 529–542 (1996).
[3] M. Blaum, P. G. Farrell y H. C. A. van Tilborg. Array codes. En V. S. Pless y W. C.
Huffman (editores), Handbook of Coding Theory, páginas 1855–1909. Elsevier, North-Holland, 1998.
[4] M. Blaum y R. M. Roth. New array codes for multiple phased burst correction. IEEE Transactions
on Information Theory, 39(1): 66–77 (1993).
[5] M. Blaum y R. M. Roth. On lowest density MDS codes. IEEE Transactions on Information
Theory, 45(1): 46–59 (1999).
[6] K. Huber. Some comments on Zech’s logarithms. IEEE Transactions on Information Theory,
36(4): 946–950 (1990).
[7] E. Louidor y R. M. Roth. Lowest density MDS codes over extension alphabets. IEEE Transactions
on Information Theory, 52(7): 46–59 (2006).
[8] F. J. MacWilliams y N. J. A. Sloane. The Theory of Error-Correcting Codes. North-Holland,
Amsterdam, 6a edición, 1988.
[9] L. Xu y J. Bruck. X-code: MDS array codes with optimal encoding. IEEE Transactions on
Information Theory, 45(1): 272–276 (1999).
[10] V. Xu, Lihao Bohossian, J. Bruck y D. G. Wagner. Low-density MDS codes and factors of
complete graphs. IEEE Transactions on Information Theory, 45(6): 1817–1826 (1999).
8
Descargar