Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабораторная работа №8

.pdf
Скачиваний:
2
Добавлен:
10.08.2024
Размер:
746.82 Кб
Скачать

Часть 2. Тест Ферма.

Тест основан на малой теореме Ферма.

Теорема. Если n-простое и НОД(a, n) = 1, то −1 = 1

Вывод – если n составное, то соотношения из малой теоремы Ферма не всегда будут выполняться. Можно показать, что в среднем для составных чисел соотношения из малой теоремы Ферма выполняются с вероятностью

½.

Алгоритм тестирования числа n.

Выбираем количество тестов – k (это определить вероятность ошибочно принять составное число за простое). Выбираем k случайных чисел a: a1, a2, …, ak < n (обычно выбирают малые простые числа).

1.

Для каждого ai вычисляем НОД(ai ,n), если «n» простое, то всегда

 

должна быть 1. Если любое из НОД(ai ,n)1, то тест заканчивается с

 

выводом, что «n» составное.

 

 

 

2.

Если проверки пройдены,

то для каждого

 

проверяем: −1 =

 

 

 

 

 

 

1 . Если любое из

−1 ≠ 1 ,

то тест заканчивается с

 

 

 

 

выводом, что «n» составное.

3.Если все проверки пройдены, то принимаем решение, что n – простое, с итоговой вероятностью, что мы приняли составное число

за простое равное: (½)k.

Некоторые составные числа всегда удовлетворяют условиям теоремы Ферма, так называемые числа Кармайкла. Выполняя тест Ферма узнать, что число Кармайкла составное можно на проверке НОД (ai, n) 1, если «удачно» выбран ai.

Задание

1.Проверить каждое из чисел тестом Ферма (числа берутся из задания 1). Если задание выполняется в EXCEL, то выбирать k таком образом, чтоб вероятность принять составное за простое была не более 0,125. При полностью программной реализации алгоритма выбирать k таким образом, чтоб вероятность принять составное за простое была не более

10-3.

11

Вариант 7.

Простые числа: 2707 и 2689 Составные числа: 2701 и 2717 Число Кармайкла: 1105

Результат теста Ферма для числа 2707:

Результат теста Ферма для числа 2689:

Результат теста Ферма для числа 2701:

Результат теста Ферма для числа 2717:

Результат теста Ферма для числа Кармайкла 1105:

12

Вариант 17.

Простые числа: 2939 и 2917 Составные числа: 2921 и 2911 Число Кармайкла: 6601

Результат теста Ферма для числа 2939:

Результат теста Ферма для числа 2917:

Результат теста Ферма для числа 2921:

Результат теста Ферма для числа 2911:

Результат теста Ферма для числа Кармайкла 6601:

13

Вариант 24.

Простые числа: 3083 и 3067 Составные числа: 3091 и 3077 Число Кармайкла: 8911

Результат теста Ферма для числа 3083:

Результат теста Ферма для числа 3067:

Результат теста Ферма для числа 3091:

Результат теста Ферма для числа 3077:

Результат теста Ферма для числа Кармайкла 8911:

14

Для выполнения данного задания была написана программа на языке программирования C++.

Листинг:

#include <iostream>

using namespace std;

class Euclid { int A, B;

public:

Euclid(int _a, int _b) { A = _a;

B = _b;

int q = A / B; int R = A % B; while (R > 0) {

A = B;

B = R;

q = A / B; R = A % B;

}

if (B != 1) {

cout << "Число составное" << endl; exit(0);

}

}

~Euclid() {}

};

int main(){ setlocale(LC_ALL, "Rus"); int k = 10, Ferma = 1, n; float ver = pow(0.5, k); cout << "Введите число: "; cin >> n;

int array_simple[10]{ 2,3,5,7,11,13,17,19,23,29 };

for (int j = 0; j < 10; j++) {

Euclid simple(n, array_simple[j]);

}

cout << "Первый этап пройден" << endl;

for (int j = 0; j < 10; j++) { for (int i = 1; i < n; i++) {

Ferma = Ferma * array_simple[j]; if (Ferma > n) {

Ferma = Ferma % n;

}

15

}

if (Ferma != 1) {

cout << "Число составное" << endl; exit(0);

}

}

cout << "Второй этап пройден" << endl;

cout << "Число " << n << " - простое, с итоговой вероятностью, ";

cout << "что мы приняли составное число за простое: " << ver << endl;

}

16