38
Анализ комбинаторных алгоритмов Лекция № 12 Теоретико-числовые алгоритмы

Лекция 12 Теоретико-числовые алгоритмы Часть 1

Embed Size (px)

Citation preview

Page 1: Лекция 12 Теоретико-числовые алгоритмы Часть 1

Анализ комбинаторных алгоритмов

Лекция № 12Теоретико-числовые алгоритмы

Page 2: Лекция 12 Теоретико-числовые алгоритмы Часть 1

Начальные сведения из теории чисел

Говорят, что d делит a (d|a, d,a - целые), если a=k*d, при некотором целом k (синонимы: a делится на d, a кратно d).

Число a не имеющее делителей кроме ±1 и ±a, называется простым.

Целое число не являющееся простым называется составным.

Page 3: Лекция 12 Теоретико-числовые алгоритмы Часть 1

Начальные сведения из теории чисел

Все целые числа могут быть разделены на n классов в зависимости от остатка при делении на n: kn, kn+1, kn+2 и т.д.

ТеоремаДля любого целого a и положительного целого n, существует единственная пара q и r, для которой 0≤r<n и a = q*n+r

Page 4: Лекция 12 Теоретико-числовые алгоритмы Часть 1

Начальные сведения из теории чисел

Говорят, что a сравнимо с b по модулю n (a≡b (mod n)), если (a mod n) = (b mod n), т.е. n | (b-a), (61≡6 (mod 11)).

Все целые числа делятся на n классов эквивалентности по модулю n.

Множество классов эквивалентности по модулю n обозначается Zn (например, Z5={0,1,2,3,4} )

Page 5: Лекция 12 Теоретико-числовые алгоритмы Часть 1

Начальные сведения из теории чисел

Среди всех общих делителей чисел a и b можно выбрать наибольший общий делитель – НОД(a, b).

Целые числа взаимно просты, если НОД=1.

Для общих делителей верны свойства:1) если d|a и d|b, то d|(a+b) и d|(a-b)2) если d|a и d|b, то d|(ax+by) (для любых целых x и y).3) если a|b и b|a, то a = ±b

Page 6: Лекция 12 Теоретико-числовые алгоритмы Часть 1

Начальные сведения из теории чисел

Для НОД также выполняются свойства:1) НОД(a,b) = НОД(b,a)2) НОД(a,b) = НОД(-a,b)3) НОД(a,b) = НОД(|a|,|b|)4) НОД(a,0) = |a|5) НОД(a,ka) = |a|, для любых целых k6) НОД(0,0) не определен7) НОД(an, bn) = n НОД(a, b)

Page 7: Лекция 12 Теоретико-числовые алгоритмы Часть 1

Начальные сведения из теории чисел

ТеоремаНаибольший общий делитель целых чисел a и b, не равных 0 одновременно, является наименьшим положительным элементом множества целочисленных линейных комбинаций чисел a и b ( Z = {ax+by} , где x и у – целые числа).

СледствиеНОД кратен любому общему делителю.

Page 8: Лекция 12 Теоретико-числовые алгоритмы Часть 1

Начальные сведения из теории чисел

ТеоремаВсякое составное число a можно единственным образом представить в виде: , где pn – простые числа.

rer

ee pppa ...2121

Page 9: Лекция 12 Теоретико-числовые алгоритмы Часть 1

Алгоритм Евклида

Можно разложить числа a и b на простые множители: и , то НОД можно записать как

ТеоремаПусть а – целое неотрицательное число, b – целое положительное число и a>=b, тогда НОД(a,b) = НОД(b, a mod b)

rfr

ff pppb ...2121

),min(),min(2

),min(1 ...2211 rr fe

rfefe pppa

rer

ee pppa ...2121

Page 10: Лекция 12 Теоретико-числовые алгоритмы Часть 1

Алгоритм Евклида

Если алгоритм Евклида во время работы взывает себя k раз, то a ≥ Fk+2 и b ≥ Fk+1, где Fn – n-ое число фибоначчи.

void EUCLID(a,b){

if (b=0) return a;

else return EUCLID(b, a % b);

}

Page 11: Лекция 12 Теоретико-числовые алгоритмы Часть 1

Алгоритм Евклида

void EXTEUCLID(a,b){ if (b=0) return new st(a,1,0); else {

st* h = EXTEUCLID(b, a % b);h->d = h->d; x = h->x;h->x = h->y;h->y = x – (a/b)*h->yreturn h;

}}

Page 12: Лекция 12 Теоретико-числовые алгоритмы Часть 1

Алгоритм Евклида

a b a/b d x y99 78 1 3 -11 1478 21 3 3 3 -1121 15 1 3 -2 315 6 2 3 1 -26 3 2 3 0 13 0 - 3 1 0

Page 13: Лекция 12 Теоретико-числовые алгоритмы Часть 1

Модулярная арифметика

Множество S с определенной на нем бинарной операцией называется группой, если выполнены свойства:1) Замкнутость2) Существование нейтрального элемента3) Ассоциативность 4) Существование обратного элемента

Seaaeaae , если ,

