Ім'я файлу: Практичне заняття_№2.pdf
Розширення: pdf
Розмір: 322кб.
Дата: 02.12.2022
скачати
Пов'язані файли:
інформ0809.docx
2. Скоропадський.docx

ПРАКТИЧНЕ ЗАНЯТТЯ №2
МЕТОДИ ТА АЛГОРИТМИ ГЕНЕРАЦІЇ ПРОСТИХ ЧИСЕЛ
2.1
Мета заняття: Отримати практичні навички роботи з простими числами, вивчити методи генерації простих чисел та основні тести перевірки числа на простоту, а також отримати практичні навички їх програмної реалізації
2.2
Методичні вказівки з організації самостійної роботи студентів
Прості числа.
Натуральне число p, більше одиниці називається простим, якщо воно ділиться без залишку тільки на 1 і на себе.
Теорема (Евклід). Безліч простих чисел нескінченна. Позначимо через p(x
) функцію, яка дорівнює числу простих чисел p в інтервалі 1 < x < p.
Російський математик П. Л. Чебишев в 1850г. показав, що
0,921 x / ln x < p(x) < 1,106 x / ln x .
Прості числа є важливим поняттям у криптографії. Багато сучасних криптографічних систем будуються на базі простого числа. Тому алгоритми генерації простих чисел і перевірки на простоту сформованого числа є важливими інструментами при створенні криптографічної системи.
Прості числа зустрічаються досить часто. Помітимо, що існує близько
10151 простих чисел довжиною від 1 до 512 біт включно, а кількість простих чисел менших 2512
приблизно дорівнює 2503. Для чисел близьких n імовірність довільно обраному числу виявитися простим числом, дорівнює 1/ln n. При випадковому виборі двох простих чисел у діапазоні від 1 до 151 біта ймовірність збігу цих чисел мізерно мала.
Прості числа відіграють важливу роль у сучасній криптографії. Багато сучасних криптографічних систем з відкритими (або не симетричними) ключами формуються із застосуванням простих чисел.
Для простих чисел будемо розглядати три завдання:
· генерація простих чисел;
· перевірка чисел на простоту;
· факторизація (розкладення) чисел на прості множники.
Насправді всі ці три завдання фактично дають відповідь на одне питання: чи є розглянуте число простим. Але для кожного із цих завдань застосовуються свої методи.

