Memoria del proyeto de nal de arrera
orres-pondientealosestudiosde IngenieríaSuperioren
Informátia presentado por Vítor Ovalle Are y
dirigidoporMerè VillanuevaGay.
Departament d'Enginyeria de la Informaió i de les
Co-muniaions de laUniversidadAutónoma de Barelona
CERTIFICA:
Que lapresente memoriahasido realizadabajosu
dire-ión porVítor OvalleAre
Bellaterra, Junio de 2008
A mihermana, por su apoyo
Enprimerlugar,he de deirqueeste proyetonohabríallegadoaningún
ladosinlainestimableayuda demidiretora de proyeto, MerèVillanueva.
Graiasa su ayuda y asu guía, hoy estoy esribiendoesta memoria.
También quierodar lasgraiasaBernat Gastón(mimanualde MAGMA
personal),porsuinalanzableonoimientode MAGMA.Élsabeestasosas,
y muhas más.
A parte, a todala gente de proyetistas (sendistas g**s en su mayoría).
Peña, Xavi, Álex, Vila, Gerard, Juan...muy buenos momentos, de verdad,
difíilesde olvidar, omo vosotros.
Por último, a todos los que han estado onmigo hasta el nal de este
amino, que seha heho duro, pero hasido una de las mejores experienias
de mi vida.
1. Introduión 1
1.1. Objetivos . . . 2
1.2. Contenido de la memoria . . . 3
2. Bases Teórias 5 2.1. Coneptos básios . . . 5
2.2. Representaión de ódigos binarios . . . 8
2.3. Propiedades delsuperdual . . . 10
3. Planiaión del proyeto 15 3.1. Objetivos . . . 15
3.2. PlaniaiónTemporal . . . 17
4. Desarrollo del proyeto 21 4.1. Entorno de desarrollo . . . 21
4.2. Implementaiónen Magma . . . 23
4.2.1. Cálulodelkernel en Magma . . . 23
4.2.2. Representaión de ódigos binariosen Magma. . . 28
4.2.3. Paquete de ódigos binariosen Magma . . . 33
4.3. Testeo . . . 36
5. Handbook of Magma funtions 39 5.1. Introdution . . . 39
5.4. Operations onCodewords . . . 45
5.5. Membershipand equality . . . 46
5.6. Properties of Binary Codes . . . 47
6. Conlusiones y Resultados 51
6.1. Conlusiones. . . 51
6.2. Resultados . . . 52
6.3. Lineas futuras . . . 53
2.1. La relaión entre
K(C)
,C
yh
C
i
en un ódigo no lineal esK(C)
⊂
C
⊂ h
C
i
. . . 72.2. Enunódigolinealelkernelesigualalódigo,esdeir,
K(C) =
C
=
h
C
i
. . . 82.3. Ejemplode divisiónde un ódigobinarioen
K(C)
ylaslases deC
. . . 93.1. Planiaióntemporalreal . . . 18
4.1. Comparaiónon la primeraversión . . . 24
Introduión
Dependiendo de laspropiedadesalgebraiasde las palabrasódigode un
ódigoorretor deerrores,podemoslasiarloomolinealonolineal.Este
proyeto seentraenelasode losódigosorretoresde erroresonstruidos
sobre el alfabeto binario, es deir, uyas palabras se omponen de eros y
unos.
Como su nombre india, los ódigos lineales umplen la propiedad de
linealidad,onloualpodemosexpresarlosmedianteunsubespaiovetorial.
Este heho es muy útil a la hora de trabajar on ellos en un ordenador, ya
que podríamos representar un ódigo de una ardinalidad onsiderable on
una base de vetores que generan todas las palabras del ódigo. Por otro
lado,losódigos nolinealespresentan ladesventajade lanolinealidad.Esto
hae que su tratamiento en un ordenador sea muy ompliado, ya que si
tenemos muhas palabras ódigo, forzosamente tendremos que guardarlas
todas en memoria,yaque nodisponemosde una representaión linealon la
que disminuirel tamañoutilizado.
Aquí empieza este proyeto. La idea es onseguir representar ódigos no
lineales de una manera similar a la que se utiliza en los ódigos lineales, es
deir,busarunamanerade minimizarelespaiooupadoen memoria.Para
esto, nos entramos en la idea del núleo de un ódigo, al que llamaremos
del ódigo (lineal o no lineal), siempre es lineal. Cuando enontramos el
kernel delódigo,partiionamoselresto delódigo en lases,yde adalase
esogemos un representante. A partir de estos representantes y del kernel,
podemos generar todo el ódigo, aunque sea no lineal. En el peor de los
asos,enelqueelkernel estéompuestosólodeuna palabra,tendríamosque
guardartodaslaspalabrasdelódigo,peroonforme vareiendoel número
depalabrasdelkernel,vamosmejorandoelespaiooupado.Además,hayque
tenerenuentaqueelkernelsíeslineal,asíquesepuedeguardarsimplemente
una base de vetores que logeneren.
Este proyeto se entra, iniialmente y omo prinipal objetivo, en ser
apaes derepresentar ódigos binariosnolinealesde maneraeienteen un
ordenador,utilizandoelintérprete de Magma. Para ello,nos basamos en la
ideadel superdual, queesuna generalizaióndeldual paraódigos lineales.
Para onstruir el super dual, utilizaremos el kernel y los representantes de
laslases anteriormenteitados.
1.1. Objetivos
A grandes rasgos, los objetivosque hemos idorealizando alo largo de la
vidade este proyeto han sido lossiguientes:
1. Estudiar el álulo del kernel e implementar una funión en Magma
quelo alule.
2. Estudiar el super dual e implementar en Magma una funión que lo
alulea partir delkernel y loslíderes de las lases.
3. Pensar ómorepresentar en Magma losódigosbinariosno
neesaria-mente lineales utilizandoel super dual. Implementar onstrutores de
ódigos binariosno neesariamente lineales.
fun-que nos den más datos sobre un ódigo. Implementar un onstrutor
de ódigos binarios aleatorio.
5. Testear todas las funiones implementadas y omprobar su orreto
funionamiento. Realizar ejemplos de funionamiento de nuestro
pa-quete.
6. Esribir la doumentaión delapítulo de ayuda del libro de Magma
on ejemplos.
7. Esribir lamemoriadelproyeto.
1.2. Contenido de la memoria
Esta memoriasedivideenvariosapítulos.Veamosunapequeña
desrip-ión de lo que seva a trataren ada uno de ellos.
Basesteórias:Veremoslasbasesteóriasdeesteproyeto.Teoría
gene-ral de ódigos binarios, así omo teoría sobre el kernel y el super dual
de un ódigo. También se desribirán algunas propiedades del super
dual, que permitirán desarrollar funiones para trabajar on ódigos
nolineales.
Planiaión del proyeto: Veremos los objetivos del proyeto en
pro-fundidad,asíomolasdifereniasentrelaplaniaióntemporaliniial
y la real del proyeto. Desglosaremos el proyeto en tareas y veremos
uánto tiemponos ha llevado adauna de ellas.
Desarrollodelproyeto:Expliaremosondetallequéhasidoneesario
implementarparaelpaquetede Magma, asíomo elentornoen elque
hemostrabajado.Veremosómohemosresueltolosproblemasque han
idosurgiendo.
mentado, asíomouna breveexpliaióny ejemplosde adauna. Este
apítuloestá esrito en inglés debido a que se tiene que integrar en el
libro de ayuda de Magma.
Conlusiones y resultados: Expliaremos de manera resumida los
re-sultadosdelproyeto. También, posiblesmejoras quese pueden
imple-mentar en futuros proyetos.
Bibliografía.
Bases Teórias
En este apítulo veremos uál es la base teória sobre la que nos hemos
apoyado para la orreta realizaión de nuestro paquete de software. Nos
hemosbasado en teoríasdesarrolladasen variosartíulos,[4,5℄, asíomoen
libros de teoría básia de ódigos, [6,8℄.
2.1. Coneptos básios
Para empezar, deniremos qué es un ódigo orretor de errores. En las
omuniaionesdigitales,sepueden produirerrores.Unódigo orretorde
errores onsiste en un método basado en la idea de introduir redundania
en losdatosa transmitirpara que,en elasode que seproduzaun error,el
reeptor sea apazde orregirlo.
Ennuestroaso,nosentraremosenlosódigosbinarios.Sea
Z
n
2
elespaiovetorialde dimensión
n
sobre el uerpo nitoZ
2
=
GF
(2)
.La distania de Hamming entre dos vetoresx, y
∈
Z
n
2
,d(x, y)
,esel númerode oordenadas enlasualesx
ey
dieren. Ladistaniade Hammingumplelapropiedadde simetría,esdeir,elresultadoded(x, y
)
yd(y, x)
eselmismo.Deniremosun ódigobinarioomounsubonjuntodeZ
n
2
.Loselementosdeestesubonjuntosedenominanpalabrasódigo.LadistaniamínimadeHammingdeunódigo
ódigo diferentes. Así, deniremos un ódigo binario
C(n, M, d)
omo un subonjunto deZ
n
2
on ardinalidadM
y distaniamínima de Hammingd
. Unódigobinariopuedeserlinealonolineal.Losódigosbinarioslinealesson aquellos que están denidos sobre el uerpo nito
Z
2
y que, además de ser un subonjunto deZ
n
2
, son un subespaio vetorial. Así, podemosasegurar que la palabra ero (palabra en la que todas sus oordenadas son
ero) pertenee al ódigo. Por el ontrario, si un ódigo binario esno lineal,
entones no se umple que sea un subespaio vetorial y, por lo tanto, la
palabraero notiene porqué perteneer al ódigo.
Dos ódigos binarios
C
1
yC
2
de longitudn
son isomorfos si existe una permutaiónπ
tal queC
2
=
π(C
1
) =
{
π(c)
|
c
∈
C
1
}
. Dos ódigos binariosC
1
yC
2
de longitudn
son equivalentes si existe un vetora
∈
Z
n
2
y unapermutaiónde oordenadas
π
talqueC
2
=
{
a
+
π(c)
|
c
∈
C
1
}
.Sea
C
un ódigo binarionolineal. Silapalabraero noestá enC
, onsi-derandounnuevoódigobinarioC
′
,talque
C
′
=
C
+
c
paraualquier
c
∈
C
, podemos asegurar quela palabraero pertenee al ódigobinarioC
′
,que es
equivalente a
C
.Dos propiedades estruturales de los ódigos binarios son el rango y la
dimensión del kernel. El rango de un ódigo binario
C
,r
=
rank(C)
, es simplementeladimensión de la expansiónlineal,h
C
i
, deC
.El kernel de un ódigobinarioC
sedeneomoK
(C) =
{
x
∈
Z
n
2
|
x
+
C
=
C
}
.Silapalabra ero pertenee aC
, entonesK(C)
es un subespaio lineal ontenido enC
. Denominaremos la dimensión del kernel deC
omok
=
dimension(K(C))
. Estosparámetrosr
yk
sepuedenusaromodistiniónentreódigosbinarios noequivalentes, ya quelos equivalentes tienen losmismosparámetrosr
yk
. Además,r
yk
nos permiten deidir si un ódigo binario es lineal o no, ya que si el ódigo binario no es lineal, se umple queK(C)
⊂
C
⊂ h
C
i
. Los tres onjuntos son iguales úniamenteuando elódigo binario eslineal.Deniremostambiénlosoneptosdematriz generadora ymatriz de
on-trol de unódigo.Dadounódigo
C
,sumatrizgeneradora,G
,esunamatriz uyas las forman una base deC
, es deir, es una matriz que genera todasFigura2.1:Larelaiónentre
K(C)
,C
yh
C
i
enunódigonolinealesK(C)
⊂
C
⊂ h
C
i
las palabras ódigo de
C
. Antes de denir qué es una matriz de ontrol, es importante denir el onepto de ódigo dual. Dado un ódigo linealC
, su ódigo dualesC
⊥
=
{
x
∈
Z
n
2
|
x
·
y
= 0,
∀
y
∈
C
}
, dondex
·
y
eselproduto esalardex
ey
.SiC
eslineal,C
⊥
tambiéneslineal.Tambiénesfáilverque
C
⊥⊥
=
C
. Así, la matriz generadora del ódigo
C
⊥
es la matriz de ontrol
de
C
. La matrizde ontrolnos permite saber siuna palabra esdel ódigo o no, ya que las palabras ódigo operadas on la matriz de ontrol, dan eroomo resultado.
Son importantes también los oneptos de lases y líderes de las lases.
Sea
C
un ódigo binario yx
una palabra ódigo deC
, llamaremos lase al subonjuntox
+
C
=
{
x
+
y
| ∀
y, x
+
y
∈
C
}
deC
.Es deir, lalasex
+
C
está formada por las palabras que resultan de sumar todas las palabrasdelK ( C ) = C = < C >
Figura2.2: Enun ódigolineal elkernelesigual alódigo, esdeir,
K(C) =
C
=
h
C
i
en nuestro aso,
x
es ellíder de lalasex
+
C
.Para aabar, veremos qué es un ódigo perfeto y un ódigo perfeto
ex-tendido. Un ódigo
C
de longitudn
es perfeto si para algún enteror
≥
0
, ada elemento deZ
n
2
está a distania menor o igual quer
de, exatamente, unapalabraódigodeC
.SeaC
unódigo perfeto,siañadimosun dígitode paridadatodassus palabrasódigo,obtenemoselódigoC
∗
.Podemos deir
que
C
∗
es un ódigo perfeto extendido de
C
.2.2. Representaión de ódigos binarios
Unódigobinarionolineal
C
sepuedeesribiromolaunióndesukernelK(C)
más los trasladados delkernel, esdeir,C
=
t
[
i
=0
K(C) +
ci
,
donde
c
0
=
~
0
. Lo que haemos es subdividir el ódigoC
en unas uantas lases,[c
1
, c
2
, . . . , ct]
, que son traslados del kernel. El número de lases seC
=
⇒
K(C)
c
1
+
K(C)
c
2
+
K(C)
. . .ct
+
K
(C)
Figura2.3:Ejemplo dedivisión de unódigo binarioen
K
(C)
ylaslasesdeC
alulaenfunión deladimensióndelkernel,
k
,y laardinalidaddelódigo,M
, es deir,t
+ 1 =
M/2
k
, donde
t
es el número de trasladados del kernel. Así, tendremos elódigo binarioC
dividido en el kernel y sust
trasladados, es deir, tendremost
+ 1
lases. De ahora en adelante, nos referiremos a[c
1
, c
2
, . . . , ct]
omo líderes de las lases. En la gura 2.3 se ve gráamente ladivisión de un ódigo binario nolineal en el kernel y laslases.Sea
C
unódigo binariode longitudn
talquelapalabraeropertenee aC
,on kernelK(C)
de dimensiónk
y líderesde laslasesS
= [c
1
, c
2
, . . . , ct]
. Esfáilverque podemosrepresentarelódigobinarioC
omoelkernelmás loslíderesdelaslases,esdeir,C
puedeserrepresentado porlamatrizH
S
,
donde
H
es una matriz generadora deK(C)
. ComoK(C)
esun subespaio lineal, podemos representarlo de manera ompata omo un ódigo binariolineal,aprovehandosumatrizgeneradorabinariadetamaño
k
×
n
.Elkernel oupa unespaioen memoriadelordendeO(nk)
.Además, elkernel máslost
líderes de las lasesci
, dondei
∈ {
1, . . . , t
}
, oupa un espaio de ordenO(n(k
+
t))
.Paraelaso
t
= 0
,esdeir,uandoelódigobinarioC
eslineal,tenemos queC
=
K(C)
y que el ódigo puede ser representado por su matriz gene-radora binaria, osea que el espaio en memoria es de ordenO(nk)
. Cuandot+1 =
M
,quieredeirqueelkernelK
(C)
sóloestáformadoporunapalabra, que es lapalabra ero. Por onsiguiente, el resto de lases estarán formadassería
O(nM
)
dondeM >> k
.La representaión expuesta es una representaión ompata del ódigo
C
pero no es reomendable para la mayoría de situaiones ya que no es independiente de ualquier matriz generadora partiularH
, es deir, esta representaión es demasiado poo exible a la hora haer transformaionesbásias de las. Por ejemplo, si permutamos una de las las de
S
on una de las las deH
, la matriz ya no representa el mismo ódigo. Por esto, utilizaremosla siguiente representaión.El sistema de paridad del ódigo binario
C
es una matriz binaria de di-mensión(n
−
k)
×
(n
+
t)
,(G
|
S)
, dondeG
es la matrizgeneradora deldual delkernel,K(C)
⊥
,de dimensión
(n
−
k)
×
n
, yS
= (G
·
c
1
G
·
c
2
. . . G
·
ct)
,de dimensión(n
−
k)
×
t
.Elsuper dualdelódigo binarioC
eselódigobinario linealgeneradoporelsistemade paridad(G
|
S)
.Notar quesiC
esunódigo binariolineal,el super duales elódigo dualC
⊥
. Porlotanto,el sistemade
paridad de un ódigo binario es una generalizaión de la matriz de paridad
para ódigos binarioslineales.
2.3. Propiedades del super dual
Ha sido neesario estudiarómo podemos deidir sidos ódigos binarios
C
1
, on on matriz de paridad generalizada(G
1
|
S
1
)
, yC
2
, on matriz de paridad generalizada(G
2
|
S
2
)
son iguales, o bien siC
1
está ontenido enC
2
. También se ha estudiado ómo podemos saber si una palabra ódigox
perteneeaC
,yómoalularalgunosparámetrosdelódigo,adaptándonos alsuper dual.Para saber si
C
1
=
C
2
, teniendo en uenta la representaión que nos proporionaelsuperdual,elnúmerodelasdelasmatries(G
1
|
S
1
)
y(G
2
|
S
2
)
tiene queser elmismo. Además, elkernel deC
1
tieneque ser igual al kernel deC
2
, oequivalentemente, elespaio generado porG
1
tiene queser igual al generadoporG
2
.AsítendremostambiénqueS
1
yS
2
tienenelmismonúmero de las. Finalmente, hay que omprobar que los líderes de las lases deC
2
son palabras ódigo de
C
1
ovieversa.Paraversi
C
1
⊆
C
2
sehatenidoquehaerunestudiomásenprofundidad, yaqueelproblemanoestrivial.Primerode todo,hayqueomprobarquelaslongitudes de ambos ódigos son iguales. Para que
C
1
esté ontenido enC
2
, laardinalidaddeC
1
tienequeser menoroigualalaardinalidaddeC
2
.En este momento, tenemos dos aminos a seguir. El primero es que se umplaque
K(C
1
)
⊆
K
(C
2
)
.Eneste aso,essuienteonomprobarquetodoslos líderes de las lases deC
1
forman parte deC
2
. Sin embargo, si el kernel deC
1
noformaparte delkernel deC
2
, nopodemosasegurar queC
1
*
C
2
. Si el segundo kernel no ontiene al primero, tenemos que trabajar onla porión de kernel en que los dos kernels oiniden, es deir, neesitamos
k
=
K(C
1
)
S
K(C
2
)
. Una vez aluladala uniónde losdos kernels,tenemos que extender una base dek
sobre elkernel deC
2
. Ahora, para queC
1
⊆
C
2
setienequeumplirquetodas lasnuevaspalabrasódigoquehay en labaseextendida perteneen a
C
2
. Si esto se umple, ya sólo nos queda mirar que los líderes de las lases deC
1
perteneen aC
2
y que el resultado de sumar las nuevas palabras de la base extendida a los líderes de las lases tambiénpertenee a
C
2
. Eneste momento,ya podemos saber siC
1
está ontenidoenC
2
.Siqueremossabersiuna palabraódigo,
x
formapartedelódigobinarioC
, on matriz de paridadgeneralizada(G
|
S)
, hay queplantearse dos asos. El primero, quees el más senillo, esel aso en queC
es lineal, osea que la matriz de paridad generalizada esG
, que es la matriz de ontrol deC
. En este aso, el proedimiento habitual es suiente, es deir, multipliamos lapalabra
x
porlamatrizde ontroldeC
y,si suresultadoes ero,es deir,siG
×
x
⊤
= 0
,podemosasegurar que
x
perteneeaC
.Hayqueteneren uenta que,debidoalarepresentaión apartirdelsuperdual,tenemos que mirarsilapalabra
x
perteneealkernel,esdeir, hay queomprobarquex
∈
K(C)
. SiC
esun ódigo nolineal,en elasoqueG
×
x
⊤
6
= 0
, nopodemosasegurar
que
x
no pertenee aC
. Hay que omprobar si el vetorG
×
x
⊤
es una de
las olumnas de la matriz
S
. Es deir,x
pertenee aC
siG
×
x
⊤
= 0
G
×
x
⊤
es una olumnade la matriz
S
.Para elálulo delrango y ladimensión delkernel,también se tiene que
tener en uenta que nuestro ódigo se representa on la matriz
(G
|
S)
, osea quetendremosqueamoldarnosaestopararealizarlosálulos.Paraalularla dimensión delkernel,
k
deC
, sabiendo queG
es la matriz generadora deK(C)
⊥
, tendremosque
k
eslaresta de ladimensión deG
menoslalongitud del ódigoC
.Para alular el rango de un ódigo binarioC
uya matriz de paridad generalizada es(G
|
S)
, tenemos que sumar la dimensión del kernel al rango deS
. También hemos tenido que estudiar ómo saber si un ódigo binario ha sido onstruido a partir de un ódigo uaternario, o un ódigoZ
2
Z
4
-aditivo.Este problema tampoo esnada trivial, o por lomenos, no es tan trivialomo esperábamos.Losódigos uaternariosson aquellosque seonstruyen sobre elalfabeto
Z
4
=
{
0,
1,
2,
3
}
.LosódigosZ
2
Z
4
-aditivossonódigosuyaspalabrastienen oordenadasenZ
2
yenZ
4
.Para pasardeZ
4
aZ
2
,utilizamoslanotaiónen ódigo de Gray. El ódigo de Gray onsiste en ordenar2
n
números binarios
de tal forma que ada número sólo tenga un dígito binario diferente a su
predeesor.Así, un mapade Gray podría ser:
0
↔
00
1
↔
01
2
↔
11
3
↔
10
Para pasardeódigosuaternariosaódigosbinariosseutilizaeste mapa
deGray.Deesta forma,adapalabraquetienelongitud
n
enZ
4
,seonvierte en una palabra de longitud2n
enZ
2
.Para pasar de ódigos
Z
2
Z
4
-aditivosaódigos binarios,laidea esla mis-ma.Enelproyeto[3℄,sehandesarrolladofunionesquerealizanestaonver-sión de ódigos
Z
2
Z
4
-aditivosa ódigosbinarios utilizandotambiénel mapa de Gray.Enambosasos,ladeisióndesiunódigobinarioestáonstruidoapartir
generado por el ódigo binario es la antiimagen de un ódigo uaternario o
Z
2
Z
4
-aditivobajo el mapade Gray.Las funiones implementadas en este nuevo paquete son apliablesa
Planiaión del proyeto
Ya hemos omentado los objetivos en laintroduión, pero en este
apí-tulo se verán más a fondo. También veremos la planiaión que teníamos
iniialmente, y en qué se haonvertido al nal.
3.1. Objetivos
1. Estudiarelálulodelkernel.Esdifíil,omputaionalmentehablando,
alularel kernel de un ódigo binario de una maneraeiente.
Inten-tamos mejorar la funión desarrollada en [7℄ y [9℄ , KernelZ2(C), que
yase intentómejorar en un proyeto delaño pasado [2℄.
2. Implementar una funiónen Magma que aluleelkernelteniendo en
uentalasmejoras implementadaselañopasadoen [2℄. Nuestra
imple-mentaión debe ser lo más eiente posible, tanto en omplejidad de
álulo,omoentamañooupadoen memoria.Deidimosque
retorna-remosel kernel omoun ódigobinario linealy loslíderesde las lases
omo una listade palabras ódigo.
3. Estudiarel super dual. Hemos de deidirsi es interesante apliarlaa
nuestro problema para representaródigos binarios noneesariamente
una matriznos puedeser muy útil.
4. Implementaren Magma lasfunionesneesariasparaalularelsuper
dualde unódigo binario
C
.De estamanera,representamos unódigo noneesariamentelinealomoelsuperdualaluladoapartirdelkernelde
C
y loslíderes de las lases.5. ComenzararealizarelpaquetedeMagmaparaódigosbinariosno
ne-esariamente lineales.Hay que pensar ómo vamos a representarestos
ódigos. Podemos basarnos en la estrutura que Magma utiliza para
ódigos, o rear una representaión totalmente nueva. Nos inlinamos
porlaopión de reutilizarla estruturaque Magma utilizapara
ódi-gos,ya queasíserá más fáilintegrar nuestropaquete en elintérprete.
6. Deidirquéatributosvamosaañadiralaestruturade datosde
Mag-mapara representar nuestro ódigo de formaúnia. Consideramos
ne-esarioguardarlalongitud,elkernelyloslíderesdelaslases,asíomo
un boleano quenos diga si elódigo es lineal ono.
7. Implementar los onstrutores de ódigos binarios no neesariamente
lineales. Deidimos a partir de qué tipos de datos (seuenias de
ve-tores, subespaios lineales, matries, et) vamos a permitir onstruir
ódigos binariosen Magma on esta estrutura.
8. Implementarfuniones que alulenlas invariantes de un ódigo
(lon-gitud,ardinal, distaniamínimade Hamming,rango y dimensión del
kernel, et).
9. Implementar funiones para trabajar on las palabras ódigo. Estas
funiones nos permitirán saber si una palabra
u
pertenee al ódigo binarioC
, o nos retornarán una palabra ódigo aleatoria del ódigo binario.ódigo es perfeto, o si es binario lineal, si está onstruido a partir de
un ódigo
Z4
o un ódigoZ
2
Z
4
-aditivo,et.11. Implementar un onstrutor de ódigos binarios aleatorio,esdeir, un
onstrutorquetan sóloreibelalongitudy laardinalidaddelódigo
ylogenerademaneraaleatoria.Tambiéndamoslaopióndeintroduir
ladimensióndelkernel aeste onstrutorde ódigosbinariosaleatorio.
12. Testear todas las funiones implementadas y omprobar su orreto
funionamiento. A partir de unos datos de entrada, ver si obtenemos
lasalida esperada.
13. Realizarejemplosdefunionamientode nuestropaqueteparainluirlos
en la arpeta de ejemplos del paquete y esribir el apítulo de ayuda
dellibro de Magma en inglés.
14. Esribir lamemoriadelproyeto.
3.2. Planiaión Temporal
En su planteamiento iniial, este proyeto tenía, omo ondiión
indis-pensable, alular el kernel de un ódigo binario no lineal, y alularlo de
maneraeiente. He de deir que,aunque midiretora de proyeto onaba
en que sobrara el tiempo suiente omo para realizar también un
paque-te para Magma, yo no estaba muy seguro ya que el álulo del kernel me
pareía omplejoy difíilde haer de manera eiente. No obstante, laidea
era implementar esta funión del kernel, realizar un paquete para Magma
paraeltratamientode ódigosbinariosnoneesariamentelineales,yrealizar
algunasfuniones de onstruiónde familiasde ódigos partiulares.
Aunasí,alnalnosehanpodidorealizarlasfunionesdeonstruiónde
familiasdeódigospartiulares,debidoaquealgunasdelastareasanteriores
Figura3.1: Planiaióntemporalreal
Hablandode fehas, esteproyetohatenidounaduraión aproximadade
8 meses, que omprendenel período de otubre de 2007 a mayo de 2008. Si
lodesglosamos,teniendoen uentalosobjetivosylastareasqueseven en la
gura:
KernelZ2:Laimplementaiónde esta funión nos hallevadoun total
de dos meses. Se iniió en otubre de 2007 y la dimos por orreta a
nalesde noviembre.
SuperDual: Una vez que sabemos alular el kernel y los líderes de
las lases, los utilizamos para implementar el super dual. Para esto,
tardamos menos, y en unos 10 días implementamos y testeamos la
funión de álulo del super dual. Así, nos fuimos de vaaiones en
invierno on una parte muy importantedelproyeto heha.
Construtores: Cuando volvimosen enero de 2008, nos quedaba
im-plementarelpaquete,asíqueentre estudiarquéqueríamos
exatamen-te e implementar onstrutores para los ódigos, estuvimos un par de
semanas. Haia el nal del proyeto, nos dimos uenta de que
tenía-mosalgunos pequeños erroresquehuboque orregir,pero nofue nada
dramátio,y poreso no semuestraen eldiagramade Gantt.
Invariantes: Esta ha sido, quizá, la parte más senilla de realizar. El
Operaiones: Estas funiones tampoo fueron muy ompliadas. No
fueron tan triviales omo las anteriores, pero tan sólo requirieron diez
días de trabajo, en paralelo on las funiones de pertenenia y las de
propiedades.
Pertenenia e igualdad y Propiedades: Sin duda, estas dos
par-tes han sido lasmás duras en uantoa trabajose reere, y porellolas
pongoenelmismopunto.Ladiultadteóriadelasfunionesaquí
im-plementadas ha heho que hayamos tenido que haernuevas versiones
Desarrollo del proyeto
Eneste apítuloveremos losdetallesdeimplementaióndelproyeto,así
omo una breve expliaión del entorno que se nos ha proporionado para
trabajar.
4.1. Entorno de desarrollo
Pararealizaresteproyeto,elDepartamentd'EnginyeriadelaInformaió
i de les Comuniaions (dEIC), meproporionó un ordenador en la salade
proyetistas del departamento,así omo aeso auna uenta en un servidor
delGrupo de Combinatoria y Codiaión (CCG).
El ordenador de proyetistas es un IntelPentium 4 a 2.00 GHz, on 512
MBdeRAM.ElsistemaoperativoesunaFedora5.Disponemosdeunaopia
de Magmaen un servidor llamadoMawilliams,quetieneun proesadorde
doble núleo, 2GB de RAM, y onexión porssh habilitada.
Magma esun paquete de software privativode altaalidaddesarrollado
en Australia. Tiene una gran antidad de funionalidades en teoría de
nú-meros, geometría algebraia, teoría de grafos y teoría de ódigos. Trabaja
on un lenguaje espeializado para matemátios. A ontinuaión, vamos a
desribiralgunas de sus araterístiasmás importantes:
gráa.Ennuestroproyeto,esto nohasidounadesventaja, yaqueno
neesitamosinterfaz gráapara nada.
Magma tiene un soporte limitadopara omputaiónnuméria e
inte-graiónsimbólia.Noesposibleparaelusuarionaldenirsus propios
tiposde datos,pero los desarrolladoresde Magma suelen esuhar las
petiiones de los usuarios de añadir nuevos tipos de datos al núleo
esrito en C de Magma para poder ofreerlas en la siguiente versión
del programa.
Magma da grandes failidades a la hora de guardar todo lo que se
ha heho durante una sesión, aunque, por ejemplo, no existe ninguna
maneradeguardarendisounobjetoindependientequesehayareado.
Magmatieneunalibreríagrandeymuyoptimizada.Esmuypotentey
útilparalainvestigaión eniertasáreas,omolateoríade ódigos.La
granmayoríade Magma estáesritoen C, osea quesepueden utilizar
lasfunionalidadesdealgunaslibreríasdeCyaexistentes.Noobstante,
estelinkadosólose puederealizarreompilandoMagma, y,portanto,
losusuariosnalesnopueden haerlo,yaqueareen delódigofuente
parareompilarlo.Además,debidoaqueMagma esprivativo,algunas
libreríaslibres nose pueden linkar debidoa restriionesde lienia.
Atualmente Magma dasoporte a funionalidades básias para ódigos
sobre uerpos nitos y ódigos sobre anillos de enteros y anillos de Galois.
Todos estos tipos de ódigos son lineales. Además, Magma nos provee de
funiones para el aso espeial de ódigos binarios lineales, que son los que
se onstruyen sobre el uerpo nito
GF
(2)
, o de manera equivalente, sobre elanilloZ
2
.4.2. Implementaión en Magma
4.2.1. Cálulo del kernel en Magma
A la hora de implementar el paquete para trabajar on ódigos binarios
ya sean lineales o no lineales, teníamos que seguir un orden más o menos
estrito, es deir, lo primero de todo es onseguir alular el kernel de un
ódigo binario
C
de maneraeiente. En proyetos de años anterioresya se había intentado haer esta funión.En [7℄ y [9℄, simplemente se hizo una implementaión de la deniión
matemátiade kernel en Magma.Esdeir, laimplementaiónde lafórmula
K(C) =
{
x
∈
Z
n
2
|
x
+
C
=
C
}
Estaprimeraversión,evidentemente, dabaresultadosorretos. Elproblema
esque para ódigos de relativamentepoas palabras, la funión empezaba a
tardar muhísimo en alular el kernel. En la gura 4.1 se ve la diferenia
entre la primera versión del álulo del kernel, y la versión implementada
en el proyeto atual. Por ejemplo,para un ódigode 1024 palabras, queno
son muhas,laimplementaiónanterioromienza aserpooeiente. Porlo
tanto,omparándoloonlaprimeraversión,mejoramosmuhísimoelálulo
delkernel.
En [2℄ se intentaron mejorar los resultados de la funión implementada
en [7℄ y [9℄ introduiendo la idea del subespaio lineal. Ya que el kernel es
un subespaio lineal que se puede generar on una base de vetores, y dado
que Magma trabaja de maneramuy eiente on espaios vetoriales, ¾Por
quénorepresentar elkernel omounsubespaiovetorial?Partiendodeesta
base,elproyetistaimplementólasegunda versión delálulodelkernel,que
mejoraba bastante el funionamiento de la anterior, omo se muestra en la
memoria de su proyeto. Aun así, omo se ve en la gura 4.2, onseguimos
Cardinalidad del ódigo Cardinalidad delkernel Tiempo Versión 1 Tiempo Nuevo Mejora 16 4 0.000 0.000 0.000 32 8 0.010 0.000 0.010 64 8 0.000 0.010 -0.010 128 16 0.010 0.010 0.000 256 32 0.070 0.010 0.060 512 64 0.460 0.020 0.440 1024 128 3.280 0.070 3.210 2048 128 12.910 0.230 12.680 4096 1024 386.550 0.650 385.900 8192 512 776.450 2.410 774.040
Figura 4.1: Comparaiónon la primeraversión
ejeuión se inrementaba de manera espetaular, omo se ve en el último
aso, en el queel tiempo semultipliapor más de diez.
Cardinalidad del ódigo Cardinalidad delkernel Tiempo Versión 2 Tiempo Nuevo Mejora 16 4 0.000 0.000 0.000 32 8 0.000 0.000 0.000 64 8 0.000 0.000 0.000 128 16 0.000 0.010 -0.010 256 16 0.010 0.020 -0.010 512 32 0.060 0.030 0.030 1024 128 0.250 0.070 0.180 2048 256 1.120 0.200 0.920 4096 128 5.300 0.760 4.540 8192 128 16.010 2.800 13.210 16384 2048 180.960 10.010 170.950
Figura 4.2: Comparaiónon la segunda versión
Siguiendo on la idea de utilizar espaios vetoriales, pero dándole un
enfoque totalmente nuevo, omenzamos a implementar nuestra versión de
la funión, utilizando omo base un algoritmo implementado en C por el
funt KernelLeaders(C : array [1 . . M ℄ of CodeWord, M : integer) onst KERNEL = 0 NOT PROCESSED = -1 LEADER = -2 endonst var
kernelSet : array [1 . . M ℄ of integer
leadersSet : array [1 . . M ℄ of integer
kernelBound : integer ount, i, j : integer endvar begin QSort(C) ount <- 1 C[1℄.state <- KERNEL
C[i℄.state <- NOT PROCESSED for all i > 1
kernelSet <- {1} leaderSet <- {} if Weight(M) = 1 then kernelBound <- M/4 else kernelBound <- M fi i<-2
while ount <= M || #kernelSet <= kernelBound do
if C[i℄.state = NOT PROCESSED
then v <- C[i℄.v if C + v = C then for u in kernelSet do j <- BinarySearh(C, v + u) C[j℄.state <- KERNEL
kernelSet <- kernelSet union {v + u}
ount <- ount + 1
j <- BinarySearh(C, v + u + )
if C[j℄.state = NOT PROCESSED
then Union(C, , C[j℄) ount <- ount + 1 else Find(C, , C[j℄) Union(C, , C[j℄) fi od od else C[i℄.state <- LEADER ount <- ount + 1
leaderSet <- leaderSet union {v}
for u in kernelSet do j <- BinarySearh(C, v + u) Union(C, v, C[j℄) od fi fi i<-i+1 od if #kernelSet > kernelBound then kernelSet = C leaderSet = {} fi return(kernelSet, leaderSet) end
Aunque el núleo de Magma está esrito en C, no podemos utilizareste
ódigodiretamente. Elproblema es queMagma esun programa privativo,
y nosomosdesarrolladores para ellos. Porotro lado, tampooesposibledar
uso en Magma a la salidadel programa heho en C.
una palabra, deidimos si pertenee al kernel o no, y, en aso armativo,
añadimos al kernel la palabra ódigo y todas las que se generan sumándole
laspalabras queya forman parte delkernel.
En Magma, esta idea mejora muho más debido a que, omo ya hemos
omentado, Magmaes muy eienteen eltratamientode espaios
vetoria-les.Así,siresultaquelapalabraódigoqueestamosproesando perteneeal
kernel, añadimos al subespaio del kernel esta palabray todo el subespaio
generado por ella.
Este algoritmohasufridobastantes ambios ensuadaptaiónaMagma.
Para empezar,en elalgoritmose guardanlaspalabras ódigoen una
estru-tura que ontiene la palabra ódigo, su estado y su peso. En Magma, no
neesitamoselpeso, asíquenologuardamos.Enelalgoritmo,elpeso se
uti-lizapara optimizarlas búsquedas binarias que se haen. Dado que Magma
nos provee de otras funionalidades, no es neesario que hagamos ninguna
búsqueda de este estilo.
Otro ambio muy importante es la manera de retornar el kernel. En el
algoritmo,seretornaelkernelomounonjuntodetodassuspalabras.Enun
prinipiose pensó en retornar el kernel omo un espaiovetorial,yaque es
muhísimomásóptimotantoenmemoriaoupadaomoentiempodeálulo.
Pero en un momento de la vida del proyeto, se deidió que era más útil
devolverlo omoun ódigo binariolineal, ya quealutilizar larepresentaión
delsuperdual,nosinteresabamásqueelkernelfueradiretamenteunódigo.
Dadoque para elálulo delsuper dual setrabaja on lamatriz generadora
del ódigo generado por el kernel, si seguíamos devolviendo un subespaio
vetorial,tendríamosquealularelódigogeneradoporelkernel,parasaber
sumatriz generadora y asíalularel super dual. ComoMagma representa
sus ódigos on su matriz generadora y algunos parámetros más, deidimos
queguardarelkernelomounódigoeramuhomásprátio,ymásteniendo
en uenta quela representaión que utiliza Magma para losódigos y para
La implementaión de esta funión ha sido uno de los puntos que más
han pesado en elproyeto. Era imperativoalular elkernel de una manera
másóptimaquelaimplementadaen proyetos anteriores,siqueríamosllegar
a haer un paquete de software eiente. Por ello, nos hemos volado en
la realizaión de esta funión desde el iniio de la vida del proyeto. Así,
a nales de noviembre, obtuvimos una buena soluión. La funión se llama
KernelZ2(C).
Elsiguientepasoera implementarelsuperdualen Magma.Comovimos
en el apítulo 2,una vez que tenemos el kernel y los líderesde las lases, es
senilloalularlamatrizde paridadgeneralizadaqueseutilizaenelsistema
del super dual. Si reordamos, esta matriz es de la forma
(G
|
S)
, dondeG
es la matriz generadora del dual del ódigo generado por el kernel yS
se onstruye multipliandola matrizG
porloslíderes de laslases.A diferenia de la funión KernelZ2, y para nuestra sorpresa, esto no
nos llevó muho tiempo. Estuvimos unos diez días entre implementaión y
pruebas de lafunión.
4.2.2. Representaión de ódigos binarios en Magma
Unavez implementadoel super dual, debíamos diseñare implementarel
paquete para trabajar on ódigos binarios.En este momentoteníamosuna
manera robusta de representar ódigos binarios no neesariamente lineales
en Magma, y lainteniónera basar todoel paquete en el kernel, los líderes
de laslases y elsuperdual. Este hasido el gruesodel proyeto, que nos ha
oupadodesde la vuelta altrabajo en enero,hasta bien entrado abril.
Loprimeroquedebíamos pensar era ómoíbamosa estruturarlos
ódi-gos reados on nuestro paquete. Teníamosdos opiones:
1. Crear una estrutura de datos en la que guardar lamatriz de paridad
generalizaday los parámetrosdel ódigo.
am-Después de pensarlo, deidimos quela segunda opión era, en nuestro aso,
mejor. Como la idea es representar ódigos a partir de otros ódigos, este
tipo de datos nos ibabien, y aunque debíamos añadirle algunos ampos, la
soluiónes muy elegante y seamolda mejora Magma.
Primero de todo, deidimos que un ódigo no neesariamente lineal se
representaría on un ódigo lineal más unos uantos atributos. Así, en la
variable que representa al ódigo, guardaríamos el super dual generado a
partir del kernel y los líderes de las lases, es deir, el ódigo on matriz de
paridadgeneralizada
(G
|
S)
, y algunosatributos más.También nos planteamos qué neesitábamos añadir al tipo Code para
identiar ada ódigo de forma únia. Después de un par de reuniones,
deidimos añadir lossiguientes atributos:
Longitud. Magma ya implementa una funión que retorna la
lon-gitud de un ódigo, pero debido a que nuestra representaión no es
exatamente la misma que utiliza Magma, la funión implementada
por elintérprete no sepuede utilizar,yaque retornaría lalongitud
to-taldel ódigo super dual, que es lalongituddel ódigo más el número
de lases. Este atributo y lamatriz de paridad generalizada
(G
|
S)
son indispensables a la hora de trabajar on ódigos representados on elsuperdual, ya que,la longitudnos permite separar
G
yS
.Kernel. Aunque podríamosobtener este atributoa partir de la
longi-tudy lamatrizde paridadgeneralizada,onsideramosquesería
intere-santetenerlopreviamentealulado, yaquese utilizaontinuamentea
lahora de trabajaron losódigos representados por elsuper dual.
Líderes de las lases. Esuna listade palabrasódigo. Con ada
pa-labrarepresentamostodaunasublasedelódigo.Esteesotroatributo
que no es estritamente neesario guardar pero, de manera similar al
kernel, se utiliza ontinuamente a la hora de trabajar on ódigos
alular, al guardarla omo una parte del ódigo, nos aseguramos de
quesólo sealula una vez.
Condiióndelinealidad.Esteesunentinelaquenosdiesielódigo
eslineal onolo es. Durantelaejeuión de lasfuniones desarrolladas
en el paquete, es interesante saber si el ódigo es lineal o no para dar
un tratamientou otro.
Unavez deididos losnuevos atributos,empezamosa pensaren los
ons-trutores.Habíaquedenirlosdatosde entradadelonstrutor,esdeir,las
estruturasde datosapartirde lasualespodemosgenerarunódigobinario
lineal o no lineal. Siguiendo la linea de otro proyeto del departamento [3℄,
deidimos onstruir nuestros ódigos a partirde:
Unalistade vetores sobre
V
=
Z
n
2
,ouna matriz
m
×
n
sobreel anilloZ
2
, oun subespaio vetorialdeV
=
Z
n
2
,oun ódigo binariolineal de Magma,
oun ódigo uaternariolineal de Magma,
oun ódigo
Z
2
Z
4
-aditivo[3℄.Si estamos en el primer aso, simplemente enviamos la lista de vetores
a la funión KernelZ2, que alula el kernel. Con el kernel y los líderes, ya
tenemos suiente para deidir si el ódigo resultante será lineal o no. Es
fáilver que,si lalista de líderes de las lases está vaía, el ódigo es lineal,
ya que todas las palabras ódigo perteneen al kernel, y el kernel, omo ya
se hadiho, es lineal. Por lo tanto, mirandola lista de líderes,atuamos de
una manerau otraen funión de siestá vaía ono. Si elódigo noes lineal,
alulamoselsuperdual on elkernel ylos líderesde laslases yrellenamos
El kernel y los líderes son exatamente los que retorna la funión
KernelZ2
Ladistaniamínima,pordefeto,nosealulaen losódigosno
linea-les, a no ser que el usuario haga una llamada a la funión de álulo,
en uyo aso se alulay seañade en este atributo.
El entinela se pone a false.
Si por el ontrario el ódigo es lineal, para seguir siendo eles a la idea
del super dual, el ódigo que guardamos tiene que ser su ódigo dual, y los
nuevos ampos:
La longitud es, de la misma manera que en los no lineales,el número
de oordenadas de laspalabrasódigo.
El kernel y los líderes son exatamente los que retorna la funión
KernelZ2, pero en este aso, lalistade líderesestá vaía.
La distania mínima, en este aso sí que se alula, ya que Magma
implementa funiones eientes de álulo de distania mínima para
ódigos lineales.
El entinela se pone a true.
El segundo aso, en el que la entrada es una matriz
m
×
n
, onvertimos las las de la matriz en una lista para tratarla exatamente de la mismaformaque en elaso anterior,y una vez tenemos lalistade las, generamos
elódigo binarioomo en el primeraso.
Eltereraso,tambiénessenillo,yaque,alserlaentradaunsubespaio
vetorial,podemosarmarqueelódigoresultanteserálinealy,porlotanto,
noesneesarioalularelkernel.Loquehaemosesgenerarunódigobinario
linealapartirdelsubespaio,yrellenarlosamposdelaestruturademanera
Hasta este aso, lasonstruiones eran más omenosfáilesde haer, ya
queapenas teníamos queontemplarasos espeiales. Realmente, el amino
aseguiren estos asos estabamuy bien denido.Pero uandollegamosalos
ódigos omo entrada delonstrutor, nos dimos uenta de quelos asos no
eran tan triviales omo habíamospensado en un prinipio.
Podemos tener omo entrada un ódigo binariolineal, un ódigo
uater-nariolinealounódigo
Z
2
Z
4
-aditivo.Losdosprimerosasossepuedenunir, yaqueambossondeltipoCodede Magma.Sielódigoesbinariolineal,notenemos muhos problemas, ya que simplementemiramos si el ódigo tiene
nuestraestrutura, en uyoaso, simplementeretornamosla entrada,o, por
elontrario, esun ódigo onstruido diretamente on losonstrutores que
nos ofree Magma, lo ualquiere deir queel ódigoes linealy la
onstru-ión del ódigo se redue a realizar una onversión deltipo de datos Code a
nuestra estrutura.
Sielódigoesuaternario,loprimeroquetenemosquehaeresonvertir
las palabras ódigo del alfabeto uaternario al alfabeto binario a través del
mapadeGray(verapítulo2).Alhaerestaonversión,podemos
enontrar-nos on que un ódigo que en uaternario es lineal, al onvertirlo a binario
es no lineal. Para saber si la onversión va a resultar no lineal, disponemos
de la funión HasLinearGrayMapImage. Esta funión nos die si un ódigo
uaternario tiene una imagen binaria lineal, y si la tiene, retorna una
ba-se de vetores que generan la imagen binaria lineal. En aso ontrario, hay
que llamar a la funión GrayMapImage, que nos devolverá una lista de
ve-tores. Estos vetores son todas las palabras ódigo del ódigo uaternario,
onvertidas alalfabeto binario.Con esta lista, ya tenemos todolo que
nee-sitamos para llamar a la funión de álulo delkernel y empezar el proeso
de onstruiónde un ódigo binario(nolineal,en este aso)apartirde uno
uaternario.
Por último,elaso de los
Z
2
Z
4
-aditivos,esun aso espeial. Unalibrería para este tipo de ódigos ha sido desarrollada en el Grupo deCombina-palabras que forman estos ódigos tienen oordenadas en
Z
2
y enZ
4
. Su representaión en Magma, en este aso, se hae mediante una estruturade datos que ontiene todos los parámetros que se neesitan para tratar
un ódigo de este tipo. Uno de los ampos de la estrutura es el ódigo
Z
2
Z
4
-aditivo. Como tenemos oordenadas uaternarias, tenemos que haer también una onversión, omo en el aso anterior. En este aso, ontamoson funiones desarrolladas en [3℄. Elresultado de las funiones es similar a
las que utilizamos en el aso de los ódigos uaternarios. Las funiones son
HasZ2Z4LinearGrayMapImageyZ2Z4GrayMapImage.Estasdosfunionesson
una versión de lasfunionesanteriormenteitadasHasLinearGrayMapImage
yGrayMapImageadaptadasparatrabajaronódigos
Z
2
Z
4
-aditivos. Median-te la funión HasZ2Z4LinearGrayMapImage, sabremos si existe una imagenbinaria lineal a través del mapa de Gray y, si existe, obtendremos la
ba-se de vetores que la generan. Si no existe, tenemos que utilizar la funión
Z2Z4GrayMapImage para que nos retorne una lista on todas las palabras
ódigo del ódigo
Z
2
Z
4
-aditivoonvertidas al alfabeto binario, y generamos nuestro ódigo a partirde esta listade vetores.4.2.3. Paquete de ódigos binarios en Magma
Unavez terminadoslosonstrutores, ysiguiendo laestruturade
Mag-ma,teníamosqueimplementarfunionesparatrabajaronnuestrosódigos.
Enesta línea,implementamos funiones lasiadasen uatrotipos:
1. Invariantes de un ódigo binario.
2. Operaiones sobre laspalabras ódigo.
3. Pertenenia e igualdad.
4. Propiedades de los ódigosbinarios.
Las invariantes de un ódigo binario son parámetros del ódigo que se
transforma-BinaryLength(C) nos retorna lalongituddel ódigo
C
.BinaryCardinal(C) retorna laantidad de palabras queperteneen a
C
.BinaryMinimumDistane(C) retornaladistaniamínimadelódigo
C
. Si ya se ha alulado anteriormente, retornamos el valor del atributoqueguardala distaniamínimade
C
. Sinose haalulado, sealula y seguarda en el ampo orrespondiente.BinaryRank(C) retorna ladimensión del rangodel ódigo
C
.BinaryKernelDimension(C)retornaladimensióndelkerneldelódigo
C
.BinaryKernel(C) retornael kernel y loslíderes de las lases de
C
.Además de esto, lafuniónBinaryParameters(C) nos devuelveuna listaen
laque enontramos lalongitud,la ardinalidady ladistaniamínima de
C
. En partiular, la funión BinaryMinimumDistane(C) que hay ahora enel paquete, se podría deir que es una segunda versión. La primera
imple-mentaión miraba ladistaniaentre todas laspalabras delódigo.
Estasegundaversiónalulaladistaniamínimadelkernel,aprovehando
que es un ódigo lineal. Una vez alulada esta distania, se entra en los
líderes de las lases. De esta forma, alulamos la distania entre todas las
palabrasde una lase y todas las palabrasde las siguientes lases, tratando
el kernel omo si fuera una lase más, es deir, omo si fuera la primera
lase. Así, nos ahorramos el álulo manual de la distania en el kernel y
no repetimos álulo de diferenias, ya que apliamos
d(u, v) =
d(v, u)
(ver apítulo2).Lasfunionesdeltipooperaionessobrelaspalabrasódigo,sonfuniones
que o bien retornan una palabra ódigo, o bien utilizan las palabras ódigo
omoparámetro. Así tenemos:
IsInBinaryCode(C,u)/IsNotIn Bin aryC ode( C,u)sondosfunionesque
nos dien si lapalabra
u
pertenee aC
o no.Estas funiones nonos ostaron muho. No fueron triviales, pero, la verdad
es que el planteamiento que se hizo iniialmente fue muy aertado, así que
lasimplementamos on bastante rapidez.
Los dos siguientes tipos son funiones uyo resultado es true o false.
Enel aso de lasfuniones de pertenenia eigualdad,se utilizanpara verla
relaiónque hay entre dos ódigos de entrada. Las funionesson:
IsBinarySubset(C,D)/IsBinar yNo tSub set( C,D) nosdiesielódigo
C
está ontenido en elódigoD
.IsBinaryEqual(C,D)/IsBinary Not Equa l(C, D) nos diesilosódigos
C
yD
son iguales.Estas funiones han supuesto todo un reto a la hora de haerlas
o-rretamente y además de manera eiente. Lo que en un prinipio nos
pa-reió trivial, al nal se omplió sobremanera, sobre todo en el aso de
IsBinarySubset(C)(ver apítulo 2). Puesto que Magma dispone de
fun-iones para deidir si un ódigo es parte de otro, pensamos que sería algo
muy fáil de implementar, pero nos dimos uenta de que los resultados
ob-tenidos al utilizar las funiones que nos ofree el intérprete, no podían ser
orretos, ya que nuestros ódigos se onstruyen a partir del kernel y los
líderes,yéstoesloquetenemosqueutilizarpara estasfunionesdedeisión.
Por último, nos quedan las funiones ontenidas en el tipo propiedades
de losódigosbinarios.Medianteestasfunionespodemossaberotras
ara-terístiasdel ódigo queno hemos alulado aún.Son lassiguientes:
IsBinaryCode(C)nosdiesiunódigoestáonstruidosobreelalfabeto
Z
2
=
{
0,
1
}
.IsBinaryLinearCode(C)/IsZ2L ine arCo de(C ) nos die si un ódigo
IsBinaryPerfetCode(C) nos die siun ódigo binarioes perfeto.
IsBinaryExtendedPerfetCode( C) nos die si un ódigo binario es
perfeto extendido.
IsZ4LinearCode(C,p) nos die siun ódigo binario
C
está onstruido a partir de un ódigo uaternario al que se le aplia una permutaiónp
.IsZ2Z4LinearCode(C,alpha,p) nos die si un ódigo binario
C
tiene omobaseunódigoZ
2
Z
4
-aditivo,apartirdelódigoC
,una permuta-iónp
yalpha
,queesunparámetropropiodelosódigosZ
2
Z
4
-aditivos que nos die uantas oordenadas de la palabra ódigo perteneen alalfabeto
Z
2
.Exeptuandolosdosprimerosasos,estasfunionestambiénnoshan
sorpren-dido por su omplejidad(ver apítulo2). Igual que nos pasó anteriormente,
esperábamos implementarlas en muho menos tiempo e invirtiendo menos
esfuerzo delque alnal fue neesario.
Así llegamos al nal de la implementaióndel paquete software que nos
habíamosplanteado.Debido alpootiempoquequedabayteniendoen
uen-taque habíaque testeareste paquetey esribirladoumentaión,deidimos
quedejaríamos en el tintero lasfuniones de reaión de familiasde ódigos
binariospartiulares.
4.3. Testeo
Una vez reado el paquete, hay que testear su orreto funionamiento.
Hemos implementado un test para la funión del kernel, y otro test para el
paquete de Magma. A parte, también hemos heho una pequeña funión
que muestra las mejoras de la funión del kernel respeto de las anteriores
versiones.
Para efetuar el test del kernel se genera un ódigo binario no lineal
ódigosedaomoentradade lasfunionesdeálulodekernel.Así,tenemos
dos kernels alulados on dos funiones distintas uyos resultados deberían
ser iguales o,porlo menos, equivalentes, ya que el espaio generado por los
dos kernels tienequeser elmismo.Comprobamoslaigualdaddelosespaios
generados y retornamos si ha habido éxito o no. Para omparar, utilizamos
los resultados de la funión desarrollada en [2℄, ya que alula más rápido
que lafunión implementada en [7℄ y [9℄, y losresultados son orretos.
Para testear el paquete, hemos heho un test que pasa por todas las
líneas de ódigo implementado. En este aso, ha habido muho trabajo, ya
quehabía queontemplarmuhísimosasos. Laidea esdarle aada funión
unaentradaonlaquesabemosquéresultadovamosaobtener,esdeir,para
adaentrada,sabemosuálvaaser susalida.Deesta manera,seomprueba
el orreto funionamiento de todas las funiones del paquete en todos los
asos.
Comoalahoraderealizarelpaquetedividimoslasfunionesendiferentes
tipos,el testeose hae respetando esos tipos.Es deir haemos un test para
losonstrutores, otropara lasinvariantes,et. Así,lafunión de testreibe
unparámetroquenosdiequéqueremostestear.Tambiénestálaposibilidad
de testear todo el paquete. Por ejemplo, en el testeo de las propiedades de
losódigos binarios, quees eltest más senillo,la funión esla siguiente:
testProperties:=proedure( )
Q:=RandomLinearCode(IntegerR ing( 4),5 ,3);
B:=LinearCode(VetorSpae(GF (2), 5));
//generamos un ódigo binario lineal
GM:=false;
while (GM eq false) do
BCL:=BinaryRandomCode(5,8) ;
GM:=BCL`IsLinear;
end while;
while (GM) do
BCNL:=BinaryRandomCode(5,8) ;
GM:=BCNL`IsLinear;
end while;
print "Result must be false-->",IsBinaryCode(Q);
print "Result must be true-->",IsBinaryCode(B);
print "Result must be true-->",IsBinaryCode(BCL);
print "Result must be true-->",IsBinaryLinearCode (B);
print "Result must be false-->",IsBinaryLinearCod e(BC NL);
print "Result must be true-->",IsZ2LinearCode(B);
print "Result must be true-->",IsZ2LinearCode(BCL );
end proedure;
y lasalida deltest:
Testing Properties of Binary Codes
Result must be false--> false
Result must be true--> true
Result must be true--> true
Result must be true--> true
Result must be false--> false
Result must be true--> true
Handbook of Magma funtions
5.1. Introdution
Magma urrently supports the basi failitiesfor odes over nite elds
andodes overintegerresidueringsandgalois rings,allthat arelinearodes
(see [1, Chapters 127-130℄). Therefore, Magma provides funtions for the
speial ase of binary linear odes, that is when the nite eld is
GF
(2)
, or equivalentlythe nitering isZ
2
. This hapter desribes funtionswhihare appliable to binary odes not neessarily linear. A(n, M, d)
binary odeC
is a subset ofZ
n
2
with ardinalityM
and minimum Hamming distaned
. IfC
is not linear,then the zero word doesnot need tobelong toC
.If thezero wordisnotinC
,onsideringanewbinaryodeC
′
=
C
+
c
forany
c
∈
C
,we an assure that the zero word is in the binary odeC
′
, whih is equivalent
to
C
.Inthis hapter,thetermode willrefertoabinaryode notneessarily
linear suh that it ontains the zero word, unless otherwise speied.
Two strutural properties of binary odes are the rank and kernel. The
rank of abinary ode
C
,r
=
rank(C)
,is simplythe dimension of the linear span,h
C
i
, ofC
. The kernel of a binary odeC
is dened asK(C) =
{
x
∈
Z
n
2
|
x
+
C
=
C
}
. If the zero word is inC
, thenK(C)
is a linear subspae ofC
. We will denote the dimension of the kernel ofC
byk
=
ker(C)
. Ingeneral,
C
an be writtenas the union of osets ofK(C)
:C
=
t
[
i
=0
K(C) +
ci
,
wherec
0
=
0
andt
+ 1 =
M/2
k
.Theseparametersan beusedtodistinguish
between non-equivalent binary odes, sine equivalent ones have the same
parameters
r
andk
.Let
C
be a binary ode of lengthn
suh that the zero word belongs toC
,withkernelK
(C)
ofdimensionk
andoset leaders[c
1
, . . . , ct]
.Theparity hek system of the binary odeC
is a(n
−
k)
×
(n
+
t)
binary matrix(G
|
S)
, whereG
is a generator matrix of the dual odeK(C)
⊥
and
S
=
(G
·
c
1
G
·
c
2
. . . G
·
ct)
. The super dual of the binary odeC
is the binary linear ode generated by the parity hek system(G
|
S)
. Note that ifC
is a binarylinearode,thesuperdualisthedualodeC
⊥
.Fromthesedenitions,
wean establishthe followingproperties (see [5℄):
Let
col(S)
denote the set of olumns of the matrixS
. Then,c
∈
C
if and onlyifG
·
c
=
0
orG
·
c
∈
col(S)
. Letr
=
rank(C)
andk
=
ker(C)
.Then,
r
=
n
−
dim(G) +
dim(S)
andk
=
n
−
dim(G)
.5.2. Constrution of Binary Codes
BinaryCode(L)
Creates a binary ode
C
given by itssuperdual, whihisa binary linear ode of lengthn
+
t
generated by the parity hek system(G
|
S)
for the binary odeC
. As it is explained above, the parity hek system(G
|
S)
is onstruted using the kernelK(C)
and the oset leaders[c
1
, . . . , ct]
of the binary ode obtained byL
, where:1.
L
is asequene of elements ofV
=
Z
n
2
, 2. or,L
is a subspae ofV
=
Z
n
2
,3. or,
L
is am
×
n
matrixA
over the ringZ
2
,4. or,
L
is a binary linearode,5. or,
L
is a quaternarylinear ode,6. or,
L
is aZ
2
Z
4
-additive ode.Note thatin general,dependingon the ardinality
M
of the binary odeC
, this funtion ould take some time to omputeK(C)
and[c
1
, . . . , ct]
, in order toreturn the binary ode given by itssuper dual.If
L
is aquaternary linearode oraZ
2
Z
4
-additiveode, thenthe binary ode orrespondstothe imageofL
undertheGray map.Ifthe zeroword is notinL
,thenL
issubstituted byL
+
c
,wherec
isthe rst elementinL
.This onstrutor appends ve attributes to the ode ategory:
Length: The length
n
of the binary ode.Kernel: The kernel of the binary ode asa binary linear subode.
CosetLeaders: The sequene of osetleaders
[c
1
, . . . , ct]
. MinimumDistane: The minimum (Hamming)distane.IsLinear: It istrue if and only if
C
isa binary linear ode. IfL
isasubspaeofV
=
Z
n
2
orabinarylinearode, thisfuntionreturnsthe dual ode. In this ase, the Kernel is idential to the binary linear
ode
L
denedbythefuntionLinearCode(),theCosetsattributeisthe emptysequene, the Lengthattribute isn
and the IsLinear attribute is true.Given two positive integers
n
andM
, return a random binary ode of lengthn
and ardinalityM
.BinaryRandomCode(
n
,M
,k
)Given three positive integers
n
,M
andk
, return a random binary ode of lengthn
, ardinalityM
and with akernel of minimumdimensionk
. ExampleH5E1Weandeneabinaryodebygivingasequene ofelements ofavetorspae
V
=
Z
n
2
, oramatrix overZ2
.Note thatC
is theunionofthe kerneland thekernel addedto the osetleaders.> V := VetorSpae(GF(2),4);
> L := [V!0,V![1,0,0,0℄,V![0,1,0,1℄,V![1,1,1,1℄℄;
> C1 := BinaryCode(L);
> C1;
[7, 4, 2℄ Linear Code over GF(2)
Generator matrix: [1 0 0 0 1 0 1℄ [0 1 0 0 0 1 1℄ [0 0 1 0 0 0 1℄ [0 0 0 1 0 1 1℄ > IsBinaryLinearCode(C1); false > A := Matrix(L); > C2 := BinaryCode(A); > C2;
[7, 4, 2℄ Linear Code over GF(2)
Generator matrix: [1 0 0 0 1 0 1℄ [0 1 0 0 0 1 1℄ [0 0 1 0 0 0 1℄ [0 0 0 1 0 1 1℄ > IsBinaryEqual(C1, C2); true
> C3;
[4, 2, 1℄ Linear Code over GF(2)
Generator matrix: [0 1 0 0℄ [0 0 1 1℄ > IsBinaryLinearCode(C3); true ExampleH5E2
We an also onstrut random binary odes with a given length, number of odewords
and,optionally,qithagivenminimumkerneldimension.
> C1 := BinaryRandomCode(8,56);
> C1;
[14, 5, 4℄ Linear Code over GF(2)
Generator matrix: [1 0 0 0 0 0 0 0 1 0 1 0 1 0℄ [0 1 0 0 0 0 1 0 1 0 1 0 0 0℄ [0 0 1 0 0 0 1 1 1 0 1 0 0 1℄ [0 0 0 1 0 1 1 1 0 1 1 1 1 1℄ [0 0 0 0 1 0 0 1 0 0 0 1 1 1℄
> (BinaryLength(C1) eq 8) and (BinaryCardinal(C1) eq 56);
true
> C2 := BinaryRandomCode(8,48,2);
> C2;
[19, 6, 6℄ Linear Code over GF(2)
Generator matrix: [1 0 0 1 0 0 0 0 1 1 0 1 0 0 0 1 0 1 0℄ [0 1 0 1 0 0 0 0 0 0 1 1 0 1 1 0 0 0 1℄ [0 0 1 1 0 0 0 0 0 1 0 0 0 1 0 0 0 1 1℄ [0 0 0 0 1 0 0 0 0 0 1 1 1 1 0 1 1 1 1℄ [0 0 0 0 0 1 0 1 0 0 0 0 1 1 0 0 1 1 1℄ [0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 1 1 1℄ > BinaryKernelDimension(C2) ge 2;
5.3. Invariants of a Binary Code
BinaryLength(C)
Given a binary ode
C
, returnthe lengthof the ode. BinaryCardinal(C)Given a binary ode
C
, returnthe numberof words belongingtoC
. BinaryMinimumDistane(C)Given a binary ode
C
,return the minimum (Hamming) distane of the words belongingtothe odeC
.BinaryParameters(C)
Givenabinaryode
C
,returnalistwiththeparameters[n, M, d]
,wheren
isthelengthoftheode,M
thenumberofodewordsandd
theminimum (Hamming)distane.BinaryRank(C)
Given abinary ode
C
of lengthn
, returnits rank. The rankof abinary odeC
is the dimension of the linear span ofC
overZ
2
.BinaryKernel(C)
Given a binary ode
C
of lengthn
, return its kernel as a binary linear ode, and the leaders of the osets as a list of binary vetors of lengthn
. The kernel of a binary odeC
is the set of odewordsc
suh thatc
+
C
=
C
.BinaryKernelDimension(C)
Given a binary ode
C
of lengthn
, returnthe dimensionof its kernel.ExampleH5E3
> C := BinaryRandomCode(10,64);
> C;
[17, 7, 4℄ Linear Code over GF(2)
Generator matrix: [1 0 0 0 0 0 1 0 0 0 1 1 1 1 0 1 1℄ [0 1 0 0 0 0 0 0 1 1 0 1 1 0 1 0 0℄ [0 0 1 0 0 0 1 0 1 1 1 1 0 0 1 1 0℄ [0 0 0 1 0 0 1 0 0 0 0 0 0 0 1 0 1℄ [0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 1 1℄ [0 0 0 0 0 1 1 0 1 0 0 1 0 1 1 1 1℄ [0 0 0 0 0 0 0 1 0 1 0 0 1 1 1 1 1℄ > BinaryLength(C); 10 > BinaryCardinal(C); 64 > BinaryMinimumDistane(C); 1 > BinaryParameters(C); [ 10, 64, 1 ℄ > r := BinaryRank(C); > r; 10 > k := BinaryKernelDimension(C); > k; 3 > kernel,CosetLeaders := BinaryKernel(C); > ((2^k)*(#CosetLeaders+1)) eq BinaryCardinal(C); true 5.4. Operations on Codewords BinaryRandom(C)