- 22, Oct 2024
- #1
Введение
У вавилонян был хитрый метод поиска квадратных корней. Чтобы найти квадратный корень числа
, you start with aM
M = [[7,2],[3,4]]
guess = [[1., 0. ], [0., 1. ]] <-- 2x2 identity matrix
guess = [[4., 1. ], [1.5, 2.5 ]]
guess = [[2.85294, 0.558824], [0.838235, 2.01471]]
guess = [[2.60335, 0.449328], [0.673992, 1.92936]]
guess = [[2.58956, 0.443035], [0.664553, 1.92501]]
guess = [[2.58952, 0.443016], [0.664523, 1.92499]]
guess = [[2.58952, 0.443016], [0.664523, 1.92499]]
, затем уточните его, неоднократно оценивая строку компьютерного кода (или эквивалента свитка папируса):
guess*guess = M
Если предположение меньше, чем sqrt(N), N/guess должно быть больше, чем sqrt(N), поэтому усреднение этих двух членов должно приблизить вас к истинному ответу. Оказывается, этот метод довольно быстро сходится к правильному ответу:
guess = (guess + inverse(guess)*M) / 2
Расширение
Существует ли эквивалентный алгоритм для матриц? Отбросив всю математическую строгость, если мы хотим найти «квадратный корень» из квадратной матрицы guess
, we may again start with a M
, затем уточните его, неоднократно оценивая строку кода:
N = 7
guess = 1
guess = 4.0
guess = 2.875
guess = 2.65489
guess = 2.64577
guess = 2.64575
guess = 2.64575
где inverse() — обратная функция матрицы, а * — умножение матрицы. Вместо 1 нашей первоначальной догадкой является единичная матрица соответствующего размера.
Однако сходимость больше не гарантируется — алгоритм расходится для большинства (но не всех) входных данных. Если M производит сходящийся ряд, это Вавилонская матрица. Более того, сходящееся значение на самом деле представляет собой действительный квадратный корень матрицы (т. Е. guess = (guess + N/guess) / 2
).
Пример
Вот пример использования матрицы 2x2, показывающий сходимость ряда:
guess
Всего за несколько итераций ряд сходится с точностью до 1e-9. Через некоторое время она становится неустойчивой из-за суммирования ошибок округления, но демонстрируется первоначальная устойчивость, чего вполне достаточно.
Задача
Ваша задача — найти квадратную матрицу. N
, populated by the integers 1 through 9, which, when given an initial guess of an identity matrix of the proper size, converges successfully. Matrices should be submitted as comma-delimited text (or attached text files, if they are too large), with either brackets or newlines separating subsequent rows.
Правила
Несмотря на то, что матрица M и начальное предположение используют целые числа (в основном для удобства отображения), вся арифметика должна выполняться с использованием плавающей запятой двойной точности. Целочисленные операторы (например, 3/2, приравнивающие к 1) запрещены.
Ошибки деления на ноль, сингулярные матрицы и переполнение/недополнение не могут использоваться для приведения последовательности к «сходящейся». Значения всегда должны быть правильными числами с плавающей запятой, чтобы считаться сошедшимися.
Алгоритм считается сходящимся, если итерация не приводит к изменению, превышающему 1e-9, в любой отдельной ячейке.
Вы можете использовать внешние математические библиотеки для инверсии матриц (нет необходимости изобретать велосипед).
Условие победы
Победителем становится самая большая представленная действительная вавилонская матрица, состоящая из целых чисел от 1 до 9, по истечении одной недели. Вы также должны предоставить код, который вы использовали для поиска матрицы.
#вызов кода #математика #последовательность