Корни многочлена mod простое
Я ищу быстрый алгоритм для поиска корней одномерного многочлена в простом конечном поле.
то есть, если f = a0 + a1x + a2x2 + ... + anxn
(n > 0) тогда алгоритм, который находит все r < p
удовлетворяя f(r) = 0 mod p
, для заданного простого p.
Я нашел алгоритм поиска Chiens https://en.wikipedia.org/wiki/Chien_search но я не могу себе представить, что это так быстро для простых чисел больше 20 бит. Кто-нибудь имеет опыт работы с алгоритмом поиска Цзяня или знает быстрее? Есть ли для этого модуль sympy?
2 ответов
Это довольно хорошо изучены, как комментарий mcdowella указывает. Вот как это Кантора-Цассенхауза алгоритм случайных работает для случая, когда вы хотите найти корни многочлена, а не более общей факторизации.
заметим, что в кольце многочленов с коэффициентами mod p произведение x(x-1)(x-2)...(x-p+1) имеет все возможные корни и равен x^p-x на теорема Ферма и уникальная факторизация в этом кольцо.
установить g = GCD (f,x^p-x). Используя алгоритм Евклида для вычисления НОД двух многочленов быстро в целом, предпринимает ряд шагов, которые логарифмическая в максимальной степени. Это не требует, чтобы вы факторизовали многочлены. g имеет те же корни, что и f в поле, и никаких повторяющихся факторов.
из-за специальной формы x^p-x, только с двумя ненулевыми членами, первый шаг алгоритма Евклида может быть сделан повторил квадрат, примерно в 2-log_2 (п) меры, включающие только многочлены степени не более чем в два раза превышает степень Ф с коэффициентами модулю p. Мы можем вычислить X мод Ф Х^2 Мод Ф Х^4 мод Ф и т. д., а затем перемножить условия, соответствующие ненулевым мест в двоичном расширения р для вычисления х^п мод 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 - нет, тогда (x-a) является общим фактором g и r_d, в то время как (x-b) не является, что означает,что GCD(g, r_d) является нетривиальным фактором g. Аналогично, если b+d-ненулевой квадрат, а a+d-нет, то (x-b) является общим фактором g и r_d, а (x-a) - нет. По теории чисел, тот или иной случай происходит близко к половине возможных вариантов для d, что означает, что в среднем требуется постоянное число вариантов d, прежде чем мы найдем нетривиальный фактор g, фактически один, отделяющий (x-a) от (x-b).
ваши ответы хороши, но я думаю, что нашел замечательный метод поиска корней по модулю любого числа: этот метод основан на "решетках". Пусть r ≤ R быть корень mod p. Мы должны найти другую функцию, такую как h (x) такое, что h не большой и r корень h. Метод решетки найти эту функцию. В первый раз, мы должны создать основу для полинома решетка, а затем, с алгоритмом "LLL", мы находим" кратчайший вектор", который имеет корень r без дулю p. На самом деле, мы исключаем по модулю p таким образом.
для получения дополнительных объяснений обратитесь к " Coppersmith D. Поиск малых решений полиномов малой степени. В криптографии и решетках".