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

Материал из Викиконспекты
Перейти к: навигация, поиск
(Исправление)
м (rollbackEdits.php mass rollback)
 
(не показано 7 промежуточных версий 3 участников)
Строка 1: Строка 1:
{{Требует доработки
+
== Постановка задачи ==
|item1= '''(Исправлено)''' Зачем нужен алгоритм с временем работы <tex>O(|G| log |G|)</tex>, если можно просто перебрать все степени за <tex>O(|G|)</tex>?
+
Рассмотрим [[конечная группа|конечную группу]] <tex>G</tex>. Для заданных <tex>a, b \in G</tex> необходимо найти такое минимальное <tex>n</tex>, что <tex>a^n=b</tex> или сказать, что таких нет.
}}
 
  
Рассмотрим конечную группу <tex>G</tex>. Для заданного <tex>a</tex> необходимо найти такое минимальное <tex>n</tex>, что <tex>a^n=e</tex>. <br>
+
== Алгоритм ==
Теперь рассмотрим '''обобщенную задачу поиска порядка''', также называемую '''задачей дискретного логарифмирования''': для заданных <tex>a</tex> и <tex>b</tex> из группы найти такое минимальное <tex>n</tex>, что <tex>a ^ n = b</tex>. <br>
+
Очевидно, <tex>n < |G| </tex> (следует из принципа Дирихле). Пусть <tex>m = \lceil \sqrt{|G|} \rceil</tex>. Будем искать <tex>n</tex> в виде <tex>xm-y</tex>, где <tex>y \in 0 \dots m - 1</tex> и <tex>x \in 1 \dots m</tex> (такое представление существует и единственно на основании существования и единственности деления с остатком). Таким образом <tex>a ^ n = a ^ {xm - y} = b</tex>. Следовательно,
Очевидно, <tex>n < |G| </tex> (следует из принципа Дирихле). Пусть <tex>m = \lceil \sqrt{|G|} \rceil</tex>. Будем искать <tex>n</tex> в виде <tex>xm-y</tex>, где <tex>y \in 0 \dots m - 1</tex> и <tex>x \in 1 \dots m</tex> (такое представление существует и единственно на основании существования и единственности деления с остатком).<br>
+
:<tex>{a^m}^x = b a^y</tex>
<tex>a ^ n = a ^ {xm - y} = b</tex> <br>
 
<tex>a ^ {xm} = b a ^ {y}</tex> <br>
 
<tex> {a ^ m} ^ x = b a ^ y </tex> <br>
 
  
Далее мы выписываем все полученные выражения для левой и правой частей при всех допустимых <tex>x</tex> и <tex>y</tex> (или складываем в удобную структуру данных: отсортированный массив, хеш, дерево и т. д.). После чего ищем пересечение. Для каждого элемента одной части поиск в структуре данных для другой части (в случае с отсортированным массивом) занимает время <tex>O(log m)</tex>. Учитывая, что время на предварительную обработку <tex>O(m)</tex>, общее время работы алгоритма <tex>O(m log m) = O(\sqrt{|G|} log \sqrt{|G|})</tex>.
+
Далее мы выписываем все полученные выражения для левой и правой частей при всех допустимых <tex>x</tex> и <tex>y</tex> (или складываем в удобную структуру данных: отсортированный массив, хеш, дерево и т. д.). После чего ищем пересечение.
 +
 
 +
== Время работы алгоритма ==
 +
Для каждого элемента одной части поиск в структуре данных для другой части (в случае с отсортированным массивом) занимает время <tex>O(\log m)</tex>. Учитывая, что время на предварительную обработку <tex>O(m)</tex>, общее время работы алгоритма {{---}} <tex>O(m \log m) = O(\sqrt{|G|} \log \sqrt{|G|})</tex>.
  
 
[[Категория: Теория групп]]
 
[[Категория: Теория групп]]

Текущая версия на 19:06, 4 сентября 2022

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

Рассмотрим конечную группу [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].