Введение

Вычислительный метод
алгоритмы факторизации

В математике и компьютерной алгебре факторизация многочленов, или полиномиальная факторизация, представляет собой выражение многочлена с коэффициентами в заданном поле или в целых числах в виде произведения неприводимых множителей с коэффициентами в той же области. Факторизация многочленов является одним из фундаментальных компонентов систем компьютерной алгебры. Первый алгоритм полиномиальной факторизации был опубликован Теодором фон Шубертом в 1793 году. Леопольд Кронекер заново открыл алгоритм Шуберта в 1882 году и расширил его на многомерные многочлены и коэффициенты в алгебраическом расширении. Однако большая часть знаний по этой теме не старше примерно 1965 года и появления первых систем компьютерной алгебры: когда давно известные алгоритмы с конечным числом шагов были впервые реализованы на компьютерах, они оказались крайне неэффективными. Тот факт, что почти любой одномерный или многомерный многочлен степени до 100 и с коэффициентами умеренного размера (до 100 бит) может быть разложен на множители современными алгоритмами за несколько минут машинного времени, свидетельствует об успешности решения этой задачи за последние пятнадцать лет (Эрих Кальтофен, 1982).

В настоящее время современные алгоритмы и компьютеры могут быстро факторизовать одномерные многочлены степени более 1000, имеющие коэффициенты, содержащие тысячи цифр. Для этого, даже при факторизации над рациональными числами и числовыми полями, фундаментальным шагом является факторизация многочлена над конечным полем.

Факторизация без квадратов

Если два или более множителей полинома совпадают, то полином кратен квадрату этого множителя. Этот кратный множитель также является множителем производной полинома (по любой из переменных, если их несколько). Для унивариантных полиномов кратные множители эквивалентны кратным корням (в подходящем поле расширения). Для унивариантных полиномов над рациональными числами (или, в более общем случае, над полем характеристики ноль), алгоритм Юна использует это для эффективной факторизации полинома на факторы, свободные от квадратов, то есть на множители, не являющиеся кратными квадрату, выполняя последовательность вычислений НОД, начиная с НОД(f(x), f'(x)). Для факторизации исходного полинома достаточно факторизовать каждый фактор, свободный от квадратов. Факторизация на факторы, свободные от квадратов, является, таким образом, первым шагом в большинстве алгоритмов факторизации полиномов. Алгоритм Юна распространяет это на многовариантный случай, рассматривая многовариантный полином как унивариантный полином над кольцом полиномов. В случае полинома над конечным полем алгоритм Юна применим только если степень меньше характеристики, поскольку в противном случае производная ненулевого полинома может быть равна нулю (над полем из p элементов производная полинома от x^p всегда равна нулю). Тем не менее, последовательность вычислений НОД, начиная с полинома и его производной, позволяет вычислить разложение на факторы, свободные от квадратов; см. Факторизация полиномов над конечными полями#Факторизация на факторы, свободные от квадратов.

Классические методы

В этом разделе описываются стандартные методы, которые могут быть удобны при вычислениях вручную. Эти методы не применяются для компьютерных вычислений, поскольку они основаны на разложении целых чисел на множители, что в настоящее время медленнее, чем разложение многочленов на множители. Два следующих метода начинаются с однопеременного многочлена с целочисленными коэффициентами для поиска множителей, которые также являются многочленами с целочисленными коэффициентами.

Получение линейных коэффициентов

Все линейные факторы с рациональными коэффициентами можно найти с помощью теоремы о рациональных корнях. Если многочлен, который требуется разложить на множители, имеет вид , то все возможные линейные множители имеют форму , где – целый делитель свободного члена , а – целый делитель старшего коэффициента. Все возможные комбинации целых делителей можно проверить на предмет того, являются ли они корнями, и каждый найденный корень позволяет выделить соответствующий линейный множитель с помощью деления многочлена в столбик. Если исходный многочлен является произведением множителей, среди которых по крайней мере два имеют степень 2 или выше, то данный метод дает лишь частичную факторизацию; в противном случае факторизация завершена. В частности, если существует ровно один нелинейный фактор, то это будет многочлен, остающийся после выделения всех линейных факторов. В случае кубического многочлена, если он вообще может быть разложен на множители, теорема о рациональных корнях обеспечивает полную факторизацию либо на линейный множитель и неприводимый квадратный множитель, либо на три линейных множителя.

Факторинг одновариантных многочленов на целых числах

Если является унивариантным многочленом над целыми числами, предполагается, что он не имеет общего множителя и не содержит квадратов, то начинают с вычисления границы такой, что любой фактор имеет коэффициенты абсолютной величины, ограниченные этим значением. Таким образом, если – целое число, большее, чем , и если известно по модулю , то можно восстановить из его образа по модулю .

Алгоритм Зассенхауса выполняется следующим образом. Сначала выбирают простое число такое, чтобы образ оставался без квадратов и имел ту же степень, что и . Затем факторизуют . Это дает целочисленные многочлены, произведение которых совпадает с . Далее применяют подъём Хенселя; он обновляет таким образом, чтобы их произведение совпадало с , где достаточно велико, чтобы превышать : таким образом, каждый соответствует однозначно определенному целочисленному многочлену. По модулю , многочлен имеет множителей (с точностью до единиц): произведения всех подмножеств этих множителей по модулю не обязательно соответствуют "истинным" множителям в , но мы можем легко проверить их делением в . Таким образом, все неприводимые истинные множители можно найти, проверив не более случаев, сводимых к случаям за счет пропуска дополнений. Если приводим, то число случаев дополнительно уменьшается, удаляя те, которые входят в уже найденный истинный множитель. Алгоритм Зассенхауса быстро обрабатывает каждый случай (каждое подмножество), однако в худшем случае он рассматривает экспоненциальное число случаев. Первый алгоритм полиномиального времени для факторизации рациональных многочленов был открыт Ленстрой, Ленстрой и Ловашом и является применением алгоритма редукции базиса решетки Ленстра–Ленстра–Ловаша (LLL). Упрощенная версия алгоритма факторизации LLL выглядит следующим образом: вычисляют комплексный (или p-адический) корень α многочлена с высокой точностью, затем используют алгоритм редукции базиса решетки Ленстра–Ленстра–Ловаша, чтобы найти приближенное линейное соотношение между 1, α, α², α³, … с целочисленными коэффициентами, которое может быть точным линейным соотношением и многочленным фактором. Можно определить границу точности, которая гарантирует, что этот метод выдаст либо фактор, либо доказательство неприводимости. Хотя этот метод завершается за полиномиальное время, он не используется на практике, потому что решетка имеет высокую размерность и огромные элементы, что замедляет вычисления. Экспоненциальная сложность алгоритма Зассенхауса связана с комбинаторной задачей: как выбрать правильные подмножества. Современные реализации факторизации работают аналогично Зассенхаусу, за исключением того, что комбинаторная задача преобразуется в задачу решетки, которая затем решается с помощью LLL. В этом подходе LLL используется не для вычисления коэффициентов множителей, а для вычисления векторов с элементами в {0, 1}, которые кодируют подмножества, соответствующие неприводимым истинным множителям.