codigos lineales

30
CODIGOS LINEALES

Upload: dafpi

Post on 12-Jun-2015

1.303 views

Category:

Documents


4 download

TRANSCRIPT

Page 1: codigos lineales

CODIGOS LINEALES

Page 2: codigos lineales

Definición

� Un código lineal de longitud n sobre un campo finito Fq

es simplemente un subespacio del vector espacial Fqn.

� Como los códigos lineales son vectores espaciales, su estructuraalgebraica a menudo lo hace mas facil de describir y usar que códigos no lineales. Vamos a enfocar nuestra atención a los códigos lineales sobre campos finitos.

Page 3: codigos lineales

� Sea Fq un campo finito de orden q. Un conjunto no-vacio V, juntos con algunos (vectores) de suma y multiplicación escalar por elementos de Fq , es un vector espacial (o espacio lineal) sobre Fq si satisface todas de las siguientes condiciones.

� Para todo u, v, w Є V y para todo λ λ λ λ , µµµµ Є Fq:� u + v Є V� (u + v) + w = u + (v + w)� Existe un elemento 0 Є V con la propiedad 0 + v = v = v + 0 para

todo v Є V� Para cada u Є V existe un elemento de V llamado – u, tal que u + (–

u) = 0 = (– u) + u� u + v = v + u� λ v Є V� λ (u + v) = λu + λv, (λλλλ + µµµµ)u = λλλλu + µµµµu� (λµλµλµλµ)u = λλλλ(µµµµu)

� Si 1 es la identidad multiplicativa de Fq , entonces 1u = u

Vector espacial sobre campos finitos

Page 4: codigos lineales

� Sea Fqn el conjunto de todos los vectores de longitud n

con entradas en Fq :Fq

n = {(v1, v2, …., vn): vi Є Fq }

Definimos la adición vectorial para Fqn :

v = (v1, v2, …., vn) Є Fqn y w = (w1, w2, …., wn) Є Fq

n

Entonces

v + w = (v1 + w1, v2 + w2, …., vn + wn) Є Fqn

Definimos la multiplicación escalar para Fqn :

v = (v1, v2, …., vn) Є Fqn y λ Є Fq

Entonces

λv = (λv1, λv2, …., λvn) Є Fqn

Sea 0 utilizado para denotar el vector cero (0, 0, …, 0) Є Fqn

Page 5: codigos lineales

� Un subconjunto C no-vacío de un vector espacial V es un subespacio de V si el mismo es un vector espacial con las mismas adición vectorial y multiplicación escalar que V.

� Un subconjunto C no vacío de un vector espacial V sobre Fq es un subespacio si y solo si se cumple la siguiente condición:

Si x, y Є C y λ, µ Є Fq, entonces λx + µy Є C

� Sea V un vector espacial sobre Fq. Una combinación lineal de v1, v2, …., vr Є V es un vector de la forma λ1v1, λ2v2, …., λrvr , donde λ1, λ2, …., λr Є Fq,son escalares.

� Sea V un vector espacial sobre Fq. Un conjunto de vectores {v1, v2, …., vr } en V es linealmente independiente si

λ1v1 + λ2v2 +….+ λrvr = 0 = λ1 = λ2 = ….= λr = 0El conjunto es linealmente dependiente si no es linealmente independiente p.e. existen λ1, λ2, …., λr Є Fq, no todos cero pero algunos si, de modo que λ1v1 + λ2v2 +….+ λrvr = 0

Page 6: codigos lineales

� Sea V un vector espacial sobre Fq y sea S = {v1, v2, …., vk} un subconjunto no-vacio de V. El (linear) span de S se define como

<S> = {λ1v1+….+ λkvk : λi Є Fq}Si S = 0, definimos <S> = 0. Es muy fácil comprobar que <S> es un subespacio de V, llamado el subespacio generado (o spanned) por S. Dado un subespacio C de V, un subconjunto S de C es llamado un conjunto generador (o conjunto spanning) de C si C = <S>. � Si S ya es un subespacio de V, entonces <S> = S.

