Ir al contenido principal

Cuadrados mágicos (IV): Solución Reto 4

Solución al cuarto reto sobre cuadrados mágicos y ajedrez que he puesto recientemente en este blog, y en el que también se ve involucrada la programación.

El enunciado del reto decía lo siguiente: En el reto anterior se pedía construir un cuadrado mágico de orden 4, 4 filas y cuatro columnas, normal (que contenga todos los números naturales desde el 1 hasta n2, en este caso del 1 al 16) y en el que se "escondan" todas las posibles soluciones al problema de las 4 reinas, es decir, que la suma de las casillas del cuadrado donde se ubicarían las 4 reinas de cada solución dé como resultado su constante mágica, n(n2+1)/2 = 4(17)/2=34, y en la solución a dicho reto decía que hay muchos cuadrados mágicos que cumplen esos requisitos. ¿Sabrías decirme: cuántos y cuáles?.

Solución: Evidentemente, lo primero que hay que hacer es averiguar cuántos cuadrados mágicos de orden 4 normales hay y cuáles son éstos, con objeto de poder examinar cada uno de ellos y comprobar así en cuáles se "esconden" las dos posibles soluciones al problema de las 4 reinas.

Pues bien, voy a aprovecharme del trabajo del matemático francés Bernard Frénicle de Bessy que, allá por el siglo XVII, estableció 880 cuadrados mágicos de orden 4 normales como esencialmente diferentes. Por tanto, parto del pequeño fichero (cuadrados_mágicos_normales_4x4_esenciales.txt) que dejé como recurso asociado al reto en la primera pista que puse para ayudar a resolverlo y que contiene los 880 cuadrados mágicos citados anteriormente.

Antes que nada, indicar que por cada uno de los cuadrados mágicos esenciales contenidos en ese fichero hay otros 7 que no han merecido esa consideración y que se obtienen de los primeros a partir de rotaciones o simetrías (reflejos); aquellos que son resultado de:

1.- Rotación de 90º del cuadrado mágico esencial.

2.- Rotación de 180º del cuadrado mágico esencial.

3.- Rotación de 270º del cuadrado mágico esencial.

4.- Reflejo horizontal (doblado del cuadrado mágico esencial por su eje central vertical).

5.- Reflejo vertical (doblado del cuadrado mágico esencial por su eje central horizontal).

6.- Reflejo primera diagonal principal (doblado del cuadrado mágico esencial por la diagonal principal que va de izquierda a derecha).

7.- Reflejo segunda  diagonal principal (doblado del cuadrado mágico esencial por la diagonal principal que va de derecha a izquierda).

Por lo que entiendo que en total hay 880 x 8 = 7.040 cuadrados mágicos de orden 4 normales.

Ahora, sólo queda saber cuántos y cuáles de esos 7.040 cuadrados "esconden" las dos posibles soluciones al problema de las 4 reinas.

Para ello, creo un pequeño script en python:

def suma_casillas_soluciones_34(casilla0,casilla1,casilla2,casilla3,
                                                 casilla4,casilla5,casilla6,casilla7,
                                                 casilla8,casilla9,casilla10,casilla11,
                                                 casilla12,casilla13,casilla14,casilla15):
#---------------------------------------------------------------------------------------------------
# Comprueba si el resultado de la suma de las casillas de las dos soluciones es igual a la
# constante mágica (34).
#---------------------------------------------------------------------------------------------------
#
    suma_Damas_1=int(casilla2)+int(casilla4)+int(casilla11)+int(casilla13)
    suma_Damas_2=int(casilla1)+int(casilla7)+int(casilla8)+int(casilla14)
    if suma_Damas_1== 34 and suma_Damas_2== 34:
        print('[+]',casilla0,casilla1,casilla2,casilla3,
                        casilla4,casilla5,casilla6,casilla7,
                        casilla8,casilla9,casilla10,casilla11,
                        casilla12,casilla13,casilla14,casilla15,
                       '--> Suma casillas Damas ambas soluciones = 34')
        return True
    else:
        return False
#
#=========================================================
# A partir del fichero con los cuadrados mágicos normales de 4x4 esenciales (880),
# calcula la suma de las 4 casillas de cada uno de ellos y de los generados a partir de los mismos
# donde se colocarían las Damas de cada una de las dos soluciones al problema de la 4 reinas,
# para averiguar en cuáles el resultado de ambas sumas es igual a la constante mágica (34).
#=========================================================
#
f_cuadrados_mágicos_normales_4x4 = open("cuadrados_mágicos_normales_4x4_esenciales.txt")

