Квадратность задачи можно развернуть в чисто векторное описание.
Пусть для квадрата
нужно найти вектор
длиной
. Тогда искомая сумма зависит от двух статичных таблиц GCD и DIST размером
. Статичных в том смысле, что их не нужно пересчитывать в процессе вычислений и достаточно посчитать в начале.
(код GCD и DIST)
Код:
n= 3; N= n^2;
GCD= matrix(N, N, i, j, gcd(i, j));
DIST= matrix(N, N);
for(a=1, N,
ia= a\n; ja= a%n; if(ja, ia++, ja= n);
for(b=1, N,
ib= b\n; jb= b%n; if(jb, ib++, jb= n);
if(ib > ia || (ia == ib && jb > ja), DIST[a,b]= (ia - ib)^2 + (ja - jb)^2, DIST[a,b]= 0)
));
(GCD и DIST для n=3)
Код:
? GCD
%4 =
[1 1 1 1 1 1 1 1 1]
[1 2 1 2 1 2 1 2 1]
[1 1 3 1 1 3 1 1 3]
[1 2 1 4 1 2 1 4 1]
[1 1 1 1 5 1 1 1 1]
[1 2 3 2 1 6 1 2 3]
[1 1 1 1 1 1 7 1 1]
[1 2 1 4 1 2 1 8 1]
[1 1 3 1 1 3 1 1 9]
? DIST
%5 =
[0 1 4 1 2 5 4 5 8]
[0 0 1 2 1 2 5 4 5]
[0 0 0 5 2 1 8 5 4]
[0 0 0 0 1 4 1 2 5]
[0 0 0 0 0 1 2 1 2]
[0 0 0 0 0 0 5 2 1]
[0 0 0 0 0 0 0 1 4]
[0 0 0 0 0 0 0 0 1]
[0 0 0 0 0 0 0 0 0]
(GCD и DIST для n=4)
Код:
? GCD
%14 =
[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1]
[1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2]
[1 1 3 1 1 3 1 1 3 1 1 3 1 1 3 1]
[1 2 1 4 1 2 1 4 1 2 1 4 1 2 1 4]
[1 1 1 1 5 1 1 1 1 5 1 1 1 1 5 1]
[1 2 3 2 1 6 1 2 3 2 1 6 1 2 3 2]
[1 1 1 1 1 1 7 1 1 1 1 1 1 7 1 1]
[1 2 1 4 1 2 1 8 1 2 1 4 1 2 1 8]
[1 1 3 1 1 3 1 1 9 1 1 3 1 1 3 1]
[1 2 1 2 5 2 1 2 1 10 1 2 1 2 5 2]
[1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1]
[1 2 3 4 1 6 1 4 3 2 1 12 1 2 3 4]
[1 1 1 1 1 1 1 1 1 1 1 1 13 1 1 1]
[1 2 1 2 1 2 7 2 1 2 1 2 1 14 1 2]
[1 1 3 1 5 3 1 1 3 5 1 3 1 1 15 1]
[1 2 1 4 1 2 1 8 1 2 1 4 1 2 1 16]
? DIST
%15 =
[0 1 4 9 1 2 5 10 4 5 8 13 9 10 13 18]
[0 0 1 4 2 1 2 5 5 4 5 8 10 9 10 13]
[0 0 0 1 5 2 1 2 8 5 4 5 13 10 9 10]
[0 0 0 0 10 5 2 1 13 8 5 4 18 13 10 9]
[0 0 0 0 0 1 4 9 1 2 5 10 4 5 8 13]
[0 0 0 0 0 0 1 4 2 1 2 5 5 4 5 8]
[0 0 0 0 0 0 0 1 5 2 1 2 8 5 4 5]
[0 0 0 0 0 0 0 0 10 5 2 1 13 8 5 4]
[0 0 0 0 0 0 0 0 0 1 4 9 1 2 5 10]
[0 0 0 0 0 0 0 0 0 0 1 4 2 1 2 5]
[0 0 0 0 0 0 0 0 0 0 0 1 5 2 1 2]
[0 0 0 0 0 0 0 0 0 0 0 0 10 5 2 1]
[0 0 0 0 0 0 0 0 0 0 0 0 0 1 4 9]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 4]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
При этом считать сумму нужно по ненулевому треугольнику матрицы DIST. Количество элементов суммы легко определить для каждого
(кол-во членов суммы)
Код:
? n=3;N=n^2;sum(i=1,N-1,i)
%17 = 36
? n=4;N=n^2;sum(i=1,N-1,i)
%18 = 120
? n=5;N=n^2;sum(i=1,N-1,i)
%19 = 300
? n=6;N=n^2;sum(i=1,N-1,i)
%20 = 630
Количество единиц в треугольнике DIST зададут константу (только когда ищем максимум суммы) в искомой сумме, и оно равно (возможно, не уверен)
. Количество единиц в соответствующем треугольнике матрицы GCD больше, поэтому смотреть нужно на единицы матрицы DIST.
Сама же сумма считается как
Код:
sum(i=1,N-1,sum(j=i+1,N,GCD[X[i],X[j]]*DIST[i,j]))
Это включая единицы, т.е. без вычета константы. Можно попытаться посчитать её без единиц с вычетом константы, что несколько сократит вычисления.
Итог. Задача выглядит NP-трудной. Ни веса чисел, ни разбиение квадрата на подквадраты не помогают. Получающиеся оптимумы не соответсвуют действительным. Пытаюсь в "векторной" картинке разглядеть хоть какую-то эвристику, в "квадратной" картине всё выглядит ещё сложнее.