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的數字輸出即爲當前集合中所有的素數

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章