素数表问题代码反推集合论解释

素数表问题代码反推集合论解释



**问题与解法**
**基本问题:**
给定上限,输出素数表


一般的思路是:
建一个给定上限的全集数组全是1(1不是质数,所以默认删除)
给定一个变量icounter(1~(n^(1/2)),
遍历icounter,每个数模icounter,若模0则数组赋值0
最后不输出0元素(0是合数1是素数)

感性认知
[http://www.cppblog.com/asp/archive/2006/10/06/13400.aspx](http://www.cppblog.com/asp/archive/2006/10/06/13400.aspx)
优化方案后
今天上集合论想到用集合论来抽象化解释


抽象化


sieve数组本质上就是一个全集
设整数全集E,素数集Pm,因数集P , A(i,p) , 2以外的偶数集Even/2


E={ i∈N+ | i!=0,1 }


P={ p∈E | p=2i-1 ,I ∈ E }


A(i,p)={ a∈E | a=p(p+2
i) ,p∈P ,i ∈ N}


//这样取因数的好处是,从p^2开始取,革除了像35 和53这样重复的a元素


Even/2={ e∈E | e%2=0 ∧ e!=2 }


prime.jpg





Pm=E-P-A(i,p)-Even/2



再抽象


主要是对于A(i,p)的工作:


A(i)={ a∈E | (a=i ∨ a=i的倍数)∧ i∈E }
Pm = E - U(i∈E)A(i)
|Pm| = |E| - (∑(∞,i=2)|A(i)| - ∑(2<i,j<∞)(|A(i)∩ A(j)|)+∑(2<i,j,k<∞)(|A(i)∩ A(j)∩A(k)|)-…+(-1)^(m-1)(|∩(i∈E)A(i)|)


容斥原理



PS:m取决于给定的上限








如有漏洞望积极指出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值