John H. Conway (1937-2020), un prolífico matemático británico conocido por el «juego de la vida»

Por Francisco R. Villatoro, el 28 abril, 2020. Categoría(s): Ciencia • Informática • Matemáticas • Mathematics • Noticias • Personajes • Recomendación • Science ✎ 3

La COVID-19 nos ha dejado sin el prolífico matemático británico John Horton Conway (82 años). Su annus mirabilis fue entre 1969 y 1970, cuando inventó el autómata celular llamado Juego de la Vida (Game of Life), descubrió los números surreales y sus contribución más relevante, el hoy llamado grupo de Conway en 24 dimensiones. Por este último trabajo está considerado uno de los líderes de la demostración del teorema de clasificación de grupos simples (una obra coral de decenas de miles de páginas dispersas entre más de 500 artículos con más de cien autores); el resultado es el «ATLAS of Finite Group Representations» [web]. Conway no fue Medalla Fields, ni tampoco Premio Abel, galardón que recibieron en 2008 John Griggs Thompson y Jacques Tits por ser los grandes líderes de este vasto teorema.

Recuerda que un grupo G es simple si 1 y G son sus únicos subgrupos normales; un subgrupo N es normal si es invariante bajo conjugación, es decir, si para cada elemento n de N y cada g en G, el elemento g n g−1 está en N. La clasificación de los grupos simples es posible gracias al teorema de Jordan–Hölder. El teorema de clasificación de grupos simples afirma que todo grupo simple finito es isomorfo a un grupo cíclico con orden primo, a un grupo alternante de grado al menos 5, a un grupo de Lie simple, o a uno de los 26 grupos simples esporádicos. Conway aportó los grupos simples esporádicos de Conway Co1Co2Co3, que está basados en el grupo (que no es simple) Co0, que describe las simetría de la red unimodular de Leech en el espacio euclídeo de 24 dimensiones. Estos grupos enormes, Co0 tiene ≈ 8.3 × 1018 elementos, y su centro, Co1, tiene ≈ 4.1 × 1018 elementos, fueron claves para el descubrimiento del grupo esporádico más grande, el grupo monstruo (monster group) que tiene ≈ 8×1053 elementos (fue predicho por Bernd Fischer en 1973 y descubierto por Robert Griess en 1976, aunque su construcción más habitual es debida a Conway y Tits en 1984).

La historia del teorema de clasificación de grupos simples finitos es fascinante. Te recomiendo leer a Marcus du Sautoy, «Simetría. Un viaje por los patrones de la naturaleza» (traducido por Jesús Gómez Ayala), Acantilado (2009). Allí puedes leer sobre John H. Conway: «a este profesor, su carisma personal y matemático le ha dado casi categoría de persona de culto. Las actuaciones de Conway cuando presenta los botines de sus correrías matemáticas son casi mágicas por su calidad. Al principio va entrelazando lo que a simple vista parecen curiosidades o triquiñuelas matemáticas, pero al final de sus charlas llega a respuestas de cuestiones muy fundamentales de las matemáticas. Cada revelación de una idea fundamental va precedida de una risa característica, como si él también se sorprendiera de hasta dónde ha llegado. Al mismo tiempo va convirtiendo un aula de universitarios serios en un grupo de niños traviesos, que se levantan impacientes al final de la charla para ir a jugar con los juguetes matemáticos que él saca de una maleta llena de curiosidades que suele llevar consigo».

Te recomiendo leer también a Michael Aschbacher, «The Status of the Classification of the Finite Simple Groups,» Notices AMS 51: 736-740 (2004) [PDF]; Ron Solomon, «On Finite Simple Groups and Their Classification,» Notices AMS 42: 231-239 (1995) [PDF]. Y, por supuesto, sobre Conway a Siobhan Roberts, «Genius at Play: The Curious Mind of John Horton Conway,» IAS, 2015; Siobhan Roberts, «A Life in Games,» Quanta Magazine, 28 Aug 2015; Terence Tao, «John Conway,» What’s new, 12 Apr 2020; The Blog of Scott Aaronson, «John Horton Conway (1937-2020),» Shtetl-Optimized, 12 Apr 2020;

