程序3.5 埃拉托色尼筛法

本文介绍了埃拉托色尼筛法的原理和C语言实现,通过筛除序列中每个数的倍数找出素数,并分析了算法的时间复杂度。此外,还提到了Sundaram筛法,这是一种较少为人知的素数筛法,通过构造对称矩阵筛选出除2以外的所有素数,其时间复杂度更低。文章探讨了两种筛法的正确性证明和应用场景。
摘要由CSDN通过智能技术生成

筛法思想:从素数的定义出发(除了1和本身之外不能被其他数整除的数,包括 0,1),根据这个定义,可以筛除序列2的倍数(2 4 6 8 10。。。),3的倍数(3 6 9 12.。。。)。。。。知道序列中某个数大于sqrt(N)且没被筛除。

 

 算法复杂度分析:N+N/2+N/3+N/4+.........+ =NHn~NlnN(调和数(参见数学分析or第一章的常见分析数学基础))

算法实现:

(代码可优化的地方很多,功夫不到家,暂时优化不好)

运行结果:

可到10000000,再往后就分不到内存了。(当时的机子条件下)。

关于筛法的总结:

ACM中常用的筛法代码:

 

2Sundaram 筛法

 

 

埃拉托色尼 (Eratosthenes) 素数筛法可谓尽人皆知,但恐怕知道 Sundaram 筛法的却不多。此算法构造一对称矩阵:

 /left[ /begin{matrix}<br />
   4 & 7 & 10 & 13 & 16 & 19 & /cdots   //<br />
   7 & 12 & 17 & 22 & 27 & 32 & /cdots   //<br />
   10 & 17 & 24 & 31 & 38 & 45 & /cdots   //<br />
   13 & 22 & 31 & 40 & 49 & 58 & /cdots   //<br />
   16 & 27 & 38 & 49 & 60 & 71 & /cdots   //<br />
   19 & 32 & 45 & 58 & 71 & 84 & /cdots   //<br />
   /vdots  & /vdots  & /vdots  & /vdots  & /vdots  & /vdots  & /ddots   //<br />
/end{matrix} /right]

 

此矩阵为对称矩阵,每行(列)均为等差数列,第一行(列)首项为4,公差为3;第二行(列)公差为5;第三行(列)公差为7……也即矩阵中包含所有满足 N=i+j+2ij/quad (1/le i/le j,/ i,j/in /mathbb{N})N
这个对称矩阵的秘密在于:若 N 不出现于矩阵中,则 2N + 1 为素数。该筛法可以筛出除 2 以外的所有素数。
该算法的时间复杂度低于 /Theta (n /log_2 n)

算法正确性的证明:
所有矩阵中的数的两倍加 1 都是被筛掉的数(这些数均为奇数)。这些数均具有 2(i+j+2ij)+1=(2i+1)(2j+1) 的形式。而 i, j 的取值为任意大于 1 的自然数,故所有可以表示为两奇数之积的数(即奇合数)全部被筛除。故留下的奇数均为奇素数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值