� Sea V un vector espacial sobre Fq . Un subconjunto no-vacío B = {v1, v2, …., vk} de V es llamado la base para V si V = <B> y B es linealmente independiente. � Si B = {v1, v2, …., vk} es una base para V, entonces cualquier vector v Є V

puede ser expresado como una única combinacion lineal de vectores.� Un vector espacial V sobre un campo finito Fq puede tener muchas bases,

pero todas esas bases tendrán el mismo número de elementos. Este número es llamado la dimensión de V sobre Fq, denotado por dim(V)

Page 7: codigos lineales

� Sea v = (v1, v2, …., vn), w = (w1, w2, …., wn) Є Fqn.

� El producto escalar (o producto punto) de v y w se define como v.w = v1 w1+ v2 w2+ ….+ vn wn) Є Fq

n

� Los dos vectores v y w se dicen que son ortogonales si v.w = 0.

� Sea S un subconjunto no-vacío de Fqn. El complemento

ortogonal S┴ de S se define como

S┴ = {v Є Fqn: v.s = 0 para todo s Є S}

Si S = 0, entonces definimos S┴ = Fqn

Page 8: codigos lineales

Códigos lineales

� Un código lineal C de longitud n sobre Fq es un

subespacio de Fqn.

p.e. (q=2) C = {000, 001,010,011}

(q=3) C = {0000, 1100, 2200, 0001, 0002, 1102, 2201, 2202}

(q=2) C = {000, 001, 010, 011, 100, 101, 110, 111}

� Un código lineal C de longitud n y dimensión k sobre es

llamado código q-ario (n,k) o, si q esta sobreentendido del contexto, un código (n,k). También es un código lineal (n,qk).

Si la distancia d de C es conocida, es también referido como

un código lineal (n,k,d).

Page 9: codigos lineales

Distancia Mínima de un Código� El peso Hamming ( o simplemente peso ) de v, que se denota

como w(v), se define como el número de componentes distintas de cero de v.

Por ejemplo, el peso de v = ( 1 0 0 1 0 1 1 ) es 4.

� La distancia Hamming ( o simplemente distancia ) entre v y w, que se denota como d(v,w), se define como el número de dígitos en el mismo sitio que tienen diferentes.

Por ejemplo, la distancia Hamming entre v = ( 1 0 0 1 0 1 1 ) y w = ( 0 1 0 0 0 1 1 ) es 3; tienen diferentes las posiciones cero, uno y tres.

� De todo esto se deduce que la distancia Hamming entre dos n-tuplas, v y w, es igual a el peso Hamming de la suma de v y w, esto es:

d(v,w) = w( v + w )

Por ejemplo, la distancia Hamming entre v = ( 1 0 0 0 1 0 1 1 ) y w = ( 1 1 1 0 0 1 0 ) es 4 y el peso de v + w = ( 0 1 1 1 0 0 1 ) es también 4.

Page 10: codigos lineales

� Dado un código bloque C, se puede calcular la distancia Hamming entre cualquiera dos palabras código distintas. La distancia mínima de C ( dmin) se define como:

dmin = min { d(v,w) : v,w pertenecen a C, v distinto de w }.

� Sea C un código lineal, la suma de dos vectores es también un vector código. Por lo tanto, la distancia Hamming entre dos vectores código en C es igual al peso Hamming de un tercer vector código en C. De esto obtenemos que:

dmin = min { d(v,w) : v,w pertenecen a C, v distinto de w }= = min { w(x) : x pertenece a C, x distinto de 0 } = wmin.

� wmin es el peso mínimo del código lineal C.

Page 11: codigos lineales

Introducción a los Códigos Bloque Lineales

� Asumimos que la salida de una fuente de información es una secuencia de dígitos binarios "0" o "1". En la codificación de bloque, esta secuencia de información binaria es segmentada en bloques de mensaje de una longitud fija; cada bloque de mensaje, llamado u, consiste de k dígitos de información. Hay un total de 2k mensajes distintos.

� El codificador, de acuerdo con ciertas reglas, transforma cada mensaje entrante u, en una n-tupla binaria, v, con n > k. Esta n-tupla binaria v es lo que llamamos palabra código ( o vector código ) del mensaje u. Por lo tanto, para los 2k posibles mensajes, hay 2k palabras código.

