Hay muchos algoritmos diferentes para construir cuadrados mágicos, Wikipedia y Google son buenos puntos de partida si los busca.
A continuación, describiré uno que es realmente fácil de recordar y que se puede usar para construir un cuadrado mágico de cualquier tamaño extraño .
Deje que [math] n [/ math] sea un entero impar positivo. Vamos a construir un cuadrado mágico [matemático] n \ veces n [/ matemático] que contiene los primeros enteros positivos [matemáticos] n ^ 2 [/ matemáticos]. Mostraré un ejemplo de la construcción para [matemáticas] n = 5 [/ matemáticas].
Imagine que está escribiendo los números del 1 al [matemático] n ^ 2 [/ matemático] en una cuadrícula [matemática] n \ veces n [/ matemático], fila por fila:
- ¿Cuál es [7 ^ 7 ^ 7 ^ … (51 veces 7)] (es decir, una base 7 y cincuenta 7 encima de eso) módulo 777? ¿Y cómo?
- ¿Se puede aplicar el principio de la navaja de Occam a las matemáticas, y a la teoría de números en particular, o es relevante solo para las ciencias naturales?
- Digamos que alguien prueba la conjetura primo gemelo. ¿Qué debe hacer él / ella con él?
- ¿Cómo se deriva la suma de la progresión geométrica infinita? ¿La progresión aritmética también tiene fórmulas para la suma de AP infinitos?
- Dado un número n, ¿cuál es la probabilidad de que n sea primo?
En cambio, haga lo mismo pero a lo largo de las diagonales, como si girara el cuadrado de arriba 45 grados hacia la izquierda. Debería obtener lo siguiente: Ahora, este no es el cuadrado [math] n \ times n [/ math] que queremos, pero ya casi estamos allí. La figura anterior contiene un cuadrado [math] n \ times n [/ math], es solo que algunos de los números están afuera. Mira:
Todo lo que tenemos que hacer para terminar nuestro cuadrado mágico es mover esos números restantes del exterior al cuadrado. Afortunadamente, los cuatro “triángulos” que están en el exterior encajan exactamente en los espacios vacíos dentro del cuadrado, de la siguiente manera: Aquí está el cuadrado mágico terminado, después de movernos en los otros tres “triángulos”:
Puede verificar que cada fila, cada columna y cada diagonal principal tengan la misma suma: 65.
Algunos comentarios más sobre la construcción anterior:
Aquí hay una implementación simple en Python:
n = int( input() ) h = (n-1)//2
A = [ [ 0 for c in range(n) ] for r in range(n) ] for r in range(n):
for c in range(n):
A[ (r+ch)%n ][ (r-c+h)%n ] = r*n+c+1 for r in range(n):
print(' '.join( '{:4d}'.format(x) for x in A[r] ))
n = int( input() ) h = (n-1)//2
A = [ [ 0 for c in range(n) ] for r in range(n) ] for r in range(n):
for c in range(n):
A[ (r+ch)%n ][ (r-c+h)%n ] = r*n+c+1 for r in range(n):
print(' '.join( '{:4d}'.format(x) for x in A[r] ))
n = int( input() ) h = (n-1)//2
A = [ [ 0 for c in range(n) ] for r in range(n) ] for r in range(n):
for c in range(n):
A[ (r+ch)%n ][ (r-c+h)%n ] = r*n+c+1 for r in range(n):
print(' '.join( '{:4d}'.format(x) for x in A[r] ))
n = int( input() ) h = (n-1)//2
A = [ [ 0 for c in range(n) ] for r in range(n) ] for r in range(n):
for c in range(n):
A[ (r+ch)%n ][ (r-c+h)%n ] = r*n+c+1 for r in range(n):
print(' '.join( '{:4d}'.format(x) for x in A[r] ))
Una cosa realmente interesante es que el algoritmo puede verse como tomar la cuadrícula girada (que se muestra en la segunda imagen) y colocarla en un toro [matemático] n \ veces n [/ matemático].
Para una prueba simple de por qué funciona el algoritmo, es mejor llenar la cuadrícula con los números del 0 al [matemático] n ^ 2-1 [/ matemático]. Cada uno de estos números se puede escribir en la forma [matemática] an + b [/ matemática] para [matemática] 0 \ leq a, b <n [/ matemática]. Elija cualquier fila o columna de la cuadrícula resultante. Debería ver fácilmente que no hay dos números en esa fila / columna que tengan el mismo valor de [matemáticas] a [/ matemáticas], y que no haya dos números que tengan el mismo valor de [matemáticas] b [/ matemáticas]. Se deduce que su suma es siempre [matemática] (0 + 1 + \ cdots + (n-1)) \ cdot (n + 1) [/ math].