documento adicional] Software

Anuncio
Cuadrados Latinos y Grafos de Moore
Lluı́s Acero
Introducción
Bajo el tı́tulo Cuadrados latinos y grafos de Moore se esconden dos campos de la matemática bastante peculiares. Por un lado los cuadrados latinos, tan viejos casi como la
antigua Grecia y a su vez tan poco estudiados que la mayor parte de los libros de combinatoria los mencionan solamente para destacar sus aplicaciones en el diseño de experimentos.
Y por otro lado, los grafos de Moore, una clase tan particular de grafo que puede que sólo
haya tres, y de los cuales se conocen dos, resistiéndose el tercero a ser hallado debido a su
gran tamaño.
El problema de los grafos de Moore es en cierto sentido parecido al del Teorema de
Fermat: ambos problemas son muy fáciles de enunciar y entender, pero su resolución es
estremadamente difı́cil. Por ejemplo, el Teorema de Fermat dice que para n > 2 no existe
ninguna terna (x, y, z) de números enteros que verifique la ecuación xn + y n = z n .
La historia que rodea el Teorema de Fermat es todavı́a más interesante: Pierre de
Fermat era un matemático francés al que le gustaba resolver problemas de matemática
discreta. A menudo se le ocurrı́an ideas mientras leı́a libros, de forma que anotaba esas
ideas en los mismos márgenes. En uno de estos libros apareció una nota que decı́a lo
siguiente: ((Tengo una demostración realmente maravillosa para este problema, pero este
margen es demasiado estrecho para contenerla)). El hecho es que Fermat murió y nunca se
encontró la demostración que afirmaba haber descubierto. De esta forma, Fermat desafió a
los matemáticos de las generaciones futuras a resolver el problema.
Han tenido que pasar trescientos cincuenta años para que el matemático Andrew Wiles,
después de haber dedicado toda una vida al estudio del Teorema de Fermat, fuese capaz de
encontrar una demostración. Además, se sabe con certeza que dicha demostración no es la
que habı́a pensado Fermat, ya que en ella se utilizan técnicas que no existı́an en la época,
algunas incluso fueron creadas expresamente para la demostración.
El problema de los grafos de Moore también puede enunciarse de una forma muy concisa.
Consiste en encontrar grafos regulares tales que la distancia entre dos vértices cualesquiera
no sea superior a 2. Un grafo de este tipo se llama grafo de Moore y se sabe que sólo puede
existir para valores del grado iguales a 3, 7 y posiblemente 57. Los dos primeros casos son
conocidos, mientras que el tercero, que recibe el nombre de El Gran Grafo de Moore, sigue
sin encontrarse.
Otra similitud entre El Gran Grafo de Moore y el Teorema de Fermat es que aparentemente carecen de aplicación práctica. Y digo aparentemente porque en el caso del Teorema
de Fermat, los descubrimientos que realizó Andrew Wiles durante la búsqueda de la demostración resultaron ser tan interesantes como la propia demostración, ya que relacionaban
partes de la matemática que nunca se habı́a considerado vinculadas. Es lo que se conoce
como resultados intermedios. El caso de los grafos de Moore no va a ser una excepción,
ya que, como veremos, se ha conseguido relacionar los grafos de Moore con los cuadrados
1
latinos. Otra vez, dos campos de la matemática aparentemente independientes resultan
estar vinculados a través de un problema.
Personalmente, creo que la primera vez que oı́ hablar de un grafo de Moore fue el verano
del 2001. Recuerdo ese verano con especial cariño porque fue cuando me operaron de mi
dolencia de corazón. Fue también el verano en que inicié mi Erasmus en Parı́s. Ahora soy
consciente que esos dos hechos fueron decisivos en mi elección de realizar una tesina sobre
los grafos de Moore.
Por un lado, mi paso por el hospital me obligó a posponer algunos de los exámenes de
mi tercer curso de Caminos, hecho que me dio la oportunidad de conocer un poco mejor a
ciertos profesores de la escuela. Por otro lado, mi estancia en Parı́s me proporcionó las condiciones necesarias para adentrarme en el problema. Un año después, ya se habı́a convertido
en un pasatiempo para mi, inducido quizá por las horas muertas en clase y posteriormente
en el trabajo, ası́ como los largos trayectos en el tren que une Parı́s y Barcelona. Y el
pasatiempo daba sus frutos, porque cada vez que me ponı́a a pensar en el problema nuevas
ideas me venı́an a la mente. Poco a poco el problema fue cogiendo forma, gracias también
a la aplicación que entretanto me habı́a dedicado a programar. Finalmente, decicı́ volver
al despacho donde habı́a empezado todo, esta vez ya con mi propuesta de tesina, y ası́ fue
como me convertı́ en un aprendiz de matemático.
A partir de ahı́ vino el trabajo propio de una tesina: lo primero fue comprobar que
muchos de las conclusiones a las que habı́a ido llegando por mi cuenta ya eran conocidas,
lo cual no dejaba de ser un poco frustrante, pero por otro lado era señal que iba por buen
camino. También tuve que aprender LATEX y C++, ası́ como profundizar mis conocimientos
de Visual Basic, lo cual me ha sido de gran utilidad más allá del ámbito académico.
En definitiva, la experiencia ha sido, y sigue siendo, muy enriquecedora. Por eso quiero
dar las gracias a todos los profesores de matemáticas que alguna vez se han cruzado en mi
vida, y en especial mi tutora Camino Balbuena, con quien comparto no sólo la afición de
las matemáticas sino también la de la ciencia ficción.
2
Objetivos
El objetivo de esta tesina empezó siendo el estudio de los grafos de Moore. Sin embargo,
durante su desarrollo se descubrió que existı́a una relación entre los grafos de Moore y los
cuadrados latinos, por lo que se decidió ampliar los objetivos para abarcar también estos
últimos. De esta manera, se consigue ofrecer una visión más completa del problema de los
grafos de Moore.
Formalmente, los objetivos de esta tesina son los siguientes:
Recopilar la información existente en la literatura acerca de los cuadrados latinos y
los grafos de Moore.
Analizar la información recopilada y ampliarla para los propósitos de esta tesina.
Presentar tanto la información recopilada como la propiamente desarrollada en un
documento que pueda ser utilizado para futuras referencias.
Desarrollar herramientas informáticas especı́ficas para la generación de cuadrados
latinos y para la construcción de grafos de Moore.
Por otro lado, la realización de esta tesina implica el logro de los siguientes objetivos
secundarios:
Familiarizarse con la redacción de documentos matemáticos en LATEX.
Familiarizarse con el proceso de búsqueda y consulta de artı́culos matemáticos.
Familiarizarse con los lenguajes de programación C++ y Visual Basic.
3
Capı́tulo 1
Cuadrados Latinos
La finalidad de este primer capı́tulo es ofrecer una introducción bastante exhaustiva a
los cuadrados latinos. A lo largo del capı́tulo definiremos qué es un cuadrado latino, estudiaremos sus propiedades, veremos formas de generar y enumerar los cuadrados latinos y,
finalmente, expondremos algunas de sus aplicaciones. En este capı́tulo también se incluyen
algunos nuevos resultados fruto de esta tesina que, sumados a los ya existentes en la literatura, esperemos contribuyan a una mayor comprensión de estas entidades matemáticas.
1.1.
Definiciones y propiedades
Definición 1.1 Sea Ω un conjunto de n elementos. Al conjunto Ω le llamaremos alfabeto.
Definición 1.2 Un cuadrado latino de orden n es una matriz n × n en la que cada uno de
los elementos del alfabeto Ω aparece exactamente una vez en cada fila y en cada columna.
La denominación cuadrado latino tiene un origen histórico ya que los primeros cuadrados
de este tipo se representaban usando el alfabeto latino {a, b, c, . . .}. Ası́ mismo, los cuadrados
griegos eran aquellos cuadrados latinos que se escribı́an en el alfabeto griego {α, β, χ, . . .}.
En la actualidad, los cuadrados latinos suelen representarse usando el alfabeto [n] de los n
primeros números naturales. Por ejemplo,
⎡
⎢
⎢
⎢
L=⎢
⎢
⎢
⎣
4
3
2
1
5
5
4
3
2
1
1
5
4
3
2
2
1
5
4
3
3
2
1
5
4
⎤
⎥
⎥
⎥
⎥
⎥
⎥
⎦
es un cuadrado latino de orden 5 en el alfabeto Ω = {1, 2, 3, 4, 5}. Nótese que cada fila es
una permutación cı́clica de la anterior. Ésta es una manera sencilla de construir cuadrados
latinos de cualquier orden.
Definición 1.3 Sea P una matriz binaria (es decir, cuyos elementos son 0 o 1). Se dice
que P es una matriz de permutación sii tiene exactamente un 1 en cada fila y en cada
columna.
4
El nombre de matriz de permutación viene dado por el hecho de que al multiplicar una
matriz M cualquiera por una matriz P de permutación se obtiene una matriz M cuyas
filas o columnas son las mismas que M pero en distinto orden. Ası́, la operación P · M
corresponde a permutar las filas de M , mientras que la operación M · P corresponde a
permutar las columnas de M .
Además, las matrices de permutación verifican las siguientes propiedades:
1) El producto de P por su traspuesta es la identidad. Por lo tanto, P −1 = P T .
2) El valor absoluto del determinante de P es 1, es decir, | det(P )| = 1.
Proposición 1.4 Para un orden n dado, existen n! posibles matrices de permutación.
Demostración. Consideremos la matriz nula de orden n, es decir, aquella matriz cuyos
elementos son todos cero. Vamos a rellenar dicha matriz con unos hasta obtener una matriz
de permutación. Para empezar, tenemos que colocar un 1 en la primera fila, y dado que
de momento no hay más unos, podemos escoger cualquiera de las n posiciones de la fila.
En la segunda fila tenemos que colocar otro 1, pero esta vez ya sólo hay n − 1 posiciones
libres. Al llegar a la última fila tendremos que colocar el último 1 en la única posición que
quedará libre. El número de elecciones que habremos tenido que hacer a lo largo de este
proceso será n · (n − 1) · (n − 2) · . . . · 3 · 2 · 1 = n!, que es precisamente el número de matrices
de permutación de orden n.
Proposición 1.5 Todo cuadrado latino puede escribirse de la siguiente forma:
L=
n
k · Pk
(1.1)
k=1
Las matrices Pk son matrices de permutación que satisfacen
la matriz cuyos elementos son todos 1.
n
k=1
Pk = J, donde J es
Demostración. Sea L un cuadrado latino de orden n y sea Pk una matriz n × n definida
de la forma siguiente:
1 si Lij = k
(Pk )ij =
(1.2)
0 en caso contrario
Como L es un cuadrado latino, el elemento k aparece sólo una vez en cada fila y en
cada columna de L. Por lo tanto, la matriz Pk es una matriz de permutación. Si definimos
la matriz Pk para cada elemento del alfabeto Ω, entonces podremos escribir el cuadrado
latino L como aparece en la proposición.
Por ejemplo, tomando el cuadrado latino L del inicio de la sección, podemos escribirlo
como una suma de matrices de permutación de la forma siguiente:
⎡
⎢
L=1·⎢
⎣
0
0
0
1
0
0
0
0
0
1
1
0
0
0
0
0
1
0
0
0
0
0
1
0
0
⎤
⎡
⎥
⎢
⎥+2·⎢
⎦
⎣
0
0
1
0
0
0
0
0
1
0
0
0
0
0
1
1
0
0
0
0
0
1
0
0
0
⎤
⎡
⎥
⎢
⎥+3·⎢
⎦
⎣
0
1
0
0
0
5
0
0
1
0
0
0
0
0
1
0
0
0
0
0
1
1
0
0
0
0
⎤
⎡
⎥
⎢
⎥+4·⎢
⎦
⎣
1
0
0
0
0
0
1
0
0
0
0
0
1
0
0
0
0
0
1
0
0
0
0
0
1
⎤
⎡
⎥
⎢
⎥+5·⎢
⎦
⎣
0
0
0
0
1
1
0
0
0
0
0
1
0
0
0
0
0
1
0
0
0
0
0
1
0
⎤
⎥
⎥
⎦
Definición 1.6 Dados dos cuadrados latinos L1 y L2 se dice que son equivalentes, y se
escribe L1 ∼ L2 , si uno puede obtenerse a partir del otro mediante una combinación de
permutaciones de fila, columna y sı́mbolo, o una permutación de sus “dimensiones”.
Ya hemos visto cómo se permutan las filas y las columnas de un cuadrado latino, es
decir, mediante las matrices de permutación. La operación de permutar los sı́mbolos en
un cuadrado latino consiste en aplicar una biyección f : Ω → Ω tal que (L2 )ij = f ((L1 )ij ).
Por otro lado, la operación de permutar las “dimensiones” del cuadrado latino consiste
en intercambiar las categorı́as de fila, columna y sı́mbolo. Por ejemplo, dado el elemento
(L1 )ij = k, si intercambiamos filas por sı́mbolos, obtenemos el elemento (L2 )kj = i.
Proposición 1.7 La relación ∼ es una relación de equivalencia.
Demostración. Veamos que ∼ cumple las condiciones para ser relación de equivalencia:
1) Es reflexiva. En efecto, L1 ∼ L1 por la identidad.
2) Es simétrica. Si L1 ∼ L2 por f , entonces L2 ∼ L1 por f −1 .
3) Es transitiva. Si L1 ∼ L2 por f y L2 ∼ L3 por g, entonces L1 ∼ L3 por g · f .
De este modo, el conjunto Ln de los cuadrados latinos de orden n queda clasificado
según ∼ en clases de equivalencia. Además, una propiedad importante de las clases de
equivalencia es que todas tienen el mismo número de elementos, por lo que sabemos que
cada clase de equivalencia contendrá el mismo número de cuadrados latinos equivalentes.
Definición 1.8 Se dice que un cuadrado latino está normalizado sii los elementos de su
primera fila y su primera columna aparecen según el orden natural del alfabeto Ω.
Para Ω = [n], la primera fila y la primera columna de un cuadrado latino normalizado
son de la forma [1, 2, . . . , n].
Proposición 1.9 Dado un cuadrado latino cualquiera, existe un cuadrado latino equivalente que está normalizado.
Demostración. Sea L un cuadrado latino cualquiera. Dicho cuadrado latino no tiene por
qué tener su primera fila o su primera columna ordenadas. Sin embargo, podemos ordenar
la primera fila permutando adecuadamente las columnas de L, y luego ordenar la primera
columna permutando adecuadamente las n − 1 filas restantes.
Definición 1.10 Se dice que un cuadrado latino es simétrico sii
∀i, j ∈ [n]
Lij = Lji
(1.3)
Corolario 1.11 Dado un cuadrado latino simétrico, existe un cuadrado latino equivalente
que está normalizado y que también es simétrico.
6
1.2.
Cubos binarios latinos
Otra manera de tratar los cuadrados latinos consiste en verlos como cubos binarios. Un
cubo binario es un tensor n × n × n cuyos elementos son 0 o 1. Para que un cubo binario
sea latino debe tener exactamente un 1 en cada dimensión.
Definición 1.12 Dado un cuadrado latino L, su cubo binario asociado C se define como
Cijk =
1
0
si Lij = k
en caso contrario
(1.4)
Por ejemplo, dado el cuadrado latino siguiente, su cubo binario asociado se obtiene
descomponiendo el cuadrado latino por sı́mbolos y colocando cada uno en un nivel distinto
del cubo:
Figura 1.1: Cuadrado latino y cubo binario asociado al mismo.
La ventaja de trabajar con cubos binarios es que filas, columnas y sı́mbolos son indistinguibles por permutación. Ası́ es más fácil entender que si se permutan filas por columnas
y/o por sı́mbolos se obtiene un cuadrado latino equivalente, ya que en el fondo el cubo
binario asociado sigue siendo el mismo.
Por ejemplo, si tomamos el cubo binario anterior y permutamos columnas por sı́mbolos,
obtenemos el siguiente cuadrado latino equivalente:
Figura 1.2: Cubo binario equivalente y cuadrado latino asociado.
Otra ventaja de trabajar con cubos binarios es que admiten una formulación muy compacta. Por ejemplo, un cubo binario es latino si cumple las siguientes condiciones:
n
i=1
n
j=1
n
Cijk = 1,
∀j, k
(1.5)
Cijk = 1,
∀i, k
(1.6)
Cijk = 1,
∀i, j
(1.7)
k=1
7
1.3.
Cuadrados latinos ortogonales
Definición 1.13 Dados dos cuadrados latinos L1 y L2 del mismo orden, decimos que son
ortogonales si para cada par ordenado de sı́mbolos (k, k ) existe exactamente una posición
(i, j) que verifica:
(1.8)
(L1 )ij = k y (L2 )ij = k Dicho de otra forma, dos cuadrados latinos son ortogonales si al superponerlos cada uno
de los pares ordenados aparece exactamente una vez. Por ejemplo, los cuadrados latinos
siguientes son ortogonales:
⎡
⎢
⎢
L1 = ⎢
⎣
1
2
3
4
2
1
4
3
3
4
1
2
4
3
2
1
⎤
⎡
⎥
⎥
⎥
⎦
⎢
L2 = ⎢
⎢
⎣
1
3
4
2
2
4
3
1
3
1
2
4
4
2
1
3
⎤
⎥
⎥
⎥
⎦
Los cuadrados latinos ortogonales fueron objeto de la atención de Euler debido al siguiente problema que él mismo propuso: “Se tienen 36 oficiales de 6 rangos distintos en
seis regimientos distintos. ¿Pueden disponerse en un cuadrado de forma que en cada fila y
en cada columna haya un oficial de cada rango y de cada regimiento?”
En lenguaje moderno, Euler buscaba un par de cuadrados latinos ortogonales de orden
seis. No fue capaz de resolver el problema y ahora sabemos que no existe ningún par de este
tipo. Aunque el problema de Euler muestra que no es trivial encontrar cuadrados latinos
ortogonales, existe una construcción sencilla basada en las propiedades aritméticas de Zp ,
cuando p es primo.
Teorema 1.14 Sea p un número primo y sea t un elemento no nulo de Zp . Entonces la
regla
(1.9)
(Lt )ij ≡ ti + j (mod p)
define un cuadrado latino de orden p. Es más, si t = u, los cuadrados latinos Lt y Lu son
ortogonales.
Demostración. Empezaremos por demostrar que Lt es un cuadrado latino. Para ello,
supongamos que las posiciones (i, j) e (i , j) contienen el mismo sı́mbolo. Si (Lt )ij = (Lt )i‘j ,
entonces ti + j = ti + j, y al ser t inversible en Zp , tenemos que i = i , por lo que cada
sı́mbolo aparece como máximo una vez en cada columna. Un argumento similar demuestra
que cada sı́mbolo aparece como máximo una vez en cada fila. Por lo tanto, Lt es un cuadrado
latino.
Para demostrar que los cuadrados latinos Lt y Lu son ortogonales si t = u, supongamos
que existen dos posiciones distintas (i1 , j1 ) e (i2 , j2 ) tales que Lt y Lu tienen los sı́mbolos k
y k respectivamente en cada posición. Es decir,
ui1 + j1 = k ui2 + j2 = k ti1 + j1 = k,
ti2 + j2 = k,
(1.10)
(1.11)
Resulta que t(i1 − i2 ) = j2 − j1 y u(i1 − i2 ) = j2 − j1 . Si i1 − i2 = 0, estas ecuaciones
implican que j2 − j1 = 0, de forma que las posiciones (i1 , j1 ) e (i2 , j2 ) son la misma,
contrariamente a la hipótesis inicial. En consecuencia, i1 − i2 = 0 e i1 − i2 tiene un inverso
8
en Zp . En este caso, podemos resolver las ecuaciones en t y u y se llega a t = u =
(j2 − j1 )/(i1 − i2 ), lo cual contradice la hipótesis inicial de que t = u. Por lo tanto, los
sı́mbolos k y k sólo pueden aparecer conjuntamente en una única posición y Lt y Lu son
ortogonales.
En general, decimos que el teorema anterior proporciona un conjunto de p−1 cuadrados
latinos de orden p mutuamente ortogonales para cada primo p.
Definición 1.15 Dados dos cuadrados latinos L1 y L2 no necesariamente ortogonales,
definimos su grado r de ortogonalidad como el número de pares ordenados no duplicados.
Se dice entonces que L1 y L2 son r-ortogonales.
De la definición de cuadrados latinos r-ortogonales surge la siguiente pregunta: “¿Para
qué enteros n y r existe un par de cuadrados latinos r-ortogonales?”
Esta cuestión fue tratada por primera vez de forma sistemática por Belyavskaya (véase
[3]) y fue resuelta definitivamente por Colbourn y Zhu en [4]. Es precisamente en [4] donde
aparece el siguiente teorema.
Teorema 1.16 Para n ≥ 27, existen cuadrados latinos r-ortogonales de orden n sii
n ≤ r ≤ n2
y
r ∈ {n + 1, n2 − 1}
(1.12)
Los casos particulares para n < 27 fueron calculados por Zhu y Zhang en [14] y [15],
resultando que el teorema anterior es válido también para n < 27 salvo en las siguientes
excepciones:
n Excepciones de r
2
4
3
5, 6, 7
4 7, 10, 11, 13, 14
5 8, 9, 20, 22, 23
6
33, 36
Cuadro 1.1: Excepciones del grado r de ortogonalidad.
Nótese que el caso n = 6 y r = 36 es precisamente el que impidió a Euler resolver el
problema de los oficiales.
Corolario 1.17 El grado mı́nimo de ortogonalidad se alcanza precisamente cuando los
cuadrados latinos L1 y L2 son equivalentes por permutación de los sı́mbolos del alfabeto.
Por ejemplo, los cuadrados latinos siguientes son 4-ortogonales, ya que al superponerlos
sólo aparecen las parejas (1, 2), (2, 3), (3, 4) y (4, 1):
⎡
⎢
⎢
⎣
L1 = ⎢
1
2
3
4
2
1
4
3
3
4
1
2
4
3
2
1
⎤
⎡
⎥
⎥
⎥
⎦
L2 = ⎢
⎢
⎢
⎣
9
2
3
4
1
3
2
1
4
4
1
2
3
1
4
3
2
⎤
⎥
⎥
⎥
⎦
1.4.
Enumeración de cuadrados latinos
La enumeración de cuadrados latinos fue emprendida por Euler en 1782, precisamente
mientras intentaba resolver el problema de los oficiales. Euler enumeró los cuadrados latinos
de órdenes 2, 3, 4 y 5 mediante un proceso de búsqueda exhaustiva.
Hubo que esperar hasta 1934 para que Fisher y Yates determinaran el número de cuadrados latinos de orden 6. A partir de entonces, con la aparición de los primeros ordenadores
y el posterior desarrollo de la informática, fue posible determinar el número de cuadrados latinos para órdenes mayores. La siguiente tabla muestra la evolución histórica en la
aparición de estos resultados:
Orden
6
7
8
9
10
11
Autor
Año Publicación
Fisher, Yates
1934
[5]
Sade
1948
[12]
Wells
1967
[13]
Bammel, Rothstein 1975
[1]
McKay, Rogoyski
1995
[10]
McKay, Wanless
2003
[11]
Cuadro 1.2: Estado del arte en enumeración de cuadrados latinos.
Recientemente ha sido calculado el número de cuadrados latinos de orden 11, por lo que
cabe esperar que el siguiente resultado no se obtenga hasta dentro de algunos años (a menos
que se descubra un método que reduzca drásticamente el coste computacional de enumerar
cuadrados latinos, o se desarrolle un ordenador con una capacidad de cálculo infinitamente
superior, lo cual es poco probable). No obstante, existe una propiedad esencial que hay que
introducir antes de revisar dichos resultados sobre la enumeración de cuadrados latinos.
Definición 1.18 Denotaremos N (n) el número de cuadrados latinos de orden n y L(n) el
número de cuadrados latinos normalizados de orden n. Análogamente, denotaremos NS (n)
el número de cuadrados latinos simétricos de orden n y LS (n) el número de cuadrados
latinos simétricos normalizados de orden n.
Proposición 1.19 El número total de cuadrados latinos de orden n puede escribirse en
función del número de cuadrados latinos normalizados de orden n como sigue:
N (n) = n! (n − 1)! L(n)
(1.13)
Demostración. Consideremos un cuadrado latino normalizado. Existen n! maneras distintas de desordenar sus filas y (n − 1)! maneras distintas de desordenar sus columnas
manteniendo la primera columna fija. Por lo tanto, existen n! (n − 1)! cuadrados latinos,
normalizados o no, para cada cuadrado latino normalizado.
Vista la proposición anterior, sabemos que para determinar el número de cuadrados
latinos de un orden dado basta enumerar los cuadrados latinos normalizados del mismo
orden, lo cual reduce el problema en varios órdenes de magnitud. A pesar de ello, el número
de cuadrados latinos crece muy rápidamente con el orden, tal como puede observarse en la
tabla de la página siguiente:
10
n
1
2
3
4
5
6
7
8
535
9
377 597 570
10
7 580 721 483 160 132
11 5 363 937 773 277 371 298 119 673
16
281
964
811
540
L(n)
1
1
1
4
56
9 408
942 080
401 856
258 816
489 280
771 840
Cuadro 1.3: Número de cuadrados latinos normalizados.
Como ya se ha dicho, todavı́a no se conoce el número exacto de cuadrados latinos de orden mayor que 11. Sin embargo, McKay y Rogoyski ofrecen en [10] algunas aproximaciones
calculadas mediante un método probabilı́stico:
n
L(n)
12 1,62 × 1044
13 2,51 × 1056
14 2,33 × 1070
15 1,5 × 1086
Cuadro 1.4: Estimación del número de cuadrados latinos normalizados.
1.4.1.
Enumeración de cuadrados latinos simétricos
Durante el desarrollo de esta tesina se consideró interesante determinar la influencia de
la simetrı́a sobre el número de cuadrados latinos por los siguientes motivos:
a) Debido a la aparición de cuadrados latinos simétricos en la contrucción de grafos de
Moore.
b) Con la intención de completar los resultados existentes, ya que no se ha encontrado
ningún estudio de este tipo en la literatura.
Para ello se ha desarrollado un algoritmo de búsqueda exhaustiva (descrito en el Capı́tulo 3) que ha permitido determinar el número de cuadrados latinos simétricos normalizados
de orden n ≤ 9. La tabla de la página siguiente resume los resultados obtenidos.
El número de cuadrados latinos simétricos normalizados también está relacionado con
el número total de cuadrados latinos simétricos tal como expresa la siguiente proposición.
Proposición 1.20 El número total de cuadrados latinos simétricos de orden n puede escribirse en función del número de cuadrados latinos simétricos normalizados de orden n
como sigue:
(1.14)
NS (n) = n! LS (n)
11
n
LS (n)
1
1
2
1
3
1
4
4
5
6
6
456
7
6 240
8
10 936 320
9 1 225 566 720
Cuadro 1.5: Número de cuadrados latinos simétricos normalizados.
Demostración. Consideremos un cuadrado latino simétrico normalizado. Existen n! maneras distintas de desordenar sus filas, pero desordenar las filas equivale a desordenar las
columnas, ya que el cuadrado latino es simétrico. Por lo tanto, sólo existen n! cuadrados
latinos simétricos, normalizados o no, para cada cuadrado latino simétrico normalizado.
El siguiente gráfico permite observar la evolución del número de cuadrados latinos con
el orden (nótese que el gráfico está en escala logarı́tmica):
1E+28
1E+27
N(n)
1E+26
1E+25
L(n)
1E+24
Ns(n)
1E+23
Ls(n)
1E+22
1E+21
1E+20
1E+19
1E+18
1E+17
1E+16
1E+15
1E+14
1E+13
1E+12
1E+11
1E+10
1E+09
1E+08
1E+07
1E+06
1E+05
1E+04
1E+03
1E+02
1E+01
1E+00
0
1
2
3
4
5
6
7
8
9
10
Figura 1.3: Evolución del número de cuadrados latinos con el orden.
Este gráfico permite constatar como el número de cuadrados latinos crece exponencialmente en una escala logarı́rmica. El número de cuadrados latinos simétricos también crece
exponencialmente, aunque a un ritmo menor, aproximadamente la mitad. Esto nos lleva a
conjeturar que el número de cuadrados latinos simétricos de orden n es del orden de la raı́z
cuadrada del número de cuadrados latinos de orden n:
NS (n) ≈
12
N (n)
(1.15)
Además, si observamos la evolución del número de cuadrados latinos simétricos, vemos
que presenta algunas irregularidades en los órdenes impares (el número de cuadrados latinos
es proporcionalmente inferior), lo cual da a entender que la condición de simetrı́a es más
difı́cil de obtener en cuadrados latinos de orden impar.
1.4.2.
Fórmulas asintóticas
Las fórmulas asintóticas proporcionan una estimación sencilla de calcular algo que requerirı́a mucho esfuerzo determinar de forma exacta. En el caso de los cuadrados latinos, las
fórmulas asintóticas proporcionan una estimación del número de cuadrados latinos cuando
el orden es suficientemente grande.
Por ejemplo, si tuviéramos que determinar el número de cuadrados latinos de un orden
n cualquiera, podrı́amos razonar de la siguiente forma: supongamos un cuadrado latino de
orden n inicialmente vacı́o. El primer elemento del cuadrado latino puede ser cualquiera
de los n elementos del alfabeto, el segundo puede ser cualquiera de los n − 1 elementos
restantes,... y ası́ sucesivamente hasta completar la primera fila del cuadrado latino. Por lo
tanto, para la primera fila tenemos n! posibilidades.
La primera estimación que podemos hacer sobre el número de cuadrados latinos de orden
n es la siguiente: si para rellenar la primera fila tenemos n! posibilidades, para rellenar las
n filas del cuadrado latino tendremos (n!)n posibilidades.
Evidentemente, no todas las filas del cuadrado latino tienen n! posibles maneras de ser
completadas, ya que a medida que vamos rellenando las filas superiores vamos eliminando
posibilidades en las filas inferiores. Sin embargo, esta aproximación, que a primera vista
puede parecer exagerada, pronto veremos que no está tan mal encaminada, lo que demuestra
por otro lado cómo el número de cuadrados latinos crece muy rápidamente con el orden.
La primera mejora que podemos aplicar al razonamiento anterior es la de intentar determinar cuántas posibilidades podemos descartar al rellenar la segunda fila. Cada elemento
de la segunda fila está condicionado por el elemento de la primera fila que tiene encima.
Debido a esto, de las n! posibles maneras de rellenar la segunda fila hay que descartar
aquellas en las que alguno de los elementos está en la misma posición que en la primera
fila. Veamos cómo podemos contar estos casos.
En general, sabemos que el número de permutaciones de n elementos con k de ellos
fijos es (n − k)!. Como hay (nk ) maneras de fijar k elementos entre n, habrá (nk )(n − k)!
permutaciones de n elementos con k de ellos fijos.
Por lo tanto, podemos razonar de la siguiente manera:
Al número de permutaciones de n elementos le restamos el número de permutaciones
con un elemento fijo.
Al hacer esto, hemos restado dos veces aquellas permutaciones con dos elementos
fijos, por lo que tenemos que sumarlas de nuevo una vez.
Al restar las permutaciones con un elemento fijo, hemos restado por triplicado las
permutaciones con tres elementos fijos, pero las hemos vuelto a sumar en las permutaciones de 2 elementos fijos, por lo que tenemos que restarlas de nuevo una vez.
Y ası́ sucesivamente hasta llegar a las permutaciones con n elementos fijos.
13
Al final de este proceso, obtendremos la fórmula siguiente:
D(n) = n! − n(n − 1)! +
n
2
(n − 2)! −
n
3
(n − 3)! + . . . + (−1)n
(1.16)
Esta expresión recibe el nombre de fórmula de los desarreglos de n elementos, de aquı́ el
hecho de denotarla D(n). Podemos escribirla de forma más compacta como:
D(n) =
n
(−1)i
i=0
n
i
(n − i)!
(1.17)
Si sacamos n! factor común en esta última expresión, obtenemos la siguiente fórmula:
1
1
1
(−1)n
D(n) = n! 1 − + − + . . . +
1! 2! 3!
n!
= n!
n
(−1)i
i=0
(1.18)
i!
n
tiende a
Este resultado es importante ya que la sucesión 1 − 1!1 + 2!1 − 3!1 + . . . + (−1)
n!
1
cuando n → ∞, por lo que el número de desarreglos de n elementos puede aproximarse
e
por n!e cuando n es lo suficientemente grande. Es decir, a partir de un cierto valor de n,
D(n) ≈
n!
e
(1.19)
Como todas las filas del cuadrado latino tienen que ser compatibles con la primera, el
número de cuadrados latinos no puede ser superior a la cota siguiente:
N (n) <
(n!)n
en−1
(1.20)
Además, la última fila del cuadrado latino está determinada por las otras n − 1, por lo
que podemos acotar aún más el número de cuadrados latinos:
N (n) <
(n!)n−1
en−2
(1.21)
Como puede intuirse, este resultado no es muy bueno a la hora de acotar el número de
cuadrados latinos de un orden dado, ya que sólo tiene en cuenta las incompatibilidades de
cada fila con la primera. Una cuenta más exacta, como la que puede consultarse en [9], nos
lleva al siguiente resultado, que proporciona una cota superior y una cota inferior para el
número de cuadrados latinos de orden n:
n
n!2n
≤
N
(n)
≤
k!n/k
nn2
k=1
1.4.3.
(1.22)
Estimación para órdenes intermedios
Hasta ahora hemos visto que el número de cuadrados latinos se conoce de forma exacta
para n < 11, y para órdenes suficientemente grandes podemos utilizar las fórmulas asintóticas del apartado anterior. Sin embargo, para órdenes intermedios, el uso de las fórmulas
asintóticas no es recomendable. Por esta razón se ha considerado oportuno desarrollar una
fórmula aproximada para calcular el número de cuadrados latinos de órdenes no muy grandes. El resultado es una fórmula sencilla calibrada a partir de los valores conocidos de N (n)
que se deduce del siguiente razonamiento:
14
Consideremos un cuadrado latino de orden n.
Cada fila del cuadrado latino tiene, a lo sumo, n! maneras de ser rellenada.
La fila i está condicionada por las i − 1 filas anteriores.
Supongamos que de las n filas del cuadrado latino, n1 son totalmente independientes
y n2 totalmente dependientes.
A la proporción n1 /n la llamamos α.
Entonces, el número de cuadrados latinos de orden n será el siguiente: N (n) = (n!)αn
Para las aproximaciones conocidas de N (n) tenemos los siguientes valores de α:
n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
N (n)
1
2
12
576
1,613 × 105
8,129 × 108
6,148 × 1013
1,088 × 1020
5,525 × 1027
9,982 × 1036
7,764 × 1047
3,097 × 1060
7,487 × 1074
1,265 × 1091
1,71 × 10109
α
−
0,5
0,46228
0,5
0,50093
0,51972
0,53203
0,54382
0,55443
0,56403
0,57276
0,58073
0,58805
0,59479
0,60102
Cuadro 1.6: Número de cuadrados latinos y valor de α en función del orden.
Estos valores responden bastante bien a un ajuste logarı́tmico:
0,62
D = 0,0903·Ln(n) + 0,3564
2
R = 0,9997
0,6
0,58
0,56
0,54
0,52
0,5
0,48
4
6
8
10
12
Figura 1.4: Evolución del valor de α.
15
14
16
Por lo tanto, el número de cuadrados latinos de orden n puede estimarse como
N (n) ≈ (n!)αn
(1.23)
donde α = 0,0903 · ln(n) + 0,3564. Esta fórmula se ha comparado con las cotas descritas
en el apartado anterior y ha resultado ser válida para cuadrados latinos de orden n ≤ 62.
1.5.
Generación de cuadrados latinos
En la sección anterior hemos visto que para calcular el número exacto de cuadrados
latinos de un orden dado es necesario poder generarlos. En esta sección explicaremos algunos
de los métodos para generar cuadrados latinos.
1.5.1.
Generación secuencial de cuadrados latinos
La manera más simple de generar cuadrados latinos consiste en hacerlo secuencialmente,
es decir, empezar por el primero e ir generando ordenadamente los siguientes hasta llegar
al último. Para ello, podemos utilizar el siguiente algoritmo:
1) Tomamos un cuadrado latino vacı́o.
2) En cada casilla colocamos el primer sı́mbolo del alfabeto que no es incompatible con
los que ya han sido colocados.
3) Si en alguna casilla no es posible insertar ningún sı́mbolo, dejamos esa casilla vacı́a
y sustituimos el sı́mbolo de la casilla anterior por el siguiente elemento del alfabeto
que sı́ es posible colocar.
4) Al llegar a la última casilla, habremos obtenido un cuadrado latino.
5) Si queremos obtener el siguiente, tenemos que sustituir el último sı́mbolo colocado
por el siguiente elemento del alfabeto y repetir el proceso anterior. De esta manera
nos aseguramos que los cuadrados latinos son generados secuencialmente.
1.5.2.
Generación aleatoria de cuadrados latinos
Otra manera de construir cuadrados latinos de cualquier orden es la generación aleatoria
de cuadrados latinos. Veamos en qué consiste este proceso.
Consideremos un cuadrado latino de orden n. Si a este cuadrado latino le aplicamos
un pequeño cambio, obtendremos un cuadrado latino muy similar al anterior. Si en vez
de un pequeño cambio le aplicamos una sucesión de pequeños cambios, el cuadrado latino
resultante será cada vez menos parecido al original.
Se puede demostrar que si la sucesión de pequeños cambios es lo suficientemente larga se puede recorrer el espacio de los cuadrados latinos de orden n, lo que significa que
cualquier cuadrado latino puede ser obtenido a partir de cualquier otro. Además, si los pequeños cambios se realizan de forma aleatoria, todos los cuadrados latinos tienen la misma
probabilidad de ser generados.
El secreto de todo este proceso yace en cómo se realizan estos pequeños cambios. Jacobson y Matthews proponen en [6] un algoritmo que permite asegurar que los cuadrados
16
latinos obtenidos siguen una distribución uniforme. En el Capı́tulo 3 dedicado a los algoritmos se presenta una variante de este método adaptada por el autor de esta tesina para
la generación aleatoria de cuadrados latinos mediante un ordenador.
A continuación se expone, mediante un ejemplo, el método desarrollado por Jacobson
y Matthews para generar cuadrados latinos de forma aleatoria:
1) Tomamos un cuadrado latino de orden n y lo llamamos L0 para denotar que se trata
del cuadrado latino inicial. Una manera fácil de obtener un cuadrado latino de orden
n es tomar la sucesión {1, 2, 3, . . . , n} y aplicarle una permutación cı́clica a cada fila.
⎡
⎢
⎢
⎢
L0 = ⎢
⎢
⎢
⎣
1
2
3
4
5
2
3
4
5
1
3
4
5
1
2
4
5
1
2
3
5
1
2
3
4
⎤
⎥
⎥
⎥
⎥
⎥
⎥
⎦
2) Escogemos al azar una fila r0 y una columna c0 . Al sı́mbolo que se encuentra en la
posición (r0 , c0 ) le llamamos s0 . Escogemos también al azar un sı́mbolo p0 . El pequeño
cambio que aplicaremos al cuadrado latino L0 consistirá en sustituir el elemento s0
por el sı́mbolo p0 . Para nuestro ejemplo, consideremos r0 = 1, c0 = 4, s0 = 4 y p0 = 5.
⎡
⎢
⎢
⎢
L0 = ⎢
⎢
⎢
⎣
1
2
3
4
5
2
3
4
5
1
3
4
5
1
2
4
5
1
2
3
5
1
2
3
4
⎤
⎥
⎥
⎥
⎥
⎥
⎥
⎦
3) Suponiendo que p0 = s0 , localizamos las ocurrencias del sı́mbolo p0 en la fila r0 y en
la columna c0 y las llamamos r1 y c1 . También localizamos el elemento presente en la
posición (r1 , c1 ) y lo llamamos s1 . En el caso de nuestro ejemplo tenemos que r1 = 2,
c1 = 5 y s1 = 1.
⎡
⎤
1 2 3 4 5
⎢
⎥
⎢ 2 3 4 5 1 ⎥
⎢
⎥
⎥
L0 = ⎢
⎢ 3 4 5 1 2 ⎥
⎢
⎥
⎣ 4 5 1 2 3 ⎦
5 1 2 3 4
4) Usando la aritmética simbólica, sumamos la diferencia p0 − s0 a las celdas (r0 , c0 )
y (r1 , c1 ) y la restamos a las celdas (r0 , c1 ) y (r1 , c0 ). Siguiendo nuestro ejemplo,
obtenemos lo siguiente:
⎡
⎢
⎢
⎢
L̂1 = ⎢
⎢
⎢
⎣
1
2
3
4
5
2
3
4
5
1
3 4 + (5 − 4) 5 − (5 − 4)
4 5 − (5 − 4) 1 + (5 − 4)
5
1
2
1
2
3
2
3
4
⎤
⎡
⎥
⎢
⎥
⎢
⎥
⎢
⎥=⎢
⎥
⎢
⎥
⎢
⎦
⎣
1
2
3
4
5
2
3
4
5
1
3
4
5
1
2
5
4
4 1+5−4
1
2
2
3
3
4
⎤
⎥
⎥
⎥
⎥
⎥
⎥
⎦
Nótese que en aritmética simbólica sólo se cancelan los sı́mbolos iguales con signos
opuestos, como es el caso de +4 y −4 o +5 y −5.
17
5) Al cuadrado latino resultante le llamamos L̂1 para indicar que se trata de un cuadrado
latino impropio, es decir, un cuadrado latino con un elemento negativo. Al elemento
negativo le llamaremos elemento impropio, mientras que a la fila y a la columna
que contienen el elemento impropio las llamaremos respectivamente fila impropia y
columna impropia.
6) Nuestro objetivo consiste ahora en obtener un cuadrado latino propio a partir del
cuadrado latino impropio L̂1 . Para ello, seleccionamos al azar una de las dos ocurrencias del sı́mbolo impropio en la fila r1 y en la columna c1 y las llamamos r2 y c2 . Al
sı́mbolo impropio le llamamos s2 . Seleccionamos también al azar uno de los sı́mbolos
p0 y s1 y le llamamos p2 . Para nuestro ejemplo, sean r2 = 5, c2 = 3, s2 = 4 y p2 = 5.
⎡
⎢
⎢
⎢
L̂1 = ⎢
⎢
⎢
⎣
1
2
3
4
5
2
3
4
5
1
3
4
5
1
2
5
4
4 1−5+4
1
2
2
3
3
4
⎤
⎥
⎥
⎥
⎥
⎥
⎥
⎦
7) Al cuadrado latino L̂1 le aplicamos el pequeño cambio siguiente: restamos la diferencia
simbólica (p2 − s2 ) a las celdas (r1 , c1 ) y (r2 , c2 ) y la sumamos a las celdas (r1 , c2 ) y
(r2 , c1 ).
⎡
⎢
⎢
⎢
L̂2 = ⎢
⎢
⎢
⎣
1
2
3
4
5
2
3
3 4 + (5 − 4)
4
5
5
1
1 2 − (5 − 4)
5
4
4 1 + 5 − 4 − (5 − 4)
1
2
2
3
3
4 + (5 − 4)
⎤
⎡
⎥
⎢
⎥
⎢
⎥
⎢
⎥=⎢
⎥
⎢
⎥
⎢
⎦
⎣
1
2
3
4
5
2
3
3
5
4
5
5
1
1 2−5+4
5
4
1
2
3
4
1
2
3
5
⎤
⎥
⎥
⎥
⎥
⎥
⎥
⎦
8) Llegados a este punto pueden pasar dos cosas: o bien el cuadrado latino obtenido es
un cuadrado latino propio, o bien es impropio. En caso de que sea propio, podemos
dar por acabado el proceso. Si es impropio, como en el caso de nuestro ejemplo,
tenemos que seguir aplicando pequeños cambios hasta que eventualmente obtengamos
un cuadrado latino propio.
9) Por ejemplo, partiendo del cuadrado latino L̂2 , es fácil ver que un pequeño cambio
más nos lleva hasta un cuadrado latino propio. Tomemos r3 = 2, c3 = 1, s3 = 2 y
p3 = 5. Si sumamos la diferencia simbólica (p3 − s3 ) a las celdas (r1 , c1 ) y (r2 , c2 ) y la
restamos a las celdas (r1 , c2 ) y (r2 , c1 ), obtenemos el siguiente cuadrado latino propio.
⎡
⎢
⎢
⎢
L3 = ⎢
⎢
⎢
⎣
1
2 + (5 − 2)
3
4
5 − (5 − 2)
2
3
3
5 − (5 − 2)
4
5
5
1
1 2 − 5 + 4 + (5 − 2)
5
4
1
2
3
4
1
2
3
5
⎤
⎡
⎥
⎢
⎥
⎢
⎥
⎢
⎥=⎢
⎥
⎢
⎥
⎢
⎦
⎣
1
5
3
4
2
2
3
4
5
1
3
2
5
1
4
5
4
1
2
3
4
1
2
3
5
⎤
⎥
⎥
⎥
⎥
⎥
⎥
⎦
Además de haber obtenido un nuevo cuadrado latino a partir del cuadrado latino de
base, hemos roto el carácter cı́clico de las filas de L0 , lo cual es una prueba del buen
“poder de mezclado” que posee este método. La demostración de que este método conecta
efectivamente todo el espacio de los cuadrados latinos de orden n mediante los pequeños
movimientos descritos puede consultarse en [6].
18
1.5.3.
Composición de cuadrados latinos
La composición de cuadrados latinos es una herramienta útil para generar cuadrados
latinos partiendo de otros de órdenes inferiores.
Definición 1.21 Dados dos cuadrados latinos L1 y L2 de órdenes n1 y n2 respectivamente,
se define el cuadrado latino composición de L1 con L2 , y se escribe L1 ◦L2 , como el cuadrado
latino obtenido mediante el siguiente procedimiento:
1) Se toma una matriz (n1 · n2 ) × (n1 · n2 ).
2) Cada elemento lij del nuevo cuadrado latino se construye yuxtaponiendo el elemento
(l1 )i1 j1 con el elemento (l2 )i2 j2 , siendo i1 = i/n1 , j1 = j/n1 , i2 = i/n2 y j2 = j/n2 .
Por ejemplo, consideremos los cuadrados latinos siguientes:
⎡
⎤
1 2 3
⎢
L1 = ⎣ 2 3 1 ⎥
⎦
3 1 2
L2 =
1 2
2 1
El cuadrado latino L1 ◦ L2 será, según la regla de la composición, el siguiente:
⎡
⎢
⎢
⎢
⎢
L1 ◦ L2 = ⎢
⎢
⎢
⎢
⎣
11
12
21
22
31
32
12
11
22
21
32
31
21
22
31
32
11
12
22
21
32
31
12
11
31
32
11
12
21
22
32
31
12
11
22
21
⎤
⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎦
También podemos cambiar de alfabeto, si nos resulta más cómodo:
f : [3] ◦ [2]
11
12
21
22
31
32
−→ [6]
−→ 1
−→ 2
−→ 3
−→ 4
−→ 5
−→ 6
⎡
⎢
⎢
⎢
⎢
L1 ◦ L2 = ⎢
⎢
⎢
⎢
⎣
1
2
3
4
5
6
2
1
4
3
6
5
3
4
5
6
1
2
4
3
6
5
2
1
5
6
1
2
3
4
6
5
2
1
4
3
⎤
⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎦
Como podemos observar, los elementos de L1 determinan el prefijo de cada elemento
compuesto, mientras que los elementos de L2 determinan el sufijo. Por lo tanto L1 ◦L2 es un
cuadrado latino, ya que dados dos elementos de una misma fila o columna, o tienen diferente
prefijo por pertenecer a submatrices diferentes, o tienen diferente sufijo por pertenecer a
la misma submatriz. Además, si los cuadrados latinos L1 y L2 están normalizados, los
cuadrados latinos L1 ◦ L2 y L2 ◦ L1 estarán también normalizados.
La composición de cuadrados latinos presenta algunas limitaciones:
No es posible obtener cuadrados latinos cuyo orden sea un número primo.
No es posible obtener todos los cuadrados latinos de un orden dado mediante composición de cuadrados latinos de órdenes inferiores.
19
La composición de cuadrados latinos no es conmutativa, como demuestra el siguiente
ejemplo:
⎡
⎢
⎢
⎢
⎢
L2 ◦ L 1 = ⎢
⎢
⎢
⎢
⎣
1.6.
11
12
13
21
22
23
12
13
11
22
23
21
13
11
12
23
21
22
21
22
23
11
12
13
22
23
21
12
13
11
23
21
22
13
11
12
⎤
⎡
⎥
⎢
⎥
⎢
⎥
⎢
⎥
⎢
⎥=⎢
⎥
⎢
⎥
⎢
⎥
⎢
⎦
⎣
1
2
3
4
5
6
2
3
1
5
6
4
3
1
2
6
4
5
4
5
6
1
2
3
5
6
4
2
3
1
6
4
5
3
1
2
⎤
⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎦
Aplicaciones de los cuadrados latinos
Generar y enumerar cuadrados latinos a menudo se ha considerado un pasatiempo sin
ninguna aplicación práctica. Por ese motivo, el estudio de los cuadrados latinos casi siempre
se ha realizado desde el punto de vista de curiosidades matemáticas. Sin embargo, suele
pasar en el mundo de las matemáticas que un campo teórico al que no se le conocen
aplicaciones prácticas de repente se le encuentra una utilidad y se convierte en un campo
de gran interés para la comunidad cientı́fica. Los cuadrados latinos no son una excepción.
En los últimos años, el auge de las tecnologı́as de la información ha impulsado el desarrollo de una ciencia que que hasta el momento habı́a estado limitada a finalidades militares
o gubernamentales: la criptologı́a. La criptologı́a es la ciencia que estudia el cifrado de la
información. Se divide en dos ramas: la criptografı́a, que estudia la creación de códigos
secretos, y el criptoanálisis, cuyo objetivo es descifrar dichos códigos.
La estrecha relación que guardan los cuadrados latinos con los cuasigrupos los hacen
candidatos ideales para ser utilizados en sistemas criptográficos. Este hecho ha despertado
un nuevo interés por el estudio de los cuadrados latinos. Prueba de ello son los numerosos
artı́culos aparecidos recientemente en publicaciones matemáticas y computacionales (véanse
las referencias [7] y [8]).
1.6.1.
Diseño de experimentos
Además de sus aplicaciones criptográficas, los cuadrados latinos tienen un papel importante en la teorı́a estadı́stica de diseño de experimentos. Para ilustrar dicha importancia, a
continuación se presentan dos ejemplos donde la utilización de cuadrados latinos permite
reducir los errores de tipo experimental.
Ejemplo 1
Supongamos que queremos estudiar la efectividad de 5 fertilizantes distintos sobre un
cultivo de cereal. Podrı́amos diseñar un experimento que consistiera en lo siguiente:
1)
2)
3)
4)
Aplicar el fertilizante.
Esperar a que el cereal madure.
Cosechar el cereal.
Medir la producción por unidad de área.
20
Además, para que los resultados sean comparables entre ellos, es necesario que los
fertilizantes se prueben simultáneamente en una misma parcela de tierra. De esta manera
se reduce el error debido a posibles variaciones en las condiciones meteorológicas.
Sin embargo, incluso imponiendo esta condición, puede aparecer un error en el experimento debido a diferencias en la composición del suelo. Este error puede minimizarse
mediante la siguiente técnica: se divide la parcela en una cuadrı́cula 5 × 5 y se aplican
los fertilizantes según la estructura de un cuadrado latino de orden 5. De esta manera, los
factores que puedan modificar el rendimiento del fertilizante afectarán por igual a las 5
muestras, por lo que los resultados seán comparables entre ellos.
Ejemplo 2
Supongamos que queremos estudiar el poder de combustión de 5 fórmulas de combustible para cohetes. Cada fórmula se consigue mezclando una serie de componentes que
vienen por lotes y cuya composición puede variar. Además, las fórmulas son preparadas
por diferentes operarios que pueden tener diferente habilidad y experiencia. Por lo tanto,
el experimento está sometido a dos fuentes de error sistemático, presumiblemente independientes, que son los lotes y los operarios. Para compensar estos errores sistemáticos puede
utilizarse un diseño de cuadrado latino como el siguiente:
1)
2)
3)
4)
Se escogen 5 lotes al azar y se numeran I, II, III, IV y V.
Se escogen 5 operarios al azar y se numeran 1, 2, 3, 4 y 5.
Las 5 fórmulas se etiquetan A, B, C, D y E.
Cada operario prepara una fórmula con cada lote siguiendo el esquema del cuadrado
latino siguiente:
I
II
III
IV
V
1
2
3
4
5
A (24) B (20) C (19) D (24) E (24)
B (17) C (24) D (30) E (27) A (36)
C (18) D (38) E (26) A (27) B (21)
D (26) E (31) A (26) B (23) C (22)
E (22) A (30) B (20) C (29) D (31)
Los números entre paréntesis son los resultados obtenidos en el test de combustión de
cada muestra. El análisis de los datos obtenidos se realiza mediante los pasos siguientes:
1) Estandarización. A cada observación le restamos la
nes, es decir, 25,4:
⎡
−1,4 −5,4 −6,4 −1,4
⎢
⎢ −8,4 −1,4
4,6
1,6
⎢
⎢
0,6
1,6
N = ⎢ −7,4 12,6
⎢
0,6
5,6
0,6
−2,4
⎣
−3,4
4,6 −5,4
3,6
media de todas las observacio−1,4
10,6
−4,4
−3,4
5,6
⎤
⎥
⎥
⎥
⎥
⎥
⎥
⎦
2) Separación de señales. Escribimos las observaciones como suma de 4 matrices:
21
• Efecto del lote: es la matriz de medias según el lote (por fila):
⎡
⎢
⎢
⎢
µl = ⎢
⎢
⎢
⎣
⎤
−3,2 −3,2 −3,2 −3,2 −3,2
⎥
1,4
1,4
1,4
1,4
1,4 ⎥
⎥
0,6
0,6
0,6
0,6
0,6 ⎥
⎥
0,2
0,2
0,2
0,2
0,2 ⎥
⎦
1,0
1,0
1,0
1,0
1,0
• Efecto del operario: es la matriz de medias según el operario (por columna):
⎡
⎢
⎢
⎢
µo = ⎢
⎢
⎢
⎣
−4,0
−4,0
−4,0
−4,0
−4,0
−1,2
−1,2
−1,2
−1,2
−1,2
3,2
3,2
3,2
3,2
3,2
0,6
0,6
0,6
0,6
0,6
1,4
1,4
1,4
1,4
1,4
⎤
⎥
⎥
⎥
⎥
⎥
⎥
⎦
• Efecto de la fórmula: es la matriz de medias según la fórmula (por diagonal):
⎡
⎢
⎢
⎢
µf = ⎢
⎢
⎢
⎣
⎤
3,2 −5,2 −3,0
4,4
0,6
⎥
−5,2 −3,0
4,4
0,6
3,2 ⎥
⎥
−3,0
4,4
0,6
3,2 −5,2 ⎥
⎥
4,4
0,6
3,2 −5,2 −3,0 ⎥
⎦
0,6
3,2 −5,2 −3,0
4,4
• Error no sistemático: es la diferencia entre los valores observados y la suma de
los efectos medios (E = N − µl − µo − µf ):
⎡
⎢
⎢
⎢
E=⎢
⎢
⎢
⎣
⎤
2,6 −0,2
1,0 −3,2 −0,2
⎥
−0,6 −3,0
0,0 −1,0
4,6 ⎥
⎥
−1,0
4,4
0,6 −2,8 −1,2 ⎥
⎥
0,0
1,6 −1,6
2,0 −2,0 ⎥
⎦
−1,0 −2,8
0,0
5,0 −1,2
3) Hipótesis nula. Los valores E representan las diferencias entre las 5 fórmulas. Los
valores de E son los errores que no pueden ser atribuidos ni al lote ni al operario. La
significación del experimento depende de la relación entre µf y E. Supondremos que
no existe efecto debido a la fórmula (hipótesis nula) y estimaremos la probabilidad
de que E sea observado.
4) Análisis de la varianza. Para aceptar o rechazar la hipótesis nula es necesario
realizar un análisis de la varianza. En nuestro caso, esto se consigue a través de la
tabla ANOVA:
GL
S = x2 σ 2 = S/GL F = S/σ 2
P
µl
n−1
68
17
1,593
23,91 %
µo
n−1
150
37,5
3,516
4,04 %
µf
n−1
330
82,5
7,734
0,25 %
E
(n − 1)(n − 2)
10,67
2
T otal
n −1
ST
22
La probabilidad P se calcula a través de la función F de Fisher con grados de libertad
4 y 12. Al tratar con datos experimentales, la hipótesis nula suele aceptarse a partir de una
significación del 5 %, aunque cuanto más alta sea la misma, más seguros podemos estar de
que se cumpla la hipótesis.
Viendo los resultados de la tabla ANOVA, podemos llegar a las siguientes conclusiones:
El lote, con una significación del 23,91 %, no tiene efecto sobre el poder de combustión
de las muestras.
La fórmula, con una significación del 0,25 %, sı́ tiene efecto sobre el rendimiento del
combustible.
El operario, con una significación del 4,04 %, no está claro si influye o no en el experimento.
23
Capı́tulo 2
Grafos de Moore
Este segundo capı́tulo está dedicado al estudio de los grafos de Moore. El capı́tulo en
sı́ podrı́a dividirse en dos partes. En la primera se repasan algunas definiciones básicas, se
introduce el problema (∆, D) y se presentan las herramientas matriciales necesarias para
el estudio de los grafos de Moore.
En la segunda parte se expone de forma detallada la construcción de los grafos de Moore
de grados 3 y 7. Finalmente, se ataca el problema de El Gran Grafo de Moore mediante
una aplicación informática desarrollada especı́ficamente para esta tesina. Dicha aplicación
ha permitido realizar un avance importante en lo que refiere a la caracterización de los
grafos de Moore. Entre estos resultados destaca la aparición de cuadrados latinos en la
construcción de grafos de Moore, hecho que permitirá aprovechar los resultados del primer
capı́tulo.
2.1.
Definiciones previas
Definición 2.1 Un grafo G consiste en un conjunto finito V , cuyos elementos se llaman
veŕtices, y un conjunto también finito E de pares de elementos de V , cuyos elementos
reciben el nombre de ramas.
Habitualmente escribimos G = (V, E) y decimos que V = V (G) es el conjunto de
vértices y E = E(G) el conjunto de ramas.
Los vértices de un grafo suelen representarse a través de puntos y las ramas a través de
lı́neas que unen dichos puntos. Por ejemplo, el siguiente grafo tiene 4 vértices y 6 ramas:
1
2
3
4
Figura 2.1: El grafo 4-completo, o K4 .
Este grafo en particular recibe el nombre de 4-completo ya que tiene 4 vértices y cada
uno de ellos está conectado con todos los demás.
24
Definición 2.2 Un grafo dirigido o digrafo es un grafo en el que el conjunto E está formado por pares ordenados de elementos de V . En este caso, los elementos de E reciben el
nombre de arcos.
En los digrafos, la dirección de los arcos se indica mediante una flecha. Recuperando el
ejemplo anterior, el siguiente digrafo tiene 4 vértices y 6 arcos:
1
2
3
4
Figura 2.2: Ejemplo de digrafo.
Definición 2.3 Un autolazo es una rama que va de un vértice a sı́ mismo. Dos ramas son
paralelas sii tienen los mismos vértices en los extremos. Un grafo con autolazos y/o ramas
paralelas se llama multigrafo. En caso contrario se habla de grafo simple.
De ahora en adelante sólo consideraremos grafos simples, es decir, grafos no dirigidos
sin autolazos ni ramas paralelas.
Definición 2.4 Dado un grafo G, se define su orden n como el número de vértices que
tiene, es decir, el cardinal de V .
Definición 2.5 Dados dos vértices x e y, se dice que son adyacentes sii (x, y) es una
rama.
Definición 2.6 Dado un vértice x, se define su grado δ(x) como el número de ramas
incidentes en él. El grado máximo de un grafo G es el máximo de de los grados de sus
vértices y se denota ∆. El grado mı́nimo de un grafo G es el mı́nimo de de los grados de
sus vértices y se denota δ. Si ∆ = δ, se dice que el grafo G es ∆-regular.
Definición 2.7 Dados dos vértices x e y cualesquiera, se define un recorrido de x a y
como una sucesión de vértices x, x1 , x2 , . . . , xk , y tal que (x, x1 ), (xi , xi+1 ) 1 ≤ i ≤ k − 1, y
(xk , y) son ramas de G. Si todos los vértices del recorrido son distintos, el recorrido recibe
el nombre de camino.
Definición 2.8 Un grafo es conexo si para cada par de vértices x e y existe un camino
que va de x a y.
Definición 2.9 Dado un recorrido de x a y, se define su longitud como el número de ramas.
El recorrido de longitud mı́nima entre x e y se llama camino más corto. El diámetro de
un grafo G se define como la longitud del más largo de los caminos más cortos y se denota
por D.
Dicho de otra forma, el diámetro es la longitud máxima entre dos vértices cualesquiera
de G.
25
Definición 2.10 Dado un vértice x, se llama ciclo a cualquier camino de x a x y ciclo
mı́nimo al camino más corto de x a x. El girth (“cintura”) de un grafo G se define como
la longitud del más corto de los ciclos mı́nimos y se denota por g.
Definición 2.11 Un árbol es un grafo conexo que no contiene ciclos.
Por ejemplo, el siguiente grafo es un árbol:
Figura 2.3: Ejemplo de árbol.
Las siguientes proposiciones se deducen fácilmente a partir de la definición anterior:
1) Un grafo es un árbol sii el número de ramas es el número de vértices menos uno.
2) Un grafo es un árbol sii hay solamente un camino que una dos vértices cualesquiera.
3) Un grafo es un árbol sii es extremal respecto al número de ramas (es decir, si al añadir
una rama se cierra forzosamente un ciclo).
2.2.
Modelización matricial de grafos
Dada la estructura discreta de los grafos, parece natural pensar que su tratamiento
mediante un ordenador pueda hacerse de forma eficaz. De hecho, ası́ es. Sin embargo, es
necesario poder extraer la información que contiene el grafo y almacenarla de forma que
pueda ser interpretada por un ordenador. Es ası́ como surge el concepto de la matriz de
adyacencia.
Definición 2.12 Dado un grafo G de orden n, se define la matriz de adyacencia asociada
a dicho grafo como la matriz binaria (n × n) en la que cada elemento (i, j) contiene un 1
si el vértice i está unido al vértice j por una rama, o un 0 en caso contrario.
Por ejemplo, dado el grafo siguiente, su matriz de adyacencia se escribe como sigue:
1
2
1
2
3
4
5
6
3
5
6
1
0
1
0
0
0
0
2
1
0
1
0
0
1
3
0
1
0
1
1
1
4
0
0
1
0
0
0
5
0
0
1
0
0
1
6
0
1
1
0
1
0
4
Figura 2.4: Grafo de 6 vértices y matriz de adyacencia asociada.
26
Es fácil ver que la matriz de adyacencia de un grafo simple cumple las siguientes condiciones:
1) Es simétrica (si el vértice i es adyacente al j, entonces el vértice j es adyacente al i).
2) Los elementos de la diagonal son cero (un vértice no puede ser adyacente a sı́ mismo).
La definición de la matriz de adyacencia puede extenderse fácilmente a órdenes superiores de la siguiente manera:
Definición 2.13 Dado un grafo G de orden n, se define la matriz de adyacencia de orden
ν asociada a dicho grafo como la matriz (n × n) en la que cada elemento (i, j) contiene el
número de recorridos de longitud ν que unen los vértices i y j del grafo.
Recuperando el grafo del ejemplo anterior, he aquı́ su matriz de adyacencia de orden 2:
1
2
3
4
5
6
1
1
0
1
0
0
1
2
0
3
1
1
2
1
3
1
1
4
0
1
2
4
0
1
0
1
1
1
5
0
2
1
1
2
1
6
1
1
2
1
1
3
Nótese que en este caso los elementos de la diagonal no son cero. Esto es debido a que
se cuentan los recorridos del tipo i → j → i (“ida y vuelta”). Es más, los elementos de
la diagonal de la matriz de adyacencia de orden 2 indican precisamente el grado de cada
vértice.
Proposición 2.14 Sea A la matriz de adyacencia de orden 1 asociada a un grafo G.
Entonces, la matriz de adyacencia de orden ν asociada al mismo grafo es Aν .
Demostración. Para demostrar este resultado recurriremos a la inducción sobre ν.
Para ν = 1, A1ij = 1 si el vértice i es adyacente al vértice j, y 0 en caso contrario.
Para ν = 2, A2ij = nk=1 aik akj . Sabemos que el producto aik akj vale 1 si i es adyacente
a k y k es adyacente a j, y 0 en caso contrario. Por lo tanto, si aik akj = 0, entonces los
vértices i y j están unidos por un recorrido de longitud 2, por lo que A2ij representa
el número de recorridos de longitud 2 entre los vértices i y j.
Supongamos que para todo h < ν, Ahij es el número de recorridos de longitud h que
ν−1
= 0 si i es
unen los vértices i y j. Sabemos que Aνij = nk=1 aik aν−1
kj , dónde aik akj
adyacente a k y k está unido con j por un recorrido de longitud ν − 1. Por lo tanto, si
Aνij = 0, entonces i está unido con j por un recorrido de longitud ν, y Aνij representa
el número de recorridos de longitud ν entre los vértices i y j.
Corolario 2.15 Sean Ar y As las matrices de adyacencia de orden r y s de un grafo G.
Entonces, la matriz de adyacencia Ar + As contiene el número de recorridos de longitud r
o longitud s, mientras que la matriz Ar · As contiene el número de recorridos de longitud
r + s.
27
2.3.
El problema (∆, D)
Una cuestión de especial interés en la teorı́a de grafos es el llamado problema (∆, D).
Este problema consiste en encontrar grafos con el mayor número posible de vértices para
un grado máximo ∆ y un diámetro D dados. El problema (∆, D) es de gran importancia
debido a sus implicaciones en el diseño de topologı́as de redes de interconexión y otras
cuestiones como problemas de alineación de datos y algoritmos criptográficos.
Junto al problema (∆, D) encontramos el problema (δ, g), que trata de encontrar grafos
con el menor número posible de vértices para un grado mı́nimo δ y un girth g dados. Los
grafos que cumplen esta condición reciben el nombre de cages (“jaulas”).
Los problemas (∆, D) y (δ, g) pertenecen a la teorı́a extremal de grafos y están ı́ntimamente relacionados. Es más, los problemas más interesantes en teorı́a extremal de grafos
son aquellos que combinan ambos problemas (∆, D) y (δ, g). Por ejemplo, cuando g = 2D,
el problema (∆, D) consiste en la búsqueda de los llamados polı́gonos generalizados. Se sabe
que los polı́gonos generalizados existen sólo para valores del girth g iguales a 4, 6, 8 y 12,
y se han construido algunos de ellos, concretamente para valores del grado ∆ iguales a la
potencia de un número primo más uno. Este problema reviste una especial dificultad y es
fuente de gran actividad en la comunidad matemática internacional.
Cuando g = 2D + 1, el problema (∆, D) consiste en la búsqueda de los llamados grafos
de Moore. Se sabe que los grafos de Moore sólo pueden existir para valores del grado ∆
iguales a 3, 7 y 57. Los dos primeros casos son conocidos y reciben los nombres de grafo de
Petersen y grafo de Hoffman-Singleton, mientras que el caso ∆ = 57 sigue sin resolverse.
El estudio de los grafos de Moore será el objetivo central de esta tesina.
2.3.1.
Grafos de Moore
Definición 2.16 Se dice que un grafo G de grado máximo ∆ y diámetro D es un grafo
denso si G tiene el mayor número posible de vértices.
Definición 2.17 Para un grado máximo ∆ y un diámetro D dados, se define la cota de
Moore como el siguiente valor:
m=1+∆
D
i=1
i−1
(∆ − 1)
⎧
⎪
⎨ 2D + 1
=⎪
⎩ ∆(∆−1)D −2
∆−2
si ∆ = 2
si ∆ ≥ 3
(2.1)
Proposición 2.18 Sea G un grafo de grado máximo ∆ y diámetro D. Entonces el número
de vértices de G está acotado por la cota de Moore, es decir, se verifica que n ≤ m.
Demostración. Asumiendo que todos los vértices de G tienen grado máximo, el número
de vértices a distancia i de un vértice cualquiera es ∆ · (∆ − 1)i−1 . Por lo tanto, el número
i−1
.
máximo de vértices que puede tener el grafo G es 1 + ∆ D
i=1 (∆ − 1)
Definición 2.19 Los grafos que alcanzan la cota de Moore reciben el nombre de grafos de
Moore.
Del razonamiento anterior se deduce que para que un grafo sea de Moore, todos sus
vértices tienen que tener grado máximo, es decir, el grafo tiene que ser ∆-regular.
28
Teorema 2.20 Si G es un grafo de Moore de grado ∆ ≥ 3, entonces tiene diámetro 2.
La demostración de este teorema no es sencilla y está fuera del alcance de esta tesina.
No obstante, puede consultarse en [2]. Una consecuencia inmediata del Teorema 2.20 es el
corolario siguiente.
Corolario 2.21 Un grafo regular de grado ∆ ≥ 3 con ∆2 + 1 vértices es un grafo de Moore
sii tiene girth 5.
Teorema 2.22 (de Hoffman y Singleton) Para ∆ ≥ 3, la cota de Moore sólo se alcanza
en grafos regulares de diámetro 2 y grado 3, 7 y posiblemente 57.
Demostración. Sea G un grafo de Moore de grado ∆. Sea A su matriz de adyacencia,
es decir, Aij = 1 si los vértices i y j son adyacentes, Aij = 0 en caso contrario. Sea B la
matriz de distancia 2, es decir, Bij = 1 si la distancia entre los vértices i y j es 2, Bij = 0
en caso contrario. Si I es la matriz identidad (matriz de distancia 0), entonces se verifica
que I + A + B = J, donde J es la matriz con todos los elementos iguales a 1.
La matriz de adyacencia es una matriz simétrica, lo que implica que diagonaliza.
Además, la matriz de adyacencia es una matriz de ceros y unos y, en particular, sus elementos de la diagonal son cero, de donde deducimos que
T r(A) =
2
1+∆
i=1
Aii = 0
(2.2)
Llegados a este punto, es necesaria la introducción de un lema para seguir con la demostración.
Lema 2.23 Sean A y B las matrices de adyacencia y de distancia 2 de un grafo de Moore,
respectivamente. Entonces se verifica:
i) A2 = ∆ · I + B
(2.3)
ii) AB = (∆ − 1)A + (∆ − 1)B
(2.4)
Demostración. i ) En virtud de la Proposición 2.14, A2ij es el número de recorridos de
longitud 2 entre los vértices i y j. Por lo tanto, si i = j, A2ii es el grado del vértice i, es
decir, ∆. Si i = j y los vértices i y j no están a distancia 2, no hay recorridos de longitud
2, por lo que A2ij = 0. Si los vértices i y j están a distancia 2, entonces el recorrido de
longitud 2 es forzosamente un camino. Además, como el grafo es de Moore, el Corolario
2.21 nos indica que el girth debe ser 5. Ası́ pues, el número de caminos de longitud 2 entre
dos vértices a distancia 2 es igual a 1, por lo que A2ij = 1. En definitiva,
A2ij
=
∆ si i = j
Bij si i = j
(2.5)
ii ) Por definición, (AB)ij = nk=1 aik bkj . El producto aik bkj será distinto de cero cuando
aik = 1 y bkj = 1, lo que significa que el vértice i es adyacente al k y el k está unido al j por
un camino de longitud 2. El valor (AB)ij vendrá determinado por el número de vértices
adyacentes a i y a distancia 2 de j.
29
Supongamos en primer lugar que el vértice i sea adyacente al j. Entonces hay ∆ − 1
vértices que son adyacentes al i pero no al j (ya que el girth es 5), por lo que hay ∆ − 1
vértices adyacentes a i y a distancia 2 de j.
Por otro lado, si el vértice i no es adyacente al j, entonces estará a distancia 2 (ya que
el diámetro es 2), por lo que habrá ∆ vértices adyacentes a i, de los cuales ∆ − 1 estarán
a distancia 2 de j (por ser el girth 5).
En definitiva, (AB)ij =
0
si i = j
∆ − 1 si i = j
, por lo que AB = (∆ − 1)(A + B).
Combinando las dos ecuaciones del Lema 2.23 podemos escribir la ecuación caracterı́stica de la matriz A:
A3 − (∆ − 1)A2 − (2∆ − 1)A + ∆(∆ − 1)I = 0
(2.6)
Como todo grafo de Moore es ∆-regular, cada fila de la matriz A contiene ∆ unos y
n − ∆ ceros. Esto implica que
⎛
⎜
⎜
A⎜
⎜
⎝
1
1
..
.
⎞
⎛
⎟
⎜
⎟
⎜
⎟=⎜
⎟
⎜
⎠
⎝
1
∆
∆
..
.
∆
⎞
⎛
⎟
⎜
⎟
⎜
⎟ = ∆⎜
⎟
⎜
⎠
⎝
1
1
..
.
⎞
⎟
⎟
⎟
⎟
⎠
(2.7)
1
De este resultado deducimos que (1, 1, . . . , 1)T es un vector propio de A de valor propio
∆. Esto significa que el espectro de la matriz A contiene el valor propio ∆ de multiplicidad
1 (puesto que el grafo es conexo), por lo que podemos reescribir la ecuación caracterı́stica
de A la siguiente manera:
(A − ∆I)(A2 + A − (∆ − 1)I) = 0
(2.8)
En definitiva, debe haber dos valores propios λ1 y λ2 de multiplicidades m1 y m2 que
satisfagan la ecuación x2 + x − (∆ − 1) = 0. El siguiente lema nos dice qué pasa si m1 = m2 .
Lema 2.24 Si m1 = m2 , entonces ∆ = 2.
30
Demostración. Este lema se demuestra fácilmente partiendo del sistema de ecuaciones
siguiente:
m1 + m2 = ∆2
m1 λ1 + m2 λ2 = −∆
λ1 + λ2 = −1
(2.9)
(2.10)
(2.11)
La primera ecuación proviene de que la suma de las multiplicidades de los valores propios
de A debe ser igual a la dimensión de la matriz. La segunda ecuación refleja que la suma
de todos los valores propios es la traza de la matriz A. Y la tercera ecuación viene de que
la suma de las raı́ces de la ecuación x2 + x − (∆ − 1) = 0 debe ser igual al coeficiente
del término en x cambiado de signo. Resolviendo el sistema, obtenemos que si m1 = m2 ,
entonces ∆ = 2.
Como hemos supuesto que ∆ ≥ 3, del contrarrecı́proco del Lema 2.24 se deriva que
m1 = m2 y los valores propios λ1 y λ2 serán las raı́ces de la ecuación x2 + x − (∆ − 1) = 0.
Es decir,
−1 + t
−1 − t
,
λ2 =
(2.12)
λ1 =
2
2
√
donde t = 4∆ − 3. Por otro lado, partiendo de las ecuaciones 2.9 y 2.10 podemos expresar
m1 y m2 de la siguiente manera:
m1 =
∆ + λ 2 ∆2
λ2 − λ1
,
m2 =
∆ + λ 1 ∆2
λ1 − λ2
(2.13)
Dado que las multiplicidades m1 y m2 deben ser números naturales, de las expresiones
anteriores se deduce que λ1 y λ2 deben ser números racionales. Por consiguiente, el valor t
debe ser también un número natural.
Del sistema formado por las ecuaciones 2.9, 2.10 y 2.12 se deduce la siguiente ecuación:
t4 − 2t2 − 16(m1 − m2 )t − 15 = 0
(2.14)
Tenemos pues que t debe ser un divisor de 15. Tomando sucesivamente t = 1, 3, 5, 15
obtenemos los valores ∆ = 1, 3, 7, 57. El caso ∆ = 1 no puede darse, ya que entonces el
grafo no podrı́a tener diámetro 2. Por lo tanto, los únicos valores posibles son ∆ = 3, 7 y
57.
2.3.2.
Árbol generador
Definición 2.25 Dado un grafo G, se define su árbol generador como aquel árbol que
contiene todos los vértices de G.
Proposición 2.26 El árbol generador de un grafo de Moore es el que muestra la figura
2.5.
Demostración. Sea G un grafo de Moore de grado ∆. Consideremos un vértice cualquiera
de G y etiquetémoslo v0 . Como G es ∆-regular, desde v0 colgarán ∆ vértices, y desde cada
uno de estos ∆ vértices colgarán ∆ − 1 vértices más.
31
Figura 2.5: Árbol generador de un grafo de Moore.
Dado que los grafos de Moore tienen diámetro 2, su árbol generador no puede tener
más de 3 niveles, ya que en caso contrario la distancia entre el vértice v0 y cualquiera de
los vértices inferiores serı́a mayor que 2.
El árbol generador es una “buena manera” de empezar a construir un grafo de Moore,
ya que todos los vértices del mismo están conectados, y su simetrı́a nos asegura que no hay
ninguna rama colocada que nos impida completar el grafo.
Además, el árbol generador nos proporciona mucha información acerca de los grafos de
Moore. Por ejemplo, una cuenta rápida nos revela que el número n de vértices en un grafo
de Moore depende del grado ∆ según la siguiente expresión:
n = 1 + ∆ + ∆ · (∆ − 1) = ∆2 + 1
(2.15)
Conocido el número de vértices, el número l de ramas puede calcularse fácilmente
teniendo en cuenta que, como el grafo es ∆-regular, sobre cada vértice inciden ∆ ramas:
l=
(∆2 + 1) · ∆
n·∆
=
2
2
(2.16)
Este mismo resultado puede deducirse contando las ramas del árbol generador más las
ramas que faltan entre los vértices del tercer nivel:
l = ∆ + ∆ · (∆ − 1) +
2.3.3.
(∆2 + 1) · ∆
∆ · (∆ − 1)2
=
2
2
(2.17)
Grafo soporte
Ahora que sabemos cómo empezar a construir los grafos de Moore mediante su árbol
generador, veamos si podemos ir un poco más allá.
Definición 2.27 Sea T el árbol generador asociado a un grafo G de Moore. Llamaremos
grafo soporte de G al grafo resultante de añadir ∆2 − ∆ − 1 ramas al árbol T mediante el
siguiente procedimiento: unimos el vértice i del grupo 1 al vértice i del grupo j, para todo
1 ≤ i ≤ ∆ − 1 y para todo 2 ≤ j ≤ ∆.
32
Gráficamente, el grafo soporte adquiere el siguiente aspecto:
Figura 2.6: Grafo soporte de un grafo de Moore.
Proposición 2.28 Si G es un grafo de Moore de grado ∆, entonces el grafo soporte es un
subgrafo de G con 2∆ vértices de grado ∆ y (∆ − 1)2 vértices de grado 2.
Dicho de otro modo, el grafo soporte nos permite empezar a construir un grafo de Moore
estando seguros de que ninguna de las ramas colocadas va a impedirnos completar el grafo.
Por lo tanto, el grafo soporte es la “mejor manera” de iniciar la construcción de un grafo
de Moore.
Demostración. Sea T el árbol generador asociado a un grafo de Moore. Consideremos un
vértice cualquiera del tercer nivel de T . Dicho vértice pertenecerá a un grupo concreto, pero
como de momento los grupos son indistinguibles entre ellos, podemos suponer que pertenece
al primer grupo. Además, como dentro de cada grupo los vértices son indistinguibles entre
sı́, podemos suponer también que dicho vértice es el primero del primer grupo.
Este vértice en cuestión tiene grado 1, ası́ que para conseguir que tenga grado ∆ tendremos que colocarle ∆ − 1 ramas. Estas ramas no pueden ir a ningún vértice del primer
grupo, ya que se cerrarı́an ciclos de longitud 3, y no es posible enviar dos ramas a un mismo
grupo, ya que se cerrarı́an ciclos de longitud 4. Por lo tanto, como tenemos que colocar ∆−1
ramas y tenemos ∆ − 1 grupos dónde enviarlas, mandaremos una a cada grupo. Además,
como dentro de cada uno de los grupos del 2 al ∆ los vértices siguen siendo indistinguibles,
podemos suponer que las mandamos las ramas al primer vértice de cada grupo.
De forma similar, colocaremos las ∆ − 1 ramas que faltan a los vértices del 2 al ∆ − 1
del primer grupo, con lo que tendremos que todos los vértices del primer grupo tendrán
grado ∆.
33
2.3.4.
Forma canónica de un grafo de Moore
Definición 2.29 Llamaremos forma canónica de un grafo de Moore a aquella representación de su matriz de adyacencia que se corresponde con su grafo soporte.
En general, la forma canónica de la matriz de adyacencia del grafo de Moore de grado
∆ tiene el siguiente aspecto:
k}}}}}}}}}$Â$í}}}}}}}}}m
ÚÂ
k}$í}m
ÂÂÂ
ÚÂ
ÂÂÂ
ÚÂ
ÂÂÂ
ÚÂ
ÚÂ
ÚÂ
ÚÂ
ÚÂ
ÚÂ
ÚÂ
ÚÂ
ÂÂÂ
ÚÂ
ÚÂ
ÚÂ
ÂÂÂ
k$ím k$ím k}$}m
k$ím
k}}}}}}}}}$Â$í}}}}}}}}}m
k}}$}}m k}$í}m k}$í}m
ÚÂ
ÚÂ
Figura 2.7: Forma canónica de la matriz de adyacencia de un Grafo de Moore.
Proposición 2.30 Sea G un grafo de Moore y sea A su matriz de adyacencia. Entonces,
existe una matriz de permutación P tal que P T · A · P = A , siendo A la forma canónica
de la matriz A.
Dicho de otra forma, la matriz de adyacencia de un grafo de Moore siempre puede
escribirse en forma canónica.
Demostración. Al ser G un grafo ∆-regular, su matriz de adyacencia tiene exactamente
∆ unos en cada fila y en cada columna. El siguiente algoritmo permite obtener la forma
canónica de cualquier matriz de adyacencia asociada a un grafo de Moore:
Consideremos la primera fila de la matriz A. Por ser G un grafo ∆-regular, esta fila
contiene ∆ unos. Nuestro objetivo ha de ser agrupar estos ∆ unos en las posiciones
(1, 2) a (1, ∆ + 1). Para ello basta localizar las posiciones (1, p1i ) que contienen los
unos y realizar las siguientes permutaciones de columna:
columna
2
3
..
.
∆+1
−→ columna
−→
p11
−→
p12
..
−→
.
−→
34
p1∆
Si realizamos simultáneamente las mismas permutaciones de fila que de columna,
entonces habremos ordenado también la primera columna.
Pasemos ahora a la segunda fila, que contiene también ∆ unos. Sin embargo, el
primero de ellos está bien colocado, ya que pertenece a la primera columna. Por lo
tanto debemos preocuparnos de ordenar los ∆−1 unos restantes. Para ello, repetimos
el procedimiento anterior, es decir, localizamos las posiciones (2, p2i ) que contienen
los unos y realizamos permutaciones de columna pertinentes, que en este caso son las
siguientes:
columna −→ columna
∆ + 2 −→
p21
∆ + 3 −→
p22
..
..
.
−→
.
2∆
−→
p2∆−1
Para ordenar las filas (y las columnas) de la 3 a la ∆ + 1 podemos aplicar el mismo
procedimiento que para la fila 2.
Fijémonos ahora en las filas ∆ + 2 a 2∆. En estas filas se encuentran los unos correspondientes a las ramas de primer grupo del tercer nivel del árbol. Para conseguir la
forma canónica es necesario que cada vértice del primer grupo del tercer nivel vaya al
mismo vértice de los demás grupos del tercer nivel, lo que se traduce en que los unos
de la matriz de adyacencia queden dispuestos en diagonales dentro de cada grupo.
Es fácil ver que podemos permutar filas (y las columnas) dentro de un mismo grupo
sin desordenar las filas (y las columnas) anteriores. Por lo tanto, podemos aplicar de
nuevo el procedimiento que hemos venido aplicando y que consiste en localizar los
unos en cada fila y columna y realizar las permutaciones pertinentes.
Una vez completado el procedimiento descrito, la matriz de adyacencia estará en forma
canónica.
2.4.
Construcción del grafo de Petersen
El grafo de Moore de grado 3 recibe el nombre de grafo de Petersen y se caracteriza
por los siguientes parámetros:
Diámetro D
Grado ∆
Girth g
Vértices n
Ramas l
2
3
5
10
15
Cuadro 2.1: Parámetros del grafo de Moore de grado 3.
El grafo de Petersen es el más pequeño de los grafos de Moore, y es el único que puede
construirse manualmente sin utilizar ninguna técnica especial, tan sólo un simple tanteo.
Sin embargo, vamos a aprovechar que hemos introducido el concepto de grafo soporte para
hacerlo de una forma más elegante.
35
2.4.1.
Construcción mediante el grafo soporte
El grafo de Petersen es relativamente fácil de deducir a partir de su grafo soporte. Para
ello, empezaremos colocando construyendo su árbol generador:
0
1
4
2
5
6
3
7
8
9
Figura 2.8: Construcción del grafo de Petersen. Paso 1.
Una vez hecho esto, vemos que nos falta colocar las ramas de los vértices del tercer
nivel. El secreto para completar el grafo de Petersen es colocar dichas ramas de forma que
no se formen ciclos de longitud 3 ni 4, ya que en caso contrario el grafo no tendrı́a girth 5
y consecuentemente no serı́a un grafo de Moore.
Fijemos nuestra atención en el vértice 4. Este vértice tiene una rama que lo une al
vértice 1. Por lo tanto, le faltan dos ramas para tener grado 3. Vamos a colocarle una
segunda rama. Dicha rama no puede ir al vértice 5 porque cerrarı́a un ciclo de longitud
3 (ciclo 1-4-5). En cambio, la rama puede ir a cualquiera de los vértices 6, 7, 8 y 9. Por
comodidad, llevaremos la rama del vértice 4 al vértice 6.
0
1
4
2
5
6
3
7
8
9
Figura 2.9: Construcción del grafo de Petersen. Paso 2.
Es importante darse cuenta que la decisión de conectar el vértice 4 con el vértice 6 no
supone ninguna pérdida de generalidad, ya que los vértices 6, 7, 8 y 9 son hasta el momento
indistinguibles desde el punto de vista de sus conexiones con otros vértices.
Nos falta aún colocar la tercera rama del vértice 4. Esta rama no puede ir al vértice
5 por la misma razón que antes ni al vértice 6 dado que ya hay una rama que une los
vértices 4 y 6. Tampoco puede ir al vértice 7, porque se cerrarı́a un ciclo de longitud 4
(ciclo 4-6-2-7). En cambio, dicha rama puede ir tanto al vértice 8 como al 9. Siguiendo el
mismo razonamiento que antes, llevaremos la tercera rama del vértice 4 al vértice 8.
36
0
1
4
2
5
6
3
7
8
9
Figura 2.10: Construcción del grafo de Petersen. Paso 3.
Hecho esto, el vértice 4 ya tiene todas las ramas necesarias. Pasemos pues al vértice 5.
A este vértice le faltan también dos ramas para tener grado 3. Tanto el vértice 6 como el
vértice 8 están descartados ya que se cerrarı́an ciclos de longitud 4 (ciclos 5-6-4-1 y 5-8-4-1,
respectivamente). Quedan pues los vértices 7 y 9. Como tenemos que colocar dos ramas
desde el vértice 5 y las dos no pueden ir a un mismo vértice, llevaremos una al vértice 7 y
otra al 9.
0
1
4
2
5
6
3
7
8
9
Figura 2.11: Construcción del grafo de Petersen. Paso 4.
Llegados a este punto, es importante darse cuenta que el grafo anterior es precisamente
el grafo soporte del grafo de Petersen. Como el procedimiento seguido hasta el momento
es aplicable a cualquier grafo de Moore vamos a resumir, antes de continuar, los pasos que
hemos dado:
Hemos generado el árbol hasta el tercer nivel, colocando el vértice 0 en el primer
nivel, los vértices del 1 al ∆ en el segundo nivel y el resto en el tercero agrupados en
∆ grupos de (∆ − 1) vértices.
Hemos colocado (∆ − 1) ramas desde el primer vértice del primer grupo del tercer
nivel a los (∆ − 1) primeros vértices de los grupos del 2 al ∆; también hemos colocado
(∆ − 1) ramas desde el segundo vértice del primer grupo del tercer nivel a los (∆ − 1)
segundos vértices de los grupos del 2 al ∆; ası́ hemos ido colocando las ramas de
todos los vértices del primer grupo.
37
Volvamos ahora a la construcción del grafo de Petersen. Nos falta colocar dos ramas que
unan los vértices 6, 7, 8 y 9, que son los únicos que todavı́a no tienen grado 3. Dado que
las parejas 6-7 y 8-9 estań descartadas porque cerrarı́an ciclos de longitud 3 (ciclos 6-7-2 y
8-9-3, respectivamente), sólo nos quedan dos posibilidades: o bien unir el vértice 6 con el 8
y el 7 con el 9, o bien unir el vértice 6 con el 9 y el 7 con el 8. Un tanteo rápido nos revela
que las parejas correctas son la 6-9 y la 7-8.
0
1
2
4
5
3
6
7
8
9
Figura 2.12: Construcción del grafo de Petersen. Paso 5.
De esta forma hemos acabado la construcción del grafo de Petersen. Ahora serı́a interesante comprobar que efectivamente el grafo que acabamos de generar tiene diámetro
2. Dado que el grado de este grafo es relativamente pequeño, podrı́amos realizar la comprobación a mano. Sin embargo, previendo ya lo que ha de venir, vamos a aplicar nuestros
conocimientos sobre matrices de adyacencia para comprobarlo.
2.4.2.
Matriz de adyacencia del grafo de Petersen
La matriz de adyacencia del grafo de Petersen es muy fácil de construir a partir del
propio grafo. Esta es la matriz que está en forma canónica:
⎡
⎢
⎢
⎢
⎢
⎢
⎢
⎢
⎢
A1 = ⎢
⎢
⎢
⎢
⎢
⎢
⎢
⎢
⎣
0
1
1
1
0
0
0
0
0
0
1
0
0
0
1
1
0
0
0
0
1
0
0
0
0
0
1
1
0
0
1
0
0
0
0
0
0
0
1
1
0
1
0
0
0
0
1
0
1
0
0
1
0
0
0
0
0
1
0
1
0
0
1
0
1
0
0
0
0
1
0
0
1
0
0
1
0
0
1
0
0
0
0
1
1
0
0
1
0
0
0
0
0
1
0
1
1
0
0
0
⎤
⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎦
Como podemos observar, se trata de una matriz simétrica 10 × 10 que contiene 30 unos
y 70 ceros distribuidos de forma que hay exactamente 3 unos por fila y por columna. Esto
indica que el grado de todos los vértices es 3. Además, los elementos de la diagonal son
cero, lo que demuestra que no hay autolazos.
38
Veamos ahora la matriz de adyacencia de orden 2:
⎡
⎢
⎢
⎢
⎢
⎢
⎢
⎢
⎢
2
A =⎢
⎢
⎢
⎢
⎢
⎢
⎢
⎢
⎣
3
0
0
0
1
1
1
1
1
1
0
3
1
1
0
0
1
1
1
1
0
1
3
1
1
1
0
0
1
1
0
1
1
3
1
1
1
1
0
0
1
0
1
1
3
1
0
1
0
1
1
0
1
1
1
3
1
0
1
0
1
1
0
1
0
1
3
1
1
0
1
1
0
1
1
0
1
3
0
1
1
1
1
0
0
1
1
0
3
1
1
1
1
0
1
0
0
1
1
3
⎤
⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎦
Es este caso tenemos otra matriz simétrica 10 × 10 con las siguientes caracterı́sticas:
Los elementos de la diagonal valen 3, lo que nos vuelve a recordar que el grado de
cada vértice es 3.
Los elementos que valı́an 1 en la matriz A1 ahora valen 0, y viceversa, los elementos
que valı́an 0 en la matriz A1 (excepto los de la diagonal) ahora valen 1.
Finalmente, veamos qué da la suma de las matrices A1 y A2 :
⎡
⎢
⎢
⎢
⎢
⎢
⎢
⎢
⎢
1
2
A +A =⎢
⎢
⎢
⎢
⎢
⎢
⎢
⎢
⎣
3
1
1
1
1
1
1
1
1
1
1
3
1
1
1
1
1
1
1
1
1
1
3
1
1
1
1
1
1
1
1
1
1
3
1
1
1
1
1
1
1
1
1
1
3
1
1
1
1
1
1
1
1
1
1
3
1
1
1
1
1
1
1
1
1
1
3
1
1
1
1
1
1
1
1
1
1
3
1
1
1
1
1
1
1
1
1
1
3
1
1
1
1
1
1
1
1
1
1
3
⎤
⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎦
En esta matriz ningún elemento vale cero. Recordando las propiedades de la suma de
matrices de adyacencia, esto significa que toda pareja de vértices i y j está conectada por
un camino de longitud 1 o 2. Y con esto hemos demostrado lo que venı́amos buscando, es
decir, que el grafo de Petersen tiene diámetro 2.
2.4.3.
Otras representaciones del grafo de Petersen
Para aquellos que deseen perfeccionar sus habilidades en la construcción del grafo de
Petersen, he aquı́ algunas otras representaciones del mismo:
Figura 2.13: Algunas representaciones del grafo de Petersen.
39
Estas representaciones del grafo de Petersen están basadas en el pentágono, el hexágono,
el octágono y el nonágono. Nótese que todas las figuras representan el mismo grafo, tan
sólo cambia la disposición de los vértices en el plano. A pesar de ello, el grafo de Petersen
es habitualmente conocido por su representación basada en el pentágono.
2.5.
Construcción del grafo de Hoffman-Singleton
El grafo de Moore de grado 7 recibe el nombre de grafo de Hoffman-Singleton y se
caracteriza por los siguientes parámetros:
Diámetro D
Grado ∆
Girth g
Vértices n
Ramas l
2
7
5
50
175
Cuadro 2.2: Parámetros del grafo de Moore de grado 7.
La construcción del grafo de Hoffman-Singleton no es inmediata como en el caso de
Petersen. Por el momento, podemos avanzar que el grafo soporte del grafo de HoffmanSingleton tendrá el siguiente aspecto:
Figura 2.14: Aspecto del grafo soporte para el grafo de Hoffman-Singleton.
2.5.1.
Construcción clásica del grafo de Hoffman-Singleton
La construcción más famosa del grafo de Hoffman-Singleton es la basada en el grafo
completo bipartito K5,5 . Un grafo se llama bipartito cuando sus vértices están agrupados en
dos conjuntos de forma que no hay ramas que unan vértices dentro de un mismo conjunto.
Un grafo se llama completo cuando cada vértice está unido con todos los demás.
E0
E1
E2
E3
E4
P0
P1
P2
P3
P4
Figura 2.15: Grafo completo bipartito K5,5 .
40
Para construir el grafo de Hoffman-Singleton basta basta tomar 5 “estrellas” y 5 “pentágonos” como los de la figura 2.16 y unir cada vértice i de la “estrella” Ej con el vértice
i + jk (módulo 5) del “pentágono” Pk .
Figura 2.16: Construcción del grafo de Hoffman-Singleton.
Con este método habremos construido un grafo con 50 vértices y 175 ramas. Para
comprobar que efectivamente se trata de un grafo de Moore vamos a recurrir de nuevo al
concepto de matriz de adyacencia.
2.5.2.
Matriz de adyacencia del grafo de Hoffman-Singleton
Partiendo de la construcción del grafo de Hoffman-Singleton descrita en el apartado
anterior, construir su matriz de adyacencia resulta muy fácil si nos ayudamos de alguna
herramienta informática.
P0
P1
P2
P3
P4
E0
E1
E2
E3
E4
0
1
2
3
4
0
1
2
3
4
0
1
2
3
4
0
1
2
3
4
0
1
2
3
4
0
1
2
3
4
0
1
2
3
4
0
1
2
3
4
0
1
2
3
4
0
1
2
3
4
0
0
0
1
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
1
0
0
0
0
1
0
0
0
0
1
0
0
0
0
1
0
0
0
0
1
0
0
0
1
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
1
0
0
0
0
1
0
0
0
0
1
0
0
0
0
1
0
0
0
P0
2
1
0
0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
1
0
0
0
0
1
0
0
0
0
1
0
0
0
0
1
0
0
3
1
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
1
0
0
0
0
1
0
0
0
0
1
0
0
0
0
1
0
4
0
1
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
1
0
0
0
0
1
0
0
0
0
1
0
0
0
0
1
0
0
0
0
0
0
0
0
1
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
0
1
0
0
0
0
0
1
0
0
0
0
0
1
0
0
0
0
0
1
1
0
0
0
0
0
0
0
0
1
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
0
1
0
0
0
0
0
1
0
0
0
0
0
1
1
0
0
0
0
P1
2
0
0
0
0
0
1
0
0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
0
1
0
0
0
0
0
1
1
0
0
0
0
0
1
0
0
0
3
0
0
0
0
0
1
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
0
1
1
0
0
0
0
0
1
0
0
0
0
0
1
0
0
4
0
0
0
0
0
0
1
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
1
0
0
0
0
0
1
0
0
0
0
0
1
0
0
0
0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
1
0
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
1
0
0
0
0
0
0
1
0
1
0
0
0
0
0
0
1
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
1
1
0
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
1
0
1
0
0
0
0
0
0
1
0
0
0
0
0
0
1
P2
2
0
0
0
0
0
0
0
0
0
0
1
0
0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
1
0
1
0
0
0
0
0
0
1
0
1
0
0
0
0
3
0
0
0
0
0
0
0
0
0
0
1
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
1
0
0
0
0
0
0
1
0
0
0
0
0
0
1
0
1
0
0
0
4
0
0
0
0
0
0
0
0
0
0
0
1
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
1
0
0
0
0
0
0
1
0
1
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
1
0
0
0
0
0
0
1
0
0
0
0
0
0
0
1
0
0
1
0
0
0
0
0
0
0
1
0
0
1
0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
1
0
0
0
0
0
0
1
0
0
0
0
0
0
0
1
0
0
1
0
0
1
0
0
0
0
0
0
0
1
0
P3
2
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
0
1
0
0
0
0
0
0
0
1
0
0
1
0
0
0
0
0
0
0
1
0
0
1
0
0
0
0
0
0
0
1
3
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
1
0
0
0
0
0
0
0
0
0
0
0
1
0
0
1
0
0
0
0
0
0
0
1
0
0
1
0
0
1
0
0
0
0
4
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
1
0
0
0
0
0
0
0
0
0
0
0
1
0
0
1
0
0
1
0
0
0
0
0
0
0
1
0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
1
0
1
0
0
0
0
0
0
0
0
1
0
0
0
1
0
0
0
1
0
0
0
1
0
0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
1
0
1
0
0
0
1
0
0
0
0
0
0
0
0
1
0
0
0
1
0
0
0
1
0
0
P4
2
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
0
1
0
0
1
0
0
0
1
0
0
0
1
0
0
0
0
0
0
0
0
1
0
0
0
1
0
3
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
1
0
0
0
0
0
0
1
0
0
0
1
0
0
0
1
0
0
0
1
0
0
0
0
0
0
0
0
1
4
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
1
0
0
0
0
0
0
1
0
0
0
1
0
0
0
1
0
0
0
1
0
0
0
1
0
0
0
0
0
1
0
0
0
0
1
0
0
0
0
1
0
0
0
0
1
0
0
0
0
1
0
0
0
0
0
1
0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
1
0
0
0
0
1
0
0
0
0
1
0
0
0
0
1
0
0
0
0
1
0
0
0
1
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
E0
2
0
0
1
0
0
0
0
1
0
0
0
0
1
0
0
0
0
1
0
0
0
0
1
0
0
0
1
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
3
0
0
0
1
0
0
0
0
1
0
0
0
0
1
0
0
0
0
1
0
0
0
0
1
0
0
0
1
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4
0
0
0
0
1
0
0
0
0
1
0
0
0
0
1
0
0
0
0
1
0
0
0
0
1
1
0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
1
0
0
0
1
0
0
0
1
0
0
0
1
0
0
0
0
0
0
0
0
0
1
0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
1
0
0
0
1
0
0
0
0
0
0
0
0
1
0
0
0
1
0
0
0
1
0
0
0
0
0
0
0
1
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
E1
2
0
0
1
0
0
0
1
0
0
0
1
0
0
0
0
0
0
0
0
1
0
0
0
1
0
0
0
0
0
0
0
1
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
3
0
0
0
1
0
0
0
1
0
0
0
1
0
0
0
1
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
1
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
4
0
0
0
0
1
0
0
0
1
0
0
0
1
0
0
0
1
0
0
0
1
0
0
0
0
0
0
0
0
0
1
0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
1
0
0
1
0
0
0
0
0
0
0
1
0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
1
0
0
0
0
0
0
0
0
0
0
1
0
1
0
0
0
0
0
0
0
1
0
0
1
0
0
1
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
0
0
0
1
0
1
0
0
0
0
0
0
0
0
0
0
0
0
E2
2
0
0
1
0
0
1
0
0
0
0
0
0
0
1
0
0
1
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
0
0
0
1
0
1
0
0
0
0
0
0
0
0
0
0
0
3
0
0
0
1
0
0
1
0
0
0
0
0
0
0
1
0
0
1
0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
1
0
0
0
0
0
0
0
0
0
0
4
0
0
0
0
1
0
0
1
0
0
1
0
0
0
0
0
0
0
1
0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
1
0
0
0
0
0
0
1
0
1
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
1
0
0
0
0
0
1
0
1
0
0
0
0
0
0
1
0
1
0
0
0
0
0
0
1
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
1
0
0
0
0
0
0
0
E3
2
0
0
1
0
0
0
0
0
0
1
0
1
0
0
0
0
0
0
1
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
1
0
0
0
0
0
0
3
0
0
0
1
0
1
0
0
0
0
0
0
1
0
0
0
0
0
0
1
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
1
0
0
0
0
0
4
0
0
0
0
1
0
1
0
0
0
0
0
0
1
0
1
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
1
0
0
0
0
0
0
0
1
0
0
0
0
0
1
0
0
0
0
0
1
0
0
0
0
0
1
0
0
0
0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
1
1
0
1
0
0
0
0
0
1
0
0
0
0
0
1
0
0
0
0
0
1
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
1
0
0
E4
2
0
0
1
0
0
0
0
0
1
0
0
0
0
0
1
1
0
0
0
0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
1
0
3
0
0
0
1
0
0
0
0
0
1
1
0
0
0
0
0
1
0
0
0
0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
1
4
0
0
0
0
1
1
0
0
0
0
0
1
0
0
0
0
0
1
0
0
0
0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
1
0
Nótese que la matriz de adyacencia puede dividirse en 4 submatrices 25 × 25. Esto es
debido al carácter bipartito del grafo de Hoffman-Singleton. En el primer cuadrante tenemos
41
las “estrellas” P0 a P4 , mientras que en el cuarto cuadrante tenemos los “pentágonos” Q0
a Q4 . Los cuadrantes segundo y tercero, que por simetrı́a son uno el traspuesto del otro,
contienen los enlaces entre las “estrellas” Ej y los “pentágonos” Pk según la fórmula i + jk
(módulo 5). Nótese también que hay exactamente 7 unos por fila y por columna, lo que
nos indica que el grafo es 7-regular.
Fijémonos ahora en en la matriz de adyacencia de orden 2. Recordemos que esta matriz
indica el número de caminos de longitud 2 que unen dos vértices i e j cualesquiera y que
puede calcularse fácilmente elevando al cuadrado la matriz de adyacencia de orden 1.
P0
P1
P2
P3
P4
E0
E1
E2
E3
E4
0
1
2
3
4
0
1
2
3
4
0
1
2
3
4
0
1
2
3
4
0
1
2
3
4
0
1
2
3
4
0
1
2
3
4
0
1
2
3
4
0
1
2
3
4
0
1
2
3
4
0
7
1
0
0
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
0
1
1
1
1
0
1
1
1
1
0
1
1
1
1
0
1
1
1
1
0
1
1
1
1
1
1
7
1
0
0
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
0
1
1
1
1
0
1
1
1
1
0
1
1
1
1
0
1
1
1
1
0
1
1
1
P0
2
0
1
7
1
0
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
0
1
1
1
1
0
1
1
1
1
0
1
1
1
1
0
1
1
1
1
0
1
1
3
0
0
1
7
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
0
1
1
1
1
0
1
1
1
1
0
1
1
1
1
0
1
1
1
1
0
1
4
1
0
0
1
7
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
0
1
1
1
1
0
1
1
1
1
0
1
1
1
1
0
1
1
1
1
0
0
1
1
1
1
1
7
1
0
0
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
0
1
1
1
1
1
0
1
1
1
1
1
0
1
1
1
1
1
0
1
1
1
1
1
0
1
1
1
1
1
1
1
7
1
0
0
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
0
1
1
1
1
1
0
1
1
1
1
1
0
1
1
1
1
1
0
0
1
1
1
1
P1
2
1
1
1
1
1
0
1
7
1
0
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
0
1
1
1
1
1
0
1
1
1
1
1
0
0
1
1
1
1
1
0
1
1
1
3
1
1
1
1
1
0
0
1
7
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
0
1
1
1
1
1
0
0
1
1
1
1
1
0
1
1
1
1
1
0
1
1
4
1
1
1
1
1
1
0
0
1
7
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
0
0
1
1
1
1
1
0
1
1
1
1
1
0
1
1
1
1
1
0
1
0
1
1
1
1
1
1
1
1
1
1
7
1
0
0
1
1
1
1
1
1
1
1
1
1
1
0
1
1
1
1
1
1
0
1
1
1
1
1
1
0
1
0
1
1
1
1
1
1
0
1
1
1
1
1
1
1
1
1
1
1
1
1
7
1
0
0
1
1
1
1
1
1
1
1
1
1
1
0
1
1
1
1
1
1
0
1
0
1
1
1
1
1
1
0
1
1
1
1
1
1
0
P2
2
1
1
1
1
1
1
1
1
1
1
0
1
7
1
0
1
1
1
1
1
1
1
1
1
1
1
1
0
1
1
1
1
1
1
0
1
0
1
1
1
1
1
1
0
1
0
1
1
1
1
3
1
1
1
1
1
1
1
1
1
1
0
0
1
7
1
1
1
1
1
1
1
1
1
1
1
1
1
1
0
1
0
1
1
1
1
1
1
0
1
1
1
1
1
1
0
1
0
1
1
1
4
1
1
1
1
1
1
1
1
1
1
1
0
0
1
7
1
1
1
1
1
1
1
1
1
1
1
1
1
1
0
1
0
1
1
1
1
1
1
0
1
0
1
1
1
1
1
1
0
1
1
0
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
7
1
0
0
1
1
1
1
1
1
0
1
1
1
1
1
1
1
0
1
1
0
1
1
1
1
1
1
1
0
1
1
0
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
7
1
0
0
1
1
1
1
1
1
0
1
1
1
1
1
1
1
0
1
1
0
1
1
0
1
1
1
1
1
1
1
0
1
P3
2
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
0
1
7
1
0
1
1
1
1
1
1
1
0
1
1
0
1
1
1
1
1
1
1
0
1
1
0
1
1
1
1
1
1
1
0
3
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
0
0
1
7
1
1
1
1
1
1
1
1
1
0
1
1
0
1
1
1
1
1
1
1
0
1
1
0
1
1
0
1
1
1
1
4
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
0
0
1
7
1
1
1
1
1
1
1
1
1
0
1
1
0
1
1
0
1
1
1
1
1
1
1
0
1
1
0
1
1
1
0
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
7
1
0
0
1
0
1
1
1
1
1
1
1
1
0
1
1
1
0
1
1
1
0
1
1
1
0
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
7
1
0
0
1
0
1
1
1
0
1
1
1
1
1
1
1
1
0
1
1
1
0
1
1
1
0
1
1
P4
2
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
0
1
7
1
0
1
1
0
1
1
1
0
1
1
1
0
1
1
1
1
1
1
1
1
0
1
1
1
0
1
3
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
0
0
1
7
1
1
1
1
0
1
1
1
0
1
1
1
0
1
1
1
0
1
1
1
1
1
1
1
1
0
4
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
0
0
1
7
1
1
1
1
0
1
1
1
0
1
1
1
0
1
1
1
0
1
1
1
0
1
1
1
1
0
0
1
1
1
1
0
1
1
1
1
0
1
1
1
1
0
1
1
1
1
0
1
1
1
1
7
0
1
1
0
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
0
1
1
1
1
0
1
1
1
1
0
1
1
1
1
0
1
1
1
1
0
1
1
1
0
7
0
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
E0
2
1
1
0
1
1
1
1
0
1
1
1
1
0
1
1
1
1
0
1
1
1
1
0
1
1
1
0
7
0
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
3
1
1
1
0
1
1
1
1
0
1
1
1
1
0
1
1
1
1
0
1
1
1
1
0
1
1
1
0
7
0
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
4
1
1
1
1
0
1
1
1
1
0
1
1
1
1
0
1
1
1
1
0
1
1
1
1
0
0
1
1
0
7
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
0
0
1
1
1
1
1
1
1
1
0
1
1
1
0
1
1
1
0
1
1
1
0
1
1
1
1
1
1
1
1
7
0
1
1
0
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
0
1
1
1
0
1
1
1
1
1
1
1
1
0
1
1
1
0
1
1
1
0
1
1
1
1
1
1
1
0
7
0
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
E1
2
1
1
0
1
1
1
0
1
1
1
0
1
1
1
1
1
1
1
1
0
1
1
1
0
1
1
1
1
1
1
1
0
7
0
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
3
1
1
1
0
1
1
1
0
1
1
1
0
1
1
1
0
1
1
1
1
1
1
1
1
0
1
1
1
1
1
1
1
0
7
0
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
4
1
1
1
1
0
1
1
1
0
1
1
1
0
1
1
1
0
1
1
1
0
1
1
1
1
1
1
1
1
1
0
1
1
0
7
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
0
0
1
1
1
1
1
1
1
0
1
1
0
1
1
1
1
1
1
1
0
1
1
0
1
1
1
1
1
1
1
1
1
1
1
1
7
0
1
1
0
1
1
1
1
1
1
1
1
1
1
1
1
0
1
1
1
1
1
1
1
0
1
1
0
1
1
0
1
1
1
1
1
1
1
0
1
1
1
1
1
1
1
1
1
1
1
0
7
0
1
1
1
1
1
1
1
1
1
1
1
1
E2
2
1
1
0
1
1
0
1
1
1
1
1
1
1
0
1
1
0
1
1
1
1
1
1
1
0
1
1
1
1
1
1
1
1
1
1
1
0
7
0
1
1
1
1
1
1
1
1
1
1
1
3
1
1
1
0
1
1
0
1
1
1
1
1
1
1
0
1
1
0
1
1
0
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
0
7
0
1
1
1
1
1
1
1
1
1
1
4
1
1
1
1
0
1
1
0
1
1
0
1
1
1
1
1
1
1
0
1
1
0
1
1
1
1
1
1
1
1
1
1
1
1
1
0
1
1
0
7
1
1
1
1
1
1
1
1
1
1
0
0
1
1
1
1
1
1
0
1
1
1
1
1
1
0
1
0
1
1
1
1
1
1
0
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
7
0
1
1
0
1
1
1
1
1
1
1
0
1
1
1
1
1
1
0
1
0
1
1
1
1
1
1
0
1
1
1
1
1
1
0
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
0
7
0
1
1
1
1
1
1
1
E3
2
1
1
0
1
1
1
1
1
1
0
1
0
1
1
1
1
1
1
0
1
0
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
0
7
0
1
1
1
1
1
1
3
1
1
1
0
1
0
1
1
1
1
1
1
0
1
1
1
1
1
1
0
1
0
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
0
7
0
1
1
1
1
1
4
1
1
1
1
0
1
0
1
1
1
1
1
1
0
1
0
1
1
1
1
1
1
0
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
0
1
1
0
7
1
1
1
1
1
0
0
1
1
1
1
1
0
1
1
1
1
1
0
1
1
1
1
1
0
1
1
1
1
1
0
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
7
0
1
1
0
1
1
0
1
1
1
1
1
0
1
1
1
1
1
0
1
1
1
1
1
0
0
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
0
7
0
1
1
E4
2
1
1
0
1
1
1
1
1
0
1
1
1
1
1
0
0
1
1
1
1
1
0
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
0
7
0
1
3
1
1
1
0
1
1
1
1
1
0
0
1
1
1
1
1
0
1
1
1
1
1
0
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
0
7
0
4
1
1
1
1
0
0
1
1
1
1
1
0
1
1
1
1
1
0
1
1
1
1
1
0
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
0
1
1
0
7
Si ahora sumamos las matrices de adyacencia de orden 1 y orden 2, obtenemos una
matriz que nos indica el número de caminos de longitud 1 o 2 que unen dos vértices i e j
cualesquiera.
P0
P1
P2
P3
P4
E0
E1
E2
E3
E4
0
1
2
3
4
0
1
2
3
4
0
1
2
3
4
0
1
2
3
4
0
1
2
3
4
0
1
2
3
4
0
1
2
3
4
0
1
2
3
4
0
1
2
3
4
0
1
2
3
4
0
7
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
7
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
P0
2
1
1
7
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
3
1
1
1
7
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
4
1
1
1
1
7
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
0
1
1
1
1
1
7
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
7
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
P1
2
1
1
1
1
1
1
1
7
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
3
1
1
1
1
1
1
1
1
7
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
4
1
1
1
1
1
1
1
1
1
7
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
0
1
1
1
1
1
1
1
1
1
1
7
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
7
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
P2
2
1
1
1
1
1
1
1
1
1
1
1
1
7
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
3
1
1
1
1
1
1
1
1
1
1
1
1
1
7
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
4
1
1
1
1
1
1
1
1
1
1
1
1
1
1
7
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
0
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
7
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
7
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
P3
2
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
7
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
3
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
7
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
4
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
7
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
0
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
7
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
7
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
P4
2
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
7
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
3
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
7
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
4
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
7
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
42
0
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
7
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
7
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
E0
2
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
7
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
3
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
7
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
4
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
7
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
0
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
7
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
7
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
E1
2
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
7
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
3
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
7
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
4
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
7
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
0
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
7
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
7
1
1
1
1
1
1
1
1
1
1
1
1
1
E2
2
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
7
1
1
1
1
1
1
1
1
1
1
1
1
3
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
7
1
1
1
1
1
1
1
1
1
1
1
4
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
7
1
1
1
1
1
1
1
1
1
1
0
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
7
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
7
1
1
1
1
1
1
1
1
E3
2
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
7
1
1
1
1
1
1
1
3
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
7
1
1
1
1
1
1
4
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
7
1
1
1
1
1
0
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
7
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
7
1
1
1
E4
2
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
7
1
1
3
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
7
1
4
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
7
Como podemos observar, ningún elemento de la matriz anterior vale cero. Por lo tanto,
podemos asegurar cualesquier pareja de vértices distintos o bien son adyacentes o bien están
unidos por un único camino de longitud 2. Es decir, el grafo tiene diámetro 2. Además,
como se trata de un grafo regular, tiene que ser un grafo de Moore.
2.5.3.
Reformulación del problema de los grafos de Moore
Vistas las construcciones de los grafos de Petersen y Hoffman-Singleton, ya estamos en
condiciones de reformular el problema de encontrar grafos de Moore.
Proposición 2.31 El objetivo de construir un grafo de Moore de grado ∆ puede verse
como el de encontrar una matriz simétrica A que verifique la siguientes condiciones:
1) La matriz A tiene que ser una matriz binaria n × n, con n = ∆2 + 1 y diagonal nula.
2) La matriz A debe tener exactamente ∆ unos en cada fila y en cada columna.
3) La matriz A debe verificar la siguiente relación:
A + A2 = (∆ − 1) · I + J
(2.18)
Demostración. Sea A la matriz de adyacencia asociada a un grafo G. Por la primera
condición, G es un grafo simple de orden n. Por la segunda condición, G es un grafo ∆regular. Y por la tercera condición, G es un grafo de diámetro 2. Por lo tanto, G es un
grafo de Moore.
Una condición necesaria, aunque no suficiente, para encontrar la matriz A es que debe
ser disjunta con la matriz A2 . Dicho de otra forma, si existe un camino de longitud 1 entre
dos vértices cualesquiera, entonces no puede haber un camino de longitud 2 entre esos
mismos vértices. En caso contrario el girth del grafo serı́a 3, ya que se habrı́an cerrado
triángulos, por lo que según el Corolario 2.21 no podrı́a tratarse de un grafo de Moore.
2.6.
Construyendo El Gran Grafo de Moore
En las secciones anteriores hemos aprendido cómo construir los grafos de Moore de
grado 3 (grafo de Petersen) y grado 7 (grafo de Hoffman-Singleton) de una forma más o
menos artesanal. Llegados a este punto, podrı́amos lanzarnos a construir el grafo de Moore
de grado 57, conocido como El Gran Grafo de Moore. Sin embargo, repasemos primero los
parámetros que caracterizan dicho grafo:
Diámetro D
Grado ∆
Girth g
Vértices n
Ramas l
2
57
5
3.250
92.625
Cuadro 2.3: Parámetros del grafo de Moore de grado 57.
43
Como podemos observar el el Cuadro 2.3, el grafo de Moore de grado 57 tiene más de
tres mil vértices y casi cien mil ramas. Es más, su matriz de adyacencia es una matriz
3250 × 3250, es decir, tiene más de diez millones de elementos. He aquı́ la razón por la que
El Gran Grafo de Moore se conoce popularmente como “el monstruo”.
Visto esto, es evidente que no podemos abordar el problema como lo hemos venido
haciendo hasta ahora. Para empezar, las herramientas informáticas estándares no permiten
la manipulación de matrices de tal tamaño, por lo que ha sido necesario desarrollar una
herramienta especı́fica que permita trabajar con matrices de adyacencia de una forma
cómoda y eficiente. Dicha herramienta ha sido bautizada con el nombre del problema: The
Biggest Moore Graph (TBMG). Sin embargo, antes de proceder con la presentación de la
aplicación, vamos a deducir algunas propiedades algebraicas que debe cumplir toda matriz
de adyacencia asociada a un grafo de Moore.
2.6.1.
Propiedades algebraicas de la matriz de adyacencia
A continuación se presenta un análisis de las propiedades algebraicas de las matrices
de adyacencia de los grafos de Moore. Dicho análisis consiste en la determinación de los
valores propios y los vectores propios de las matrices de adyacencia.
Para los grafos de Petersen y Hoffman-Singleton, la caracterización algebraica puede
hacerse a partir de la propia matriz de adyacencia. Sin embargo, para el caso de El Gran
Grafo de Moore esto no es posible, ya que no se conoce su matriz. No obstante, existe un
procedimiento que permite determinar los valores y vectores propios sin conocer necesariamente la matriz de adyacencia.
Proposición 2.32 La matriz de adyacencia de un grafo de Moore tiene los mismos valores
propios que la siguiente matriz tridiagonal:
⎛
T =⎜
⎝
0
∆
0
⎞
1
0
0
1 ⎟
⎠
∆−1 ∆−1
(2.19)
Proposición 2.33 La multiplicidad de cada valor propio de la matriz de adyacencia del
grafo de Moore puede calcularse mediante la siguiente fórmula:
n
m(λi ) =
(2.20)
u(λi ) · v(λi )
donde u(λi ) y v(λi ) son, respectivamente, los vectores propios por la izquierda y por la
derecha de la matriz T , previamente reducidos para que su primera componente valga 1, y
n es la dimensión de la matriz de adyacencia, en este caso ∆2 + 1.
Proposición 2.34 Las componentes del vector v(λi ) se pueden escribir en función de las
componentes del vector u(λi ) de la siguiente manera:
v0 (λi ) = u0 (λi ) = 1
v1 (λi ) = ∆ u1 (λi )
v2 (λi ) = ∆(∆ − 1) u2 (λi )
(2.21)
(2.22)
(2.23)
La demostración de las Proposiciones 2.32, 2.33 y 2.34 no es sencilla. De hecho, forma
parte de la demostración del Teorema 2.20, que como ya se dijo está fuera del alcance de
esta tesina, aunque puede consultarse en [2].
44
Basándonos en las Proposiciones 2.32, 2.33 y 2.34 y haciendo los cálculos para los grados
3, 7 y 57, obtenemos los resultados que muestra la tabla siguiente:
∆
λi
u(λi )
3
−2
(1, − 23 , 16 )
(1, −2, 1)
4
3
1
(1, 13 , − 13 )
(1, 1, −2)
5
3
3
(1, 1, 1)
(1, 3, 6)
1
7
−3
1
(1, − 13 , 21
)
(1, −3, 2)
21
7
2
1
(1, 27 , − 14
)
(1, 2, −3)
28
7
7
(1, 1, 1)
(1, 7, 42)
1
8
1
57 −8 (1, − 57
, 456
)
(1, −8, 7)
1520
7
1
7 (1, 57
, − 399
)
(1, 7, −8)
1729
(1, 1, 1) (1, 57, 3192)
1
57
57
57
v(λi ) m(λi )
Cuadro 2.4: Valores propios y vectores propios de los grafos de Moore.
Con estos resultados ya sabemos algo sobre la matriz de adyacencia de El Gran Grafo
de Moore. En la siguiente sección veremos si es posible obtener alguna información más de
dicha matriz mediante la ayuda de la aplicación TBMG.
2.6.2.
Presentación de la aplicación TBMG
La finalidad con la que ha sido creada la aplicación TBMG es la de poder manipular de
una forma ágil y visual las matrices de adyacencia asociadas a grafos de Moore. Por este
motivo, TBMG ha sido desarrollada en lenguaje Visual Basic, el cual permite un grado
muy elevado de interacción con el usuario a costa de un menor rendimiento de cálculo en
comparación con otros lenguajes.
Como veremos más adelante, el problema de capacidad de cálculo no es relevante, ya
que el problema de El Gran Grafo de Moore no puede ser resuelto, por el momento, mediante los métodos llamados “de fuerza bruta”. En cambio, resulta mucho más interesante
poder observar el aspecto de la matriz de adyacencia para deducir las propiedades que las
caracterizan.
Hechas todas estas consideraciones, vamos a presentar el interfaz que nos permite interactuar con las matrices de adyacencia. La pantalla principal de TBMG se compone de
una rejilla que representa la matriz de adyacencia y una serie de cajas de herramientas que
permiten realizar diversas tareas programadas. Para una descripción detallada de las herramientas disponibles y su funcionamiento, se recomienda consultar el Manual del Usuario
contenido en la aplicación.
La matriz de adyacencia que muestra TBMG es en realidad una combinación de las
matrices de adyacencia A1 y A2 definida de la forma siguiente: B = A1 + 2A2 . De esta
manera, los unos identifican los elementos de la matriz A1 y los doses los de la matriz
A2 . Además, para dotar a la aplicación de un carácter más visual, se utiliza la siguiente
simbologı́a:
45
Celda en blanco: indica las posiciones de la matriz B que se encuentran vacantes,
es decir, aquellas posiciones que contienen un 0 y que pueden contener un 1 sin crear
conflictos.
Celda en negro: identifica los elementos de la diagonal, de forma que se resalta
carácter simétrico de la matriz B.
Cı́rculo azul: indica las posiciones de la matriz B que contienen un 1.
Punto verde: indica las posiciones de la matriz B que contienen un 2.
Punto amarillo: indica las posiciones de la matriz B donde no puede haber un 1
porque crearı́a un conflicto (se cerrarı́an ciclos de longitud inferior a 5).
Equis roja: indica las posiciones en la matriz B donde hay un conflicto, es decir,
aquellas casillas fuera de la diagonal cuyo valor es superior a 2.
Por ejemplo, echemos un vistazo a la matriz B correspondiente al grafo de Petersen y
a su representación mediante la simbologı́a de TBMG:


