Для першого завдання, використовуючи необхідні умови простоти, можна давати відповіді типу:
· задане число n не просте;
·
імовірність того, что задане число n не просте, менше заданого числа e.
Для другого завдання можна будувати деяку послідовність чисел спеціального виду. І для чисел даної послідовності застосовувати деякі тести доти, поки не знайдемо серед них просте число.
Приведемо деякі визначення, теореми, алгоритми, які пов'язані з питаннями розв'язку поставлених завдань.
Визначення 1. Числа Fk = 2a + 1, a = 2k, k = 0, 1, 2, …, називаються числами Ферма.
Теорема 1. Число Ферма n = Fk при k > 0 є простим тоді й тільки тоді, коли 3(n – 1)/2 º -1 mod n.
Визначення 2. Нехай p – просте число. Числа виду Mp = 2p – 1 називаються числами Мерсенна. До речі, усі парні досконалі числа мають вигляд 2p - 1Mp, де Mp є числом Мерсенна. Нагадаємо, досконалим числом називається число, яке дорівнює сумі всіх своїх дільників, менших, чим воно саме.
Наприклад, 28 = 1 + 2 + 4 + 7 + 14.
Числа Мерсенна рідкі. В 2001 році було знайдено тридцять дев'яте число
Мерсенна для p = 13466917.
Для перевірки простоти чисел Мерсенна застосовується наступна теорема
Теорема 2. Нехай n – просте число, n > 2, Mn = 2
n
– 1.
1.
Розглянемо послідовність L
0
,
L
1
, …, яка визначається співвідношеннями
Число Mn – просте тоді й тільки тоді, коли Lq-2 ≡ 0 mod n.
Перевірка на простоту.
Прості числа необхідні для більшості криптографічних систем з відкритими ключами.
Теоретичний матеріал до питання побудови великих простих чисел можна знайти в літературних джерелах. Тут будуть сформульовані тільки деякі практичні підходи до формування великих простих чисел. Для генерації великих простих чисел можуть бути використані наступні два підходи:
формуються випадкові числа заданого порядку, і за допомогою існуючих тестів перевіряється, чи є вони простими;· по визначеному алгоритму генерируються прості числа, і за допомогою певних тестів виконується перевірка чисел на простоту.
Спочатку розглянемо ті тести, які використовуються при реалізації першого підходу формування простого числа.
Пробний розподіл.
Один з найпростіших способів перевірки числа p на простоту полягає в послідовному діленню числа p на всі непарні числа, які містяться вінтервалі [2,
p
]. Якщо в процесі ділення одержимоцілий результат, то число p – складене.
Якщо ж припереборі всіх непарних чисел з інтервалу [2, p ]розділити число p
на ці числа без залишку не можна, то число p – просте. Даний метод називається пробним діленням. Цей метод трудомісткий по числу арифметичних операцій, і він використовується в основному для перевірки невеликих простих чисел.
Решето Ератосфена.
Якщо ми прагнемо скласти таблицю всіх простих чисел серед чисел 2,
3,…, N
, то треба послідовно викреслити всі числа, які діляться на 2, крім 2; на
3, крім 3; на 5 крім 5; на наступне число, яке не викреслене, крім цього числа; і т.д.
У підсумку серед чисел від 1 до N залишаться лише прості числа. Для реалізації методу потрібний великий обсяг пам'яті ЕОМ, однак для складання таблиць простих чисел він є найкращим. Більше того, розробляються спеціальні процесори, на яких операції ≪просіювання≫ виконуються дуже ефективно.
Зауваження. Пробне ділення і решето Ератосфена можна застосовувати при розв'язанні завдання розкладання цілого числа на множники.
Відразу приведемо реалізацію алгоритму: int n; // вхідні дані vector prime (n+1, true); prime[0] = prime[1] = false; // якщо хтось буде використовувати ці значення for (int i=2; i<=n; ++i) if (prime[i]) for (int j=i+i; j<=n; j+=i) prime[j] = false;

