как начать заново проходить курс, если уже пройдено несколько лекций со сданными тестами? |
Алгоритмы тестирования на простоту и факторизации
2.1 Парадокс дней рождения
Теорема 2.3 Пусть . Для случайной выборки объёма
из
элементов, где
, вероятность
того, что все элементы выборки будут попарно различны, допускает следующую оценку сверху:
![p<e^{-\lambda}.](/sites/default/files/tex_cache/771bf9efcbbecf055328a8bc666e59c0.png)
Следствие 2.1 (Парадокс дней рождения) Чтобы с вероятностью обнаружить двух людей, празднующих день рождения в один день, достаточно рассмотреть всего 23 человека.
Этот парадокс допускает следующие применения в криптографии.
2.2.1 Алгоритм Полларда для факторизации натурального числа
Пусть нам требуется факторизовать натуральное число , то есть найти любой его нетривиальный делитель. Один из простейших алгоритмов приведён ниже [1]. Алгоритм будет вычислять псевдослучайную последовательность
. Вероятность
того, что
можно оценить по теореме 2.4. Если
- минимальный делитель числа
, то множество
разбивается на
классов, причем если
,
лежат в одном классе, то
делится на
. Итак, в теореме 2.4 находим
, и
.
Если , а
- наименьшая степень двойки, большая
, то
. Поэтому вместо того, чтобы сравнивать все пары
,
с произвольными
, имеет смысл сравнивать пары:
![\begin{array}{ccc}
x_2 \text{ и } x_3 & x_4 \text{ и } x_7 & ... \\
x_4 \text{ и } x_5 & x_8 \text{ и } x_9 & x_{2^k} \text{ и } x_{m}\\
x_4 \text{ и } x_6 & x_8 \text{ и } x_{10} & 2^k<m<2^{k+1}.
\end{array}](/sites/default/files/tex_cache/ff39fae46b59b3d46d6f1afbac953a35.png)
Для сравнения среди таких пар достаточно хранить и
, тогда как для поиска среди всех пар нужно хранить все пары.
Правда, такая хитрость требует увеличить длину последовательности. Допустим, наименьшие и
, для которых
, равны, соответственно,
и
. Тогда
![\begin{array}{l}
НОД(x_{l}-x_0,n)>1,\\
НОД(x_{l+1}-x_1,n)>1,\\
\ldots\\
НОД(x_{l+2^k}-x_{2^k})>1
\end{array}](/sites/default/files/tex_cache/75dca43dd52bcd4d51918bf79e568a5b.png)
Поскольку мы сравниваем и
, где
, то у нас
, то есть
. Итак, нужно выбрать наименьшее
такое, что
и вычислить не
, а
членов последовательности.
- Взять многочлен
с целыми коэффициентами и случайное число
. Положить
.
- Вычислить
.
- Если
- степень двойки, положить
,
, перейти к предыдущему шагу.
- (Теперь
- не степень двойки). Если
, то
- нетривиальный делитель числа
.
- Положить
. Если
, перейти к шагу 2.
Отметим, что при фиксированном длина
вычисляемой последовательности пропорциональна
- верхней оценке наименьшего простого делителя
. Таким образом, данный алгоритм имеет сложность, экспоненциальную по числу бит числа
.
Пример 2.2 С помощью -алгоритма Полларда найти нетривиальный простой делитель числа
.
На первом шаге алгоритма требуется выбрать многочлен для генерации последовательности
. Возьмём
. Выберем длину
последовательности так, чтобы найти в ней повтор с вероятностью
.
- оценка сверху для наименьшего простого делителя
числа
. Итак,
, откуда
. Тогда
![l \leq \sqrt{2\lambda\cdot p_0} \approx \sqrt{70}\approx 8,36.](/sites/default/files/tex_cache/a719eb81d670d3f2157a6ab8dd1b299a.png)
Допустим, в последовательности есть повтор. Чтобы гарантированно его найти с помощью приведённого алгоритма, нужно вычислить не меньше
её членов. В самом деле, так как
, то
, и необходимое число членов:
.
Выберем .
- Вычисляем
;
- Вычисляем
; 2 - степень двойки; запоминаем
.
- Вычисляем
,
.
- Вычисляем
, 4 - степень двойки; запоминаем
.
- Вычисляем
,
.
- Вычисляем
,
.
- Вычисляем
,
.
Итак, нам повезло найти нетривиальный делитель 31 числа 2449. Если бы мы досчитали до и не нашли повтор, то нам лучше было бы выбрать новый
(в качестве него можно взять
) и начать алгоритм сначала.
2.2.2 Алгоритм Полларда для дискретного логарифмирования
Изменим алгоритм предыдущего параграфа так, чтобы с его помощью решать задачу дискретного логарифмирования. Его идея остаётся прежней: мы будем вычислять последовательность и будем находить среди них пары
чисел. Зададим последовательность так, чтобы это равенство давало нам дискретный логарифм.
Найдём из условия
, где
- простое число.
Определим последовательности ,
,
следующим образом:
![u_0 = v_0 = 0,\qquad x_0 = 1;](/sites/default/files/tex_cache/e39b06adbee1cf0572702cc3770f344a.png)
![u_{i+1}=\left\{ \begin{array}{ll}
u_{i}+1 ~(\mod p-1),&\text{если}~0\leq x_i<p/3; \\
2u_{i} ~(\mod p-1),&\text{если}~p/3 \leq x_i<2p/3; \\
u_i ~(\mod p-1)&\text{иначе}.
\end{array}\right.](/sites/default/files/tex_cache/8638172471c60cebf5bbab3ccdccfcb6.png)
![v_{i+1}=\left\{ \begin{array}{ll}
v_{i} ~(\mod p-1),&\text{если}~0\leq x_i<p/3; \\
2v_{i} ~(\mod p-1),&\text{если}~p/3 \leq x_i<2p/3; \\
v_i+1 ~(\mod p-1)&\text{иначе}.
\end{array}\right.](/sites/default/files/tex_cache/8f942c399e4395ec7bc0e5d65c6f0101.png)
![x_{i+1}=b^{u_{i+1}}\cdot a^{v_{i+1}}.](/sites/default/files/tex_cache/d87c34f663d951725d3d3f10ea72dbd6.png)
Тогда если , то
, откуда
![\log_a b = (u_i -u_j)^{-1} (v_i-v_j)~(\mod p-1) .](/sites/default/files/tex_cache/a648edf4fa535fc02f29e08ab4f98fdb.png)
Коллизия ищется тем же способом, что и в предыдущем параграфе.
Отметим, что данный алгоритм может быть также обобщен для дискретного логарифмирования в произвольной циклической группе, и даже для поиска коллизий хэш-функций.