� A este conjunto de 2k palabras código, se le llama Códigobloque. Para que un código bloque sea útil, las 2k palabras código deben ser distintas. En consecuencia, tiene que haber una correspondencia uno a uno entre un mensaje u y su palabra código v.

Page 12: codigos lineales

� Para un código con 2k palabras código de longitud n, a menos que tenga una estructura especial, el aparato de codificación será prohibitivamente complejo si k y n son grandes, ya que tiene que almacenar las 2k palabras código de longitud n en un diccionario. Por lo tanto, debemos restringir nuestra atención a códigos de bloque que pueden ser mecanizados de una manera práctica. Una estructura que se desea que tenga un código bloque, es la linealidad . Con esta estructura, la complejidad de la codificación se reduce enormemente, como veremos más adelante.

Page 13: codigos lineales

Código bloque lineal

� A un código bloque de longitud n y 2k

palabras código se le llama código lineal (n,k) si y sólo si sus 2k palabras código forman un subespacio k-dimensional del espacio vectorial de las n-tuplas sobre el campo GF(2).

� De hecho, un código binario es lineal si y sólo si la suma de módulo 2 de dos palabras código es también una palabra código. El bloque código dado en la siguiente tabla es un código lineal (7,4). Se puede comprobar fácilmente que la suma de dos palabras código en este código es también otra palabra código.

Ejemplo de código lineal (7,4)

( 1 1 1 1 1 1 1 )( 1 1 1 1)

( 0 0 1 0 1 1 1 )( 0 1 1 1)

( 1 0 0 1 0 1 1 )( 1 0 1 1)

( 0 1 0 0 0 1 1 )( 0 0 1 1)

( 1 1 0 0 1 0 1 )( 1 1 0 1)

( 0 1 1 1 0 0 1 )( 0 1 0 1)

( 1 0 1 0 0 0 1 )( 1 0 0 1)

( 0 1 0 1 1 1 0 )( 0 0 0 1)

( 1 0 0 0 1 1 0 )( 1 1 1 0)

( 0 0 1 1 0 1 0 )( 0 1 1 0)

( 1 1 1 0 0 1 0 )( 0 0 1 0)

( 1 0 1 1 1 0 0 )( 1 1 0 0)

( 0 1 1 0 1 0 0 )( 0 1 0 0)

( 1 1 0 1 0 0 0 )( 1 0 0 0)

( 0 0 0 0 0 0 0 )( 0 0 0 0)

Palabras códigoMensajes

Page 14: codigos lineales

� Dado que un código lineal (n,k) C es un subespacio k-dimensional del espacio de vectores Vn de las n-tuplasbinarias, es posible encontrar k palabras código linealmente independientes, g0, g1,..., gk-1 en C, de tal forma que cada palabra código v en C es una combinación lineal de esas k palabras código:

v = u0 g0 + u1g1 + ... + uk-1gk-1

� donde ui= 0 ó 1 para i mayor igual que cero y menor que k. Ahora vamos a colocar estas k palabras código linealmente independientes como las filas de una matriz k x n:

Page 15: codigos lineales

donde g = (gi0 , gi1 , ..., gi,n-1). Si u = (u0 , u1 , ..., uk-1) es el mensaje que va a ser codificado. La palabra código correspondiente puede ser dada de la siguiente manera:

� v = u G =

u0 g0 + u1 g1 + ... + uk-1 gk-1

Evidentemente la filas de G generan el código lineal (n,k) C. Por esta razón a la matriz G se la llama matriz generadora de C. Nótese que cualquier conjunto de k palabras código linealmente independientes pueden ser usadas para formar una matriz generadora del código. Por lo tanto, un código lineal (n,k) esta completamente definido por las k filas de la matriz generadora G. Como consecuencia de esto, el codificador solo tiene que almacenar las k filas de G y formar una combinación lineal de estas k filas basada en el mensaje de entrada u.

Page 16: codigos lineales

Ejemplo:� El código lineal (7,4) dado en la tabla anterior tiene

la siguiente matriz como matriz generadora:

Sea u = (1 1 0 1) el mensaje que hay que codificar, su palabra código correspondiente será :