У такому вигляді алгоритм споживає пам'яті O(n) і виконує дій O(n log logn).
Найбільший недолік алгоритму — те, що він "гуляє" по пам'яті, постійно виходячи за межі кеш-пам'яті, через що константа, схована в O(n log logn), порівняно велика.
Крім того, для досить великих чисел вузьким місцем стає об'єм споживаної пам'яті. Можна замінити vector на vector, за рахунок чого знизивши в 8 разів споживання пам'яті, однак втрата швидкості алгоритму буде досить серйозною.
Нижче розглянуті методи, що дозволяють як зменшити число виконуваних операцій, так і значно скоротити споживання пам'яті.
Просівання простими до кореня.
Самий очевидний момент - що для того, щоб знайти всі прості до n, досить виконати просівання тільки простими числами, що не перевершують кореня з n .
Таким чином, зміниться зовнішній цикл алгоритму: for (int i=2; i*i<=n; ++i)
На асимптотику така оптимізація не впливає, хоча число операцій помітно зменшиться.
Блокове решето.
Безпосередньо з попереднього пункту випливає, що немає ніякої необхідності зберігати увесь час увесь масив . Для виконання просівання досить зберігати тільки прості до кореня з n, а іншу частину масиву будувати поблочно, зберігаючи в теперішній момент часу тільки один блок.
Приведемо реалізацію блокового решета. Програма зчитує число й знаходить кількість простих від до n: const int SQRT_MAXN = 100000;
// корень з максимального значення N const int S = 10000; bool nprime[SQRT_MAXN], bl[S]; int primes[SQRT_MAXN], cnt; int main() { int n; cin >> n; int nsqrt = (int) sqrt (n + .0); for (int i=2; i<=nsqrt; ++i) if (!nprime[i]) {
primes[cnt++] = i; for (int j=i+i; j<=nsqrt; j+=i) nprime[j] = true;
} int result = 0; for (int k=0, maxk=n/S; k<=maxk; ++k) { memset (bl, 0, sizeof bl); int start = k * S; for (int i=0; itrue; if (k == 0) bl[0] = bl[1] = true; for (int i=0; i++result;
} cout << result;
}
Тест на основі малої теореми Ферма.
Мала теорема Ферма стверджує, що якщо n просте число, то виконується умова: при всіх a ∈ {2,3, …, n – 1} має місце рівняння
An - 1
≡ 1 mod n.
На підставі цієї теореми можна побудувати імовірнісний алгоритм перевірки на простоту числа n.
Якщо для деякого цілого a з інтервалу [2, n] співвідношення a
n - 1
≡ 1modn
не виконується, то число n – складене. Якщо ж теорема виконується, то висновок, що число n просте, зробити не можна, так як для деякого a має місце співвідношення a
n- 1

1 modn, то кажуть, що число n є псевдопростим по основі
a
. Існує нескінченно багато пар чисел a і n, де n – складене й псевдопросте.
Взагалі для будь-якого a > 1 існують нескінченно багато псевдопростих чисел по основі a. Взагалі,справедливі наступні два твердження. Якщо пари (2, n) задовольняють порівнянню a
n-1
≡ 1mod n
, то й пари чисел (2, 2
n
-
1) також йому задовольняють.

Схема алгоритму на базі малої теореми Ферма.
Дане число n і параметр g = 1 для ідентифікації результату перевірки.
1) робиться випадковий вибір цілого числа a і інтервалу [2, n];
2) використовуючи алгоритм Евкліда, обчислюється НСД для чисел a і n;
3) якщо НСД більше 1, то виконується крок 7;
4) для числа a перевіряється рівняння a
n
- 1
≡ 1 mod n;
5) якщо рівняння не виконується, то визначається параметр g = 0 (число складене) перехід на крок 7.
6) якщо рівняння виконується, то можна повторити тест;
7) видати результат перевірки (g = 0 – число складене). Для будь-якого простого числа n і будь-якого a > 2 такого, що (a
2
- 1, n
) = 1, число (a
2n
- 1)/(a
2
-
1)
є псевдопростим по основі a.
Визначення. Складені числа n, для яких при всіх основах виконується рівняння a
n
- 1
≡ 1 mod n
, називаються числами Кармайкла.
Схема алгоритму на базі малої теореми Ферма.
Дано число n і параметр g = 1 для ідентифікації результату перевірки.
1) робиться випадковий вибір цілого числа a з інтервалу [2, n];
2) використовуючи алгоритм Евкліда, обчислюється НСД для чисел a і n;
3) якщо НСД більше 1, то виконується крок 7;
4) для числа a перевіряється рівняння a
n
- 1
≡ 1 mod n;
5) якщо рівняння не виконується, то визначається параметр g = 0 (число складене) перехід на крок 7.
6) якщо рівняння виконується, то можна повторити тест;
7) видати результат перевірки (g = 0 – число складене).
При завершенні роботи алгоритму можливі наступні висновки: число n – складене (g = 0); якщо g = 1, то число n є або простим, або складовим і числом
Кармайкла.
Тут доречно помітити, що числа Кармайкла досить рідкі. Так існують усього 2 163 чисел Кармайкла, які не перевершують 25 000 000 000, і всього 16 чисел, які не перевершують числа 100 000.
Тест Соловея – Штрассена.
Тест Соловея - Штрассена перевірки на простоту числа p базується на теоремі 4.
Теорема 4. Для будь-якого непарного n наступні умови еквівалентні:

· n – просте;
· для любого a Zn виконується рівняння a
(n - 1)/2
mod n
L(a, n), де Z*n– мультипликативна група,елементами якої є a Zn (Zn –кільце віднімань по модулю n).
Для перевірки простоти числа p використовується алгоритм обчислення символу Якобі.
Схема алгоритму на базі малої теореми Ферма.
Нехай дано непарне число p. Треба перевірити чи є число p простим.
1. Вибирається випадкове число a, менше p.
2. Якщо НСД (a, p) ≠ 1, то p – складене число.
3. Обчислюється порівняння L(a, p) ≠ a
(p - 1)/2
mod p.
4. Обчислюється символ Якобі J(a, p).
5. Якщо L(a, p) ≠ J(a, p), то число p – складене.
6. Якщо L(a, p) = J(a, p), то ймовірність того, що число p – складене не перевищує 50 %.
Якщо перевірка повторюється k раз, то ймовірність того, що число p – складене, не перевищує 1/2k.
Тест Рабіна Міллера.
Обґрунтування алгоритму Рабіна - Міллера можна знайти в літературі.
Тут дамо тільки самі загальні розуміння. Відомо, що якщо число p – просте, то рівняння x
2
≡ 1 mod p
має лише два розв'язки: x ≡ ±1 mod p. Отже, нехай p – непарне ціле число, яке треба перевірити на простоту. Якщо p – просте, то по теоремі Ферма для будь-якого цілого a взаємно простого з p виконується рівняння a
m - 1
≡ 1 mod p
. Тому що p - 1 – парне, то одержуємо a
(m - 1)/2
≡ ±1 mod
p
. Якщо виявляється, що (m - 1)/2 – парне, то можна повторити міркування, при якому одержимо, що a(m - 1)/4 ≡ ±1 mod p, і т.д.
Тому, щоб перевірити на простоту непарне число p, вибираємо випадковим чином число a з інтервалу [1, p - 1] і обчислюємо
a
t
mod p, a
2t
mod p, …, abt mod p, де t – непарне й число b = 2
s
. Якщо одне із цих чисел не збігається з +1 або -1, то можна зробити висновок, що число p є числом складовим. Якщо значення чисел збігаються з +1 або -1, то повторюємо цей тест k раз. Після повторення цього тесту k раз імовірність того, що складене число p не буде виявлено, не перевершує 1/4
k
. Після висловлених міркувань перейдемо до формулювання алгоритму Рабіна - Міллера.
У деякій літературі даний алгоритм називають тестом Міллера - Рабіна.

Схема алгоритму Рабіна - Міллера
Нехай дано непарне число p. Треба перевірити чи є число p простим. Далі припустимо, що p - 1 = 2
St
1. Вибираємо випадкове число a, менше p і визначаємо k = 0.
2. Обчислюємо за допомогою алгоритму Евкліда НСД двох чисел a і p.
Якщо НСД (a, p) ≠ 1, то p – складене число.
3. Обчислюємо b a
t
mod p
. Якщо b = 1 або b = p - 1, то число p імовірно просте.
4. Якщо b ≠ 1 і b p - 1, то обчислюємо b b
2
mod p
і k= k + 1.
5. Якщо число b = p - 1, то число p імовірно просте. Перейти на крок 7.
6. Поки k < s виконувати пункт 4.
7. Завершити роботу алгоритму.
Розглянемо приклади.
Приклад. Нехай p = 181. Маємо p - 1 = 45 ・ 2 2
. По представленому розкладанню визначаємо значення параметра t = 45.
1. Вибираємо випадкове число a = 52 < p, і визначаємо k = 0.
2.
Використовуємо алгоритм Евкліда для обчислення НСД двох чисел 52 і
181: ділимо число 181 на число 52, одержуємо 181 = 52 ・3 + 25; ділимо число 52 на число 25, одержуємо 52 = 25 ・ 2+ 2; ділимо число 25 на число 2, одержуємо 25 = 12 ・ 2 +1; ділимо число 2 на число 1, одержуємо 2 = 1 ・ 2 + 0; одержуємо, що НСД двох чисел 181 і 52 рівний 1.
Тому що НСД не дозволяє встановити чи є число 181 складовим, то продовжуємо виконувати алгоритм Рабіна - Міллера.
3. Послідовно обчислюємо (рис.2.1).
Отже, одержали b = 180 = p - 1. Звідки маємо, що число p = 181 імовірно просте.
Зауваження. Для генерації навіть невеликих простих чисел обчислення досить громіздкі. Тому для реальних чисел, безсумнівно, подібні перевірки чисел на простоту треба робити за допомогою програм на комп'ютері.

