Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Специальные разделы математики. Учебное пособие (курс лекций)
.pdf
Лекция 8
72 = 15 mod 17 (-7)2 = 15 mod 17
2
= 13 mod 17 (-8)2 = 13 mod 17
8
Заметим, что не надо проверять целые числа, большие 8, т. к.
9 = –8 mod 17;
► б) тест Миллера – Рабина является модификацией те-
ста Миллера и заключается в проверке только части свидетелей
простоты b в интервале от 2 до (n – 2), выбираемых случайным
образом. Согласно недоказанной теореме Рабина, если тест
Миллера, примененный к n для более чем n / 4 свидетелей простоты, не распознает в n составного числа, то n – простое. Таким
образом, при положительной проверке m свидетелей простоты b
m
вероятность того, что n – составное число, равна 1/4
дуется брать m ≈ log2(n) (например, для n = 10
. Рекомен-
5
+ 1, требуется
проверить 13 свидетелей простоты).
Описание алгоритма
1. Последовательно делим n – 1 на 2, пока не получим нечетное частное. В результате найдем положительное це-
k
лое k и нечетное q, для которых n – 1 = 2
q.
2. Цикл А. Повторять m раз.
2.1. Выбрать случайно b в интервале 2, .. (n – 2).
q
2.2. Найти x = b
mod n.
2.3. Если x = 1 или x = n – 1, то перейти на следующую
итерацию цикла А.
2.4. Цикл В. Повторять k – 1 раз.
2
2.4.1. x = x
mod n
2.4.2. Если x = 1, то выдать «n – составное число»
и завершить работу.
2.4.3. Если x = n – 1, то перейти на следующую
итерацию цикла А.
2.4.4. Перейти к следующей итерации цикла B.
2.5. Перейти к следующей итерации цикла А.
3. Выдать «n – вероятно простое».
Пример.
Предположим, мы хотим определить, является ли n = 221
2
простым. Запишем n − 1 = 220 как 2
· 55, таким образом s = 2 и
d = 55. Произвольно выберем число a такое, что 0 < a < n, допу-
стим a = 174. Переходим к вычислениям:
- 111 -

СПЕЦИАЛЬНЫЕ РАЗДЕЛЫ МАТЕМАТИКИ
20·d
a
mod n = 17455 mod 221 = 47 ≠ 1, n − 1
21·d
a
mod n = 174
110
mod 221 = 220 = n − 1.
Так как 220 ≡ −1 mod n, число 221 или простое, или 174 –
ложный свидетель простоты числа 221. Возьмём другое произвольное a, на этот раз выбрав a = 137:
20·d
a
mod n = 13755 mod 221 = 188 ≠ 1, n − 1
21·d
a
mod n = 137
110
mod 221 = 205 ≠ n − 1.
Так как 137 – свидетель того, что 221 составное, число 174 на
самом деле было ложным свидетелем простоты. Заметим, что
алгоритм ничего не говорит нам о множителях числа 221 (которые равны 13 и 17). Однако в некоторых случаях дополнительные вычисления помогают получить множители числа.
Сложность работы
Считая, что время умножения логарифмическое, используя
быстрое умножение по модулю, сложность работы алгоритма
O(k log
3
n), где k – количество раундов. Таким образом, время
работы алгоритма полиномиально.
Однако, используя быстрое преобразование Фурье, возможно сократить время работы алгоритма до
O(k log
В таком случае, если брать k = log
число, то сложность работы алгоритма равна O(log
2
(n) log(log(n)) log(log(log(n)))) = O(k log2(n)).
2
(n), где n – проверяемое
3
n);
► в) тест Соловея – Штрассена всегда корректно опре-
деляет, что простое число является простым, но для составных
чисел с некоторой вероятностью он может дать неверный ответ.
Основное преимущество теста заключается в том, что он, в отличие от теста Ферма, распознает числа Кармайкла как составные.
Описание алгоритма
Алгоритм Соловея – Штрассена параметризуется количеством раундов k. В каждом раунде случайным образом выбирается число a < n. Если НОД (a,n) > 1, то выносится решение, что
n – составное. Иначе проверяется справедливость сравнения:
a
a
(n – 1)/2
≡
n
(mod n).
Если оно не выполняется, то выносится решение, что n – составное. Если это сравнение выполняется, то a является свидетелем простоты числа n. Далее выбирается другое случайное a и
- 112 -