6
1
1
1
2
2
2
2
2
2
1
6
2
2
1
1
2
2
2
2
1
2
6
2
2
2
1
1
2
2
1
2
2
6
2
2
2
2
1
1
2
1
2
2
6
2
1
2
1
2
2
1
2
2
2
6
2
1
2
1
2
2
1
2
1
2
6
2
2
1
2
2
1
2
2
1
2
6
1
2
2
2
2
1
1
2
2
1
6
2
2
2
2
1
2
1
1
2
2
6


















Figura 2.17: Matriz B para el grafo de Petersen y su representación en TBMG.
Cuando todos los elementos de la matriz de adyacencia son azules o verdes (a excepción
de los de la diagonal), el grafo de Moore está completo. Si algún elemento de la matriz
está en blanco, significa que todavı́a no hay ningún camino de longitud 1 o 2 que una esa
pareja de vértices. Y si algún elemento contiene una equis roja, significa que esa pareja
de vértices está unida por más de un camino de longitud 1 o 2, por lo que el grafo no
podrá completarse al haberse perdido la optimalidad.
Veamos ahora un ejemplo con algunos conflictos, es decir, con algunas equis rojas:


















6
1
1
1
2
2
2
2
2
2
1
6
2
2
1
1
2
2
2
2
1
2
6
2
2
2
1
1
0
0
1
2
2
6
4
0
0
0
1
1
2
1
2
4
8
2
1
0
1
1
2
1
2
0
2
4
0
1
0
0
2
2
1
0
1
0
4
2
2
2
2
2
1
0
0
1
2
4
0
0
2
2
0
1
1
0
2
0
4
4
2
2
0
1
1
0
2
0
4
4


















