埃拉托斯特尼筛法,简称埃氏筛,也有人称素数筛。这是一种简单且历史悠久的筛法,用来找出一定范围内所有的素数。
本文主要内容为四种筛选法的原理介绍和具体实现(C++),并对比它们之间的性能差距。这四种筛选法分别是:经典筛选法、采用了欧拉函数的线性筛选法,以及个人对这两种筛选法的改进。
经典筛选法
原理简介
关于经典筛选法,维基百科上的动图能很好地解释其原理。先用2去筛,即把2留下,把2的倍数剔除掉;再用下一个素数,也就是3筛,把3留下,把3的倍数剔除掉;接下去用下一个素数5筛,把5留下,把5的倍数剔除掉;不断重复下去…
具体实现
#define MAX 100000000 // 求一亿范围内的素数
long prime_numbers[6000000], n = 0; // 一亿内有500多万个素数
void eratosthenes() {
static bool not_prime_flag[MAX]; // 假设所有数都为素数
for (long num = 2; num < MAX; num++) {
if (!not_prime_flag[num]) {
prime_numbers[n++] = num;
for (long times = 2; times * num < MAX; times += 1) {
not_prime_flag[times * num] = true; // 将素数的倍数剔除掉
}
}
}
}<