根据素调和渐进为 O(lglgn) 这个命题,容易得出埃氏筛(特指下方的非标准代码)的时间复杂度为 O(nlglgn):
for (int i = 1; i <= n; i ++) {
if (notprime[i]) continue;
primes.push_back(i);
for (int j = i + i; j <= n; j += i)
notprime[j] = true;
}
但这与网上的普遍表述不统一,大部分材料都称上代码的时间复杂度为 O(nlgn) 的。
根据素调和渐进,上述代码的时间复杂度就应该是 O(nlglgn) 的,下面,我们认为该命题正确。
那么,这样子就可以引申出一个更深的问题。首先参见下面的标准埃氏筛代码:
for(int i = 1; i <= n; i ++) {
if (notprime[i]) continue;
primes.push_back(i);
for (int j = i * i; j <= n; j += i)
notprime[j] = true;
}
对于这份代码,大家的观点都是统一的 O(nlglgn),母庸置疑。
那么,注意到对于每一个 i∈P,标准代码都比错误代码少筛了 i 次,总和也就是素数和。
那么,如果时间复杂度都相同,这能否说明,素数和的渐进就是 O(nlglgn) 呢?
关于这个命题,我在网上没有找到相关证明,求大佬解惑。