Figura 2.18: Matriz de adyacencia del grafo de Petersen con conflictos.
46
En la Figura 2.18 podemos observar los siguientes conflictos:
Tanto la fila 5 como la columna 5 tienen 4 puntos azules, lo que significa que hay
4 ramas que inciden sobre el vértice 5 (es decir, el grado del vértice 5 es 4 cuando
deberı́a ser 3). Esto podemos verlo reflejado en la posición (5,5) de la matriz B, donde
hay un 8 en vez de un 6.
Las equis rojas en las posiciones (4,5) y (5,4) nos indican que los vértices 4 y 5 están
unidos por más de un camino de longitud 2. Estos caminos son el 4-9-5 y el 4-10-5.
Este conflicto puede verse reflejado en las mismas posiciones de la matriz B, donde
hay un 4 en vez de un 2.
Las equis rojas en las posiciones (9,10) y (10,9) nos indican que entre los vértices 9 y
10 también hay redundancia de caminos, en este caso el 9-4-10 y el 9-5-10.
Ya podemos ir intuyendo que mediante el interfaz gráfico es muy fácil identificar los
conflictos en la matriz B, y por lo tanto podemos probar muchas combinaciones en muy
poco tiempo.
Para más agilidad, existen dos maneras de introducir los puntos azules en la matriz.
Una es directamente con el ratón, haciendo doble-click en la posición deseada. Si la posición
está vacante, entonces aparece un punto azul, y si hay un punto azul, entonces se libera la
casilla. En ambos casos se actualiza el resto de la matriz con los puntos verdes o amarillos
correspondientes.
La otra manera de introducir los puntos azules es mediante las herramientas preprogramadas en la aplicación, las cuales resultan muy útiles a la hora de rellenar grandes
matrices siguiendo alguna clase de patrón, como por ejemplo el del grafo soporte o un
patrón 5 × 5 como el siguiente:
Figura 2.19: Matriz de adyacencia del grafo de Petersen basada en un patrón 5 × 5.
Ha sido precisamente gracias a la agilidad que proporciona TBMG que se ha podido
realizar una caracterización de la matriz de adyacencia de los grafos de Moore, es decir,
se han detectado ciertos patrones dentro de la matriz de adyacencia que hacen más fácil
abordar el problema de El Gran Grafo de Moore.
47
2.6.3.
Caracterización de la matriz de adyacencia
A continuación se presentan los resultados más relevantes que se han obtenido a lo
largo de esta tesina en lo que se refiere a la caracterización de la matrices de adyacencia
asociadas a los grafos de Moore. Como veremos, en dicha caracterización aparecen los
cuadrados latinos, por lo que podremos aprovechar los resultados obtenidos en el primer
capı́tulo.
Para empezar, echemos un vistazo de nuevo a la matriz de adyacencia del grafo de
Hoffman-Singleton que obtuvimos mediante la construcción clásica, esta vez ya mediante
el interfaz de TBMG:
Figura 2.20: Matriz de adyacencia del grafo de Hoffman-Singleton.
Como podemos observar en la figura 2.20, el interfaz gráfico de TBMG destaca los unos
de la matriz de adyacencia, de forma que basta con un vistazo rápido para hacerse una
idea de la estructura de la matriz. En particular, podemos volver a remarcar el carácter
cuasi-bipartito de la matriz de adyacencia y su estructura basada en submatrices 5 × 5.
Recordemos que toda matriz de adyacencia asociada a un grafo de Moore siempre puede
escribirse en forma canónica permutando adecuadamente sus filas y sus columnas. Afortunadamente, el algoritmo para realizar este procedimiento está implementado en TBMG,
por lo que al seleccionar la opción Arrange matrix obtendremos el siguiente resultado:
48
Figura 2.21: Forma canónica de la matriz de adyacencia del grafo de Hoffman-Singleton.
En la figura 2.21 podemos observar que ha cambiado el patrón de la rejilla (las lı́neas
gruesas) para resaltar el nuevo carácter de la matriz de adyacencia, que ya no está basado
en submatrices de orden 5 sino de orden 6. Este es el primer resultado importante, que
expresaremos mediante la siguiente observación.
Observación 2.35 Al representar en forma canónica la matriz de adyacencia de un grafo
de Moore de grado ∆, aparece un patrón basado en submatrices de orden ∆ − 1.
Las ∆ + 1 primeras filas y las ∆ + 1 primeras columnas se corresponden ahora con las
ramas del árbol generador del grafo, mientras que las filas y las columnas de la ∆ + 2 a
la 2∆ se corresponden con las ramas añadidas durante la construcción del grafo soporte.
Las filas y columnas restantes, es decir, de la 2∆ + 1 a la ∆2 + 1, se corresponden con las
ramas de los grupos 2 a ∆, y son precisamente las que hay que determinar para completar
el grafo de Moore a partir de su grafo soporte.
Por otro lado, si nos fijamos en las submatrices de orden 6 que aparecen en la fórma
canónica del grafo de Hoffman-Singleton, podremos deducir algunas de sus caracterı́sticas:
Observación 2.36 Las submatrices de orden ∆ − 1 que aparecen en la forma canónica la
matriz de adyacencia de un grafo de Moore de grado ∆ son matrices de permutación.
49
La explicación de este hecho yace en que cada submatriz de orden ∆ − 1 representa los
enlaces entre dos grupos del tercer nivel del grafo soporte. Como ya se dijo en su momento,
dos ramas de un vértice no pueden ir a un mismo grupo, lo que se traduce en que cada
submatriz sólo puede contener un punto azul por fila y por columna.
Conjetura 2.37 Las submatrices de orden ∆ − 1 que aparecen en la forma canónica la
matriz de adyacencia de un grafo de Moore de grado ∆ son matrices simétricas.
Esta propiedad se verifica para las submatrices de orden 2 del grafo de Petersen y
para las submatrices de orden 6 del grafo de Hoffman-Singleton, aunque no ha sido posible
demostrarlo para el caso de El Gran Grafo de Moore. No obstante, dado el carácter simétrico
de la matriz de adyacencia, todo indica que las submatrices deben ser también simétricas.
Fijémonos ahora en las submatrices de la franja seleccionada:
0
1
2
3
4
5
6
0
1
2
3
4
5
6
Figura 2.22: Submatrices 6 × 6 en la forma canónica del grafo de Hoffman-Singleton.
Nótese que hemos indexado las submatrices para poder trabajar con ellas de forma
algebraica. Ahora podemos representar la figura anterior mediante la siguiente notación.
50
Definición 2.38 Dada la forma canónica de la matriz de adyacencia asociada a un grafo
de Moore, indicaremos mediante los ı́ndices i y j la posición de la submatriz Pij dentro de
la matriz original:


