筛法与质数表

给出一个自然数表(1,2,…,n),要求尽可能快的找出其中的质数,应该怎么做?
有两种思路:一种是遍历,一个个找质数,一种是去掉所有的合数.那么选择哪一种呢?

不管怎样,先来看看如何判定质数或者合数.

质数和合数的判定

质数和合数的定义在这不多讲.为判断是质数还是合数,最经典的方案就是遍历小于该数的所有整数(除了1),如果出现整除,那就不是.
就像这样:

while(i=2;i<N;i++)
{
	if(N%i==0)
	{
		return FALSE;
	}
}
return TRUE;

但这样需要扫描N-1次,对于大数而言要花相当多的时间,显然不是优解.那么在这里引入一个定理:
theorem:∀x∈z且 x是合数∃1≤a≤x使得a∣x{theorem: }\\ \forall x\in\mathbb{z}且\ x是合数\\ \exists 1\le a\leq \sqrt{x} \\使得 a|x theorem:xz x1ax使ax
对该定理用反证法证明:
proof:for合数x,∃整数对(a,b),ab˙=x.(a!=0andb!=0)ifa&lt;x and b&lt;x→ab˙&lt;x∴原假设不成立.Q.E.D{proof:}\\ for 合数x,\\ \exists 整数对(a,b),a\dot b=x.(a!=0 and b!=0)\\ if a&lt; \sqrt{x}\ and\ b&lt; \sqrt{x}\\ \rightarrow a\dot b &lt; x\\ \therefore 原假设不成立.\\ Q.E.D proof:forx,(a,b),ab˙=x.(a!=0andb!=0)ifa<x and b<xab˙<x.Q.E.D
所以现在提出第一个改进:
只用扫描到x\sqrt{x}x即可判断是否为质数.

筛法

结合上一部分,下面提出一个在自然数表中找出质数表的一个改进方法:

  1. x\sqrt{x}x范围内找出质数;
  2. 清除这些质数的整数倍;
  3. 完成.

清除所有质数的整数倍&ThickSpace;⟺&ThickSpace;清除所有合数 清除所有质数的整数倍\iff 清除所有合数
二者是等价的吗?
下面是解释:
自然的,是一个整数的整数倍的数一定是合数.所以若清除了所有的合数必然清除所有质数的整数倍.由此必要性得证.
下面是充分性:
先引入一个定理:
theorem:∀x∈N+x=∏i=1n ai,ai∈N+且ai是质数{theorem:}\\ \forall x \in\mathbb{N+}\\ x=\prod_{i=1}^{n}\ a_i,\\ a_i\in\mathbb{N+}且a_i是质数 theorem:xN+x=i=1n ai,aiN+ai
下面是证明:
proof:对于质数a,可分解为1a˙,成立.对于合数b,一定可以分解为∏i=1n mi,mi∈N+对于mi,若为质数,则分解停止.若为合数,则按照上一条,可以分解为∏i=1n mi′,mi′∈N+以上过程均成立直到mik均为质数.{proof:} 对于质数a,可分解为1\dot a,成立.\\ 对于合数b,一定可以分解为\\ \prod_{i=1}^{n}\ m_i,m_i\in\mathbb{N+}\\ 对于m_i,若为质数,则分解停止.\\若为合数,则按照上一条,可以分解为 \prod_{i=1}^{n}\ m&#x27;_i,m&#x27;_i\in\mathbb{N+}\\ 以上过程均成立直到m^{k}_i均为质数. proof:a,1a˙,.b,i=1n mi,miN+mi,,.,,i=1n mi,miN+mik.
于是
∀a is 合数∃m is 质数m∣a \forall a\ is\ 合数\\ \exists m\ is\ 质数\\ m|a\\ a is m is ma
充分性得证.

那么:
按照这个方法进行质数的筛选,有:

for(a=1;a<=sqrt(x);a++)
{
	if(isPrime_number(a)==1)
	{
		for(b=2;ab<=x;b++)
		{
			remove(ab);
		}
	}
	else
	{
		/*怎么会有else?*/
	}
}		

就是这样了.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值