e=0
o=0
es=0
os=0
print('')
print('*** Búsqueda de cuadrados mágicos cuya suma de las casillas de ambas soluciones es 34:')
for cuadrado_magico in f_cuadrados_mágicos_normales_4x4:
#---------------------------------------------------------------------------------------------------
# Cuadrado mágico, normal, 4x4 y designado como esencial.
#---------------------------------------------------------------------------------------------------
#
    e+=1
    casilla=cuadrado_magico.split()
    if suma_casillas_soluciones_34(casilla[0],casilla[1],casilla[2],casilla[3],
                                                  casilla[4],casilla[5],casilla[6],casilla[7],
                                                  casilla[8],casilla[9],casilla[10],casilla[11],
                                                  casilla[12],casilla[13],casilla[14],casilla[15]):
       es+=1
#---------------------------------------------------------------------------------------------------
# Rotación de 90º del cuadrado mágico esencial.
#---------------------------------------------------------------------------------------------------
#
    o+=1
    if suma_casillas_soluciones_34(casilla[12],casilla[8],casilla[4],casilla[0],
                                                  casilla[13],casilla[9],casilla[5],casilla[1],
                                                  casilla[14],casilla[10],casilla[6],casilla[2],
                                                  casilla[15],casilla[11],casilla[7],casilla[3]):
        os+=1
#---------------------------------------------------------------------------------------------------
# Rotación de 180º del cuadrado mágico esencial.
#---------------------------------------------------------------------------------------------------
#
    o+=1
    if suma_casillas_soluciones_34(casilla[15],casilla[14],casilla[13],casilla[12],
                                                  casilla[11],casilla[10],casilla[9],casilla[8],
                                                  casilla[7],casilla[6],casilla[5],casilla[4],
                                                  casilla[3],casilla[2],casilla[1],casilla[0]):
        os+=1
#---------------------------------------------------------------------------------------------------
# Rotación de 270º del cuadrado mágico esencial.
#---------------------------------------------------------------------------------------------------
#
    o+=1
    if suma_casillas_soluciones_34(casilla[3],casilla[7],casilla[11],casilla[15],
                                                  casilla[2],casilla[6],casilla[10],casilla[14],
                                                  casilla[1],casilla[5],casilla[9],casilla[13],
                                                  casilla[0],casilla[4],casilla[8],casilla[12]):
        os+=1
#---------------------------------------------------------------------------------------------------
# Reflejo horizontal del cuadrado mágico esencial (doblar por el eje vertical).
#---------------------------------------------------------------------------------------------------
#
    o+=1
    if suma_casillas_soluciones_34(casilla[3],casilla[2],casilla[1],casilla[0],
                                                  casilla[7],casilla[6],casilla[5],casilla[4],
                                                  casilla[11],casilla[10],casilla[9],casilla[8],
                                                  casilla[15],casilla[14],casilla[13],casilla[12]):
        os+=1
#---------------------------------------------------------------------------------------------------
# Reflejo vertical del cuadrado mágico esencial (doblar por el eje horizontal).
#---------------------------------------------------------------------------------------------------
#
    o+=1
    if suma_casillas_soluciones_34(casilla[12],casilla[13],casilla[14],casilla[15],
                                                  casilla[8],casilla[9],casilla[10],casilla[11],
                                                  casilla[4],casilla[5],casilla[6],casilla[7],
                                                  casilla[0],casilla[1],casilla[2],casilla[3]):
        os+=1
#---------------------------------------------------------------------------------------------------
# Reflejo primera diagonal principal del cuadrado mágico esencial (doblar por diagonal izq.)
#---------------------------------------------------------------------------------------------------
#
    o+=1
    if suma_casillas_soluciones_34(casilla[0],casilla[4],casilla[8],casilla[12],
                                                  casilla[1],casilla[5],casilla[9],casilla[13],
                                                  casilla[2],casilla[6],casilla[10],casilla[14],
                                                  casilla[3],casilla[7],casilla[11],casilla[15]):
        os+=1
#---------------------------------------------------------------------------------------------------
# Reflejo segunda diagonal principal del cuadrado mágico esencial (doblar por diagonal dcha.)
#---------------------------------------------------------------------------------------------------
#
    o+=1
    if suma_casillas_soluciones_34(casilla[15],casilla[11],casilla[7],casilla[3],
                                                  casilla[14],casilla[10],casilla[6],casilla[2],
                                                  casilla[13],casilla[9],casilla[5],casilla[1],
                                                  casilla[12],casilla[8],casilla[4],casilla[0]):
        os+=1