P00 P01 . . . P06


 P10 P11 . . . P16 
 .
.. . .
. 
 .
. .. 

 .
.
P60 P61 . . . P66
Nótese que las submatrices Pii de la diagonal son matrices nulas, mientras que las
submatrices fuera de la diagonal son las matrices de permutación propiamente dichas. Por
ejemplo, la submatriz P34 se corresponde con la siguiente matriz de permutación:

0
0
0
0
1
0




P34 = 



0
0
0
0
0
1
0
0
0
1
0
0
0
0
1
0
0
0
1
0
0
0
0
0
0
1
0
0
0
0









Consideremos ahora las submatrices que están en una misma fila o en una misma
columna. Si nos fijamos en la posición de los puntos azules dentro de cada submatriz,
enseguida veremos que dichos puntos azules ocupan posiciones distintas en submatrices
distintas. Es más, si superponemos las matrices de una misma fila o columna, los puntos
azules recubren toda la matriz resultante, como muestra la Figura 2.23:
=⇒
Figura 2.23: Matrices de permutación correspondientes a la primera fila.
Observación 2.39 Las submatrices de una misma fila o columna forman una partición
de la matriz J.
Esta propiedad deberı́a recordarnos a la Proposición 1.5 del primer capı́tulo, que dice
que una partición de la matriz J en matrices de permutación puede escribirse como un
cuadrado latino. Por ejemplo, si a los puntos azules de cada submatriz les asignamos un
valor en función de la posición que ocupa el primero de ellos, obtenemos lo siguiente:



