二倍压缩素数筛法
2012-05-27 13:43
218 查看
求1-MAX之间的素数,以及它们的个数,大家都知道,在偶数中,只有2是素数,所以,我们可以认为偶数都不是素数,直接掠过,最后再把2添加进去
这样,我们可以只记录奇数的状态,p
,就表示2*n+1是不是素数
=========================================
表示域:
表示元素:n
=====================||===================
实际域:
实际代表的数字:r=2*n+1
筛选从r的平方开始,也就是
r*r=(2*n+1)*(2*n+1)=4*n^2+4*n+1=2*【2*n*(n+1)】+1
转换成表示域就是
=====================||====================
表示域:
2*n*(n+1)就可以表示r*r
=====================||====================
实际域:
现在知道了内层从r*r开始,每次加多少呢?如果加r,也就是2*n+1,那么得到的是
r*(r+1)=4*n^2+6*n+2,很明显,这是个偶数,我们的目的是把偶数全部当合数算
所以,应该找下一个奇数,又是r的倍数,那么很明显,下一个就是
r*(r+2)=4n^2+8n+3
=====================||====================
表示域:
4n^2+8n+3=2[2n^2+4n+1]+1
所以表示域就是
2n^2+4n+1=2n^2+2n+(2n+1)
所以说,表示域每次增加为2n+1
===========================================
下面是代码:
这样,我们可以只记录奇数的状态,p
,就表示2*n+1是不是素数
=========================================
表示域:
表示元素:n
=====================||===================
实际域:
实际代表的数字:r=2*n+1
筛选从r的平方开始,也就是
r*r=(2*n+1)*(2*n+1)=4*n^2+4*n+1=2*【2*n*(n+1)】+1
转换成表示域就是
=====================||====================
表示域:
2*n*(n+1)就可以表示r*r
=====================||====================
实际域:
现在知道了内层从r*r开始,每次加多少呢?如果加r,也就是2*n+1,那么得到的是
r*(r+1)=4*n^2+6*n+2,很明显,这是个偶数,我们的目的是把偶数全部当合数算
所以,应该找下一个奇数,又是r的倍数,那么很明显,下一个就是
r*(r+2)=4n^2+8n+3
=====================||====================
表示域:
4n^2+8n+3=2[2n^2+4n+1]+1
所以表示域就是
2n^2+4n+1=2n^2+2n+(2n+1)
所以说,表示域每次增加为2n+1
===========================================
下面是代码:
#define MAX 10000001 int p[MAX]; int prime[MAX]; int primenum; int creatprime2(int lim){//传说中的2倍压缩筛选素数 int sievelimit = ( sqrt(lim * 1.0) - 1 ) / 2;//只需筛到一半 int maxindex = ( lim - 1 ) / 2; int n,t,k; for(n = 1; n <= sievelimit; n++){ if(p == 0){ t = 2*n + 1;//每次表示域增加2n+1 for(k = 2*n*(n+1); k <= maxindex; k += t)//从2n(n+1)开始 p[k] = 1; } } prime[0] = 2; primenum = 1; for(n = 1; n <= maxindex ;n++){ if(p ==0) prime[primenum++] = 2*n+1;//p ==0表示的是2*n+1是素数 } return primenum; }
相关文章推荐
- 图文]MPEG-2压缩编码技术原理应用(九)
- Linux压缩打包命令使用方法
- hdu4628(状态压缩DP)
- DICOM:dcm4che工具包如何压缩dcm文件探讨(前篇)
- CodeForces 197D Infinite Maze (BFS+状态压缩)
- SqLite 压缩数据库空闲空间的详细操作(数据库虚胖问题)
- java/resteasy批量下载存储在阿里云OSS上的文件,并打包压缩
- Java压缩类库的使用-2.JDK中的打包、压缩类库
- Linux 下zip包的压缩与解压
- 使用 PVRTC 压缩格式创建纹理(Creating textures in the PVRTC compression format)
- hdu4771_2013亚洲区域赛杭州站(状态压缩bfs)
- archpr 压缩文件暴力破解
- LInux里面文件的压缩和解压
- linux压缩解压缩文件
- linux和unix下常用解压和压缩命令
- Ant 执行 YUICompressor 任务压缩 JavaScript 和 CSS 文件,解决中文乱码问题,增加源文件字符编码集设定
- Linux压缩文本及文件
- 7z压缩与解压命令
- 使用java.util.zip实现zip压缩和解压
- 第九章、文件与文件系统的压缩与打包