Лабораторная работа №8
.pdfЧасть 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
