最早的算法曾经发明过。埃拉托斯坦找到了一个快速找到所有首要的s到给定数字n。

从数字2、3……开始,。。。,n.重复移除所有倍数列表中第一个数字的s,但该数字除外。第一轮是2,所以打4,6,8…然后第一个数字是3,所以你打6,9,12,。。。(请注意,从第一阶段开始,6已经退出了——没关系)。广场列表中第一个数字的值大于n。就这样。你可以代码这是非常有效的贸易中的花招,但原理相同。

显然,我们只删除列表中的数字不是 首要的(他们都不平凡倍数s)。另一方面,任何混合成的直到n的数字在某个时刻必然会被删除:这样的数字可以写成xy,也可以写成x2<=n或y2<=n(否则xy>n)。所以我们最终得到的清单正是首要的s到n。

有两个方程式s是一个代数这个的ic表达式筛子,筛子:

k+1是首要的 若(iff)为所有人自然数u、 v:

(1) k<>u*v+u+v

方程式(1)为“k不等于u乘以v加u加v”。第二个方程只产生奇素数:

2*k+1是所有自然数u,v的素数iff:

(2) k<>2*u*v+u+v

有一件事需要注意。对于某些n,k=2*n满足方程(2)。对于所有自然b,都有类似的用b*k+/-c(“+/-”读作“加或减”)来描述素数的等式,每个等式都有一个相应的等式2*b*k+/-c,它以相同的方式描述素数。然而,随着b的增加,必须做越来越多的工作确保s确实是素数,并且所有素数都被覆盖了。


这个数学对于上述内容方程式如下所示:

数字n+1是混合成的对于自然数中的n若(iff)自然的 是这样的k除以n并且k<n。

A数字ks是一个数字n,如果整数是这样的k*x=n.

所以用k测试n,其中更大的一个。如果k在自然集中,则使用k+1进行测试。类似地,在自然数中使用x+1表示x。

因此,数字n+1是复合的,如果自然数中存在x和k,那么n+1=(k+1)*(x+1)。

上述否定的意思是说一个数字n+1是自然数中所有x和k的素数iff,n+1!=(k+1)*(x+1),这与n+1!=相同k*x+k+x+1,与n相同!=k*x+k+x。类似的逻辑适用于2*n+1。

下面是一个非常清楚的解释这个概念.

目标:查找全部素数小于30。

步骤1:列表2-N

2 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

第二步:取2为素数,去掉2到N的所有倍数。

2456789101112131415161718192021222324252627282930

第三步:取3为素数,去掉3到N的所有倍数。

2 45678 9 1011121314 15 1617181920 212223242526 27 282930

第4步:取5为素数,去掉5到N的所有倍数。

2 4 5 678 9 1011121314 15 1617181920 21222324 25 26 27 282930

因为5是比N的平方根小的最大整数,所以我们可以到此为止。所有未删除的数字都是质数。这给我们留下了以下几点设置...

{2, 3, 5, 7, 11, 13, 17, 19, 23, 29}

这个算法被认为有利于较小的值N(小英寸计算机术语,因此最多可以达到10000000)。你可以进一步增强算法跳过当前素数和它的正方形。例如,在这个例子中,当我们把5作为素数时,我们可以直接跳到25,因为我们可以确定5到25(10,15,20)之间的所有其他倍数都已经被删除了。现在这看起来可能不多,但当您的范围跨越数百万时,它可以节省大量时间。

这里有一个简单的实施埃拉托西内斯筛在里面C。它找到从2到PRIME_MAX-1的所有素数并打印出来。

此实现采用尚未筛选的最小已知素数“currprime”,并从数组中删除所有小于prime_MAX的倍数。一旦currprime的平方大于或等于PRIME_MAX,它就会停止。如上所述,我们可以从currprime的平方开始,因为所有较小的倍数都已被删除。

该程序使用字符数组s保存从0到PRIME_MAX-1的每个数字的素数。如果索引是质数,则每个字符保持1,否则保持0。由于只需要一点点存储空间,因此将素数存储在一个字符中是浪费,但会大大简化代码。

#包括<stdio.h>

#定义PRIME_MAX 100

炭筛[PRIME_MAX];

int nextPrime(int lastprime){
整数i;

for(i=lastprime+1;i<PRIME_MAX;i++)
if(筛[i]==1)
返回i;

返回0;
}

整型main(){
int i,currprime;

筛[0]=0;
筛[1]=0;
对于(i=2;i<PRIME_MAX;i++)
筛[i]=1;

currprime=nextPrime(0);
而((currprime*currprime)<PRIME_MAX){

对于(i=(currprime*currprice);i<PRIME_MAX;i+=当前值)
筛[i]=0;

currprime=nextPrime(currprice);
    }

对于(i=0;i<PRIME_MAX;i++)
if(筛[i]==1)
printf(“%d\n”,i);

返回0;
}

登录登记在这里写点什么或联系作者。