Представлю новый алгоритм построения магических квадратов из смитов, с помощью которого мне удалось получить решение для квадратов 7-го порядка.
Этот алгоритм несколько похож на тот алгоритм, который был представлен мной ранее для квадратов 6-го порядка. В обоих алгоритмах сначала строятся заготовки, а затем выполняется достраивание этих заготовок до магического квадрата. В предыдущем алгоритме для квадратов 6-го порядка роль заготовки выполнял набор из 4 оригинальных строк, в котором все числа должны быть различны. Необходимо выполнить преобразование этой заготовки с целью получить из неё все варианты, а затем каждый вариант проверить на возможность достраивания до магического квадрата. Этот алгоритм так и не был реализован.
Теперь новый алгоритм на примере квадратов 5-го порядка (проще рассказывать).
Берём массив cмитов, из которого 12d3 построил наименьший магический квадрат:
Код:
4, 22, 27, 58, 85, 94, 121, 166, 202, 265, 274, 319, 346, 355, 382, 391, 454, 517, 526, 535, 576, 648, 706, 729
Генерируем все оригинальные наборы по 5 чисел, сумма которых равна магической константе квадрата
1636. Этот этап выполняется очень быстро (особенно для квадратов из смитов). В данном примере сгенерировано 216 оригинальных наборов (напомню: оригинальным набором я называю такой набор, в котором числа следуют в порядке возрастания).
Теперь из всех наборов надо выбрать все пары наборов, имеющих один общий элемент. Это будут две диагонали будущего квадрата.
Например, выбираем два таких оригинальных набора (я сделал это просто по известному квадрату, а вообще, конечно, надо написать программу выбора всех пар оригинальных наборов):
Код:
85, 121, 346, 355, 729
94, 166, 346, 382, 648
Размещаем эти наборы на месте диагоналей будущего квадрата:
Код:
85 X X X 94
X 121 X 166 X
X X 346 X X
X 382 X 355 X
648 X X X 729
Заготовка готова. Но из неё надо получить все варианты. Для этого надо переставить все числа в обеих диагоналях, за исключением центрального элемента, этот элемент остаётся всегда на своём месте. Вариантов заготовки получается 24*24=576. Это небольшое количество вариантов.
И, наконец, на последнем этапе каждый из 576 вариантов заготовки проверяется на возможность достраивания до магического квадрата. Достраивание выполняется практически мгновенно (даже на Бейсике). Здесь для оставшихся 16 свободных чисел работает формула 7+9 (7 независимых переменных и 9 зависимых переменных).
Я написала программу, которая по двум введённым диагоналям делает все варианты и достраивает их. При этом не делала никаких отсечений, программа выдаёт все квадраты. Для данного примера программа выдала 16 квадратов (работала несколько минут). Это значит, что оригинальных квадратов будет 4 (я не считаю эквивалентными квадраты, получающиеся друг из друга М-преобразованиями).
Один квадрат был выложен здесь его автором 12d3.
Второй квадрат я получила по программе, представленной svb (в программе реализована общая формула 14+11). Вот этот квадрат:
Код:
85 58 391 454 648
274 729 517 94 22
535 202 346 27 526
576 382 4 355 319
166 265 378 706 121
Кстати, программа svb выдаёт только один этот квадрат, то есть в этой программе три остальные квадрата, получаемые из данного М-преобразованиями, считаются эквивалентными и отбрасываются.
Так же, видимо, считал и 12d3.
Среди 16 квадратов, полученных по моей программе, есть ещё два (кроме двух указанных), входящие в группу эквивалентности относительно М-преобразований. Остальные 12 квадратов эквивалентны этим четырём квадратам относительно основных преобразований.
Теперь применительно к квадратам 7-го порядка. Сначала тоже генерируем из чисел данного массива все оригинальные наборы по 7 чисел.
Для массива из последовательных смитов 319, 346, …, 1507, 1581 генерируется 50417 оригинальных наборов
(программу генерации оригинальных наборов прислал мне svb).
Я проверила по этой программе 20 потенциальных массивов. Для данного массива количество оригинальных наборов самое большое.
Из всех оригинальных наборов надо теперь выбрать четыре набора, такие, что у них один общий элемент. Понятно, что надо выбрать все такие четвёрки наборов.
Эти 4 набора размещаем в будущем квадрате так: центральная строка, центральный столбец, две диагонали. Оригинальная заготовка готова.
Я сгенерировала заготовку случайным образом. Было сделано всего две попытки, и вторая попытка увенчалась успехом (элемент везения!). Вот сгенерированная мной заготовка:
Код:
778 X X 1284 X X 706
X 636 X 913 X 1219 X
X X 922 645 627 X X
729 728 576 654 1376 825 663
X X 382 915 1165 X X
X 852 X 762 X 438 X
1111 X X 378 X X 958
У нас осталось 24 свободных числа. Достраивание происходит очень быстро. Работает формула 13+11 (13 независимых переменных и 11 зависимых).
Программу последнего этапа (достраивания) я написала и протестировала на классических квадратах, и на квадратах из простых чисел. Ну, и вот на квадрате из смитов тоже. Магический квадрат сразу же получается, причём из этого варианта заготовки всего один.
Для классических квадратов из одного варианта заготовки получается много квадратов. Для квадратов из простых чисел тоже несколько квадратов. А вот из смитов в данном примере получился только один квадрат.
Понятно, что заготовку тоже нужно преобразовать с целью получения всех вариантов. Вот тут-то и сложность! Вариантов получается слишком много.
Кроме того, это ведь не единственная оригинальная заготовка.
Точно так же я построила и магический квадрат 7-го порядка из произвольных смитов (причём с первой попытки). Ну, надо же, наконец, быть удаче после 5 месяцев напряжённой работы.
Может быть, кому-нибудь эти примеры помогут решить задачу до конца хотя бы для квадратов 7-го порядка. Как я уже говорила, мои решения для квадратов данного порядка не являются окончательными, потому что нет гарантии, что построенные квадраты наименьшие.