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

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

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

Часть 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