欧拉函数
欧拉函数的定义:
根据算术基本定理,
欧拉函数的性质:
- 如果
是质数,那么 - 如果
是质数的次方,那么 - 这是因为和
互质的数一定不是 的倍数 - 而
的倍数有 共计 个
- 这是因为和
- 如果
可以分解为两个互质整数乘积,那么 - 注意这里的两个整数是互质的,不一定是质数
- TODO:中国剩余定理证明
欧拉函数的计算:
证明:容斥原理:
- 从
中去掉所有 的倍数 - 上一步删除了很多重复元素,这一步加上
的倍数 - 循环往复……
我们可以看到系数只有正负一两种,而偶数个质因子作为分母都是 -1,奇数个质因子作为分母则是 +1,二者一致,因此公式是正确的。
算法的时间复杂度瓶颈在于对
线性筛求欧拉函数
给定一个正整数
这里注意一个细节:
核心代码:
cpp
void get_euler(int n) {
phi[1] = 1;
for (int i = 2; i <= n; i ++) {
if (!st[i]) {
primes[cnt ++] = i;
phi[i] = i - 1;
}
for (int j = 0; primes[j] <= n / i; j ++) {
st[primes[j] * i] = true;
if (i % primes[j] == 0) {
phi[primes[j] * i] = phi[i] * primes[j];
break;
}
else {
phi[primes[j] * i] = phi[i] * (primes[j] - 1);
}
}
}
}
在 if (i % primes[j] == 0)
没有判定 break
之前,进入该循环的数都是刚用最小质因子筛掉的合数。具体可以参见 31-质数 中的线性筛一节。
phi[primes[j] * i] = phi[i] * primes[j];
:公式phi[primes[j] * i] = phi[i] * (primes[j] - 1);
:积性
欧拉定理
设
证明:对于
可以证明,
而由于
由于
得证。