素数筛用于快速判断一定范围内的所有数是不是素数,常见的有暴力法、埃及筛、欧拉筛,算法复杂度从高到低,下面介绍一下埃及筛:
数学基础:
对于任意一个大于等于2的正整数K,都可以分解成n个素数的乘积,比如 24 = 2 ^ 2 * 3 ^ 2。
主要思路:
所以我们可以从2开始遍历每个数(范围:2~Math.sqrt(n)),如果当前的数是素数,则将它的倍数筛去,当遍历到一个合数时,它已经被之前的素数给筛掉了。
public class Prime{
public boolean[] getPrime(long n){
int len = (int) Math.sqrt(n);
// 用于记录下标i的数字是否是素数(质数),默认都是素数
boolean[] notPrime = new boolean[(int) (len)];
//从2开始,如果当前是素数,那么它的倍数就是合数。
for(int i = 2; i * i <= len; i++) {
if(!notPrime[i]) {
// i * (i - 1), i * (i - 2), ... i * 2,
// 以上 数字,也就是i的2~(i - 1)的倍数,在之前已经筛过了,所以从i * i开始
for(int j = i * i; j <= len; j += i) {
notPrime[j] = true;
}
}
}
return notPrime;
}
}