Euler筛法
介绍
这是复杂度非常低的一个素数筛法,大部分资料显示时间复杂度仅为 O(n) ,其核心在于对于每一个数仅仅筛了一次.
标准代码
void euler_sieve(int n) {
totPrimes = 0;
for (int i = 2; i <= n; i++) {
if (!flag[i])
primes[totPrimes++] = i;
for (int j = 0; i * primes[j] <= n; j++) {
flag[i * primes[j]] = true;
if (i % primes[j] == 0)
break;
}
}
}
解释
首先很容易看出, i⋅prime[i] 表示由 i (不一定是质数)乘上一个质数
那么怎么做才能只筛一次?关键是找出每个合数的独一无二的特性,根据这个特性去筛.
重要结论
n=Factormax⋅P
每个合数 n 都可以表示成这种形式,其中