【发布时间】:2015-04-07 05:01:04
【问题描述】:
以下是埃拉托色尼筛的两种形式。
1) 第一个是我在观看这个可汗学院视频 (https://www.khanacademy.org/computing/computer-science/cryptography/comp-number-theory/v/sieve-of-eratosthenes-prime-adventure-part-4) 时解释如何对 Sieve 进行编程的方式,该算法使用模块化除法。
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 的全部意义在于消除分裂。如果你使用除法,那你就错了。
标签: python math encryption