为什么Eratosthenes的Sieve比简单的“哑”算法更有效?
|
如果您需要生成从1到N的质数,则“哑”的方法是迭代从2到N的所有数字,并检查数字是否可被到目前为止找到的任何质数均除。而不是所讨论数字的平方根。
如我所见,Eratosthenes的筛子也做同样的事情,除了其他方面-除了当它找到质数N时,它会标出所有N的倍数。
但是,无论是在找到N时标记X,还是检查X是否可除以N(基本复杂度),big-O都保持不变。您仍然需要对每个数字质数对执行一次恒定时间操作。实际上,哑算法在找到质数后即会终止,但是Eratosthenes的筛网会多次标记每个数字-每可被除以一个质数。除质数外,每个数字的最少运算量是原来的两倍。
我在这里误会什么吗?
没有找到相关结果
已邀请:
7 个回复
苏髓骗撩
是素数或几乎相同大小的两个素数的乘积(包括素数的平方)时,会遇到最坏的情况。如果
具有两个以上的素数或两个大小相差很大的素数,它们中的至少一个比
小得多,所以即使是所有这些数字所需要的累加功(构成了直到
,对于足够大的
而言,是相对微不足道的,我将忽略这一点,并以虚构数来确定复合数而无需做任何工作(两个近似相等的素数的乘积数很少,因此尽管它们各自花费高达大小相似的素数,总共可忽略不计)。 那么,对ѭ5以下的素数进行测试需要做多少工作? 根据素数定理,素数
(对于
足够大)大约为
(it11ѭ)。相反,这意味着第k个素数(对于k来说不会太小)约为
(+低阶项)。 因此,测试第k个素数需要先除以
,约
的素数。将for15的总和得出大约
的总和。因此,通过忽略组合,我们发现通过试算(仅使用质数)找到不超过
的质数为
。对复合材料的进一步分析显示,它为'19ѭ。使用轮子可以减少常数因子,但不会改变复杂性。 另一方面,在筛子中,每种复合物以至少一个质数的倍数被划掉。取决于您是在ѭ20还是在21 crossing开始相交,复合材料被剔除的次数会多次,因为它具有不同的素因数或不同的素因数
。由于任何数字最多具有一个超过
的素数,因此相差并不大,因此对复杂度没有影响,但是很多数字中只有两个素数(或者三个具有大于
的素数),因此,它在运行时间上有明显的不同。无论如何,数字
仅有很少的不同素数,一个简单的估计表明,不同素数的数量以
(以2为底的对数)为界,所以过筛数的上限是
。 。 通过不计算每个复合物被抵消的频率,而是计算每个素数的多少倍被抵消,就像IVlad所做的那样,人们很容易发现交叉的数量实际上是28。同样,使用轮子不会改变复杂性,但会减少常数因子。但是,这里的影响比试用部门更大,因此至少应该跳过偶数操作(除了减少工作量之外,还减少了存储大小,因此提高了缓存的位置)。 因此,即使不考虑除法比加法和乘法更昂贵,我们也会看到筛子所需的操作数比试除法所需的操作数小得多(如果限制不是太小)。 总结: 试算法通过分割素数来完成无效的工作,而筛子则通过反复划开合成物来进行无效的工作。质数相对较少,但复合数很多,因此人们可能会以为试验部门浪费更少的工作。 但是:复合材料只有很少几个不同的素数因子,而低于ѭ29的素数却很多。
提孺局缎
运算。这总共是32英镑。 在筛分法中,对于从1到
的每个未标记数字,在标记
的倍数时进行
运算,在标记
的倍数时标记
,在标记
的倍数时标记
。这是
,即
。看到这里的结果。 因此,渐近复杂度就不一样了,就像您说的那样。即使是天真的筛子也会很快击败天真的素数生成方法。筛子的优化版本可以获得更快的速度,但是大哦保持不变。 两者并不像您所说的一样。对于每个数字,您将在幼稚素数生成算法中以相同的素数
检查除数。随着您的前进,您会用相同的数字序列检查可除性(当您接近
时,您会越来越多地检查它的可逆性)。对于筛子,接近ѭ0时,检查会越来越少。首先,您以
递增,然后以
递增,然后以
递增,依此类推。这将达到
并停止得更快。
贸会
然后你迭代
您不必在1000之后检查j,因为j * j将超过一百万。 从j * j开始(您不必将j的倍数标记为小于j ^ 2,因为它们已被标记为先前找到的较小质数的倍数) 因此,最后,您完成了1000次循环,而if部分仅针对那些素数的j \。 第二个原因是,使用筛子时,您只会做乘法,而不是除法。如果您巧妙地执行操作,则只会执行加法操作,甚至不会进行乘法操作。 并且除法比加法具有更大的复杂性。通常的除法方式是
,加法是
。
漂截嘘
郡晒景沧
擅香
讼乐
实算法对每个素数都执行
乘以大约55个素数。