Рисунок 2.1 – Обчислення
У літературі дається деяке керівництво при генерації простих чисел для практичних додатків. Це керівництво зводиться до реалізації декількох етапів
(кроків).
1. Згенеруйте випадкове n-бітове число p.
2.
Установіть старший і молодший біти рівними 1. Старший біт у цьому випадку гарантує необхідну довжину простого числа, а молодший – його непарність.
3.
Переконайтеся, що число p не ділиться на малі прості числа 3, 5, 7, 11 і т.д. Найбільш надійна перевірка подільності на всі прості числа, менше 2000.
4.
Виконайте тест Рабіна - Міллера для деякого випадкового числа a.
Якщо p проходить тест, то згенеруйте інше випадкове число a і повторіть тест.
Для практичних додатків досить повторити тест Рабіна – Міллера п'ять разів.
5. Якщо p не проходить один з тестів, треба згенерувати інше число p і повторити дане керівництво знову.
Інше число p, якщо воно виявилося не простим, можна одержати не генеруючи нове, а послідовно перебираючи всі цілі, починаючи від p + 1, p + 2,
і т.д., поки не найдеться просте число.
Перейдемо тепер до питання про генерування великих простих чисел.

Побудова великих простих чисел і детерміновані алгоритми
перевірки чисел на простоту.
Розглянемо ще один спосіб формування простих чисел. Цей спосіб базується на певній процедурі генерування простих чисел, перевірка яких здійснюється за допомогою тестів на простоту.
Такий підхід застосовується, наприклад, у стандарті електронного цифрового підпису (ЕЦП) і базується на наступній теоремі.
Теорема 5. Нехай p = qN + 1, де q – непарне просте число, N – парне число та p < (2q + 1)
2
. Число p є простим, якщо виконуються дві умови:
1) 2
qN
= 1 mod p;
2) 2
N
≠ 1 mod p.
Генерація простого числа з використанням теореми 5 здійснюється по трохи спрощеній в стандарті схемі. Нехай потрібно сформувати просте число p
довжини t ≥ 17 біт. Із цією метою будується убутна послідовність чисел{ti}, де
i = 0, 1, …, s
, для яких t
0
= t, t
i
= [t
i - 1
/2].
Далі послідовно виробляється послідовність простих чисел ps, ps
- 1
, … p
0
, для всіх i = 1, …, s.
Генерація простого числа p
i-1
здійснюється з використанням наступної формули p
i
- 1
= p
i
N
+ 1, де число N задовольняє наступним умовам:· N – парне;
N – таке, що довжина числа p
i - 1
= p
i
N
+ 1 точності поинна дорівнювати t
i - 1
У стандарті дається деякий алгоритм обчислення числа N. Для навчального варіанта N –випадкове парне число, яке одержують за допомогою датчика випадкових чисел (якщо N – непарне, то N = N +1).
Число p
i - 1 уважається отриманим, якщо одночасно виконані наступні дві умови:
1) 2
b
= 1 mod p
i
, b = p
i – 1
N;
2) 2
N
≠ 1 mod p
i
Якщо хоча б одна з умов не виконується, то значення числа N
збільшується на 2, і обчислюється нове значення p
i - 1
, яке знову перевіряється на простоту по двом умовам. Даний процес триває доти, поки не буде отримано просте число p
i - 1
( тобто умови 1 і 2 алгоритму генерації простого числа будуть виконані).
Перевірка чисел Мерсенна на простоту.
Нагадаємо, що число M
s
= 2
s
– 1 (s
≥ 2 – просте число) називається числом
Мерсенна. Критерієм простоти чисел Мерсенна служить наступне твердження.

Теорема. Число Мерсенна M
s
= 2
s

1, де s ≥ 3 – непарне число, є простим тоді й тільки тоді, коли
– число s – просте;
– виконується порівняння L
n - 2
≡ 0 mod M
s
, де послідовність {Lk} формується за таким правилом:
L
0
= 4, L
k+1
= (L
2
k
– 2) mod M
s
при k ≥ 0.
2.3
Контрольні запитання та завдання:
1.
Назвіть основні способи генерації простих чисел.
2.
Як проводиться перевірка чисел на простоту в певному числовому діапазоні.
3.
Поясніть як працює тест Міллера-Рабіна.
4.
Поясніть як працює тест Соловея-Штрассена.
5. .
Що таке числа Мерсенна та Кармайкла.
Індивідуальні завдання.
1.
Вивчити алгоритм генерації простих чисел на основі решета
Ератосфена та реалізувати його програмно.
2.
Провести тестування чисел на простоту за допомогою тестів Міллера-
Рабіна та Соловея-Штрассена.

скачати

© Усі права захищені
написати до нас