以下是兩種形式的Eratosthenes的篩子。在python中使用字典的eratosthenes的篩子
1)首先是我解釋怎麼看這個汗學院的視頻(https://www.khanacademy.org/computing/computer-science/cryptography/comp-number-theory/v/sieve-of-eratosthenes-prime-adventure-part-4)該算法採用模塊化分工時篩編程方式。
2)第二個具有一些修改我已經做加快算法包括:使用字典並使用乘法找到複合材料,而不是模塊劃分測試它們從字典刪除的複合元件,然後創建篩選結束後的排序列表。
第二種方法要快得多,但我不得不添加一個try語句,以避免函數嘗試刪除已被刪除的值的情況,但仍會刪除以前的數字的倍數爲尚未刪除。
問題是,有沒有什麼辦法可以避免已經發現複合的值,而不是使用try語句來跳過它們,同時仍然使用乘法來定位複合?
def Sieve_2_b(b):
seq_primes=list()
c=0
for i in range(2,(1+b)):
seq_primes.append(i)
while (seq_primes[c]**2)<b:
k=c
while k<(len(seq_primes)):
if seq_primes[k]>=(seq_primes[c]**2):
if seq_primes[k]%seq_primes[c]==0:
del seq_primes[k]
k-=1
k+=1
c+=1
return seq_primes
def Sieve_2_b_using_dict(b):
seq_primes=list()
sieve_dict=dict()
c=0
for i in range(2,(1+b)):
seq_primes.append(i)
sieve_dict[i]=0
while (seq_primes[c]**2)<b:
k=c
while seq_primes[k]<=(b/seq_primes[c]):
try:
del(sieve_dict[(seq_primes[k]*seq_primes[c])])
except:
print(seq_primes[k],seq_primes[c],'stop this')
pass
k+=1
c+=1
seq_primes=sorted(sieve_dict,key=sieve_dict.get)
return seq_primes
Sieve的重點在於消除分裂。如果你正在使用分區,你做錯了。 –
http://stackoverflow.com/questions/30769780/python-sieve-of-erastosthenes – user4757074