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