Дискретное логарифмирование в группе

Материал из Викиконспекты
Перейти к: навигация, поиск

Постановка задачи

Рассмотрим конечную группу [math]G[/math]. Для заданных [math]a, b \in G[/math] необходимо найти такое минимальное [math]n[/math], что [math]a^n=b[/math] или сказать, что таких нет.

Алгоритм

Очевидно, [math]n \lt |G| [/math] (следует из принципа Дирихле). Пусть [math]m = \lceil \sqrt{|G|} \rceil[/math]. Будем искать [math]n[/math] в виде [math]xm-y[/math], где [math]y \in 0 \dots m - 1[/math] и [math]x \in 1 \dots m[/math] (такое представление существует и единственно на основании существования и единственности деления с остатком). Таким образом [math]a ^ n = a ^ {xm - y} = b[/math]. Следовательно,

[math]{a^m}^x = b a^y[/math]

Далее мы выписываем все полученные выражения для левой и правой частей при всех допустимых [math]x[/math] и [math]y[/math] (или складываем в удобную структуру данных: отсортированный массив, хеш, дерево и т. д.). После чего ищем пересечение.

Время работы алгоритма

Для каждого элемента одной части поиск в структуре данных для другой части (в случае с отсортированным массивом) занимает время [math]O(\log m)[/math]. Учитывая, что время на предварительную обработку [math]O(m)[/math], общее время работы алгоритма — [math]O(m \log m) = O(\sqrt{|G|} \log \sqrt{|G|})[/math].