Esta pieza forma parte del Carnaval de Matemáticas, que en esta octogésima octava edición, también denominada 11.2, está organizado por Rafael Martínez González a través de su blog El mundo de Rafalillo. Anímate y participa, la fecha tope es el 30 de abril. Puedes anunciar tu pieza en Twitter con un tuit que incluya el enlace a tu entrada y la etiqueta #CarnaMat11_2, además de hacer mención a las cuentas @Rafalillo86 y @CarnaMat.

Siendo la aportación más conocida de Conway el Juego de la Vida, me centraré en este autómata celular. Como imparto clase de Informática para Bioquímicos usando el lenguaje R, implementé este juego para el disfrute de mis estudiantes. Te copio la implementación y te la comento.

Las reglas de este autómata celular son las siguientes (recuerda que cada casilla está rodeada por ocho casillas): una casilla vacía rodeada por tres casillas vivas se vuelve viva; una casilla viva rodeada por menos de tres casillas vivas se vuelve vacía; y una casilla viva rodeada por más de cuatro casillas vivas también se vuelve vacía. Estas sencillas reglas modelan la competición por los recursos y la reproducción.

Mi implementación se basa en una matriz de entrada que describe el «organismo», pero permite usar ficheros .lex (Life Lexicon) que se pueden descargar desde la web (p. ej. Life Lexicon Home Page). Se dibuja el tablero en forma de texto, animado mediante un scroll de la pantalla y su reescritura sucesiva. Hubiera sido mejor una implementación usando un dispositivo gráfico, windows() en R, pero he preferido simplificar al extremo la parte gráfica. El código es fácil de entender (espero).

juegovida = function ( MATRIZ = matrix(c(0,0,1,1,0,1,0,1,1),3,3),
                       FILAS=30, COLUMNAS=30, POSX=10, POSY=10)
#' juegovida(MATRIZ, FILAS, COLUMNAS, POSX, POSY)
#' ejecuta el juego de la vida de Conway en una matriz con
#' FILASxCOLUMNAS y valor inicial MATRIZ colocado en (POSX,POSY)
#' siendo su valor por defecto glider = matrix(c(0,0,1,1,0,1,0,1,1),3,3)
#' pudiendo ser el nombre de un fichero .lex
{
viva='X' ; vacia=' '

if (!(FILAS>0 & COLUMNAS>0 & POSX>0 & POSY>0))
stop("Datos de entrada del tablero incorrectos (no positivos).")

if (is.character(MATRIZ))
{ ## fichero .lex
tabla=NULL; tabla=read.table(MATRIZ)
if (is.null(tabla)) stop("El fichero ",MATRIZ, " no es un fichero .lex .")
matriz=as.character(tabla[[1]]); lineas=length(matriz); columnas=nchar(matriz[1])
if (length(unlist(lapply(matriz,paste0)))!=lineas*columnas)
stop("El fichero ",MATRIZ, "no es un fichero .lex .")
s2c = function (string) unlist( strsplit( string,"" ) )
MATRIZ=matrix(unlist(lapply(matriz,s2c)),lineas,columnas,TRUE)
MATRIZ[MATRIZ=='.']=0
MATRIZ[MATRIZ=='O']=1
}
if ( any(MATRIZ!=1 & MATRIZ!=0) )
{ stop("La matriz de tener debe tener ceros y unos.")
}
TABLERO=matrix(vacia,FILAS+2,COLUMNAS+2)
TABLERO[c(1,FILAS+2),]='-'
TABLERO[,c(1,COLUMNAS+2)]='|'
if (any( dim(MATRIZ)+c(POSX,POSY) > dim(TABLERO) ) )
stop("Tablero demasiado enano para una matriz inicial tan grande")
TABLERO[(1+POSX):(nrow(MATRIZ)+POSX),(1+POSY):(ncol(MATRIZ)+POSY)]=MATRIZ
TABLERO[TABLERO=='1']=viva
TABLERO[TABLERO=='0']=vacia

##############################################
## funcion que dibuja el tablero
##############################################
dibuja.tablero = function ()
{
for (i in 1:80) cat("\n")

for (mm in 1:(FILAS+2)) cat(TABLERO[mm,],'\n')
}

##############################################
## calcula nuevo estado
##############################################
nuevo.estado = function (TABLERO)
{
NUEVO.TABLERO = TABLERO
for (ii in 2:(FILAS+1))
for (jj in 2:(COLUMNAS+1))
{
cuantas.vivas=sum(TABLERO[ii+(-1:1),jj+(-1:1)]==viva)
if (TABLERO[ii,jj]==vacia && cuantas.vivas==3)
NUEVO.TABLERO[ii,jj]=viva
if (TABLERO[ii,jj]==viva && (cuantas.vivas<3 || cuantas.vivas>4))
NUEVO.TABLERO[ii,jj]=vacia
}
return(NUEVO.TABLERO)
}

############# BUCLE PRINCIPAL ############################

SIGO = TRUE
while ( SIGO )
{
flush.console()
dibuja.tablero()
cat("Pulsa la tecla <ESC> para acabar, o espera.")
Sys.sleep(.1)
NUEVO.TABLERO=nuevo.estado(TABLERO)
if (all(NUEVO.TABLERO==TABLERO))
SIGO=FALSE
else
TABLERO=NUEVO.TABLERO
}
flush.console()
dibuja.tablero()
print("Y ya hemos acabado.")
}

