EssayAI
Блог
Блог
Математика и алгоритмы

Алгоритм Полига-Хеллмана: дискретный логарифм по частям

20 июня 2026Время чтения: 8 минут
#криптография#дискретный логарифм#полиг-хеллман#китайская теорема об остатках#теория групп
Алгоритм Полига-Хеллмана: дискретный логарифм по частям

Алгоритм Полига-Хеллмана - это метод вычисления дискретного логарифма в конечной циклической группе, чей порядок раскладывается только на малые простые числа. Идея в том, чтобы не штурмовать большую задачу целиком, а разбить её на несколько маленьких подзадач по каждому простому делителю порядка, решить их по отдельности и собрать ответ китайской теоремой об остатках. Метод опубликовали Стивен Полиг и Мартин Хеллман в 1978 году, и именно он объясняет, почему в криптографии нельзя брать группу с «гладким» порядком: если порядок гладкий, дискретный логарифм считается быстро, и вся стойкость рушится. Ниже разбираем устройство алгоритма по шагам, его сложность и связь с выбором параметров - а собрать конкретный пример с числами можно в конструкторе сразу под введением.

Что вычисляет алгоритм Полига-Хеллмана

Задача дискретного логарифма формулируется так: дана циклическая группа GG порядка nn, её образующая gg и элемент h=gxh = g^x. Нужно найти показатель xx. В мультипликативной группе вычетов это значит: по известным gg, hh и модулю pp найти такое xx, что gxh(modp)g^x \equiv h \pmod p.

Прямой перебор показателей стоит порядка nn операций, а универсальные методы вроде «больших и малых шагов» или ρ\rho-метода Полларда - порядка n\sqrt{n}. Алгоритм Полига-Хеллмана идёт другим путём: он использует структуру самого числа nn. Если порядок группы

n=ipiein = \prod_{i} p_i^{e_i}

раскладывается на простые pip_i, то вместо одной задачи размера nn мы решаем по одной подзадаче в каждой подгруппе порядка pieip_i^{e_i} - а они маленькие, когда простые pip_i малы.

Схема алгоритма Полига-Хеллмана: большая задача дискретного логарифма раскладывается на подзадачи по простым делителям и собирается китайской теоремой об остатках
Схема алгоритма Полига-Хеллмана: большая задача дискретного логарифма раскладывается на подзадачи по простым делителям и собирается китайской теоремой об остатках

Почему важна гладкость порядка группы

Число называют гладким, если все его простые делители не превосходят некоторой небольшой границы. Гладкость порядка - это ровно то условие, при котором алгоритм Полига-Хеллмана работает быстро. Чем крупнее самый большой простой делитель pmaxp_{\max} порядка nn, тем тяжелее самая дорогая подзадача, потому что внутри подгруппы порядка pmaxp_{\max} всё равно приходится решать дискретный логарифм размера pmaxp_{\max}.

Отсюда практический вывод: безопасность протоколов на дискретном логарифме (как в алгоритме Диффи-Хеллмана) требует, чтобы порядок группы делился на хотя бы одно большое простое число. Поэтому в стандартах берут «безопасные простые» вида p=2q+1p = 2q + 1, где qq тоже простое: тогда порядок p1=2qp - 1 = 2q имеет огромный делитель qq, и Полиг-Хеллман упирается в подзадачу размера qq, которую решить уже невозможно.

Если порядок группы целиком состоит из малых простых множителей, дискретный логарифм считается за секунды независимо от размера самого модуля. Большой модуль сам по себе не гарантирует стойкости - решает структура порядка.

Шаг первый: разложение порядка и подгруппы

Пусть мы работаем в группе порядка nn, и оно разложено: n=p1e1p2e2pkekn = p_1^{e_1} \cdot p_2^{e_2} \cdots p_k^{e_k}. Идея алгоритма - найти не сам xx, а его остатки xmodpieix \bmod p_i^{e_i} по каждому простому множителю, после чего восстановить xx по модулю nn через китайскую теорему об остатках.

Чтобы спроецировать задачу в подгруппу порядка pieip_i^{e_i}, обе части равенства gx=hg^x = h возводят в степень n/piein / p_i^{e_i}:

(gn/piei)x=hn/piei.\left(g^{\,n/p_i^{e_i}}\right)^{x} = h^{\,n/p_i^{e_i}}.

Элемент gi=gn/pieig_i = g^{\,n/p_i^{e_i}} имеет порядок ровно pieip_i^{e_i}, а hi=hn/pieih_i = h^{\,n/p_i^{e_i}} лежит в порождённой им подгруппе. В этой подгруппе и ищется xix(modpiei)x_i \equiv x \pmod{p_i^{e_i}} - задача того же типа, но крошечного размера.

Шаг второй: дискретный логарифм в подгруппе порядка p

Когда показатель простой (ei=1e_i = 1), подзадача - найти xix_i из равенства gixi=hig_i^{x_i} = h_i в группе порядка pip_i. Здесь xi{0,1,,pi1}x_i \in \{0, 1, \dots, p_i - 1\}, и его можно найти простым перебором за pip_i шагов или методом «больших и малых шагов» за pi\sqrt{p_i}. Когда pip_i мало (десятки или сотни), это мгновенно.

Разберём это на учебном примере. Пусть p=29p = 29, тогда порядок группы Z29\mathbb{Z}_{29}^* равен n=28=227n = 28 = 2^2 \cdot 7. Возьмём образующую g=2g = 2 и элемент h=2xh = 2^x. Чтобы найти xmod7x \bmod 7, обе части возводят в степень n/7=4n / 7 = 4: получаем g7=g4g_7 = g^4 порядка 77 и h7=h4h_7 = h^4, после чего перебором по семи значениям находят остаток. Аналогично, проекция в степень n/4=7n / 4 = 7 даёт подзадачу в подгруппе порядка 4=224 = 2^2. Два маленьких остатка склеиваются в xmod28x \bmod 28. Перебирать все 2828 показателей не пришлось ни разу - каждый шаг затрагивал лишь горстку значений.

