Пределы магических квадратов
Letter.htm - избранные места из переписки,
MagicSquare.java - текст исходной программы,
Result3.java - результат суперкомпиляции при dim=3,
MagicSquare.zip - результаты всех суперкомпиляций.
Пусть M - магический квадрат, составленный из последовательных натуральных чисел, начиная с 1.
В этом примере рассматриваем магические квадраты нечетного размера, потому что используем простой способ построения такого квадрата.
Для пятерки способ построения показан ниже. Составляется таблица по-порядку по диагоналям, затем наружные числа сдвигаются на свободные места.
|
|
Пусть s - сумма чисел по строке, по столбцу или по диагонали.
Обозначим через A матрицу M / s
Например, для квадрата 3 на 3 получается матрица
4/15 | 9/15 | 2/15 |
3/15 | 5/15 | 7/15 |
8/15 | 1/15 | 6/15 |
Теперь рассматриваем предел при n стремящемся к бесконечности матрицы
A^n.
Замечание 1. Если делить не на s, то в пределе получается либо 0, либо бесконечность. Доказательство - не очень простое упражнение по курсу алгебра для первого курса.
Замечание 2. В ответе получается матрица из одинаковых элементов, равных 1/dim (1/размер квадрата).
Предлагается программа на Java,
- параметром которой является размер квадрата dim (переменная dim расположена в начале программы MagicSquare.java - я ее менял вручную для каждой суперкомпиляции и каждого пуска),
- которая сначала строит магический квадрат согласно приведенной для пятерки схеме,
- затем вычисляется указанный предел путем многократного умножения матрицы A на себя.
Предел для двойной точности получается уже при 20-ой степени, но у меня сделан большой цикл с целью измерить время исполнения.
При суперкомпиляции этой программы происходит следующее
- процесс построения магического квадрата полностью специализируется, то есть матрица получается как заданная, причем не массивом, а набором переменных.
- каждый элемент матрицы получается одним оператором Явы, а не несколькими, как было раньше.
- матрицы промежуточных вычислений почему-то превращаются в набор одномерных массивов. Если бы в набор чисел, то ускорение исполнения было бы еще больше.
- скорость исполнения повышается примерно в четыре раза.
В поддиректориях Result3, Result5, Result7, Result9, Result11, Result13 MagicSquare.zip приведены результаты суперкомпиляции для указанных размеров квадратов.
Привожу времена исполнения исходной программы и программы после суперкомпиляции (умножение в цикле - 100 000 раз). В первой таблице используется вариант счета без параметра -Xint
dim | время до суперкомпиляции | время после суперкомпиляции | коэффицент ускорения | |
3 | 0.14 | 0.3 | 4.6 | |
5 | 0.67 | 0.12 | 5.5 | |
7 | 1.6 | 0.29 | 5.4 | |
9 | 3.16 | 0.6 | 5.3 | |
11 | 5.5 | 1.1 | 5.0 | |
13 | 8.8 | 30.5 | 0.3 | |
15 | 14.0 | 45.0 | 0.3 |
Во второй таблице используется параметр -Xint
dim | время до суперкомпиляции | время после суперкомпиляции | коэффицент ускорения | |
3 | 1.810 | 0.575 | 3.14 | |
5 | 7.185 | 2.245 | 3.20 | |
7 | 18.220 | 5.660 | 3.22 | |
9 | 37.30 | 10.50 | 3.55 | |
11 | 66.7 | 18.50 | 3.60 | |
13 | 108.2 | 28.94 | 3.74 | |
15 | 163.7 | 43.20 | 3.79 |
Обсуждение полученных чисел приведено в избранной переписке по этому поводу Letter.htm.