Это довольно хорошо изучено, как указывает комментарий mcdowella. Вот как работает Cantor-Zassenhaus random algorithm для случая, когда вы хотите найти корни полинома, а не более общую факторизацию. Заметим, что в кольце многочленов с коэффициентами mod p произведение x (x-1) (x-2) ... (x-p + 1) имеет все возможные корни и равно x^px по формуле (x-1) (x-2) ... (x-p + 1). Fermat's Little Theorem и уникальная факторизация в этом кольце.
Набор g = GCD (f, x^p-x). Использование Euclid's algorithm для вычисления GCD двух многочленов является быстрым в общем случае, беря несколько шагов, которые являются логарифмическими в максимальной степени. Это не требует, чтобы вы определяли многочлены. g имеет те же корни, что и f в поле, и не повторяющиеся факторы.
Из-за специальной формы х^рх с двумя отличными от нуля членами первый шаг алгоритма Евклида может быть выполнен с помощью repeated squaring, примерно в 2 log_2 (p) шагах с участием только многочленов степени не более чем в два раза степени f, с коэффициентами mod p. Мы можем вычислить x mod f, x^2 mod f, x^4 mod f и т. Д., А затем умножить числа, соответствующие ненулевым местам в двоичном разложении p, для вычисления x^p mod f и, наконец, вычесть x.
Неоднократно выполняйте следующее: выберите случайный d в Z/p. Вычислите GCD группы g с r_d = (x + d)^((p-1)/2) -1, который мы можем быстро вычислить по алгоритму Евклида, используя повторное возведение в квадрат на первом шаге. Если степень этого GCD строго находится между 0 и степенью g, мы нашли нетривиальный множитель g, и мы можем рекурсировать, пока не найдем линейные факторы, следовательно, корни из g и, следовательно, f.
Как часто это работает? r_d имеет в качестве корней числа, которые меньше d, чем ненулевой квадрат mod p. Рассмотрим два разных корня из g, a и b, поэтому (x-a) и (x-b) являются факторами g. Если a + d - ненулевой квадрат, а b + d - нет, то (xa) является общим фактором g и r_d, тогда как (xb) нет, что означает, что GCD (g, r_d) является нетривиальным фактором g , Аналогично, если b + d является ненулевым квадратом, а a + d - нет, то (x-b) является общим фактором g и r_d, а (x-a) - нет. По теории чисел один случай или другой случай близок к половине возможных вариантов для d, а это означает, что в среднем он принимает постоянное количество вариантов d до того, как найдет нетривиальный множитель g, фактически одно разделяющее (xa) из (xb).
http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.133.1907&rep=rep1&type=pdf указывает, что решение многочленов над конечными полями является частным случаем их факторизации, и существуют рандомизированные полиномиальные алгоритмы времени для факторинга многочленов над конечными полями (см., например, http://en.wikipedia.org/wiki/Factorization_of_polynomials_over_finite_fields). В нем говорится, что он продолжает описывать детерминированные полиномиальные алгоритмы времени для поиска корней, но я до сих пор не читал. – mcdowella