Рассказы о математике | страница 18



for x31 in digits - set([x11, x12, x13, x14, x21, x22, x23, x24]):

for x32 in digits - set([x11, x12, x13, x14, x21, x22, x23, x24, x31]):

for x33 in digits - set([x11, x12, x13, x14, x21, x22, x23, x24, x31, x32]):

       x34 = s - x31 - x32 - x33

       x41 = s - x11 - x21 - x31

x42 = s - x12 - x22 - x32

x43 = s - x13 - x23 - x33

x44 = s - x14 - x24 - x34

if x34 <= 0 or x41 <= 0 or x42 <= 0 or x43 <= 0 or x44 <= 0: continue


data = [x11, x12, x13, x14, x21, x22, x23, x24, x31, x32, x33, x34, x41, x42, x43, x44]

if len(data) != len(set(data)): continue

if is_magic(data, 4):

print data

cnt += 1


print cnt


В результате, программа проработала всего лишь около часа (вместо 3х лет!), всего было выведено 7040 квадратов размерностью 4х4. Разумеется, большинство из них являются поворотами или отражениями друг друга, было доказано что уникальных квадратов всего 880.


Вспомним магический квадрат Дюрера, в нижнем его столбце есть цифры 1514, соответствующие году создания гравюры. С помощью программы можно решить еще одну задачу: посмотреть сколько всего возможно квадратов с такими цифрами. Здесь число вариантов перебора еще меньше, т.к. еще 2 цифры фиксированы. Оказывается, помимо “авторского”, возможны всего 32 варианта, например:

1 15 14 4       2 15 14 3

5 11 8 10      5 10 7 12

12 6 9 7      11 8 9 6

16 2 3 13      16 1 4 13


Интересно, что верхний ряд помимо цифр 15 и 14 может содержать либо 1,4 либо 2,3, других вариантов нет. Разные варианты содержат лишь перестановки этих цифр.


Если же говорить о квадратах большей размерности, то число вариантов перебора для них получается слишком большим. Так для квадрата 5х5, даже если выразить крайние члены через соседние, получаем 4х4 остающихся клеток, что даст нам те же самые 16! вариантов перебора. Разумеется, в реальности такие квадраты не строили методом полного перебора, существует множество алгоритмов их построения, например метод Франклина, Россера, Рауз-Болла, желающие могут поискать их самостоятельно. В архиве с книгой приложен файл “07 - magic5.cpp” для расчета квадратов 5х5 на С++, но автору так и не хватило терпения дождаться результатов.