SbaSba , для ,

cbacba )()(

eabba

Page 14: Лекция 12 Теоретико-числовые алгоритмы Часть 1

Модулярная арифметика

Если в группе выполнено свойство коммутативности, то она называется Абелевой группой.

Группа называется конечной, если количество элементов в ней конечно.

Page 15: Лекция 12 Теоретико-числовые алгоритмы Часть 1

Модулярная арифметика

Можно определить группы, элементами которых будут вычеты (остатки по модулю n, классы эквивалентности по модулю n):

Аддитивная группа вычетов по модулю n, содержит вычеты, которые складываются по правилу: [a]n+n[b]n=[a+b]n

Мультипликативная группа вычетов по модулю n, содержит вычеты взаимно простые с n и умножаемые по правилу: [a]n*n[b]n=[a*b]n

Page 16: Лекция 12 Теоретико-числовые алгоритмы Часть 1

Модулярная арифметика

+ 0 1 2 3 4 50 0 1 2 3 4 51 1 2 3 4 5 02 2 3 4 5 0 13 2 3 4 0 1 24 4 5 0 1 2 35 5 0 1 2 3 4

* 1 2 4 7 8 11 13 14

1 1 2 4 7 8 11 13 14

2 2 4 8 14 1 7 11 13

4 4 8 1 13 2 14 7 11

7 7 14 13 4 11 2 1 8

8 8 1 2 11 4 13 14 7

11 11 7 14 2 13 1 8 4

13 13 11 7 1 14 8 4 2

14 14 13 11 8 7 4 2 1

Page 17: Лекция 12 Теоретико-числовые алгоритмы Часть 1

Модулярная арифметика

Аддитивная (Zn+n) и мультипликативная (Z*n, *n) группы, являются конечными Абелевыми группами

Число элементов в (Z*n, *n) обозначается φ(n) и носит название φ-функции Эйлера. φ-функция Эйлера вычисляется по формуле:где p – список всех простых делителей числа n.

,11...111

sppn

Page 18: Лекция 12 Теоретико-числовые алгоритмы Часть 1

Модулярная арифметика

Пусть (S, ) является группой, а S` подмножество S. Если (S`, ) тоже является группой, то его называют подгруппой группы (S, ).

