$ git clone https://github.com/hse-malloc/adleman.git
$ cd adleman
$ docker-compose upПусть заданы простое число p и вычет a, показатель которого по модулю p равен q, то есть ordp a = q и q | p-1. Пусть задан вычет b, удовлетворяющий сравнению
ax ≡ b (mod p)
Задача определения вычета x (mod q) называется задачей вычисления дискретного логарифма элемента b по основанию a.
Принято использовать обозначение
x ≡ loga b (mod q)
Сравнение разрешимо только в том случае, когда вычет b принадлежит множеству A = {1, a, a2, ..., aq-1}
Свойства дискретного логарифма аналогичны свойствам обычного логарифма. Так, например, если верно, что
b ≡ b1α1 * ... * bkαk (mod p)
то выполняется равенство
loga b ≡ α1 loga b1 + ... + αk loga bk (mod q)
Это свойство будет использоваться дальше в методе Адельмана.
Допустим, что у нас есть таблица простых чисел меньших B
F = {p1, p2, ..., ps}, ∀p∈F p<B
мы будем называть эту таблицу факторной базой. И допустим, что мы знаем значения логарифмов всех элементов факторной базы по основанию a, то есть мы знаем величиныx1 ≡ loga p1 (mod q)
x2 ≡ loga p2 (mod q)
...
xs ≡ loga ps (mod q)
Тогда, если мы нашли вычет ξ ∈ Fq* такой, что
bξ ≡ p1α1 * ... * psαs (mod p),
где αi ≥ 0 и pi ∈ F ∀ i=0,...,s, то воспользовавшись свойством логарифма, описанным выше, получаем искомое решение поставленной задачиloga b ≡ ξ-1 * (α1 loga p1 + ... + αs loga ps) (mod q)
Таким образом метод Адельмана сводится к двум последовательным шагам:
- Построение факторной базы и нахождение логарифмов элементов этой базы
- Подсчёт значения искомого логарифма.
При случайном выборе ξ ∈ Fq может возникнуть ситуация, когда вычет aξ полностью раскладывается по элементам факторной базы, то есть
aξ ≡ p1α1 * ... * psαs (mod p)
в таком случае можно утверждать, что было получено уравнение на неизвестные нам x1 ≡ loga p1 (mod q), ..., xs ≡ loga ps (mod q) :ξ ≡ α1 x1 + ... + αs xs (mod q)
Задача нахождения искомых x1, ..., xs сводится к генерации s линейно независимых уравнений и нахождении их решения. Итоговая система линейных урванений будет выглядеть как:
ξ1 ≡ α11 x1 + ... + αs1 xs (mod q)
ξ2 ≡ α12 x1 + ... + αs2 xs (mod q)
...
ξs ≡ α1s x1 + ... + αss xs (mod q)
Или в матричном виде, как
ξ ≡ A x
В реализации до получения искомой матрицы A мы генерируем по s новых уравнений за один проход цикла, добавлям их к уже найденым и ищем среди них линейнонезависимые.
Для получения разложения числа aξ на множители мы используем встроенную в Sage функцию factor, предаврительно запустив тест Миллера-Рабина.
Для упрощения работы учебного примера в настоящее время работа поддерживается только для простых q.
Для демонтарции работы алгоритма были сгенерированы простые числа p Софи Жермен порядков 216, 232, 264 и выбраны соответсвующие элементы a с мультипликативным порядком равным q = (p-1)/2
Обозначим за π(B) число простых чисел, непревосходящих B ( π(B) ~ B / ln B ).
Тогда сложность составления системы линейных уравнений будет O(π2(B) / pa), где pa - вероятность того, что aξ будет разлагаться на множители по факторной базе.
Сложность решениея системы линейных уравнений будет O(π3(B))
Сложность нахождения значения логарифма по известным логарифмам факторной базы будет O(π(B) / pb), где pb - вероятность того, что bξ будет разлагаться на множители по факторной базе.
Итоговая сложность будет O(π3(B) + π2(B) / pa + π(B) / pb).
Стоит заметить, что все величины: π(B), pa и pb существенно зависят от B.
Так, например, если выбрать большое число B, то итоговая сложность будет упираться в решение системы линейных уравнений, т.к. π(B) так же возрастёт (несмотря на то, что вероятности разложения по факторной базе не будут давать большой вклад).
Если же выбрать B достаточно маленьким, то и влад сложности решения системы линейных урванений будет невелик, однако тогда при случайном выборе ξ мы будем достаточно редко получать исходы при которых aξ и bξ будут разладться по факторной базе. То есть большой влкад в сложность будут играть маленькие вероятности pa и pb.
Для баланса между этими крайностями была выбрана теоретическая оценка B ~ L(1/2 , 1/2, q),
где L(1, 1/2, q) = eln1/2q * (ln ln q)1/2 - субэкспоненциальная функция