- ChungZH 的博客
欧拉函数笔记
- 2023-4-2 11:33:04 @
定义
欧拉函数 表示小于等于 ,且与 互质的正整数的个数。
如何求 ?
比如 把 质因数分解,,其实就是得到了 和 两个互异的质因子。
然后把 的倍数和 的倍数都删掉。
的倍数:
的倍数:
但是是 和 重复减了。所以还要把既是 的倍数又是 的倍数的数加回来。所以这样写:。运用了容斥原理。
性质
-
欧拉函数是积性函数。
积性是什么意思呢?如果有 ,那么 。
特别地,当 是奇数时 。
-
。
证明: 也可以这样考虑:如果 ,那么 。 如果我们设 表示 的数的个数,那么 。 根据上面的证明,我们发现,,从而 。注意到约数 和 具有对称性,所以上式化为 。
-
若 ,其中 是质数,那么 。(根据定义可知)
-
由唯一分解定理,设 ,其中 是质数,有 $\varphi(n) = n \times \prod_{i = 1}^s{\dfrac{p_i - 1}{p_i}}$。
证明:
引理:设 为任意质数,那么 。
证明:显然对于从 1 到 的所有数中,除了 个 的倍数以外其它数都与 互素,故 ,证毕。
接下来我们证明 $\varphi(n) = n \times \prod_{i = 1}^s{\dfrac{p_i - 1}{p_i}}$。由唯一分解定理与 函数的积性
$$\begin{aligned} \varphi(n) &= \prod_{i=1}^{s} \varphi(p_i^{k_i}) \\ &= \prod_{i=1}^{s} (p_i-1)\times {p_i}^{k_i-1}\\ &=\prod_{i=1}^{s} {p_i}^{k_i} \times(1 - \frac{1}{p_i})\\ &=n~ \prod_{i=1}^{s} (1- \frac{1}{p_i}) &\square \end{aligned} $$ -
$\varphi(a*b)=\varphi(a)*\varphi(b)*\frac{d}{\varphi(d)}$,其中
求一个数的欧拉函数值
int euler_phi(int n) {
int ans = n;
for (int i = 2; i * i <= n; i++)
if (n % i == 0) {
ans = ans / i * (i - 1);
while (n % i == 0) n /= i;
}
if (n > 1) ans = ans / n * (n - 1);
return ans;
}
线性筛求欧拉函数
在线性筛中,每一个合数都被最小的质因子筛掉。设 是 的最小质因子,,那么 通过 筛掉。
对 分类讨论。
- ,那么 包含了 的所有质因子。
- ,此时 与 互质,根据欧拉函数的性质,我们有:
void sieve() {
memset(isprime, true, sizeof isprime);
tot = 0;
isprime[1] = 0;
phi[1] = 1;
for (int i = 2; i <= n; i++) {
if (isprime[i]) {
prime[++tot] = i;
phi[i] = i-1;
}
for (int j = 1; j <= tot && prime[j]*i <= n; j++) {
isprime[prime[j]*i] = 0;
if (i%prime[j] == 0) {
phi[i*prime[j]] = phi[i]*prime[j];
break;
}
phi[i*prime[j]] = phi[i]*phi[prime[j]];
}
}
}