1
0
0
0
0
0
0
1
0
0
0
0
0
0
1
0
0
0
0
0
0
1
0
0
0
0
0
0
1
0
0
0
0
0
0
1
 
 
 
0
0
0
0
0
6
0
0
0
0
6
0
0
0
0
6
0
0
0
0
6
0
0
0
0
6
0
0
0
0
6
0
0
0
0
0
 
 
 
0
0
0
4
0
0
0
0
4
0
0
0
0
4
0
0
0
0
4
0
0
0
0
0
0
0
0
0
0
4
0
0
0
0
4
0
 
 
 
0
2
0
0
0
0
2
0
0
0
0
0
0
0
0
0
2
0
0
0
0
0
0
2
0
0
2
0
0
0
0
0
0
2
0
0
 
 
 
0
0
0
0
5
0
0
0
0
5
0
0
0
0
0
0
0
5
0
5
0
0
0
0
5
0
0
0
0
0
0
0
5
0
0
0
 
 
 
0
0
3
0
0
0
0
0
0
0
0
3
3
0
0
0
0
0
0
0
0
0
3
0
0
0
0
3
0
0
0
3
0
0
0
0



Figura 2.24: Matrices asociadas a cada matriz de permutación de la primera fila.
51
Si ahora superponemos estas submatrices, el resultado es un cuadrado latino:

