Day5 計數質數(埃拉託色尼篩選法)

2021-09-24 23:13:02 字數 1181 閱讀 8740

統計所有小於非負整數 n 的質數的數量。

埃拉託色尼篩選法:

先將(2,n)的各數放入表中,然後在 2 的上面畫乙個圓圈,然後劃去 2 的其他倍數;第乙個既未畫圈又沒有被劃去的數是 3,將它畫圈,再劃去 3 的其他倍數;現在既未畫圈又沒有被劃去的第乙個數是 5,將它畫圈,並劃去5的其他倍數……依次類推,一直到所有小於或等於n的各數都畫了圈或划去為止。這時,表中畫了圈的以及未劃去的那些數正好就是小於 n 的素數。

轉換為**就是如果需要 1

p = np.ones(n, dtype=np.int8)

i, j = 1, 3 #i表示位置,j表示位置實際代表的數,j=i*2+1

while i < n**0.5:

if p[i]:

p[j**2 >> 1::j] = 0

i, j = i + 1, j + 2

return p.sum()

result = eratosthenes(25)

print(result)

#不借助numpy,使用列表的方法

def countprimes(n):

if n < 3:

return 0

else:

# 首先生成了乙個全部為1的列表

output = [1] * n

# 因為0和1不是質數,所以列表的前兩個位置賦值為0

output[0],output[1] = 0,0

# 此時從index = 2開始遍歷,output[2]==1,即表明第乙個質數為2,然後將2的倍數對應的索引

# 全部賦值為0. 此時output[3] == 1,即表明下乙個質數為3,同樣劃去3的倍數.以此類推.

for i in range(2,int(n**0.5)+1):

if output[i] == 1:

output[i*i:n:i] = [0] * len(output[i*i:n:i])

# 最後output中的數字1表明該位置上的索引數為質數,然後求和即可.

return sum(output)

result = countprimes(25)

print(result)

埃拉託色尼質數篩選法

以前夏季學期的時候接觸過埃氏篩選法,不過自己當時不太理解。今天看的時候有點感覺,大概用到的是每個合數都能寫成幾個質數相乘的格式,因此如果不能被比該數小的質數整除的話,該書一定也是質數。並且我們已知2是最小的質數,所以從2開始篩選。以下程式可以輸出不超過n的所有質數。當然鑑於陣列的大小是有限的,因此n...

埃拉託色尼篩選法

埃拉託色尼篩選法 the sieve of eratosthenes 簡稱埃氏篩法,是古希臘數學家埃拉託色尼 eratosthenes 提出的一種篩選法。是針對自然數列中的自然數而實施的,用於求一定範圍內的質數。埃氏篩法步驟編輯 1 先把1刪除 現今數學界1既不是質數也不是合數 2 讀取佇列中當前最...

埃拉託色尼篩選法 演算法

埃拉託色尼篩選法 埃拉託色尼選篩法 the sieve of eratosthenes 簡稱埃氏篩法,是古希臘數學家埃拉託色尼 eratosthenes 274b.c.194b.c.提出的一種篩選法。是針對自然數列中的自然數而實施的,用於求一定範圍內的質數,它的容斥原理之完備性條件是p h 1 先把...