Given a positive integer, your job is writing a program to determine whether it is a prime number or not.
Input
There are several tests. Each test consists of a positive integer n(no more than 2^31) on a single line. Input is terminated by end of file.
Output
For each integer in the input, print a "YES" if it is a prime number, otherwise print a "NO" instead.
Sample Input
4 5 6Sample Output
NO YES NO
【分析】
素性测试最基本的应用,主要精髓在于费马小定理和二次探测理论。
1 /* 2 五代李煜 3 《清平乐·别来春半》 4 别来春半,触目柔肠断。砌下落梅如雪乱,拂了一身还满。 5 雁来音信无凭,路遥归梦难成。离恨恰如春草,更行更远还生。 6 */ 7 #include <cstdio> 8 #include <cstring> 9 #include <algorithm> 10 #include <cmath> 11 #include <queue> 12 #include <vector> 13 #include <iostream> 14 #include <string> 15 #include <ctime> 16 #define LOCAL 17 const int MAXN = 100000 + 5; 18 using namespace std; 19 typedef long long ll; 20 ll n; 21 22 ll pow(ll a, ll b, ll p){ 23 if (b == 1) return a % p; 24 ll tmp = pow(a, b / 2, p); 25 if (b % 2 == 0) return (tmp * tmp) % p; 26 else return (((tmp * tmp) % p) * (a % p)) % p; 27 } 28 //二次探测 29 bool Sec_Check(ll a, ll p){ 30 ll tmp = pow(a, p, n); 31 if (tmp != 1 && tmp != (n - 1)) return 0;//不通过 32 if (tmp == (n - 1) || (p % 2 != 0)) return 1; 33 return Sec_Check(a, p / 2); 34 } 35 bool miller_rabin(ll n){ 36 ll cnt = 20; 37 while (cnt--){ 38 ll a = (rand()%(n - 1)) + 1; 39 if (!Sec_Check(a, n - 1)) return 0; 40 } 41 return 1; 42 } 43 44 int main(){ 45 srand(time(0)); 46 47 while (scanf("%lld", &n) != EOF){ 48 if (n == 1) printf("NO\n"); 49 else if (miller_rabin(n)) printf("YES\n"); 50 else printf("NO\n"); 51 } 52 return 0; 53 }