首先,在谈到素数筛选法时,先涉及几个小知识点.
1.一个数是否为质数的判定.
质数,只有1和其本身才是其约数,所以我们判定一个数是否为质数,只需要判定2~(N - 1)中是否存在其约数即可,此种方法的时间复杂度为O(N),随着N的增加,效率依然很慢。这里有个O()的方法:对于一个合数,其必用一个约数(除1外)小于等于其平方根(可用反证法证明),所以我们只需要判断2~
之间的数即可.
bool is_prime(int num)
{
const int border = sqrt(num);
for (int i = 2; i <= border; ++i)
if (num % i == 0)
return false;
return 1 != num;
}
2.一个数的质因数分解
对于一个数N的质因数分解,简单一点的方法通过枚举2~N之间的每个数字,如果N值能整除当前枚举的数,则将N值除尽,重复上面的步骤,直到结束.我们可以看出此种方法的时间复杂度为O(N),而我们通过上面介绍的方法,可以将时间复杂度降为O(),原理与判定一个数是否为质数是一样的.
map<int, int> factor(int num)
{
map<int, int> ans;
const int border = sqrt(num);
for (int i = 2; i <= border; ++i)
while (num % i == 0)
++ans[i], num /= i;
if (num > 1)
ans[num] = 1;
return ans;
}
3.欧拉函数
在数论中,对正整数n,欧拉函数是小于或者等于n的数中与n互质的数的个数.假设n的唯一分解式为