Дискретное логарифмирование в группе — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Исправление)
Строка 1: Строка 1:
 
{{Требует доработки
 
{{Требует доработки
|item1= '''(Исправлено)''' Зачем нужен алгоритм с временем работы <tex>O(|G| log |G|)</tex>, если можно просто перебрать все степени за <tex>O(|G|)</tex>?
+
|item1= Зачем нужен алгоритм с временем работы <tex>O(|G| log |G|)</tex>, если можно просто перебрать все степени за <tex>O(|G|)</tex> (исправлено)?
 
}}
 
}}
  

Версия 11:53, 1 июля 2010

Эта статья требует доработки!
  1. Зачем нужен алгоритм с временем работы [math]O(|G| log |G|)[/math], если можно просто перебрать все степени за [math]O(|G|)[/math] (исправлено)?

Если Вы исправили некоторые из указанных выше замечаний, просьба дописать в начало соответствующего пункта (Исправлено).

Рассмотрим конечную группу [math]G[/math]. Для заданного [math]a[/math] необходимо найти такое минимальное [math]n[/math], что [math]a^n=e[/math].
Теперь рассмотрим обобщенную задачу поиска порядка, также называемую задачей дискретного логарифмирования: для заданных [math]a[/math] и [math]b[/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 ^ {xm} = b a ^ {y}[/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].