v = 1 g0 + 1 g1 + 0 g2 + 1 g3

= ( 1 1 0 1 0 0 0) + (0 1 1 0 1 0 0) + (1 0 1 0 0 0 1)= (0 0 0 1 1 0 1)

Page 17: codigos lineales

Forma sistemática

� Una propiedad deseable en un código lineal es una estructura sistemática de las palabras código como la mostrada en la siguiente figura, donde una palabra código se divide en dos partes: la parte del mensaje y la parte de redundancia. La parte del mensaje consiste de k bits de información inalterada ( o mensaje) y la parte de redundancia consiste de de n - k bits de comprobación de paridad, los cuales son una suma lineal de los bits de información. A un código lineal de bloque con esta estructura se le llama códigolineal sistemático de bloque . El código (7,4) dado en anteriormente es un código sistemático, los cuatro bits que están más a la derecha de cada palabra código son idénticos a los bits correspondientes de información.

� Forma sistemática de una palabra código:

Page 18: codigos lineales

� Un código lineal (n,k) sistemático queda completamente definido por una matriz G k x n de la siguiente forma:

donde pij = 0 ó 1. Con Ik denotamos a la matriz identidad de dimensión k. Con lo que G = [P Ik].

u = ( u0, u1,...,uk-1) es el mensaje que hay que codificar. Por lo tanto, la palabra código correspondiente es:

v = ( v0 , v1 , v2 , ... , vn-1) = ( u0 , u1 , ... , uk-1) G

� De donde obtenemos las componentes de v:

vn-k+i = ui con 0 <= i < k

vj = u0p0j + u1p1j + ... + uk-1vk-1,j con 0<= j < n - k.

� Esto nos muestra que los k primeros dígitos por la derecha de una palabra código v son idénticos a los dígitos de información u0, u1,..., uk-1 que hay que codificar, y que los n - k dígitos de redundancia que están a la derecha, son sumas lineales de los de información.

Page 19: codigos lineales

Ejemplo:

� La matriz G dada está en forma sistemática. Si u = ( u0, u1, u2, u3) es el mensaje que hay que codificar, y v = ( v0, v1, v2, v3, v4, v5, v6 ) es la correspondiente palabra código. Entonces:

� Por lo tanto la palabra código correspondiente a ( 1 0 1 1 ) es ( 1 0 0 1 0 1 1 )

Page 20: codigos lineales

� Hay otra matriz útil asociada con cada código lineal de bloque. Para cada matriz G de dimensiones k x n con k filas linealmente independientes, existe una matriz H de dimensiones ( n - k ) x n con n - k filas linealmente independientes de tal manera que cada vector en el espacio de las filas de G es ortogonal a las filas de H y cada vector que es ortogonal a las filas de H esta en el espacio de las filas de G . Como consecuencia de esto, podemos describir el código lineal (n,k) generado por G de esta forma alternativa:

� Una n-tupla v es una palabra código en el código generado por G si y sólo si v HT = 0. Esta matriz H es la matriz de comprobación de paridad del código. Las 2n-k combinaciones lineales de las filas de la matriz H forman un código lineal Cd ( n, n - k ). Este código es el espacio nulo del código lineal C (n,k) generado por la matriz G (esto es, por cualquier v perteneciente a C y cualquier w perteneciente a Cd, v w = 0 ). Cd es el código dual de C. Por lo tanto, una matriz de comprobación de paridad de un código lineal C es la matriz generadora de su código dual.

Page 21: codigos lineales

H = [ In-k PT ] =

Si la matriz generadora de un código lineal (n,k) está en la forma

sistemática, la matriz de comprobación de paridad tiene la siguiente forma:

Donde PT es la traspuesta de la matriz P. Sea hj la j-ésima fila de H.

Podemos comprobar que el producto de la i-ésima fila del G dada por (3.4)

y de la j-ésima fila de H dada por (3.7) es

gi hj = pij + pij = 0 con 0<= i < k y 0<= j < n - k.

Esto implica que G HT = 0 . Además, las n - k filas de H son linealmente

independientes. Por lo tanto, la matriz H es una matriz de comprobación