El ejemplo por defecto, al ejecutar juegovida(), se llama parpeador o glider. Te dejo otros ejemplos aquí abajo,

## bloque o block
block=matrix(1,2,2)
juegovida(block)
## barco o boat
boat=matrix(c(1,1,0,1,0,1,0,1,0),3,3)
juegovida(boat)
## parpadeador o blinker
blinker=matrix(c(0,1,0),3,3)
juegovida(blinker)
## sapo o toad
toad=matrix(c(0,1,1,1,1,1,1,0),2,4)
juegovida(toad)
## nave ligera o LWSS
LWSS=matrix(c(0,1,1,1,1,0,0,1,0,0,0,1,0,0,0,1,1,0,1,0),4,5)
juegovida(LWSS)
## diehard
diehard=matrix(c(0,1,0,0,1,1,rep(0,11),1,1,0,1,0,0,1),3,8)
juegovida(diehard)
## acorn
acorn=matrix(c(0,0,1,1,0,1,0,0,0,0,1,0,rep(c(0,0,1),3)),3,7)
juegovida(acorn)
## glider gun de Gosper
juegovida("gosper.lex",30,40,1,1)
## fuente
juegovida("fountain.lex",30,40)
## aleatorio
juegovida(matrix(sample(c(0,1),20,T),10,10))
juegovida(matrix(sample(c(0,1),20,T),10,10))
juegovida(matrix(sample(c(0,1),20,T),10,10))
##

Si ya tienes instalado R en tu ordenador, aprovecha y ejecuta este código. Las matrices aleatorias suelen conducir a resultados hipnóticos. Si no tienes instalado R, no sé si te aparecerá instalarlo (solo para ejecutar mi código no creo que sea razón suficiente, pero quién sabe). En cualquier caso, te  recuerdo que en mis tiempos de estudiante de Informática eran habituales las competiciones de juego de la vida; se usaba una versión en un toro (dónut), lo que entra por una pared sale por la otra; los contendientes ponen sus diseños en dos lugares de un tablero y gana el que logra destruir al otro y sobrevivir (si ambos se destruyen, pierden ambos). Adaptar mi código para que ejecute competiciones no es difícil (siempre se lo dejo sugiero a mis estudiantes).

En resumen, siento que este pequeño homenaje a Conway no incluya una descripción de su vida y sus grandes logros. Pero espero que esta breve incursión en el juego de la vida te motive a profundizar en su obra. Te recomiendo el libro de Siobhan Roberts, «Genius at play. The curious mind of John Horton Conway,” Bloomsbury (2015). Sin lugar a dudas lo disfrutarás y no te arrepentirás.



3 Comentarios

    1. Javier, un resultado muy interesante, pero de muy baja significación (menos de 1.6 sigmas para el resultado combinado). Por debajo de 3 sigmas, este tipo de resultados son irrelevantes. Puede parecernos prometedor un resultado publicado en PRL a 1.6 sigmas, pero en el campo de la física de partículas es una simple fluctuación estadística.

Deja un comentario