为什么扫除Eratosthenes比简单的“哑”算法更有效率?

如果您需要从1到N生成素数,那么“哑”的方法就是遍历从2到N的所有数字,并检查数字是否可以被除以目前为止所发现的任何素数除数。平方根数的问题。

正如我所看到的那样,除了其他方式,除了另外一种方式,Eratosthenes的筛分也是一样的 – 当它找到一个N素时,它标出所有数字是N的倍数。

但是,无论您在找到N时是否标记X,或者您检查X是否可以被N划分,那么基本的复杂性,大O保持不变。您仍然可以对每个数字素数对执行一次常时操作。事实上,一旦找到了一个主要的愚蠢算法就会中断,但是Eratosthenes的筛选标记了每个数字的次数 – 一次是可以分割的每个素数。除了素数之外,每个数字的操作最少是两倍。

我在这里误会了吗?

在试验分割算法中,确定数字n是否为素数可能需要的大部分工作是通过素数高达约sqrt(n)来测试可分性。

当n是素数或几乎相同大小(包括素数的平方)的两个素数的乘积时,满足最坏的情况。如果n具有两个以上的主要因素,或两个大小不同的主要因素,其中至少有一个比sqrt(n)小得多,因此即使所有这些数字(其中绝大多数)数字高达N,足够大的N)是相对微不足道的,我将忽略它,并与小说合作,确定复合数字,而不做任何工作(两个大致相等的素数的产品数量很少,所以尽管单独它们的成本就像大小相同的一样,总的来说这是一个微不足道的工作量)。

那么,对N的素数的测试有多少工作?

通过素数定理,素数< = n的数量(对于n足够大),约n / log n(它是n / log n低阶项)。相反,这意味着关于k * log k(低阶项)的第k个素数是(对于k不太小)。 因此,测试第k个素数需要通过pi(sqrt(p_k)),大约2 * sqrt(k / log k)素数进行试算。对于k <= pi(N)〜N / log N求和,总共产生大约4/3 * N ^(3/2)/(log N)^ 2分。因此,通过忽略复合物,我们发现通过试验划分(仅使用素数)找到N个素数是Omega(N ^ 1.5 /(log N)^ 2)。复合材料的更接近的分析显示,它是Theta(N ^ 1.5 /(log N)^ 2)。使用车轮减少常数因素,但不会改变复杂性。 另一方面,在筛中,将每个复合物作为至少一个素的倍数交叉。取决于您是否在2 * p或p * p处开始偏离,复合材料将被排除多次,因为它具有不同的素因子或不同的素因子< = sqrt(n)。由于任何数字最多只有一个素数因子超过sqrt(n),差异不是很大,它对复杂度没有影响,但是有很多数字只有两个素因子(或三个大于sqrt (n)),因此在运行时间上有明显差异。无论如何,数字n> 0只有几个不同的素数因子,一个琐碎的估计显示,不同素数因子的数量由lg n(基数2对数)界定,所以筛选次数的上限是N * lg N 。 通过计算每个复合体的跨度多少,但是如IVlad已经做的那样,每个素数的倍数有多少,一个很容易发现,跨越数量实际上是Theta(N * log log N)。再次,使用车轮不会改变复杂性,而是减少常数因素。然而,这里的影响比试验部门要大一些,所以至少要跳过evens(除了减少工作,也减少存储大小,从而提高缓存的位置)。 因此,即使忽视该分工比加法和乘法更昂贵,我们看到筛选所需的操作数量远小于试制分割所需的操作数量(如果限制不太小)。 总结:
审判分庭通过划分素材来做无用的工作,筛子通过反复穿过复合材料而做无用的工作。素数相对较少,但是复合材料很多,所以人们可能会觉得审判分裂会浪费更少的工作。
但是,复合材料只有很少的不同的素数因子,而sqrt(p)以下则有许多素数。

翻译自:https://stackoverflow.com/questions/5649068/why-is-sieve-of-eratosthenes-more-efficient-than-the-simple-dumb-algorithm

转载注明原文:为什么扫除Eratosthenes比简单的“哑”算法更有效率?