Введение
Вычислительный метод
алгоритмы факторизации
factorization algorithms
В математике и компьютерной алгебре факторизация многочленов, или полиномиальная факторизация, представляет собой выражение многочлена с коэффициентами в заданном поле или в целых числах в виде произведения неприводимых множителей с коэффициентами в той же области. Факторизация многочленов является одним из фундаментальных компонентов систем компьютерной алгебры. Первый алгоритм полиномиальной факторизации был опубликован Теодором фон Шубертом в 1793 году. Леопольд Кронекер заново открыл алгоритм Шуберта в 1882 году и расширил его на многомерные многочлены и коэффициенты в алгебраическом расширении. Однако большая часть знаний по этой теме не старше примерно 1965 года и появления первых систем компьютерной алгебры: когда давно известные алгоритмы с конечным числом шагов были впервые реализованы на компьютерах, они оказались крайне неэффективными. Тот факт, что почти любой одномерный или многомерный многочлен степени до 100 и с коэффициентами умеренного размера (до 100 бит) может быть разложен на множители современными алгоритмами за несколько минут машинного времени, свидетельствует об успешности решения этой задачи за последние пятнадцать лет (Эрих Кальтофен, 1982).
When the long known finite step algorithms were first put on computers, they turned out to be highly inefficient. The fact that almost any uni or multivariate polynomial of degree up to 100 and with coefficients of a moderate size (up to 100 bits) can be factored by modern algorithms in a few minutes of computer time indicates how successfully this problem has been attacked during the past fifteen years. (Erich Kaltofen, 1982)
В настоящее время современные алгоритмы и компьютеры могут быстро факторизовать одномерные многочлены степени более 1000, имеющие коэффициенты, содержащие тысячи цифр. Для этого, даже при факторизации над рациональными числами и числовыми полями, фундаментальным шагом является факторизация многочлена над конечным полем.
Факторизация без квадратов
Если два или более множителей полинома совпадают, то полином кратен квадрату этого множителя. Этот кратный множитель также является множителем производной полинома (по любой из переменных, если их несколько). Для унивариантных полиномов кратные множители эквивалентны кратным корням (в подходящем поле расширения). Для унивариантных полиномов над рациональными числами (или, в более общем случае, над полем характеристики ноль), алгоритм Юна использует это для эффективной факторизации полинома на факторы, свободные от квадратов, то есть на множители, не являющиеся кратными квадрату, выполняя последовательность вычислений НОД, начиная с НОД(f(x), f'(x)). Для факторизации исходного полинома достаточно факторизовать каждый фактор, свободный от квадратов. Факторизация на факторы, свободные от квадратов, является, таким образом, первым шагом в большинстве алгоритмов факторизации полиномов. Алгоритм Юна распространяет это на многовариантный случай, рассматривая многовариантный полином как унивариантный полином над кольцом полиномов. В случае полинома над конечным полем алгоритм Юна применим только если степень меньше характеристики, поскольку в противном случае производная ненулевого полинома может быть равна нулю (над полем из p элементов производная полинома от x^p всегда равна нулю). Тем не менее, последовательность вычислений НОД, начиная с полинома и его производной, позволяет вычислить разложение на факторы, свободные от квадратов; см. Факторизация полиномов над конечными полями#Факторизация на факторы, свободные от квадратов.
Классические методы
В этом разделе описываются стандартные методы, которые могут быть удобны при вычислениях вручную. Эти методы не применяются для компьютерных вычислений, поскольку они основаны на разложении целых чисел на множители, что в настоящее время медленнее, чем разложение многочленов на множители. Два следующих метода начинаются с однопеременного многочлена с целочисленными коэффициентами для поиска множителей, которые также являются многочленами с целочисленными коэффициентами.
Получение линейных коэффициентов
Все линейные факторы с рациональными коэффициентами можно найти с помощью теоремы о рациональных корнях. Если многочлен, который требуется разложить на множители, имеет вид , то все возможные линейные множители имеют форму , где – целый делитель свободного члена , а – целый делитель старшего коэффициента. Все возможные комбинации целых делителей можно проверить на предмет того, являются ли они корнями, и каждый найденный корень позволяет выделить соответствующий линейный множитель с помощью деления многочлена в столбик. Если исходный многочлен является произведением множителей, среди которых по крайней мере два имеют степень 2 или выше, то данный метод дает лишь частичную факторизацию; в противном случае факторизация завершена. В частности, если существует ровно один нелинейный фактор, то это будет многочлен, остающийся после выделения всех линейных факторов. В случае кубического многочлена, если он вообще может быть разложен на множители, теорема о рациональных корнях обеспечивает полную факторизацию либо на линейный множитель и неприводимый квадратный множитель, либо на три линейных множителя.
Факторинг одновариантных многочленов на целых числах
Если является унивариантным многочленом над целыми числами, предполагается, что он не имеет общего множителя и не содержит квадратов, то начинают с вычисления границы такой, что любой фактор имеет коэффициенты абсолютной величины, ограниченные этим значением. Таким образом, если – целое число, большее, чем , и если известно по модулю , то можно восстановить из его образа по модулю .
The Zassenhaus algorithm proceeds as follows. First, choose a prime number such that the image of remains square free, and of the same degree as Then factor This produces integer polynomials whose product matches Next, apply Hensel lifting; this updates the in such a way that their product matches , where is large enough that exceeds : thus each corresponds to a well defined integer polynomial. Modulo , the polynomial has factors (up to units): the products of all subsets of These factors modulo need not correspond to "true" factors of in , but we can easily test them by division in This way, all irreducible true factors can be found by checking at most cases, reduced to cases by skipping complements. If is reducible, the number of cases is reduced further by removing those that appear in an already found true factor. The Zassenhaus algorithm processes each case (each subset) quickly, however, in the worst case, it considers an exponential number of cases. The first polynomial time algorithm for factoring rational polynomials was discovered by Lenstra, Lenstra and Lovász and is an application of the Lenstra–Lenstra–Lovász lattice basis reduction (LLL) algorithm A simplified version of the LLL factorization algorithm is as follows: calculate a complex (or p adic) root α of the polynomial to high precision, then use the Lenstra–Lenstra–Lovász lattice basis reduction algorithm to find an approximate linear relation between 1, α, α2, α3, . with integer coefficients, which might be an exact linear relation and a polynomial factor of One can determine a bound for the precision that guarantees that this method produces either a factor, or an irreducibility proof. Although this method finishes in polynomial time, it is not used in practice because the lattice has high dimension and huge entries, which makes the computation slow. The exponential complexity in the Zassenhaus algorithm comes from a combinatorial problem: how to select the right subsets of State of the art factoring implementations work in a manner similar to Zassenhaus, except that the combinatorial problem is translated to a lattice problem that is then solved by LLL. In this approach, LLL is not used to compute coefficients of factors, but rather to compute vectors with entries in {0,1} that encode the subsets of corresponding to the irreducible true factors.
Алгоритм Зассенхауса выполняется следующим образом. Сначала выбирают простое число такое, чтобы образ оставался без квадратов и имел ту же степень, что и . Затем факторизуют . Это дает целочисленные многочлены, произведение которых совпадает с . Далее применяют подъём Хенселя; он обновляет таким образом, чтобы их произведение совпадало с , где достаточно велико, чтобы превышать : таким образом, каждый соответствует однозначно определенному целочисленному многочлену. По модулю , многочлен имеет множителей (с точностью до единиц): произведения всех подмножеств этих множителей по модулю не обязательно соответствуют "истинным" множителям в , но мы можем легко проверить их делением в . Таким образом, все неприводимые истинные множители можно найти, проверив не более случаев, сводимых к случаям за счет пропуска дополнений. Если приводим, то число случаев дополнительно уменьшается, удаляя те, которые входят в уже найденный истинный множитель. Алгоритм Зассенхауса быстро обрабатывает каждый случай (каждое подмножество), однако в худшем случае он рассматривает экспоненциальное число случаев. Первый алгоритм полиномиального времени для факторизации рациональных многочленов был открыт Ленстрой, Ленстрой и Ловашом и является применением алгоритма редукции базиса решетки Ленстра–Ленстра–Ловаша (LLL). Упрощенная версия алгоритма факторизации LLL выглядит следующим образом: вычисляют комплексный (или p-адический) корень α многочлена с высокой точностью, затем используют алгоритм редукции базиса решетки Ленстра–Ленстра–Ловаша, чтобы найти приближенное линейное соотношение между 1, α, α², α³, … с целочисленными коэффициентами, которое может быть точным линейным соотношением и многочленным фактором. Можно определить границу точности, которая гарантирует, что этот метод выдаст либо фактор, либо доказательство неприводимости. Хотя этот метод завершается за полиномиальное время, он не используется на практике, потому что решетка имеет высокую размерность и огромные элементы, что замедляет вычисления. Экспоненциальная сложность алгоритма Зассенхауса связана с комбинаторной задачей: как выбрать правильные подмножества. Современные реализации факторизации работают аналогично Зассенхаусу, за исключением того, что комбинаторная задача преобразуется в задачу решетки, которая затем решается с помощью LLL. В этом подходе LLL используется не для вычисления коэффициентов множителей, а для вычисления векторов с элементами в {0, 1}, которые кодируют подмножества, соответствующие неприводимым истинным множителям.
The Zassenhaus algorithm proceeds as follows. First, choose a prime number such that the image of remains square free, and of the same degree as Then factor This produces integer polynomials whose product matches Next, apply Hensel lifting; this updates the in such a way that their product matches , where is large enough that exceeds : thus each corresponds to a well defined integer polynomial. Modulo , the polynomial has factors (up to units): the products of all subsets of These factors modulo need not correspond to "true" factors of in , but we can easily test them by division in This way, all irreducible true factors can be found by checking at most cases, reduced to cases by skipping complements. If is reducible, the number of cases is reduced further by removing those that appear in an already found true factor. The Zassenhaus algorithm processes each case (each subset) quickly, however, in the worst case, it considers an exponential number of cases. The first polynomial time algorithm for factoring rational polynomials was discovered by Lenstra, Lenstra and Lovász and is an application of the Lenstra–Lenstra–Lovász lattice basis reduction (LLL) algorithm A simplified version of the LLL factorization algorithm is as follows: calculate a complex (or p adic) root α of the polynomial to high precision, then use the Lenstra–Lenstra–Lovász lattice basis reduction algorithm to find an approximate linear relation between 1, α, α2, α3, . with integer coefficients, which might be an exact linear relation and a polynomial factor of One can determine a bound for the precision that guarantees that this method produces either a factor, or an irreducibility proof. Although this method finishes in polynomial time, it is not used in practice because the lattice has high dimension and huge entries, which makes the computation slow. The exponential complexity in the Zassenhaus algorithm comes from a combinatorial problem: how to select the right subsets of State of the art factoring implementations work in a manner similar to Zassenhaus, except that the combinatorial problem is translated to a lattice problem that is then solved by LLL. In this approach, LLL is not used to compute coefficients of factors, but rather to compute vectors with entries in {0,1} that encode the subsets of corresponding to the irreducible true factors.