#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <math.h>
int power(int a, int b, int c) {
int result = 1;
a = a % c;
while (b > 0) {
if (b%2==1)
result = (result * a) % c;
b/=2;
a = (a * a) % c;
}
return result;
}
bool is_prime(int n, int k) {
if (n <= 1 || n == 4)
return false;
else if (n <= 3)
return true;
int s = 0, d = n - 1;
while (d % 2 == 0) {
s++;
d /= 2;
}
for (int i = 0; i < k; i++) {
int a
= rand() % (n
- 3) + 2; int x = power(a, d, n);
if (x == 1 || x == n - 1)
continue;
for (int j = 1; j < s; j++) {
x = power(x, 2, n);
if (x == 1)
return false;
else if (x == n - 1)
break;
}
if (x != n - 1)
return false;
}
return true;
}
int main() {
int n, k;
printf("Nhap mot so nguyen duong: "); printf("Nhap so lan kiem tra (k): ");
if (is_prime(n, k))
printf("%d la so nguyen to.\n", n
); else
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRib29sLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPG1hdGguaD4KCmludCBwb3dlcihpbnQgYSwgaW50IGIsIGludCBjKSB7CiAgICBpbnQgcmVzdWx0ID0gMTsKICAgIGEgPSBhICUgYzsKCiAgICB3aGlsZSAoYiA+IDApIHsKICAgICAgICBpZiAoYiUyPT0xKQogICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICogYSkgJSBjOwogICAgICAgIGIvPTI7CiAgICAgICAgYSA9IChhICogYSkgJSBjOwogICAgfQoKICAgIHJldHVybiByZXN1bHQ7Cn0KCmJvb2wgaXNfcHJpbWUoaW50IG4sIGludCBrKSB7CiAgICBpZiAobiA8PSAxIHx8IG4gPT0gNCkKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICBlbHNlIGlmIChuIDw9IDMpCiAgICAgICAgcmV0dXJuIHRydWU7CgogICAgaW50IHMgPSAwLCBkID0gbiAtIDE7CiAgICB3aGlsZSAoZCAlIDIgPT0gMCkgewogICAgICAgIHMrKzsKICAgICAgICBkIC89IDI7CiAgICB9CgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrOyBpKyspIHsKICAgICAgICBpbnQgYSA9IHJhbmQoKSAlIChuIC0gMykgKyAyOwogICAgICAgIGludCB4ID0gcG93ZXIoYSwgZCwgbik7CgogICAgICAgIGlmICh4ID09IDEgfHwgeCA9PSBuIC0gMSkKICAgICAgICAgICAgY29udGludWU7CgogICAgICAgIGZvciAoaW50IGogPSAxOyBqIDwgczsgaisrKSB7CiAgICAgICAgICAgIHggPSBwb3dlcih4LCAyLCBuKTsKICAgICAgICAgICAgaWYgKHggPT0gMSkKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgZWxzZSBpZiAoeCA9PSBuIC0gMSkKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgaWYgKHggIT0gbiAtIDEpCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICByZXR1cm4gdHJ1ZTsKfQoKaW50IG1haW4oKSB7CiAgICBpbnQgbiwgazsKICAgIHByaW50ZigiTmhhcCBtb3Qgc28gbmd1eWVuIGR1b25nOiAiKTsKICAgIHNjYW5mKCIlZCIsICZuKTsKICAgIHByaW50ZigiTmhhcCBzbyBsYW4ga2llbSB0cmEgKGspOiAiKTsKICAgIHNjYW5mKCIlZCIsICZrKTsKCiAgICBpZiAoaXNfcHJpbWUobiwgaykpCiAgICAgICAgcHJpbnRmKCIlZCBsYSBzbyBuZ3V5ZW4gdG8uXG4iLCBuKTsKICAgIGVsc2UKICAgICAgICBwcmludGYoIiVkIGxhIGhvcCBzby5cbiIsIG4pOwoKICAgIHJldHVybiAwOwp9