⇐⇒
1
2
3
4
5
6








2
1
4
5
6
3
3
4
1
6
2
5
4
5
6
1
3
2
5
6
2
3
1
4
6
3
5
2
4
1









Figura 2.25: Cuadrado latino asociado a la primera fila de submatrices.
Observación 2.40 La partición que forman las submatrices de orden ∆ − 1 de un grafo de
Moore de grado ∆ pueden verse como un cuadrado latino obtenido de la siguiente forma:
Lj =
∆−1
X
ωi · Pij =
i=1
∆−1
X
ωi · Pji
(2.24)
i=1
donde ωi representa el ı́ndice de columna del punto azul de la primera fila de la matriz Pij .
Visto este resultado, ahora podemos escribir cada fila y cada columna de submatrices
a través de un cuadrado latino.
1
2
3
4
5
6
2
1
4
5
6
3
3
4
1
6
2
5
4
5
6
1
3
2
5
6
2
3
1
4
6
3
5
2
4
1
1
2
3
4
5
6
2
1
5
3
6
4
3
5
1
6
4
2
4
3
6
1
2
5
5
6
4
2
1
3
6
4
2
5
3
1
1
2
3
4
5
6
2
1
4
6
3
5
3
4
1
5
6
2
4
6
5
1
2
3
5
3
6
2
1
4
6
5
2
3
4
1
1
2
3
4
5
6
2
1
6
3
4
5
3
6
1
5
2
4
4
3
5
1
6
2
5
4
2
6
1
3
6
5
4
2
3
1
1
2
3
4
5
6
2
1
6
5
3
4
3
6
1
2
4
5
4
5
2
1
6
3
5
3
4
6
1
2
6
4
5
3
2
1
1
2
3
4
5
6
2
1
5
6
4
3
3
5
1
2
6
4
4
6
2
1
3
5
5
4
6
3
1
2
1
2
3
4
5
6
2
1
4
5
6
3
3
4
1
6
2
5
4
5
6
1
3
2
5
6
2
3
1
4
6
3
5
2
4
1
1
2
3
4
5
6
2
1
5
3
6
4
3
5
1
6
4
2
4
3
6
1
2
5
5
6
4
2
1
3
6
4
2
5
3
1
1
2
3
4
5
6
2
1
4
6
3
5
3
4
1
5
6
2
4
6
5
1
2
3
5
3
6
2
1
4
6
5
2
3
4
1
1
2
3
4
5
6
2
1
6
3
4
5
3
6
1
5
2
4
4
3
5
1
6
2
5
4
2
6
1
3
6
5
4
2
3
1
1
2
3
4
5
6
2
1
6
5
3
4
3
6
1
2
4
5
4
5
2
1
6
3
5
3
4
6
1
2
6
4
5
3
2
1
1
2
3
4
5
6
2
1
5
6
4
3
3
5
1
2
6
4
4
6
2
1
3
5
5
4
6
3
1
2
6
3
4
5
2
1
6
3
4
5
2
1
Figura 2.26: Cuadrados latinos asociados a la matriz de adyacencia.
52
Además, dado que las submatrices son simétricas, los cuadrados latinos serán los mismos
tanto por fila como por columna. Pero no sólo eso, porque los cuadrados latinos obtenidos
verifican la siguiente propiedad:
Observación 2.41 Los ∆ − 1 cuadrados latinos obtenidos son mútuamente r-ortogonales
con el siguiente grado de ortogonalidad:
r =∆−1+
(∆ − 3)2
2
(2.25)
Por ejemplo, si tomamos los dos primeros cuadrados latinos del grafo de HoffmanSingleton, vemos que tienen en común la matriz de permutación del 1 y del 6, por lo que
al superponerlos habrá las siguientes parejas distintas:
⎡
⎤
11 22 33 44 55 66
22 11 45 53 66 34 ⎥
⎥
⎥
33 45 11 66 24 52 ⎥
⎥
44 53 66 11 32 25 ⎥
⎥
⎥
55 66 24 32 11 43 ⎦
66 34 52 25 43 11
⎢
⎢
⎢
⎢
L1 ⊕ L 2 = ⎢
⎢
⎢
⎢
⎣
De forma similar a la definición de la matriz Pij , podemos definir la matriz Qij como
aquella matriz cuyos unos representan los puntos verdes. Por ejemplo,
⎡
⎢
⎢
⎢
⎢
Q34 = ⎢
⎢
⎢
⎣
1
1
1
1
0
1
1
1
1
1
1
0
1
1
1
0
1
1
1
1
0
1
1
1
0
1
1
1
1
1
1
0
1
1
1
1
⎤
⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎦
Evidentemente, se verifica que Pij + Qij = J, ∀ i, j. Con esta definición de la matriz Qij
podemos expresar la siguiente observación:
Observación 2.42 Las matrices Qij pueden determinarse de la forma siguiente:
Qij =
∆−1
Pik · Pkj
∀ i, j > 0, i = j
(2.26)
k=0
Por ejemplo, consideremos la matriz Q34 y veamos que es posible calcularla de la manera
siguiente:
⎡
⎤ ⎡
⎤
⎡
⎤
100000
⎢ 010000
⎢ 00 00 10 01 00 00
P30 · P04 = ⎢
⎣
⎡
⎢
⎢
P31 · P14 = ⎢
⎣
000010
000001
0
0
0
1
0
0
0
0
1
0
0
0
0
1
0
0
0
0
1
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
1
0
100000
100000
⎥ ⎢ 010000
⎥ ⎢ 001000
⎥×⎢ 000100
⎦ ⎣
⎥
⎢ 010000
⎥
⎢
⎥ = ⎢ 00 00 10 01 00 00
⎦
⎣
⎥
⎥
⎥
⎦
⎤
⎤
⎤
⎡
⎥ ⎢
⎥ ⎢
⎥×⎢
⎦ ⎣
53
000010
000001
0
1
0
0
0
0
1
0
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
1
0
0
1
0
0
0
0
0
0
1
0
0
⎡
⎥
⎢
⎥
⎢
⎥=⎢
⎦
⎣
000010
000001
0
0
1
0
0
0
0
0
0
1
0
0
0
0
0
0
0
1
0
0
0
0
1
0
0
1
0
0
0
0
1
0
0
0
0
0
⎥
⎥
⎥
⎦
⎡
⎢
⎢
P32 · P24 = ⎢
⎣
⎡
⎢
⎢
P33 · P34 = ⎢
⎣
⎡
⎢
⎢
P34 · P44 = ⎢
⎣
⎡
⎢
⎢
⎣
P35 · P54 = ⎢
⎡
⎢
⎢
P36 · P64 = ⎢
⎣
0
1
0
0
0
0
1
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
1
0
0
0
0
1
0
0
0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
1
0
0
0
1
0
0
0
0
1
0
0
0
1
0
0
0
0
0
0
1
0
0
0
0
0
0
1
0
0
0
0
0
0
0
1
0
1
0
0
0
0
0
0
0
0
0
0
1
0
1
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
1
0
0
0
1
0
0
0
0
0
0
1
0
0
1
0
0
0
0
0
0
1
0
0
0
1
0
0
0
0
0
⎤
⎡
⎥ ⎢
⎥ ⎢
⎥×⎢
⎦ ⎣
⎤
⎡
⎥ ⎢
⎥ ⎢
⎥×⎢
⎦ ⎣
⎤
⎡
⎥ ⎢
⎥ ⎢
⎥×⎢
⎦ ⎣
⎤
⎡
⎥ ⎢
⎥ ⎢
⎥×⎢
⎦ ⎣
⎤
⎡
⎥ ⎢
⎥ ⎢
⎥×⎢
⎦ ⎣
0
0
1
0
0
0
0
0
0
1
0
0
1
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
0
1
0
0
0
0
1
0
0
0
0
0
1
0
0
0
0
0
0
1
0
0
0
1
0
0
0
0
1
0
0
0
1
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
1
0
0
0
0
1
0
0
0
0
0
0
0
0
1
0
0
0
0
1
0
0
1
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
1
0
0
0
0
0
0
1
1
0
0
0
0
0
0
1
0
0
0
0
0
0
1
0
0
0
⎡
⎥
⎢
⎥
⎢
⎥=⎢
⎦
⎣
⎤
⎡
⎥
⎢
⎥
⎢
⎥=⎢
⎦
⎣
⎤
⎡
⎥
⎢
⎥
⎢
⎥=⎢
⎦
⎣
⎤
⎡
⎥
⎢
⎥
⎢
⎥=⎢
⎦
⎣
⎤
⎡
⎥
⎢
⎥
⎢
⎥=⎢
⎦
⎣
⎡
⎢
⎢
⎣
6
Q34 =
⎤
P3k · Pk4 = ⎢
k=1
0
0
0
0
0
1
0
0
0
0
1
0
0
1
0
0
0
0
1
0
0
0
0
0
0
0
1
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
1
0
0
0
0
0
0
0
0
0
1
0
0
1
0
0
0
0
0
0
0
0
0
1
0
0
1
0
0
0
0
1
0
0
0
0
0
0
1
0
0
0
1
0
0
0
0
0
0
0
0
0
0
1
0
0
0
1
0
0
0
0
0
0
1
0
1
1
1
1
0
1
1
1
1
1
1
0
1
1
1
0
1
1
1
1
0
1
1
1
0
1
1
1
1
1
1
0
1
1
1
1
⎤
⎥
⎥
⎥
⎦
⎤
⎥
⎥
⎥
⎦
⎤
⎥
⎥
⎥
⎦
⎤
⎥
⎥
⎥
⎦
⎤
⎥
⎥
⎥
⎦
⎤
⎥
⎥
⎥
⎦
La Observación 2.42 es importante por dos razones:
1) Permite determinar qué puntos verdes aparecen al colocar nuevos puntos azules.
2) Permite restringir la búsqueda de una matriz Pij a aquellas que sean compatibles con
una matriz Qij dada.
Conjetura 2.43 Los cuadrados latinos que aparecen en la forma canónica de la matriz de
adyacencia de los grafos de Moore son equivalentes entre ellos, y la relación que rige dicha
equivalencia es la siguiente:
Li ∼ Pij · Lj · Pj i
∀ i, j
(2.27)
Por ejemplo, podemos escribir el cuadrado latino L2 en función de L5 :
⎡
⎢
⎢
⎣
L2 = P25 · L5 · P52 = ⎢
0
0
0
1
0
0
0
0
0
0
0
1
0
0
0
0
1
0
1
0
0
0
0
0
0
0
1
0
0
0
⎤ ⎡
0
1
0
0
0
0
⎥ ⎢
⎥ ⎢
⎥·⎢
⎦ ⎣
1
2
3
4
5
6
2
1
6
5
3
4
3
6
1
2
4
5
4
5
2
1
6
3
5
3
4
6
1
2
⎤ ⎡
6
4
5
3
2
1
⎥ ⎢
⎥ ⎢
⎥·⎢
⎦ ⎣
0
0
0
1
0
0
0
0
0
0
0
1
0
0
0
0
1
0
1
0
0
0
0
0
0
0
1
0
0
0
0
1
0
0
0
0
⎤
⎡
⎥
⎢
⎥
⎢
⎥=⎢
⎦
⎣
1
3
6
4
2
5
3
1
2
6
5
4
6
2
1
5
4
3
4
6
5
1
3
2
2
5
4
3
1
6
5
4
3
2
6
1
⎤
⎥
⎥
⎥
⎦
El cuadrado latino L2 no está normalizado. Si lo normalizamos, entonces obtenemos el
cuadrado latino L2 , que es el que se corresponde con la definición que hemos dado.
⎡
⎢
⎢
L2 = ⎢
⎣
1
3
6
4
2
5
3
1
2
6
5
4
6
2
1
5
4
3
4
6
5
1
3
2
2
5
4
3
1
6
5
4
3
2
6
1
⎤
⎡
⎥
⎢
⎥
⎢
⎥∼⎢
⎦
⎣
54
1
2
3
4
5
6
2
1
5
3
6
4
3
5
1
6
4
2
4
3
6
1
2
5
5
6
4
2
1
3
6
4
2
5
3
1
⎤
⎥
⎥
⎥ = L2
⎦
Si se verifica la conjetura 2.43, entonces los ∆ − 1 cuadrados latinos que aparecen en la
matriz de adyacencia de un grafo de Moore están determinados a partir de uno de ellos.
Por consiguiente, un algoritmo para buscar dichos cuadrados latinos podrı́a ser el siguiente:
Se genera un cuadrado latino simétrico de orden ∆ − 1.
Se determinan los ∆ − 2 cuadrados latinos restantes según la Conjetura 2.43.
Se colocan los cuadrados latinos dentro de la forma canónica de la matriz de adyacencia. Si no aparecen conflictos, entonces se ha completado El Gran Grafo de Moore.
En caso contrario, se prueba con otro cuadrado latino.
Evidentemente, el número de cuadrados latinos simétricos de orden 56 es muy grande,
del orden de 101508 . Por lo tanto, probarlos todos sigue siendo inasumible. No obstante,
si consideramos el tamaño que tenı́a inicialmente el problema de encontrar El Gran Grafo
de Moore y lo comparamos con el tamaño que tendrı́a si la Conjetura 2.43 fuese cierta,
entonces la mejora obtenida es considerable. Un análisis como este es el que se presenta en
la siguiente sección.
2.6.4.
Análisis del tamaño del problema
Para hacernos una idea de la mejora que conlleva trabajar con cuadrados latinos a
la hora de construir El Gran Grafo de Moore, echemos un vistazo al tamaño inicial del
problema y a las sucesivas mejoras que se han ido proponiendo. Para ello, supongamos que
queremos encontrar El Gran Grafo de Moore mediante fuerza bruta, es decir, probando
todas las posibilidades. Podemos plantearnos las siguientes estrategias:
Si consideramos que la matriz de adyacencia debe ser una matriz binaria de orden
3250, entonces tenemos las siguientes posibilidades:
2
23250 103179629
Si además imponemos que la matriz de adyacencia debe ser simétrica, podemos reducir las posibilidades a la mitad:
23250
2 /2
101589814
Si consideramos que en cada fila sólo puede haber 57 unos, entonces tenemos lo
siguiente:
3250
3250
10400904
57
Imponemos de nuevo la condición de simetrı́a, obtenemos la mitad de posibilidades:
3250
57
3250/2
10200452
Si consideramos la matriz de adyacencia en su forma canónica, entonces podemos
eliminar las primeras 114 filas, por lo que sólo habrá que colocar 55 unos por fila a
lo largo de las 3136 filas restantes:
3136
55
3250/2
55
10186577
Si consideramos que cada submatriz 56 × 56 es una matriz de permutación y que hay
1540 de ellas, entonces:
(56!)1540 10115272
Si consideramos que cada fila de submatrices es un cuadrado latino simétrico de orden
56, entonces:
56
NS (56)56 = (101508 ) 1084448
Finalmente, si consideramos que la Conjetura 2.43 es cierta, entonces el número de
posibilidades que hay que probar es el siguiente:
NS (56) 101508
Para determinar el avance en la resolución del problema que ha significado la realización
de esta tesina, hay que considerar la mejora obtenida a partir de la utilización de la forma
canónica de la matriz de adyacencia. Es decir, se ha reducido el problema de 10200452 casos
posibles a 101508 . Esta mejora es, sin ninguna duda, muy significativa.
No obstante, probar los 101508 casos sigue siendo inimaginable mediante los ordenadores actuales. Por lo tanto, será necesario encontrar más propiedades sobre la matriz de
adyacencia de los grafos de Moore antes de poder resolver el problema.
2.6.5.
Porcentajes de completitud
Una manera de cuantificar lo cerca o lejos que estamos de obtener un grafo de Moore
consiste en calcular el porcentaje de completitud, es decir, la relación entre el número de
ramas colocadas y la cota de Moore.
Se han realizado algunos ensayos para determinar los porcentajes de completitud que
se obtienen al rellenar la matriz de adyacencia del grafo de Moore mediante varios patrones
regulares. Estos son los resultados obtenidos:
Patrón de relleno
Ramas Completitud
Row Sweep
48.577
52,44 %
Column Sweep
48.577
52,44 %
Diagonal Sweep
50.973
55,03 %
Canonic Form + Row Sweep
48.577
52,44 %
Canonic Form + Column Sweep
48.577
52,44 %
Canonic Form + Diagonal Sweep
48.830
52,72 %
Petersen Pattern + Row Sweep
47.259
51,02 %
Petersen Pattern + Column Sweep
48.120
51,95 %
Petersen Pattern + Diagonal Sweep
50.952
55,01 %
Hoffman-Singleton Pattern + Row Sweep
47.395
51,17 %
Hoffman-Singleton Pattern + Column Sweep
48.984
52,88 %
Hoffman-Singleton Pattern + Diagonal Sweep 50.737
54,78 %
Cuadro 2.5: Porcentajes de completitud obtenidos.
Como puede observarse, todos los patrones ensayados dan un porcentaje de completitud similar, alrededor del 50 % del grafo. Sin embargo, podemos intentar mejorar estos
resultados de la siguiente manera.
56
Al rellenar la matriz de adyacencia mediante un patrón determinado, se prueban todas
las casillas de la matriz y se colocan unos en aquéllas que lo permiten. Evidentemente,
algunos de esos unos estarán en una posición “correcta” (es decir, no crearán conflictos) y
otros no.
Una manera un poco más “inteligente” de colocar los unos consiste en lo siguiente:
antes de colocar un 1, existe un cierto número de casillas vacantes, es decir, casillas en
las que es posible colocar ese 1. Después de colocar el 1, el número de casillas vacantes es
forzosamente menor, aunque la reducción en el número de casillas vacantes depende de la
posición en la que se ha colocado el 1. Si se ha escogido una posición “buena”, la reducción
del número de vacantes es menor que si se ha escogido una posición “mala”.
Por lo tanto, antes de colocar un 1, podemos probar de colocarlo en todas las posiciones
posibles y calcular las vacantes restantes en cada uno de los casos. Luego colocaremos
definitivamente ese uno en una de las posiciones que ofrezca una reducción de las vacantes
menor.
El problema inherente en este método es que para colocar un 1 hay que comprobar
primero todas las casillas posibles, lo cual supone una carga de cálculo muy grande. Además,
suele pasar que para colocar un mismo 1 hay múltiples posiciones que ofrecen la mı́nima
reducción en el número de vacantes, por lo que es necesario introducir un cierto factor de
aleatoriedad en el algoritmo.
57
Capı́tulo 3
Algoritmos
3.1.
Generación de Cuadrados Latinos
En esta sección se describen los algoritmos utilizados para la generación de cuadrados
latinos mediante un ordenador.
Debido a que el número de cuadrados latinos crece muy rápidamente con el orden, se
ha realizado un gran esfuerzo en optimizar el código. Por esta razón, los algoritmos de esta
sección están escritos en lenguaje C++.
3.1.1.
SLSG: Symmetric Latin Square Generator
SLSG permite generar todos los cuadrados latinos simétricos normalizados de un orden
dado. Este programa se ha utilizado para determinar los valores LS (n) del primer capı́tulo.
A continuación se describe el funcionamiento del programa SLSG.
Cabecera
#include <fstream.h>
#include <time.h>
#define Order 8
unsigned char FreeCell[Order][Order+1];
unsigned char LatinSquare[Order][Order];
long TotalSquares, Start;
void Initialize();
bool UpdateSquare(int r, int c);
void CompleteSquare(int r, int c);
La cabecera del programa contiene, por este orden, las instrucciones para cargar las
librerı́as externas fstream.h y time.h, la declaración de las variables globales FreeCell,
LatinSquare, TotalSquares, y Start y la definición de los procedimientos Initialize,
UpdateSquare y CompleteSquare usados por el cuerpo principal del programa.
58
main()
void main() {
Initialize();
CompleteSquare(0,0);
do {
TotalSquares++;
CompleteSquare(Order-1,Order-1); }
while (LatinSquare[0][Order-1]==Order);
cout << "Total squares of order " << Order << ": " << TotalSquares << endl;
cout << "Computed in " << difftime(time(NULL),Start) << " seconds." << endl; }
El procedimiento main() contiene el cuerpo principal del programa. Dicho cuerpo se
compone de las siguientes órdenes:
Llamada a Initialize().
Llamada a CompleteSquare(0,0).
Inicio del bucle
• Incremento del contador TotalSquares.
• Llamada a CompleteSquare(n-1,n-1).
Fin del bucle cuando se obtiene el primer cuadrado latino no normalizado.
Initialize()
void Initialize() {
TotalSquares=0;
for (int i=0; i<Order; i++) {
for (int j=0; j<Order; j++) {
FreeCell[i][j]=0;
LatinSquare[i][j]=0;
FreeCell[i][Order]=0; } }
Start=time(NULL); }
El procedimiento Initialize() se encarga de inicializar las variables globales a cero.
Dichas variables son las siguientes:
TotalSquares es un contador que almacena el número de cuadrados latinos que se
han generado hasta el momento.
LatinSquare[i][j] es una matriz n × n que almacena la información del cuadrado
latino. Cada posición (i, j) contiene un valor entre 0 y n. El valor 0 indica que la
posición (i, j) está vacı́a, mientras cualquier otro valor indica que la posición (i, j)
está ocupada por el valor en cuestión.
FreeCell[i][j] es una matriz binaria n × (n + 1) que permite hacer un seguimiento
de los elementos del cuadrado latino que están presentes en cada fila y columna. La
posición (i, j) contiene un 1 si la fila o la columna i del cuadrado latino contiene el
valor j, y un 0 en caso contrario.
Start almacena el valor del cronómetro del ordenador para determinar el tiempo de
ejecución del programa.
59
UpdateSquare(r,c)
bool UpdateSquare(int r, int c) {
FreeCell[r][LatinSquare[r][c]]=FreeCell[c][LatinSquare[r][c]]=0;
for (int i=LatinSquare[r][c]+1; i<Order+1; i++) {
if (FreeCell[r][i]+FreeCell[c][i]==0) {
LatinSquare[r][c]=LatinSquare[c][r]=i;
FreeCell[r][i]=FreeCell[c][i]=1;
return true; } }
LatinSquare[r][c]=LatinSquare[c][r]=0;
return false; }
La función UpdateSquare(r,c) comprueba si es posible sustituir el valor x de la posición
(r, c) por un valor y entre x + 1 y n. Si es posible, hace la sustitución y devuelve el valor
true. En caso contrario, libera la posición (r, c) y devuelve el valor false.
CompleteSquare(r,c)
void CompleteSquare(int r, int c) {
while (r<Order) {
if (UpdateSquare(r,c)==true)
if (c==Order-1) {
r++;
c=r; }
else c++;
else if (c==r) {
r--;
c=Order-1; }
else c--; } }
El procedimiento CompleteSquare(r,c) completa el cuadrado latino a partir de la
posición (r, c) mediante llamadas sucesivas al procedimiento UpdateSquare(r,c). Este
procedimiento presenta una doble función:
Si el cuadrado latino está vacı́o, CompleteSquare(0,0) devuelve el primer cuadrado
latino simétrico de orden n.
Si el cuadrado latino está completo, CompleteSquare(n-1,n-1) devuelve el siguiente
cuadrado latino simétrico de orden n.
3.1.2.
PLSC: Partial Latin Square Completer
PLSC permite encontrar el primer cuadrado latino que verifica una serie de condiciones.
Una utilidad inmediata de PLSC es la de completar cuadrados latinos, es decir, fijados
algunos elementos un cuadrado latino el programa determina el resto.
A continuación se describe el funcionamiento del programa PLSC.
60
Cabecera
//
//
//
//
PLSC: Partial Latin Square Completer
====================================
Finds the first ocurrence that completes
a partially filled latin square.
#include <fstream.h>
#include <time.h>
#define Order 8
int LatinSquare[Order][Order][Order];
long Start;
void
bool
bool
void
void
Initialize();
FillSquare(int s);
NextSquare(int r, int c, int s);
UpdateSquare(int r, int c, int s);
ShowSquare(int s);
La cabecera del programa contiene, por este orden, las instrucciones para cargar las librerı́as externas fstream.h y time.h, la declaración de las variables globales LatinSquare
y Start, y la definición de los procedimientos Initialize, FillSquare, NextSquare,
UpdateSquare y ShowSquare usados por el cuerpo principal del programa.
main()
void main () {
Initialize();
for (int i=1; i<Order; i++) {
if (!FillSquare(i)) {
cout << "Fail!" << endl;
break; }
cout << "Step " << i << endl;
ShowSquare(i); }
cout << "Done in " << difftime(time(NULL),Start) << " seconds." << endl; }
El procedimiento main() contiene el cuerpo principal del programa. Dicho cuerpo se
compone de las siguientes órdenes:
Llamada a Initialize().
Inicio del bucle
• Si la llamada al procedimiento FillSquare(i) fracasa, significa que no es posible
completar el cuadrado latino, por lo que se detiene la ejecución del programa.
• Llamada a ShowSquare(i).
Fin del bucle cuando se completa el cuadrado latino.
61
Initialize()
void Initialize() {
for (int i=0; i<Order; i++) {
for (int j=0; j<Order; j++) {
for (int k=0; k<Order; k++) {
LatinSquare[i][j][k]=0; } } }
for (int i=0; i<Order; i++) {
UpdateSquare(i,i,0); }
Start=time(NULL); }
El procedimiento Initialize() se encarga de inicializar las variables globales. Dichas
variables son las siguientes:
LatinSquare[i][j][k] es una tensor n × n × n que almacena la información del
cuadrado latino. Cada posición (i, j, k) contiene un valor 0 o 1 dependiendo si la
posición (i, j) del cuadrado latino contiene el sı́mbolo k o no.
Start almacena el valor del cronómetro del ordenador para determinar el tiempo de
ejecución del programa.
FillSquare()
bool FillSquare(int s) {
int i=0, r=0;
while (r<Order) {
if (NextSquare(r,i,s)) {
i=0;
r++; }
else if (r>0) {
r--;
for (i=0; i<Order; i++) {
if (LatinSquare[r][i][s]==1) break; } }
else if (s>1) {
s--;
r=Order-1;
for (i=0; i<Order; i++) {
if (LatinSquare[r][i][s]==1) break; } }
else
return false; }
return true; }
El procedimiento FillSquare() se encarga de rellenar el cuadrado latino con el sı́mbolo
s. Para ello, se recorren todas las filas intentando colocar el sı́mbolo s en alguna de sus
columnas. Cuando no es posible colocar el sı́mbolo en una fila, se realiza un backtracking y
se sigue probando. Si se agotan todas las posibilidades, entonces no es posible completar el
cuadrado latino y se duevuelve el valor false. Si el procedimiento se completa con éxito,
entonces se devuelve el valor true.
62
NextSquare()
bool NextSquare(int r, int c, int s) {
if (LatinSquare[r][c][s]==1) {
UpdateSquare(r,c,s);
if (c<Order) c++;
else return false; }
for (int i=c; i<Order; i++) {
if (LatinSquare[r][i][s]==0) {
UpdateSquare(r,i,s);
return true; } }
return false; }
El procedimiento NextSquare() comprueba si es posible reubicar el 1 en la posición
(r, c, s) en otra posición (r, y, s) con c < y ≤ n. Si es posible, se realiza la sustitución y se
devuelve el valor true. En caso contrario, se devuelve el valor false.
UpdateSquare()
void UpdateSquare(int r, int c, int s) {
if (LatinSquare[r][c][s]==0) {
for (int i=0; i<Order; i++) {
LatinSquare[i][c][s]=LatinSquare[i][c][s]+2;
LatinSquare[r][i][s]=LatinSquare[r][i][s]+2;
LatinSquare[r][c][i]=LatinSquare[r][c][i]+2; }
LatinSquare[r][c][s]=1; }
else {
for (int i=0; i<Order; i++) {
LatinSquare[i][c][s]=LatinSquare[i][c][s]-2;
LatinSquare[r][i][s]=LatinSquare[r][i][s]-2;
LatinSquare[r][c][i]=LatinSquare[r][c][i]-2; }
LatinSquare[r][c][s]=0; } }
El procedimiento UpdateSquare() se encarga de actualizar la posición (r, c, s) del cuadrado latino. Si en esa posición hay un 0, entonces se coloca un 1, y si hay un 1, entonces
se coloca un 0. En ambos casos se actualiza el resto de celdas para reflejar dicho cambio.
3.1.3.
RLSG: Random Latin Square Generator
RLSG permite generar aleatoriamente cuadrados latinos de un orden dado. Los cuadrados latinos obtenidos mediante RLSG tiene una distribución uniforme en el espacio de los
cuadrados latinos de mismo orden.
El algoritmo que se describe a continuación es una adaptación del método propuesto
por Jacobson y Matthews en [6] para generar cuadrados latinos aleatorios y uniformemente
distribuidos.
63
Cabecera
//
//
//
//
RLSG: Random Latin Square Generator
===================================
Generates a random latin square which distribution is
uniform over the space of latin squares of a given order.
#include <fstream.h>
#include <stdlib.h>
#define Order 56
unsigned char LatinSquare[Order][Order];
void
void
void
void
Initialize();
MutateSquare1(int r, int c, int s);
MutateSquare2(int r, int c, int s, int p);
ShowSquare();
La cabecera del programa contiene, por este orden, las instrucciones para cargar las librerı́as externas fstream.h y stdlib.h, la declaración de la variable global LatinSquare, y
la definición de los procedimientos Initialize, MutateSquare1, MutateSquare1 y ShowSquare
usados por el cuerpo principal del programa.
main()
void main () {
Initialize();
for (int i=0; i<Order*Order; i++) {
MutateSquare1(rand()%Order,rand()%Order,rand()%Order+1); }
ShowSquare(); }
El procedimiento main() contiene el cuerpo principal del programa. Dicho cuerpo se
compone de las siguientes órdenes:
Llamada a Initialize().
Inicio del bucle
• Llamada a MutateSquare1(r,c,s).
Fin del bucle cuando se alcanza la i-éssima iteración.
Llamada a ShowSquare().
Initialize()
void Initialize() {
srand(time(NULL));
for (int i=0; i<Order; i++) {
for (int j=0; j<Order; j++) {
LatinSquare[i][j]=(Order-i+j)%Order+1; } } }
El procedimiento Initialize() se encarga de inicializar el generador de números aleatorios y rellenar el primer cuadrado latino.
64
MutateSquare1(r,c,s)
void MutateSquare1(int r, int
int r1,c1;
for (int i=0; i<Order; i++)
if (LatinSquare[r][i]==s)
if (LatinSquare[i][c]==s)
c, int s) {
{
c1=i;
r1=i; }
int s1=LatinSquare[r][c];
LatinSquare[r][c]=s;
LatinSquare[r][c1]=LatinSquare[r1][c]=s1;
if (LatinSquare[r1][c1]==s1) LatinSquare[r1][c1]=s;
else MutateSquare2(r1,c1,s,s1); }
El procedimiento MutateSquare1(r,c,s) contiene la primera parte del código para
aplicar un pequeño cambio al cuadrado latino en memoria. Partiendo de un cuadrado
latino propio, la llamada al procedimiento MutateSquare1(r,c,s) sustituye el elemento
en la posición (r,c) por el sı́mbolo s. Si el elemento en la posición (r,c) es distinto de
s, entonces el cuadrado latino resultante es un cuadrado latino impropio y es necesaria
una llamada al procedimiento MutateSquare2(r,c,s,p) para obtener un cuadrado latino
propio de nuevo.
MutateSquare2(r,c,s,p)
void MutateSquare2(int r, int
int r1,c1;
for (int i=0; i<Order; i++)
if (LatinSquare[r][i]==p)
if (LatinSquare[i][c]==p)
c, int s, int p) {
{
c1=i;
r1=i; }
int r2=r1;
int c2=c1;
for (int i=0; i<Order; i++) {
if (LatinSquare[r][i]==p && i!=c1) c2=i;
if (LatinSquare[i][c]==p && i!=r1) r2=i; }
if (rand()%2==0) r1=r2;
if (rand()%2==0) c1=c2;
int s1=LatinSquare[r][c];
if (LatinSquare[r1][c1]==s) {
LatinSquare[r][c1]=LatinSquare[r1][c]=s;
LatinSquare[r1][c1]=p; }
else if (LatinSquare[r1][c1]==s1) {
LatinSquare[r][c1]=LatinSquare[r1][c]=s1;
LatinSquare[r][c]=s;
LatinSquare[r1][c1]=p; }
else {
s1=LatinSquare[r1][c1];
LatinSquare[r1][c1]=p;
LatinSquare[r][c1]=LatinSquare[r1][c]=s1;
MutateSquare2(r,c,s,s1); } }
El procedimiento MutateSquare2(r,c,s,p) contiene la segunda parte del código para
aplicar un pequeño cambio al cuadrado latino en memoria. Partiendo de un cuadrado latino impropio, la llamada al procedimiento MutateSquare2(r,c,s,p) realiza las siguientes
operaciones:
65
Se localizan las ocurrencias del sı́mbolo impropio p en la fila r y la columna c.
Se escoge al azar una ocurrencia del sı́mbolo p en la fila r y otra en la columna c.
Se realiza el pequeño cambio. Si el cuadrado latino resultante es propio, se finaliza el
procedimiento. En caso contrario, se llama de nuevo al procedimiento MutateSquare2.
ShowSquare()
void ShowSquare() {
for (int i=0; i<Order; i++) {
for (int j=0; j<Order; j++) {
if (Order>10 && LatinSquare[i][j]<10) cout << "0";
cout << int(LatinSquare[i][j]); }
cout << endl; } }
El procedimiento ShowSquare() muestra el cuadrado latino almacenado en la memoria
por pantalla.
3.2.
Construcción de Grafos de Moore
En esta sección se describen los algoritmos utilizados para la construcción de grafos
de Moore que se hallan implementados en la aplicación The Biggest Moore Graph (TBMG).
Dicha aplicación se presenta en dos versiones, una escrita en C++ y la otra en Visual Basic.
Ambas versiones se describen a continuación.
3.2.1.
TBMG: The Biggest Moore Graph (versión C++)
La versión C++ de la aplicación TBMG no tiene interfaz gráfico y sirve para realizar
ensayos sobre los grafos de Moore y obtener los porcentajes de completitud. Su estructura
es la siguiente.
Cabecera
#include <fstream.h>
#include <stdlib.h>
#include <time.h>
#define Degree 57
const int Limit=2*Degree;
const int Size=Degree*Degree+1;
unsigned char Matrix[Size][Size];
long Start;
void
void
bool
long
void
void
void
void
void
Initialize();
UpdateMatrix(int r, int c);
Vacant(int r, int c);
Vacancies();
FillBox(int n);
SmartPattern(int p);
SmartFill(int n);
SmartUnFill(int n);
ShowSummary();
66
La cabecera del programa contiene, por este orden, las instrucciones para cargar las
librerı́as externas fstream.h, stdlib.h y time.h, la declaración de las variables globales
LatinSquare y Start, y la definición de los procedimientos Initialize, UpdateMatrix,
Vacant, Vacancies, FillBox, SmartPattern, SmartFill. SmartunFill y ShowSummary
usados por el cuerpo principal del programa.
main()
void main () {
Initialize();
SmartPattern(3);
int i=0;
do {
SmartUnFill(10);
do {
SmartFill(10); }
while (Vacancies()>0);
ShowSummary(); }
while (i++<100);
ShowSummary(); }
En el caso de TBMG, el procedimiento main() resulta ser flexible, ya que hay que adaptarlo cada vez al patrón de relleno que se desee probar. Un ejemplo de un patrón de relleno
bastante completo puede ser el que aparece más arriba, el cual consiste en un primer barrido
diagonal y una posterior combinación de las técnicas SmartFill y SmartUnFill.
Initialize()
void Initialize() {
Start=time(NULL);
srand(time(NULL));
for (int r=0; r<Size; r++) {
for (int c=0; c<Size; c++) {
Matrix[r][c]=0; } } }
El procedimiento Initialize() se encarga de inicializar las variables globales. Dichas
variables son las siguientes:
Matrix[i][j] es una variable que almacena la matriz de adyacencia del grafo de
Moore definida como A1 + 2A2 .
Size es una constante que almacena el orden del grafo de Moore, y por lo tanto el
de su matriz de adyacencia.
Degree es una constante que almacena el grado del grafo.
Limit es una constante que se utiliza para verificar que todos los vértices tengan el
grado del grafo de Moore, aunque por razones prácticas, su valor es el doble del del
grado.
Start almacena el valor del cronómetro del ordenador para determinar el tiempo de
ejecución del programa.
67
UpdateMatrix()
void UpdateMatrix(int r, int c) {
if (Matrix[r][c]%2==0) {
Matrix[r][c]=Matrix[c][r]+=1;
for (int i=0; i<Size; i++) {
if (Matrix[r][i]%2==1) Matrix[c][i]=Matrix[i][c]+=2;
if (Matrix[c][i]%2==1) Matrix[r][i]=Matrix[i][r]+=2; } }
else {
for (int i=0; i<Size; i++) {
if (Matrix[r][i]%2==1) Matrix[c][i]=Matrix[i][c]-=2;
if (Matrix[c][i]%2==1) Matrix[r][i]=Matrix[i][r]-=2; }
Matrix[r][c]=Matrix[c][r]-=1; } }
El procedimiento UpdateMatrix es quizá el corazón de la aplicación TMBG. Mediante
este procedimiento se realizan todos los cambios a la matriz de adyacencia del grafo de
Moore. Estos cambios pueden ser dos:
Cuando la posición (r, c) de la matriz de adyacencia contiene un 0, lo cual significa
que no hay ninguna rama que una los vértices r y c, entonces se sustituye por un 1 y
se actualizan las posiciones donde aparece un 2, que son aquellas parejas de vértices
que quedan unidos por un camino de longitud 2.
Cuando la posición (r, c) de la matriz de adyacencia contiene un 1 se realiza el proceso
inverso, es decir, se sustituye el 1 por un 0 y se eliminan los doses correspondientes.
Nótese que mediante este algoritmo no es necesario calcular la matriz A2 para determinar los caminos de longitud 2, sino que basta con actualizar aquellas posiciones donde se
produce el cambio. Esto reduce significativamente el número de operaciones que hay que
realizar a cada cambio, lo cual se traduce en un aumento notorio de la velocidad de cálculo.
Vacant()
bool Vacant(int r, int c) {
if (Matrix[r][c]>0 || Matrix[r][r]==Limit || Matrix[c][c]==Limit) return false;
for (int i=0; i<Size; i++) {
if (Matrix[r][i]*Matrix[c][i]==2) return false; }
return true; }
La función Vacant verifica si es posible colocar un 1 en la posición (r, c) de la matriz
de adyacencia sin que aparezca ningún conflicto.
Vacancies()
long Vacancies() {
long count=0;
for (int r=0; r<Size; r++) {
for (int c=r; c<Size; c++) {
if (Vacant(r,c)) count++; } }
return count; }
La función Vacancies devuelve el número de posiciones (r, c) en la matrix de adyacencia donde es posible colocar un 1 sin que aparezcan conflictos. Esta función se utiliza
para determinar el número de posiciones vacantes en la matriz de adyacencia, que no es
necesariamente el número de casillas que contienen un 0.
68
SmartPattern()
El procedimiento SmartPattern contiene una serie de patrones para rellenar el grafo
de Moore. Estos patrones son los siguientes:
SP0 - Forma canónica: este patrón construye la fórma canónica de la matriz de
adyacencia de un grafo de Moore.
for (int c=1; c<Degree+1; c++) {
UpdateMatrix(0,c); }
for (int r=1; r<Degree+1; r++) {
for (int c=2; c<Degree+1; c++) {
UpdateMatrix(r,r*(Degree-1)+c); } }
for (int r=Degree+1; r<Limit; r++) {
for (int c=1; c<Degree; c++) {
UpdateMatrix(r,r+c*(Degree-1)); } }
SP1 - Barrido por filas: este patrón realiza un barrido de todas las filas de la
matriz de adyacencia colocando un 1 en aquellas posiciones vacantes.
for (int r=0; r<Size; r++) {
for (int c=r+1; c<Size; c++) {
if (Vacant(r,c)) UpdateMatrix(r,c); } }
SP2 - Barrido por columnas: este patrón realiza un barrido de todas las columnas
de la matriz de adyacencia colocando un 1 en aquellas posiciones vacantes.
for (int c=0; c<Size; c++) {
for (int r=0; r<c; r++) {
if (Vacant(r,c)) UpdateMatrix(r,c); } }
SP3 - Barrido por diagonales: este patrón realiza un barrido de todas las diagonales de la matriz de adyacencia colocando un 1 en aquellas posiciones vacantes.
for (int r=1; r<Size; r++) {
for (int c=r; c<Size; c++) {
if (Vacant(c-r,c)) UpdateMatrix(c-r,c); } }
SP4 - Patrón de Petersen: este patrón rellena mediante el grafo de Petersen las
submatrices 10 × 10 de la diagonal de la matriz de adyacencia.
for (int r=0; r<Size; r++) {
if (r%5!=4) UpdateMatrix(r,r+1);
else UpdateMatrix(r-4,r); }
for (int r=0; r<Size-5; r=r+10) {
for (int c=0; c<5; c++) {
UpdateMatrix(r+c,r+(2*c)%5+5); } }
SP5 - Patrón de Hoffman-Singleton: este patrón rellena mediante el grafo de
Hoffman-Singleton las submatrices 50 × 50 de la diagonal de la matriz de adyacencia.
for (int r=0; r<Size; r++) {
if (r%5!=4) UpdateMatrix(r,r+1);
else UpdateMatrix(r-4,r); }
for (int i=0; i<Size; i=i+50) {
for (int j=0; j<50; j=j+5) {
for (int k=45-5*(j%2); k>j; k=k-10) {
for (int r=0; r<5; r++) {
for (int c=0; c<5; c++) {
if (Vacant(i+j+r,i+k+c)) UpdateMatrix(i+j+r,i+k+c); } } } } }
69
FillBox()
void FillBox(int n) {
for (int i=1; i<Size; i=i+n) {
for (int j=i; j<Size; j=j+n) {
for (int r=0; r<n; r++) {
for (int c=0; c<n; c++) {
if (Vacant(j-i+r,j+c)) UpdateMatrix(j-i+r,j+c); } } } } }
El procedimiento FillBox realiza un barrido mediante submatrices n × n de la matriz
de adyacencia colocando un 1 en aquellas posiciones vacantes.
SmartFill()
void SmartFill(int n) {
long p1,p2,v1,v2;
long ListCount=0;
int ListRow[Degree*Size/2];
int ListCol[Degree*Size/2];
for (int r=0; r<Size; r++) {
for (int c=r+1; c<Size; c++) {
if (Vacant(r,c)) {
ListRow[ListCount]=r;
ListCol[ListCount]=c;
ListCount++; } } }
p1=(rand()*(RAND_MAX+1)+rand())%ListCount;
UpdateMatrix(ListRow[p1],ListCol[p1]);
v1=Vacancies();
UpdateMatrix(ListRow[p1],ListCol[p1]);
for (int i=0; i<n; i++) {
p2=(rand()*(RAND_MAX+1)+rand())%ListCount;
UpdateMatrix(ListRow[p2],ListCol[p2]);
v2=Vacancies();
UpdateMatrix(ListRow[p2],ListCol[p2]);
if (v2>v1) p1=p2; }
UpdateMatrix(ListRow[p1],ListCol[p1]); }
El procedimiento SmartFill tiene un funcionamiento sencillo:
Se realiza una lista de las posiciones vacantes en la matriz de adyacencia.
Se prueban al azar n posiciones de la lista y se conserva aquélla que minimice la
reducción de posiciones vacantes.
SmartUnFill()
El funcionamiento del procedimiento SmartUnFill es muy parecido al del procedimiento SmartFill. La única diferencia en el código consiste en la sustitución de la lı́nea
if(Vacant(r,c)) por if(Matrix[r][c]==1). Básicamente, en vez de rellenar la lista con
las posiciones vacantes, se rellena con aquéllas que contienen un 1, de manera que al ejecutar SmartUnFill se prueban al azar n posiciones y se libera aquélla que maximiza el
aumento de posiciones vacantes.
70
ShowSummary()
void ShowSummary() {
long Zero=0, One=0, Two=0, Other=0;
for (int r=0; r<Size; r++) {
for (int c=r+1; c<Size; c++) {
switch (Matrix[r][c]) {
case 0: Zero++; break;
case 1: One++; break;
case 2: Two++; break;
default: Other++; } } }
cout << "Summary:" << endl;
cout << " #(0) = " << 2*Zero << endl;
cout << " #(1) = " << 2*One << " (of " << Size*Degree << ")" << endl;
cout << " #(2) = " << 2*Two << " (of " << Size*(Size-Degree-1) << ")" << endl;
cout << "Other = " << 2*Other << endl << endl; }
El procedimiento ShowSummary realiza un recuento de las posiciones de la matriz de
adyacencia que contienen un 0, un 1 o un 2, y calcula el porcentaje de completitud del
grafo.
3.2.2.
TBMG: The Biggest Moore Graph (versión Visual Basic)
La versión Visual Basic de la aplicación TBMG está dotada de un interfaz gráfico que
permite interactuar de forma visual con la matriz de adyacencia de los grafos de Moore.
El funcionamiento de la aplicación TBMG se encuentra detallado en el manual del usuario,
mientras que el código fuente puede consultarse en el Apéndice 1.
71
Conclusiones
El problema de construir El Gran Grafo de Moore es un problema inmenso, hecho que
hace inviable cualquier intento de resolverlo a través de los métodos llamados “de fuerza
bruta”. Sin embargo, hemos visto que mediante el estudio de los grafos de Petersen y
Hoffman-Singleton es posible inferir propiedades sobre el El Gran Grafo de Moore que
permiten reducir significativamente el tamaño del problema.
Con esta tesina se pretende, por una parte, ofrecer un documento de referencia a futuros
investigadores que deseen continuar con la búsqueda de “el monstruo”, y por otra, facilitar
algunas herramientas informáticas que agilicen dicha tarea. Eventualmente, los estudios
sobre las propiedades de El Gran Grafo de Moore harán viable su resolución mediante un
ordenador. En ese momento el esfuerzo que ha significado la realización de esta tesina se
verá recompensado.
Resultados obtenidos
A continuación se presentan, a modo de resumen, los resultados más significativos que
se han obtenido durante la realización de esta tesina:
En el Capı́tulo 1 se ha propuesto una fórmula aproximada para la enumeración de
cuadrados latinos de órdenes intermedios. Esta fórmula rellena el hueco existente en
la literatura sobre enumeración de cuadrados latinos. También se ha determinado
experimentalmente el número de cuadrados latinos simétricos y se ha constatado
que dicho número puede ser estimado como la raı́z cuadrada del número total de
cuadrados latinos.
En el Capı́tulo 2 se han introducido los conceptos de grafo soporte de un grafo de
Moore y forma canónica de la matriz de adyacencia asociada a un grafo de Moore.
También se han descubierto ciertas propiedades que debe cumplir toda matriz de
adyacencia asociada a un grafo de Moore, entre las que cabe destacar la presencia
de cuadrados latinos. Finalmente, se ha modelizado el problema de El Gran Grafo
de Moore como el de encontrar un conjunto de 56 cuadrados latinos mútuamente
r-ortogonales con grado de ortogonalidad 1514.
En el Capı́tulo 3 se han desarrollado los algoritmos para generar cuadrados latinos
(generación secuencial, generación aleatoria y generación parcial) y los algoritmos
básicos para la construcción de grafos de Moore.
Ya fuera de este documento, se ha desarrollado la aplicación TBMG, que ha servido para descubrir la mayor parte de las propiedades sobre la matriz de adyacencia
asociada a los grafos de Moore que se han presentado en el Capı́tulo 2.
72
Bibliografı́a
Referencias
[1] S. E. Bammel, J. Rothstein, The number of 9 × 9 Latin squares, Discrete Math., 11
(1975), 93–95.
[2] E. Bannai, T. Ito, Algebraic combinatorics I, Benjamin and Cummings, 1984.
[3] G. Belyavskaya, r-Orthogonal Latin Squares, Annals of Discrete Mathematics, 1991,
169–202.
[4] C. J. Colbourn, L. Zhu. The Spectrum of r-Orthogonal Latin Squares, Combinatorics
Advances, 1995, 49–75.
[5] R. Fisher, F. Yates, The 6 × 6 Latin Squares, Proceedings of the Cambridge Philosophical Society, 30 (1934), 492–507.
[6] M. T. Jacobson, P. Matthews, Generating Uniformly Distributed Random Latin Squares, J. Combinatorial Design, 4 (1996), 405–437.
[7] J. Kong, The Role of Latin Squares in Cipher Systems: A Matrix Approach to Model Encryption Modes of Operation, UCLA Computer Science Department, Technical
Report 030038.
[8] C. Kościelny, Generating Quasigroups For Cryptographic Applications, International
Journal of Applied Mathematics & Computer Science, Vol. 14, No. 4, 2002, 559–569.
[9] J. H. van Lint, R. M. Wilson, A Course in Combinatorics, Cambridge University Press,
Cambridge, 1992.
[10] B. D. McKay, E. Rogoyski, Latin Squares of Order 10, Electronic J. Combinatorics, 2
(1995), No. 1, R3, 1–4.
[11] B. D. McKay, I. M. Wanless, Latin squares of order eleven, en revisión, 2003.
[12] A. Sade, Énumération des carrés latins. Application au 7ème ordre. Conjecture pour
les ordres supérieurs, Marseille, 1984, 8pp.
[13] M. B. Wells, The Number of Latin Squares of Order Eight, Journal of Combinatorial
Theory, 3 (1967), 98–99.
[14] L. Zhu, H. Zhang, A few more r-orthogonal latin squares, Discrete Mathematics, 238
(2001), 183–191.
[15] L. Zhu, H. Zhang, Completing the spectrum of r-orthogonal Latin squares, Discrete
Mathematics, 268 (2003), 343–349.
73
Otra bibliografı́a consultada
[16] C. Balbuena, Estudio sobre algunas nuevas clases de conectividad condicional en grafos
dirigidos, Universitat Politècnica de Catalunya, 1995, 2–5.
[17] N. L. Biggs, Matemática Discreta, Edicions Vicens Vives, 1994, 143–146.
[18] P. Doyle, The number of Latin rectangles, manuscrito, http://math.dartmouth.edu/
∼doyle/docs/latin/latin.pdf
[19] S. Duzhin, Graphes de Moore, manuscrito, 1994, http://www.pdmi.ras.ru/∼duzhin/
papers/moore.ps.gz.
[20] C. D. Godsil, So Few Moore Graphs, manuscrito, 2001, http://quoll.uwaterloo.ca/agt/
supplem/moore.ps.
[21] C. P. Gomes, D. Shmoys, Completing Quasigroups or latin Squares: A Structured
Graph Coloring Problem, Computational Symposium on Graph Coloring and Generalisations, 2002.
[22] J. Gómez, I. Pelayo, C. Balbuena. New Large Graphs with Given Degree and Diameter
Six, John Wiley & Sons, Inc., 1998.
74
Índice general
Introducción
Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1. Cuadrados Latinos
1.1. Definiciones y propiedades . . . . . . . . . . . . . .
1.2. Cubos binarios latinos . . . . . . . . . . . . . . . .
1.3. Cuadrados latinos ortogonales . . . . . . . . . . . .
1.4. Enumeración de cuadrados latinos . . . . . . . . . .
1.4.1. Enumeración de cuadrados latinos simétricos
1.4.2. Fórmulas asintóticas . . . . . . . . . . . . .
1.4.3. Estimación para órdenes intermedios . . . .
1.5. Generación de cuadrados latinos . . . . . . . . . . .
1.5.1. Generación secuencial de cuadrados latinos .
1.5.2. Generación aleatoria de cuadrados latinos .
1.5.3. Composición de cuadrados latinos . . . . . .
1.6. Aplicaciones de los cuadrados latinos . . . . . . . .
1.6.1. Diseño de experimentos . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
2. Grafos de Moore
2.1. Definiciones previas . . . . . . . . . . . . . . . . . . . . . .
2.2. Modelización matricial de grafos . . . . . . . . . . . . . . .
2.3. El problema (∆, D) . . . . . . . . . . . . . . . . . . . . . .
2.3.1. Grafos de Moore . . . . . . . . . . . . . . . . . . .
2.3.2. Árbol generador . . . . . . . . . . . . . . . . . . . .
2.3.3. Grafo soporte . . . . . . . . . . . . . . . . . . . . .
2.3.4. Forma canónica de un grafo de Moore . . . . . . . .
2.4. Construcción del grafo de Petersen . . . . . . . . . . . . .
2.4.1. Construcción mediante el grafo soporte . . . . . . .
2.4.2. Matriz de adyacencia del grafo de Petersen . . . . .
2.4.3. Otras representaciones del grafo de Petersen . . . .
2.5. Construcción del grafo de Hoffman-Singleton . . . . . . . .
2.5.1. Construcción clásica del grafo de Hoffman-Singleton
75
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1
1
.
.
.
.
.
.
.
.
.
.
.
.
.
4
4
7
8
10
11
13
14
16
16
16
19
20
20
.
.
.
.
.
.
.
.
.
.
.
.
.
24
24
26
28
28
31
32
34
35
36
38
39
40
40
2.5.2. Matriz de adyacencia del grafo de Hoffman-Singleton
2.5.3. Reformulación del problema de los grafos de Moore .
2.6. Construyendo El Gran Grafo de Moore . . . . . . . . . . . .
2.6.1. Propiedades algebraicas de la matriz de adyacencia .
2.6.2. Presentación de la aplicación TBMG . . . . . . . . .
2.6.3. Caracterización de la matriz de adyacencia . . . . . .
2.6.4. Análisis del tamaño del problema . . . . . . . . . . .
2.6.5. Porcentajes de completitud . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
41
43
43
44
45
48
55
56
.
.
.
.
.
.
.
58
58
58
60
63
66
66
71
Conclusiones
Resultados obtenidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
72
72
Bibliografı́a
73
3. Algoritmos
3.1. Generación de Cuadrados Latinos . . . . . . . . . . . . .
3.1.1. SLSG: Symmetric Latin Square Generator . . . .
3.1.2. PLSC: Partial Latin Square Completer . . . . . .
3.1.3. RLSG: Random Latin Square Generator . . . . .
3.2. Construcción de Grafos de Moore . . . . . . . . . . . . .
3.2.1. TBMG: The Biggest Moore Graph (versión C++)
3.2.2. TBMG: The Biggest Moore Graph (versión Visual
76
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
Basic) .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Índice de cuadros
1.1.
1.2.
1.3.
1.4.
1.5.
1.6.
Excepciones del grado r de ortogonalidad. . . . . . . . . . . . .
Estado del arte en enumeración de cuadrados latinos. . . . . . .
Número de cuadrados latinos normalizados. . . . . . . . . . . .
Estimación del número de cuadrados latinos normalizados. . . .
Número de cuadrados latinos simétricos normalizados. . . . . . .
Número de cuadrados latinos y valor de α en función del orden.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
9
10
11
11
12
15
2.1.
2.2.
2.3.
2.4.
2.5.
Parámetros del grafo de Moore de grado 3. . . . .
Parámetros del grafo de Moore de grado 7. . . . .
Parámetros del grafo de Moore de grado 57. . . .
Valores propios y vectores propios de los grafos de
Porcentajes de completitud obtenidos. . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
35
40
43
45
56
77
. . . . .
. . . . .
. . . . .
Moore. .
. . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Índice de figuras
1.1.
1.2.
1.3.
1.4.
Cuadrado latino y cubo binario asociado al mismo. . . .
Cubo binario equivalente y cuadrado latino asociado. . .
Evolución del número de cuadrados latinos con el orden.
Evolución del valor de α. . . . . . . . . . . . . . . . . . .
.
.
.
.
7
7
12
15
2.1. El grafo 4-completo, o K4 . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2. Ejemplo de digrafo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.3. Ejemplo de árbol. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.4. Grafo de 6 vértices y matriz de adyacencia asociada. . . . . . . . . . . . .
2.5. Árbol generador de un grafo de Moore. . . . . . . . . . . . . . . . . . . . .
2.6. Grafo soporte de un grafo de Moore. . . . . . . . . . . . . . . . . . . . . .
2.7. Forma canónica de la matriz de adyacencia de un Grafo de Moore. . . . . .
2.8. Construcción del grafo de Petersen. Paso 1. . . . . . . . . . . . . . . . . . .
2.9. Construcción del grafo de Petersen. Paso 2. . . . . . . . . . . . . . . . . . .
2.10. Construcción del grafo de Petersen. Paso 3. . . . . . . . . . . . . . . . . . .
2.11. Construcción del grafo de Petersen. Paso 4. . . . . . . . . . . . . . . . . . .
2.12. Construcción del grafo de Petersen. Paso 5. . . . . . . . . . . . . . . . . . .
2.13. Algunas representaciones del grafo de Petersen. . . . . . . . . . . . . . . .
2.14. Aspecto del grafo soporte para el grafo de Hoffman-Singleton. . . . . . . .
2.15. Grafo completo bipartito K5,5 . . . . . . . . . . . . . . . . . . . . . . . . . .
2.16. Construcción del grafo de Hoffman-Singleton. . . . . . . . . . . . . . . . .
2.17. Matriz B para el grafo de Petersen y su representación en TBMG. . . . . .
2.18. Matriz de adyacencia del grafo de Petersen con conflictos. . . . . . . . . . .
2.19. Matriz de adyacencia del grafo de Petersen basada en un patrón 5 × 5. . .
2.20. Matriz de adyacencia del grafo de Hoffman-Singleton. . . . . . . . . . . . .
2.21. Forma canónica de la matriz de adyacencia del grafo de Hoffman-Singleton.
2.22. Submatrices 6 × 6 en la forma canónica del grafo de Hoffman-Singleton. . .
2.23. Matrices de permutación correspondientes a la primera fila. . . . . . . . . .
2.24. Matrices asociadas a cada matriz de permutación de la primera fila. . . . .
2.25. Cuadrado latino asociado a la primera fila de submatrices. . . . . . . . . .
2.26. Cuadrados latinos asociados a la matriz de adyacencia. . . . . . . . . . . .
24
25
26
26
32
33
34
36
36
37
37
38
39
40
40
41
46
46
47
48
49
50
51
51
52
52
78
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Descargar