• No se han encontrado resultados

Códigos binarios no lineales en MAGMA

N/A
N/A
Protected

Academic year: 2021

Share "Códigos binarios no lineales en MAGMA"

Copied!
67
0
0

Texto completo

(1)

Memoria del proyeto de nal de arrera

orres-pondientealosestudiosde IngenieríaSuperioren

Informátia presentado por Vítor Ovalle Are y

dirigidoporMerè VillanuevaGay.

(2)

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

(3)

A mihermana, por su apoyo

(4)
(5)

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.

(6)
(7)

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

(8)

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

(9)

2.1. La relaión entre

K(C)

,

C

y

h

C

i

en un ódigo no lineal es

K(C)

C

⊂ h

C

i

. . . 7

2.2. Enunódigolinealelkernelesigualalódigo,esdeir,

K(C) =

C

=

h

C

i

. . . 8

2.3. Ejemplode divisiónde un ódigobinarioen

K(C)

ylaslases de

C

. . . 9

3.1. Planiaióntemporalreal . . . 18

4.1. Comparaiónon la primeraversión . . . 24

(10)

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

(11)

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.

(12)

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.

(13)

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.

(14)

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

elespaio

vetorialde dimensión

n

sobre el uerpo nito

Z

2

=

GF

(2)

.La distania de Hamming entre dos vetores

x, y

Z

n

2

,

d(x, y)

,esel númerode oordenadas enlasuales

x

e

y

dieren. Ladistaniade Hammingumplelapropiedadde simetría,esdeir,elresultadode

d(x, y

)

y

d(y, x)

eselmismo.Deniremosun ódigobinarioomounsubonjuntode

Z

n

2

.Loselementosdeestesubonjunto

sedenominanpalabrasódigo.LadistaniamínimadeHammingdeunódigo

(15)

ódigo diferentes. Así, deniremos un ódigo binario

C(n, M, d)

omo un subonjunto de

Z

n

2

on ardinalidad

M

y distaniamínima de Hamming

d

. Unódigobinariopuedeserlinealonolineal.Losódigosbinarioslineales

son aquellos que están denidos sobre el uerpo nito

Z

2

y que, además de ser un subonjunto de

Z

n

2

, son un subespaio vetorial. Así, podemos

asegurar 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

y

C

2

de longitud

n

son isomorfos si existe una permutaión

π

tal que

C

2

=

π(C

1

) =

{

π(c)

|

c

C

1

}

. Dos ódigos binarios

C

1

y

C

2

de longitud

n

son equivalentes si existe un vetor

a

Z

n

2

y una

permutaiónde oordenadas

π

talque

C

2

=

{

a

+

π(c)

|

c

C

1

}

.

Sea

C

un ódigo binarionolineal. Silapalabraero noestá en

C

, onsi-derandounnuevoódigobinario

C

,talque

C

=

C

+

c

paraualquier

c

C

, podemos asegurar quela palabraero pertenee al ódigobinario

C

,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

, de

C

.El kernel de un ódigobinario

C

sedeneomo

K

(C) =

{

x

Z

n

2

|

x

+

C

=

C

}

.Silapalabra ero pertenee a

C

, entones

K(C)

es un subespaio lineal ontenido en

C

. Denominaremos la dimensión del kernel de

C

omo

k

=

dimension(K(C))

. Estosparámetros

r

y

k

sepuedenusaromodistiniónentreódigosbinarios noequivalentes, ya quelos equivalentes tienen losmismosparámetros

r

y

k

. Además,

r

y

k

nos permiten deidir si un ódigo binario es lineal o no, ya que si el ódigo binario no es lineal, se umple que