de paridad del código lineal generado por la matriz G.

Page 22: codigos lineales

Síndrome y Detección de Errores

� Consideramos un código lineal (n,k) con su matriz generadora G y su matriz de comprobación de paridad H. Sea v una palabra código que

se transmite en un canal ruidoso, y r es el vector recibido a la salida del

canal. Debido a que el canal es ruidoso, r puede ser distinto de v.

� El vector suma de r y v es e; e es una n-tupla tal que ei=1 si ri es distinto de vi y ei=0 si ri=vi. A esta n-tupla se le llama vector de error. Los 1's que aparecen en e son errores de transmisión producidos

porque el canal es ruidoso.

� El receptor recibe r que es la suma de la palabra código transmitida y el vector de error. Cuando recibe r, el decodificador debe determinar si

contiene errores de transmisión. Si se detectan errores, el decodificador intentará corregirlos o pedirá una retransmisión.

Page 23: codigos lineales

� Cuando se recibe r, el decodificador calcula la siguiente (n-k)-tupla:

s = r HT = ( s0, s1,..., sn-k-1 ), esta n-tupla es el síndrome de r.

� s = 0 si y sólo si r es una palabra código ( el receptor acepta r como la palabra código transmitida), y s es distinto de 0 si y sólo si r no es una palabra código ( el receptor detecta la presenciade un error ). Pero, es posible que los errores no sean detectables (i.e., r contiene errores pero s = 0 ). Esto sucede cuando el vector de error es idéntico a una palabra código no nula. En este caso, r es la suma de dos palabras código y por lotanto el síndrome es igual a cero. Estos errores son errores indetectables. Como hay 2k - 1 palabras código no nulas, hay 2k

- 1 errores indetectables.

Page 24: codigos lineales

Ejemplo� Vamos a calcular el sídrome del código cuya matriz de comprobación de

paridad es la siguiente:

� Si r = ( r0, r1, r2, r3, r4, r5, r6 ) es el vector recibido, el síndrome se calcula de la siguiente manera:

� Con lo cual los dígitos que componen el síndrome son:

s0 = r0 + r3 + r5 + r6s1 = r1 + r3 + r5 + r6s2 = r2 + r4 + r5 + r6

Page 25: codigos lineales

� Como se ha visto, el síndrome depende solo del vector de error, y no de la palabra código transmitida:

s = r HT = ( v + e ) HT = v HT + e HT

Como v HT = 0. Obtenemos la siguiente expresión:

s = e HT

� Una vez que se encuentra el error, se considera que el vector r + e es la palabra código transmitida. Desgraciadamente, determinar cual es el verdadero vector de error no es una cuestión sencilla. Esto es debido a que las n - k ecuaciones lineales no tienen una solución única, sino que tienen 2k

soluciones. En otras palabras, hay 2k patrones de error que dan el mismo síndrome, y el verdadero error que se ha producido es únicamente uno de ellos. Para minimizar la probabilidad de error, se elige como vector de error al patrón de error más probable. Si el canal es BSC, el vector de error más probable es el que tiene el menor número de ceros.

Page 26: codigos lineales

Propiedades de detección y corrección de

errores de un código bloque

� Propiedades detectoras: Cuando se transmite un vector código v por un canal ruidoso, un vector de error con l errores provoca que el vector recibido r sea diferente del vector v en l posiciones [ i.e., d(v,r) = l ]. Si la distancia mínima del código C es dmin, cada pareja de dos vectores de C tienen al menos dmin posiciones distintas. Por lo tanto, cualquier vector de error con dmin - 1 o menos errores da un vector r que no es una palabra código de C. Cuando el receptor detecta que el vector recibido no es una palabra código de C, el error ha sido detectado.

� Por lo tanto, un código bloque con distancia mínima dmin es capaz de detectar todos los patrones de error de dmin - 1 o menos errores.

� Un código bloque detecta todos los patrones de error de dmin - 1 o menos errores, pero también detecta una gran fracción de los patrones de error con dmin o más errores. En realidad, un código lineal (n,k) es capaz de detectar 2n - 2k patrones de error de longitud n.

Page 27: codigos lineales

