java 孪生素数问题

本文介绍了孪生素数的概念,以及如何解决在大数情况下计算孪生素数数量的问题。利用埃氏筛选法和数学定理(所有大于3的素数可表示为6x±1的形式),提出了一种降低空间复杂度的方法,通过判断数能否被6x±1表示,并结合埃氏筛选法,以更快的速度确定素数,尤其适用于处理大数场景。文章末尾给出了Java实现代码。

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

首先说一下孪生素数的概念:孪生素数是指那些值相差2的素数对,比如:(3,5)、(5,7)……,注意:(2,3)很明显不是孪生素数,也就是说(3,5)是最小的孪生素数。
现在有一个题目,给出一个数n,要求计算出不大于n的孪生素数的数目,这个n可能会很大很大很大,大到像100000000那么大。
网上有个埃氏筛选法,用来得到n以内的所有素数,思想是这样的,先把2~n放入一个数组a中,遍历数组,从数组中删去a[i]的倍数(不包括a[i])(0<=i<n-1),完了之后数组中的剩余元素就是不大于n的所有素数了。
存在的问题:这个题的n比较大,如果开辟数组的话,空间复杂度较高。
我之前接触到的判断n是否为素数的方法:遍历2~sqrt(n)【判断步长为1】,如果其中某个数可以被n整除,那么n就不是素数,否则,n是素数。
通过上网查找资料,发现有更节省时间的判断素数的方法:
本宝宝是学数学出身的,所以先来两个定理哈哈~
定理:所有大于3的素数都可以被表示为6x+1或6x-1。
证明:很明显所有的大于3的数都可以被表示为6x-2,6x-1,6x+1,6x,6x+1,6x+2,6x+3,6x+4,6x+5
因为 6x-2,6x,6x+2,6x+4 可以被2整除,所以这些不是素数
因为 6x+3可以被3整除,所以它也不是素数
所以素数只可能是6x-1,6x+1,6x+5
而6(x-1)+5=6x-1,也就是说 6x+5形式的数也可以表示成6x-1,只是x的取值范围稍有不同而已
综上所述,所有大于3的素数都可以被表示为6x+1或6x-1
证毕。
定理:6x+1或6x-1形式的数不一定是素数。
证明:25=6*4+1,但是是质数。
重点来了!!!!!!!!!结合埃氏筛选法和上面两个定理,衍生出一种快速判断素数的方法
拿到数n,先判断它不能被表示成6x+1或6x-1,如果不能的话,一定不是素数了,如果可以表示,再结合埃氏筛选法进一步断定n是不是素数。 具体方法是判断(5,7)~sqtr(n)能不能被n整除【判断步长为

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值