三种素数求法
Posted 望山海
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了三种素数求法相关的知识,希望对你有一定的参考价值。
本实验采用了三种方法求素数,分别为:常规法、同余法以及筛选法,代码如下。
常规法:
1 void func1(int max) {//方法1:从2到根号n 2 bool m = true; 3 for (int i = 2; i <= max; i++) { 4 for (int j = 2; j <= sqrt(i); j++) { 5 if (i%j == 0) { 6 m = false; 7 break; 8 } 9 else { 10 continue; 11 } 12 } 13 if (m) { 14 std::cout << i; 15 } 16 m = true; 17 } 18 } 19
同余法:
1 void func2(int max) {//方法2:同余 2 int PN[6] = { 2, 3, 5, 7, 11, 13 };//用以做素数判定 3 4 for (int i = 2; i <= max; i++) { 5 bool m = true; 6 for (int j = 0; j < 6; j++) { 7 if (i == PN[j]) { 8 continue; 9 } 10 else if ((montgomary(i, PN[j] - 1) % PN[j]) == 1) {//蒙哥马利方法求高次幂 11 continue; 12 } 13 else { 14 m = false; 15 break; 16 } 17 } 18 if (m) 19 std::cout << i; 20 } 21 } 22
筛选法:
1 void func3(int max) {//筛选法,采用数组完成 2 std :: vector<bool> PN( max, true); 3 if (max > 1) { 4 PN[0] = false; 5 } 6 else { 7 return; 8 } 9 for (int i = 2; i < max; i++) { 10 for (int j = 2; j <= sqrt(i); j++) { 11 if (i%j == 0) { 12 for (int k = i -1; k <= max; k += i) { 13 PN[k] = false; 14 }break; 15 } 16 } 17 } 18 for (int i = 0; i < max; i++) { 19 if (PN[i]) 20 std::cout << i + 1; 21 } 22 23 }
整体代码如下:
1 #include<iostream> 2 #include<string> 3 #include<math.h> 4 #include<vector> 5 6 7 void func1(int max) {//方法1:从2到根号n 8 bool m = true; 9 for (int i = 2; i <= max; i++) { 10 for (int j = 2; j <= sqrt(i); j++) { 11 if (i%j == 0) { 12 m = false; 13 break; 14 } 15 else { 16 continue; 17 } 18 } 19 if (m) { 20 std::cout << i; 21 } 22 m = true; 23 } 24 } 25 26 int montgomary(int N, int P) {//蒙哥马利算法,用以缩减乘法运算 27 int odd = 1; 28 while (P > 1) { 29 if (P & 1) {//判断奇偶 30 odd = N; 31 P -= 1; 32 } 33 N *= N; 34 P /= 2; 35 } 36 return N * odd; 37 } 38 39 void func2(int max) {//方法2:同余 40 int PN[6] = { 2, 3, 5, 7, 11, 13 };//用以做素数判定 41 42 for (int i = 2; i <= max; i++) { 43 bool m = true; 44 for (int j = 0; j < 6; j++) { 45 if (i == PN[j]) { 46 continue; 47 } 48 else if ((montgomary(i, PN[j] - 1) % PN[j]) == 1) {//蒙哥马利方法求高次幂 49 continue; 50 } 51 else { 52 m = false; 53 break; 54 } 55 } 56 if (m) 57 std::cout << i; 58 } 59 } 60 61 void func3(int max) {//筛选法,采用数组完成 62 std :: vector<bool> PN( max, true); 63 if (max > 1) { 64 PN[0] = false; 65 } 66 else { 67 return; 68 } 69 for (int i = 2; i < max; i++) { 70 for (int j = 2; j <= sqrt(i); j++) { 71 if (i%j == 0) { 72 for (int k = i -1; k <= max; k += i) { 73 PN[k] = false; 74 }break; 75 } 76 } 77 } 78 for (int i = 0; i < max; i++) { 79 if (PN[i]) 80 std::cout << i + 1; 81 } 82 83 } 84 int main() { 85 int max; 86 std::cin >> max;//获得上限 87 //方法1 88 func1(max); 89 //方法2 90 func2(max); 91 //方法3 92 func3(max); 93 94 95 }
结论:
在较小的数量级上进行运算时,方法2、3要比1好上很多,例如当输入为5时,方法1用时2.367ms,后两者均为小于1ms。
在更大一些的数量级上进行运算时,方法3体现出其算法的优越性,例如当输入为100时,方法1用时3ms,方法2用时2ms,方法3用时1ms。
综上,方法3优于方法2优于方法1。
以上是关于三种素数求法的主要内容,如果未能解决你的问题,请参考以下文章