Скачиваний:
0
Добавлен:
18.09.2026
Размер:
790 Кб
Скачать

МИНИСТЕРСТВО ЦИФРОВОГО РАЗВИТИЯ,

СВЯЗИ И МАССОВЫХ КОММУНИКАЦИЙ РОССИЙСКОЙ ФЕДЕРАЦИИ

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ

«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М.А. БОНЧ-БРУЕВИЧА»

(СПбГУТ)

ФАКУЛЬТЕТ КИБЕРБЕЗОПАСНОСТИ (КБ)

КАФЕДРА ЗАЩИЩЕННЫХ СИСТЕМ СВЯЗИ (ЗСС)

______________________________________________________________________________

Отчет

по лабораторной работе №8

«Проверка заданного числа (простое или составное)»

Выполнили: студенты группы ИБС-32

Проверил:

доцент кафедры ЗСС к.т.н Кушнир Д.В.

Теоретическая часть

Тест Рабина-Миллера

Тест Миллера — Рабина — вероятностный полиномиальный тест простоты. Тест Миллера — Рабина позволяет эффективно определять, является ли данное число составным. Однако, с его помощью нельзя строго доказать простоту числа. Тем не менее тест Миллера — Рабина часто используется в криптографии для получения больших случайных простых чисел.

Алгоритм был разработан Гари Миллером в 1976 году и модифицирован Майклом Рабином в 1980 году.

Как и для теста Ферма, все числа m>1, которые не проходят этот тест – составные, а числа, которые проходят, могут быть простыми. Для этого теста нет аналогов чисел Кармайкла. В 1980 году было доказано, что вероятность ошибки теста Рабина-Миллера не превышает 1/4. Таким образом, применяя тест Рабина-Миллера r раз для разных оснований, мы получаем вероятность ошибки 2−2r.

Число m - 1 однозначно представляется в виде m - 1=2s∙t, где t нечётно. Целое число a, 1< a < m, называется свидетелем простоты числа m, если выполняются два условия:

  1. m не делится на a;

  2. a≡ 1 mod m или существует целое k, 0≤ k < s, такое, что:

Теорема Рабина утверждает, что составное нечётное число m имеет не более 

φ(m)/4 различных свидетелей простоты, где φ(m) – функция Эйлера.

Алгоритм теста Рабина-Миллера

Алгоритм параметризуется количеством раундов r. Рекомендуется брать r

порядка величины log2(m), где m — проверяемое число.

Для данного m находят такое целое число s и целое нечётное число t, что m − 1 = 2st. Выбирается случайное число a,1 < a < m. Если a не является свидетелем простоты числа m, то выдается ответ «m - составное», и алгоритм завершается. Иначе, выбирается новое случайное число a и процедура проверки повторяется. После нахождения r свидетелей простоты, выдается ответ «m, вероятно, простое», и алгоритм завершается.

Алгоритм может быть записан на псевдокоде следующим образом:

Ввод:

число проверяемое на простоту: m > 2 (нечётное натуральное);

параметр, определяющий вероятность ошибки теста r.

Вывод:

составное, означает, что m точно составное;

или вероятно простое, т.е. m с высокой вероятностью является простым.

Представить m − 1 в виде 2s·t, где t нечётно, можно сделать последовательным делением m - 1 на 2.

цикл А: повторить r раз:

Выбрать случайное a в диапазоне [2, m − 2]

xat mod m

если x = 1 или x = m − 1 то перейти на следующую итерацию цикла А

для r = 1 .. s − 1

xx2 mod m

если x = 1 то вернуть составное

если x = m − 1 то перейти на следующую итерацию цикла А

вернуть составное

вернуть вероятно простое

Из теоремы Рабина следует, что если r случайно выбранных чисел оказались свидетелями простоты числа m, то вероятность того, что m составное, не превосходит 4 - r.

Пример выполнения проверки:

Проверяем число m = 221.

Запишем m − 1 = 220 как (2^2)·55, таким образом s = 2 и t = 55.

Произвольно выберем число a такое, что 1 < a < m-1, допустим a = 174. Переходим к вычислениям:

Шаг 1. a^((2^0)·t) mod m = 174^55 mod 221 = 47 ≠ 1, или m − 1

Шаг 2. a^((2^1)·t) mod m = 174^110 mod 221 = 220 = m − 1.

Так как 220 ≡ −1 mod m, число 221 или простое (174 —свидетель простоты числа 221) или составное, (тогда 174 ложный свидетель простоты).

Возьмём другое произвольное «a», на этот раз выбрав a = 137:

Шаг 1. a^((2^0)·t) mod n = 137^55 mod 221 = 188 ≠ 1, m − 1

Шаг 2. a^((2^1)·t) mod n = 137^110 mod 221 = 205 ≠ m − 1.

Т.е. 221 – составное.

Так как 137 свидетель того, что 221 составное, число 174 на самом деле было ложным свидетелем простоты.

Задание

Выбрать два простых и два составных нечетных числа (не кратных 3 и 5) и еще одно составное число Кармайкла. Выбирать числа для выполнения задания по следующей формуле: 1. Вычисляем: X=((№ студента в группе)+110)*23. Далее произвольно в диапазоне X±20 выбрать нужные числа (если в группе один студент, то проверяем 4-ые числа, если два, то 8, если три то 12). Число Кармайкла выбирать по следующему алгоритму: студент в группе с номером 1. Берёт число 1105 студент в группе с номером 2. Берёт число 1729 студент в группе с номером 3. Берёт число 2465 студент в группе с номером 4. Берёт число 2821 студент в группе с номером 5. Берёт число 6601 студент в группе с номером 6. Берёт число 8911 для студентов с большими номерами выбирать число Кармайкла циклически, 7-й берёт опять число 1105 и т.п. Сколько человек в бригаде, столько разных чисел Кармайкла должно быть проверено.

Практическая часть

Вариант 16

Х = (16+110)*23 = 2898

Промежуток [2 878 ; 2 918]

2879 и 2897 – простые

2893 и 2899 – составные

2821 - Число Кармайкла

Вариант 3

Х = (3+110)*23 = 2 599

Промежуток [2 579 ; 2 619]

2591 и 2593 – простые

2587 и 2603 – составные

2465 - Число Кармайкла

Для следующих подсчетов, напишем программу на языке Python

import random import math def miller(m): r = int(math.log2(m)) print(f"Используем {r} свидетелей простоты, так как целесообразно использовать log2({m})") s = 0 pr = 0 t = m - 1 while (t % 2 == 0): s += 1 t = t // 2 print('Представляем в виде 2^',s," * ", t) for i in range(r): a = random.randint(2, m - 2) print('Текущий свидетель: ', a) x = (a ** t) % m if (x == 1) or (x == m - 1): print('x = ', x, 'Переход к следующему свидетелю') continue for j in range(s - 1): print('Текущая степень:', s - j) x = (x ** 2) % m print('x = ', x) pr = 0 if (x == 1): return False elif (x == m-1): pr = 1 break if (pr == 1): continue return False return True z = int(input('Введите число: ')) result = miller(z) if not result: print("Число составное!") else: print("Число вероятно простое!")

Проверив данные числа, мы подтвердили выводы из тестов в лабораторной работе номер 7

Соседние файлы в предмете Математические основы защиты информации