Начнем с основной идеи Полиг-Хеллмана. Предположим, что нам даны y, g и p, и мы хотим найти x, такой что
у == г х (мод р).
(я использую == для обозначения отношения эквивалентности). Для упрощения я также предполагаю, что порядок g равен p-1, то есть наименьшее положительное k с 1 == g k (mod p) равно k = p-1.
Неэффективный метод для нахождения x, будет просто попробовать все значения в диапазоне 1 .. p-1.
Несколько лучше метод * «Большой шаг младенца», который требует O (p 0.5 ) арифметических операций. Оба метода довольно медленные для больших р. Pohlig-Hellman является значительным улучшением, когда p-1 имеет много факторов. То есть предположим, что
p-1 = n r
Тогда Полиг и Хеллман предлагают решить уравнение
y n == (g n ) z
(мод р).
Если мы возьмем логарифмы к основанию g с обеих сторон, это то же самое, что и
n log g (y) == log g (y n ) == nz (mod p-1).
n можно разделить, давая
log g (y) == z (mod r).
Следовательно, x == z (mod r).
Это улучшение, поскольку нам нужно только найти диапазон 0 .. r-1 для решения z. И снова «Baby-step-гигант-шаг» можно использовать для улучшения поиска по z. Очевидно, что сделать это один раз еще не является полным решением. То есть необходимо повторить алгоритм выше для каждого простого множителя r из p-1, а затем использовать китайскую теорему об остатках, чтобы найти x из частных решений. Это хорошо работает, если р-1 свободен от квадратов.
Если p-1 делится на простую степень, то можно использовать аналогичную идею. Например, предположим, что p-1 = m q k .
На первом этапе мы вычисляем z таким образом, что x == z (mod q), как показано выше. Далее мы хотим расширить это до решения x == z '(мод q 2 ). Например. если p-1 = m q 2 , то это означает, что мы должны найти z 'такой, что
y m == (g m ) z ' (mod p).
Поскольку мы уже знаем, что z '== z (mod q), z' должно быть в множестве {z, z + q, z + 2q, ..., z + (q-1) q}. Опять же, мы могли бы либо сделать исчерпывающий поиск по z ', либо улучшить поиск с помощью «гигантского шага младенца». Этот шаг повторяется для каждого показателя степени q, то есть, зная x mod q i , мы итеративно получаем x mod q i + 1 .