篩選素數之尤拉篩法 python實現 附帶證明

2021-08-30 19:36:28 字數 1262 閱讀 1589

#返回型別:列表

#說明:返回小於upperbound的所有素數

def oulashai(upperbound):

filter=[false for i in range(upperbound+1)]

primenumbers=

for num in range(2,upperbound+1):

if not filter[num]:

for prime in primenumbers:

if num*prime>upperbound:

break

filter[num*prime]=true

if num%prime==0: #這句是最有意思的地方 下面解釋

break;

return primenumbers

def test():

correctresult_30=[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]

oulashairesult_30=oulashai(30)

if(oulashairesult_30==correctresult_30):

print('correct')

else:

print('wrong')

if __name__=='__main__':

test()

if num%prime==0    這句我苦思冥想許久,在此將想法分享給大家。

假設沒有這句話,程式依然能得到正確的結果,只不過是有很多無用的篩選。

例如24  什麼時候會篩它呢    2*12  3*8   4*6   6*4   8*3    12*2       

其實我們只用在2*12時將其篩去即可   

也就是說a*b==c僅當a是c最小的素數因子時篩去c    

if  num%prime==0    然後break掉   就是為了保證上述條件  

若num%prime==0  則存在q∈整數 使得num==prime*q    (prime<=q  )

next(prime)*num == next(prime)*prime*q == prime*next(prime)*q      ( prime而數  prime*next(prime)*q  應由 num==next(prime)*q 時篩去  

所以此時的num已經篩數完成( 已經是萎了 篩不動了)  應執行num+1的篩數

線篩 尤拉篩 線性篩選素數

題目描述 用線行篩篩選素數,將指定範圍的素數找出,達到o n 的效果。思路時間複雜度 0 n 思路任意值必然可以被分解為 a b1 c1 b2 c2 例如9 3 3,15 3 5,55 5 11 即所有的合數都可以被拆解為素數倍數的乘積。當我們從2開始找到素數與含有素數的合數,將合數標記為非素數,每...

素數篩選法和尤拉篩選法

素數判斷 素數篩選法 用素數篩選合數 include include define max n 100 素數篩選法 int prime max n 5 初始化為0 void init int main printf n return0 求2 n內每個數的最小素因子 include include d...

素數線性篩法(尤拉篩)

之前寫的埃式篩法複雜度達o n log n lo gn o n logn logn o n lo gn l ogn 在大數字的時候可能複雜度還不夠理想。這種做法對於乙個合數有可能會篩了多次,導致重複做功。引入尤拉篩法能夠解決這種多次篩同乙個數字的情況,理論演算法複雜度o n o n o n 精髓在於...