Ещё два необходимых условия (копирую из статьи):
Цитата:
С. все числа массива можно разбить (хотя бы одним способом) на 9 групп по 4 числа так, что сумма чисел в каждой группе равна 2S/3;
D. все числа массива можно разбить (хотя бы одним способом) на 4 группы по 9 чисел так, что сумма чисел в каждой группе равна 3S/2.
Очевидно, что из этих двух условий автоматически следует первое необходимое условие. Но первое условие у нас уже выполняется для всех найденных массивов, а вот насчёт двух последних условий --- их выполнение надо проверить. Если хотя бы одно из этих условий для данного массива не выполняется, то квадрат из чисел этого массива построить невозможно; и проверять его уже не нужно.
Условия C и D следуют из теории пандиагональных квадратов Россера и были отмечены в этой теме
Pavlovsky.
Покажу на примере найденного пандиагонального квадрата 6-го порядка с магической константой 414 выполнение необходимого условия D.
Это разбиение на 4 группы по 9 чисел так, что сумма чисел в каждой группе равна 3S/2 (S - магическая константа квадрата):
Код:
3, 31, 109, 101, 83, 17, 127, 19, 131
73, 47, 151, 43, 103, 67, 107, 23, 7
113, 179, 37, 59, 5, 41, 11, 97, 79,
1, 13, 71, 53, 167, 89, 137, 61, 29
Как выглядит разбиение на девятки в самом квадрате, хорошо видно на рисунке, приведённом в
статье.
[см. рис. 11; в статье почему-то два рис. 11
, нужный рисунок в конце статьи]
Я рассматривала в этой статье алгоритм перебора по девяткам. Этот перебор выполняется достаточно быстро, намного быстрее, чем перебор для всего массива из 36 чисел.
Но возникает вопрос: как много будет таких разбиений на девятки
Даже если таких наборов девяток будет много, можно попытаться сделать многопоточную программу для этого алгоритма. Каждый набор девяток обрабатывается совершенно независимо и, как мне кажется, здесь вполне можно применить многопоточное программирование.
Нам нужно получить хотя бы одно решение; какой-то из наборов девяток может дать решение; поскольку процесс проверки наборов девяток будет параллельным, решение может найтись очень быстро.
Жаль, не умею писать многопоточные программы
В статье приведён пример, где найдено несколько разбиений на девятки для заданного массива из 36 чисел. Каждый набор девяток я проверяла отдельно. Один набор девяток (для чисел Смита) проверяется считанные секунды (для простых чисел это могут быть уже минуты - таковы свойства простых чисел).
Но я не сделала тогда программу поиска всех разбиений на девятки, написала примитивную программку, которая быстро нашла несколько разбиений.
Итак, вопрос: сколько всего различных разбиений на девятки (обладающих указанным свойством) имеется для следующего массива из 36 чисел:
Код:
1 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 107 109 113 127 131 137 151 167 179
Два набора девяток считаются различными, если они отличаются хотя бы одной девяткой (порядок следования чисел в девятке не важен - не есть признак различных девяток; можно рассматривать ранжированные девятки).
Мысли вслух
Наверное, два набора не могут отличаться только одной девяткой
Если есть по одной разной девятке, то должно быть, как минимум, ещё по одной разной девятке. Так?
Все различные разбиения массива из 36 чисел на группы по четыре девятки от меня ускользают; ещё тогда ускользали, когда писала указанную статью