您的位置:首页 > 其它

素数线性筛选

2015-07-21 10:21 176 查看
因为线性筛选的原理是利用每个合数的最小质因子去筛选

[code]if(i % prime[k] == 0)  
    break;


这是让复杂度达到O(N)的关键一句。原理如下:

因为 i%prime[k] == 0 所以 prime[k] 是 i 的最小质因子

所以 i 可以分解成某个数乘以 prime[k] 即 i = n * prime[k]

我们下一个要筛选的素数是i * prime[k+1] ,然后我们分解 i 得到

n * prime[k] * prime[k+1] , 很明显这个素数可以由较大的数乘以prime[k]筛选掉

还有除了 2, 3 以外只有 6N+1,或者 6N+5 才会是素数。

6N,6N+2, 6N+3, 6N+4分别至少能被2, 2, 3, 2整除,所以不可能是素数。

[code]int dis[2] = {4, 2};
bool isprime[100000005];
int prime[6000000], top;

void Prime()
{
    int i, k, pos = 0;
    top = 0;
    prime[top++] = 2;
    prime[top++] = 3;
    for(i = 5; i <= 100000000; i += dis[pos ^= 1]){
        if(!isprime[i])
            prime[top++] = i;
        for(k = 0; i*prime[k] <= 100000000 && k < top; k++){
            isprime[i*prime[k]] = true;
            if(i % prime[k] == 0)
                break;
        }
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: