В ответе на предыдущий вопрос я упомянул распространенное, но ошибочное мнение, что «гауссовское» исключение происходит за времени. Хотя очевидно, что алгоритм использует O ( n 3 ) арифметических операций, небрежная реализация может создавать числа с экспоненциально большим количеством битов. В качестве простого примера, предположим, что мы хотим диагонализировать следующую матрицу:
Если мы используем версию алгоритма исключения без деления, которая добавляет только целочисленные кратные одной строки к другой, и мы всегда поворачиваемся на диагональном элементе матрицы, выходная матрица имеет вектор по диагонали.
Но что это фактическое время сложность исключения Гаусса? Большинство авторов комбинаторной оптимизации, похоже, довольны «сильно полиномиальными», но мне любопытно, что это за полином на самом деле.
Это все еще лучший анализ, известный? Существует ли стандартная ссылка, которая дает более четкую временную границу или, по крайней мере, лучшую оценку требуемой точности?
В более общем смысле: каково время работы (в целочисленном ОЗУ) самого быстрого алгоритма, известного для решения произвольных систем линейных уравнений?
Ответы:
источник
Я думаю, что ответом на ваш первый вопрос также является из-за следующих аргументов: статья Эдмондса не описывает вариант исключения Гаусса но это доказывает, что любое число, вычисленное в шаге алгоритма, является детерминантом некоторой подматрицы A. По книге Шрайвера «Теория линейного и целочисленного программирования» мы знаем, что если для кодирования A требуется b бит (b должно быть вO˜(n3log(∥A∥+∥b∥)) O˜(log(∥A∥) ) тогда любому из его подопределителей требуется не более 2b битов (теорема 3.2). Чтобы сделать гауссовское исключение алгоритмом полиномиального времени, мы должны позаботиться о вычисленных коэффициентах: мы должны исключить общие факторы из каждой дроби, которую мы вычисляем на любом промежуточном шаге, и тогда все числа имеют длину кодирования, линейную по длине кодирования A.
источник