K(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 de

C

, es deir, es una matriz que genera todas

(16)

Figura2.1:Larelaiónentre

K(C)

,

C

y

h

C

i

enunódigonolineales

K(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 lineal

C

, su ódigo duales

C

=

{

x

Z

n

2

|

x

·

y

= 0,

y

C

}

, donde

x

·

y

eselproduto esalarde

x

e

y

.Si

C

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 ero

omo resultado.

Son importantes también los oneptos de lases y líderes de las lases.

Sea

C

un ódigo binario y

x

una palabra ódigo de

C

, llamaremos lase al subonjunto

x

+

C

=

{

x

+

y

| ∀

y, x

+

y

C

}

de

C

.Es deir, lalase

x

+

C

está formada por las palabras que resultan de sumar todas las palabrasdel

(17)

K ( 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 lalase

x

+

C

.

Para aabar, veremos qué es un ódigo perfeto y un ódigo perfeto

ex-tendido. Un ódigo

C

de longitud

n

es perfeto si para algún entero

r

0

, ada elemento de

Z

n

2

está a distania menor o igual que

r

de, exatamente, unapalabraódigode

C

.Sea

C

unódigo perfeto,siañadimosun dígitode paridadatodassus palabrasódigo,obtenemoselódigo

C

.Podemos deir

que

C

es un ódigo perfeto extendido de

C

.

2.2. Representaión de ódigos binarios

Unódigobinarionolineal

C

sepuedeesribiromolaunióndesukernel

K(C)

más los trasladados delkernel, esdeir,

C

=

t

[

i

=0

K(C) +

ci

,

donde

c

0

=

~

0

. Lo que haemos es subdividir el ódigo

C

en unas uantas lases,

[c

1

, c

2

, . . . , ct]

, que son traslados del kernel. El número de lases se

(18)

C

=

K(C)

c

1

+

K(C)

c

2

+

K(C)

. . .

ct

+

K

(C)

Figura2.3:Ejemplo dedivisión de unódigo binarioen

K

(C)

ylaslasesde

C

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 binario

C

dividido en el kernel y sus

t

trasladados, es deir, tendremos

t

+ 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 longitud

n

talquelapalabraeropertenee a

C

,on kernel

K(C)

de dimensión

k

y líderesde laslases

S

= [c

1

, c

2

, . . . , ct]

. Esfáilverque podemosrepresentarelódigobinario

C

omoelkernelmás loslíderesdelaslases,esdeir,

C

puedeserrepresentado porlamatriz

H

S

,

donde

H

es una matriz generadora de

K(C)

. Como

K(C)

esun subespaio lineal, podemos representarlo de manera ompata omo un ódigo binario

lineal,aprovehandosumatrizgeneradorabinariadetamaño

k

×

n

.Elkernel oupa unespaioen memoriadelordende

O(nk)

.Además, elkernel máslos

t

líderes de las lases

ci

, donde

i

∈ {

1, . . . , t

}

, oupa un espaio de orden

O(n(k

+

t))

.

Paraelaso

t

= 0

,esdeir,uandoelódigobinario

C

eslineal,tenemos que

C

=

K(C)

y que el ódigo puede ser representado por su matriz gene-radora binaria, osea que el espaio en memoria es de orden

O(nk)

. Cuando

t+1 =

M

,quieredeirqueelkernel

K

(C)

sóloestáformadoporunapalabra, que es lapalabra ero. Por onsiguiente, el resto de lases estarán formadas

(19)

sería

O(nM

)

donde

M >> 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 partiular

H

, es deir, esta representaión es demasiado poo exible a la hora haer transformaiones

básias de las. Por ejemplo, si permutamos una de las las de

S

on una de las las de

H

, 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)

, donde

G

es la matrizgeneradora deldual delkernel,

K(C)

,de dimensión

(n

k)

×

n

, y

S

= (G

·

c

1

G

·

c

2

. . . G

·

ct)

,de dimensión

(n

k)

×

t

.Elsuper dualdelódigo binario

C

eselódigobinario linealgeneradoporelsistemade paridad

(G

|

S)

.Notar quesi

C

esunódigo binariolineal,el super duales elódigo dual

C

. 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

)

, y

C

2

, on matriz de paridad generalizada

(G

2

|

S

2

)

son iguales, o bien si

C

1

está ontenido en

C

2

. También se ha estudiado ómo podemos saber si una palabra ódigo

x

perteneea

C

,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 de

C

1

tieneque ser igual al kernel de

C

2

, oequivalentemente, elespaio generado por

G

1

tiene queser igual al generadopor

G

2

.Asítendremostambiénque

S

1

y

S

2

tienenelmismonúmero de las. Finalmente, hay que omprobar que los líderes de las lases de

C

2

(20)

son palabras ódigo de

C

1

ovieversa.

Paraversi

C

1

C

2

sehatenidoquehaerunestudiomásenprofundidad, yaqueelproblemanoestrivial.Primerode todo,hayqueomprobarquelas

longitudes de ambos ódigos son iguales. Para que

C

1

esté ontenido en

C

2

, laardinalidadde

C

1

tienequeser menoroigualalaardinalidadde

C

2

.En este momento, tenemos dos aminos a seguir. El primero es que se umpla

que

K(C

1

)

K

(C

2

)

.Eneste aso,essuienteonomprobarquetodoslos líderes de las lases de

C

1

forman parte de

C

2

. Sin embargo, si el kernel de

C

1

noformaparte delkernel de

C

2

, nopodemosasegurar que

C

1

*

C

2

. Si el segundo kernel no ontiene al primero, tenemos que trabajar on

la 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 de

k

sobre elkernel de

C

2

. Ahora, para que

C

1

C

2

setienequeumplirquetodas lasnuevaspalabrasódigoquehay en labase

extendida perteneen a

C

2

. Si esto se umple, ya sólo nos queda mirar que los líderes de las lases de

C

1

perteneen a

C

2

y que el resultado de sumar las nuevas palabras de la base extendida a los líderes de las lases también

pertenee a

C

2

. Eneste momento,ya podemos saber si

C

1

está ontenidoen

C

2

.

Siqueremossabersiuna palabraódigo,

x

formapartedelódigobinario

C

, on matriz de paridadgeneralizada

(G

|

S)

, hay queplantearse dos asos. El primero, quees el más senillo, esel aso en que

C

es lineal, osea que la matriz de paridad generalizada es

G

, que es la matriz de ontrol de

C

. En este aso, el proedimiento habitual es suiente, es deir, multipliamos la

palabra

x

porlamatrizde ontrolde

C

y,si suresultadoes ero,es deir,si

G

×

x

= 0

,podemosasegurar que

x

perteneea

C

.Hayqueteneren uenta que,debidoalarepresentaión apartirdelsuperdual,tenemos que mirarsi

lapalabra

x

perteneealkernel,esdeir, hay queomprobarque

x

K(C)

. Si

C

esun ódigo nolineal,en elasoque

G

×

x

6

= 0

, nopodemosasegurar

que

x

no pertenee a

C

. Hay que omprobar si el vetor

G

×

x

es una de

las olumnas de la matriz

S

. Es deir,

x

pertenee a

C

si

G

×

x

= 0

(21)

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.Paraalular

la dimensión delkernel,

k

de

C

, sabiendo que

G

es la matriz generadora de

K(C)

, tendremosque

k

eslaresta de ladimensión de

G

menoslalongitud del ódigo

C

.Para alular el rango de un ódigo binario

C

uya matriz de paridad generalizada es

(G

|

S)

, tenemos que sumar la dimensión del kernel al rango de

S

. También hemos tenido que estudiar ómo saber si un ódigo binario ha sido onstruido a partir de un ódigo uaternario, o un ódigo

Z

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ódigos

Z

2

Z

4

-aditivossonódigosuyaspalabrastienen oordenadasen

Z

2

yen

Z

4

.Para pasarde

Z

4

a

Z

2

,utilizamoslanotaiónen ódigo de Gray. El ódigo de Gray onsiste en ordenar

2

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

en

Z

4

,seonvierte en una palabra de longitud

2n

en

Z

2

.

Para pasar de ódigos

Z

2

Z

4

-aditivosaódigos binarios,laidea esla mis-ma.Enelproyeto[3℄,sehandesarrolladofunionesquerealizanesta

onver-sión de ódigos

Z

2

Z

4

-aditivosa ódigosbinarios utilizandotambiénel mapa de Gray.

Enambosasos,ladeisióndesiunódigobinarioestáonstruidoapartir

(22)

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

(23)
(24)

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

(25)

una matriznos puedeser muy útil.

4. Implementaren Magma lasfunionesneesariasparaalularelsuper

dualde unódigo binario

C

.De estamanera,representamos unódigo noneesariamentelinealomoelsuperdualaluladoapartirdelkernel

de

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 binario

C

, o nos retornarán una palabra ódigo aleatoria del ódigo binario.

(26)

ódigo es perfeto, o si es binario lineal, si está onstruido a partir de

un ódigo

Z4

o un ódigo

Z

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

(27)

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

(28)

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

(29)
(30)

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:

(31)

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 elanillo

Z

2

.

(32)

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

(33)

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

(34)

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

(35)

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.

(36)

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

(37)

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)

, donde

G

es la matriz generadora del dual del ódigo generado por el kernel y

S

se onstruye multipliandola matriz

G

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.

(38)

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 el

superdual, ya que,la longitudnos permite separar

G

y

S

.

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

(39)

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 anillo

Z

2

, oun subespaio vetorialde

V

=

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

(40)

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 misma

formaque 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

(41)

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,no

tenemos 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 de

(42)

Combina-palabras que forman estos ódigos tienen oordenadas en

Z

2

y en

Z

4

. Su representaión en Magma, en este aso, se hae mediante una estrutura

de 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, ontamos

on 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 imagen

binaria 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

(43)

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 atributo

queguardala 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 en

el 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:

(44)

IsInBinaryCode(C,u)/IsNotIn Bin aryC ode( C,u)sondosfunionesque

nos dien si lapalabra

u

pertenee a

C

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ódigo

D

.

IsBinaryEqual(C,D)/IsBinary Not Equa l(C, D) nos diesilosódigos

C

y

D

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

(45)

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ón

p

.

IsZ2Z4LinearCode(C,alpha,p) nos die si un ódigo binario

C

tiene omobaseunódigo

Z

2

Z

4

-aditivo,apartirdelódigo

C

,una permuta-ión

p

y

alpha

,queesunparámetropropiodelosódigos

Z

2

Z

4

-aditivos que nos die uantas oordenadas de la palabra ódigo perteneen al

alfabeto

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

(46)

ó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;

(47)

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

(48)

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 is

Z

2

. This hapter desribes funtionswhihare appliable to binary odes not neessarily linear. A

(n, M, d)

binary ode

C

is a subset of

Z

n

2

with ardinality

M

and minimum Hamming distane

d

. If

C

is not linear,then the zero word doesnot need tobelong to

C

.If thezero wordisnotin

C

,onsideringanewbinaryode

C

=

C

+

c

forany

c

C

,we an assure that the zero word is in the binary ode

C

, 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

, of

C

. The kernel of a binary ode

C

is dened as

K(C) =

{

x

Z

n

2

|

x

+

C

=

C

}

. If the zero word is in

C

, then

K(C)

is a linear subspae of

C

. We will denote the dimension of the kernel of

C

by

k

=

ker(C)

. In

(49)

general,

C

an be writtenas the union of osets of

K(C)

:

C

=

t

[

i

=0

K(C) +

ci

,

where

c

0

=

0

and

t

+ 1 =

M/2

k

.Theseparametersan beusedtodistinguish

between non-equivalent binary odes, sine equivalent ones have the same

parameters

r

and

k

.

Let

C

be a binary ode of length

n

suh that the zero word belongs to

C

,withkernel

K

(C)

ofdimension

k

andoset leaders

[c

1

, . . . , ct]

.Theparity hek system of the binary ode

C

is a

(n

k)

×

(n

+

t)

binary matrix

(G

|

S)

, where

G

is a generator matrix of the dual ode

K(C)

and

S

=

(G

·

c

1

G

·

c

2

. . . G

·

ct)

. The super dual of the binary ode

C

is the binary linear ode generated by the parity hek system

(G

|

S)

. Note that if

C

is a binarylinearode,thesuperdualisthedualode

C

.Fromthesedenitions,

wean establishthe followingproperties (see [5℄):

Let

col(S)

denote the set of olumns of the matrix

S

. Then,

c

C

if and onlyif

G

·

c

=

0

or

G

·

c

col(S)

. Let

r

=

rank(C)

and

k

=

ker(C)

.

Then,

r

=

n

dim(G) +

dim(S)

and

k

=

n

dim(G)

.

5.2. Constrution of Binary Codes

BinaryCode(L)

Creates a binary ode

C

given by itssuperdual, whihisa binary linear ode of length

n

+

t

generated by the parity hek system

(G

|

S)

for the binary ode

C

. As it is explained above, the parity hek system

(G

|

S)

is onstruted using the kernel

K(C)

and the oset leaders

[c

1

, . . . , ct]

of the binary ode obtained by

L

, where:

(50)

1.

L

is asequene of elements of

V

=

Z

n

2

, 2. or,

L

is a subspae of

V

=

Z

n

2

,

3. or,

L

is a

m

×

n

matrix

A

over the ring

Z

2

,

4. or,

L

is a binary linearode,

5. or,

L

is a quaternarylinear ode,

6. or,

L

is a

Z

2

Z

4

-additive ode.

Note thatin general,dependingon the ardinality

M

of the binary ode

C

, this funtion ould take some time to ompute

K(C)

and

[c

1

, . . . , ct]

, in order toreturn the binary ode given by itssuper dual.

If

L

is aquaternary linearode ora

Z

2

Z

4

-additiveode, thenthe binary ode orrespondstothe imageof

L

undertheGray map.Ifthe zeroword is notin

L

,then

L

issubstituted by

L

+

c

,where

c

isthe rst elementin

L

.

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. If

L

isasubspaeof

V

=

Z

n

2

orabinarylinearode, thisfuntionreturns

the dual ode. In this ase, the Kernel is idential to the binary linear

ode

L

denedbythefuntionLinearCode(),theCosetsattributeisthe emptysequene, the Lengthattribute is

n

and the IsLinear attribute is true.

(51)

Given two positive integers

n

and

M

, return a random binary ode of length

n

and ardinality

M

.

BinaryRandomCode(

n

,

M

,

k

)

Given three positive integers

n

,

M

and

k

, return a random binary ode of length

n

, ardinality

M

and with akernel of minimumdimension

k

. ExampleH5E1

Weandeneabinaryodebygivingasequene ofelements ofavetorspae

V

=

Z

n

2

, oramatrix over

Z2

.Note that

C

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

(52)

> 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;

(53)

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 belongingto

C

. BinaryMinimumDistane(C)

Given a binary ode

C

,return the minimum (Hamming) distane of the words belongingtothe ode

C

.

BinaryParameters(C)

Givenabinaryode

C

,returnalistwiththeparameters

[n, M, d]

,where

n

isthelengthoftheode,

M

thenumberofodewordsand

d

theminimum (Hamming)distane.

BinaryRank(C)

Given abinary ode

C

of length

n

, returnits rank. The rankof abinary ode

C

is the dimension of the linear span of

C

over

Z

2

.

BinaryKernel(C)

Given a binary ode

C

of length

n

, return its kernel as a binary linear ode, and the leaders of the osets as a list of binary vetors of length

n

. The kernel of a binary ode

C

is the set of odewords

c

suh that

c

+

C

=

C

.

BinaryKernelDimension(C)

Given a binary ode

C

of length

n

, returnthe dimensionof its kernel.

ExampleH5E3

(54)

> 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)

Referencias

Documento similar

Se dice que la Administración no está obligada a seguir sus pre- cedentes y puede, por tanto, conculcar legítimamente los principios de igualdad, seguridad jurídica y buena fe,

Por ello es que, realmente, no se puede hablar de una actitud radical y beligerante de parte del colectivo que se manifiesta a favor del reconocimiento legal del

o esperar la resolución expresa&#34; (artículo 94 de la Ley de procedimiento administrativo). Luego si opta por esperar la resolución expresa, todo queda supeditado a que se

1. LAS GARANTÍAS CONSTITUCIONALES.—2. C) La reforma constitucional de 1994. D) Las tres etapas del amparo argentino. F) Las vías previas al amparo. H) La acción es judicial en

A Carlos Eduardo, Oscar y Gilma, mis colegas de doctorado que ya se graduaron y que fueron mi ejemplo y grupo de apoyo. Por supuesto a todos los Emes, amigos

Volviendo a la jurisprudencia del Tribunal de Justicia, conviene recor- dar que, con el tiempo, este órgano se vio en la necesidad de determinar si los actos de los Estados

Este parón o bloqueo de las ventas españolas al resto de la Comunidad contrasta sin em- bargo con la evolución interior de ese mismo mercado en cuan- to a la demanda de hortalizas.

Tras establecer un programa de trabajo (en el que se fijaban pre- visiones para las reuniones que se pretendían celebrar los posteriores 10 de julio —actual papel de los