На английской википедии нашел раздел про системы линейных Диофантовых уравнений (на русской странице этого нет).
Идея такая, что решаем матричное уравнение в целых числах.
- столбец решений высоты 16 (например, если развернули наш квадрат по строкам).
- столбец высоты 10, который содержит десять пятёрок.
- матрица 10 на 16 с коэффициентами линейных ограничений (по 4 единицы в строке для тех элементов, которые суммируем).
Эта матрица приводится к Smith normal form. В Matlab есть такая встроенная функция. В моём Octave её нет, но с интернета скачал матлаб код такой функции.
Функция выдаёт две матрицы. Матрица имеетр размер 10 на 10. Матрица имеет размер 16 на 16. Обе матрицы целочисленные, имеют целочисленные обратные матрицы и имеют детерминант .
Пр этом матрица получается диагональной. В нашем случае на диагонали стоит 8 единиц, потом одна двойка, потом нуль.
Общее решение в целых числах получается как сумма одного квадрата и ещё 7 квадратов с целыми весами.
Код: Выбрать все
0 0 5 0
-5 5 0 5
5 0 0 0
5 0 0 0
Код: Выбрать все
0 -1 1 0 0 1 -1 0 0 0 0 0 -1 -1 1 1
1 0 -1 0 1 -1 0 0 1 0 0 -1 1 1 -1 -1
-1 1 0 0 -1 0 1 0 -1 0 0 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 0 -1 0 1 1 -2 0 0 1 -1 0
0 -1 1 0 0 -1 1 0 1 -1 1 -1
0 0 0 0 0 0 0 0 0 0 0 0
-1 1 0 0 -1 0 1 0 -1 0 0 1
Дело за малым.
Посчитать количество комбинаций из этих 7 весов, которые дают неотрицательные квадраты.