三种素数求法

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 }

 

结论:

 在较小的数量级上进行运算时,方法23要比1好上很多,例如当输入为5时,方法1用时2.367ms,后两者均为小于1ms

 在更大一些的数量级上进行运算时,方法3体现出其算法的优越性,例如当输入为100时,方法1用时3ms,方法2用时2ms,方法3用时1ms

  综上,方法3优于方法2优于方法1

 

以上是关于三种素数求法的主要内容,如果未能解决你的问题,请参考以下文章

5. 完全数的求法

集合并卷积的三种求法

逆序对的三种求法(归并排序,树状数组,线段树)

树的直径求法与性质(附例题)

n!mod p的求法

n!mod p 的求法 数学