как начать заново проходить курс, если уже пройдено несколько лекций со сданными тестами? |
Алгоритмы тестирования на простоту и факторизации
2.1 Парадокс дней рождения
Теорема 2.3 Пусть . Для случайной выборки объёма из элементов, где , вероятность того, что все элементы выборки будут попарно различны, допускает следующую оценку сверху:
Следствие 2.1 (Парадокс дней рождения) Чтобы с вероятностью обнаружить двух людей, празднующих день рождения в один день, достаточно рассмотреть всего 23 человека.
Этот парадокс допускает следующие применения в криптографии.
2.2.1 Алгоритм Полларда для факторизации натурального числа
Пусть нам требуется факторизовать натуральное число , то есть найти любой его нетривиальный делитель. Один из простейших алгоритмов приведён ниже [1]. Алгоритм будет вычислять псевдослучайную последовательность . Вероятность того, что можно оценить по теореме 2.4. Если - минимальный делитель числа , то множество разбивается на классов, причем если , лежат в одном классе, то делится на . Итак, в теореме 2.4 находим , и .
Если , а - наименьшая степень двойки, большая , то . Поэтому вместо того, чтобы сравнивать все пары , с произвольными , имеет смысл сравнивать пары:
Для сравнения среди таких пар достаточно хранить и , тогда как для поиска среди всех пар нужно хранить все пары.
Правда, такая хитрость требует увеличить длину последовательности. Допустим, наименьшие и , для которых , равны, соответственно, и . Тогда
Поскольку мы сравниваем и , где , то у нас , то есть . Итак, нужно выбрать наименьшее такое, что и вычислить не , а членов последовательности.
- Взять многочлен с целыми коэффициентами и случайное число . Положить .
- Вычислить .
- Если - степень двойки, положить , , перейти к предыдущему шагу.
- (Теперь - не степень двойки). Если , то - нетривиальный делитель числа .
- Положить . Если , перейти к шагу 2.
Отметим, что при фиксированном длина вычисляемой последовательности пропорциональна - верхней оценке наименьшего простого делителя . Таким образом, данный алгоритм имеет сложность, экспоненциальную по числу бит числа .
Пример 2.2 С помощью -алгоритма Полларда найти нетривиальный простой делитель числа .
На первом шаге алгоритма требуется выбрать многочлен для генерации последовательности . Возьмём . Выберем длину последовательности так, чтобы найти в ней повтор с вероятностью . - оценка сверху для наименьшего простого делителя числа . Итак, , откуда . Тогда
Допустим, в последовательности есть повтор. Чтобы гарантированно его найти с помощью приведённого алгоритма, нужно вычислить не меньше её членов. В самом деле, так как , то , и необходимое число членов: .
Выберем .
- Вычисляем ;
- Вычисляем ; 2 - степень двойки; запоминаем .
- Вычисляем , .
- Вычисляем , 4 - степень двойки; запоминаем .
- Вычисляем , .
- Вычисляем , .
- Вычисляем , .
Итак, нам повезло найти нетривиальный делитель 31 числа 2449. Если бы мы досчитали до и не нашли повтор, то нам лучше было бы выбрать новый (в качестве него можно взять ) и начать алгоритм сначала.
2.2.2 Алгоритм Полларда для дискретного логарифмирования
Изменим алгоритм предыдущего параграфа так, чтобы с его помощью решать задачу дискретного логарифмирования. Его идея остаётся прежней: мы будем вычислять последовательность и будем находить среди них пары чисел. Зададим последовательность так, чтобы это равенство давало нам дискретный логарифм.
Найдём из условия , где - простое число.
Определим последовательности , , следующим образом:
Тогда если , то , откуда
Коллизия ищется тем же способом, что и в предыдущем параграфе.
Отметим, что данный алгоритм может быть также обобщен для дискретного логарифмирования в произвольной циклической группе, и даже для поиска коллизий хэш-функций.