В книге также приведена алгебраическая формула любого магического квадрата 3-го порядка. Девять чисел могут составить магический квадрат 3-го порядка тогда и только тогда, когда они являются членами следующей последовательности:
Код:
a-c, a-b+c, a+b, a+b+c, a, a-b-c, a-b, a+b-c, a+c
Если под последовательностями подразмевать возрастающие последовательности, то тут их может быть две (в предположении, что
- центральный элемент и
):
Код:
a-b-c, a-c, a-c+b, a-b, a, a+b, a+c-b, a+c, a+b+c
a-b-c, a-c, a-b, a-c+b, a, a+c-b, a+b, a+c, a+b+c
Какая из них реально имеет место, зависит от соотношения величин
и
(или же
и
).
-- Wed Oct 28, 2009 16:00:33 --Действительно, это минимальный квадрат. Проверил детерминированным алгоритмом все простые в пределах двух миллиардов. Получил
(с точностью до массива) квадрата.
Всё так. Дальнейшие квадраты (а точнее их центральные элементы) приведены в
A166113-- Wed Oct 28, 2009 16:14:34 --Для проверки всех натуральных в
понадобятся десятки дней. Посмотрел на загрузку системы. ЦП используется практически на максимум. А вот памяти выделяется примерно 2,5 Mb. Можно ли как-то убыстрить выполнение, отдав "почти все ресурсы на эту задачу"?
Тут все от быстродействия зависит. Комп по сути занимается факторизацией чисел снова и снова, и память ему для этого особо не нужна. В зависимости от быстродействия до
можно добраться за несколько дней. Например, в поиске квадратов
из последовательных смитов я уже к
подбираюсь.
Если хотите ускорить генерацию смитов, то нужно использовать что-то типа решета Эратосфена, где при прогоне каждого простого
и его степени к соответствующим элементам массива нужно прибавлять сумму цифр
. Тогда сумма цифр простых делителей будет накапливаться в элементах массива без всякой факторизации. Но реализация этого алгоритма для достижения предела
будет уже не три строчки и сильно зависеть от объёма доступной памяти.
-- Wed Oct 28, 2009 16:27:26 --Команду print() тоже пробовал (пробил в help), но это не помогло. В комстроке все отображается как надо, а вот в файле - нет: числа идут без разделения вообще.
По поводу \e. Когда нужно вводить? Перед выполнением 3-ей строки?
Проблема с print вероятно связана с разными способами перевода строки в юниксах и винде. Попробуйте печатать так:
print(n,Strchr(13)); или
print1(n,Strchr(13),Strchr(10));Насчет \e - поэксперементируйте.