Метод Делаира или метод латинских квадратов
Суть метода
1. Из целых чисел от 0 до n-1 строятся два латинских квадрата размерности n x n.
Первая строка первого квадрата строится следующим образом:
На первое место ставится число (n-1)/2, остальные числа занимают произвольные позиции.
Каждая следующая строка строится из предыдущей, переносом каждого элемента на единицу вправо.
Второй квадрат строится аналогично, только:
Число (n-1)/2 ставиться на последнее место в первой строке.
Каждая следующая строка строится из предыдущей переносом каждого элемента на единицу влево.
Каждый элемент первого квадрата умножается на n, а к каждому элементу второго квадрата прибавляется 1.
Затем, каждый элемент первого квадрата складывается с соответствующим ему элементом второго квадрата.
В результате получается магический квадрат, заполненный числами от 1 до n^2.
Реализация на Python
1. Задается матрица, которая будет содержать первый латинский квадрат. И заполняется элементами от 0 до n-1
import numpy
n=input('Please enter n: ')
A=numpy.zeros([n,n])
for i in range(n):
A[i][i]=(n-1)/2
for k in range(n):
if k<(n-1)/2:
if i+k+1<n:
A[i][i+k+1]=k
else:
A[i][i+k+1-n]=k
else:
if k==(n-1)/2:
pass
else:
if k+i<n:
A[i][i+k]=k
else:
A[i][i+k-n]=k
2. Затем, задается вторая матрица, которая будет содержать магический квадрат.
Каждый элемент магического квадрата будет получаться путем умножения соответствующего элемента первой матрицы на n, прибавления к результату умножения элемента с позицией n-1-k (где k — позиция нужного элемента той же строки) и прибавления к результату 1.
B=numpy.zeros([n,n])
for i in range(n):
for k in range(n):
B[i][k]=A[i][k]*n+A[i][n-1-k]+1