Анализ комбинаторных алгоритмов Лекция № 12 Теоретико-числовые алгоритмы
Анализ комбинаторных алгоритмов
Лекция № 12Теоретико-числовые алгоритмы
Начальные сведения из теории чисел
Говорят, что d делит a (d|a, d,a - целые), если a=k*d, при некотором целом k (синонимы: a делится на d, a кратно d).
Число a не имеющее делителей кроме ±1 и ±a, называется простым.
Целое число не являющееся простым называется составным.
Начальные сведения из теории чисел
Все целые числа могут быть разделены на n классов в зависимости от остатка при делении на n: kn, kn+1, kn+2 и т.д.
ТеоремаДля любого целого a и положительного целого n, существует единственная пара q и r, для которой 0≤r<n и a = q*n+r
Начальные сведения из теории чисел
Говорят, что 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} )
Начальные сведения из теории чисел
Среди всех общих делителей чисел 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
Начальные сведения из теории чисел
Для НОД также выполняются свойства: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)
Начальные сведения из теории чисел
ТеоремаНаибольший общий делитель целых чисел a и b, не равных 0 одновременно, является наименьшим положительным элементом множества целочисленных линейных комбинаций чисел a и b ( Z = {ax+by} , где x и у – целые числа).
СледствиеНОД кратен любому общему делителю.
Начальные сведения из теории чисел
ТеоремаВсякое составное число a можно единственным образом представить в виде: , где pn – простые числа.
rer
ee pppa ...2121
Алгоритм Евклида
Можно разложить числа 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
Алгоритм Евклида
Если алгоритм Евклида во время работы взывает себя k раз, то a ≥ Fk+2 и b ≥ Fk+1, где Fn – n-ое число фибоначчи.
void EUCLID(a,b){
if (b=0) return a;
else return EUCLID(b, a % b);
}
Алгоритм Евклида
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;
}}
Алгоритм Евклида
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
Модулярная арифметика
Множество S с определенной на нем бинарной операцией называется группой, если выполнены свойства:1) Замкнутость2) Существование нейтрального элемента3) Ассоциативность 4) Существование обратного элемента
Seaaeaae , если ,
SbaSba , для ,
cbacba )()(
eabba
Модулярная арифметика
Если в группе выполнено свойство коммутативности, то она называется Абелевой группой.
Группа называется конечной, если количество элементов в ней конечно.
Модулярная арифметика
Можно определить группы, элементами которых будут вычеты (остатки по модулю n, классы эквивалентности по модулю n):
Аддитивная группа вычетов по модулю n, содержит вычеты, которые складываются по правилу: [a]n+n[b]n=[a+b]n
Мультипликативная группа вычетов по модулю n, содержит вычеты взаимно простые с n и умножаемые по правилу: [a]n*n[b]n=[a*b]n
Модулярная арифметика
+ 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
Модулярная арифметика
Аддитивная (Zn+n) и мультипликативная (Z*n, *n) группы, являются конечными Абелевыми группами
Число элементов в (Z*n, *n) обозначается φ(n) и носит название φ-функции Эйлера. φ-функция Эйлера вычисляется по формуле:где p – список всех простых делителей числа n.
,11...111
sppn
Модулярная арифметика
Пусть (S, ) является группой, а S` подмножество S. Если (S`, ) тоже является группой, то его называют подгруппой группы (S, ).
ТеоремаЕсли (S`, ) подгруппа конечной группы (S, ), то |S`| делит |S|.
Модулярная арифметика
Если рассмотреть последовательность , где a – элемент группы
(S, ), то если группа конечна, то последовательность будет периодична и будет являться подгруппой группы (S, ).
Число t при котором a(t)=e ( ) называется порядком. Число элементов в подгруппе порожденной элементом a совпадает с порядком этого элемента.
...,,, aaaaaae
раз ... taaa
Решение диофантовых уравнений
Линейными диофантовыми уравнениями называют уравнения вида:
ax ≡ b (mod n)
Задача заключается в нахождении всех x из Zn для которых верно указанное уравнение.
Решение диофантовых уравнений
Рассмотрим подгруппу группы (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 различных решений или не имеет их вообще.
Решение диофантовых уравнений
ТеоремаПусть 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.
Решение диофантовых уравнений
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(“Нет решений”);}
Степени элемента
Рассмотрим в мультипликативной группе последовательность степеней элемента 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))
Степени элемента
Если порядок элемента g равен |Z*n |, g называют примитивным корнем или образующей Z*n .
Если группа имеет образующую ее называют циклической.
ТеоремаГруппа Z*n является циклической тогда и только тогда, когда n равно 2, 4, имеет вид pk или 2pk (где p>2 – простое число, k – положительное целое)
Степени элемента
Теорема (о дискретном логарифме)Пусть g – образующая Z*n, тогда сравнение gx ≡ gy (mod n) равносильно сравнению x ≡ y (mod φ(n))
Теорема При простом p>2 и положительном целом k уравнение x2 ≡ 1 (mod pk) имеет два решения x = 1 и x = -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;}
Степени элемента
79 mod 561 = 316
i 3 2 1 0
B 1 0 0 1
C 1 2 4 9
D 7 49 157 316
Криптосистема RSA с открытым ключом
Криптосистемы с открытым ключом позволяют обмениваться секретными сообщениями по открытому каналу, не договариваясь заранее о ключе шифра.
Кроме того, методы используемые в криптосистемах позволяют также добавить к сообщению цифровую подпись, удостоверяющую что сообщение не фальсифицировано.
Криптосистема RSA с открытым ключом
При использовании криптосистем с открытым ключом каждый участник переговоров имеет два ключа:Открытый (public key, Pk) - сообщается
остальным участникам или вообще всем желающим.
Секретный (secret key, Sk) – хранится в секрете, не открывается никому.
Криптосистема RSA с открытым ключом
Каждый ключ задает некоторую перестановку множества возможных сообщений D, которая обозначается P() или S().
Пара ключей одного участника должна задавать взаимообратные переста-новки, т.е. M = S(P(M)) должно быть выполнено для любого M – сообще-ния из D.
Криптосистема RSA с открытым ключом
Процесс пересылки сообщения в криптосистеме с открытым ключе происходит так:B узнает открытый ключ A – PaB зашифровывает свое сообщение M –
C = Pa(M) – и отсылает его A.A получает сообщение C и
расшифровывает его – M = Sa(C)
Криптосистема RSA с открытым ключом
Подписать сообщение цифровой подписью можно следующим образом:A вычисляет цифровую подпись σ=Sa(M)A отсылает B пару (M, σ)B получает пару (M, σ)B удостоверяется в подлинности
сообщения, проверив равенство M=Pa(σ)
Криптосистема RSA с открытым ключом
Pa SaM MC=Pa(M)
Шифрование с открытым ключом
PaPa
M MM, σ
Цифровая подпись
σ = Sa(M) Pa(σ) = M?
Криптосистема RSA с открытым ключом
Криптосистема RSA основана на том обстоятельстве, что в настоящее время известны эффективные алгоритмы поиска больших простых чисел, но не известно приемлемого по времени алгоритма разложения произведения двух больших простых чисел на множители.
Криптосистема RSA с открытым ключом
Этапы построения ключей криптосис-темы RSA: Взять два больших простых числа p и q Вычислить n = pq Взять небольшое нечетное число e взаимно
простое с φ(n) Вычислить d = e-1 mod φ(n) Составить пару P = (e, n) – открытый ключ Составить пару S = (d, n) – секретный ключ
Криптосистема RSA с открытым ключом
Множеству допустимых сообщений D соответствует Zn.
Открытому ключу соответствует преобразование:P(M) = Me mod n
Секретному ключу соответствует преобразование:S(C) = Cd mod n
Криптосистема RSA с открытым ключом
Для ускорения вычислений на практике цифровая подпись вычисляется не для всего сообщения, а для некоторой хеш-функции от него h(M), дающей в результате небольшое по размеру значение.