Python_算法实现_(8)埃拉托色尼筛选法

1. 概念

埃拉托色尼筛选法(the Sieve of Eratosthenes)简称埃氏筛法,是古希腊数学家埃拉托色尼(Eratosthenes 274B.C.~194B.C.)提出的一种筛选法。 是针对自然数列中的自然数而实施的,用于求一定范围内的质数,它的容斥原理之完备性条件是p=H~。

在 i7 CPU(单线程)处理器下它可以在1s之内生成10^9以内的所有素数,因此,当这种筛选算法被应用的时候,它的速度是非常惊人的。

2. 步骤

  1. 先把1删除(现今数学界1既不是质数也不是合数)
  2. 读取队列中当前最小的数2,然后把2的倍数删去
  3. 读取队列中当前最小的数3,然后把3的倍数删去
  4. 读取队列中当前最小的数5,然后把5的倍数删去
  5. 读取队列中当前最小的数7,然后把7的倍数删去
  6. 如上所述直到需求的范围内所有的数均删除或读取

3. 实现代码

import numpy as np

def eratosthenes(n):
    p = np.arange(1,n+1,1)   # 生成1—n数组

    p[0] = 0    # 数字1不是质数单独处理
    i = 2       # i表示当前最小质数
    
    while i < n:   # i小于n时,i倍数的数字都不是质数,因此类推
        if p[i-1] != 0:
            j = i * 2
            while j < n+1:
                p[j-1] = 0
                j += i
        i += 1
        
    print(p)


eratosthenes(1000)

输出结果为:

[  0   2   3   0   5   0   7   0   0   0  11   0  13   0   0   0  17   0
  19   0   0   0  23   0   0   0   0   0  29   0  31   0   0   0   0   0
  37   0   0   0  41   0  43   0   0   0  47   0   0   0   0   0  53   0
   0   0   0   0  59   0  61   0   0   0   0   0  67   0   0   0  71   0
  73   0   0   0   0   0  79   0   0   0  83   0   0   0   0   0  89   0
   0   0   0   0   0   0  97   0   0   0 101   0 103   0   0   0 107   0
 109   0   0   0 113   0   0   0   0   0   0   0   0   0   0   0   0   0
 127   0   0   0 131   0   0   0   0   0 137   0 139   0   0   0   0   0
   0   0   0   0 149   0 151   0   0   0   0   0 157   0   0   0   0   0
 163   0   0   0 167   0   0   0   0   0 173   0   0   0   0   0 179   0
 181   0   0   0   0   0   0   0   0   0 191   0 193   0   0   0 197   0
 199   0   0   0   0   0   0   0   0   0   0   0 211   0   0   0   0   0
   0   0   0   0   0   0 223   0   0   0 227   0 229   0   0   0 233   0
   0   0   0   0 239   0 241   0   0   0   0   0   0   0   0   0 251   0
   0   0   0   0 257   0   0   0   0   0 263   0   0   0   0   0 269   0
 271   0   0   0   0   0 277   0   0   0 281   0 283   0   0   0   0   0
   0   0   0   0 293   0   0   0   0   0   0   0   0   0   0   0   0   0
 307   0   0   0 311   0 313   0   0   0 317   0   0   0   0   0   0   0
   0   0   0   0   0   0 331   0   0   0   0   0 337   0   0   0   0   0
   0   0   0   0 347   0 349   0   0   0 353   0   0   0   0   0 359   0
   0   0   0   0   0   0 367   0   0   0   0   0 373   0   0   0   0   0
 379   0   0   0 383   0   0   0   0   0 389   0   0   0   0   0   0   0
 397   0   0   0 401   0   0   0   0   0   0   0 409   0   0   0   0   0
   0   0   0   0 419   0 421   0   0   0   0   0   0   0   0   0 431   0
 433   0   0   0   0   0 439   0   0   0 443   0   0   0   0   0 449   0
   0   0   0   0   0   0 457   0   0   0 461   0 463   0   0   0 467   0
   0   0   0   0   0   0   0   0   0   0 479   0   0   0   0   0   0   0
 487   0   0   0 491   0   0   0   0   0   0   0 499   0   0   0 503   0
   0   0   0   0 509   0   0   0   0   0   0   0   0   0   0   0 521   0
 523   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
 541   0   0   0   0   0 547   0   0   0   0   0   0   0   0   0 557   0
   0   0   0   0 563   0   0   0   0   0 569   0 571   0   0   0   0   0
 577   0   0   0   0   0   0   0   0   0 587   0   0   0   0   0 593   0
   0   0   0   0 599   0 601   0   0   0   0   0 607   0   0   0   0   0
 613   0   0   0 617   0 619   0   0   0   0   0   0   0   0   0   0   0
 631   0   0   0   0   0   0   0   0   0 641   0 643   0   0   0 647   0
   0   0   0   0 653   0   0   0   0   0 659   0 661   0   0   0   0   0
   0   0   0   0   0   0 673   0   0   0 677   0   0   0   0   0 683   0
   0   0   0   0   0   0 691   0   0   0   0   0   0   0   0   0 701   0
   0   0   0   0   0   0 709   0   0   0   0   0   0   0   0   0 719   0
   0   0   0   0   0   0 727   0   0   0   0   0 733   0   0   0   0   0
 739   0   0   0 743   0   0   0   0   0   0   0 751   0   0   0   0   0
 757   0   0   0 761   0   0   0   0   0   0   0 769   0   0   0 773   0
   0   0   0   0   0   0   0   0   0   0   0   0 787   0   0   0   0   0
   0   0   0   0 797   0   0   0   0   0   0   0   0   0   0   0 809   0
 811   0   0   0   0   0   0   0   0   0 821   0 823   0   0   0 827   0
 829   0   0   0   0   0   0   0   0   0 839   0   0   0   0   0   0   0
   0   0   0   0   0   0 853   0   0   0 857   0 859   0   0   0 863   0
   0   0   0   0   0   0   0   0   0   0   0   0 877   0   0   0 881   0
 883   0   0   0 887   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0 907   0   0   0 911   0   0   0   0   0   0   0
 919   0   0   0   0   0   0   0   0   0 929   0   0   0   0   0   0   0
 937   0   0   0 941   0   0   0   0   0 947   0   0   0   0   0 953   0
   0   0   0   0   0   0   0   0   0   0   0   0 967   0   0   0 971   0
   0   0   0   0 977   0   0   0   0   0 983   0   0   0   0   0   0   0
 991   0   0   0   0   0 997   0   0   0]

选择不为0的数字输出即为当前集合中所有的素数

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值