高效判断素数

孪生素数: 所谓孪生素数指的是间隔为 2 的相邻素数,它们之间的距离已经近得不能再近了。

  1. 若n≥6且n-1和n+1为孪生素数,那么n一定是6的倍数;
  2. 若x≧1且n=6x-1=2(3x)-1或n=6x+1=2(3x)+1是合数,n一定不是2和3的倍数(质因子中不包含2、3);
  3. 当n≧5时,如果n为素数,那么n mod 6 = 1 或 n mod 6 = 5,即n一定出现在6x(x≥1)两侧;
<证明过程见最后>
当x≥1时,6x,6x+1,6x+2,6x+3,6x+4,6x+5,6(x+1),6(x+1)+1┈┈
不在6x两侧的数为6x+2,6x+3,6x+4,即2(3x+1),3(2x+1),2(3x+2),它们一定不是素数,所以素数一定出现在6x的两侧。
 
 
思路:首先5以下的直接处理;排除不在6x两侧的;
对于6x两侧的数怎么判断呢?
根据“每个合数都可以写成几个质数相乘的形式”,因此试探合数因子的时候直接用质数试探是最好的,也就是说不需要去一一用2除、用3除、用4除......,而是直接用质数整除,而质数必然是2、3以及 6x两侧的数,因此我们只需要用6x两侧的数整除就行(6x两侧是数是一个大于素数集合的,因此肯定没问题)。而上面证明了即便6x两侧的数是合数,其质因子也一定不包含2、3,因此直接if (num % i == 0 || num % (i + 2) == 0)判断即可
高效判断一个大于1的数是否为素数:
 
 

 
 1 #include<stdio.h>
 2 #include<math.h>
 3 int is_prime(int num)
 4 {
 5     int limit = 0, i = 0;
 6     if (num < 2)
 7     {
 8         return 0;
 9     }
10  
11     if (num == 2 || num == 3)
12     {
13         return 1;
14     }
15  
16     if (num % 6 != 1 && num % 6 != 5)  //把 num=4的情况处理了  这样1-5、以及不是6x两侧的全部处理
17     {
18         return 0;
19     }
20  
21     limit = (int)sqrt(num);
22     for (i = 5; i <= limit; i += 6)
23     {
24         if (num % i == 0 || num % (i + 2) == 0)
25         {
26             return 0;
27         }
28     }
29     return 1;
30 }
31  
32  
33  
34      boolean isPrime(int num) {
35             if (num < 2)
36                   return false;
37             if (num == 2 || num == 3) {
38                   return true;
39             }
40             if (num % 6 != 1 && num % 6 != 5) {// 把 num=4的情况处理了 这样1-5、以及不是6x两侧的全部处理
41                   return false;
42             }
43             int limit = (int) Math.sqrt(num) + 1;
44             for (int i = 5; i < limit; i += 6) {
45                   if (num % i == 0 || num % (i + 2) == 0) {
46                         return false;
47                   }
48             }
49             return true;
50       }
51  

 

 

 
 
证明过程:
孪生素数: 所谓孪生素数指的是间隔为 2 的相邻素数,它们之间的距离已经近得不能再近了。

 

若n≥6且n-1和n+1为孪生素数,那么n一定是6的倍数。
证明:
∵ n-1和n+1是素数 ┈┈┈┈┈ ①
∴ n-1和n+1是奇数
∴ n是偶数,即n是2的倍数 ┈┈┈┈┈ ②
假设n不是3的倍数,得:
n=3x+1 或 n=3x+2,
如果n=3x+1,则n-1=3x,与①违背,故n≠3x+1;
如果n=3x+2,则n+1=3(x+1),与①违背,故n≠3x+2;
∴假设不成立,即n是3的倍数,又有②得结论:
n是6的倍数。
 
由上面的规律可以推出下面结论:
若x≧1且n=6x-1或n=6x+1不是素数,那么n一定不是2和3的倍数。
证明:
∵n=6x-1或n=6x+1,即n=2(3x)-1或n=2(3x)+1或n=3(2x)-1或n=3(2x)+1。
∴n一定不是2和3的倍数。
 
素数出现规律:
当n≧5时,如果n为素数,那么n mod 6 = 1 或 n mod 6 = 5,即n一定出现在6x(x≥1)两侧。
证明:
当x≥1时,有如下表示方法:
┈┈ 6x,6x+1,6x+2,6x+3,6x+4,6x+5,6(x+1),6(x+1)+1┈┈
不在6x两侧的数为6x+2,6x+3,6x+4,即2(3x+1),3(2x+1),2(3x+2),它们一定不是素数,所以素数一定出现在6x的两侧。
posted @ 2017-05-07 15:22  Cloud2020  阅读(582)  评论(0)    收藏  举报