2
Лекция 8
процедура повторяется. После нахождения k свидетелей простоты в k раундах выносится заключение, что n является простым
числом с вероятностью 2
-k
.
Пример.
Проверим число n = 19 на простоту. Выберем параметр точ-
ности k = 2.
Первая итерация k = 1.
Выберем случайное число a = 11; 2 < a < n – 1.
Проверим условие НОД (a, n) > 1.
НОД (11,19) = 1; значит, проверяем выполнение сравнения:
a
≡
n
(mod n),
(n – 1)/2
a
r =
s = a
a
n
(n-1)/2
=
= 11
11
19
(19 – 1)/2
= 1,
= 1.
Получили, что r = s, поэтому переходим к следующей итерации.
Вторая итерация k = 2.
Выберем случайное число a = 5; 2 < a < n – 1.
Проверим условие НОД (a, n) > 1.
НОД (5,19) = 1; значит, проверяем выполнение сравнения:
a
= 5
≡
a
n
(19 – 1)/2
(mod n),
n
5
=
19
(mod 19) = 1.
= 1,
2−
).
(n – 1)/2
a
r =
(n-1)/2
s = a
r = s и это была последняя итерация, отсюда делаем вывод, что
19 – простое число с вероятностью (1 –
Сложность работы
Теоретическая сложность вычислений оценивается как
3
O(log
n). Алгоритм требует O(klog2 m) операций над длинны-
ми целыми числами. При реализации алгоритма, для снижения
вычислительной сложности, числа a выбираются из интервала
0 < a < c < n, где c – константа, равная максимально возможному значению натурального числа, помещающегося в одном
регистре процессора.
- 113 -

СПЕЦИАЛЬНЫЕ РАЗДЕЛЫ МАТЕМАТИКИ
8.3.Обзорметодовфакторизации
натуральныхчисел
Натуральное число называется простым, если оно делится
только на себя и на 1. Число, не являющееся простым, называется составным. Очевидно, что любое простое число, не равное
2, является нечетным. Существуют признаки делимости целых
чисел на различные простые числа, например, чтобы число в десятичном виде делилось на 3 и 9 достаточно, чтобы сумма его
цифр делилась на 3 и 9 соответственно. Чтобы число делилось
на 5, достаточно, чтобы его последняя цифра была 0 или 5. Такие
частные признаки делимости можно использовать, если нужно
уменьшить множество кандидатов проверки на простоту или
отсечь заведомо составные числа. Альтернативным способом
получения простых чисел является решето Эратосфена, приписываемое древнегреческому ученому Эратосфену Киренскому,
жившему примерно в 276–194 г. до н. э.
Для нахождения множества простых чисел до заранее выбранной верхней границы B мы сначала выписываем последовательность всех нечетных чисел от 3 до B. Затем выбираем
первое число в списке, т. е. тройку и, оставляя его в списке,
вычеркиваем все кратные 3, начиная с 6. Потом переходим ко
второму числу списка (пятерке) и вычеркиваем его кратные,
оставив саму пятерку и т. д., пока не дойдем до конца списка.
В оставшемся списке будут только простые числа.
Факторизацией натурального числа называется его разложение в произведение простых множителей. Существование и единственность (с точностью до порядка следования множителей) такого разложения следует из основной теоремы арифметики.
Эта задача имеет большую вычислительную сложность.
Один из самых популярных методов криптографии с открытым
ключом, метод RSA, основан на трудоемкости задачи факторизации длинных целых чисел.
Существуют следующие методы факторизации натуральных чисел:
Экспоненциальные алгоритмы:
• перебор возможных делителей;
• метод факторизации Ферма;
- 114 -

nn
()
()
(
)
N
1
Лекция 8
• ρ-алгоритм Полларда;
• метод квадратичных форм Шенкса;
• метод Лемана.
Субэкспоненциальные алгоритмы:
• алгоритм Диксона;
• метод непрерывных дробей;
• метод квадратичного решета;
• метод эллиптических кривых.
Решето числового поля:
• специальный метод решета числового поля;
• общий метод решета числового поля.
8.4.Опорядкевычислительнойсложности
алгоритмовфакторизации
В зависимости от сложности алгоритмы факторизации можно
разбить на две группы. Первая группа – экспоненциальные алгоритмы, сложность которых экспоненциально зависит от длины
входящих параметров (то есть от длины самого числа в бинарном
представлении). Для обозначения их сложности принята O-нотация. Эта нотация позволяет учитывать в функции f (n) лишь наиболее значимые элементы, отбрасывая второстепенные.
fn
Например, в функции
2
n
ших n компонента
будет значительно превосходить остальные слагаемые, и поэтому характерное поведение этой функции
определяется именно этой компонентой. Остальные компоненты можно отбросить и условно записать, что данная функция
имеет оценку поведения (в смысле скорости роста ее значений)
вида
сложностью
2
On
. Фраза «алгоритм факторизации с вычислительной
1
2
ON
» означает, что с увеличением параметра N,
характеризующего количество входной информации алгоритма,
время работы алгоритма не может быть ограничено величиной,
которая растет медленнее, чем
Вторая группа – субэкспоненциальные алгоритмы – это алгоритмы, которые работают более чем за полиномиальное время
(«сверхполиномиальное»), но менее, чем за экспоненциальное
время («субэкспоненциальное»). Для обозначения их сложности
принята L-нотация:
=−+2512�
2
.
при достаточно боль-
- 115 -

СПЕЦИАЛЬНЫЕ РАЗДЕЛЫ МАТЕМАТИКИ
))
αα
N
01<<
α
(
)
(
)
(
)
(
)
22
()
()
()
()
p
ON
−11
1
)
и c – неко-
4
;
LcOcoN N
(,): (exp(( ( ))(log )(loglog
α
N
где
торые константы.
– число, подлежащее факторизации,
Экспоненциальные алгоритмы:
• перебор возможных делителей – наиболее тривиальный
алгоритм факторизации с вычислительной сложностью
ON
• ρ-алгоритм Полларда имеет сложность
• метод квадратичных форм Шенкса имеет сложность
• метод Лемана имеет сложность
Субэкспоненциальные алгоритмы:
• алгоритм Диксона имеет сложность
• метод непрерывных дробей имеет сложность
• метод квадратичного решета имеет сложность
=+
1
2
;
L
N
L
ON
ON
1
1
N
1
4
;
1
3
.
,
2
2
;
2,
;
• метод эллиптических кривых имеет сложность
где
– наименьшее простое, которое делит N.
8.5. Описаниенекоторыхэффективных
алгоритмовфакторизации
В настоящее время самыми эффективными алгоритмами
факторизации являются вариации решета числового поля:
• специальный метод решета числового поля со сложностью
1
L
L
p
1,
N
;
2
1
2,
,
2
- 116 -

()
()
≡± ( mod).
{}
()
bn
bn
d.
d.
ap
()
()
()
pp
22
Лекция 8
L
1332 9
N
/, /
1
3
L
N
(метод применим для факторизации чисел только специ-
ального вида);
• общий метод решета числового поля со сложностью
LN1364 9
/, /
1
3
(метод применим ко всем числам).
Все эти методы достаточно трудоемки, поэтому требуют значительных вычислительных ресурсов для чисел большой длины.
Однако теоретическое обоснование необходимой сложности таких вычислений или, другими словами, существование высоких
нижних оценок не доказано, поэтому вопрос о существовании
алгоритма факторизации с полиномиальной сложностью на классическом компьютере для выполнения факторизации является
одной из важных открытых проблем современной теории чисел.
Алгоритм Диксона – алгоритм факторизации, использующий в своей основе идею Лежандра, заключающуюся в поиске
пары целых чисел x и y таких, что
22
xy n
≡ (mod )
xy n
и
Метод Диксона является обобщением метода Ферма.
Описание алгоритма
1. Составить факторную базу
,,...,
12
, состоящую
Bn=
ρρ ρ
из всех простых чисел
ρ
<=MLn(),
2. Выбрать случайное
3. Вычислить
ab n=2mo
1
2
bn
, <<
→
ε
где
b
.
и вычисляется
2
mo
4. Проверить число а на гладкость пробными делениями.
Если а является В гладким числом, то есть
b
α
p
=
∏
pB
∈
следует запомнить векторы
→
αα α
==() ((),..., ( )),
bb b
→
εα α
() (()mod ,..., ()mod
bb b
1
1
pph
,
→
α
→
b
ε
b
и
h
:
)).
- 117 -

СПЕЦИАЛЬНЫЕ РАЗДЕЛЫ МАТЕМАТИКИ
+1
bb
11
bb
11
εε
→→
()
bb
11
tm
bn
=
d,
ii
d.
≡± (mod ).
=⋅ =+ =−
(,
5. Повторять процедуру генерации чисел до тех пор, пока
не будет найдено
h
В-гладких чисел
,..., .
h
+
,..., .
h
+
6. Методом Гаусса найти линейную зависимость среди векторов
(),...,
→→
εε
:
+
h
⊕⊕ =≤≤()... () ,bb
ii11
01
и положить:
xb
pb pb
(()... ())
yp
=
αα
П
pB
∈
... mo
ii
11
++
1
2
t
mo
n
7. Проверить
xy n
Если это так, то повторить процедуру генерации. Если нет, то найдено нетривиальное
разложение:
nuvu xynv xyn
,( ,)
). ,
Факторизация методом непрерывных дробей (CFRAC) –
алгоритм факторизации целых чисел. Это алгоритм общего
вида, который пригоден для факторизации любого целого n, не
опирается на специальные формы или свойства. Он был найден
Д. Г. Лемером и Р. Е. Поверсом в 1931 г. и переработан в алгоритм для компьютера Михаэлем А. Моррисоном и Джоном
Бриллхартом в 1975 г.
Метод непрерывных дробей основывается на алгоритме Диксона. Он использует непрерывную дробь, сходящуюся к
kn k, ∈
+
.
Метод квадратичного решета факторизации больших чисел, разработан Померанцем в 1981 году. Долгое время этот метод превосходил другие методы факторизации целых чисел общего вида, не имеющих простых делителей, порядок которых
n
значительно меньше
тели, много меньшие
(для чисел n, имеющих простые дели-
n,
более быстрым является метод факторизации на эллиптических кривых). Метод квадратичного решета представляет собой разновидность метода факторных баз
(обобщение метода факторизации Ферма). Этот метод считается
вторым по быстроте (после общего метода решета числового
поля) и до сих пор является самым быстрым для целых чисел до
- 118 -

nn
Лекция 8
100 десятичных цифр. Так как этот метод устроен значительно
проще, чем общий метод решета числового поля, – это универсальный алгоритм факторизации, так как время его выполнения
исключительно зависит от размера факторизуемого числа, а не
от его особой структуры и свойств.
Основныецелиметодаквадратичногорешета
Алгоритм пытается найти такие квадраты чисел, которые
равны по модулю n (факторизуемое число), что часто приводит
к факторизации самого n. Алгоритм работает в два этапа: 1) этап
сбора данных, где он собирает информацию, которая может привести к равенству квадратов; 2) этап обработки данных, где он
помещает всю собранную информацию в матрицу и обрабатывает ее для получения равенства квадратов. Первый этап может
быть легко распараллелен на много процессов, но второй этап
требует большие объемы памяти и его трудно распараллелить.
Один из простых методов отыскания равных квадратов заключается в том, чтобы выбрать случайное число, возвести его
в квадрат и надеяться, что остаток от деления на n является ква-
2
дратом какого-либо другого числа. Например, 80
2
441 = 21
. Этот способ находит равные квадраты лишь в редких
mod 5959 =
случаях для больших n, но если он действительно найдет эти
числа, то можно считать, что факторизация завершена. Этот метод похож на метод факторизации Ферма.
Метод квадратичного решета является модификацией метода
разложения на множители Диксона.
Продолжительность расчёта для квадратичного решета (n –
факторизуемое число):
Oo
(exp(( ())log loglog )).11+
Подход
Пусть x mod y обозначает остаток от деления x на y. В методе
факторизации Ферма в отдельности подбираем число a, чтобы
a2 mod n являлось квадратом. Но такое число подобрать тяжело.
В квадратичном решете мы вычисляем a2 mod n для некоторых
a, и затем находим такое подмножество, произведение элементов которого является квадратом. Это приведёт к сравнению квадратов.
- 119 -