print('--- Nº cuadrados mágicos esenciales examinados:',e)
print('--- Nº cuadrados mágicos esenciales cuya suma casillas ambas soluciones es 34:',es)
print('--- Nº cuadrados mágicos generados a partir de esenciales examinados:',o)
print('--- Nº cuadrados mágicos a partir de esenciales cuya suma casillas ambas soluciones es 34:',os)
print('*** Total de cuadrados mágicos examinados',e+o)
print('*** Total de cuadrados mágicos cuya suma casillas ambas soluciones es 34:',es+os)

f_cuadrados_mágicos_normales_4x4.close()

Lo ejecuto:
Y tal y como se puede observar en la figura anterior, la respuesta a la pregunta que se plantea en este reto es que las dos soluciones al problema de las 4 reinas se "esconden" en un total 1.152 cuadrados mágicos de orden 4 normales (en 144 esenciales y en 1.008 de los generados a partir de éstos), y todos ellos se muestran, tras la ejecución de este script, con el valor Ci del correspondiente vector (cada índice, 1  i  16, representa una casilla del cuadrado - de izquierda a derecha y de arriba a abajo - y el valor,  C  16, el valor o número entero contenidos en esa casilla).

******** PRÓXIMO RETO
Reto 5:   "Los cuadrados mágicos y el ajedrez (V)".

Comentarios

Entradas populares de este blog

Criptografía (I): cifrado Vigenère y criptoanálisis Kasiski

Hace unos días mi amigo Iñaki Regidor ( @Inaki_Regidor ), a quien dedico esta entrada :), compartió en las redes sociales un post titulado "Criptografía: el arte de esconder mensajes"  publicado en uno de los blogs de EiTB . En ese post se explican ciertos métodos clásicos para cifrar mensajes , entre ellos el cifrado de Vigenère , y , al final del mismo, se propone un reto consistente en descifrar un mensaje , lo que me ha animado a escribir este post sobre el método Kasiski  para atacar un cifrado polialfabético ( conociendo la clave descifrar el mensaje es muy fácil, pero lo que contaré en este post es la forma de hacerlo sin saberla ). El mensaje a descifrar es el siguiente: LNUDVMUYRMUDVLLPXAFZUEFAIOVWVMUOVMUEVMUEZCUDVSYWCIVCFGUCUNYCGALLGRCYTIJTRNNPJQOPJEMZITYLIAYYKRYEFDUDCAMAVRMZEAMBLEXPJCCQIEHPJTYXVNMLAEZTIMUOFRUFC Como ya he dicho el método de Vigenère es un sistema de sustitución polialfabético , lo que significa que, al contrario que en un sistema de

Criptografía (XXIII): cifrado de Hill (I)

En este post me propongo explicar de forma comprensible lo que he entendido sobre el cifrado de Hill , propuesto por el matemático Lester S. Hill , en 1929, y que se basa en emplear una matriz como clave  para cifrar un texto en claro y su inversa para descifrar el criptograma correspondiente . Hay tres cosas que me gustan de la criptografía clásica, además de que considero que ésta es muy didáctica a la hora de comprender los sistemas criptográficos modernos: la primera de ellas es que me "obliga" a repasar conceptos de matemáticas aprendidos hace mucho tiempo y, desgraciadamente, olvidados también hace demasiado tiempo, y, por consiguiente, que, como dice  Dani , amigo y coautor de este blog, me "obliga" a hacer "gimnasia mental"; la segunda es que, en la mayoría de las ocasiones, pueden cifrarse y descifrase los mensajes, e incluso realizarse el criptoanálisis de los criptogramas, sin más que un simple lápiz y papel, es decir, para mi es como un pasat

¿Qué significa el emblema de la profesión informática? (I)

Todas o muchas profesiones tienen un emblema que las representa simbólicamente y en el caso de la  informática: " es el establecido en la resolución de 11 de noviembre de 1977  para las titulaciones universitarias superiores de informática, y  está constituido por una figura representando en su parte central  un  núcleo toroidal de ferrita , atravesado por  hilos de lectura,  escritura e inhibición . El núcleo está rodeado por  dos ramas : una  de  laurel , como símbolo de recompensa, y la otra, de  olivo , como  símbolo de sabiduría. La  corona  será la  de la casa real  española,  y bajo el escudo se inscribirá el acrónimo de la organización. ". Veamos los diferentes elementos tomando como ejemplo el emblema del COIIE/EIIEO (Colegio Oficial de Ingenieros en Informática del País Vasco/ Euskadiko Informatikako Ingeniarien Elkargo Ofiziala ) . Pero no sólo el COIIE/EIIEO adopta el emblema establecido en dicha resolución, sino que éste se adopta también como im