Академический Документы
Профессиональный Документы
Культура Документы
CARRERA DE INFORMÁTICA
2
TABLA DE CONTENIDO
PREFACIO.......................................................................................................................... 5
CAPÍTULO 5: CANALES
CANALES DE INFORMACIÓN CON RUIDO............................................................... 71
LA INFORMACIÓN MUTUA NO ES NEGATIVA........................................................ 75
RECIPROCIDAD DE LA INFORMACIÓN MUTUA..................................................... 78
OTROS RESULTADOS................................................. .................................................. 80
CANALES ESPECIALES................................................. ............................................... 83
CANALES EN SERIE................................................. ..................................................... 88
TEOREMA DEL PROCESAMIENTO DE DATOS......................................................... 89
ADITIVIDAD DE LA INFORMACIÓN MUTUA........................................................... 93
REDUCCIÓN DE CANALES................................................. ......................................... 97
CAPACIDAD DE UN CANAL....................................................................................... 100
3
CAPÍTULO 7: CÓDIGOS LINEALES....................................................................... 130
MATRIZ GENERADORA.............................................................................................. 131
CÓDIGO DUAL.............................................................................................................. 134
MATRIZ DE TESTEO DE PARIDAD........................................................................... 135
SÍNDROME................................................................................….........……………… 140
CÓDIGO EXPANDIDO.................................................................................................. 141
MATRIZ ESTÁNDAR.................................................................................................... 142
CÓDIGOS DE HAMMING............................................................................................. 147
Índice................................................................................................................................ 185
BIBLIOGRAFÍA
4
PREFACIO
Lucio Torrico
luciotorrico@gmail.com
5
FUENTES DE INFORMACIÓN DE MEMORIA NULA
Una fuente de información de memoria nula, denotada por Fuente-S, es un par ordenado
definido como sigue.
S pi S pi
s1 p1 s1 0.2
. . s2 0.1
s3 0.35
. . s4 0.35
. .
sq pq Con q = 4
Nótese que utilizamos "q" para el número de
símbolos de la fuente.
Fuente equiprobable.- Una Fuente-S de memoria nula se dice equiprobable cuando todas
sus probabilidades son iguales, es decir, cuando p1 = ... = pq = 1/q
Ejemplo: con q = 2
S pi
s1 1/2
s2 1/2
6
Debe sumarse la informacion de dos símbolos sucesivos independientes, es decir:
I(sisj) = I(si) + I(sj)
Por r-its entenderemos las unidades de la cantidad de información, según sea la base r del
logaritmo que se utilice. Cuando la base es r = 2 las unidades se llaman bits, con r = 10
decs, con r = e nats, etc.
Entropía de una fuente de información de memoria nula, denotada por Hr(S).- Está
definida por:
q q q
Hr(S) = ∑ pi · I(si) = ∑ pi · logr 1/pi = - ∑ pi · logr pi r-its
i =1 i =1 i =1
Y mide la cantidad de información media por símbolo de una Fuente-S de memoria nula.
Sus unidades son medidas en r-its. Cuando la base del logaritmo es r = 2 las unidades se
llaman bits, con r = 10 decs, con r = e nats, etc.
Generalmente se trabaja con r = 2 -es decir la entropía medida en bits- y suele omitirse la
escritura de este símbolo.
S pi 4
He(S) = ∑ pi · loge 1/pi
s1 0.2 i =1
s2 0.1 = 0.2 · ln(1/0.2) + 0.1 · ln(1/0.1) + 0.35 · ln(1/0.35) + 0.35 · ln(1/0.35)
s3 0.35 = 2/10 · ln (10/2) + 1/10 · ln (10/1) + 35/100 · ln(100/35) + 35/100 · ln(100/35)
s4 0.35 = 0.2 · 1.60943 + 0.1 · 2.30258 + 0.35 · 1.04982 + 0.35 · 1.04982
= 0.32188 + 0.23025 + 0.36743 + 0.36743
= 1.28702 nats
7
Es interesante notar que si tenemos la entropía en v-its (base v), puede calcularse
fácilmente la entropía en r-its (base r) así:
q q
Es decir,
8
FUENTES DE INFORMACIÓN DE MEMORIA NULA EXTENDIDAS
S pi
s1 p1
. .
. .
. .
sq pq
S pi
s1 p1 = 0.2
s2 p2 = 0.8
S2 pj
σ1 = s 1 s 1 p1· p1 = 0.04
σ2 = s 1 s 2 p1· p2 = 0.16
σ3 = s 2 s 1 p2 · p1 = 0.16
σ4 = s 2 s 2 p2 · p2 = 0.64
Obviamente siendo una fuente extendida una fuente de memoria nula, puede hallarse su
entropía.
9
FUENTES DE MARKOV
Una fuente de Markov de orden m es una fuente con memoria que toma en cuenta
('recuerda') los m símbolos anteriores al símbolo que está por emitirse. La probabilidad de
aparición del símbolo que está por emitirse depende de cuáles son los m símbolos
anteriores.
Denotada por Fuente-M se define así: Fuente-M=(S,m,P,W(0)) donde:
S = {s1, s2, ... , sq} es el alfabeto de la fuente.
m es el orden de la fuente (en función de cuántos símbolos anteriores está la probabilidad
del siguiente símbolo a emitirse).
P es un conjunto de probabilidades del tipo p(si / sj1 sj2 ... sj m) que asigna a cada símbolo si
(i=1,...,q) una probabilidad de emisión en función de m símbolos anteriores. Diremos que
estos m símbolos "sj1 sj2 ... sjm" conforman el j-ésimo estado de la fuente. Es claro que hay
qm estados.
La probabilidad p(si / sj1 sj2 ... sjm) es la probabilidad de pasar del estado "sj1 sj2 ... sjm" al
estado "sj2 sj3 ... sjm si". Por ello, en vez de describir el conjunto P como un listado, es usual
presentarlo como una matriz de transiciones entre estados de dimensión qm X qm.
A los estados de la fuente de Markov los llamaremos α1, ··· , αqm.
W(0) es la distribución inicial de probabilidades de los estados de la Fuente-M.
W(0) = [ w1(0), ··· , wqm(0) ]T (la T significa transpuesta), donde wi(0) denota la probabilidad
de estar en el estado αi al iniciar la fuente la emisión de sus símbolos, es decir, en el
tiempo 0: el supercero significa precisamente dicho instante cero (wi(0) es pues la
probabilidad de que los primeros m símbolos emitidos por la fuente sean los denotados
por αi). Es claro que w1(0) + ... + wqm(0) = 1.
0.2 0 0 0
P= 0.8 0 1 0
0 0.4 0 0.5
0 0.6 0 0.5
10
Las transiciones entre estados permiten representar las fuentes de Markov mediante un
grafo (cada estado es un nodo y arcos entre estados etiquetados con las probabilidades de
transición, los arcos con probabilidad igual a cero no se grafican); en el caso del ejemplo
el grafo se ve así:
En el estado α1=00 el arco tiene la etiqueta "0/0.2" que significa: 0.2 es la probabilidad de
emisión de un 0 dado que los 2 símbolos anteriores fueron 00, que es lo mismo que la
probabilidad de pasar del estado α1=00 al estado α1=00. En vez de esta etiqueta "0/0.2", es
más frecuente colocar sólo la etiqueta "0.2". Lo mismo sucede con todos los demás arcos.
(Nótese que la suma de las probabilidades de los arcos que salen de un nodo suman 1, por
ejemplo del nodo "11" sale un arco con probabilidad 0.5 y otro arco también con
probabilidad 0.5, la suma de las probabilidades de ambos arcos es 1).
11
ENTROPÍA DE UNA FUENTE DE MARKOV
Y en forma de matriz:
0.8 0 0.5 0
P= 0.2 0 0.5 0
0 0.5 0 0.2
0 0.5 0 0.8
12
El resto de las entropías por estado son:
qm
Hr (M) =∑ wj · Hr (S / sj1 sj2 ... sjm) r-its
j=1
⎡0.8 0 0.5 0 ⎤ ⎡ w1 ⎤ ⎡ w1 ⎤
⎢0.2 0 0.5 0 ⎥ ⎢ w2 ⎥ ⎢ ⎥
⎢ ⎥ · ⎢ ⎥ = ⎢ w2 ⎥ junto a w1 + w2 + w3 + w4 = 1
⎢ 0 0.5 0 0.2⎥ ⎢ w3 ⎥ ⎢ w3 ⎥
⎢ ⎥ ⎢ ⎥ ⎢ ⎥
⎣ 0 0.5 0 0.8⎦ ⎣ w4 ⎦ ⎣ w4 ⎦
Es decir,
0.8 w1 + 0.5 w3 = w1
0.2 w1 + 0.5 w3 = w2
0.5 w2 + 0.2 w4 = w3
0.5 w2 + 0.8 w4 = w4 junto a w1 + w2 + w3 + w4 = 1
Este sistema de ecuaciones puede resolverse de varios modos (por ejemplo en MATLAB).
Si se elige resolverlo manualmente puede aportar claridad utilizar fracciones en vez de
decimales, por ej. en vez de 0.8 utilizar 8/10.
Recordemos que:
H2(S/α1) = H2(S/00) = 0.72192 bits
H2(S/α2) = H2(S/01) = 1 bits
H2(S/α3) = H2(S/10) = 1 bits
H2(S/α4) = H2(S/11) = 0.72192 bits
13
Distribución límite.- La distribución inicial de estados W(0) sólo nos indica la
probabilidad de que la fuente empiece la emisión de símbolos en un estado αi o en otro, en
el tiempo 0. De hecho, no siempre se ofrece W(0) o bien puede trabajarse con un vector de
referencia donde todos sus valores son ceros excepto uno igual a la unidad, por ejemplo:
W(0) = [ w1(0), ... , wqm(0) ]T = [1, 0, ... , 0]T.
Puede generalizarse esta idea a W(t) = [w1(t), ··· , wqm(t)] que denota la probabilidad de que
la fuente esté (otros dicen empiece) en el estado α1, ... ,αqm respectivamente, en el tiempo
t.
Una idea asociada es calcular la probabilidad de ir del estado αi al estado αj en t pasos, si
lo hacemos para todos los estados tendremos lo que se denomina distribución de
probabilidades del sistema para dicho tiempo t, o como otros llaman la matriz de
transición de t pasos denotada por P(t). Desde un punto de vista formal este cálculo
requiere utilizar la ecuación de Chapman-Kolmogorov, pero ellos muestran que finalmente
esto puede calcularse con matrices así:
P(t) = Pt
W(1) = P·W(0), W(2) = P·W(1), W(3) = P·W(2), etc.
En general: W(t+1) = P·W(t)
Haciendo los reemplazos que sugiere la inducción tenemos que:
W(t+1) = P(t+1) · W(0) = Pt+1 · W(0)
Como todas estas matrices y vectores representan distribuciones de probabilidad, para
cada t la suma de sus columnas debe ser 1.
Denotaremos por P(∞) a la matriz límite de la Fuente-M, donde P(∞) = lim P(t) .
t − >∞
Llamaremos distribución límite a cualquier columna de P(∞).
Las condiciones bajo las cuales este límite existe y su cálculo están fuera del alcance de
este texto (por ejemplo el uso de la transformada Z puede ser útil para su estudio).
Un resultado conocido es que la Fuente-M tiene una distribución límite cuando ∃ t>0 tal
que Pt tenga todos sus valores positivos. En este caso P(∞) converge y sus columnas son
iguales: se obtiene la distribución límite calculando Pt para un t suficientemente grande y
tomando cualquier columna.
Puede ser que no exista la distribución límite pero sí la distribución estacionaria (única o
no).
14
Fuente regular y ergódica.-
Podemos trabajar la Fuente-M como una cadena de Markov.
Una Fuente-M es regular cuando ∃ t>0 tal que Pt tenga todos sus valores positivos.
Es decir, una Fuente-M regular es ergódica, pero existen Fuentes-M ergódicas que no son
regulares.
Cuando hay más de una distribución estacionaria podemos asumir que la Fuente-M no es
ergódica.
Ejemplos: Se sugiere utilizar MATLAB (junto a los conceptos) para verificar los
comentarios.
⎡1 0 0.5 0⎤
⎢0 0 0.5 0⎥
P= ⎢ ⎥
⎢0 0.5 0 0⎥
⎢ ⎥
⎣0 0.5 0 1⎦
15
⎡0.8 0 0 0⎤
⎢0.2 0 1 0 ⎥⎥
P= ⎢
⎢ 0 0.6 0 0.5⎥
⎢ ⎥
⎣ 0 0.4 0 0.5⎦
⎡0 0 0 0⎤
⎢1 0 1 0 ⎥⎥
P= ⎢
⎢0 0.6 0 0.5⎥
⎢ ⎥
⎣0 0.4 0 0.5⎦
⎡0 0 1 ⎤
P = ⎢⎢1 0 0⎥⎥
⎢⎣0 1 0⎥⎦
16
⎡0.8 0 0.5 0 ⎤
⎢0.2 0 0.5 0 ⎥
P= ⎢ ⎥
⎢ 0 0.5 0 0.2⎥
⎢ ⎥
⎣ 0 0.5 0 0.8⎦
17
FUENTE AFÍN O ADJUNTA
DE UNA FUENTE DE INFORMACIÓN DE MARKOV
Los símbolos del alfabeto de esta Fuente- M son los mismos que los de la Fuente-M, es
decir, S = {s1, s2, ... , sq}
Y las probabilidades de emisión de estos símbolos en la Fuente- M , prob(si) = pi, se
calculan así:
qm
prob(si) = pi = ∑ p(si /αj) · wj
j =1
4
prob(s2) = p2 = ∑ p(si /αj) · wj = p(s2/α1) · w1 + p(s2/α2) · w2 + p(s2/α3) · w3 + p(s2/α4) · w4
j =1
= 0.2 · 5/14 + 0.5 · 2/14 + 0.5 · 2/14 + 0.8 · 5/14 = 7/14 = 0.5
M pi
s1 0.5
s2 0.5
18
EXTENSIÓN n-ésima DE UNA FUENTE DE MARKOV
Sea la Fuente-M una fuente de Markov de orden m con alfabeto S={s1, s2, ... , sq} y matriz
de transiciones P.
Llamaremos Fuente-Mn a la n-ésima extensión de la Fuente-M original.
La Fuente-Mn es también una fuente de Markov que describimos a continuación:
Alfabeto: Sn = {σ1, σ2, ... , σqn} (qn símbolos). σj = sj1 sj2 ... sjn con sji ∈ S
n
Orden: el orden de la Fuente-M es μ=techo(m/n)
la función techo (ceil en inglés) es la parte entera hacia arriba
Probabilidades condicionales:
nμ
p(σi / σj1...σjμ ) (Es claro que existen q estados)
= p(si1si2...sin / sj11sj12...sj1n ... sjμ1sjμ2...sjμn)
= p(si1 / sj11sj12...sj1n...sjμ1sjμ2...sjμn) · p(si2 / sj12...sj1n...sjμ1sjμ2...sjμnsi1) · ... (1)
... · p(si n / sj1n...sjμ1sjμ2...sjμnsi1si2...si (n-1))
(Debemos redefinir las probabilidades en función de las probabilidades de la Fuente-M
original -de orden m-.
Para ello en cada una de las probabilidades condicionales sólo se toman en cuenta los
últimos m símbolos (después del slash) -los únicos que pueden recordarse-.
De manera que (1) se puede reescribir así:
sean sh1sh2...shm los últimos m símbolos de "sj11sj12...sj1n ... sjμ1sjμ2...sjμn" luego)
Ejemplo: Sea la siguiente Fuente-M con S={s1, s2}={0,1} q=2 orden m=2
19
Listado de probabilidades:
p(0/00)=0.8 P(α1->α1)=0.8
p(1/00)=0.2 p(α1->α2)=0.2
p(0/01)=0.5 p(α2->α3)=0.5
p(1/01)=0.5 p(α2->α4)=0.5
p(0/10)=0.5 p(α3->α1)=0.5
p(1/10)=0.5 p(α3->α2)=0.5
p(0/11)=0.2
p(α4->α3)=0.2
p(1/11)=0.8
p(α4->α4)=0.8
Matriz de transiciones:
00 01 10 11
α1 α2 α3 α4
α1 0.8 0 0.5 0 P=
α2 0.2 0 0.5 0
α3 0 0.5 0 0.2
α4 0 0.5 0 0.8
Fuente Extendida-Mn
La n-ésima extension de la Fuente-M es con n=2
Sn={σ1, σ2, σ3, σ4}
σ1=s1s1=00
σ2=s1s2=01
σ3=s2s1=10
σ4=s2s2=11
orden: techo(m/n) = μ = 1
20
Listado de probabilidades de la fuente extendida:
p(00/00)=p(0/00)·p(0/00)=0.8·0.8=0.64 p(β1->β1)=0.64
p(00/01)=p(0/01)·p(0/10)=0.5·0.5=0.25 p(β2->β1)=0.25
p(00/10)=p(0/10)·p(0/00)=0.5·0.8=0.4 p(β3->β1)=0.4
p(00/11)=p(0/11)·p(0/10)=0.2·0.5=0.1 p(β4->β1)=0.1
p(01/00)=0.16 p(β1->β2)=0.16
p(01/01)=0.25 p(β2->β2)=0.25
p(01/10)=0.1 p(β3->β2)=0.1
p(01/11)=0.1 p(β4->β2)=0.1
p(10/00)=0.1 p(β1->β3)=0.1
p(10/01)=0.1 p(β2->β3)=0.1
p(10/10)=0.25 p(β3->β3)=0.25
p(10/11)=0.16 p(β4->β3)=0.16
p(11/00)=0.1 p(β1->β4)=0.1
p(11/01)=0.4 p(β2->β4)=0.4
p(11/10)=0.25 p(β3->β4)=0.25
p(11/11)=0.64 p(β4->β4)=0.64
00 01 10 11
s1 s1 s1 s2 s2 s1 s2 s2
σ1 σ2 σ3 σ4
β1 β2 β3 β4
β1 0.6400 0.2500 0.4000 0.1000
β2 0.1600 0.2500 0.1000 0.1000
β3 0.1000 0.1000 0.2500 0.1600
β4 0.1000 0.4000 0.2500 0.6400
21
CÓDIGOS
Un código C es una bolsa (bag) finita de n cadenas en X+ (el lenguaje universal excepto la
cadena vacía). A diferencia de un conjunto una bolsa permite elementos repetidos.
Cuando se prescinda de la repetición de elementos, entonces un código C es un lenguaje
finito (un conjunto finito de n cadenas C ⊂ X+).
Cada cadena de un código C se denomina palabra código (de C).
Denotando una palabra código por wi, entonces un código será la bolsa C=[w1, …, wn]; o
bien el conjunto C={w1, …, wn}.
Es usual escribir un código como una tabla de una columna; para los ejemplos anteriores
esto se ve así:
C1 C2
---------- -----------
w1 = 01 w1 = 00
w2 = 00 w2 = 01
w3 = 11 w3 = 10
w4 = 021 w4 = 11
w5 = 11 w5 = 21
w6 = 22
Dependiendo del número de símbolos del alfabeto (del) código X, un código se dice
binario (cuando r = 2), ternario (cuando r = 3), etc. En general un código C será r-ario.
En rigor, no es necesario utilizar los r símbolos en las palabras código de C.
Dado que la palabra código wi es una cadena, podemos pensar en calcular su longitud,
operación que denotaremos así |wi|=li; es decir, li es la longitud de la palabra código wi.
En el código C, sea la constante l>0: Si ∀i li=l, el código se denomina Bloque, es
decir, cuando todas sus palabras código tienen la misma longitud.
En otro caso se denomina no Bloque, es decir, cuando hay por lo menos dos palabras
código de diferente longitud.
Es claro que –en los ejemplos- C1 es no bloque y que C2 es bloque (con l=2).
(Abramson sugiere otro concepto de bloque menos popular pero muy interesante.)
22
En el código C (cuyo alfabeto es X): Si ∀wj wj≠wi·v (con i≠j, v ∈ X*) el código se
denomina Libre de Prefijos, es decir, cuando ninguna palabra código es prefijo de otra
palabra código diferente.
En otro caso se denomina no Libre de Prefijos.
Es claro que –en los ejemplos- C1 es no libre de prefijos y que C2 es libre de prefijos.
Así pues, una representación común de una Fuente-S (genérica) y su código asociado C
(genérico) es como sigue:
S pi C
s1 p1 w1
. . .
. . .
. . .
sq pq wq
En el código C: Si hay una cadena de símbolos del alfabeto código x1x2...xm (con m>0)
correspondiente a más de una secuencia de palabras código, C se denomina
no Unívocamente Decodificable, es decir, cuando x1x2...xm se puede interpretar de dos o
más maneras.
23
En otro caso se denomina Unívocamente Decodificable, es decir, cuando cada secuencia
x1x2...xm se puede interpretar de una única manera.
Ejemplo:
En la última Fuente-S trabajando con el código C5 (con m=2) la cadena x1x2=aa se puede
interpretar como w1 que se decodifica como s1; o bien se puede interpretar como w2w2 que
se decodifica como s2s2. Dado que hay más de una interpretación posible, es claro que C5
es no Unívocamente Decodificable (es lo mismo decir que C5 no es Unívocamente
Decodificable).
Dos presentaciones equivalentes del método (el código C se trata como lenguaje) son:
24
S0 = C S0 = C
S1 = (C/C) – {λ}
∞ ∞
Z= U Si
i =1
(nótese que i empieza en 1) Z= U= S
i 1
i (nótese que i empieza en 1)
Ejemplos:
Con el código C3 de antes y con el método en su segunda presentación.
S0 = C3 = {b,c,aa,ab,ac}
S1 = [ (C3/S0) ∪ (S0/C3) ] – {λ} = [{λ} ∪ {λ}] – {λ} = { }
S2 = [ (C3/S1) ∪ (S1/C3) ] – {λ} = [{ } ∪ { } ] – {λ} = { }
S1 = S2 nos detenemos (pues S2=S3=S4= ···).
∞
Z= U= S
i 1
i ={}
25
Planteado el problema de ese otro modo, no hay necesidad de generalizarlo buscando dos
secuencias diferentes de símbolos de la Fuente-S de distinta longitud (por ejemplo con
C={0,00} las secuencias sj=s1s1 y sh=s2), pues si las hubiere se puede construir otras dos
secuencias de la misma longitud así: a partir de sj=sj1sj2...sjn y sh=sh1sh2...shñ, con n≠ñ y
que se codifiquen idénticamente como x1x2...xm, obtenemos las dos secuencias sjsh y shsj
que son secuencias diferentes ¡pero de la misma longitud! además ambas se codifican
idénticamente como x1x2...xmx1x2...xm (por ejemplo sjsh=s1s1s2 y shsj=s2s1s1).
Es obvio que la expresión “sin conocer qué otros símbolos del alfabeto código siguen” se
aplica racionalmente cuando estamos –ya- con una palabra código posible de ser asignada.
Es decir, no se aplica cuando estamos con una secuencia que no es aún (ni siquiera) una
palabra código. Por ejemplo, en C’ si la secuencia empieza como 11···, es obvio que
necesitamos conocer los siguientes símbolos para asociar la secuencia con alguna palabra
código (11 no es aún una palabra código). En los códigos bloque no singulares esto es más
evidente, por ejemplo con C’’={aba,abb,abc}, si una secuencia empieza como a···, claro
que tenemos que conocer qué símbolos siguen para empezar a asociar palabras código a la
secuencia y a decodificar.
C’ y C’’ son instantáneos.
26
Un código C singular, no es instantáneo: La idea de instantaneidad es que asociemos
una secuencia de símbolos del alfabeto código a una palabra código –sin conocer los
símbolos siguientes y sin error-. En un código singular el error es evidente cuando
interpretamos la secuencia x1x2...xm correspondiente a las (por lo menos) dos palabras
código iguales.
Por ejemplo C=[a,b,a] con la secuencia x1=a; si bien no hay necesidad de saber los
símbolos siguientes, la secuencia se puede interpretar erróneamente como w1 (cuando en
realidad corresponde asociar a w3) o bien erróneamente como w3 (cuando en realidad
corresponde asociar a w1).
27
EXTENSIÓN DE ORDEN n DE UN CÓDIGO
La extensión de orden n de un código C, denotada por Cn, es otro código que se obtiene
del código original según se indica a continuación.
El código Cn (extensión de orden n del código C) tiene qn palabras código, que continúan
siendo secuencias de símbolos del alfabeto (del) código. Lo denotamos así:
Cn = {w1, w2, ... , wqn} donde wj = wj1wj2 ... wjn con wji ∈ C
Es decir, las palabras código de Cn son secuencias de n-palabras código de C.
Ejemplo: Para el código original C={w1,w2,w3}={0, 11, 00} (cuyo alfabeto es X={0,1})
28
PROPIEDADES DE LOS CÓDIGOS
Demostración:
Dem:
Como C no es libre de prefijos, entonces hay (por lo menos) una palabra código wi que es
prefijo de otra palabra código diferente wj, es decir, ∃wj wj=wi·v (con i≠j, v ∈ X*), siendo
X el alfabeto del código.
Cuando v=λ, entonces wj=wi (con i≠j), es decir, C es singular y por lo tanto no
instantáneo (ver página 27).
Cuando v≠λ, consideremos la secuencia x1x2...xm··· = wi··· (los puntos denotan que no
conocemos los siguientes símbolos, ni siquiera si los hay o no). Esta secuencia inicial
x1x2...xm no puede asociarse apresuradamente a wi sin la posibilidad de cometer un error,
debemos pues conocer si hay más símbolos o no, y si los hay cuáles son (por ejemplo si
hay más símbolos que forman la cadena v podríamos estar ante wj y no ante wi).
Así pues C no es instantáneo.
Dem:
Cuando se tiene una secuencia x1x2...xm = wi ··· (wi cualquier palabra código), entonces la
asociación instantánea de esta (sub)cadena a wi (y su decodificación como si) es
absolutamente lícita puesto que –por ser C libre de prefijos- ninguna otra palabra código
(diferente) tiene a wi como prefijo ( ∀wj wj≠wi·v -con i≠j, v ∈ X*-). Así pues, la
interpretación instantánea es buena, y puede continuar si aplicamos el mismo
razonamiento recurrentemente a los símbolos que siguen.
Luego, C es instantáneo.
Demostración:
Previamente demostraremos que
Si Cn no es instantáneo entonces C no es instantáneo.
Dem:
Cn no es instantáneo. Por el resultado 1), sabemos que Cn no es libre de prefijos, es
decir, ∃ wj=wh·v (con h≠j).wh es prefijo de wj. Por la forma de las palabras
código en Cn, eso mismo se puede indicar así:
∃ wj1wj2 ... wjn = wh1wh2 ... whn·v (con wji,whk ∈ C; h≠j)
29
Luego, debe suceder (cancelando las primeras palabras código a la izquierda y
derecha de la igualdad que sean idénticas, esto sólo para visualizar mejor) que
algún wji es prefijo de whi, o bien algún whk es prefijo de wjk , con la importante
condición de que hi≠ji, o bien que hk≠jk.
[Por ejemplo, con C={0,01}, tenemos
C2={00,001,010,0101} que no es instantáneo pues w1=00 es prefijo de
w2=001.
Como w2=w1w2=w1w1·1=w1·v (con v=1), cancelando el primer w1 (en
w1w2=w1w1·1) de manera que terminamos trabajando con ···w2=···w1·1
tenemos que w2 es prefijo de w1, o bien w1 es prefijo de w2 –en realidad
esto último, pues w1=0 y w2=01 (aquí hk=h2=1 y jk=j2=2)]
Pero entonces –en C- una palabra código es prefijo de otra palabra código
diferente.
Luego C no es libre de prefijos y, otra vez por el resultado 1), C no es instantáneo.
30
TEOREMA DE KRAFT
Sin embargo, w1=0 es prefijo de w2=01 lo que muestra que C no es libre de prefijos y por
lo tanto no es instantáneo.
Lo que pasa es que el enunciado no utiliza la palabra “es” sino “existe”. Es decir, que si la
desigualdad se cumple, existe un código C instantáneo.
El enunciado no debe utilizarse –a partir de un código C- para determinar instantaneidad
(como en el ejemplo citado). De hecho, no es necesario partir de un código, sino
solamente de longitudes l1, …, lq dadas.
Ejemplo:
Sean las longitudes l1, …, lq = 2,2,3,3,4 con q=5 y r =2. ¿Existe C instantáneo?
q
∑ r – li = 2– 2 + 2– 2 + 2– 3 + 2– 3 + 2– 4 ≤ 1 (luego existe C con tales li)
i =1
Nótese que la sumatoria en el ejemplo (y en general) siempre se puede reescribir así:
= 2·2– 2 + 2·2– 3 + 2– 4
= 0·2– 1 + 2·2– 2 + 2·2– 3 + 1·2– 4
= n1·2– 1 + n2·2– 2 + n3·2– 3 + n4·2– 4 con n1=0, n2=2, n3=2, n4=1
31
Esta desigualdad no es otra que:
“Despejando” nl queda:
1) nl ≤ r l - n1· r l–1 - n2 · r l–2 - … - n(l-1)· r
De 0 ≤ nl y (1) se tiene –por transitividad-
0 ≤ r l - n1· r l–1 - n2 · r l–2 - … - n(l-1)· r
… Si hacemos lo mismo para cada ni tenemos que … las tres últimas desigualdades son:
l-2) n3 ≤ r3 - n1· r2 – n2· r
l-1) n2 ≤ r2 - n1· r
l) n1 ≤ r
Dado que la hipótesis se asume cierta y estas desigualdades provienen de ella (utilizando y
realizando operaciones válidas), resulta que también son ciertas.
La demostración de Kraft, más que un código C r-ario concreto, lo que nos ofrece es una
idea –un esquema- de cómo construir dicho código junto a la argumentación de que tal
construcción producirá uno instantáneo. Y es como sigue:
32
Tiene Usted r símbolos en el alfabeto código X.
El mismo esquema se puede seguir hasta elegir las nl palabras código de longitud l.
Una aplicación común del esquema de construcción del código C en el teorema de Kraft
utiliza árboles como instrumento y puede verse en el siguiente ejemplo.
Luego, el teorema dice que sí existe un código C r-ario con esas longitudes.
33
Un camino que va de la raíz a un nodo hoja representa una palabra código.
Una vez elegida una palabra código, su rama ya no crece (lo señalamos -aquí- con un nodo
hoja cuadrado): para cuidar que esta palabra no sea prefijo de otra palabra código.
De la raiz expandimos el árbol en un nivel:
Hay una demostración alternativa encontrada en el paper de Nguyen Hung Vu (para r=2)
que aquí la generalizamos para cualquier r.
Lo interesante de esta demostración es que construye C explícitamente.
34
Repetimos el enunciado (en uno de los sentidos si … entonces …).
q
Si ∑ r – li ≤ 1 entonces existe un código instantáneo C r-ario con longitudes l1, …, lq
i =1
Demostración:
Sin pérdida de generalidad se supone que l1 ≤ l2 ≤…≤ l(q-1) ≤ lq (reordenando si es
necesario).
Construimos las q palabras código de C en dos fases.
Fase I. Construcción de q números.
v1 = 0
j −1
vj = ∑ r lj – li (para j=2,…,q)
i =1
Fase II. Construcción de q palabras código.
wj es la representación r-aria de vj
añadiendo ceros a la izquierda cuando sea necesario, es decir,
cuando el número de símbolos de la representación r-aria de vj sea < lj
Construyamos C: Construyamos C:
Fase I: Fase II: Fase I: Fase II:
v1 = 0 w1 = 00 v1 = 0 w1 = 00
v2 = 1 w2 = 01 v2 = 1 w2 = 01
v3 = 4 w3 = 100 v3 = 6 w3 = 020
v4 = 5 w4 = 101 v4 = 7 w4 = 021
v5 = 12 w5 = 1100 v5 = 24 w5 = 0220
Los ceros en negrita son los que se Los ceros en negrita son los que se
añadieron a la izquierda. añadieron a la izquierda.
35
log2(8) = log2(23) = 3
Si 23 ≤ num < 24
cualquier número (num) entre 8 y 15 requiere 3+1 = 4
símbolos para su representación 2-aria
Por ej.
(8)2 = 1000 (10)2 = 1010 (15)2 = 1111
log2(8) = 3.0 log2(10) = 3.321 log2(15) = 3.9
log2(16) = log2(24) = 4
log2(16) = log2(24) = 4
Si 24 ≤ num < 25
cualquier número (num) entre 16 y 31 requiere 4+1 = 5
símbolos para su representación 2-aria
Por ej.
(16)2 = 10000 (22)2 = 10110 (31)2 = 11111
log2(16) = 4.0 log2(22) = 4.459 log2(31) = 4.954
log2(32) = log2(25) = 5
log3(9) = log3(32) = 2
Si 32 ≤ num < 33
cualquier número (num) entre 9 y 26 requiere 2+1 = 3
símbolos para su representación 3-aria
Por ej.
(9)3 = 100 (17)3 = 122 (26)3 = 222
log3(9) = 2.0 log3(17) = 2.578 log3(26) = 2.965
log3(27) = log3(33) = 3
36
a) Es lógico pensar que lj > 0 (no hay palabras código de longitud cero), es decir,
1 ≤ lj (para j=1,…,q)
Es evidente que |número de símbolos para la representación r-aria de v1| ≤ l1
j −1
= logr (r lj ) + logr ( ∑ r – li ) Logaritmo de un producto
i =1
j −1
= lj + logr ( ∑ r – li ) Obvio
i =1
(4) logr (vj) < lj
En efecto,
j −1
logr (vj) = lj + logr ( ∑ r – li) Por (3)
i =1
j −1
< lj Pues logr ( ∑ r – li) < 0 por (2)
i =1
(5) Se sabe que [y] ≤ y
(6) [logr (vj)] < lj Por (5) y (4)
Luego,
(7) [logr (vj)] + 1 ≤ lj Pues si y < z, entonces y+1 ≤ z
en los enteros
Es decir,
| número de símbolos para la representación r-aria de vj | ≤ lj
37
El inciso a) muestra que el procedimiento tiene sentido cuando añade ceros a la izquierda
si es necesario; y que las longitudes lj son suficientes para albergar a las palabras código
wj (es decir, nunca faltará espacio).
38
Luego wj no puede ser prefijo de wk evidentemente.
Es decir, para que wj sea prefijo de wk, la cantidad de ceros añadidos a la izquierda (si es
el caso) debe coincidir en ambas palabras código. Esto puede visualizarsese así:
wj = 0.…...0(vj)r (vj)r es la representación r-aria de vj
wk = 0……0(vk)r (vk)r es la representación r-aria de vk
Es decir, para que wj sea prefijo de wk debe ser que (vj)r es prefijo de (vk)r
k −1
= ( r lj – lk ) · ( ∑ r lk – li ) Sube el denominador al numerador
i =1
k −1
= ∑ r lk – li · r lj – lk Introducimos r lj – lk a la sumatoria
i =1
k −1
= ∑ r lj – li Obvio
i =1
j −1 k −1
= ∑ r lj – li + ∑
i= j
r lj – li Pues j<k
i =1
j −1 j k −1
= ∑ r lj – li + ∑ r lj – li +
i= j
∑ r lj – li Obvio (véase bien los rangos de i)
i =1 i = j +1
j −1 k −1
= ∑ r lj – li + r lj – lj + ∑ r lj – li Obvio
i =1 i = j +1
j −1 k −1
= ∑ r lj – li + 1 + ∑ r lj – li Obvio
i =1 i = j +1
(3) [y] +1 > y Obvio
(4) [vk / r lk – lj ] + 1 > vk / r lk – lj Por (3)
(5) vj + 1 > vk / r lk – lj Pues vj = [vk / r lk – lj] y
de (4)
39
j −1 k −1
(6) vj + 1 > ∑ r lj – li + 1 + ∑ r lj – li Por (2)
i =1 i = j +1
j −1 k −1 j −1 k −1
(7) ∑ r lj – li + 1 + ∑ r lj – li ≥ ∑ r lj – li + 1 Pues ∑ r lj – li puede ser vacua
i =1 i = j +1 i =1 i = j +1
j −1 k −1 j −1
(8) vj + 1 > ∑ r lj – li + 1 + ∑ r lj – li ≥ ∑ r lj – li + 1 Juntando (6) y (7)
i =1 i = j +1 i =1
j −1
(9) vj + 1 > ∑ r lj – li + 1 De (8)
i =1
j −1
(10) vj + 1 > vj + 1 Pues vj = ∑ r lj – li
i =1
Lo que es claramente una contradicción.
Así pues nuestro supuesto debe estar errado (wj es prefijo de wk), y el enunciado “ningún
wj es prefijo de otro wk (2 ≤ j < k ≤ q)” es cierto.
Por b1) y b2) C es libre de prefijos, es decir, instantáneo.
40
TEOREMA DE McMILLAN
q
Sea K = ∑ r – li
i =1
Trabajaremos con Kn para n>0
q
¿ Cómo podemos reescribir K = ( ∑ r – li)n ?
n
i =1
Un ejemplo aclarará nuestra reescritura:
(r –l1 + r –l2 + r –l3 + r –l4)3
= (r –l1 + r -l2 + r -l3 + r -l4) · (r -l1 + r -l2 + r -l3 + r -l4) · (r -l1 + r -l2 + r -l3 + r -l4)
=
r -l1·r -l1·(r -l1 + r -l2 + r -l3 + r -l4) + r –l2·r -l1·(r -l1 + r -l2 + r -l3 + r -l4)
+ r -l1·r -l2·(r -l1 + r -l2 + r -l3 + r -l4) + r –l2·r -l2·(r -l1 + r -l2 + r -l3 + r -l4)
+ r -l1·r -l3 ·(r -l1 + r -l2 + r -l3 + r -l4) + r –l2·r -l3·(r -l1 + r -l2 + r -l3 + r -l4)
+ r -l1·r -l4·(r -l1 + r -l2 + r -l3 + r -l4) + r –l2·r -l4·(r -l1 + r -l2 + r -l3 + r -l4)
+ r –l3·r -l1·(r -l1 + r -l2 + r -l3 + r -l4) + r –l4·r -l1·(r -l1 + r -l2 + r -l3 + r -l4)
+ r –l3·r -l2·(r -l1 + r -l2 + r -l3 + r -l4) + r –l4·r -l2·(r -l1 + r -l2 + r -l3 + r -l4)
+ r –l3·r -l3·(r -l1 + r -l2 + r -l3 + r -l4) + r –l4·r -l3·(r -l1 + r -l2 + r -l3 + r -l4)
+ r –l3·r -l4·(r -l1 + r -l2 + r -l3 + r -l4) + r –l4·r -l4·(r -l1 + r -l2 + r -l3 + r -l4)
41
= r -l1·r -l1·r -l1 + r -l1·r -l1·r –l2 + r -l1·r -l1·r –l3 + r -l1·r -l1·r –l4
+ r -l1·r –l2·r -l1 + r -l1·r –l2·r –l2 + r -l1·r –l2·r –l3 + r -l1·r –l2·r –l4
+ r -l1·r –l3·r -l1 + r -l1·r –l3·r –l2 + r -l1·r –l3·r –l3 + r -l1·r –l3·r –l4
+ r -l1·r –l4·r -l1 + r -l1·r –l4·r –l2 + r -l1·r –l4·r –l3 + r -l1·r –l4·r –l4
+ r –l2·r -l1·r -l1 + r –l2·r -l1·r –l2 + r –l2·r -l1·r –l3 + r –l2·r -l1·r –l4
+ r –l2·r –l2·r -l1 + r –l2·r –l2·r –l2 + r –l2·r –l2·r –l3 + r –l2·r –l2·r –l4
+ r –l2·r –l3·r -l1 + r –l2·r –l3·r –l2 + r –l2·r –l3·r –l3 + r -l2·r –l3·r –l4
+ r –l2·r –l4·r -l1 + r –l2·r –l4·r –l2 + r –l2·r –l4·r –l3 + r –l2·r –l4·r –l4
+ r –l3·r -l1·r -l1 + r –l3·r -l1·r –l2 + r –l3·r -l1·r –l3 + r –l3·r -l1·r –l4
+ r –l3·r –l2·r -l1 + r –l3·r –l2·r –l2 + r –l3·r –l2·r –l3 + r –l3·r –l2·r –l4
+ r –l3·r –l3·r -l1 + r –l3·r –l3·r –l2 + r –l3·r –l3·r –l3 + r –l3·r –l3·r –l4
+ r –l3·r –l4·r -l1 + r –l3·r –l4·r –l2 + r –l3·r –l4·r –l3 + r –l3·r –l4·r –l4
+ r –l4·r -l1·r -l1 + r –l4·r -l1·r –l2 + r –l4r -l1·r –l3 + r –l4·r -l1·r –l4
+ r –l4·r –l2·r -l1 + r –l4·r –l2·r –l2 + r –l4·r –l2·r –l3 + r –l4·r –l2·r –l4
+ r –l4·r –l3·r -l1 + r –l4·r –l3·r –l2 + r –l4·r –l3·r –l3 + r –l4·r –l3·r –l4
+ r –l4·r –l4·r -l1 + r –l4·r –l4·r –l2 + r –l4·r –l4·r –l3 + r –l4·r –l4·r –l4
42
4 4 4
= ∑ ∑ ∑ r –(li1+li2+li3)
i1=1 i 2=1 i 3=1
q n· l
Es decir, K = ( ∑ r – li)n =
n
∑ Ni · r –i
i =1 i =n
Nótese que en la última sumatoria, la variable i va desde n pues suponiendo que todos los
lij = 1, entonces r –(li1+ … +lin) = r –(1+ … +1) = r –n. Que es el caso más pequeño.
En cambio, i va hasta n·l pues suponiendo que todos los lij = l, entonces
r –(li1+ … +lin) = r –(l+ … +l) = r –n·l. Que es el caso más grande.
Por otro lado, sabemos –por hipótesis del enunciado- que el código C existe, es r-ario y
sus palabras código tienen longitudes l1, …, lq. Es interesante -y útil- observar qué sucede
con su extensión n-ésima, es decir, con Cn (en particular con las longitudes de las palabras
código de esta extensión).
43
w1 w1 w1 | l1 + l1 + l1 w2 w1 w1 | l2 + l1 + l1 w3 w1 w1 | l3 + l1 + l1 w4 w1 w1 | l4 + l1 + l1
w1 w1 w2 | l1 + l1 + l2 w2 w1 w2 | l2 + l1 + l2 w3 w1 w2 | l3 + l1 + l2 w4 w1 w2 | l4 + l1 + l2
w1 w1 w3 | l1 + l1 + l3 w2 w1 w3 | l2 + l1 + l3 w3 w1 w3 | l3 + l1 + l3 w4 w1 w3 | l4 + l1 + l3
w1 w1 w4 | l1 + l1 + l4 w2 w1 w4 | l2 + l1 + l4 w3 w1 w4 | l3 + l1 + l4 w4 w1 w4 | l4 + l1 + l4
w1 w2 w1 | l1 + l2 + l1 w2 w2 w1 | l2 + l2 + l1 w3 w2 w1 | l3 + l2 + l1 w4 w2 w1 | l4 + l2 + l1
w1 w2 w2 | l1 + l2 + l2 w2 w2 w2 | l2 + l2 + l2 w3 w2 w2 | l3 + l2 + l2 w4 w2 w2 | l4 + l2 + l2
w1 w2 w3 | l1 + l2 + l3 w2 w2 w3 | l2 + l2 + l3 w3 w2 w3 | l3 + l2 + l3 w4 w2 w3 | l4 + l2 + l3
w1 w2 w4 | l1 + l2 + l4 w2 w2 w4 | l2 + l2 + l4 w3 w2 w4 | l3 + l2 + l4 w4 w2 w4 | l4 + l2 + l4
w1 w3 w1 | l1 + l3 + l1 w2 w3 w1 | l2 + l3 + l1 w3 w3 w1 | l3 + l3 + l1 w4 w3 w1 | l4 + l3 + l1
w1 w3 w2 | l1 + l3 + l2 w2 w3 w2 | l2 + l3 + l2 w3 w3 w2 | l3 + l3 + l2 w4 w3 w2 | l4 + l3 + l2
w1 w3 w3 | l1 + l3 + l3 w2 w3 w3 | l2 + l3 + l3 w3 w3 w3 | l3 + l3 + l3 w4 w3 w3 | l4 + l3 + l3
w1 w3 w4 | l1 + l3 + l4 w2 w3 w4 | l2 + l3 + l4 w3 w3 w4 | l3 + l3 + l4 w4 w3 w4 | l4 + l3 + l4
w1 w4 w1 | l1 + l4 + l1 w2 w4 w1 | l2 + l4 + l1 w3 w4 w1 | l3 + l4 + l1 w4 w4 w1 | l4 + l4 + l1
w1 w4 w2 | l1 + l4 + l2 w2 w4 w2 | l2 + l4 + l2 w3 w4 w2 | l3 + l4 + l2 w4 w4 w2 | l4 + l4 + l2
w1 w4 w3 | l1 + l4 + l3 w2 w4 w3 | l2 + l4 + l3 w3 w4 w3 | l3 + l4 + l3 w4 w4 w3 | l4 + l4 + l3
w1 w4 w4 | l1 + l4 + l4 w2 w4 w4 | l2 + l4 + l4 w3 w4 w4 | l3 + l4 + l4 w4 w4 w4 | l4 + l4 + l4
Nótese que son las mismas expresiones que aparecen en los exponentes de:
q q q
Kn = ( ∑ r – li)n = ∑ … ∑ r –(li1+ … +lin)
i =1 i1=1 in=1
44
Lo contrario (Ni > ri), dado que sólo existen ri diferentes palabras código de longitud i,
significaría que se repiten palabras, es decir, que Cn es singular, lo que no es posible.
Luego,
n· l n· l
Kn = ∑
i =n
Ni · r –i ≤ ∑
i =n
r i · r –i Pues Ni ≤ ri
n· l n· l n· l
= ∑
i =n
r i–i = ∑
i =n
r0 = ∑
i =n
1 Obvio
= n· l - n + 1 Obvio
Es decir,
q
( ∑ r – li)n = Kn ≤ n· l - n + 1 y como n· l - n + 1≤ n· l, entonces
i =1
q
( ∑ r – li)n = Kn ≤ n· l
i =1
Una función exponencial (de n) menor o igual que una funcion lineal (de n).
La única forma de que ello suceda es cuando la raíz del exponente es ≤ 1, es decir:
q
∑ r – li ≤ 1.
i =1
Que es lo que queríamos demostrar.
45
Hemos demostrado:
1) Si existe un código unívocamente decodificable C r-ario con longitudes l1, …, lq
q
entonces ∑ r – li ≤ 1 [McMillan]
i =1
q
2) Si ∑ r – li ≤ 1
i =1
entonces existe un código instantáneo C r-ario con longitudes l1, …, lq [Kraft]
3) Si C es un código instantáneo entonces C es unívocamente decodificable [página 29]
Lícitamente podemos reescribir 3 como:
3') Si ∃ C un código instantáneo entonces ∃ C unívocamente decodificable
Finalmente,
46
Una propiedad muy útil es la siguiente:
ln(x) ≤ x-1 (dándose la igualdad en x=1)
47
LEMA DE GIBBS
Si {x1, ..., xq}, {y1, ..., yq} son dos conjuntos de números tales que
q q
xi ≥ 0, yi ≥ 0 además que ∑ xi = 1, ∑ yi = 1
i =1 i =1
Entonces
q q
∑ xi· ln(1/xi) ≤ ∑ xi· ln(1/yi)
i =1 i =1
Demostración:
q q
∑ xi· ln(1/xi) - ∑ xi· ln(1/yi)
i =1 i =1
q
= ∑ [ xi· ln(1/xi) - xi· ln(1/yi) ] propiedades de sumatoria
i =1
q
= ∑ xi · [ ln(1/xi) - ln(1/yi) ] factorizando xi
i =1
q
= ∑ xi · [ ln( (1/xi) / (1/yi) )] ln(a/b) = ln a - ln b
i =1
q
= ∑ xi · [ ln(yi /xi)] medios con medios, extremos con extremos
i =1
q
≤ ∑ x i · [yi/xi - 1] pues ln(z) ≤ z -1 (igualdad en z=1) (aquí z= yi/xi)
i =1
q
= ∑ [ yi - xi ] distribuyendo xi
i =1
q q
= ∑ yi - ∑ xi 'desdoblando' la sumatoria
i =1 i =1
= 1 - 1 por los supuestos del lema
= 0
Resumiendo:
q q
∑ xi· ln(1/xi) - ∑ xi· ln(1/yi) ≤ 0
i =1 i =1
q q
Es decir, ∑ xi· ln(1/xi) ≤ ∑ xi· ln(1/yi)
i =1 i =1
48
PROPIEDADES DE LA ENTROPÍA
2) Hr(S) ≤ logr(q)
Demostración:
Sean xi = pi , yi = 1/q
q q
Es claro que xi ≥ 0, yi ≥ 0 además que ∑ xi = 1, ∑ yi = 1
i =1 i =1
Es decir, los supuestos de Gibbs se mantienen y podemos aplicar el lema. Luego,
q q
∑ pi · ln(1/pi) ≤ ∑ pi · ln(q) O su equivalente:
i =1 i =1
q q
∑ pi · logr(1/pi) /logr(e) ≤ ∑ pi · logr(q) /logr(e) pues ln(z)=logr(z)/logr(e)
i =1 i =1
q q
∑ pi · logr(1/pi) ≤ ∑ pi · logr(q) cancelando logr(e) (logr(e)>0)
i =1 i =1
q
Hr(S) ≤ ∑ pi · logr(q) por definición de entropía
i =1
q
Hr(S) ≤ logr(q) ∑ pi pues logr(q) no depende de i
i =1
Hr(S) ≤ logr(q) pues la sumatoria es igual a 1
Juntando los dos resultados anteriores tenemos los límites o el rango de la entropía:
0 ≤ Hr(S) ≤ logr(q)
49
H(Sn) = n·H(S)
Demostración:
Sea la Fuente-Sn (extensión de orden n de la Fuente-S) con alfabeto Sn = {σ1, σ2, ... , σqn},
donde σj = sj1 sj2 ... sjn con sji ∈ S.
j=1
qn
= ∑ [pj1 · ... · pjn ] · [logr 1/pj1 · ... · pjn] pues prob(σj) = prob(sj1 sj2 ... sjn)
j=1
= prob(sj1) · ... · prob(sjn)
= pj1 · ... · pjn
Nótese que esta sumatoria recorre las probabilidades de cada uno de los símbolos de Sn:
p1 · ... · p1 · p1 (n veces); p1· ... · p1 · p2; etcétera hasta llegar a pq · ... · pq · pq (n veces).
q q
=∑ … ∑ [pi1 · pi2 · ... · pin ] · logr(1/pi1 ) distribuyendo el primer corchete
i1=1 in =1
q q
+∑ … ∑ [pi1 · pi2 · ... · pin ] · logr(1/pi2) e introduciendo las
i1=1 in =1
... sumatorias
q q
+∑ … ∑ [pi1 · pi2 · ... · pin ] · logr(1/pin)
i1=1 in =1
Que cada uno de los n sumandos sea igual a entropía de la fuente original, puede verse con
el siguiente razonamiento para dos de ellos:
50
Caso i1:
q q
∑ … ∑ [pi1 · pi2 · ... · pin ] · logr(1/pi1)
i1=1 in=1
q q
=∑ … ∑ [pi1 · logr(1/pi1)] · pi2 · ... · pin Obvio
i1=1 in =1
q q q
= ∑ [pi1 · logr(1/pi1)] ∑ … ∑ pi2 · ... · pin Pues i1 no depende de i2,..., in
i1=1 i 2=1 in=1
q q q q
= ∑ [pi1 · logr(1/pi1)] ∑ pi2 ∑ pi 3 … ∑ pin Obvio
i1=1 i 2=1 i3=1 in =1
q
= ∑ [pi1 · logr(1/pi1)] · 1 Cada sumatoria es igual a 1.
i1=1
= H(S) Obvio
Caso in:
q q
∑ … ∑ [pi1 · pi2 · ... · pin ] · logr(1/pin)
i1=1 in=1
q q
=∑ … ∑ pi1 · ... · pin-1 · [pin · logr(1/pin)] Obvio
i1=1 in =1
q q q
=∑ … ∑ pi1 · ... · pin-1 ∑ pin · logr(1/pin) Pues i1,...,in-1 no dependen de in
i1=1 i ( n−1)=1 in=1
q q q q
= ∑ pi1 ∑ pi2 … ∑ pin-1 ∑ pin · logr(1/pin) Obvio
i1=1 i 2=1 i ( n−1)=1 in=1
q q q
= ∑ pi1 ∑ pi2 … ∑ pin-1 · H(S) Obvio
i1=1 i 2=1 i ( n−1)=1
q q q
= H(S) · ∑ pi1 ∑ pi2 … ∑ pin-1 Obvio
i1=1 i 2=1 i ( n−1)=1
= H(S) · 1 Cada sumatoria es igual a 1.
= H(S) Obvio
51
En una fuente con memoria o de Markov.
Sea Fuente-M una fuente de Markov de orden m. Sea M la fuente afín.
1) Hr (M) ≤ Hr ( M )
Demostración:
q
Por otro lado, Hr ( M ) = ∑ prob(si) · logr (1/prob(si)) r-its
i =1
qm qm
Donde prob(si) = pi = ∑ p(si /αj) · wj = ∑ wj · p(si /αj)
j =1 j =1
q qm
Es decir, Hr ( M ) = ∑ [ ∑ wj · p(si /αj) ] · logr (1/prob(si))
i =1 j =1
q qm
=∑ ∑ wj · p(si /αj) · logr (1/prob(si)) r-its
i =1 j =1
Entonces,
Hr (M) - Hr ( M )
q qm
=∑ ∑ wj · p(si / αj) · logr (1/ p(si / αj))
i =1 j =1
-
q qm
∑ ∑ wj · p(si /αj) · logr (1/prob(si)) luego, 'juntando' las sumatorias
i =1 j =1
52
q qm
=∑ ∑ [ wj · p(si / αj) · logr (1/ p(si/αj)) - wj · p(si /αj) · logr (1/prob(si)) ]
i =1 j =1
q qm
=∑ ∑ wj · p(si /αj) · [ logr (1/ p(si/αj)) - logr (1/prob(si)) ] factorizando wj · p(si /αj)
i =1 j =1
q qm
=∑ ∑ wj · p(si /αj) · logr [ (1/ p(si/αj)) / ( 1/prob(si) ) ] log de un cociente
i =1 j =1
q qm
=∑ ∑ wj · p(si /αj) · logr [prob(si)/p(si/αj)] medios con medios, etc.
i =1 j =1
q qm
= [1/ln(r)] · ∑ ∑ wj · p(si /αj) · ln[prob(si)/p(si/αj)] pues logr(z)= ln(z)/ln(r)
i =1 j =1
q qm
≤ [1/ln(r)] · ∑ ∑ wj · p(si /αj) · [prob(si)/p(si/αj) - 1] pues ln(z) ≤ z-1
i =1 j =1
q qm
= [1/ln(r)] · ∑ ∑ [ wj · prob(si) - wj · p(si /αj) ] distribuyendo wj · p(si /αj)
i =1 j =1
q qm q qm
= [1/ln(r)] · [ ∑ ∑ wj · prob(si) - ∑ ∑ wj · p(si /αj) ] obvio
i =1 j =1 i =1 j =1
q qm q qm
= [1/ln(r)] · [ ∑ prob(si) ∑ wj - ∑ ∑ wj · p(si /αj) ] prob(si) no depende de j
i =1 j =1 i =1 j =1
q q qm qm
= [1/ln(r)] · [ ∑ prob(si) [ 1 ] - ∑ ∑ wj · p(si /αj) ] pues ∑ wj =1
i =1 i =1 j =1 j =1
q q qm
= [1/ln(r)] · [ ∑ prob(si) - ∑ ∑ wj · p(si /αj) ] obvio
i =1 i =1 j =1
q q
= [1/ln(r)] · [ ∑ prob(si) - ∑ prob(si) ] cálculo de prob(si)
i =1 i =1
=0 obvio
Resumiendo,
Hr (M) - Hr ( M ) ≤ 0, es decir:
Hr (M) ≤ Hr ( M )
La entropía de la fuente afín (de memoria nula) M , de una Fuente-M (de Markov)
siempre es mayor o igual que la entropía de la Fuente-M.
53
L(C), LONGITUD MEDIA DE UN CÓDIGO Y CÓDIGO COMPACTO
Sea una Fuente-S (de memoria nula). Sea C un código asociado a ella, se define la
longitud media del código C así:
q
L(C) = ∑ pi · li
i =1
Aunque no está prohibido usar L(C) para cualquier código es usual trabajar sólo con
códigos no singulares (e incluso sólo con códigos unívocamente decodificables o
instantáneos).
Ejemplo:
Fuente-S = ( {s1, s2, s3}, {1/3, 1/3, 1/3} )
C = {w1, w2, w3} = {1, 01, 001} con X={0,1}
Es claro que l1=1, l2=2, l3=3
3
Luego, L(C) = ∑ pi · li = 1/3 · 1 + 1/3 · 2 + 1/3 · 3 = 1/3 · (1+2+3) =1/3 · 6 = 6/3 = 2
i =1
Nótese que cuando la Fuente-S es una fuente de memoria nula equiprobable, entonces:
q q q
L(C) = ∑ pi · li = ∑ 1/q · li = 1/q · ∑ li
i =1 i =1 i =1
Para el ejempo anterior -en el que C es instantáneo- es claro que C no es compacto pues:
D = {w1, w2, w3} = {1, 00, 01} con X={0,1}
Es un código instantáneo tal que l1=1, l2=2, l3=2
3
Luego, L(D) = ∑ pi · li = 1/3 · 1 + 1/3 · 2 + 1/3 · 2 = 1/3 · (1+2+2) =1/3 · 5 = 5/3
i =1
54
OTRAS PROPIEDADES DE LOS CÓDIGOS INSTANTÁNEOS COMPACTOS
Demostración:
A partir de C, construyamos otro código C' intercambiando las palabras código asociadas
al símbolo si y al símbolo sj (el resto de las palabras código se copian; la siguiente tabla
clarifica esta construcción)
S pi C C'
s1 p1 w1 w'1 = w1
... ... ... ...
si pi wi w'i = wj
... ... ... ...
sj pj wj w'j = wi
... ... ... ...
sq pq wq w'q = wq
= pi · li + pj · lj obvio
- pi · lj - pj · li
= pi · li - pi · lj + pj · lj - pj · li reescribiendo
= pi · (li - lj) + pj · (lj - li) factorizando
= pi · (li - lj) - pj · (li - lj) obvio
= (pi - pj) · (li - lj) factorizando
> 0 pi > pj, o sea (pi - pj) > 0
li > lj, o sea (li - lj) > 0
Es decir, L(C) - L(C') > 0
Es decir, L(C) > L(C')
Es decir, C no es compacto. Lo que es una contradicción.
Ello muestra que nuestro supuesto es erróneo y que li ≤ lj
55
Sin embargo, el siguiente enunciado si es verdadero:
Demostración:
Cuando pi > pj en la página anterior se muestra que li ≤ lj, el resultado sigue con C' = C.
En cambio, cuando pi = pj sólo existen dos posibilidades:
a) Que li ≤ lj en este caso el resultado sigue con C' = C
b) Que li > lj en este caso construimos C' -a partir de C- intercambiando las palabras
código asociadas al símbolo si y al símbolo sj (el resto de las palabras código se copian).
Es claro que C' sigue siendo instantáneo (pues C lo es, y C' tiene las mismas palabras
código de C). Veamos qué sucede con las longitudes medias de C y C':
L(C) = p1 · l1 + ... + pi · li + ...+ pj · lj + ... + pq · lq
L(C') = p1 · l1 + ... + pi · lj + ...+ pj · li + ... + pq · lq
Dado que pi = pj, es evidente que L(C') = L(C), y como C es compacto es claro que C' es
también compacto.
Demostración:
Dado que pq-1 ≥ pq sucede que lq-1 ≤ lq. Supongamos que lq-1 < lq
C es libre de prefijos, pues es instantáneo. wq es la palabra código más larga de C, |wq| = lq
Es lícito suponer que wq = va ( 'a' un símbolo de X -el alfabeto código de C-; v∈X* )
Construyamos el código C' así:
w'j = wj (j=1,...,q-1)
w'q = v
Ningún w'j = v, lo que haría a C' singular, pues C es libre de prefijos.
Es decir, C' aún es instantáneo.
Pero L(C') - L(C) = p1 · l1 + ... + pi · li + ...+ pj · lj + ... + pq · (lq - 1)
- [p1 · l1 + ... + pi · li + ...+ pj · lj + ... + pq · lq]
= pq · (lq - 1) - pq · lq
= pq · lq - pq - pq · lq
= - pq
< 0 pues pq > 0
Es decir, L(C') < L(C). Es decir, C no es compacto (pero C sí es compacto).
Contradicción que muestra lo erróneo del supuesto y que lq-1 = lq
56
Sea X={a,a'} el alfabeto código de un código binario C (por ej. a=0, a'=1).
Se dice que dos palabras código wi,wj son mellizas cuando wi=va y wj=va'
Es decir, cuando difieren en el último símbolo (bit).
Demostración:
Los anteriores resultados muestran que -a partir de C- se puede construir un código tal que
cuando p1 ≥ p2 ≥ ... ≥ pq-1 ≥ pq sucede que l1 ≤ l2 ≤ ... ≤ lq-1 ≤ lq
De manera que, sin pérdida de generalidad, se puede suponer que C ya es así.
57
RELACIONES ENTRE Hr(S) y L(C)
Si C es un código r-ario unívocamente decodificable (instantáneo) asociado a la Fuente-S
Entonces Hr(S) ≤ L(C)
Demostración:
q q
Hr(S) - L(C) = ∑ pi · logr(1/pi) - ∑ pi · li
i =1 i =1
q q
= ∑ pi · logr(1/pi) - ∑ pi · logr(r li ) exponencial y log son inversas
i =1 i =1
q
= ∑ [ pi · logr(1/pi) - pi · logr(r li ) ] 'uniendo' las sumatorias
i =1
q
= ∑ pi · [ logr(1/pi) - logr(r li ) ] factorizando pi
i =1
q
= ∑ pi · logr(1/pi / r li ) log(a/b) = log a - log b
i =1
q
= ∑ pi · logr(1 / (pi · r li ) ) medios con medios, etc.
i =1
q
= [1/ln(r)] · ∑ pi · ln(1 / (pi · r li ) ) pues logr(z)= ln(z)/ln(r)
i =1
q
≤ [1/ln(r)] · ∑ pi · [1 / (pi · r li ) - 1] pues ln(z) ≤ z-1
i =1
q
= [1/ln(r)] · ∑ [ 1 / r li - pi ] distribuyendo pi
i =1
q q
= [1/ln(r)] · [ ∑ 1/r li
- ∑ pi ] introduciendo la sumatoria
i =1 i =1
q q
= [1/ln(r)] · [ ∑ r – l i - ∑ pi ] obvio
i =1 i =1
q
= [1/ln(r)] · [ ∑ r – l i - 1 ] obvio
i =1
≤0
q
Pues ∑ r – l i ≤ 1 ya que como C es unívocamente decodificable (o instantáneo) el
i =1
teorema de McMillan (o Kraft) garantiza esto. Así pues Hr(S) - L(C) ≤ 0, es decir:
Hr(S) ≤ L(C).
q
La igualdad se da cuando [1 / (pi · r )] = 1 y li
∑ r – l i = 1. Pero cuando pi = r – l i,
i =1
despejando li se verifica la igualdad cuando li=logr(1/pi), pues la segunda condición
q q
∑ r –li
= ∑ pi =1 se cumple siempre. Para tener sentido logr(1/pi) debe ser un entero.
i =1 i =1
58
Eficiencia y redundancia de un código unívocamente decodificable (o instantáneo) C)
La eficiencia de C será máxima cuando L(C)= Hr(S), que como vimos sólo sucede cuando
li=logr(1/pi) [con logr(1/pi) entero].
O, lo que es lo mismo cuando pi = r – l i =( 1/ r l i )=(1/r)l i [para enteros li].
A las Fuentes-S que cumplen esta característica algunos las llaman especiales.
Ej.: Fuente-S=({ s1 , s2 , s3 },{1/2, 1/4, 1/4}) C={0,10,11} X={0,1} r=2
Demostración:
Por el anterior resultado sabemos que, para cualquier código D r-ario unívocamente
decodificable (ó instantáneo), Hr(S)=L(D) cuando li=logr(1/pi) , con logr(1/pi) un entero.
Este mejor caso sólo es posible en fuentes especiales.
Sin embargo, dada la Fuente-S, podemos construir el código C empezando por definir sus
longitudes lo más cercanas posibles al mejor caso , así:
li=techo[logr(1/pi)], es decir, li es el único entero tal que
logr(1/pi) ≤ li < logr(1/pi) + 1
Elegidas las longitudes li de esta manera es obvio que se cumple: logr(1/pi) ≤ li
Por lo tanto -despejando pi- se cumple: pi ≥ r – l i, o lo que es lo mismo, r – l i ≤ pi
Así pues:
r – l 1 ≤ p1
...
r – l q ≤ pq
Sumando los lados izquierdos (y derechos) en las desigualdades (preservando el sentido ≤)
q q q
∑ r –li ≤ ∑ pi = 1, es decir, ∑ r –li ≤ 1
i =1 i =1 i =1
Por lo tanto, el teorema de McMillan (Kraft) nos asegura que con las longitudes así
elegidas existe un código C r-ario unívocamente decodificable (instantáneo).
Podemos seguir construyendo este código C utilizando árboles, la segunda versión del
teorema de Kraft o cualquier otro mecanismo.
Concentrémonos sin embargo en
logr(1/pi) ≤ li < logr(1/pi) + 1 multiplicando cada miembro por pi resulta
pi · logr(1/pi) ≤ pi · li < pi · logr(1/pi) + pi · 1
Así pues:
p1 · logr(1/p1) ≤ p1 · l1 < p1 · logr(1/p1) + p1 · 1
...
pq · logr(1/pq) ≤ pq · lq < pq · logr(1/pq) + pq · 1
59
Sumando uno a uno los miembros en las desigualdades, resulta:
q q q q
∑ pi · logr(1/pi) ≤ ∑ pi · li < ∑ pi · logr(1/pi) + ∑ pi · 1
i =1 i =1 i =1 i =1
Que no es otra cosa que.
Hr(S) ≤ L(C) < Hr(S) + 1
Que es lo que queríamos demostrar.
Demostración:
1) Sea C el código del anterior resultado, por tanto: Hr(S) ≤ L(C) < Hr(S) + 1, es decir,
2) L(C) < Hr(S) + 1
3) Dado que D es compacto entonces L(D) ≤ L(C)
4) Además sabemos que Hr(S) ≤ L(D)
5) De 3 y 4: Hr(S) ≤ L(D) ≤ L(C)
6) De 2 y 5: Hr(S) ≤ L(D) ≤ L(C) < Hr(S) + 1
Es decir, Hr(S) ≤ L(D) < Hr(S) + 1
60
EL PRIMER TEOREMA DE SHANNON
TEOREMA DE LA CODIFICACIÓN SIN RUIDO
Sea Fuente-S una fuente de memoria nula. Y llamemos a su extensión n-ésima Fuente-Sn.
Sea Dn un código compacto r-ario unívocamente decodificable (instantáneo) de dicha
extensión, con L(Dn) como su longitud media
Entonces es posible codificar la Fuente-S con un código cuya longitud media sea
arbitrariamente cercana a su entropía Hr(S).
Demostración:
Por el anterior resultado sabemos que:
Hr(Sn) ≤ L(Dn) < Hr(Sn) + 1 dado que Hr(Sn) = n·Hr(S), resulta:
n·Hr(S) ≤ L(Dn) < n·Hr(S) + 1 multiplicando cada miembro por 1/n resulta:
Hr(S) ≤ L(Dn)/n < Hr(S) + 1/n Luego:
lim L(Dn)/n = Hr(S)
n −> ∞
n
El resultado sigue si tomamos L(D )/n como la longitud media de un esquema de
codificación de la Fuente-S (basado en la codificación de su extensión n-ésima).
61
CONSTRUCCIÓN DE UN CÓDIGO C PARA UNA FUENTE-S
Códigos de Shannon.-
Aquí, dada la Fuente-S, sólo se ofrecen las longitudes de las palabras código de C.
Al demostrar que Hr(S) ≤ L(C) < Hr(S) + 1, hemos utilizado: li=techo[logr(1/pi)]
Ya vimos que el teorema de McMillan (Kraft) nos asegura que con las longitudes así
elegidas existe un código C r-ario unívocamente decodificable (instantáneo).
Ejemplo: Sea una Fuente-S la Fuente-S=({s1,s2,s3,s4,s5},{3/10,1/5,1/5,1/5,1/10}) r=2
l1 = techo[log2(10/3)] = techo[log2(3.3333333)] = techo[1.736965] = 2.
El resto de los li se halla de manera semejante: l2=3, l3=3, l4=3, l5=4.
Luego, sólo resta construir C con dichas longitudes (para ello podemos apelar a los
árboles, la segunda versión del teorema de Kraft o cualquier otro mecanismo).
Códigos de Fano.-
Sea la Fuente-S=({s1, ... ,sq},{p1, ... ,pq}) donde prob(si)=pi
Se construye un árbol r-ario donde el nodo raíz incluye todos los símbolos (cuyas
probabilidades suman 1).
Cada siguiente nivel del árbol se expande así:
Cada nodo (padre) tiene r nodos hijo, estos r nodos deben ser equiprobables (o casi
equiprobables). Es decir, los símbolos de cada nodo (padre) se reagrupan en r subgrupos (r
nodos hijo) equiprobables (o casi equiprobables).
Si en algún nivel un nodo tiene menos de r símbolos (es decir, no puede subdividirse en r
nodos), se acepta excepcionalmente el número de nodos hijo (menor a r) que pueda tener.
Si en algún nivel un nodo tiene un sólo símbolo, se detiene su crecimiento.
Finalmente, cuando todos los nodos hoja tienen un sólo símbolo:
Se etiquetan los hijos de cada nodo padre con los símbolos r-arios del alfabeto código (no
es necesario hacerlo en orden, pero se sugiere ello para homogeneizar los resultados):
Las palabras código de C resultan de concatenar dichos símbolos para cada camino entre
el nodo raíz y cada nodo hoja (palabra código que se la asigna al símbolo de la Fuente-S
que corresponde a dicho nodo hoja).
Ejemplo:
62
Para ciertas fuentes, puede existir más de una alternativa lícita de subdivisión en algún
nivel del árbol. Lo que da lugar a uno u otro código.
Eso se observa en el siguiente ejemplo (del libro de Togneri), que también sirve para
mostrar que un código de Fano, si bien es instantáneo no necesariamente es compacto.
C = { 00, 01, 100, 101, 110, 111} con L(C) = 22/9 En cambio:
C = { 0, 1000, 1001, 101, 110, 111 } con L(C) = 21/9 (este código es compacto)
63
Códigos de Huffman binarios.-
Supondremos que el alfabeto (del) código es X={0,1}
Sea Sj-1 una fuente de memoria nula (cuyos símbolos tienen sus probabilidades ordenadas
en forma decreciente).
Sean sα0 y sα1 los dos símbolos con menor probabilidad.
Sean prob(sα0)=pα0 y prob(sα1)=pα1
Fuente reducida.- Denominaremos fuente reducida (de Sj-1) a la fuente de memoria nula
Sj construida a partir de Sj-1 así:
Todos los símbolos -excepto sα0 y sα1- se copian con sus respectivas probabilidades.
sα0 y sα1 se agrupan en un único símbolo denominado sα con prob(sα) = pα = pα0 + pα1
Los símbolos de Sj (y sus probabilidades) se (re)ordenan en forma decreciente de acuerdo
a dichas probabilidades.
Es claro que la fuente reducida (Sj) tiene un símbolo menos que la fuente original (Sj-1).
Ejemplo (no se fije en el código Cj que le añadimos a la fuente Sj):
Sj-1 prob Sj prob Cj
s1 6/13 s1 6/13 0
s2 3/13 sα 4/13 10 pα = pα0 + pα1 = 2/13 + 2/13 = 4/13
sα0 2/13 s2 3/13 11
sα1 2/13
Demostración:
Supongamos que Cj-1 no es compacto.
Sea el código compacto Dj-1 (para Sj-1), luego:
a) L(Dj-1) < L(Cj-1)
En la página 57 se muestra que es lícito suponer que las dos palabras código más largas de
Dj-1 (correspondientes a sα0 y sα1) son mellizas, designémoslas como vα0=v0 y vα1=v1.
64
De manera "inversa" a como se indicó antes, pero lícitamente y para efectos de
demostración, podemos construir -a partir de Dj-1- un otro código Dj (para Sj) así:
Se copian todas las palabras código de Dj-1 en Dj -excepto las de los símbolos sα0 y sα1-
La palabra código de sα es vα=v (resulta de suprimir el último símbolo en vα0 -ó vα1-).
Sj-1 pi Dj-1 Cj-1 Sj pi Dj Cj
s1 p1 v1 w1 s1 p1 v1 w1
s2 p2 v2 w2 s2 p2 v2 w2
... ... ... ... ... ... ... ...
sα0 pα0 vα0=v0 wα0 sα pα v wα
sα1 pα1 vα1=v1 wα1
Pero entonces:
Por la forma de construir Cj-1 a partir de Cj (según lo indicado antes), y
Por la forma de construir Dj a partir de Dj-1 (según la forma "inversa" recién indicada)
Resulta:
b) L(Cj-1) - L(Cj) = p1·|w1| + p2·|w2| + ... + pα0·|wα0| + pα1·|wα1|
- [ p1·|w1| + p2·|w2| + ... + pα·|wα| ]
= pα0·|wα0| + pα1·|wα1| - pα·|wα| obvio
= pα0·(|wα|+1) + pα1·(|wα| +1) - pα·|wα| pues |wαc|=|wα|+1
= pα0·|wα| + pα0 + pα1·|wα| + pα1 - pα·|wα| obvio
= pα0·|wα| + pα0 + pα1·|wα| + pα1 - (pα0+pα1)·|wα| pues pα=pα0+pα1
= pα0 + pα1 = pα obvio
Luego L(Cj-1) = pα + L(Cj)
Substituyendo b) y c) en a) tenemos:
pα + L(Dj) < pα + L(Cj), es decir, L(Dj) < L(Cj)
Luego Cj no es compacto. Lo que contradice que Cj sea compacto.
Esto nos permite concluir que nuestro supuesto es erróneo y que
Cj-1 sí es compacto.
65
Ejemplo (se omiten los nombres de los símbolos si y en su lugar están las probabilidades):
Para la fuente Sq-1 de dos símbolos, su código binario asociado Cq-1={0,1} es -por simple
inspección- instantáneo y compacto. Se concluye, por los resultados anteriores al ejemplo,
que los códigos de Huffman son instantáneos y compactos.
X={0,1,2} (r = 3)
S C S2 C2
1/4 1 3/4 0
1/4 00 1/4 1
1/4 01
1/4 02
L(C) = 7/4
Enseguida hallaremos otro código ¡con menor longitud media!
Por ello puede ser necesario agregar símbolos vacuos (o espúreos, o fantasma) con
probabilidad 0.
El nuevo número total de símbolos debe ser: q' = r + techo[ (q-r) / (r-1) ] · (r-1)
Es claro que se deben agregar (q' - q) símbolos vacuos.
66
Ejemplo:
Para la misma Fuente-S anterior.
q' = 3 + techo[ (4-3) / (3-1) ] · (3-1) = 3 + techo[1/2] · 2 = 3 + 1· 2 = 5
Se agregan (q' - q) = (5 - 4) = 1 nuevo símbolo vacuo.
(Se omiten los nombres de los símbolos si y en su lugar están las probabilidades):
Ejemplo:
X={0,1,2,3} (r = 4)
(Se omiten los nombres de los símbolos si y en su lugar están las probabilidades):
67
CODIFICACIÓN ARITMÉTICA
Una otra manera muy diferente pero eficiente de codificar secuencias de símbolos
"si1...sim" de la Fuente-S sin construir un código C -basada en el trabajo inicial de Elias y
posterior de Witten- es como sigue.
1) Sea [I,D[ = [0,1[ el intérvalo inicial con sus límites Izquierdo y Derecho.
Sea j = 0
2) Se divide el segmento [I,D[ en q subintérvalos, proporcionales (y correspondientes)
-según su probabilidad- a cada uno de los símbolos s1,...,sq.
3) j = j+1
Se trabaja con el subíntervalo correspondiente a sij.
Se actualizan los valores [I,D[ para que correspondan a dicho subintérvalo
Ir a 2 (a no ser que j=m, en cuyo caso [I,D[ es el subintérvalo buscado)
4) Se codifica el mensaje "si1...sim" con cualquier valor dentro de este subintérvalo.
Ejemplo:
Sea la Fuente-S=({s1, s2, s3}, {0.7, 0.2, 0.1}) q=3
Sea el mensaje "si1...sim" = "si1si2si3" = "s2s3s3".
1) [I,D[ = [0,1[
j=0
2) Subdividimos el segmento [0,1[ en q=3 subintérvalos así:
[0 -------------- 0.7 ---- 0.9 -- 1[
3) j=1
Trabajamos con el subintérvalo que corresponde a si1=s2, es decir, [0.7,0.9[
Ir a 2 con [I,D[ = [0.7,0.9[
2) Subdividimos el segmento [0.7,0.9[ en q=3 subintérvalos así:
[0.7 -------------- 0.84 ---- 0.88 -- 0.9[
3) j=2
Trabajamos con el subintérvalo que corresponde a si2=s3, es decir, [0.88,0.9[
Ir a 2 con [I,D[ = [0.88,0.9[
2) Subdividimos el segmento [0.88,0.9[ en q=3 subintérvalos así:
[0.88 -------------- 0.894 ---- 0.898 -- 0.9[
3) j=3
Trabajamos con el subintérvalo que corresponde a si3=s3, es decir, [0.898,0.9[
Como j=m=3
[I,D[ = [0.898,0.9[ es el subintérvalo buscado
4) Cualquier valor dentro de este subintérvalo codifica el mensaje, por ej. 0.8985
No es necesario 'dibujar' los segmentos y pueden hacerse los cálculos para hallar el
siguiente subintérvalo de manera más algorítmica.
Para ello hay diversas presentaciones.
Esta es la nuestra:
68
Lj representa la longitud del intérvalo que se está considerando.
Ij es su límite izquierdo. Dj es su límite derecho.
El mensaje a codificar es "si1...sim".
Las probabilidades de cada símbolo son pi1, ..., pim (pij como referencia general).
Las probabilidades acumuladas de cada símbolo son Acumi1, ..., Acumim (Acumij como
referencia general).
j Ij Lj Dj
0 0 1 1
1 0.7 0.2 0.9
2 0.88 0.02 0.9
3 0.898 0.002 0.9
Cualquier valor dentro del intérvalo [0.898,0.9[ codifica el mensaje, por ej. 0.8985
Sin embargo, el siguiente ejemplo muestra un pequeño gran detalle que falta considerar.
Ejemplo:
Sea la Fuente-S=({s1, s2}, {0.5, 0.5})
Sea 0 el número real que se recibe.
Subdividimos el segmento [0,1[ en q=2 subintérvalos así: [0 ----- 0.5 ------ 1[
Es claro que 0 está en el primer subintérvalo, luego el primer símbolo es "s1"
Subdividimos el segmento [0,0.5[ en q=2 subintérvalos así: [0 ---- 0.25 ---- 0.5[
Es claro que 0 está en el primer subintérvalo, luego el segundo símbolo es "s1"
Subdividimos el segmento [0,0.25[ en q=2 subintérvalos así: [0 --- 0.125 --- 0.25[
Es claro que 0 está en el primer subintérvalo, luego el tercer símbolo es "s1"
...
Ya se habrá dado cuenta que falta considerar cuándo nos detenemos.
Una alternativa es considerar un tamaño de bloque fijo en el envío de símbolos.
Otra es enviar, previamente al mensaje, la longitud de éste.
Otra alternativa -que adoptamos- es considerar en nuestra fuente un símbolo que funja
como fin de mensaje. Al codificar se lo coloca una única vez al final del mensaje.
Al decodificar, nos detenemos cuando lo encontremos.
69
Con esta convención, el procedimiento tiene diversas presentaciones. Esta es la nuestra:
Ejemplo:
J S pj Acumj
0 0
1 s1 0.7 0.7
2 s2 0.2 0.9
3 s3 0.1 1
El número real que se recibe es num=0.8985
val j I L D símbolo
decodificado
0 1 1
0.8985 2 0.7 0.2 0.9 s2 val∈ [0.7, 0.9[
0.9925 3 0.88 0.02 0.9 s3 val∈ [0.9, 1[
El mensaje es m="s2s3s3"
Consideraciones importantes:
1) Sea [Im,Dm[ el intérvalo calculado para codificar el mensaje, si bien cualquier valor
dentro de él sirve, es obvio que preferimos uno con una parte fraccionaria corta.
Por ejemplo, si [Im,Dm[ = [0.69432178,0.709558254[ podemos tomar num=0.7
2) Al utilizar codificación aritmética receptor y emisor saben que se trabaja con un número
dentro de [0,1[; así pues podemos prescindir del "0." y considerar únicamente la parte
fraccionaria: en vez de trabajar con 0.8985 podemos trabajar con 8985 solamente.
El emisor no envía "0." y el receptor agrega "0."
3) Los anteriores puntos también son válidos si, de acuerdo al código r-ario que estemos
utilizando, convertimos num -e incluso [Im,Dm[- a números en base r (es decir, binarios,
etc.)
70
CANALES DE INFORMACIÓN CON RUIDO
Así, suponemos que el canal de información es silencioso, sin ruido o sin errores:
exactamente lo que se envía (desde el emisor), se recibe (por el receptor).
Ahora nos detendremos a analizar los canales que tienen interferencia, que incluyen la
posibilidad de error, que tergiversan los símbolos que atraviesan por él, es decir: los
canales con ruido (o ruidosos).
Por ej.:
se envía se recibe
0101 ---->---> se transmite ---> ---> 0100 (¡con errores!)
interferencia
(ruido)
Definición de canal con ruido.- Un canal con ruido (cr) se define como
cr = (A,P,B) donde:
A={ a1, ... ,ar } es el alfabeto de entrada (al canal) [los símbolos que se envían]
B={ b1, ... ,bs } es el alfabeto de salida (del canal) [los símbolos que se reciben]
P es el conjunto de probabilidades del canal del tipo p(bj/ai)
se presenta generalmente como listado o como matriz
(las probabilidades también pueden ir como arcos en el 'grafo del canal')
p(bj/ai) representa la probabilidad de recibir el símbolo bj dado que se envía el símbolo ai
Junto a las probabilidades p(ai) un canal de información con ruido se puede presentar así:
Y la matriz P así:
71
salidas
b1 b2 ... ... bs-1 bs
e a1 p(b1/a1) p(b2/a1) ... ... p(bs-1/a1) p(bs/a1)
n a2 p(b1/a2) p(b2/a2) ... ... p(bs-1/a2) p(bs/a2)
t ... ... ... ... ...
P= r .
a . p(bj/ai)
d ... ... ... ... ...
a ar-1 p(b1/ar-1) p(b2/ar-1) ... ... p(bs-1/ar-1) p(bs/ar-1)
s ar p(b1/ar) p(b2/ar) ... ... p(bs-1/ar) p(bs/ar)
Ejemplo:
Sea el canal cr=(A,P,B)
A = {a1,a2} B = {b1,b2,b3} p(a1)=1/2 p(a2)=1/2
b1 b2 b3
P= a1 1/2 0 1/2
a2 1/3 1/3 1/3
P en forma de listado:
p(b1/a1)=1/2 p(b2/a1)=0 p(b3/a1)=1/2
p(b1/a2)=1/3 p(b2/a2)=1/3 p(b3/a2)=1/3
1/2 1/3
b2
1/3
a2 b3
1/3
En los canales con ruido se considera que, enviado un símbolo de entrada ai, se recibe
-necesariamente- algún símbolo de salida bj. Esto es, dado que se envía el símbolo ai:
s
∑ p(bj/ai) = p(b1/ai) + ... + p(bs/ai) = 1
j=1
Esto se refleja en la matriz P en que cada fila debe sumar 1.
72
Probabilidad conjunta.- Se sabe que p(ai,bj) = p(bj/ai) · p(ai) = p(ai/bj) · p(bj)
H(A/B) H(B/A)
s r
= ∑ p(bj) · H(A/bj) = ∑ p(ai) · H(B/ai)
j=1 i =1
s r r s
= ∑ p(bj) · ∑ p(ai/bj) · log[1/p(ai/bj)] = ∑ p(ai) · ∑ p(bj/ai) · log[1/p(bj/ai)]
j=1 i =1 i =1 j=1
s r r s
=∑ ∑ p(bj) · p(ai/bj) · log[1/p(ai/bj)] =∑ ∑ p(ai) · p(bj/ai) · log[1/p(bj/ai)]
j=1 i =1 i =1 j=1
s r r s
=∑ ∑ p(ai,bj) · log[1/p(ai/bj)] =∑ ∑ p(ai,bj) · log[1/p(bj/ai)]
j=1 i =1 i =1 j=1
Información mutua entre A y B Información mutua entre B y A
73
Hemos resaltado la equivocación del canal H(A/B) y la información mutua entre A y B
I(A;B) por sus enriquecidas interpretaciones:
I(A;B) puede interpretarse como la cantidad de información sobre A que atraviesa el canal
(que el canal deja pasar).
b1 b2 b3
P= a1 1/2 0 1/2
a2 1/3 1/3 1/3
74
LA INFORMACIÓN MUTUA NO ES NEGATIVA
I(A;B) ≥ 0
Demostración:
1)
r
H(A) = ∑ p(ai) · log[1/p(ai)]
i =1
r
= ∑ p(ai) · log[1/p(ai)] · 1 obvio
i =1
r s s
= ∑ p(ai) · log[1/p(ai)] · [ ∑ p(bj/ai)] pues ∑ p(bj/ai) = 1
i =1 j=1 j=1
r s
=∑ ∑ p(ai) · log[1/p(ai)] · p(bj/ai) propiedades de sumatoria
i =1 j=1
r s
=∑ ∑ p(bj/ai) · p(ai) · log[1/p(ai)] conmutatividad
i =1 j=1
r s
=∑ ∑ p(ai,bj) · log[1/p(ai)] pues p(bj/ai) · p(ai) = p(ai,bj)
i =1 j=1
2) Ya vimos que:
s r
H(A/B) = ∑ ∑ p(ai,bj) · log[1/p(ai/bj)]
j=1 i =1
r s
=∑ ∑ p(ai,bj) · log[1/p(ai/bj)] propiedades de sumatoria
i =1 j=1
De 1 y 2:
I(A;B)
= H(A) - H(A/B)
r s r s
=∑ ∑ p(ai,bj) · log[1/p(ai)] - ∑ ∑ p(ai,bj) · log[1/p(ai/bj)]
i =1 j=1 i =1 j=1
r s
=∑ ∑ { p(ai,bj) · log[1/p(ai)] - p(ai,bj) · log[1/p(ai/bj)] } propiedades de sumatoria
i =1 j=1
r s
=∑ ∑ p(ai,bj) · { log[1/p(ai)] - log[1/p(ai/bj)] } factorizando p(ai,bj)
i =1 j=1
r s
=∑ ∑ p(ai,bj) · log[ 1/p(ai) / 1/p(ai/bj)] log a - log b=log a/b
i =1 j=1
r s
=∑ ∑ p(ai,bj) · log[p(ai/bj) / p(ai)] medios con medios, etc.
i =1 j=1
75
r s
= ∑ ∑ p(ai,bj) · log[p(ai) / p(ai/bj)]-1 propiedades de exponente
i =1 j=1
r s
=- ∑ ∑ p(ai,bj) · log[p(ai) / p(ai/bj)] propiedades de logaritmo
i =1 j=1
r s
=- ∑ ∑ p(ai,bj) · log[p(ai) · p(bj) / p(ai/bj) · p(bj)] obvio
i =1 j=1
r s
=- ∑ ∑ p(ai,bj) · log[p(ai) · p(bj) / p(ai,bj)] pues p(ai/bj) · p(bj) = p(ai,bj)
i =1 j=1
Resumiendo:
r s
I(A;B) = - ∑ ∑ p(ai,bj) · log[p(ai) · p(bj) / p(ai,bj)]
i =1 j=1
76
r r s
= [1/ln(V)] ·{ ∑ p(ai) - ∑ p(ai) · 1} pues ∑ p(bj/ai) = 1
i =1 i =1 j=1
r r
= [1/ln(V)] ·{ ∑ p(ai) - ∑ p(ai) } obvio
i =1 i =1
= [1/ln(V)] ·{ 0 } obvio
=0 obvio
Resumiendo:
r s
∑ ∑ p(ai,bj) · log{p(ai) · p(bj) / p(ai,bj)} ≤ 0
i =1 j=1
Luego, incluyendo al signo menos, resulta:
r s
- ∑ ∑ p(ai,bj) · log{p(ai) · p(bj) / p(ai,bj)} ≥ 0
i =1 j=1
Es decir: I(A;B) ≥ 0
77
RECIPROCIDAD DE LA INFORMACIÓN MUTUA
I(A;B) = I(B;A)
Demostración:
r r
1) ∑ p(ai/bj) = ∑ p(bj/ai) · p(ai) / p(bj) por Bayes
i =1 i =1
r
= [1/p(bj)] · ∑ p(bj/ai) · p(ai) pues p(bj) es independiente de i
i =1
= [1/p(bj)] · p(bj) cálculo de p(bj)
=1
Este resultado puede interpretarse así: recibido un símbolo de salida bj, se ha enviado
-necesariamente- algún símbolo de entrada ai.
2)
s
H(B) = ∑ p(bj) · log[1/p(bj)] · 1
j=1
s r
= ∑ p(bj) · log[1/p(bj)] · [ ∑ p(ai/bj)] por 1)
j=1 i =1
s r
=∑ ∑ p(bj) · log[1/p(bj)] · p(ai/bj) propiedades de sumatoria
j=1 i =1
s r
=∑ ∑ p(ai/bj) · p(bj) · log[1/p(bj)] conmutatividad
j=1 i =1
s r
=∑ ∑ p(ai,bj) · log[1/p(bj)] pues p(ai/bj) · p(bj) = p(ai,bj)
j=1 i =1
r s
=∑ ∑ p(ai,bj) · log[1/p(bj)] propiedades de sumatoria
i =1 j=1
3) Ya vimos que:
r s
H(B/A) = ∑ ∑ p(ai,bj) · log[1/p(bj/ai)]
i =1 j=1
De 2 y 3 resulta que:
I(B;A)
= H(B) - H(B/A)
r s r s
=∑ ∑ p(ai,bj) · log[1/p(bj)] - ∑ ∑ p(ai,bj) · log[1/p(bj/ai)]
i =1 j=1 i =1 j=1
r s
=∑ ∑ { p(ai,bj) · log[1/p(bj)] - p(ai,bj) · log[1/p(bj/ai)] } propiedades de sumatoria
i =1 j=1
78
r s
=∑ ∑ p(ai,bj) · { log[1/p(bj)] - log[1/p(bj/ai)] } factorizando p(ai,bj)
i =1 j=1
r s
=∑ ∑ p(ai,bj) · log[1/p(bj) / 1/p(bj/ai)] log a - log b = log a/b
i =1 j=1
r s
=∑ ∑ p(ai,bj) · log[p(bj/ai)/p(bj)] medios con medios, etc.
i =1 j=1
r s
=∑ ∑ p(ai,bj) · log[p(bj/ai) · p(ai) / p(bj) · p(ai)] obvio
i =1 j=1
r s
=∑ ∑ p(ai,bj) · log[p(ai,bj) / p(bj) · p(ai)] pues p(bj/ai) · p(ai) = p(ai,bj)
i =1 j=1
r s
=∑ ∑ p(ai,bj) · log[p(ai,bj) / p(ai) · p(bj)] obvio
i =1 j=1
r s
=∑ ∑ p(ai,bj) · log[p(ai) · p(bj) / p(ai,bj)]-1 propiedades de exponente
i =1 j=1
r s
= -∑ ∑ p(ai,bj) · log[p(ai) · p(bj) / p(ai,bj)] propiedades de logaritmo
i =1 j=1
Que es exactamente la misma expresión que hallamos antes para I(A;B). Luego:
I(B;A) = I(A;B)
79
OTROS RESULTADOS
2) También, dado que I(A;B) = H(A) - H(A/B) y I(B;A) = H(B) - H(B/A), por 1
H(A) ≥ H(A/B) y H(B) ≥ H(B/A)
3) H(A,B)
r s
=∑ ∑ p(ai,bj) · log[1/p(ai,bj)]
i =1 j=1
r s
=∑ ∑ p(bj/ai) · p(ai) · log[1 / p(bj/ai)·p(ai)] pues p(ai,bj) = p(bj/ai)·p(ai)
i =1 j=1
r s
=∑ ∑ p(bj/ai) · p(ai) · {log[1/p(bj/ai)] + log[1/p(ai)]} log ab=log a+log b
i =1 j=1
r s
=∑ ∑ { p(bj/ai) · p(ai) · log[1/p(bj/ai)] + p(bj/ai) · p(ai) · log[1/p(ai)] } obvio
i =1 j=1
r s
=∑ ∑ p(bj/ai) · p(ai) · log[1/p(bj/ai)]
i =1 j=1
r s
+∑ ∑ p(bj/ai) · p(ai) · log[1/p(ai)] propiedades de sumatoria
i =1 j=1
r s
= ∑ p(ai) · ∑ p(bj/ai) · log[1/p(bj/ai)] p(ai) es independiente de j
i =1 j=1
r s
+∑ ∑ p(bj/ai) · p(ai) · log[1/p(ai)]
i =1 j=1
r
= ∑ p(ai) · H(B/ai) definición de H(B/ai)
i =1
r s
+∑ ∑ p(bj/ai) · p(ai) · log[1/p(ai)]
i =1 j=1
r s
= H(B/A) + ∑ ∑ p(bj/ai) · p(ai) · log[1/p(ai)] definición de H(B/A)
i =1 j=1
r s
= H(B/A) + ∑ p(ai) · log[1/p(ai)] · ∑ p(bj/ai) ; p(ai)·log[1/p(ai)] es independiente de j
i =1 j=1
r s
= H(B/A) + ∑ p(ai) · log[1/p(ai)] · 1 pues ∑ p(bj/ai) = 1
i =1 j=1
= H(B/A) + H(A)
= H(A) + H(B/A) obvio
80
5) Nótese que cuando p(ai) · p(bj) = p(ai,bj), resulta que:
H(B/A) = H(B)
En efecto,
r s
H(B/A) = ∑ ∑ p(ai,bj) · log[1/p(bj/ai)]
i =1 j=1
r s
=∑ ∑ p(ai,bj) · log[1·p(ai) / p(bj/ai)·p(ai)] obvio
i =1 j=1
r s
=∑ ∑ p(ai,bj) · log[1·p(ai) / p(ai,bj)] pues p(bj/ai)·p(ai) = p(ai,bj)
i =1 j=1
r s
=∑ ∑ p(ai) · p(bj) · log[1·p(ai) / p(ai)·p(bj)] pues p(ai,bj) = p(ai) · p(bj)
i =1 j=1
r s
=∑ ∑ p(ai) · p(bj) · log[1/p(bj)] obvio
i =1 j=1
r s
= ∑ p(ai) · ∑ p(bj) · log[1/p(bj)] p(ai) es independiente de j
i =1 j=1
r
= ∑ p(ai) · H(B) definición de H(B)
i =1
= H(B) obvio
81
I(A;B) ≤ min{ log|A| , log|B| }
Luego, cuando H(A/B) = H(A) entonces Luego, cuando H(B/A) = H(B) entonces
I(A;B) = 0 I(B;A) = 0
Luego, el valor máximo para la información mutua entre A y B es H(A) o bien H(B).
Es decir,
I(A;B) ≤ min{ log(|A|) , log(|B|) }
82
CANALES ESPECIALES
Asumiremos que en la matriz del canal P, no hay filas de ceros (prohibido por definición
-cada fila debe sumar uno-) o columnas de ceros (lo que significaría que el símbolo de
salida correspondiente nunca se recibe y por lo tanto podemos prescindir de él).
Canales sin ruido (o sin pérdida).- La matriz P tiene la propiedad de tener un y sólo un
elemento distinto de cero en cada columna.
Esta condición obliga a tener tantos o más símbolos de salida como de entrada (r ≤ s).
s r
Como H(A/B) = ∑ p(bj) · ∑ p(ai/bj) · log[1/p(ai/bj)]
j=1 i =1
Mostraremos que la segunda sumatoria es una suma de ceros. Luego,
s r s
H(A/B) = ∑ p(bj) · ∑ p(ai/bj) · log[1/p(ai/bj)] = ∑ p(bj) · 0 = 0
j=1 i =1 j=1
En efecto, como
p(ai/bj) = p(bj/ai)·p(ai) / p(bj) por Bayes
r
= p(bj/ai)·p(ai) / ∑ p(bj/ai') · p(ai') cálculo de p(bj), usar i' no afecta
i'=1
Para los sumandos tales que p(bj/ai) = 0, es claro que p(ai/bj) = 0 y por tanto
p(ai/bj) · log[1/p(ai/bj)] = 0.
r
Para los sumandos tales que p(bj/ai) ≠ 0, es claro que ∑ p(bj/ai') · p(ai') recorre la
i'=1
columna j-ésima, que tiene todos sus elementos ceros -excepto uno- precisamente p(bj/ai).
Luego, p(ai/bj) = p(bj/ai)·p(ai) / p(bj/ai)·p(ai) = 1, y por tanto
p(ai/bj) · log[1/p(ai/bj)] = 0.
b1 b2 b3
P= a1 1/2 1/2 0
a2 0 0 1
83
Canales determinantes o determinísticos.- La matriz P tiene la propiedad de tener un y
sólo un elemento distinto de cero en cada
fila. Es decir, P tiene un y sólo un 1 en cada fila.
Esta condición obliga a tener tantos o más símbolos de entrada como de salida (r ≥ s).
r s
Como H(B/A) = ∑ p(ai) · ∑ p(bj/ai) · log[1/p(bj/ai)]
i =1 j=1
La segunda sumatoria (que recorre la fila ai) se comporta así:
s
∑ p(bj/ai) · log[1/p(bj/ai)] = p(b1/ai) · log[1/p(b1/ai)] + ... + p(bs/ai) · log[1/p(bs/ai)]
j=1
Para los elementos tales que p(bj/ai) = 0, es claro que p(bj/ai) · log[1/p(bj/ai)] = 0
Para los elementos tales que p(bj/ai) = 1, es claro que p(bj/ai) · log[1/p(bj/ai)] = 0
s
Así pues, es una suma de ceros, es decir, ∑ p(bj/ai) · log[1/p(bj/ai)] = 0. Luego,
j=1
r
H(B/A) = ∑ p(ai) · 0 = 0
i =1
Luego, I(A;B) = H(B) - H(B/A) = H(B) - 0 = H(B)
b1 b2
P= a1 1 0
a2 1 0
a3 0 1
84
Canales ambiguos.- Son tales que H(A) = H(A/B), es decir I(A;B) = 0.
Son tan ruidosos que no dejan pasar información.
B1 b2
P= a1 1/2 1/2
a2 1/2 1/2
r
Por otro lado, en el cálculo de p(bj) = ∑ p(bj/ai) · p(ai)
i =1
Al ser las filas iguales, el valor de p(bj/ai) es el mismo para cada ai. Digamos p(bj/ai) = k
r r r
Luego, p(bj) = ∑ p(bj/ai) · p(ai) = ∑ k · p(ai) = k · ∑ p(ai) = k · 1 = k
i =1 i =1 i =1
Es decir, p(bj) = k = p(bj/ai) (para algún i, el que sea pues las filas son iguales) (2)
s
Por tanto, H(B) = ∑ p(bj) · log[1/p(bj)]
j=1
s
= ∑ p(bj/ai) · log[1/p(bj/ai)] por (2)
j=1
=c por (1)
85
Canal simétrico o uniforme.- Sea NUM la secuencia: num1, ... ,nums
Su matriz P es tal que:
b1 b2 b3 b4
P= a1 1/2 1/4 1/4 0
a2 1/4 1/2 0 1/4
a3 0 1/4 1/4 1/2
a4 1/4 0 1/2 1/4
b1 b2 b3 b4
P= a1 1/2 1/4 1/4 0
a2 0 1/4 1/4 1/2
Canal binario simétrico CBS (BSC por las siglas del nombre en inglés, Binary
Symmetric Channel).- Su matriz es así:
b1 b2
P= a1 p q donde q = 1-p
a2 q p
p es la probabilidad de acierto
q es la probabilidad de error
86
Canal binario borrador CBB (BEC por las siglas del nombre en inglés, Binary
Erasure Channel).- Su matriz es así:
b1 b2 b3
P= a1 p q 0 donde q = 1-p
a2 0 q p
p es la probabilidad de acierto
q es la probabilidad de 'borroneo'
87
CANALES EN SERIE
Al enviar ai, este símbolo atraviesa el primer canal, que tiene como salida bj;
dicho bj ingresa al segundo canal que tiene como salida ck.
Previamente definiremos:
t t r
H(A/C) = ∑ p(ck) · H(A/ck) = ∑ p(ck) · ∑ p(ai/ck) · log[1/p(ai/ck)]
k =1 k =1 i =1
88
I(A;C) ≤ I(A;B)
iv) En el segundo canal -por definición- sus filas deben sumar 1, es decir
t
∑ p(ck/bj) = 1
k =1
s
vi) p(ai/ck) = ∑ p(ai/bj) · p(bj/ck) [conocido resultado estadístico]
j=1
Empecemos:
s r
H(A/B) = ∑ ∑ p(ai,bj) · log[1/p(ai/bj)] por definición
j=1 i =1
s r t
=∑ ∑ p(ai,bj) · log[1/p(ai/bj)] · ∑ p(ck/bj) por iv)
j=1 i =1 k =1
s r t
=∑ ∑ ∑ p(ai,bj) · log[1/p(ai/bj)] · p(ck/bj) propiedades de sumatoria
j=1 i =1 k =1
s r t
=∑ ∑ ∑ p(ck/bj) · p(ai,bj) · log[1/p(ai/bj)] conmutatividad
j=1 i =1 k =1
s r t
=∑ ∑ ∑ p(ck/ai,bj) · p(ai,bj) · log[1/p(ai/bj)] por i)
j=1 i =1 k =1
s r t
=∑ ∑ ∑ p(ai,bj,ck) · log[1/p(ai/bj)] evidente
j=1 i =1 k =1
s t r
=∑ ∑ ∑ p(ai,bj,ck) · log[1/p(ai/bj)] propiedades de sumatoria
j=1 k =1 i =1
89
t r
H(A/C) = ∑ p(ck) · ∑ p(ai/ck) · log[1/p(ai/ck)] por definición
k =1 i =1
t r s
= ∑ p(ck) · ∑ ∑ p(ai/bj) · p(bj/ck) · log[1/p(ai/ck)] por vi)
k =1 i =1 j=1
t s r
=∑ ∑ ∑ p(ck) · p(ai/bj) · p(bj/ck) · log[1/p(ai/ck)] prop. de sumatoria
k =1 j=1 i =1
t s r
=∑ ∑ ∑ p(ai/bj) · p(bj/ck) · p(ck) · log[1/p(ai/ck)] conmutatividad
k =1 j=1 i =1
t s r
=∑ ∑ ∑ p(ai/bj,ck) · p(bj/ck) · p(ck) · log[1/p(ai/ck)] por ii)
k =1 j=1 i =1
t s r
=∑ ∑ ∑ p(ai/bj,ck) · p(bj,ck) · log[1/p(ai/ck)] evidente
k =1 j=1 i =1
t s r
=∑ ∑ ∑ p(ai,bj,ck) · log[1/p(ai/ck)] evidente
k =1 j=1 i =1
s t r
=∑ ∑ ∑ p(ai,bj,ck) · log[1/p(ai/ck)] propiedades de sumatoria
j=1 k =1 i =1
Luego,
H(A/B) - H(A/C)
s t r s t r
=∑ ∑ ∑ p(ai,bj,ck) · log[1/p(ai/bj)] - ∑ ∑ ∑ p(ai,bj,ck) · log[1/p(ai/ck)]
j=1 k =1 i =1 j=1 k =1 i =1
s t r
=∑ ∑ ∑ p(ai,bj,ck) · log[1/p(ai/bj)] - p(ai,bj,ck) · log[1/p(ai/ck)] prop. sumatoria
j=1 k =1 i =1
s t r
=∑ ∑ ∑ p(ai,bj,ck) · {log[1/p(ai/bj)] - log[1/p(ai/ck)]} sale p(ai,bj,ck)
j=1 k =1 i =1
s t r
=∑ ∑ ∑ p(ai,bj,ck) · {log[1/p(ai/bj) / 1/p(ai/ck)]} log a - log b = log a/b
j=1 k =1 i =1
s t r
=∑ ∑ ∑ p(ai,bj,ck) · log[p(ai/ck) / p(ai/bj)] medios con medios, etc.
j=1 k =1 i =1
s t r
=∑ ∑ ∑ p(ai/bj,ck) · p(bj,ck) · log[p(ai/ck) / p(ai/bj)] evidente
j=1 k =1 i =1
s t r
=∑ ∑ p(bj,ck) · ∑ p(ai/bj,ck) · log[p(ai/ck) / p(ai/bj)] obvio
j=1 k =1 i =1
s t r
=∑ ∑ p(bj,ck) · ∑ p(ai/bj) · log[p(ai/ck) / p(ai/bj)] por ii)
j=1 k =1 i =1
s t r
= 1/ln(V) · ∑ ∑ p(bj,ck) · ∑ p(ai/bj) · ln[p(ai/ck) / p(ai/bj)] evidente
j=1 k =1 i =1
90
s t r
≤ 1/ln(V) · ∑ ∑ p(bj,ck) · ∑ p(ai/bj) · [p(ai/ck) / p(ai/bj) - 1] pues ln(z) ≤ z -1
j=1 k =1 i =1
s t r
= 1/ln(V) · ∑ ∑ p(bj,ck) · ∑ [p(ai/ck) - p(ai/bj)] obvio
j=1 k =1 i =1
s t r r
= 1/ln(V) · ∑ ∑ p(bj,ck) · [ ∑ p(ai/ck) - ∑ p(ai/bj)] evidente
j=1 k =1 i =1 i =1
s t s t
= 1/ln(V) · ∑ ∑ p(bj,ck) · [1 -1] = 1/ln(V) · ∑ ∑ p(bj,ck) · 0 = 0
j=1 k =1 j=1 k =1
r r
El último paso es lícito si mostramos que ∑ p(ai/ck) = ∑ p(ai/bj) = 1
i =1 i =1
Lo que hacemos a continuación:
r
∑ p(ai/bj) = 1 se ha demostrado en la página 78
i =1
r r s
∑ p(ai/ck) = ∑ ∑ p(ai/bj) · p(bj/ck) por vi)
i =1 i =1 j=1
s r
=∑ ∑ p(ai/bj) · p(bj/ck) evidente
j=1 i =1
s r
= ∑ p(bj/ck) · ∑ p(ai/bj) p(bj/ck) es independiente de i
j=1 i =1
s
= ∑ p(bj/ck) · 1 demostrado en la página 78
j=1
s
= ∑ p(ck/bj)·p(bj) / p(ck) Bayes
j=1
s
= [1/p(ck)] · ∑ p(ck/bj)·p(bj) obvio
j=1
= [1/p(ck)] · p(ck) por v)
=1
A partir de la línea en que se utiliza la propiedad ln(z) ≤ z -1, sería innecesario lo que
sigue del razonamiento si p(bj,ck)=0.
Así pues cuando p(bj,ck)≠0, la condición para la igualdad es que p(ai/ck) = p(ai/bj).
91
Ejemplo:
canal 1 canal 2
⎡0.9 0.1⎤ ⎡0.8 0.2⎤
A ⎢ 0.1 0.9⎥ B ⎢ ⎥ C
⎣ ⎦ ⎣0.2 0.8⎦
canal 1 canal 2
⎡3 / 4 0 1 / 4 ⎤
⎡1 / 2 0 1 / 2⎤ ⎢ 0 1 0 ⎥ C
A ⎢1 / 3 1 / 3 1 / 3⎥ B ⎢ ⎥
⎣ ⎦ ⎢⎣1 / 4 0 3 / 4⎥⎦
92
ADITIVIDAD DE LA INFORMACIÓN MUTUA
Ello puede darse cuando enviamos símbolos no a través de un canal sino de dos (o más)
canales. Por ejemplo:
Por generalidad, llamaremos C al segundo alfabeto de salida, donde C={ c1, ... ,ct }.
Es claro que los dos (o más) canales pueden ser idénticos (es decir, tienen la misma matriz
P). Esta situación es análoga a aquella cuando repetimos el envío de los símbolos de
entrada dos (o más) veces, por el mismo canal.
Mostraremos -para el caso de dos canales o la repetición un par de veces del envío de cada
símbolo- que esta redundancia reduce la pérdida de información [o, dicho de otro modo,
adiciona información a I(A;B)].
Sean:
p(ai/bj,ck) : la probabilidad de enviar ai dado que se reciben bj y ck
p(ck/ai,bj) : la probabilidad de recibir ck dado que se envía ai y se recibe bj
p(ck/ai) : la probabilidad de recibir ck dado que se envía ai
r
3) H(A/ bj,ck) = ∑ p(ai/bj,ck) · log[1/p(ai/bj,ck)]
i =1
s t
4) H(A/ B,C) = ∑ ∑ p(bj,ck) · H(A/bj,ck)
j=1 k =1
s t r
=∑ ∑ p(bj,ck) · ∑ p(ai/bj,ck) · log[1/p(ai/bj,ck)] por definición
j=1 k =1 i =1
s t r
=∑ ∑ ∑ p(bj,ck) · p(ai/bj,ck) · log[1/p(ai/bj,ck)] obvio
j=1 k =1 i =1
r s t
=∑ ∑ ∑ p(ai/bj,ck) · p(bj,ck) · log[1/p(ai/bj,ck)] obvio
i =1 j=1 k =1
r s t
=∑ ∑ ∑ p(ai,bj,ck) · log[1/p(ai/bj,ck)] evidente
i =1 j=1 k =1
93
5) Es claro que:
r
H(A) = ∑ p(ai) · log[1/p(ai)]
i =1
r s
= ∑ p(ai) · log[1/p(ai)] · ∑ p(bj/ai) la suma de una fila es 1
i =1 j=1
r s
=∑ ∑ p(bj/ai) · p(ai) · log[1/p(ai)] evidente
i =1 j=1
r s
=∑ ∑ p(ai,bj) · log[1/p(ai)] evidente
i =1 j=1
r s t
=∑ ∑ p(ai,bj) · log[1/p(ai)] · ∑ p(ck/ai) la suma de una fila es 1
i =1 j=1 k =1
r s t
=∑ ∑ ∑ p(ck/ai) · p(ai,bj) · log[1/p(ai)] evidente
i =1 j=1 k =1
r s t
=∑ ∑ ∑ p(ck/ai,bj) · p(ai,bj) · log[1/p(ai)] por 1)
i =1 j=1 k =1
r s t
=∑ ∑ ∑ p(ai,bj,ck) · log[1/p(ai)] evidente
i =1 j=1 k =1
r s t
I(A; B,C) = ∑ ∑ ∑ p(ai,bj,ck) · log[1/p(ai)]
i =1 j=1 k =1
r s t
- ∑ ∑ ∑ p(ai,bj,ck) · log[1/p(ai/bj,ck)]
i =1 j=1 k =1
r s t
=∑ ∑ ∑ { p(ai,bj,ck) · log[1/p(ai)] - p(ai,bj,ck) · log[1/p(ai/bj,ck)] } obvio
i =1 j=1 k =1
r s t
=∑ ∑ ∑ p(ai,bj,ck) · {log[1/p(ai)] - log[1/p(ai/bj,ck)]} obvio
i =1 j=1 k =1
r s t
=∑ ∑ ∑ p(ai,bj,ck) · log[ 1/p(ai) / 1/p(ai/bj,ck) ] logaritmos
i =1 j=1 k =1
r s t
=∑ ∑ ∑ p(ai,bj,ck) · log[p(ai/bj,ck) / p(ai)] medios, etc.
i =1 j=1 k =1
r s t
=∑ ∑ ∑ p(ai,bj,ck) · log[p(ai/bj,ck)·p(bj,ck) / p(ai)·p(bj,ck)] obvio
i =1 j=1 k =1
r s t
=∑ ∑ ∑ p(ai,bj,ck) · log[p(ai,bj,ck) / p(ai)·p(bj,ck)] evidente
i =1 j=1 k =1
94
Resumiendo:
r s t
I(A; B,C) = ∑ ∑ ∑ p(ai,bj,ck) · log[p(ai,bj,ck) / p(ai)·p(bj,ck)]
i =1 j=1 k =1
Por otro lado, también podemos definir I(A; B,C) de este otro modo:
Donde H(B,C) y H(B,C / A) se definen de manera análoga a las entropías que hemos
estado utilizando.
95
Ejemplo:
b1 b2
a1 p q
P= a2 q p
donde q = 1-p
c1 c2
= a1 p q
a2 q p
Como se observa, la matriz vale tanto para el primer canal como para el segundo. Es decir,
P representa p(bj/ai) y también P representa p(cj/ai)
El cálculo da:
96
REDUCCIÓN DE CANALES
Sea una nueva matriz P' construida a partir de P así: conserva las r entradas
pero tiene (s-1) salidas, fruto de agrupar y sumar dos columnas en una sola (de ahí que se
reduce una columna).
Obviamente esto puede hacerse una y otra vez obteniendo sucesivas reducciones:
el canal resultante es una reducción de P.
Si bien se agrupan y suman dos columnas arbitrarias, podemos suponer -para algunos
resultados teóricos- sin pérdida de generalidad que las columnas que se asocian son las dos
primeras.
Una forma ingeniosa de ver la reducción de un canal es considerar tal reducción como si
se tratara de un tratamiento en un "segundo" canal (en serie), así:
a1 b1 c2
a2 b2 c2
a3 --> ingresa al canal P --> b3 --> "segundo canal" --> c3= b3
... ... ...
ar bs cs=bs
Dicho segundo canal obtiene -con probabilidad 1- las mismas salidas que las entradas para
los símbolos b3,...,bs. Pero, los símbolos b1 y b2 se asocian con c2 (nótese que finalmente
hay s-1 salidas, pues el subíndice para las c's -en el gráfico- empieza en 2):
c2 c3 ... cs
b1 ... bs b1 1
a1 b2 1
P= ... p(bj/ai) P2 = b3 1
ar ... ...
bs 1
Los espacios en blanco tienen ceros.
Desde p(c3/b3) hasta p(cs/bs) tiene la
apariencia de una matriz identidad
Vista la reducción elemental como dos canales en serie -y por ello esta forma es muy
ingeniosa- podemos aplicar la propiedad para tales canales:
I(A;C) ≤ I(A;B)
97
Es decir, la información mutua, a lo más se mantiene (si es que no disminuye) cuando
aplicamos una reducción elemental.
Pero sabemos -por lo que se muestra en canales en serie- que la condición para la igualdad
cuando p(bj,ck)≠0 es: p(ai/ck) = p(ai/bj).
Así pues, podemos escudriñar esta condición para una reducción elemental según nuestra
representación. En la segunda matriz:
98
Es claro que p(c2/b1)=1, luego
p(b1,c2) = p(c2/b1)·p(b1) = 1·p(b1) = p(b1) ≠ 0
Entonces la condición que debe satisfacerse para la igualdad es: p(ai/c2) = p(ai/b1)
Resumiendo:
para los casos p(b1,c2)≠0 y p(b2,c2)≠0
las condiciones que deben cumplirse para que I(A;C)=I(A;B), es decir, para que la
reducción elemental sea una reducción suficiente (que no afecte) son:
p(ai/c2) = p(ai/b2) y p(ai/c2) = p(ai/b1) , es decir, p(ai/b2) = p(ai/b1)
p(ai/b1) = p(ai/b2) se puede reescribir -por Bayes en cada lado de la igualdad- así:
p(b1/ai)·p(ai) / p(b1) = p(b2/ai)·p(ai) / p(b2) luego, es obvio que la condición es
p(b1/ai) = p(b1)·p(b2/ai) / p(b2) = [p(b1)/p(b2)]·p(b2/ai)
Dada la matriz P del canal original y dadas las probabilidades p(ai), resulta que
p(b1) es fijo, p(b2) es fijo y por lo tanto [p(b1)/p(b2)] también es constante, llamémosla c.
Luego la condición para que la reducción elemental sea una reducción suficiente es:
b1 b2 b3
P= a1 1/8 1/4 5/8
a2 1/4 1/2 1/4
c2 c3=b3
P' = a1 3/8 5/8
a2 3/4 1/4
99
CAPACIDAD DE UN CANAL
Hay un algoritmo -el de Blahut/Arimoto- que estima con una aproximación aceptable
dicha capacidad. Sin embargo, en ocasiones puede obtenerse tal capacidad directamente,
como en el caso de los canales débilmente simétricos.
Capacidad de un canal débilmente simétrico.- Sea NUM la secuencia: num1, ... ,nums
Se sabe que I(A;B) = H(B) - H(B/A). Mostraremos que H(B/A) es una cantidad constante.
r s
En efecto, por definición H(B/A) = ∑ p(ai) · ∑ p(bj/ai) · log[1/p(bj/ai)]
i =1 j=1
Como la matriz P es fija y cada fila es una permutación de NUM, la segunda sumatoria
siempre devuelve lo mismo, digamos k. Es decir,
r r
H(B/A) = ∑ p(ai) · k = k · ∑ p(ai) = k · 1 = k es decir,
i =1 i =1
s
H(B/A) = k = ∑ p(bj/ai) · log[1/p(bj/ai)] (para algún/cualquier i)
j=1
Luego, I(A;B) = H(B) - k
k=H(B/A) no depende de p(ai). Por lo tanto, maximizar el valor de I(A;B) para este canal
-variando las probabilidades de entrada p(ai)- es equivalente a maximizar H(B).
100
Resumiendo: tomando p(ai)=1/r
p(bj) = c/r un valor constante
b1 b2
P= a1 p q donde q = 1-p
a2 q p
Ejemplo:
⎡0.9 0.1⎤
El BSC con matriz P = ⎢ ⎥ tiene capacidad -en bits-
⎣ 0.1 0.9⎦
C = 1- [0.9·log(1/0.9) + 0.1·log(1/0.1)] = 1- 0.46899559358928 = 0.53100440641072
101
Algoritmo de Blahut-Arimoto.- Estima la capacidad de un canal.
(adaptado del libro de Wells)
Algoritmo:
p(ai)=1/r;
r
calcular p(bj) utilizando p(bj)= ∑ p(bj/ai)·p(ai)
i =1
Ejemplo:
⎡0.9 0.1⎤
Para el BSC con matriz P = ⎢ ⎥
⎣ 0.1 0.9⎦
C = 0.53100440641072
102
REGLAS DE DECISIÓN
PRINCIPIOS DE DECODIFICACIÓN
Sea un canal con ruido de alfabeto de entrada A y alfabeto de salida B. Cuando se obtiene
la salida bj (por ejemplo en un BSC se obtiene como salida un '0') el receptor debe decidir
a cuál de las r entradas (a1,...,ar) corresponde esta salida. Es decir, debe decidir cuál
símbolo ha enviado el emisor.
Una regla de decisión es una función D:B->A que asigna un único símbolo de entrada a
cada símbolo de salida.
En general, dado que a cada símbolo de salida se le puede asignar cualesquiera de los r
símbolos de entrada, podemos tener rs reglas de decisión para un canal arbitrario.
Para optar por una regla de decisión, la construiremos asignación a asignación así:
Dado j, es decir, dado el símbolo de salida bj, debemos asignarle una de las r entradas
(a1,...,ar) -digamos a*- así: D(bj) = a*.
La probabilidad de que esta asignación sea correcta es: p(a*/bj)
Obviamente la probabilidad de que esta asignación sea incorrecta es: 1-p(a*/bj)
Principio de decodificación del mínimo error.- ¿Cuál a* escribir (a1 ó a2 ... ó ar)?
Podemos resolverlo a través del principio de decodificación del mínimo error (Abramson
le llama de máxima posibilidad condicional y Jones del observador ideal):
103
Se elige el a*∈{a1,...,ar} tal que ∀ai p(a*/bj) ≥ p(ai/bj)
Por Bayes, es equivalente decir:
Se elige el a*∈{a1,...,ar} tal que ∀ai p(bj/a*)·p(a*) / p(bj) ≥ p(bj/ai)·p(ai) / p(bj)
Multiplicando por p(bj) en ambos miembros, es equivalente decir:
Se elige el a*∈{a1,...,ar} tal que ∀ai p(bj/a*)·p(a*) ≥ p(bj/ai)·p(ai)
Es decir, se trata de maximizar el valor de p(a*/bj).
Nótese que para construir la regla de decisión aplicando este principio debemos tener las
probabilidades p(ai).
104
Probabilidad de que la regla de decisión sea correcta y probabilidad de error de la
regla de decisión.- Se calculan de la misma manera para reglas de decisión provenientes
de ambos principios de decodificación:
s
La probabilidad de que la regla de decisión sea correcta es: PC = ∑ p(a*/bj)·p(bj)
j=1
La probabilidad de error de la regla de decisión así elegida es:
O bien,
PE = 1 - PC s s
PE = ∑ [1-p(a*/bj)]·p(bj) = ∑ [p(bj)-p(a*/bj)·p(bj)]
j=1 j=1
s s
= ∑ p(bj)- ∑ p(a*/bj)·p(bj)
j=1 j=1
s
= 1 - ∑ p(a*/bj)·p(bj)
s
= 1 - ∑ p(a*/bj)·p(bj)
j=1 j=1
r s s r
como ∑ ∑ p(ai,bj) = ∑ ∑ p(ai,bj) =1
i =1 j=1 j=1 i =1
s r s s r s
PE = ∑ ∑ p(ai,bj) - ∑ p(a*/bj)·p(bj) = ∑ ∑ p(ai,bj) - ∑ p(a*,bj)
j=1 i =1 j=1 j=1 i =1 j=1
(algunos autores lo escriben así) = ∑ ∑ p(ai,bj)
B A - {a*}
(a* se elige según la regla de decisión, para cada bj)
Ejemplo:
Para el canal anterior, ambos principios de decodificación ofrecen la siguiente regla:
D(b1) = a1 D(b2) = a2
Además:
p(a1,b1) = p(b1/a1)·p(a1) = 0.6·1/2 = 0.3
p(a1,b2) = p(b2/a1)·p(a1) = 0.4·1/2 = 0.2
p(a2,b1) = p(b1/a2)·p(a2) = 0.4·1/2 = 0.2
p(a2,b2) = p(b2/a2)·p(a2) = 0.6·1/2 = 0.3
Luego:
s r s
PE = ∑ ∑ p(ai,bj) - ∑ p(a*,bj) = 0.3 + 0.2 + 0.2 + 0.3 - [0.3 + 0.3] = 0.4
j=1 i =1 j=1
105
Cuando hay más de una alternativa equivalente se elige cualquiera de ellas.
Ejemplo: Sea el siguiente canal con A={a1,a2}, B={b1,b2}, p(a1)=1/2, p(a2)=1/2
⎡0.5 0.5⎤
P= ⎢ ⎥
⎣0.5 0.5⎦
Siguiendo el principio del mínimo error para b1: Siguiendo el principio de máxima
posibilidad para b1:
Luego, a b1 se le puede asignar tanto a1 como a2. Luego, a b1 se le puede asignar tanto a1
como a2.
Elegimos: D(b1) = a1 Elegimos: D(b1) = a1
106
EL SEGUNDO TEOREMA DE SHANNON
TEOREMA FUNDAMENTAL DE LA CODIFICACIÓN
(en canales con ruido)
Manipulación sugerida: A partir del canal que tenemos, ingeniosamente crearemos otro
canal según la siguiente idea: en vez de enviar un 0 ó un 1, repetiremos el envío tres veces,
es decir, las entradas serán ahora a1=000 o bien a2=111.
Como se trata del mismo canal de base, los tres símbolos de una u otra entrada pueden
verse afectados por el ruido, así pues las salidas posibles serán (fíjese bien el orden):
b1=000, b2=001, b3=010, b4=100, b5=011, b6=101, b7=110, b8=111.
Es posible calcular p(bj/ai) en términos de las probabilidades del canal original así:
Sean bj=bj1...bjn y ai=ai1...ain, entonces p(bj/ai) = p(bj1/ai1) · ... · p(bjn/ain).
107
Así pues: p(b1/a1) = p(000/000) = p(0/0) · p(0/0) · p(0/0) = p·p·p = p3
p(b2/a1) = p(001/000) = p(0/0) · p(0/0) · p(1/0) = p·p·q = p2q
El resto de los casos se resume en la siguiente matriz:
b1=000 b2=001 b3=010 b4=100 b5=011 b6=101 b7=110 b8=111
a1=000 p3 p2q p2 q p2q pq2 pq2 pq2 q3
a2=111 q3 pq2 pq2 pq2 p2 q p2q p2q p3
Nótese que p(a1)=p(a2)=1/2 (otras entradas no se envían), de manera que los principios de
decodificación de máxima posibilidad y del mínimo error son equivalentes.
Construyamos la regla de decisión según el principio de máxima posibilidad:
Previamente, dado que p > q, es claro que: p3 > q3 y que p2q > pq2
b1) Como: p(b1/a1) = p3
p(b1/a2) = q3
Es claro que ∀ai p(b1/a1) ≥ p(b1/ai)
Luego, D(b1) = a1
b2) Como: p(b2/a1) = p2q
p(b2/a2) = pq2
Es claro que ∀ai p(b2/a1) ≥ p(b2/ai)
Luego, D(b2) = a1
Los otros resultados se obtienen de manera semejante. La nueva regla de decisión es:
D(b1) = a1 D(b2) = a1 D(b3) = a1 D(b4) = a1
D(b5) = a2 D(b6) = a2 D(b7) = a2 D(b8) = a2
Que indica, por ejemplo: si se recibe b5=011, debe asignársele (debe deducirse que se ha
enviado) a2=111, que codifica al 1, es decir, se deduce que se ha enviado un 1.
En general, la regla indica que debemos deducir que se ha enviado 000 (que codifica al 0)
si hay mayor cantidad de ceros en bj, o bien 111 (que codifica al 1) en caso contrario.
Es decir, codificar 0 como 000 y 1 como 111, repitiendo tres veces el envío, reduce la
probabilidad de error en nuestra regla de decisión: hace más confiable el canal.
108
Velocidad del código (code rate).- El precio de reducir la probabilidad de error de la
regla de decisión (es decir, menor error en la decodificación), es que -para el mismo
mensaje- ya no se envía un símbolo a1=0 (o a2=1) sino una secuencia de tres símbolos 000
(o 111), denotado en el nuevo canal como a1 (o a2). Ello significa un mayor costo.
Si en vez de tres repeticiones, pensamos en cinco, siete, etc., es intuitivo imaginar que la
probabilidad de error de la regla de decisión será aún menor; lamentablemente la
velocidad del código también (PE->0 cuando n->∝; pero también R->0 cuando n->∝).
109
En nuestro ejemplo, dado que se trata de un BSC, sabemos que (ver página 101):
C = 1 - [ p·log(1/p) + q·log(1/q) ] = 1 - H(p)
H(A) = log22 = 1 bit
El mensaje a1=0 se lo codifica como a1=000
El mensaje a2=1 se lo codifica como a2=111
n=3
R = 1/3 = 0.333
Por ejemplo con p = 0.9 se tiene H(p) = 0.469 y C = 0.531, es decir, R<C.
Así pues, con el propósito de ganar confiabilidad, un canal puede utilizarse de manera más
ingeniosa mediante algunas modificaciones.
A esta manipulación la llamaremos más adelante construcción de códigos (del) canal.
110
PRINCIPIO DE DECODIFICACIÓN DE
MÍNIMA DISTANCIA (ó MÁXIMA VECINDAD) DE HAMMING
Ya vimos que -a partir de un canal base, un BSC por ejemplo- de entradas ai y salidas bj,
podemos considerar otro canal de entradas ai y salidas bj que son secuencias de símbolos
del canal original.
A partir de ahora trabajaremos bajo dichas condiciones. Más aún, los ai serán de igual
longitud -es decir bloque-. Generalmente trabajaremos con secuencias de 0's y 1's (algo
semejante sucede con los bj).
Recordemos que es posible calcular p(bj/ai) en términos de las probabilidades del canal
original así:
Sean bj=bj1...bjn y ai=ai1...ain, entonces p(bj/ai) = p(bj1/ai1) · ... · p(bjn/ain)
Ejemplos:
a = 00010 a = 1111 a=1 a = 010 a = 01101
b = 00000 b = 1111 b=0 b = 101 b = 10110
d(a,b) = 1 d(a,b) = 0 d(a,b) = 1 d(a,b) = 3 d(a,b) = 4
111
Es claro que dos cadenas a,b de igual longitud, pueden diferir en cero posiciones -si son
iguales-, o en una, en dos, etc. Es decir, d(a,b) ≥ 0.
También es claro que el número de posiciones en las que difieren las cadenas a y b, es el
mismo número en las que difieren las cadenas b y a. Es decir, d(a,b) = d(b,a).
Ahora, probaremos que dadas las cadenas a,b,c de igual longitud: d(a,c) ≤ d(a,b) + d(b,c).
Propiedad conocida como la desigualdad del triángulo.
En efecto, mostraremos previamente que:
(1) Si ai≠ci entonces (ai≠bi ó bi≠ci).
Demostración:
La contrarrecíproca del enunciado es: Si ∼(ai≠bi o bi≠ci) entonces ∼(ai≠ci)
Es decir, Si ai=bi y bi=ci entonces ai=ci
Que es verdadera por simple inspección (transitividad de la relación de igualdad).
Es obvio que la distancia entre dos cadenas -a,b por ejemplo-, es la suma de las distancias
entre cada uno de sus símbolos (posición a posición). Es decir:
(3) d(a,b) = d(a1,b1) + ... + d(an,bn)
112
Principio de decodificación de mínima distancia (ó máxima vecindad) de Hamming.-
Se elige el a*∈{a1,...,ar} tal que ∀ai d(a*,bj) ≤ d(ai,bj)
Es decir, se trata de minimizar el valor de d(a*,bj).
Así pues, bajo las condiciones anteriores, para construir la regla de decisión, ya no es
necesario efectuar tantos cálculos [la matriz del nuevo canal con p(bj/ai) para cada i,j y
luego buscar p(bj/a*)] sino apelar a la distancia de Hamming, buscando la menor.
Como ilustramos antes con un ejemplo.
113
En general suponiendo que se recibe bj:
i) Si bj=ai, para algún i, entonces asignamos a*=ai
(cuando se recibe algo -sin bits errados- que corresponda a una entrada lícita, se deduce
que eso es precisamente lo que se ha enviado).
ii) Si ∀i bj≠ai, entonces se le asigna a a* la entrada que diste menos de la salida bj, es
decir, tal que ∀ai d(a*,bj) ≤ d(ai,bj)
(cuando se recibe algo -con bits errados- que no corresponde a ninguna entrada lícita, se
deduce que lo que se ha enviado es la entrada más vecina (cercana) a eso que se recibe,
en el sentido de Hamming).
114
CÓDIGOS DETECTORES Y CORRECTORES
Aunque se utilice un BSC donde finalmente se envían ceros y/o unos, lo que en general se
desea envíar son mensajes ai. Por ejemplo a1=0 o, lo que es más usual, mensaje más largos
por ejemplo a1=1000001 (=65 el código ascii de la 'A').
Ya vimos que una forma de manipular el canal y hacerlo más confiable eludiendo el ruido,
es no enviar los mensajes originales sino añadirles algún(os) bit(s) de redundancia.
Por ejemplo en vez de un 0 representarlo con la entrada a1=000; o en nuestro segundo
ejemplo en vez de 1000001 representarlo con la entrada a1=10000010 (donde hemos
subrayado el bit de redundancia añadido).
Obviamente las salidas todavía pueden verse afectadas por el ruido. Sin embargo, con
principios de decodificación apropiados (como el de la mínima distancia de Hamming)
pueden construirse reglas de decisión cuya probabilidad de error sea disminuida: tanto por
la redundancia como por lo pertinente de la regla.
Códigos (del) canal.- Al hecho de aumentar bits de redundancia a los mensajes, haciendo
más largas las entradas (para transmitir los mismos mensajes) pero más resistentes al
ruido, le llamaremos: la construcción de un código (del) canal.
En cambio, cuando para la salida bj, hay varias entradas ai que están igual de cercanas,
d(a*,bj)=t para estas varias entradas ai: una postura considera que es mejor no elegir
cualquiera de dichas alternativas, sino solamente indicar que se han detectado t errores,
solicitando un reenvío.
Este es el esquema ARQ, por las siglas en inglés de Automatic Repeat Request.
Un buen código canal C, debe permitir detectar todos los t errores, donde sea que ocurran
y en cualquier palabra código que ocurran. Mejor aún será que se corrijan tales errores..
Será más complejo construir un código canal C a medida que t aumenta (1, 2, etcétera).
Por fortuna, dependiendo del canal y del valor de q, en general un valor alto para t -dentro
de una palabra código-, es decir, una cantidad alta de errores tiende a ser más improbable.
Distancia mínima de un código canal.- Sea C={a1, ... ,aM} un código canal.
Denotaremos por dC a la distancia mínima de C definida así:
dC = min { d(ai,aj) / ai,aj ∈ C; i≠j }
Ejemplo:Sea C={a1,a2,a3,a4}={000,011,101,110}
dC = min { d(ai,aj) / ai,aj ∈ C; i≠j }
= min {d(a1,a2), d(a1,a3), d(a1,a4), d(a2,a3), d(a2,a4), d(a3,a4)}
= min { 2, 2, 2, 2, 2, 2 }
=2
115
C detecta t errores si y sólo si dC > t
Demostración:
Supongamos que se ha enviado a* y se ha recibido bj.
Asumamos que hay t errores, es decir, d(a*,bj)=t (t > 0) (1)
Para que el receptor detecte que bj tiene errores, es suficiente que no coincida con ninguna
palabra código. Es decir, que:
i) ∀ai∈C-{a*} d(ai,bj)>0, o equivalentemente, ∀ai∈C-{a*} d(bj,ai) > 0 (3)
ii) Ya se sabe, por (1), que d(a*,bj)>0.
Para asegurar (3) debemos tener -por (2)- que:
∀ai∈C-{a*} d(a*,ai) - d(a*,bj) > 0
Es decir, ∀ai∈C-{a*} d(a*,ai) > d(a*,bj)
Que por (1) es ∀ai∈C-{a*} d(a*,ai) > t
Lo cual es cierto si y sólo si dC > t. Que es lo que queríamos demostrar.
Dado que dC > t puede escribirse como dC ≥ t+1 y también como dC-1 ≥ t, es usual
utilizar este resultado para determinar cuántos errores puede detectar el código C, siendo
la respuesta dC-1 errores.
Para que el receptor detecte que bj tiene errores y asegurar que la regla de máxima
vecindad nos dirige hacia a* (y así corregir lo errado), es suficiente que:
∀ai∈C-{a*} d(ai,bj) > d(a*,bj) (iii)
Para asegurar (iii) debemos tener -por (ii)- que:
∀ai∈C-{a*} d(a*,ai) - d(a*,bj) > d(a*,bj)
Es decir, ∀ai∈C-{a*} d(a*,ai) > d(a*,bj) + d(a*,bj)
Es decir, ∀ai∈C-{a*} d(a*,ai) > 2·d(a*,bj)
Que por (i) es ∀ai∈C-{a*} d(a*,ai) > 2·t
Lo cual es cierto si y sólo si dC > 2t. Que es lo que queríamos demostrar.
Dado que dC > 2t puede escribirse como dC ≥ 2t+1 y también como [dC-1]/2 ≥ t, es usual
utilizar este resultado para determinar cuántos errores puede corregir el código C, siendo
la respuesta [dC-1]/2 errores.
116
Estandarización de las entradas.- Ejemplo:
Sea una fuente con alfabeto S={s1,s2} y código asociado C={0,10,11}. Nótese que dicho
código de Huffman no es bloque.
Al mensaje s1s1s1s3s1s3 le corresponde la secuencia 00011011, que puede separarse en
bloques de dos símbolos así: 00 01 10 11.
Nótese que hemos utilizado a'i (a prima sub i). En efecto, hasta ahora sólo hemos
agrupado en bloques de longitud k, las secuencias correspondientes a los mensajes a
transmitirse. Falta aún la imprescindible tarea de extender la longitud de estos bloques,
añadiendo bits de redundancia con el propósito de que estas entradas, así manipuladas, nos
permitan eludir el ruido.
Finalmente las entradas ai, que son las que realmente serán transmitidas, son bloques de
longitud N (con N>k).
Los N-k bits de redundancia (añadidos a los k bits que constituyen los mensajes a
transmitirse) deben construirse de tal manera que siendo los menos posibles puedan
corregir (o detectar) la mayor cantidad de errores.
Tal como se ha planteado la segmentación -en bloques de longitud k-, asumiremos que
hay M=2k bloques a'i [eventualmente cada uno con probabilidad p(a'i)=1/2k].
Cada una de estos M mensajes (de longitud k) debe completarse con (r=N-k) bits de
redundancia, para conformar una palabra código ai (de longitud N) del código canal en
construcción [eventualmente cada una con probabilidad p(ai)=1/2k, esto es equiprobables].
Queda claro que las salidas bj tendrán longitud N también. De las 2N secuencias posibles,
sólo M=2k corresponden a palabras código enviadas (las reuniremos en el conjunto BM).
Las otras no son palabras código (las reuniremos en el conjunto B'M). Será la regla de
decisión que adoptemos -por ejemplo a través del principio de la mínima distancia de
Hamming- la que, en el mejor de los casos, determine cuáles bits están errados y los
corrija.
117
El problema central ahora es: a partir de las pre-entradas a'i de longitud k, dónde y cuáles r
bits de redundancia añadir al construir las palabras del código canal; y qué valor
exactamente tendrá r (ó, sabiendo que r=N-k, qué valor le asignaremos a N).
Obviamente, debemos explicitar una regla de decisión (a través del principio de la mínima
distancia de Hamming por ejemplo). Anteriores resultados, nos permiten verificar cuántos
errores puede corregir nuestro código canal.
118
¿ Cuántas difieren de a* en i=1 posición ?
Respuesta: La posición que difiere puede ser la primera, la segunda, etc.
⎛ N⎞
N= ⎜⎜ ⎟⎟
⎝1⎠
¿ Cuántas difieren de a* en i=2 posiciones ?
Respuesta: La dos posiciones puede ser las dos primeras, las dos segundas, ..., las dos
últimas; pero también cualquier otra combinación como la primera y la tercera, la segunda
y la última, etc. Es decir, cualquier combinación de N tomados de a 2, sin repetición, es
decir:
⎛ N⎞
N= ⎜⎜ ⎟⎟
⎝2⎠
Etcétera.
En general, como las i posiciones pueden suceder en cualquiera de los N posibles lugares,
⎛ N⎞
es claro que hay: ⎜⎜ ⎟⎟ palabras bj que difieren i posiciones de a*.
⎝i⎠
t ⎛ N⎞
Luego, V(N,t) = ∑ ⎜⎜ ⎟⎟ .
i =0 ⎝ i ⎠
119
Así, los r=N-k bits de redundancia que deben añadirse son, por lo menos: log2[V(N,t)].
Si nos fijamos el enunciado del límite de Hamming, es claro que esta es una condición
necesaria (para la existencia y construcción de un código C que corrija t errores), no
suficiente.
Ejemplo:
Sea N=3 y trabajemos con el alfabeto X={0,1}
Todas las palabras de longitud N=3 posibles son 2N:
(BM ∪ B'M) = {000, 001, 010, 011, 100, 101, 110, 111}
Sea el código canal C=BM=B2={a1,a2}={000,011}. Es claro que dC=2
Pero C no es maximal, pues existe otro código C'={000, 011, 101, 110}, con dC'=2
también y que tiene más palabras código.
Considerando C, nótese que dada la palabra b=101, d(b,a1)=d(b,a2)=2.
Así pues, para b no hay (por lo menos) una palabra código tal que d(ai,b)≤dC-1. Es decir,
existe b tal que para todas las palabras código ai se cumple que d(ai,b)>dC-1.
Recordemos que los mensajes posibles tienen longitud k, a los que se añaden símbolos de
redundancia hasta lograr palabras código de longitud N. De las secuencias posibles de
salida bj, sólo M de ellas corresponden a mensajes (codificados).
Asumiremos que dichas M palabras código (posibles de enviar) son equiprobables.
120
Por otro lado -en el caso binario-, de las 2N secuencias posibles de salida bj, sólo M=2k
corresponden a palabras código enviadas. Tales salidas se asocian a una palabra código a
través de una regla de decisión cuya probabilidad de error es:
s s
PE = 1 - ∑ p(a*/bj)·p(bj) = (por Bayes) = 1 - ∑ p(bj/a*)·p(a*)
j=1 j=1
Misma que se minimiza haciendo máxima la sumatoria. Pero precisamente ese es el
principio del mínimo error:
Se elige el a*∈{a1,...,ar} tal que ∀ai p(bj/a*)·p(a*) ≥ p(bj/ai)·p(ai)
Bajo el supuesto de la equiprobabilidad de las M=2k secuencias el principio del mínimo
error es igual al principio de maxima posibilidad que es igual al principio de mínima
distancia.
Es obvio que un código con muy pocas palabras código puede construirse eligiéndolas
muy distantes entre sí (garantizando una baja probabilidad de error).
Además H2(S)=log22k=k bits y R=k/N. De manera que para una mayor velocidad es
preciso incluir muy pocos bits de redundancia ("incrementando" el valor de k).
La clave está pues en incrementar el valor de R (haciendo el código maximal, con todas
las palabras código posibles e introduciendo pocos bits de redundancia).
Pero también debe tomarse en cuenta la capacidad C del canal (de manera que R<C) y
minimizando la probabilidad de error (por ejemplo eligiendo la menor cantidad de
palabras código muy distantes entre sí –quizás con un N grande-).
Además de tener la mayor cantidad de palabras, puede ser deseable que un código sea
construido de tal forma que corrija todos los(hasta t) errores, es decir, que todas las
secuencias de salida sean: o bien una palabra código, o bien una palabra código con hasta t
bits errados. Como queremos que C corrija hasta t errores ninguna salida b estará igual de
distante de más de una palabra código (como en el ejemplo). Es decir, queremos un código
que sepa qué hacer exactamente con cada salida.
El código canal C de longitud N que corrige hasta t errores se dice perfecto si es maximal
y ∀b ∃!ai d(ai,b) ≤ t (∃! se lee existe un único).
Otra forma de decirlo es que C es perfecto cuando (además de ser maximal) todas las
palabras (que salen del canal) que tengan hasta t errores son corregidas.
Recordemos (límite de Hamming) que el número de palabras de longitud N, cuya distancia
a cualquiera de las M=2k palabras código ai sea menor o igual que t es: M·V(N,t). Y que
como sólo hay 2N secuencias posibles resulta que: M·V(N,t) ≤ 2N. Pero entonces, la
definición de código perfecto implica (que se alcanza) la igualdad en el límite de
Hamming (en 2N no hay salidas b tales que no sepamos qué hacer con ellas).
De hecho hay quienes definen un código perfecto como aquel que satisface la igualdad en
el límite de Hamming.
121
Límite de Gilbert-Varshamov.-
Si el código canal C de longitud N es maximal y tiene distancia mínima dC Entonces el
número M de palabras código de C debe ser tal que M ≥ 2N / V(N,dC-1).
Demostración:
1) Sabemos que si C es maximal, para todas las palabras b de longitud N, hay por lo
menos una palabra código a* tal que d(b,a*)≤dC-1
2) Como C es maximal, se sabe que cada palabra de longitud N dista dC-1 (o menos) de
por lo menos una palabra código.
¿Cuántas palabras de longitud N que disten dC-1 (o menos) de la palabra código a* hay?
Ya se sabe que hay V(N,dC-1).
Consideremos ahora todas las palabras código ai.
El número de palabras de longitud N, cuya distancia a cualquiera de las M=2k palabras
código ai sea menor o igual que dC-1 es: M·V(N,dC-1).
3) Sólo hay 2N palabras posibles de longitud N.
Supongamos que M·V(N,dC-1) < 2N.
La única forma de que ello suceda es que hayan palabras de longitud N que no se
incluyan en la cuenta M·V(N,dC-1). Es decir, que existan palabras de longitud N, por
ejemplo b, tales que d(b,ai) > dC-1.
Lo que contradice 1). Así pues el supuesto es erróneo. Luego, M ≥ 2N / V(N,dC-1)
Que es precisamente lo que queríamos probar
Cuando C corrige t errores, sabemos que dC > 2t, es decir, dC ≥ 2t+1, que puede escribirse
como dC-1 ≥ 2t. Luego es lícito reescribir el enunciado así:
Si el código canal C de longitud N es maximal y corrige t errores Entonces el número M
de palabras código de C debe ser tal que M ≥ 2N / V(N,2t).
Como M=2k, podemos reescribir M·V(N,2t) ≥ 2N así: 2k·V(N,t) ≥ 2N
Y aplicando logaritmos: k + log2[V(N,t)] ≥ N
Es decir: log2[V(N,t)] ≥ N-k
Es decir, log2[V(N,t)] ≥ r
Es decir, r ≤ log2[V(N,2t)].
Así, los r=N-k bits de redundancia que deben añadirse son, a lo más: log2[V(N,2t)].
Si nos fijamos el enunciado del límite de Gilbert-Varshamov, es claro que esta es una
condición necesaria (para la existencia y construcción de un código C que corrija t
errores), no suficiente.
122
La siguiente tabla nos permite responder en base a los límites
log2[V(N,t)] ≤ r ≤ log2[V(N,2t)].
N log2[V(N,1)] r log2[V(N,2)]
3 2 1 2.80735492
4 2.32192809 2 3.45943162
5 2.5849625 3 4
6 2.80735492 4 4.45943162
7 3 5 4.857981
Lo que muestra que es necesario añadir entre 3 y 4 bits de redundancia, para intentar
construir un código C que corrija un error (es posible que exista, como que no).
También hemos indicado cuántos bits de redundancia es necesario añadir, para empezar la
búsqueda (construcción) de un código canal C con esas características.
Esta no es una tarea fácil. A manera de ejemplo presentaremos algunos códigos que
pueden hacerlo y sus modos de construcción.
123
ALGUNOS EJEMPLOS DE CÓDIGOS CANAL
Debe recordarse en todo momento que es posible suponer un BSC de base (con
probabilidad de acierto p y probabilidad de error q). Sobre el cual se piensa transmitir -a
través del agrupamiento- secuencias de k símbolos (estas son las 2k pre-entradas a'i). A las
que se añaden r bits de redundancia para construir las entradas ai al canal y que
constituyen las 2k palabras código del código canal de longitud N (de entre todas las
posibles 2N palabras).
También debe recordarse que la distancia mínima del código canal C permite colegir
cuántos errores puede detectar y/o corregir.
Finalmente, aunque el código canal C está pensado a eludir el ruido, es claro que
-dependiendo de q y de lo azaroso del ruido- aún es posible que cometamos errores, es
decir, existe una probabilidad PE de decodificación errónea. Ello es fácil de imaginar
cuando el ruido actúa de tal manera que invierte los bits de la entrada de modo que los
convierte en otra palabra código lícita pero diferente de la enviada, en este caso el receptor
-utilizando el principio de decodificación de mínima distancia de Hamming que es
equivalente al de máxima posibilidad- no lo advierte .
Códigos de Paridad.-
Códigos de paridad impar: Que es cuando se añade un bit de redundancia (de valor 0 o 1)
de manera que el número de unos de cada palabra código sea impar.
Ejemplo:
Pre-entradas con k=2: 00,01,10,11
Código de paridad impar con r=1 bit de redundancia: C={001,010,100,111}
Hemos subrayado el bit de redundancia añadido según el esquema.
Códigos de paridad par: Que es cuando se añade un bit de redundancia (de valor 0 o 1) de
manera que el número de unos de cada palabra código sea par.
Ejemplo:
Pre-entradas con k=2: 00,01,10,11
Código de paridad par con r=1 bit de redundancia: C={000,011,101,110}
Hemos subrayado el bit de redundancia añadido según el esquema. Note que dC=2.
Los códigos de paridad par (otro tanto sucede con los de paridad impar) sólo pueden
detectar un error y no corrigen ninguno. Ello se desprende del siguiente resultado.
124
2) Sea C un código de paridad par, entonces existen dos palabras código ai y aj tales que
d(ai,aj)=2.
En efecto. Ya indicamos que las pre-entradas son todas las 2k secuencias de longitud k.
Así pues, estas pre-entradas se suponen distintas, es decir, d(a'i,a'j)>0. Más aún, existen
dos pre-entradas a'i,a'j (por ejemplo dos que son consecutivas, si las pensamos en orden
lexicográfico) tales que d(a'i,a'j)=1, es decir, que difieren en un sólo símbolo.
Si el número de unos de a'i es m entonces el número de unos de a'j es m+1 ó m-1.
Cuando m es par, entonces -por el esquema de paridad par- ai=a'i0 y aj=a'j1.
Cuando m es impar, entonces -por el mismo esquema- ai=a'i1 y aj=a'j0.
En cualquier caso se cumple que d(ai,aj)=d(a'i,a'j)+d(0,1)=1+1=2.
Lo que prueba el enunciado.
En la página 116 se demuestra que un código canal con distancia mínima dC puede
detectar dC-1 errores (en el caso de códigos de paridad: 1) y corregir (dC-1)/2 errores (en
el caso de códigos de paridad: 0.5, es decir, ninguno).
Códigos de Hamming (primera presentación para k=4).- Sea k=4, es decir, las 2k pre-
entradas son 0000, 0001, 0010, etc.
Para construir un código canal de Hamming con pre-entradas de longitud k se añaden r bits
de redundancia tal que: 2r ≥ k + r +1.
En nuestro caso 2r ≥ 4 + r +1, es decir, 2r ≥ 5 + r.
r 2r ≥ 5 + r
1 2≥6
2 4≥7
3 8≥8
Luego, añadiremos r=3 bits de redundancia.
125
Los r bits de redundancia no van necesariamente al final de las pre-entradas, sino como
bits de comprobación de paridad que ocupan las posiciones que son potencias exactas de 2
(1, 2, 4, etcétera).
Una presentación muy popular para nuestro ejemplo es así:
Sean a'1 a'2 a'3 a'4 los 4 bits de las pre-entradas. Los renombraremos así:
p4 p3 p2 p1
Denotaremos los r=3 bits de paridad así: c3c2c1 mismos que ocupan las posiciones 1, 2 y
4.
Así, las entradas al canal, de longitud N = k+r = 4+3 = 7, las podemos representar así:
siete bits de una entrada al canal: a 7 a6 a5 a4 a3 a2 a1
correspondientes a: p4 p3 p2 c3 p1 c2 c1
Fíjese las columnas que corresponden a c3, c2 y c1 (en particular las posiciones con 1). De
ahí obtenemos:
c1 debe tomar en cuenta los bits a7 a5 a3 a1
c2 debe tomar en cuenta los bits a7 a6 a3 a2
c3 debe tomar en cuenta los bits a7 a6 a5 a4
126
pre-entradas código de pre-entradas código de
Hamming Hamming
C C
0000 0000000 1000 1001011
0001 0000111 1001 1001100
0010 0011001 1010 1010010
0011 0011110 1011 1010101
0100 0101010 1100 1100001
0101 0101101 1101 1100110
0110 0110011 1110 1111000
0111 0110100 1111 1111111
Ejemplo:
1 1
H= H(2,2) = -1 H(1,1) = H(1,2) = H(2,1) = 1
1 −1
r1 = [1 1] r2 = [1 -1] r1 º r2 = [1 1]º[1 -1] = (1 · 1) + (1 · -1) = (1) + (-1) = 0
Luego H, es una matriz de Hadamard de orden N=2.
127
A partir de una matriz de Hadamard de orden N se construye un código binario -llamado
código de Hadamard- con 2N palabras código (de longitud N) así:
i) Cambiamos los valores -1 por 0.
ii) Cada fila wi es una palabra código.
iii) Invertimos los bits de wi para obtener una nueva palabra código, wi = wi.
Ejemplo:
Para la matriz H de orden n=2 de arriba.
1 1
i)
1 0
ii) {11, 10}
iii) {00, 01}
1) Compararemos dos palabras código que resulten del paso iii, es decir, de la inversión de
bits. Consideremos la fila i de la matriz. A partir de los incisos i) y ii) es obvio que
∀i d(wi, wi )=N.
2) Ahora compararemos dos palabras código diferentes (que no resulten del paso iii, es
decir, que no resulten de la inversión de bits).
Sabemos que, en la matriz H de orden N, ∀i≠j ri º rj = ri1·rj1 + ... + riN·rjN = 0.
Como cada sumando (o cada producto) es 1 o -1, para que el resultado final sea cero,
deben haber la mitad de sumandos igual a 1 y la otra mitad igual a -1. Es decir, N debe
ser par.
Para que N/2 de los sumandos (o de los productos) sean iguales a -1, estos sumandos (o
productos) deben ser tales que sus dos componentes deben ser diferentes.
[Por ejemplo para que rik·rjk = -1, o bien rik = 1 y rjk = -1 o bien rik = -1 y rjk = 1, es decir,
rik y rjk deben ser diferentes].
Eso, en términos de la distancia de Hamming no es otra cosa que ∀i≠j d(wi,wj)=N/2.
Lo mismo sucede si comparamos dos palabras código diferentes que resulten de la
inversión, o una palabra código no invertida con otra no invertida pero que provengan
de filas diferentes.
Demostración:
Se supone por hipótesis que las filas de H son ortogonales y que sus elementos son 1 o -1.
128
a) Luego, los elementos de H' también son 1 o -1, pues H' se construye a partir H.
b) Sean ri=[ri1 ... riN] y rj=[rj1 ... rjN] dos filas diferentes de H.
Por ser H ortogonal, tenemos que: riºrj = ri1·rj1 + ... + riN·rjN = 0.
Nótese que en los códigos de Hadamard se considera la longitud N del código C (que es el
orden de la matriz H), sin entrar en consideraciones sobre la longitud k de las pre-entradas,
ni sobre el número de bits de redundancia.
Los límites de Hamming y de Gilbert-Varshamov pueden hacer usual este tratamiento: es
decir, construir códigos canal considerando básicamente la longitud N (encapsulando los
valores de k y r).
Más aún los códigos de Hamming y de Hadamard son ejemplos de lo que se denomina
códigos lineales, materia del siguiente capítulo.
129
CÓDIGOS LINEALES
130
En adelante utilizaremos el mismo símbolo · para las operaciones ×,• (e incluso para la
multiplicación de matrices y la concatenación de cadenas) y lo escribiremos sólo cuando
aporte claridad.
Ejemplo:
En el Anexo 3 vimos que S={ (0,0,0), (1,0,1), (0,1,1), (1,1,0) } es un subespacio lineal del
espacio lineal 23. Si hacemos C=S y escribimos C con las licencias mencionadas, tenemos
el siguiente código (subespacio) lineal: C = { 000, 101, 011, 110 }.
Sin embargo, también podemos determinar si C es lineal o no, verificando que la suma
(módulo 2, símbolo a símbolo) de dos palabras código cualesquiera sea otra palabra
código. Por ejemplo: 101 + 011 = 110.
Ya dijimos que una consecuencia de la definición de subespacio lineal, es que la palabra
código correspondiente a una secuencia de (en nuestro ejemplo tres) ceros debe estar en C:
podemos empezar la verificación ahí.
Ejemplo:
En el Anexo 3 se muestra que C = { 000, 101, 011, 110 } tiene como base B = {101, 011},
luego la matriz generadora G2×3 de C es:
1 0 1
G=
0 1 1
C es un código lineal de dimensión 2.
Ejemplo:
1 0 1
El código C de arriba puede especificarse a través de su matriz generadora: G =
0 1 1
131
1 0 1 1 0 1
[0 0]· = [0 0 0] [0 1]· = [0 1 1]
0 1 1 0 1 1
1 0 1 1 0 1
[1 0]· = [1 0 1] [1 1]· = [1 1 0]
0 1 1 0 1 1
Peso de una palabra código.- El peso de una palabra código w de longitud N se define así:
peso(w) = d(w,0…0)
[En términos de la distancia de Hamming; 0…0 representa una secuencia de N ceros].
Nótese que el peso(w) no es otra cosa que el número de posiciones diferentes de 0, en un
código binario eso no es otra cosa que el número de unos.
Recuerde que estamos considerando códigos binarios bloque (de longitud N); asumimos
también que son No Singulares (C ⊆ 2N), y de ahí que son instantáneos (y unívocamente
decodificables).
132
Ejemplo:
Para el código C1 = { 0000, 0001, 0100, 0101 } obtenemos su matriz generadora así:
0 0 0 0 0 1 0 1
0 0 0 1 0 0 0 1
C1 = permutando las filas 1 y 4 : sumando la fila 1 a la 2:
0 1 0 0 0 1 0 0
0 1 0 1 0 0 0 0
0 1 0 1 0 1 0 1
0 1 0 0
sumando la fila 2 a la 3 : 0 1 0 0
0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 1 0 1
Luego, G1 =
0 1 0 0
Aprovechemos este ejemplo para recordar que dada una matriz generadora Gk × N se
obtienen todas las palabras código multiplicando v·G, donde v=[a1 … ak]. Así:
0 0 0 1
Para G2 = su código asociado es C2 = { 0000, 0100, 0001, 0101 }.
0 1 0 0
1 0 0 0
Para G3 = su código asociado es C3 = { 0000, 0100, 1000, 1100 }.
0 1 0 0
Nótese que los tres códigos tienen la misma distancia mínima.
Nótese que, salvo el orden de escritura de las palabras código, C1 y C2 son iguales y que
G2 se obtiene de G1 mediante operaciones elementales sobre filas (fila 1 = fila 1 + fila 2).
Nótese que G3 se obtiene de G2 mediante permutación de columnas (la 1 y la 4) y que las
palabras código de C3 son las palabras código de C2 con los símbolos primero y cuarto
permutados.
Esto nos lleva a preguntarnos cuándo dos matrices generadoras G y G’ generan el mismo
código o cuál la relación entre sus códigos generados.
133
En el Anexo 3 vimos que los espacios lineales C’ y C difieren sólo en el orden de sus
símbolos. Así pues C’ es equivalente a C en el sentido que las palabras código de C’ son el
resultado de permutar los símbolos de las palabras código de C en exactamente las mismas
posiciones.
Es obvio que C’ y C tienen la misma distancia mínima.
Por ejemplo los códigos C2 y C3 de antes son equivalentes.
Así pues, la permutación de columnas preserva todas las propiedades importantes para la
corrección y detección de errores entre los códigos generados por la matriz original y la
matriz resultante (en particular la distancia mínima), por ello consideraremos a dichos
códigos esencialmente los mismos.
1 0 0 0
Retomemos la matriz generadora G3 = , donde hemos puesto en negrita la
0 1 0 0
parte más a la izquierda.
Código dual.- Sea C un código lineal. Denotaremos por C┴ y llamaremos código dual de
C al código definido como sigue:
C┴ = { v∈2N / wºv=0, w∈C }
134
Luego estamos suponiendo que [u1ºv ... ukºv]T ≠ [0 ... 0] T
Es decir, ∃i 1≤ i ≤k uiºv ≠ 0 (*)
Por otro lado, es inmediato que ui ∈C, es decir, los elementos de la base están en C.
Luego, por hipótesis, ∀i 1≤ i ≤k uiºv=0 (**)
La contradicción entre (*) y (**) muestra que nuestro supuesto es erróneo y prueba el
enunciado.
Matriz de (testeo de) paridad.- Sea C un código lineal con matriz generadora Gk × N.
Se denomina matriz de (testeo de) paridad de C, a:
H(N- k) × N la matriz generadora de C┴.
Es evidente que los elementos de la base G (las filas de G) están en C; igual que los
elementos de la base H (las filas de H) están en C┴.
Como por definición de C┴ (y por conmutatividad del producto interno), los elementos de
C y C┴ son ortogonales entre sí. Resulta que:
Por este motivo, así como H es la matriz de testeo de paridad de G, también G es la matriz
de testeo de paridad de H.
135
Obtención de la matriz de paridad H.- En la página 134 vimos que G·xT = 0 si y sólo si
∀w∈C wºx=0.
Es decir, NG (C┴) es el conjunto de todas las soluciones del sistema G·xT = 0k × 1:
g11 ... g1N
... ... ... · [x ... x ]T = [0 ... 0]T
1 N
gk 1 ... gk N
Reescribiendo:
g11.x1 + g12.x2 + … + g1N.xN = 0
g21.x1 + g22.x2 + … + g2N.xN = 0
…
gk1.x1 + gk2.x2 + … + gkN.xN = 0
En el Anexo 3 se señala que k + dim(NG) = N, luego N > k. Dado que hay más incógnitas
que ecuaciones se garantiza la existencia de soluciones no triviales. Luego podemos
simplemente tomar N-k linealmente independientes de entre ellas y así obtenemos una
base de C┴.
Ejemplo:
1 0 1
Sea G = la matriz generadora de C={ 000, 101, 011, 110 }
0 1 1
El sistema G·xT = 0k × 1 una vez efectuada la multiplicación de matrices es:
1.x1 + 0.x2 + 1.x3 = 0 es decir x1 + x3 = 0 es decir x1 = -x3
0.x1 + 1.x2 + 1.x3 = 0 x2 + x3 = 0 x2 = -x3
Ya vimos que, dado el código lineal C, siempre es posible obtener G en forma canónica.
El siguiente resultado permite obtener H de manera inmediata.
Si Gk × N = [ Ik × k : Ak × N-k ] está en forma canónica
Entonces su matriz de paridad es H = [AT : I(N- k) × (N- k) ]
Demostración:
136
v1 a11 ak 1 1 0
Luego H = ... = [ AT : I(N- k) × (N- k) ] = ... ...
vN - k a1(N - k ) ak (N - k ) 0 1
3) gen(H) = C┴.
3.1) Toda combinación lineal de (las filas de) H es ortogonal a las filas de G.
En efecto, una combinación lineal de H es: [b1 … bN-k]·H donde bi ∈{0,1}
T T
Luego: [b1 … bN-k]·H·G = 01 × k pues H·G = 0(N-k) × k
137
Ya vimos en 3.1 que v es ortogonal a las filas de G:
v1g11 + v2g12 + … + vNg1N = 0
v1g21 + v2g22 + … + vNg2N = 0 (*)
…
v1gk1 + v2gk2 + … + vNgkN = 0
w = [a1…ak]·G
= [a1g11 + a2g21 +…+ akgk1 a1g12 + a2g22 +…+ akgk2 … a1g1N + a2g2N +…+ akgkN]
(donde hemos añadido negrita sólo para diferenciar los elementos)
Veamos qué sucede con el producto interno vºw:
vºw
= [v1v2...vN]
º
[a1g11 + a2g21 + … + akgk1 a1g12 + a2g22 + … + akgk2 … a1g1N + a2g2N + … + akgkN]
138
¿ Cómo son los componentes de z = [z1z2...zN] ?
z = [v1v2 ... vk vk+1 ... vN] + (vk+1•r1 + ... + vk+(N-k)•rN-k)
= [v1v2 ... vk vk+1 ... vN] + (vk+1•[ a11 ... ak1 1 0 … 0]
...
+ vN•[a1(N-k) ... ak(N-k) 0 ... 0 1])
= [v1v2 ... vk vk+1 ... vN] + ([vk+1.a11 ... vk+1.ak1 vk+1 0 … 0]
...
+ [vN.a1(N-k) ... vN.ak(N-k) 0 ... 0 vN])
Como dim(C┴)=N-k; las N-k filas de H son linealmente independientes y ellas generan C┴,
entonces H es una base de C┴, es decir, es la matriz de testeo de paridad de G.
Ejemplo:
⎡1 0 1⎤
Sea G = ⎢ ⎥ la matriz generadora de C={ 000, 101, 011, 110 }
⎣0 1 1⎦
Como G está en forma canónica, H = [ 1 1 1 ].
139
Ejemplo:
0 0 0 1
Sea G = Obtenemos Gc mediante permutación de las columnas 1 y 4:
0 1 0 0
1 0 0 0 0 0 1 0
Gc = Cuya matriz de paridad es Hc =
0 1 0 0 0 0 0 1
0 0 1 0
Permutando en Hc las columnas 4 y 1, obtenemos la matriz de paridad H = .
1 0 0 0
Demostración:
Cualquier palabra código es una combinación lineal de los elementos de la base G, es
decir, w = a1…ak·G, luego s = w·HT = a1…ak·G·HT = a1…ak·(G·HT) = 01 × (N- k)
De este modo, desde el punto de vista del receptor, ya tenemos una forma de testear si una
palabra w que llega (w ∈ 2N) , es o no una palabra código (en C):
Calculamos su síndrome y vemos si es 0; si es así w∈C, en otro caso no está en C (se
detecta uno o varios errores). Esto es más práctico que contrastar w con cada una de los
elementos de C (imagine por ejemplo un conjunto C muy grande).
Obviamente aún debemos considerar la posibilidad de que la palabra código enviada haya
sido objeto de tanto ruido que se transformó en otra palabra código (que aunque lícita está
errada respecto del envío original).
Cuando no es este el caso, falta averiguar si podemos determinar en qué posiciones ha
variado la palabra código enviada hasta convertirse en una secuencia que no corresponde a
una palabra código. Los códigos lineales aún nos deparan agradables sorpresas a este
respecto.
Por todo lo visto hasta ahora, los códigos lineales (de longitud N) suelen venir por pares:
- el código C con matriz generadora G y matriz de testeo de paridad H
- el código C┴ con matriz generadora H y matriz de testeo de paridad G.
Ejemplo:
1 0 1
Antes vimos que, para G = , C={ 000, 101, 011, 110 } y H = [ 1 1 1 ].
0 1 1
Por tanto C┴ = { 000, 111 }.
0
Nótese (y es fácil verificarlo) que G·HT = y que H·GT = [0 0].
0
1 1 0 0
Sin embargo, es posible que C=C┴ (G=H) , por ejemplo con G = .
0 0 1 1
140
Código extendido o expandido.- Sea C un código lineal (de longitud N) con matriz
generadora G. Denotaremos por Ce y llamaremos código extendido (de C) a:
Ce = { v / v = v1v2...vNvN+1 = w1w2...wNvN+1, w = w1w2...wN, w∈C, vN+1 = w1+w2+...+wN }
Es decir, se añade a w un dígito más de paridad.
Es claro que Ce es de longitud N+1 y tiene el mismo número de palabras código que C.
Demostración :
Probaremos que las filas de Ge son linealmente independientes y que generan Ce.
Es obvio que las filas de G son linealmente independientes, es decir:
a1•u1 + ... + ak•uk = 01 × N implica que ∀ai ai=0 (*)
Veamos qué sucede con la ecuación:
b1•r1 + ... + bk•rk = 01 × (N+1)
Que puede reescribirse como:
b1•[u1 g11+…+ g1N] + ... + bk•[uk gk1+…+ gkN] = 01 × (N+1)
Es decir :
[b1•u1 b1·(g11+…+ g1N)] + ... + [bk•uk bk·(gk1+…+ gkN)] = 01 × (N+1)
Que puede reescribirse como:
b1•u1 + ... + bk•uk = 01 × N
b1·(g11+…+ g1N) + ... + bk·(gk1+…+ gkN) = 0
Por (*) se concluye que tal sistema sólo acepta la solución trivial.
Es decir, las filas de son Ge son linealmente independientes.
Nótese que ello indica que C y Ce tienen la misma dimensión.
141
Si C es un código lineal binario con distancia mínima dC y Ce es el código expandido de C
Entonces dCe = dC+1 o dCe = dC según dC sea impar o par respectivamente.
Demostración:
Sabemos que en un código lineal dC = min{ peso(w) / w∈C, w≠0…0}.
Si v=wvN+1 ∈Ce, con w∈C y vN+1=w1+w2+...+wN es evidente que:
peso(v) = peso(w) cuando peso(w) es par; o bien
peso(v) = peso(w)+1 cuando peso(w) es impar
El resultado es inmediato.
142
Ejemplo:
⎡1 0 1⎤
Sea C = { 000, 101, 011, 110 } con matriz generadora G = ⎢ ⎥
⎣0 1 1⎦
Los co-conjuntos de C son:
000 + C = { 000, 101, 011, 110 }
010 + C = { 010, 111, 001, 100 }
Demostración:
Supondremos que v está en la fila i de la matriz. Llamemos vi al líder de dicha fila.
Es claro que v está en el co-conjunto vi + C. Como v está en la columna j –por la forma de
construir la matriz- resulta que: v = vi + wj. Es decir, vi = v + wj (*)
Supongamos que wj no es la palabra código más cercana a v, es decir, ∃wh d(v,wh)<d(v,wj)
Como d(v,wj)=peso(v+wj) y d(v,wh)=peso(v+wh), resulta que:
peso(v+wh) < peso(v+wj)
Como -por (*)- peso(v+wj)=peso(vi), tenemos: peso(v+wh) < peso(vi)
Además v+wh = vi + wj + wh = vi + wñ puesi v=vi + wj y por la linealidad de C
Es decir, v+wh (= vi + wñ) está –por construcción- en la fila i (o, lo que es lo mismo, por
definición v+wh está en el co-conjunto vi + C).
Esto contradice el hecho de que vi sea el líder de la fila i. El resultado sigue.
Más aún, en seguida mostramos que si C corrige hasta t errores, es decir t=[(dC-1) /2], wj
es la única palabra más cercana a v.
Sea C un código lineal con distancia mínima dC que corrige hasta t=[(dC-1) /2] errores.
Sea vi el líder de la fila i en la matriz estándar.
Si v está en la columna j de la matriz estándar (en la fila i) y peso(vi) ≤ t
Entonces wj es la única palabra código más cercana a v
Demostración:
Sabemos que v = vi + wj. Es decir, vi = v + wj (*)
También sabemos que wj es la palabra código más cercana a v.
Supongamos que wj no es la única palabra código más cercana a v, es decir:
∃wh d(v,wh) ≤ d(v,wj) (**)
143
d(wj,wh) ≤ d(wj,v) + d(v,wh) probado en la página 112
≤ d(wj,v) + d(v,wj) por (**)
= 2·d(v,wj) obvio
= 2·peso(v+wj) pues d(v,wj)=peso(v+wj)
= 2· peso(vi) por (*)
≤ 2·t por hipótesis
≤ (dC-1) pues C corrige hasta t=[(dC-1) /2] errores
< dC obvio
≤ d(wj,wh) por definición de dC
Es decir: d(wj,wh) < d(wj,wh). Contradicción que prueba el enunciado.
Demostración:
v,v' ∈ 2N están en el mismo co-conjunto (donde u+C es el co-conjunto donde está v)
si y sólo si por definición de co-conjunto
v = u + wi
v' = u + wj
si y sólo si obvio
u = v + wi
u = v' + wj
si y sólo si obvio
v + wi = v' + wj
si y sólo si obvio
v + v' = wi + wj
si y sólo si linealidad de C y (a); donde wñ=(wi+wj) ∈ C
v + v' = wñ
si y sólo si obvio
v + v' ∈ C
144
Sea C un código lineal con matriz de paridad H.
Sean s,s' los síndromes de v,v' ∈ 2N.
Demostración:
v,v' están en el mismo co-conjunto
si y sólo si por (b)
(v+v') ∈ C
si y sólo si resultado demostrado en el subtítulo síndrome
(v+v')·HT = 0
si y sólo si propiedades de matrices
(v·HT + v'·HT) = 0
si y sólo si obvio
v·HT = v'·HT
si y sólo si definición de síndrome y supuestos
s = s'
Así pues todas las palabras código que están en el mismo co-conjunto (en la misma fila de
la matriz estándar) tienen el mismo síndrome, en particular el mismo síndrome que su
líder.
El algoritmo de la matriz estándar asume que la secuencia v que se recibe está en la fila i,
columna j de la matriz (en el co-conjunto vi+C), es decir: v = vi + wj = wj + vi
Y decide que se ha enviado wj. Es claro que wj = v + vi.
Es decir, en vez de buscar la palabra código que está al principio de la columna j (en la
primera fila), podemos hacer el cálculo v + vi, es decir, sumar a lo que se recibe el líder de
su co-conjunto.
Como en ese caso los síndromes de v,vi son iguales (por lo que acabamos de demostrar),
para identificar el co-conjunto (y su líder) al cual pertenece la secuencia recibida v, basta
determinar el síndrome de v (que iguala al síndrome de vi).
Ejemplo:
⎡1 1 0 0⎤
Sea C = { 0000, 1111 } con G =[ 1 1 1 1 ] H = ⎢⎢1 0 1 0⎥⎥ dC=4
⎢⎣1 0 0 1⎥⎦
145
Tabla de líderes Tabla de síndromes
0000 000
1000 111
0100 100
0010 010
0001 001
1100 101
1010 101
1001 110
Demostración :
⎡ h11 ... h1N ⎤
Sea w=w1w2...wN y sea H = ⎢⎢ ... ... ... ⎥⎥ = [columna1 ··· columnaN]
⎢⎣h(N - k )1 ... h(N - k )N ⎥⎦
Como
w·HT = [w1·h11+…+ wN·h1N ··· w1·h(N-k)1+…+ wN·h(N-k)N]
= [w1·h11 w1·h21 … w1·h(N-k)1] + ··· + [wN·h1N wN·h2N … wN·h(N-k)N]
= w1•[h11 h21 … h(N-k)1] + ··· + wN•[ h1N h2N … h(N-k)N]
= w1•(columna1)T + ··· + wN•(columnaN)T
Entonces la ecuación w·HT = 0 puede reescribirse así:
w1•(columna1)T + ··· + wN•(columnaN)T = 0 (*)
Cuando w≠0 (*) es una relación de dependencia lineal entre las columnas.
Con más especificidad, las columnas que intervienen explícitamente en esta relación de
dependencia lineal son aquellas para las que wi≠0.
Resumiendo: Si w ∈ C (w≠0) entonces hay una relación de dependencia lineal entre las
columnas de H (específicamente entre aquellas para las que -correspondientemente- wi≠0).
Como C es lineal: dC = min{ peso(w) / w∈C, w≠0…0}. Es decir, dC es el menor número
de unos de algún w∈C (considerando todas las palabras código diferentes de 0).
Pero entonces –por lo dicho antes-, dC es el menor número de columnas linealmente
dependientes de H. Que es lo que queríamos demostrar.
146
En efecto, el menor número de columnas linealmente dependientes de H es 1 cuando la
ecuación: wi•(columnai)T = 0 tiene solución o soluciones no triviales (es decir wi≠0).
Pero en ese caso wi=1 y la ecuación es: (columnai)T = 0.
De manera que dC=1 cuando H tiene una columna de ceros.
Consideremos el caso dC=2. El menor número de columnas linealmente dependientes de
H es 2 cuando la ecuación:
wi•(columnai)T+wj•(columnaj)T = 0 tiene soluciones no triviales (es decir: wi,wj≠0)
Pero en ese caso wi=wj=1 y la ecuación es: (columnai)T+(columnaj)T = 0
Como en Z2 el inverso de 0 es 0 y el de 1 es 1, la única forma de que tal ecuación se
satisfaga es cuando la columnaj y la columnai son iguales.
De manera que dC=2 cuando H tiene dos columnas iguales.
El corolario es:
Si C es un código lineal con matriz de paridad H
Entonces la distancia mínima dC ≥ 3 cuando H tiene columnas diferentes y distintas de 0.
Demostración:
Sin pérdida de generalidad suponemos que la matriz generadora de C es G=[Ik × k : Ak × N-k]
Cada fila de G es una palabra código w∈C.
Por la forma de G (matriz identidad y a la derecha la matriz Ak × N-k) el peso de cada fila es:
peso(w) ≤ N-k +1 (el 1 viene de Ik × k; N-k es el número de símbolos de las filas de A
–no necesariamente todos unos-)
Como dC = min{ peso(w) / w ∈ C, w≠0…0}, es evidente que dC ≤ N-k +1.
Demostración:
Recordemos que el rango de una matriz es el número de filas linealmente independientes.
1) Si existe una matriz (de paridad) H(N- k) × N de rango N-k donde cada grupo de 2t
columnas es linealmente independiente
Entonces Existe C un código lineal binario de longitud N y dimensión k que corrige t
errores.
En efecto, dada la matriz H(N- k) × N donde todas sus filas son linealmente independientes.
Sabemos que el núcleo de H es es un subespacio lineal de 2N:
NH = { v∈2N / H·vT = 0 } = { v∈2N / v·HT = 0 } (en este caso NH es de dimensión k)
Tomemos C=NH como el código lineal binario de longitud N.
H es claramente la matriz de paridad de C.
147
Por otro lado, como cada grupo de 2t columnas de H es linealmente independiente, en el
Anexo 3 indicamos que, si le añadimos otro elemento el conjunto resultante se torna
linealmente dependiente-, es decir, cualquier conjunto de 2t+1 columnas de H es
linealmente dependiente.
En la página 146 demostramos que la distancia mínima dC de nuestro código lineal es el
mínimo número de columnas linealmente dependientes de H. Por lo que concluimos que:
dC = 2t+1.
Lo que nos permite concluir que C corrige t errores.
Juntando ambos criterios, para construir un código lineal perfecto que corrija t errores:
Debemos tener una matriz con r=N-k filas y N=2r–1 columnas las cuales son diferentes de
a pares y ninguna es la columna cero; además debe verificarse que N=2N-k – 1.
148
Pero sólo hay 2r distintas columnas binarias de r posiciones (incluyendo la columna de
ceros).
Así pues la única forma de construir H es colocando todas las columnas binarias de
longitud r (excluyendo la columna de ceros) en algún orden.
De manera más informal podemos decir que H se construye colocando los números de 1 a
N (en algún orden) en binario (con r posiciones) por columnas.
Es claro que con esas condiciones se satisface: N=2N-k – 1 (pues 2r–1=N=2N-k – 1=2r–1), es
decir, los códigos resultantes son perfectos.
El orden en que se coloquen las columnas no afecta a la distancia mínima y sólo devuelve
códigos equivalentes (por permutación de columnas).
Ejemplo:
Para (N,k) = (7,4) es evidente que se satisface 7 = N = 2N-k – 1 = 27-4 – 1 = 23 – 1 = 8 –1 = 7
Construimos la matriz de paridad colocando los números de 1 a 7 en binario por columnas.
El orden no influye en lo esencial del código. Para diferentes órdenes los códigos
resultantes son equivalentes. Sin embargo, hay otras ventajas eligiendo uno u otro orden.
Para obtener la matriz generadora primero debemos colocar esta matriz de paridad en
forma canónica (recordando las permutaciones entre columnas: 1 con 7, 2 con 6, 4 con 5),
luego obtener inmediatamente la matriz generadora en forma canónica y a partir de ella
volver a construir la matriz generadora buscada, permutando las columnas en orden
inverso (como ya vimos antes).
149
⎡1 1 0 1 0 0 1⎤
⎢0 1 0 1 0 1 0⎥⎥
El resultado es: G = ⎢
⎢1 1 1 0 0 0 0⎥
⎢ ⎥
⎣1 0 0 1 1 0 0⎦
Todos los códigos de Hamming para t=1 tienen distancia mínima dC=3.-
Obviaremos el caso trivial (N,k) = (1,0). El siguiente par de valores que satisface la
ecuación N=2N-k – 1 es (N,k) = (3,1), es claro que hay otros infinitos valores que satisfacen
esta condición. Todos ellos tienen N ≥ 3.
Así las columnas de las matrices H d elos códigos de Hamming incluyen la que debe
llenarse con el 1, con el 2 y la que debe llenarse con el 3 (posiblemente hay más
columnas).
Se sabe que la distancia mínima de un código lineal se puede calcular a través de su matriz
de paridad. De hecho es el mínimo número de columnas linealmente dependientes de H.
Más aún, vimos que dC ≥ 3 cuando H tiene columnas diferentes y distintas de 0, como es
el caso de las matrices de paridad de los códigos de Hamming.
En ellas es evidente que tres columnas son linealmente dependientes: Si sumamos la
columna “contiene” al 1 con la del 2 obtenemos la columna c3 que “contiene” al 3. Es
decir: [ wi•(columna idel1)T+wj•(columnajdel2)T] + wñ•(columnañdel3)T = 0
Tiene la solución no trivial wi = wj = wñ = 1.
Luego, el mínimo número de columnas linealmente dependientes de H es 3.
Es decir, dC=3 en los códigos de Hamming (para t=1).
En rigor, si anotamos las columnas de una matriz H genérica (con los números de 1 a N
anotados secuencialmente por columnas) así:
⎡ 0 0 ... 1 ⎤
⎢... ... ... ...⎥
H =⎢ ⎥ La suma (módulo 2) de cualquier par de columnas devuelve otra.
⎢ 0 1 ... 1 ⎥
⎢ ⎥
⎣ 1 0 ... 1 ⎦
Así, el mínimo número de columnas linealmente dependientes de H es 3 como dijimos.
150
Sea C un código lineal de Hamming de longitud N con matriz de paridad H.
Sea e ∈ 2N tal que peso(e) = 1 (e contiene sólo ceros excepto un 1 en la posición j)
Entonces e·HT = cjT (donde cj es la columnaj de H)
Demostración:
Recordemos que las columnas de H consisten de secuencias que pueden interpretarse
como los números binarios de 1 a N (en algún orden).
Denotaremos la palabra e genéricamente así: e = [0...0 1 0...0] (el 1 en la posición j)
⎡ h11 ... h1N ⎤
Sea H = ⎢⎢ ... ... ... ⎥⎥
⎢⎣h(N - k )1 ... h(N - k )N ⎥⎦
⎡ h11 ... h(N - k )1 ⎤
Luego, e·H = [0...0 1 0...0] · ⎢⎢ ... ...
T
... ⎥⎥ = [h1j h2j ... h(N-k)j] = cjT
⎢⎣h1N ... h(N - k )N ⎥⎦
Como las columnas de H son diferentes, palabras de peso 1 diferentes tienen síndromes
diferentes.
Recordemos que v,v' están en el mismo co-conjunto si y sólo si s = s'.
Es lo mismo decir que s ≠ s' si y sólo si v,v' están en co-conjuntos distintos.
Luego, todas las palabras de peso 1 están –cada una- en diferentes co-conjuntos.
Así pues podemos tomar las palabras de peso 1 como líderes de cada co-conjunto.
151
Sin embargo, si la matriz de paridad H para el código de Hamming se construye siguiendo
la (intuitiva) colocación en secuencia el algoritmo de decodificación se simplifica aún
más.
En efecto, cuando recibimos la palabra v, obtenemos su síndrome s = v·HT, luego
buscamos tal síndrome en la tabla de síndromes, tomamos el líder vi del co-conjunto que
está en la primera tabla al lado de s, hacemos el cálculo v + vi.
Y decidimos que se ha enviado wj = v + vi.
Pero el líder vi del co-conjunto no es otra cosa que una palabra e de peso 1 (vi = e).
De manera que la suma (v + vi) no es otra cosa que (v + e) –donde e tiene un 1 en la
posición j -, que no es otra cosa que cambiar el bit de la posición j de v
¿Cuál posición? La que corresponda a la columna j de H.
En el caso señalado, H tiene la colocación en secuencia de los número de 1 a N en binario,
las columnas j corresponden a los números j (en decimal).
Ejemplo:
1 2 3 4 5 6 7
⎡0 0 0 1 1 1 1⎤
Para H = ⎢⎢0 1 1 0 0 1 1⎥⎥
⎢⎣1 0 1 0 1 0 1⎥⎦
Si se recibe v = 1100100, el síndrome de v es s = v·HT = 110 = (6)10
Luego invertimos el bit en la posición j = 6 de v, decidiendo que se envió w = 1100110.
⎡1 1 0 1 0 0 1 ⎤
⎢0 1 0 1 0 1 0 ⎥
Código dual de un código de Hamming.- Para G = ⎢ ⎥ cuyo código
⎢1 1 1 0 0 0 0 ⎥
⎢ ⎥
⎣1 0 0 1 1 0 0 ⎦
de Hamming correspondiente C se encuentra descrito en su integridad en dicho apartado,
sabemos que su código dual se obtiene a partir de la correspondiente matriz de paridad H
⎡0 0 0 1 1 1 1⎤
que en este caso es: H = ⎢⎢0 1 1 0 0 1 1⎥⎥
⎢⎣1 0 1 0 1 0 1⎥⎦
152
Código expandido de un código de Hamming.-
⎡1 1 0 1 0 0 1 ⎤
⎢0 1 0 1 0 1 0 ⎥
Para G = ⎢ ⎥ cuyo código de Hamming correspondiente C, con
⎢1 1 1 0 0 0 0 ⎥
⎢ ⎥
⎣1 0 0 1 1 0 0 ⎦
dC=3, se encuentra descrito en su integridad en dicho apartado, sabemos que su código
expandido se obtiene a partir de la siguiente matriz generadora (tal como se indica en el
apartado de códigos expandidos):
⎡1 1 0 1 0 0 1 0 ⎤
⎢0 1 0 1 0 1 0 1 ⎥
Ge = ⎢ ⎥
⎢1 1 1 0 0 0 0 1 ⎥
⎢ ⎥
⎣1 0 0 1 1 0 0 1 ⎦
Además como se indica en dicho apartado su distancia mínima es dCe = dC+1 pues dC es
impar. Es decir, como dC=3, resulta que: dCe = 4.
153
CÓDIGOS CÍCLICOS
Ejemplos:
Sea el código lineal C = { 000, 111 }
La rotación de la palabra código 000 es 000.
La rotación de la palabra código 111 es 111.
Es claro que cualquier rotación de una palabra código es una palabra código, luego C es
cíclico.
Es evidente –de la definición de código cíclico y del concepto de rotación- que las
rotaciones pueden ser más de una vez y a la izquierda o a la derecha.
Tratar a un código (debido a que posee ciertas carácterísticas) como a un espacio lineal
permite derivar propiedades y resultados que de otro modo resulta complicado.
Al trabajar con códigos cíclicos binarios de longitud N (C ⊆ 2N) haremos algo semejante.
Identificaremos cada palabra (sea código o no) con un polinomio de la siguiente manera:
Donde la suma y multiplicación de polinomios son las habituales (con coeficientes en Z2).
Técnicamente estamos haciendo una transformación que denominaremos polinomial,
donde introducimos la indeterminada u operador de posición de bit: x.
Nótese que las palabras se identifican con polinomios de grado menor a N.
Ejemplo:
Palabras código de C Polinomios asociados
000 0
101 1 + x2
011 x + x2
110 1+x
154
En el Anexo 4 (que debe leerse) se muestra que Z2N[x]/(xN+1) es un anillo, donde Z2N[x]
denota al conjunto de todos los polinomios de grado menor a N (con coeficientes en Z2), y
donde se trabaja con la multiplicación de polinomios módulo (xN + 1).
Luego, por la distribución del producto (·) respecto de la suma y la reducibilidad de mod:
Sea q(x)∈Z2N[x]/(xN+1)
q(x) × b(x) = q(x) · b(x) mod (xN + 1) es el polinomio asociado a una suma
de
rotaciones de b = b1...bN
Demostración:
Previamente veamos este ejemplo.
Considerando C Considerando Cp
000 0
101 1 + x2
011 x + x2
110 1+x
155
La multiplicación de cualquier polinomio en Z23[x]/(x3+1) por un elemento de Cp es otro
polinomio en Cp. Por ejemplo con [1 + x + x2] y el polinomio asociado a 011:
Retomando la demostración.
i) Sea Cp el conjunto de polinomios asociados a las palabras código de C.
Si el código lineal C es cíclico Entonces Cp es un ideal.
Dado que C es lineal y cíclico es claro que:
- La suma de dos palabras código es otra palabra código
- La rotación de una palabra código es también una palabra código
Sea w(x)∈Cp el polinomio asociado a w=w1w2...wN-1wN∈C.
Ya vimos que x × w(x) = x · w(x) mod (xN + 1) = wN + w1x + w2x2 + ... + wN-1xN-1
Es claro que wN + w1x + w2x2 + ... + wN-1xN-1 es el polinomio asociado a wNw1w2...wN-1,
que es una rotación de w y como w∈C y C es cíclico resulta que wNw1w2...wN-1∈C.
Como Cp es el conjunto de polinomios asociados a las palabras código de C se deduce
que [x × w(x)]∈Cp.
El mismo razonamiento repetido, muestra que [xi × w(x)]∈Cp.
Finalmente, la distribución de × sobre + y la linealidad de C permiten ver que, dada b
una palabra de longitud N arbitraria y b(x) su polinomio asociado:
∀w(x)∈Cp ∀b(x)∈Z2N[x]/(xN+1) [b(x) × w(x)]∈Cp
Es decir, que Cp es un ideal.
156
Es decir, una rotación de una palabra código de C también es una palabra código de C.
Bajo un razonamiento análogo, con b(x) = xi, se deduce que i rotaciones de una palabra
código de C también es una palabra código de C.
Es decir, C es cíclico.
Ambos incisos i) y ii) prueban el enunciado; el cual muestra que técnicamente estamos
hablando de un isomorfismo.
Si Cp es un ideal Entonces
1) Hay un único polinomio w(x) de grado mínimo r≠0 en Cp.
2) Cp ⊆ { b(x) · w(x) / gr(b(x)) < N − r} [gr(b(x)): el grado de b(x)]
3) { b(x) · w(x) / gr(b(x)) < N − r} ⊆ Cp.
4) Cp = {b(x) · g(x) / gr(b(x)) < N − r}. Es decir, g(x) genera Cp.
5) g(x) | (xN + 1). Es decir, g(x) es un factor de (xN + 1)
6) { g(x), x ×g(x), ... , xk-1 × g(x) } es una base de Cp [donde N-k = r = gr(g(x))].
7) La dimension de Cp es k.
Demostración:
1) Supongamos que en Cp hay dos polinomios de grado mínimo r, w(x) y v(x):
w(x ) = w1 + w2x + ... + wrxr-1 + wr+1xr (con wr+1=1)
v(x ) = v1 + v2x + ... + vrxr-1 + vr+1xr (con vr+1=1)
Es claro que w(x) + v(x) = (w1 + v1) + ... + (wr+vr)xr-1 + 0
Como Cp es un subespacio lineal, w(x)+v(x)∈Cp.
Luego, hay un polinomio en Cp de grado menor que r.
Esta contradicción prueba el enunciado.
157
3) Sea w(x) el único polinomio de grado mínimo r.
Sea b(x) un polinomio tal que gr(b(x)) < N − r.
Sea [b(x) · w(x)] un polinomio múltiplo de w(x).
Es decir, sea [b(x)·w(x)]∈{b’(x)·w(x)}.
Es evidente que gr[b(x) · w(x)] < N.
Luego, b(x) · w(x) = b(x) × w(x) = w(x) × b(x).
Como Cp es un ideal [w(x) × b(x)]∈Cp.
Lo que prueba el enunciado.
5) Si g(x) es el polinomio de grado mínimo en Cp, es claro que [xN-r · g(x)] es de grado N.
Sea [xN-r × g(x)] = xN-r · g(x) mod (xN + 1) = h(x).
Es decir: xN-r · g(x) = (xN + 1) + h(x) (i)
N-r
Como g(x)∈Cp y Cp es un ideal, es claro que [x × g(x)]=h(x)∈Cp.
Luego, por 2): h(x) = b(x) · g(x) (ii)
Entonces:
xN-r · g(x) + h(x) = (xN + 1) + h(x) + h(x) por (i)
N
= x +1 obvio (iii)
Por lo tanto:
xN-r · g(x) + h(x) = xN-r · g(x) + b(x) · g(x) por (ii)
= xN + 1 por (iii)
De donde se deduce que:
xN-r · g(x) + b(x) · g(x) = [xN-r + b(x)] · g(x) = xN + 1
Es decir, g(x) es un factor de (xN + 1).
Nótese que g(x) ≠ x, pues x no divide a (xN + 1).
Representemos a g(x) así: g(x) = g0x0 + g1x1 + ... + grxr
Nótese también que g0 ≠ 0, pues en tal caso g(x) = x · (g1 + g2x ... + gr-1xr-1), y como g(x)
es un factor de (xN + 1), esto mostraría que (g1 + g2x ... + gr-1xr-1) y (x) también lo son, cosa
descartada cuando menos en el último caso.
158
Que es equivalente a:
a0g(x) + a1[x · g(x) mod (xN + 1)] + ... + ak-1[xk-1 · g(x) mod (xN + 1)] = 0
Que es equivalente a:
a0[g(x) mod (xN + 1)] + a1[x·g(x) mod (xN + 1)] +...+ ak-1[xk-1 ·g(x) mod (xN + 1)] = 0
Que es equivalente a:
[a0 g(x) + a1 x·g(x) +...+ ak-1 xk-1 ·g(x)] mod (xN + 1) = 0
Pero gr([a0 g(x) + a1 x·g(x) +...+ ak-1 xk-1 ·g(x)]) < N
De manera que el único modo en que
[a0 g(x) + a1 x·g(x) +...+ ak-1 xk-1 ·g(x)] mod (xN + 1) = 0
es para 0≤ i ≤k-1: ai = 0
Por lo tanto, { g(x), x ×g(x), ... , xk-1 × g(x) } es linealmente independiente.
7) Dado que el número de elementos de { g(x), x ×g(x), ... , xk-1 × g(x) } es k, es obvio a
partir del inciso 6 que: dim(Cp) = k.
Demostración:
Recordemos que el ideal Cp es el conjunto de polinomios asociados a C.
Sea g(x) = g0x0 + g1x1 + ... + gr-1xr-1 + grxr, el polinomio generador de Cp.
Como dim(Cp)=k, y Cp es un isomorfismo de C, entonces dim(C)=k.
159
Este hecho también puede deducirse del siguiente modo: Sea
Estrictamente hablando g(x) es el polinomio generador del ideal Cp (no de C), pero como
la identificación de cada palabra con un polinomio es 1-1, en adelante ignoraremos las
distinciones rígidas entre C y Cp.
160
Un noveno resultado se añade a los ocho anteriores.
Demostración:
Sea N-k = r = gr(g’(x)).
Sea Sp = { g’(x) × q(x) / q(x)∈Z2N[x]/(xN+1) }
En el Anexo 4 vimos que Sp es un ideal.
Luego:
[b(x) × t(x)] = [q(x) × g’(x) × t(x)] pues b(x) = q(x)×g’(x)
= [q(x) × [g’(x) × t(x)]] asociatividad de ×, Anexo 4
= [q(x) × [g’(x) · t(x) mod (xN + 1)]] definición de ×
= [q(x) × [(xN + 1) mod (xN + 1)]] g’(x) · t(x) = (xN + 1)
= [q(x) × [ 0 ]] obvio
= [q(x) · 0 mod (xN + 1)] definición de ×
=0 obvio
Pero 0<gr(b(x)·t(x))<gr(g’(x)·t(x)) = N, luego es absurdo que [b(x) × t(x)] = 0.
Luego, el supuesto es erróneo y g(x)=b(x) es el polinomio de grado mínimo en Sp.
Por los resultados 1 y 4, es el polinomio generador de Sp.
Sea C el conjunto de palabras código asociadas a los polinomios de Sp.
En la tercera página de este capítulo, probamos que:
Si Sp es un ideal Entonces el código C es cíclico.
Luego C es un código cíclico.
g’(x) es el polinomio generador de Sp y la matriz generadora de C se puede construir a
partir de g’(x) como en el inciso 8).
Los resultados 1 a 8 nos brindan, dado un código cíclico C, un nuevo modo de enfocarlos.
Y, por ejemplo, una otra manera de obtener su matriz generadora C.
El resultado 9, por otro lado, nos permite obtener códigos cíclicos de longitud N,
factorizando (xN + 1).
Ejemplo:
Para N=3 (x3 + 1) = (1+x) · (1 + x + x2)
Para g(x) = (1 + x + x2), G = [1 1 1] que genera el código cíclico C = { 000, 111 }.
⎡1 1 0 ⎤
Para g(x) = (1 + x), G = ⎢ ⎥ que genera el código cíclico C = {000, 011, 110, 101}.
⎣0 1 1 ⎦
161
Mostraremos ahora que lo que se puede hacer en C (con la matriz G) puede hacerse en Cp
a través del polinomio g(x).
Nótese que i) y ii) devuelven resultados equivalentes, uno en términos de palabras código
y otro en términos de sus polinomios asociados [ los coeficientes del polinomio resultante
en ii) son los componentes de la palabra código resultante en i) ].
Veremos ahora cómo podemos hacer una analogía con polinomios respecto de lo que
hacíamos con matrices y/o palabras código.
162
Trabajando con matrices en el código C Trabajando con polinomios en Cp
Obtenga la forma canónica Gc=[ I : A ] de Como g(x) divide a (xN + 1), entonces
G, luego Hc=[ AT : I ] y luego H aplicando (xN + 1) = g(x) · h(x)
en orden inverso las permutaciones de Es decir, h(x) = (xN + 1) / g(x).
columnas.
Dada la matriz Gk × N generar el código C Dado el polinomio g(x) con gr(g(x))= r =N-k
así: generar Cp así:
La primera y cuarta analogías ya fueron demostradas. Las otras las probamos ahora.
Demostración:
i) Si w(x)∈Cp Entonces w(x) × h(x) = 0
En efecto. Como w(x)∈Cp, w(x)=a(x)·g(x). Luego,
w(x) × h(x) = a(x)·g(x) × h(x)
= a(x)·g(x)·h(x) mod (xN+1) por definición de ×
= a(x)·(xN+1) mod (xN+1) pues (xN+1)=g(x)·h(x)
=0 obvio
ii) Si w(x) × h(x) = 0 Entonces w(x)∈Cp
En efecto. Como w(x) × h(x) = w(x) · h(x) mod (xN+1). Por hipótesis:
w(x) · h(x) mod (xN+1) = 0. Es decir: w(x) · h(x) = q(x) · (xN+1). Es decir:
w(x) · h(x) = q(x) · g(x) · h(x)
Dividiendo ambos lados de la expresión por h(x), tenemos:
w(x) = q(x)·g(x)
163
Aunque h(x) es el polinomio de paridad de Cp, el isomorfismo que construimos no
preserva el producto interno. De manera que el ideal C’p generado por h(x) no es el dual
de Cp (en realidad es un ideal equivalente a él). Por ello es necesario el siguiente resultado.
Demostración:
Requerimos el siguiente resultado previo:
Demostración:
Veamos un ejemplo pequeño que aporte claridad, antes de la demostración general.
Trabajemos para N=3 con a(x) = a0 + a1x + a2x2 y b(x) = b0 + b1x + b2x2
Es claro que:
a(x) × b(x)
= a(x) · b(x) mod (x3+1)
= [ (a0 + a1x + a2x2) · (b0 + b1x + b2x2) ] mod (x3+1)
= [ a0b0 + (a0b1+a1b0)x + (a0b2+a1b1+a2b0)x2 + (a1b2+a2b1)x3 + (a2b2)x4 ] mod (x3+1)
en Z2[x] se obtiene [p(x) mod (xN+1)] reemplazando xN por 1 en p(x)
= [ a0b0 + (a0b1+a1b0)x + (a0b2+a1b1+a2b0)x2 + (a1b2+a2b1) + (a2b2)x ]
= [ (a0b0+a1b2+a2b1) + (a0b1+a1b0+a2b2)x + (a0b2+a1b1+a2b0)x2 ] (*)
También es claro que: Con a=a0a1a2 y b’=b2b1b0
a º b’ = a º rot0(b’) = (a0a1a2) º (b2b1b0) = (a0b2+a1b1+a2b0) (**)
a º rot1(b’) = (a0a1a2) º (b0b2b1) = (a0b0+a1b2+a2b1) (**)
2
a º rot (b’) = (a0a1a2) º (b1b0b2) = (a0b1+a1b0+a2b2) (**)
Nótese que los coeficientes de (*) son iguales a los valores en (**).
Para este ejemplo, es evidente que a(x)×b(x) = 0 si y sólo si ∀i a º roti(b’) = 0.
Exactamente lo mismo sucede si hacemos las rotaciones sobre a en vez de sobre b’.
164
= [ a0b0 + (a0b1+a1b0)x + (a0b2+a1b1+a2b0)x2 + …
…
+ (a0bN-1+a1bN-2+…+aN-2b1+aN-1b0)xN-1
+ (a1bN-1+a2bN-2+…+aN-2b2+aN-1b1)xN
+ (a2bN-1+…+aN-2b3+aN-1b2)xN+1 + …
…
+ (aN-2bN-1+aN-1bN-2)x2N-3 + (aN-1bN-1)x2N-2 ] mod (xN+1)
= (a0b0+a1bN-1+a2bN-2+…+aN-2b2+aN-1b1)
+ (a0b1+a1b0+a2bN-1+…+aN-2b3+aN-1b2)x
+ (a0b2+a1b1+…+aN-1b3)x2
...
+ (a0bN-1+a1bN-2+…+aN-2b1+aN-1b0)xN-1
Note que el coeficiente de xj es: (a0bj+a1bj-1+…+ajb0+aj+1bN-1+…+aN-2bj+2+aN-1bj+1)
Como en el caso del ejemplo pequeño, los coeficientes de este polinomio son los
mismos que los valores de los productos internos a arriba. Es decir:
a(x)×b(x) = 0 si y sólo si ∀i a º roti(b’) = 0.
Exactamente lo mismo sucede si hacemos las rotaciones sobre a en vez de sobre b’.
El resultado previo afirma que la palabra g=g0g1...gN-1 (en la que los últimos símbolos
posiblemente sean ceros) es ortogonal a la palabra b’=hR=hN-1...h1h0 y a todas sus
rotaciones.
165
Sucede exactamente lo mismo al revés, es decir, la palabra hR es ortogonal a la palabra g y
a todas sus rotaciones.
Luego, como las palabras de C son combinaciones lineales de la palabra g y sus
rotaciones. Y como las palabras de Z=gen(HR) son combinaciones lineales de la palabra
hR y sus rotaciones. Y como en el Anexo 3 probamos que:
(a·u ⊕ b·v)ºw = a·(uºw) + b(vºw).
Se deduce que todas las palabras de C son ortogonales a todas las palabras de Z, en
particular todas las palabras de C son ortogonales a hR y a todas sus rotaciones (Z⊆C┴).
Las filas de HR forman un conjunto linealmente independiente de N-k elementos en C┴
(por la ortogonalidad y la definición de código dual).
Al ser N-k la dimensión de C┴ (ver el anterior capítulo) una de sus bases es este conjunto.
Entonces Z = C┴. Es decir, el código generado por HR es C┴ (el dual de C).
(Nótese que HR es la matriz de paridad de C).
Dado el isomorfimo entre ideales y códigos, C┴ es isomorfo a un ideal, llamémosle Cp┴.
El resultado sigue.
Así la información aparece íntegra al final y Así la información aparece íntegra al final y
la redundancia al principio. la redundancia al principio.
166
Si g(x) es el polinomio generador de Cp y v(x) es un polinomio con gr(v(x))=k-1
Entonces su codificación sistemática es w(x) = [v(x)·xr mod g(x)] + v(x)·xr.
Demostración:
Supondremos k bits de mensaje y r bits de redundancia.
Debido al requerimiento de sistematicidad, ya no es posible codificar v(x) así:
v(x)·g(x) = w(x)
En su lugar, la codificación debe incluir otro polinomio q(x) [en función de v(x)] tal que:
w(x) = q(x)·g(x) = d(x) + v(x)·xr
Es claro que es posible asignar q(x)=[d(x) + v(x)·xr]/g(x).
Es evidente que estamos pensando que los coeficientes del polinomio d(x), constituyan la
redundancia, y que su grado sea a lo más r-1.
Es claro también, para que la información aparezca íntegra a la derecha (luego de la
redundancia), que v(x) debe “trasladarse” al final de w(x), cuyo grado es a lo más (N-1), y
como gr(v(x)) es a lo más k-1, tal “traslado” sucede multiplicando v(x) por xr.
Resta determinar d(x).
Como w(x) = d(x) + v(x)·xr, entonces: w(x) + v(x)·xr = d(x) (1)
Recordemos también que w(x) = q(x)·g(x), es decir w(x) mod g(x) = 0
Operando módulo g(x) a cada lado de (1):
v(x)·xr mod g(x) = d(x) mod g(x)
Pero, d(x) mod g(x) = d(x), pues gr(d(x))≤r-1 y gr(g(x))=r. Luego:
d(x) = v(x)·xr mod g(x)
Resumiendo, la codificación sistemática de v(x), es decir, su polinomio sistemático es:
w(x) = [v(x)·xr mod g(x)] + v(x)·xr
Demostración:
Recordemos que hay un isomorfismo entre C y Cp.
Una forma de construir la matriz generadora canónica G del código C, a partir del
polinomio g(x), se desprende del siguiente resultado previo.
Si g(x) -de grado r- es el polinomio generador de Cp (un subespacio de dimensión k)
Entonces { xr+i + Ai(x) / 0 ≤ i ≤ k-1 } es una base de Cp.
donde Ai(x) = xr+i mod g(x) 0 ≤ i ≤ k-1; gr(Ai(x))<r
Demostración:
Es claro que xr+i = q(x)·g(x)+Ai(x), es decir, Ai(x) + xr+i = qi(x)·g(x)
Como q(x)·g(x)∈Cp, {Ai(x) + xr+i / 0 ≤ i ≤ k-1} es un conjunto de k elementos de Cp.
Probaremos ahora que estos k elementos son linealmente independientes.
La ecuación b0[A0(x) + xr] + ... + bk-1[Ak-1(x) + xr+k-1] = 0, se puede reescribir así:
[b0A0(x) +...+ bk-1Ak-1(x)] + [b0xr +...+ bk-1xr+k-1] = 0
Como gr(Ai(x))<r, ningún sumando del primer corchete influye en el segundo.
Es claro que los exponentes de los sumandos del segundo corchete son
consecutivos desde r hasta r+k-1, es evidente que la única solución se da para bi=0.
Eso muestra que {Ai(x) + xr+i / 0 ≤ i ≤ k-1} es un conjunto de k elementos
linealmente independientes.
Al ser k la dimensión de Cp, una de sus bases es este conjunto.
167
Del resultado previo y del isomorfismo entre C y Cp, se deriva que una matriz generadora
de C es la que tiene por filas los coeficientes de los polinomios {Ai(x) + xr+i / 0 ≤ i ≤ k-1}.
Sea Ai(x) = ai0 + ai1x + ... + ai(r-1)xr-1, luego:
[ 1 0 ... 0 ]
[ 0 1 0 ... 0 ]
[ ... ]
s = [w1 w2 ... wN] · [ 0 ... 0 1 ]
[ a00 a01 ... a0(r-1) ]
[ a10 a11 ... a1(r-1) ]
[ ... ]
[ a(k-1)0 a(k-1)1 ... a(k-1)(r-1) ]
Efectuando el producto, que por razones de espacio será representado por una matriz
transpuesta de (N- k)×1:
[ w1 + wN-k+1 a00 + wN-k+2 a10 + … + wN a(k-1)0 ]T
[ w2 + wN-k+1 a01 + wN-k+2 a11 + … + wN a(k-1)1 ]
s= [ ... ]
[ wN-k + wN-k+1 a0(r-1) + wN-k+2 a1(r-1) + … + wN a(k-1)(r-1) ]
168
Es decir:
w(x) = [wN-k+1 q0(x) + wN-k+2 q1(x) + … + wN qk-1(x)] · g(x) + s(x) = Q(x) · g(x) + s(x)
Nótese que como s(x)=w1+ w2 x +…+wN-k xr-1 + wN-k+1 A0(x) + wN-k+2 A1(x)+…+wN Ak-1(x)
y como gr(Ai(x))<r, es evidente que gr(s(x))<r, por lo tanto:
s(x) = w(x) mod g(x).
Ejemplos:
Sea C = { 000, 101, 011, 110 } ≠ {0} el código cíclico de longitud N=3 visto antes.
Sea Cp = { 0, 1 + x2, x + x2, 1 + x } el ideal asociado a C.
169
⎡1 1 0 ⎤
[0 1] · ⎢ ⎥ = [(0.1+1.0) (0.1+1.1) (0.0+1.1)] = [0 1 1]
⎣0 1 1 ⎦
⎡1 1 0 ⎤
[1 0] · ⎢ ⎥ = [(1.1+0.0) (1.1+0.1) (1.0+0.1)] = [1 1 0]
⎣0 1 1 ⎦
⎡1 1 0 ⎤
[1 1] · ⎢ ⎥ = [(1.1+1.0) (1.1+1.1) (1.0+1.1)] = [1 0 1]
⎣0 1 1 ⎦
[0 0] · G = [0 0 0]
La dimensión de C es el número de pivotes de la forma escalonada de G: dim(C) = 2.
9) Como g(x) = (1 + x) es un factor de (x3 + 1), ya vimos que es el polinomio generador
del ideal Cp = { 0, 1 + x2, x + x2, 1 + x }.
Cuyo código cíclico asociado es C = { 000, 101, 011, 110 }.
Y efectivamente g(x) es el polinomio generador de un código cíclico C.
10) También ya vimos que para el ideal { 0, 1 + x2, x + x2, 1 + x } se obtiene su polinomio
generador g(x) eligiendo el polinomio de menor grado (≠ 0), en este caso g(x) = 1 + x.
11) El polinomio de paridad de g(x) = (1 + x), se obtiene así:
h(x) = (xN + 1) / g(x) = (x3 + 1) / (1 + x) = (1 + x + x2)
h(x) trabaja como polinomio de paridad en el siguiente sentido:
w(x) × h(x) = 0 si y sólo si w(x)∈Cp.
En efecto:
Para w∈C, digamos 011:
w(x) × h(x) = (x + x2) × (1 + x + x2) = (x + x2) · (1 + x + x2) mod (x3 + 1)
= (x + x4) mod (x3 + 1) = 0
Para w∉C, digamos 100:
w(x) × h(x) = ( 1 ) × (1 + x + x2) = ( 1 ) · (1 + x + x2) mod (x3 + 1)
= (1 + x + x2) mod (x3 + 1) = (1 + x + x2)
El comportamiento es análogo para las otras palabras que estén en C y para las otras
Palabras que no estén en C.
12) El ideal dual Cp┴ se obtiene a partir de:
hR(x) = xk · h(1/x) = x2 · (1 + 1/x + 1/x2) = (x2 + x + 1) = (1 + x + x2) = h(x)
El código dual C┴, asociado al ideal Cp┴, tiene por matriz generadora:
HR = [1 1 1] De donde C┴ = { 000, 111 }
Que ciertamente es lineal y cíclico y tiene todas sus palabras ortogonales a las de C.
Nótese que esto no siempre sucede y en general el código C’ asociado al ideal
generado por h(x) es lineal y cíclico, pero no es el dual de C.
Constatamos ello en este otro ejemplo:
(x7 + 1) = (1 + x2 + x3 + x4) · (1 + x2 + x3) = g(x) · h(x)
Luego g(x) genera Cp.
Es claro que (1 + x2 + x3 + x4)∈Cp.
También es claro que su palabra código asociada 1011100∈C.
Si tomamos a h(x) como el polinomio generador de un ideal C’p.
Es claro que (1 + x2 + x3)∈C’p.
También es claro que su palabra código asociada 1011000∈C’.
Pero (1011100) º (1011000) = 1 ≠ 0. Luego C’ no es el dual de C.
Puede verificarse sin embargo que hR(x) = x3 · h(1/x) = (1 + x + x3) genera el ideal Cp┴
cuyo código asociado C┴ es el dual de C. De hecho la multiplicación G·HRT (donde las
matrices G y HR se obtienen de g(x) y hR(x) como se indicó) nos da:
170
⎡1 1 0 1 0 0 0 ⎤
⎡1 0 1 1 1 0 0 ⎤ ⎢ ⎥ ⎡0 0 0 0 ⎤
0 1 1 0 1 0 0
G·HRT = ⎢⎢0 1 0 1 1 1 0⎥⎥ · ⎢ ⎥ = ⎢0 0 0 0 ⎥
⎢0 0 1 1 0 1 0 ⎥ ⎢ ⎥
⎢⎣0 0 1 0 1 1 1⎥⎦ ⎢ ⎥ ⎣ ⎢ 0 0 0 0 ⎥⎦
⎣0 0 0 1 1 0 1 ⎦
13) Ya vimos en el inciso 4) como generar Cp={0, 1 + x2, x + x2, 1 + x}a partir de (1 + x).
Nótese en tal inciso cómo se codifican cada uno de los polinomios b(x).
Y de manera isomorfa cómo se codifican sus palabras asociadas.
Por ejemplo: a(x) = b(x) = 1+x se codifica así: (1 + x2).
Por asociación, la palabra: 11 se codifica así: 101
14) Dado v(x) = b(x) = 1+x, se obtiene su polinomio sistemático así:
w(x) = [v(x)·xr mod g(x)] + v(x)·xr = [(1+x)·x mod (1+x)] + (1+x)·x
= [(x+x2) mod (1+x)] + (x+x2) = [ 0 ] + (x+x2) = (x+x2)
Por asociación, la codificación sistemática de la palabra 11 es: 011
Así la información aparece íntegra al final y la redundancia al principio.
Una presentación muy popular de esta codificación sistemática, que obtiene
exactamente lo mismo, es como sigue.
- Obtener la palabra, de longitud k, asociada a v(x). Escribirla en reversa.
Añadirle r ceros a la derecha. (a)
- Obtener la palabra , de longitud r, correspondiente a g(x). Escribirla en reversa. (b)
- Dividir (a) entre (b) -división en aritmética módulo 2-. Obtener el residuo.
Como sólo interesa el residuo, esta división puede hacerse haciendo XOR de
izquierda a derecha entre (a) y (b) –desplazando (b)-.
- La codificación se obtiene escribiendo este residuo, de longitud r, en reversa y
agregando a su derecha la palabra asociada a v(x).
Hay familias específicas de códigos cíclicos, así como otros de diseño más reciente, que
reciben su propio nombre: de Reed-Muller, de Bose-Chaudhuri-Hocquenghem (BCH),
códigos de Reed-Solomon, de corrección por ráfagas, convolucionales, de redundancia
cíclica (CRC), turbo códigos y un cada vez menos corto etcétera.
Todos son ellos son materia de otros capítulos que el lector puede buscar en textos que no
sean introductorios como este que acaba.
171
ANEXO 1
Demostración:
= lim ( x ) obvio
x −> 0
=0
Así pues,
lim pi · logr (1/pi ) = [1/ ln(r)] · [ lim pi · ln(1/pi ) ] pues logr z = (loge z / loge r)
pi − > 0 pi − > 0
=0 obvio
172
ANEXO 2
Sea l>0
Si ∀x>0 Kx ≤ x·l Entonces K ≤ 1
Demostración:
Supongamos que K>1
Sea f(x) = 1/ l
Sea g(x) = x / Kx
Como las funciones f(x) y g(x) son tales que ∀x>0 f(x) ≤ g(x) es cierto.
Tal desigualdad también se debe cumplir en el límite.
Es decir:
lim f(x) ≤ lim g(x)
x −> ∞ x −> ∞
Esto es,
lim 1/ l ≤ lim x / Kx
x −> ∞ x −> ∞
El primer límite es obvio y el segundo se puede resolver por L'Hopital, de donde:
1/ l ≤ lim 1 / ln(k)·Kx (recuerde que nuestro supuesto es que K>1) es decir,
x −> ∞
1/ l ≤ 0
1/ l ≤ 0 & 1/ l> 0
Esta contradicción, prueba el enunciado
173
ANEXO 3
Para cada entero p hay un grupo denominado el grupo cíclico de orden p, donde:
G = Zp = { 0, 1, …, (p-1) } y la operación + es la suma módulo p: i + j = (i + j ) mod p
Ejemplos:
El siguiente es un grupo cíclico de orden 2.
G = Z2 = { 0, 1 }
+ es la suma módulo 2:
0+0=0
0+1=1
1+0=1
1+1=0
El neutro es 0.
El inverso de 0 es 0. El inverso de 1 es 1.
Ejemplo:
El grupo (V, ⊕ ) de arriba es un grupo abeliano pues la suma de vectores es conmutativa.
174
Es usual denominar adición y multiplicación a las operaciones + y ×
Se llama anillo conmutativo a un anillo donde la operación × es conmutativa.
Se llama anillo con unidad a un anillo donde la operación × tiene neutro.
Se llama anillo con división a un anillo con unidad donde cada elemento distinto del
neutro 0 tiene inverso multiplicativo.
Se llama campo (field) a un anillo con división conmutativo en el cual 0≠1. Es decir, a un
tripleta (F, +, ×) donde
(F, +) es un grupo abeliano
(F, ×) es un grupo abeliano
(el inverso es para los elementos distintos de 0)
× es distributiva sobre +: a × (b + c) = (a × b) + (a × c)
0≠1
Se llama campo finito a un campo en el que el conjunto F es finito .
Junto a otras consideraciones que no enfatizaremos los campos finitos que actúen sobre los
enteros módulo p se denominan campos de Galois y se denotan como Zp , Fp o GF(p).
Ejemplo:
Con F = Z2 = { 0, 1 }
La operación + como la suma módulo 2.
× la multiplicación módulo 2:
0×0=0
0×1=0
1×0=0
1×1=1
Con neutro 1 y donde el inverso de 1 es 1.
Resulta que (Z2, +, ×) es un campo, conocido como campo binario, campo Z2, F2 o GF(2).
Dado que muchos espacios lineales son espacios geométricos de vectores, usualmente un
nombre alternativo al de espacio lineal es el de espacio vectorial; de manera que se habla
de vectores (V), suma de vectores ( ⊕ ), escalares (F) y multiplicación por escalares (•).
V debe ser no vacío pero puede ser finito, en cuyo caso se tiene un espacio lineal finito.
175
Ejemplos:
Son conocidos los espacios euclidianos o n-dimensionales con las operaciones comunes de
adición y producto (en el conjunto de los reales R); junto a la suma de vectores y
multiplicación por escalares (en el conjunto de las n-tuplas reales Rn).
176
Se llama dimensión de un (sub)espacio lineal V sobre F al número de elementos de
cualquier base de V, se denota por dim(V).
Cualquier texto de Álgebra Lineal muestra que si le añadimos otro elemento a una base B
de V el conjunto resultante se torna linealmente dependiente, es decir, todas las bases de V
tienen el mismo número de elementos.
Ejemplos:
Presentaremos un caso concreto del espacio lineal finito ya visto (V, F, ⊕ , +, ×, •)
V = 23 = { (0,0,0), (0,0,1), (0,1,0), (0,1,1), (1,0,0), (1,0,1), (1,1,0), (1,1,1) }
F = { 0, 1 }
Las operaciones ⊕ , +, ×, • son como antes.
Sea W = { (0,0,1) }
La ecuación a1•(0,0,1) = (0,0,0) tiene única solución con a1=0
El envolvente lineal de W es:
gen(W) = { (0,0,0), (0,0,1) } pues las únicas combinaciones lineales son del tipo
a1•(0,0,1); más concretamente 0•(0,0,1) y 1•(0,0,1).
177
Es fácil comprobar que gen(B)=S.
Dejaremos al lector comprobar que B es linealmente independiente.
Es decir, B es la base del subespacio lineal S (que tiene así dimensión 2).
Será útil representar los elementos de una base como filas de una matriz.
⎡1 0 1⎤
En el último ejemplo B = ⎢ ⎥
⎣0 1 1⎦
Al igual que una base B, podemos representar los elementos de un (sub)espacio lineal
finito S como filas de una matriz.
Ejemplo:
⎡0 0 0 ⎤
⎢1 0 1 ⎥
S =⎢ ⎥
⎢0 1 1 ⎥
⎢ ⎥
⎣1 1 0 ⎦
Sean {u1, ... ,um} las filas de una matriz A (pueden ser los elementos de una base -del
espacio lineal 2N o de algún subespacio de él-, o todos los elementos de algún (sub)espacio
lineal –no solo los de la base-, pero pueden ser también cualesquier otros elementos,
estamos pensando en elementos de 2N).
Sean {c1, ... ,cN} las columnas de una matriz A.
Se llama espacio de las filas de A al conjunto gen({u1, ... ,um}), denotado por RA.
Se llama espacio de las columnas de A al conjunto gen({c1, ... ,cN}), denotado por CA.
En particular, cuando las filas de la matriz A son los elementos de una base B de un
(sub)espacio lineal, es obvio que RA es un (sub)espacio lineal.
Dado que gen(S)=S cuando S es un (sub)espacio lineal finito, lo mismo sucede si las filas
de la matriz son los elementos de S, es decir, RA es un (sub)espacio lineal también.
Sin embargo, de manera general puede mostrarse que RA y CA son subespacios lineales de
2N y 2M cuando A es de NxM. Lo haremos para CA:
Como CA=gen({c1, ... ,cN}) con ci una columna de A. Basta mostrar que para v,u ∈ CA
entonces a•v ∈ CA y v ⊕ u ∈ CA. Lo primero es obvio pues a=1 o bien a=0.
Para lo segundo:
178
Como v=a1•c1 ⊕ … ⊕ aN•cN y u=b1•c1 ⊕ … ⊕ bN•cN (algunos ai,bj pueden ser cero, por
concepto de combinación lineal). Luego, v ⊕ u=(a1•c1 ⊕ … ⊕ aN•cN) ⊕ (b1•c1 ⊕ … ⊕ bN•cN)
que por asociatividad y conmutatividad y la condición 2 en la definición de espacio lineal
puede reescribirse como v ⊕ u=(a1+b1)•c1 ⊕ … ⊕ (aN+bN)•cN, que por ser F un campo
puede reescribirse como v ⊕ u=d1•c1 ⊕ … ⊕ dN•cN, es claro entonces que v ⊕ u ∈ CA.
Se dice que las matrices A y D son equivalentes por filas si una se puede obtener de la
otra mediante operaciones elementales sobre filas.
179
Veamos cómo es una combinación lineal finita de G’:
⎡b11 ... b1j ... b1i ... b1N ⎤
[a1 … ak]·G’ = [a1 … ak]· ⎢⎢ ... ... ... ... ... ... ... ⎥⎥
⎢⎣bk1 ... bkj ... bki ... bkN ⎥⎦
=[a1×b11 +...+ ak×bk1, …, a1×b1ij+...+ ak×b1j, …, a1×b1i +...+ ak×bki, ..., a1×b1N +...+ ak×bkN]
(hemos puesto comas y negrita para aportar claridad)
Es decir, las elementos de gen(G’) son el resultado de permutar los elementos de gen(G)
en exactamente las mismas posiciones i-ésima y j-ésima. De este modo ambos espacios
lineales [gen(G’) y gen(G)] difieren sólo en el orden de sus elementos.
180
Imagen de una matriz.- Sea Gk × N la matriz generadora del subespacio lineal C.
Se denomina imagen de G al conjunto:
I G = { u ∈ 2k / G·v = u, v ∈ 2N } v debe estar como columna en el producto G·v
(En rigor G puede ser cualquier matriz)
Cualquier texto de Álgebra Lineal muestra que IG es un subespacio lineal de 2k, además de
los siguientes resultados importantes:
1) (espacio de las columnas) CG = IG (imagen de G)
2) El subespacio lineal IG (la imagen de G) tiene dimensión k
k recibe también el nombre de rango de G
3) dim(CG) = dim(RG)
(dimensión del espacio de las columnas) = (dimensión del espacio de las filas)
4) k + dim(NG) = N donde N es el número de columnas de G
De 4 se deduce la siguiente importante propiedad:
5) El subespacio lineal NG (el núcleo de G) tiene dimensión N-k, es decir,
dim(NG) = N - k.
Co-conjunto (en inglés coset).- Sea C un subespacio lineal de 2N. Sea u ∈ 2N.
Llamaremos co-conjunto de C al siguiente conjunto:
u+C = { u+w / w ∈ C }
Es claro que no siempre la secuencia de ceros pertenece al co-conjunto (-por ejemplo con
u∉C-. Es decir para u+w en el co-conjunto no siempre b•(u+w)=0 -con b=0- está en el co-
conjunto). Luego, en general un co-conjunto no es un subespacio lineal. Tiene sin
embargo propiedades interesantes.
Demostración:
i) Es evidente que hay tantos elementos en u+C como elementos hay en C.
Si C tiene dimensión k, es decir, k elementos en su base (digamos B={v1,…, vk}), cada
elemento de C es una combinación lineal de su base: a1•v1 ⊕ … ⊕ ak•vk con aj ∈ F
k
Como aj puede ser cualquiera de 2 valores (0 o 1) es claro que hay 2 combinaciones
posibles. Es decir, C tiene 2k elementos. El resultado sigue.
ii) Sea v ∈ u+C. Luego -por definición- v=u+w (w ∈ C). (*)
Entonces: v+C = { v+w' / w' ∈ C } por definición
= { u+w+w' / w' ∈ C, w ∈ C } por (*)
= { u+w'' / w'' ∈ C } por ser C un subespacio lineal
= u+C por definición
En el penúltimo paso, como w,w' ∈ C, es decir, tomamos todos los distintos pares de
elementos en C, su suma w+w' abarca todo C. Ello es evidente tomando w'=0.
181
iii) Como C es un subespacio lineal, debe contener a la secuencia de ceros.
Luego, u ∈ u+C (tomando w=0).
Supongamos que u ∈ v+C (con v+C≠u+C).
Por definición de co-conjunto u=v+w' (w' ∈ C).
Luego, v=u+w'. Es decir, -por definición- v ∈ u+C. Pero entonces -por ii- v+C=u+C.
El resultado sigue.
iv) Hay 2N elementos en 2N y –por iii- cada uno de ellos pertenece únicamente a un co-
conjunto. Dado que -por i- cada co-conjunto tiene 2k elementos, es evidente que deben
haber: 2N/2k = 2N-k co-conjuntos.
v) Es una simple consecuencia de iii y iv.
182
ANEXO 4
Sea Z2[x] el conjunto de todos los polinomios (de cualquier grado) con coeficientes bi en
GF(2) = Z2 = {0,1}.
Así pues (Z2[x], +, ×) es el anillo de todos los polinomios con coeficientes en Z2.
Sin embargo, si denotamos por Z2N[x] al conjunto de todos los polinomios de grado menor
a N (con coeficientes en Z2), entonces podemos definir una operación × (multiplicación de
polinomios en el conjunto) que nos permita obtener un anillo.
Tal operación se denomina multiplicación de polinomios módulo p(x) [donde p(x) es otro
polinomio] y se define -genéricamente- así:
Sean q(x), t(x), p(x) polinomios con coeficientes en el campo F.
La multiplicación de los polinomios q(x) y t(x) módulo p(x) es el resto de dividir q(x)·t(x)
entre p(x).
Ejemplo:
q(x) = x
t(x) = 1 + x
p(x) = x2 + 1
q(x) × t(x) = q(x)·t(x) mod p(x) = x·(1 + x) mod (x2 + 1) = x + x2 mod (x2 + 1) = 1 + x
Así pues, es evidente que el par (Z2N[x], +) es un grupo abeliano. Donde + denota la suma
(evidentemente) conmutativa de polinomios, con neutro b(x) = 0 y, debido a que los
coeficientes están en el campo binario, cada polinomio es su propio inverso.
183
La siguiente igualdad muestra que × es asociativa:
p(x) × [q(x) × t(x)]
= p(x) × [q(x) · t(x) mod (xN + 1)] por definición de ×
= p(x) · [q(x) · t(x) mod (xN + 1)] mod (xN + 1) por definición de ×
= p(x) · [q(x) · t(x) – k(x) · (xN + 1)] mod (xN + 1) k(x): cociente de q(x)·t(x)/(xN + 1)
= [p(x) · q(x) · t(x) – p(x) · k(x) · (xN + 1)] mod (xN + 1) distribuyendo p(x)
= p(x) · q(x) · t(x) mod (xN + 1) operando mod
= [p(x) · q(x) · t(x) – k’(x) · (xN + 1) · t(x) ] mod (xN + 1) k’(x): cociente p(x)·q(x)/(xN + 1)
= [p(x) · q(x) – k’(x) · (xN + 1) ] · t(x) mod (xN + 1) factorizando t(x)
= [p(x) · q(x) mod (xN + 1) ] · t(x) mod (xN + 1) definición de módulo
= [p(x) · q(x) mod (xN + 1) ] × t(x) por definición de ×
= [p(x) × q(x)] × t(x) por definición de ×
Por otro lado:
p(x) × [q(x) + t(x)] = p(x) · [q(x) + t(x)] mod (xN + 1)
= [p(x) · q(x) + p(x) · t(x)] mod (xN + 1)
= [p(x) · q(x) mod (xN + 1)] + [p(x) · t(x) mod (xN + 1)]
= p(x) × q(x) + p(x) × t(x)
Es decir, × es distributiva sobre +.
Es claro que: q(x) × t(x) = q(x)·t(x) mod (xN + 1) = t(x)·q(x) mod (xN + 1) = t(x) × q(x),
es decir, × es conmutativa.
Sean b(x)=1,p(x)∈Z2N[x]:
p(x) × b(x) = p(x) × 1 = p(x)·1 mod (xN + 1) = p(x) mod (xN + 1) = p(x)
Es decir b(x) = 1 es el neutro para ×.
184
ÍNDICE
185
BIBLIOGRAFÍA
Wells Richard
"Applied Coding and Information Theory for Engineers"
Editorial Prentice Hall
Primera Edición. Año 1999
Abramson Norman
"Information Theory and Coding"
Traducción al español de Juan Antonio de Miguel Menoyo
Editorial Paraninfo
Primera Edición. 1986
186