� De entre los 2n - 1 patrones de error distintos de cero, hay 2k - 1 patrones de error que son idénticos a a las 2k - 1 palabras código. Si sucede cualquiera de esos 2k - 1 patrones de error, la palabras código transmitida, v se transforma en otra palabras código, w. Por lo tanto, se recibe w y su síndrome es cero. En este caso, el decodificador acepta w como la palabra transmitida y realiza una decodificación incorrecta. De todo esto concluimosque hay 2k - 1 patrones de error que son indetectables

� Hay 2n - 2k patrones de error detectables. Para n suficientemente grande, 2k - 1 es en general mucho mas pequeño que 2n. Por lo tanto, sólo una pequeña fracción de errores pasa por el decodificador sin ser detectados.

Page 28: codigos lineales

� Propiedades correctoras: Si un código bloque C con distancia mínima dmin se usa para corregir errores aleatorios, es conveniente saber cuantos errores es capaz de corregir dicho código.

� La distancia mínima es par o impar. Por lo tanto, podemos elegir un entero t tal que: 2t + 1 <= dmin <= 2t + 2

� Ahora vamos a probar que el código C es capaz de corregir todos los patrones de error de t o menos errores. Sean v y r el vector transmitido y recibido respectivamente. Sea w cualquier otro vector código de C. La distancia Hamming entre v, r y w satisface la desigualdad triangular:

� Supongamos que un patrón de error de t' errores sucede durante la transmisión de v. Entonces, el vector recibido tiene t' posiciones distintas de v y d(v,r) = t'. Puesto que v y w son vectores código de C, tenemos que:

Page 29: codigos lineales

� Obtenemos la siguiente desigualdad: d(w,r) => 2t + 1 - t'

� Si t'<= t, entonces: d(w,r) > t

� La desigualdad de arriba dice que si un patrón de t o menos errores tiene lugar, el vector recibido r está más cerca del vector transmitido v que a cualquier otro vector w en C. Basandose en el esquema de decodificación de máxima similitud, r es decodificado en v, que es el vector que se transmitió. Se ha realizado una decodificación correcta y por lo tanto una correccion de errores.

� Por otra parte, el código no es capaz de corregir todos los patrones de error de l errores con l > t, porque por lo menos hay un caso en el cual un patrón de error de l errores da lugar en recepción un vector r que está más cerca de un vector código incorrecto que al vector transmitido. Veamos esto con dos vectores código v y w:

� d(v,w) = dmin.

� Sean e1 y e2 dos patrones de error que satisfacen las siguientescondiciones:

1. e1 + e2 = v + w.

2. e1 y e2 no tienen componentes distintas de cero en las mismas posiciones.

� Obviamente, tenemos que:

w(e1) + w(e2) = w(v + w) = d(v,w) = dmin.

Page 30: codigos lineales

� Ahora suponemos que v se transmite y es corrompida por e1. El vector recibido es: r = v + e1.

� La distancia Hamming entre v y r es: d(v,r) = w(v + r) = w(e1).

� La distancia Hamming entre w y r es: d(w,r) = w(w + r) = w(w + v + e1) = w(e2).

� Ahora suponemos que el patrón de error e1 contiene más de t errores [i.e., w(e1) > t ]. Puesto que 2t + 1 <= dmin <= 2t + 2, obtenemos que: w(e2) <= t + 1.

� Combinando las tres últimas expresiones y usando el hecho de que w(e1) < t, obtenemos la siguiente desigualdad: d(v,r) => d(w,r).

� Esta desigualdad dice que existe un patrón de error de l ( l > t ) errores que da lugar a un vector recibido que que está más cerca de un vector incorrecto que del vector transmitido. Basandose en el esquema de decodificación de máxima similitud se puede producir una decodificación incorrecta.

� Para resumir, un código bloque con distancia mínima dmin garantiza que corrige todos los patrones de error de t = [( dmin - 1) /2] o menos errores

� Un código bloque con capacidad de corregir de t errores aleatorios generalmente es capaz de corregir bastantes patrones de error de t + 1 errores o más. Un código lineal (n,k) con capacidad de corregir t errores, es capaz de corregir un total de 2n - 2k patrones de error.