Для степеней ei>1e_i > 1 применяют поразрядное «поднятие»: сначала находят ximodpix_i \bmod p_i, затем ximodpi2x_i \bmod p_i^2 и так далее, на каждом шаге решая задачу в группе порядка pip_i. Записывая xix_i в системе счисления по основанию pip_i,

xi=c0+c1pi+c2pi2++cei1piei1,x_i = c_0 + c_1 p_i + c_2 p_i^2 + \dots + c_{e_i - 1} p_i^{\,e_i - 1},

цифры c0,c1,c_0, c_1, \dots восстанавливают по очереди, каждый раз отделяя уже найденную часть. Это превращает подзадачу размера pieip_i^{e_i} в eie_i подзадач размера pip_i.

Поразрядное восстановление показателя по основанию простого делителя: цифры c0, c1, c2 находятся по очереди
Поразрядное восстановление показателя по основанию простого делителя: цифры c0, c1, c2 находятся по очереди

Шаг третий: сборка ответа китайской теоремой об остатках

После того как для каждого простого множителя найден остаток xix(modpiei)x_i \equiv x \pmod{p_i^{e_i}}, остаётся склеить их в единственное значение xmodnx \bmod n. Поскольку множители pieip_i^{e_i} попарно взаимно просты, система

xx1(modp1e1),xx2(modp2e2),x \equiv x_1 \pmod{p_1^{e_1}}, \quad x \equiv x_2 \pmod{p_2^{e_2}}, \quad \dots

имеет ровно одно решение по модулю nn по китайской теореме об остатках. Это решение и есть искомый дискретный логарифм xx. Проверить его легко: достаточно убедиться, что gxh(modp)g^x \equiv h \pmod p.

Сложность алгоритма

Главное достоинство Полига-Хеллмана - сложность, определяемая не размером группы, а её крупнейшим простым делителем. Если применять метод «больших и малых шагов» внутри каждой подгруппы, общая стоимость составляет порядка

O ⁣(iei(logn+pi))O\!\left(\sum_i e_i \left(\log n + \sqrt{p_i}\right)\right)

групповых операций. Доминирует слагаемое с самым большим pip_i: фактически алгоритм работает за O(pmax)O(\sqrt{p_{\max}}) с точностью до логарифмических множителей.

Поэтому для группы порядка n1040n \approx 10^{40} с гладким разложением (все делители меньше, скажем, 10610^6) задача решается практически мгновенно, тогда как для группы того же размера с делителем q1040q \approx 10^{40} метод бесполезен - он упирается в q\sqrt{q}.

Частые ошибки

  • Путают модуль и порядок. Дискретный логарифм считают в группе порядка n=p1n = p - 1 (для Zp\mathbb{Z}_p^*), а не по модулю pp. Раскладывать на множители нужно именно nn, а не сам модуль pp.
  • Берут не ту проекцию. Чтобы загнать задачу в подгруппу порядка pieip_i^{e_i}, возводят в степень n/piein / p_i^{e_i}, а не n/pin / p_i при ei>1e_i > 1 - иначе теряется часть информации о показателе.
  • Забывают про поразрядное поднятие. При ei>1e_i > 1 нельзя решить подзадачу одним разом: нужно последовательно находить цифры c0,c1,c_0, c_1, \dots по основанию pip_i.
  • Считают, что большой модуль = стойкость. Если p1p - 1 гладкое, размер pp не спасает: Полиг-Хеллман решит логарифм за секунды.
  • Ошибаются в сборке CRT. Остатки берут по модулям pieip_i^{e_i} (со степенями), а не по простым pip_i, иначе китайская теорема даёт неверный ответ.

FAQ

Когда алгоритм Полига-Хеллмана неэффективен? Когда порядок группы делится на большое простое число qq: самая дорогая подзадача имеет размер qq, и её приходится решать за q\sqrt{q} операций. Для криптографически больших qq (сотни бит) это вычислительно невозможно, поэтому защищённые параметры специально подбирают с большим простым делителем порядка.

Чем Полиг-Хеллман отличается от метода Полларда? ρ\rho-метод Полларда решает дискретный логарифм за n\sqrt{n} без знания разложения порядка. Полиг-Хеллман эффективнее, когда порядок гладкий: он сводит задачу к подзадачам по делителям и тратит лишь pmax\sqrt{p_{\max}}. На практике методы комбинируют: Полиг-Хеллман разбивает задачу, а внутри каждой подгруппы шаги делает Поллард.

Зачем нужна китайская теорема об остатках в этом алгоритме? Она склеивает остатки xmodpieix \bmod p_i^{e_i}, найденные по отдельным простым множителям, в единственный показатель xmodnx \bmod n. Без неё мы получили бы набор независимых остатков, но не само значение дискретного логарифма.

Коротко

Алгоритм Полига-Хеллмана решает задачу дискретного логарифма, раскладывая порядок группы на простые множители, проецируя задачу в каждую подгруппу порядка pieip_i^{e_i}, решая там маленький логарифм (с поразрядным поднятием для степеней) и собирая ответ китайской теоремой об остатках. Его сложность определяется крупнейшим простым делителем порядка, поэтому гладкость порядка делает дискретный логарифм лёгким - а стойкие протоколы требуют группы с большим простым делителем.

Доверьте текст нейросети EssayAI

Открыть EssayAI

Бесплатно, на русском языке и без VPN

Читайте также