ТеоремаЕсли (S`, ) подгруппа конечной группы (S, ), то |S`| делит |S|.

Page 19: Лекция 12 Теоретико-числовые алгоритмы Часть 1

Модулярная арифметика

Если рассмотреть последовательность , где a – элемент группы

(S, ), то если группа конечна, то последовательность будет периодична и будет являться подгруппой группы (S, ).

Число t при котором a(t)=e ( ) называется порядком. Число элементов в подгруппе порожденной элементом a совпадает с порядком этого элемента.

...,,, aaaaaae

раз ... taaa

Page 20: Лекция 12 Теоретико-числовые алгоритмы Часть 1

Решение диофантовых уравнений

Линейными диофантовыми уравнениями называют уравнения вида:

ax ≡ b (mod n)

Задача заключается в нахождении всех x из Zn для которых верно указанное уравнение.

Page 21: Лекция 12 Теоретико-числовые алгоритмы Часть 1

Решение диофантовых уравнений

Рассмотрим подгруппу группы (Zn,+n) порожденную элементом а:

{a(x),x>0} = {ax mod k, x>0}.

ТеоремаДля положительных целых a и n верно {a}={d}={0,d,2d,…,(n/d-1)d}, d = НОД(a,n)

Следствие Уравнение ax ≡ b (mod n) разрешимо, если НОД(a,n)|b. Диофантово уравнение имеет d различных решений или не имеет их вообще.

Page 22: Лекция 12 Теоретико-числовые алгоритмы Часть 1

Решение диофантовых уравнений

ТеоремаПусть d = НОД(a,n)=ax`+ny`. Тогда число

x0 = x`(b/d) mod n – решение диофантова уравнения.

ТеоремаПусть уравнение ax ≡ b (mod n) разрешимо и x0 является его решением.

Тогда уравнение имеет d = НОД(a,n) решений задаваемых формулой xi = x0+i(n/d), где i – 0,1,2,…,n-1.

Page 23: Лекция 12 Теоретико-числовые алгоритмы Часть 1

Решение диофантовых уравнений

void MLEQSolver(a,b,n){ st* h = EXTEUCLID(a,n); if (h->d % b == 0){

x0 = h->x*(b/d) % n;for(i=0;i<h->d;i++)

print(x0+i*(n/h->d)); } else print(“Нет решений”);}

Page 24: Лекция 12 Теоретико-числовые алгоритмы Часть 1

Степени элемента

Рассмотрим в мультипликативной группе последовательность степеней элемента a: a0,a1,a2… Всегда верно утверждение a0 mod n = 1.

Теорема (Эйлера)аφ(n) ≡ 1 (mod n), для a из Z*n

Теорема (малая теорема Ферма)Если p – простое a p-1 ≡ 1 (mod n), для a из Z*n (a p ≡ a (mod n))

Page 25: Лекция 12 Теоретико-числовые алгоритмы Часть 1

Степени элемента

Если порядок элемента g равен |Z*n |, g называют примитивным корнем или образующей Z*n .

Если группа имеет образующую ее называют циклической.

ТеоремаГруппа Z*n является циклической тогда и только тогда, когда n равно 2, 4, имеет вид pk или 2pk (где p>2 – простое число, k – положительное целое)

Page 26: Лекция 12 Теоретико-числовые алгоритмы Часть 1

Степени элемента

Теорема (о дискретном логарифме)Пусть g – образующая Z*n, тогда сравнение gx ≡ gy (mod n) равносильно сравнению x ≡ y (mod φ(n))

Теорема При простом p>2 и положительном целом k уравнение x2 ≡ 1 (mod pk) имеет два решения x = 1 и x = -1.

Page 27: Лекция 12 Теоретико-числовые алгоритмы Часть 1

Степени элемента

Пусть надо вычислить ab mod n. b[0..k] – битовая запись числа b.

void ModExp(a,b,n){ c = 0; d = 1; for (i=k;i<=0;i--){

c = 2*c;d = (d*d) % n;if (b[i]=1){c = c+1; d = (d*a)%n;}

} return d;}

Page 28: Лекция 12 Теоретико-числовые алгоритмы Часть 1

Степени элемента

79 mod 561 = 316

i 3 2 1 0

B 1 0 0 1

C 1 2 4 9

D 7 49 157 316

Page 29: Лекция 12 Теоретико-числовые алгоритмы Часть 1

Криптосистема RSA с открытым ключом

Криптосистемы с открытым ключом позволяют обмениваться секретными сообщениями по открытому каналу, не договариваясь заранее о ключе шифра.

Кроме того, методы используемые в криптосистемах позволяют также добавить к сообщению цифровую подпись, удостоверяющую что сообщение не фальсифицировано.

Page 30: Лекция 12 Теоретико-числовые алгоритмы Часть 1

Криптосистема RSA с открытым ключом

При использовании криптосистем с открытым ключом каждый участник переговоров имеет два ключа:Открытый (public key, Pk) - сообщается

остальным участникам или вообще всем желающим.

Секретный (secret key, Sk) – хранится в секрете, не открывается никому.

Page 31: Лекция 12 Теоретико-числовые алгоритмы Часть 1

Криптосистема RSA с открытым ключом

Каждый ключ задает некоторую перестановку множества возможных сообщений D, которая обозначается P() или S().

Пара ключей одного участника должна задавать взаимообратные переста-новки, т.е. M = S(P(M)) должно быть выполнено для любого M – сообще-ния из D.

Page 32: Лекция 12 Теоретико-числовые алгоритмы Часть 1

Криптосистема RSA с открытым ключом

Процесс пересылки сообщения в криптосистеме с открытым ключе происходит так:B узнает открытый ключ A – PaB зашифровывает свое сообщение M –

C = Pa(M) – и отсылает его A.A получает сообщение C и

расшифровывает его – M = Sa(C)

Page 33: Лекция 12 Теоретико-числовые алгоритмы Часть 1

Криптосистема RSA с открытым ключом

Подписать сообщение цифровой подписью можно следующим образом:A вычисляет цифровую подпись σ=Sa(M)A отсылает B пару (M, σ)B получает пару (M, σ)B удостоверяется в подлинности

сообщения, проверив равенство M=Pa(σ)

Page 34: Лекция 12 Теоретико-числовые алгоритмы Часть 1

Криптосистема RSA с открытым ключом

Pa SaM MC=Pa(M)

Шифрование с открытым ключом

PaPa

M MM, σ

Цифровая подпись

σ = Sa(M) Pa(σ) = M?

Page 35: Лекция 12 Теоретико-числовые алгоритмы Часть 1

Криптосистема RSA с открытым ключом

Криптосистема RSA основана на том обстоятельстве, что в настоящее время известны эффективные алгоритмы поиска больших простых чисел, но не известно приемлемого по времени алгоритма разложения произведения двух больших простых чисел на множители.

Page 36: Лекция 12 Теоретико-числовые алгоритмы Часть 1

Криптосистема RSA с открытым ключом

Этапы построения ключей криптосис-темы RSA: Взять два больших простых числа p и q Вычислить n = pq Взять небольшое нечетное число e взаимно

простое с φ(n) Вычислить d = e-1 mod φ(n) Составить пару P = (e, n) – открытый ключ Составить пару S = (d, n) – секретный ключ

Page 37: Лекция 12 Теоретико-числовые алгоритмы Часть 1

Криптосистема RSA с открытым ключом

Множеству допустимых сообщений D соответствует Zn.

Открытому ключу соответствует преобразование:P(M) = Me mod n

Секретному ключу соответствует преобразование:S(C) = Cd mod n

Page 38: Лекция 12 Теоретико-числовые алгоритмы Часть 1

Криптосистема RSA с открытым ключом

Для ускорения вычислений на практике цифровая подпись вычисляется не для всего сообщения, а для некоторой хеш-функции от него h(M), дающей в результате небольшое по размеру значение.