用java实现6N+1质数筛选法(图解算法)

本文介绍了一种基于6N±1规律的质数筛选算法,详细解释了如何通过循环计算找到100以内满足条件的质数,并给出了具体的实现代码。但需注意,此算法还需排除特定合数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数学知识:

所有的数都能够用6N+X的形式来表示,由于6N+2,6N+3,6N+4均不可能是质数。所以质数只能是形如6N+1和6N-1的形式来表示。

以求100个数内的质数为例。根据公式6N-1和6N+1,满足6N+1<=100这个条件。

----5-7---
11-13---17-19-
--23-25---29-
31---35-37---
41-43---47-49-
--53-55---59-
61---65-67---
71-73---77-79-
--83-85---89-
91---95-97---

由表可知,1-100的质数都包含在列表中了。全都符合6N-1和6N+1的规律。
但是里面有一些数(25,49等)是5和7的倍数。
因此还需要再做进一步筛选,多加一些筛选条件。将5和7的倍数踢出去了。

问题1:

怎么才能计算6N-1和6N+1的中N的值。

答:由于6N+1<=n(比如求100以内的质数,n为100)。

用一个while循环来计算N的值。

public static int  GetN(int n){
		int N=1;
		while(6*N+1<=n){
			N++;
		}
		return N;
	}
问题2:怎么用循环表示6N-1和6N+1.
答:总结规律法。

当N=1时 有 5,7 等同 (23-1,24-1)
当N=2时,有11,13 等同 (26-1,27-1)
当N=3时,有17,19 等同 (29-1,210-1)

当N=16时,有95,97 等同 (248-1,249-1)

我们可以很清楚的看出来右边的等式为(2i-1,2j+1),满足i<=3N这个条件。
而且i的初始值为3,且i=i+3每次以此递增。
而且j与i的关系为 j=i+1;

代码的设计比较巧妙,大家可以借鉴一下:

  for(int i=3;i<=3*N;i=i+3){
			for(int j=0;j<2;j++){
				t=2*(i+j)-1;
			}
   }
总的代码如下:(前面的2和3一开始就初始化了,直接输出)
public class number {
	public static int  GetN(int n){
		int N=1;
		while(6*N+1<=n){
			N++;
		}
		return N;
	}
	public static void isPrime(int n){
		int N=GetN(n);
		int t=0;
		for(int i=3;i<=3*N;i=i+3){
			for(int j=0;j<2;j++){
				t=2*(i+j)-1;
				if(t<n&&t % 5 !=0&&t%7!=0){
					
					System.out.println("This is a prime number:"+t);
			 }
		 }
		}
	}
	public static void main(String[] args){  
	    System.out.println("This is a prime number:"+2);
		System.out.println("This is a prime number:"+3);
	    isPrime(100);
	}
  }

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值