Бэби-степ гигантский шаг - Baby-step giant-step
В теория групп, раздел математики, бэби-шаг гигантский шаг это встреча посередине алгоритм для вычисления дискретный логарифм или же порядок элемента в конечный абелева группа из-за Дэниел Шэнкс.[1] Проблема дискретного бревна имеет фундаментальное значение для области криптография с открытым ключом.
Многие из наиболее часто используемых систем криптографии основаны на предположении, что дискретный журнал чрезвычайно трудно вычислить; чем сложнее, тем большую безопасность обеспечивает передача данных. Один из способов повысить сложность проблемы дискретного журнала - основать криптосистему на более крупной группе.
Теория
Алгоритм основан на компромисс между пространством и временем. Это довольно простая модификация пробного умножения, наивного метода нахождения дискретных логарифмов.
Учитывая циклическая группа порядка , а генератор группы и элемента группы , проблема в том, чтобы найти целое число такой, что
Алгоритм бэби-шага-гигантского шага основан на переписывании :
Таким образом, мы имеем:
Алгоритм предварительно вычисляет для нескольких значений . Затем он исправляет и пробует ценности в правой части приведенного выше сравнения, как пробное умножение. Он проверяет, выполняется ли сравнение для любого значения , используя предварительно вычисленные значения .
Алгоритм
Вход: Циклическая группа грамм порядка п, имеющий генератор α и элемент β.
Выход: Ценность Икс удовлетворение .
- м ← Потолок (√п)
- Для всех j где 0 ≤ j < м:
- Вычислить αj и сохраните пару (j, αj) в таблице. (Видеть § На практике )
- Вычислить α−м.
- γ ← β. (набор γ = β)
- Для всех я где 0 ≤ я < м:
- Проверить, является ли γ вторым компонентом (αj) любой пары в таблице.
- Если да, верните я + j.
- Если не, γ ← γ • α−м.
Алгоритм C ++ (C ++ 17)
#включают <cmath>#включают <cstdint>#включают <unordered_map>стандартное::uint32_t pow_m(стандартное::uint32_t основание, стандартное::uint32_t exp, стандартное::uint32_t мод) { // модульное возведение в степень с использованием алгоритма умножения квадратов}/// Вычисляет x так, чтобы g ^ x% mod == hстандартное::необязательный<стандартное::uint32_t> babystep_giantstep(стандартное::uint32_t грамм, стандартное::uint32_t час, стандартное::uint32_t мод) { const авто м = static_cast<стандартное::uint32_t>(стандартное::потолок(стандартное::sqrt(мод))); авто стол = стандартное::unordered_map<стандартное::uint32_t, стандартное::uint32_t>{}; авто е = стандартное::uint64_t{1}; // временные значения могут быть больше 32 бит за (авто я = стандартное::uint32_t{0}; я < м; ++я) { стол[static_cast<стандартное::uint32_t>(е)] = я; е = (е * грамм) % мод; } const авто фактор = pow_m(грамм, мод-м-1, мод); е = час; за (авто я = стандартное::uint32_t{}; я < м; ++я) { если (авто Это = стол.найти(static_cast<стандартное::uint32_t>(е)); Это != стол.конец()) { возвращаться {я*м + Это->второй}; } е = (е * фактор) % мод; } возвращаться стандартное::нуллопт;}
На практике
Лучший способ ускорить алгоритм гигантского шага младенца-шага - использовать эффективную схему поиска в таблице. Лучшее в этом случае - это хеш-таблица. Хеширование выполняется на втором компоненте, и для выполнения проверки на шаге 1 основного цикла γ хешируется, а полученный адрес памяти проверяется. Поскольку хеш-таблицы могут извлекать и добавлять элементы в время (постоянное время), это не замедляет общий алгоритм гигантских шагов маленького шага.
Время работы алгоритма и пространственная сложность , намного лучше, чем время работы наивного перебора.
Алгоритм гигантского шага Baby-step часто используется для решения общего ключа в Обмен ключами Диффи Хеллмана, когда модуль - простое число. Если модуль не простой, Алгоритм Полига – Хеллмана имеет меньшую алгоритмическую сложность и решает ту же проблему.
Примечания
- Алгоритм гигантских шагов baby-step - это общий алгоритм. Он работает для любой конечной циклической группы.
- Необязательно знать порядок группы грамм заранее. Алгоритм все еще работает, если п является просто верхней границей группового порядка.
- Обычно алгоритм шага младенца используется для групп, порядок которых простой. Если порядок группы составной, то Алгоритм Полига – Хеллмана более эффективен.
- Алгоритм требует О (м) объем памяти. Можно использовать меньше памяти, выбрав меньшую м на первом шаге алгоритма. Это увеличивает время работы, которое затем О (п/м). В качестве альтернативы можно использовать Алгоритм ро Полларда для логарифмов, который имеет примерно такое же время работы, как и алгоритм гигантского шага baby-step, но требует лишь небольшой памяти.
- Авторство этого алгоритма принадлежит Дэниелу Шанксу, опубликовавшему статью 1971 года, в которой он впервые появился, а статья Нечаева 1994 года[2] заявляет, что это было известно Гельфонд в 1962 г.
дальнейшее чтение
- Х. Коэн, Курс вычислительной алгебраической теории чисел, Springer, 1996.
- Д. Шанкс, Номер класса, теория факторизации и родов. В Proc. Symp. Чистая математика. 20, страницы 415—440. AMS, Провиденс, Р.И., 1971.
- А. Штейн и Э. Теске, Оптимизированные методы шага младенца - гигантского шага, Журнал Математического общества Рамануджана 20 (2005), вып. 1, 1–32.
- А. В. Сазерленд, Порядок вычислений в общих группах, Кандидатская диссертация, M.I.T., 2007.
- Д. К. Терр, Модификация алгоритма гигантских шагов Шэнкса, «Математика вычислений» 69 (2000), 767–773. Дои:10.1090 / S0025-5718-99-01141-2
Рекомендации
- ^ Дэниел Шэнкс (1971), «Число классов, теория факторизации и родов», В Proc. Symp. Чистая математика., Провиденс, Р.И .: Американское математическое общество, 20, стр. 415–440
- ^ Нечаев В. И. Сложность детерминированного алгоритма дискретного логарифма // Математические заметки. 55, нет. 2 1994 (165-172)