收藏
0有用+1
0

埃拉托斯特尼筛法

埃拉托斯特尼筛法
埃拉托斯特尼筛法,简称埃氏筛或爱氏筛,是一种由希腊数学家埃拉托斯特尼所提出的一种简单检定素数的算法。要得到自然数n以内的全部素数,必须把不大于根号n的所有素数的倍数剔除,剩下的就是素数。
中文名
埃拉托斯特尼筛法
外文名
sieve of Eratosthenes
别    名
筛法
提出者
埃拉托斯特尼
提出时间
250年
适用领域
数论
应用学科
数学

算式

播报
编辑
要得设煮捆到自然数n以内的全部素数,必须把婆战洒不大于
的所有素数的兰市钻店倍数档乘几剔除,剩下的就是素数希姜。 [1]
给出要筛数值的范围n,找出以内的素数。先用2去筛,即把2留下,把2的倍数剔除掉;再用下渗霸屑探举一个质数,也就是3筛,把3留下,把3的倍数剔除掉;接下去用下一个质数5筛,把5留下,把5的倍数剔除掉;不断重复下去良巴......。

步骤

播报
编辑
详细列出算法如下:
  1. 1.
    列出2以后的所有序列:
    • 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
  2. 2.
    标出序列中的第一个素数,也就是2,序列变成:
    • 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
  3. 3.
    将剩下序列中,划掉2的倍数,序列变成:
    • 2 3 5 7 9 11 13 15 17 19 21 23 25
  4. 4.
    如果这个序列中最大数小于最后一个标出的素数的平方,那么剩下的序列中所有的数都是素数,否则回到第二步。
  5. 5.
    本例中,因为25大于2的平方,我们返回第二步:
  6. 6.
    剩下的序列中第一个素数是3,将主序列中3的倍数划掉,主序列变成:
    • 2 3 5 7 11 13 17 19 23 25
  7. 7.
    我们得到的素数有:2,3
  8. 8.
    25仍然大于3的平方,所以我们还要返回第二步:
  9. 9.
    序列中第一个素数是5,同样将序列中5的倍数划掉,主序列成了:
    • 2 3 5 7 11 13 17 19 23
  10. 10.
    我们得到的素数有:2,3,5 。
  11. 11.
    因为23小于5的平方,跳出循环.
结论:2到25之间的素数是:2 3 5 7 11 13 17 19 23。

Pascal实现

播报
编辑
var     f:array[1..100]of boolean; //存储是否是质数     i,j,n:longint; begin     readln(n);     fillchar(f,sizeof(f),true); //先假设都是质数     f[1]:=false; //注意:1不是质数     for i:=2 to trunc(sqrt(n)) do begin //优化:只需考虑根号n以内的数的倍数         if not f[i] then //优化:如果一个数不是质数,那么它的倍数一定已经被除去了             continue;         for j:=2 to n div i do //除去它的倍数             f[i*j]:=false;     end;     for i:=1 to n do //输出         if f[i] then             write(i,' ');     writeln; end.

c++实现

播报
编辑
#include <bits/stdc++.h> using namespace std; const long long maxn = 10000007 + 10; const long long maxp = 700000; int vis[maxn];    // i是合数vis为1,i是素数,vis为0 long long prime[maxp]; void sieve(long long n){     long long m = (long long)sqrt(n + 0.5);     memset(vis, 0, sizeof(vis));     vis[2] = 0;     for (long long i = 3; i <= m; i += 2) {         if(!vis[i])             for (long long j = i * i; j <= n; j += i)                 vis[j] = 1;         if(i * i > n)             break;     } } long long gen(long long n){     sieve(n);     long long c = 1;     prime[0] = 2;     for (long long i = 3; i <= n; i += 2)         if(!vis[i])             prime[c++] = i;     return c; } int main() {     long long n, c;     cout << "刷素数到n:";     cin >> n;     c = gen(n);     for (long long i = 0; i < c; i++)         printf("%lld", prime[i]);     cout << endl << c;     return 0; }

Java实现

播报
编辑
public class assf {         public static void main(String[] args)         {             int aa[]=new int [101];             aa[2]=0;             int k=2,tt=0;             while(tt<101)                 {                     for(int i=1; i<aa.length; i++) //将不是素数的数筛出                         {                          if(i%k==0&&i!=k) aa[i]=1;                         }                     for(int i=1; i<aa.length; i++) //将筛选后的第一个数当做新的筛子                     {                         if(i>k&&aa[i]==0)                        {                          k=i;                          break;                        }                     }                     tt++;                 }             for(int i=1; i<aa.length; i++)                 if(aa[i]==0) System.out.printf("%d ",i);         } }

python实现

播报
编辑
# coding=UTF-8 def prinum(num=100, jud=True): """埃拉托斯特尼筛法 Sieve of Eratosthenes""" try: if num<2: return False if jud else list() elif num==2: return True if jud else [2] else: num=num if isinstance(num, int) else int(num)+1 except: raise ValueError("'num' must be a real number") prili=[2] prili.extend(list(range(3, num+1, 2))) i=0 while prili[i]**2 < prili[-1]: i+=1 for j in range(prili[i]**2, prili[-1]+1, prili[i]): if j==num and jud: return False if j in prili: prili.remove(j) return (True if num in prili else False) if jud else prili if __name__=="__main__": """ 默认输入的数字 num=100,默认jud=True 若 jud=True 则函数 prinum 功能为判断输入的数字是否为质数,这是默认项 若 jud=False 则函数 prinum 功能为以列表形式返回 2 到 num 的质数 """ print(prinum(jud=False))

ES6实现

播报
编辑
function* even(){//初始序列:3,5,7,9...     let n = 1     while(true){yield n+=2} } function* primes(max){     yield 2     var it = even(),n=null     while(true){         n = it.next().value         if(n>max){break}         yield n         it = (function*(it,n){             for(let x of it){                 if(x%n>0){yield x} //筛选后续数值             }         })(it,n)     } } let Primes = primes(100) //100以内的质数 for(let x of Primes){     console.log(x) //打印 }

参见

播报
编辑