СПЕЦИАЛЬНЫЕ РАЗДЕЛЫ МАТЕМАТИКИ
Например, 412 mod 1649 = 32, 422 mod 1649 = 115, и 432 ·
·mod 1649 = 200. Ни один из полученных результатов не является квадратом, но результат произведения (32)(200) = 6400 = 802.
С другой стороны, рассмотрев предыдущее произведение по
mod 1649, мы получим, что (32)(200) = (412)(432) = ((41)(43))2.
Так как (41) ∙ (43) mod 1649 = 114, мы имеем сравнение квадратов: 1142 ≡ 802 (mod 1649).
Но как мы решаем проблему, фиксируя множество чисел и
находя подмножество, произведение элементов которого является квадратом? Начнём с понятия «вектор показателей степеней».
Например, у нас есть число 504. Его разложение на простые
множители имеет следующий вид 504 = 23 32 50 71. Мы могли бы
представить это разложение в виде вектора показателей степеней (3, 2, 0, 1), который фиксирует степени простых чисел 2, 3,
5 и 7, участвующих в разложении. Число 490 по аналогии имело
бы вектор (1, 0, 1, 2). Умножение чисел – это то же самое, что и
поэлементное сложение их векторов показателей степеней, то
есть произведение 504 ∙ 490 имеет вектор (4, 2, 1, 3).
Теперь обратите внимание, что число является квадратом,
если каждый элемент в его векторе показателей степеней чётный. К примеру, при сложении векторов (3, 0, 0, 1) и (1, 2, 0, 1)
получаем (4, 2, 0, 2). Это говорит нам о том, что произведение
чисел 56 ∙ 126 является квадратом. На самом деле, мы не заботимся о точных значениях, получаемых в векторе, до тех пор
пока каждый элемент в результирующем векторе чётный. По
этой причине мы берём каждый элемент по mod 2 и выполняем
сложение элементов по mod 2: (1, 0, 0, 1) + (1, 0, 0, 1) = (0, 0, 0, 0).
Таким образом, наша задача приняла следующий вид: задано
множество векторов (0, 1), найти такое подмножество, которое
дополняется до нулевого вектора при использовании сложения
по mod 2. Это задача линейной алгебры, то есть необходимо
найти линейно зависимые векторы. Из теоремы линейной алгебры следует, что, до тех пор пока количество векторов больше,
чем количество элементов в каждом векторе, такая зависимость
должна существовать. Мы можем эффективно находить линейно зависимые векторы, например, поместив исходные векторы,
- 120 -
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
