/********************************************* 改编自国际大学生程序设计竞赛题解(一) 源码为pascal 增加creatPrime函数 ********************************************/ #include <iostream> #include <ctime> using namespace std; const int N = 100; int prime[N]; //最原始的素数判定方法 bool isPrime1(int x) { if (x == 1) return false; bool result = true; for (int i = 2; i < x; i++) { if (x % i == 0) { result = false; break; } } return result; } //改进的素数判定方法,从2到sqrt(x),每次检测的因数加1 bool isPrime2(int x) { if (x == 1) return false; bool result = true; for (int i = 2; i * i <= x; i++) { if ( x % i == 0) { result = false; break; } } return result; } //2的倍数都直接除掉,从3到sqrt(x)检测,每次检测的因数加2 bool isPrime3(int x) { if ( ((x - 2) % 2 == 0) || (x == 1)) return false; bool result = true; for (int i = 3; i * i <= x; i = i + 2) { if ( x % i == 0) { result = false; break; } } return result; } /* 先构造一个事先做好的素数表 如primer[50] = {2,3,5,7} */ //构造素数表的函数 void creatPrime(int A[], int N) { int maybeprime = 5; int gap = 4; int iCount = 2; A[0] = 2; A[1] = 3; while (iCount < N) { bool isprime = true; gap = 6 - gap; for (int i = 0; A[i] * A[i] <= maybeprime;i++) { if (maybeprime % A[i] == 0) { isprime = false; break; } } if (isprime) A[iCount++] = maybeprime; maybeprime += gap; } } bool isPrime4(int x) { if (x == 1) return false; creatPrime(prime, N); bool result = false; for (int i = 0; prime[i] * prime[i] <= x; i++) { if ( x % prime[i] == 0) { result = true; break; } } return result; } // 求a的b除以n的约数 //采用二进制提高效率类似于求a的b次方,减少循环次数 int modExp(int a, int b, int n) { int iresult = 1; int itemp = a % n; while (b > 0) { if (b % 2 == 1) { iresult = (iresult * itemp) % n; } itemp = (itemp * itemp) % n; b /= 2; } return iresult; } //Miller-Rabin概率测试法 /********************************************* 令大奇数n = (2^l) * m + 1, m是正奇数, 若b ^ m = 1(mod n) 或 b^(2^j * m) = -1 (mod n) , 0 <= j <= l-1,则通过测试,视为质数 **********************************************/ bool MillerRabinTest(int n) { int m = n - 1; int l = 0; while ( m % 2 == 0) { l++; m /= 2; } srand(time(NULL)); int b = rand() % (n-1) + 1; if (modExp(b,m,n) == 1) return true; int k = m; for (int i = 0; i < l; i++) { if (modExp(b,k, n) == n-1) return true; k = k * k; } return false; } int main() { cout << isPrime1(12) << endl; cout << isPrime2(15) << endl; cout << isPrime3(71) << endl; cout << isPrime4(5987) << endl; creatPrime(prime, N); for (int i = 0; i < N; i++) cout << prime[i] << ' '; cout << endl; cout << MillerRabinTest(132397) << endl; return 0; }