欧拉函数
joeylu1001 · · 算法·理论
定义
对于任意正整数
性质
-
积性:当且仅当正整数
a, b 满足a \perp b 时,有\varphi(ab) = \varphi(a) \cdot \varphi(b) 。此处只证明充分性,即
a \perp b \Rightarrow \varphi(ab) = \varphi(a) \cdot \varphi(b) 。证明:设小于等于
a 且与a 互质的正整数为x_1, x_2, \cdots, x_{\varphi(a)} ,小于等于b 且与b 互质的正整数为y_1, y_2, \cdots, y_{\varphi(b)} ,小于等于ab 且与ab 互质的正整数为z_1, z_2, \cdots, z_{\varphi(ab)} 。对于关于
t 的同余方程组\begin{cases} t \equiv x_i \pmod a, \\ t \equiv y_j \pmod b, \end{cases} 由中国剩余定理知在模ab 意义下有且仅有一组解。又因为x_i \perp a, y_j \perp b ,所以t \perp a, t \perp b ,t \perp ab ,t 即是某个z 。故对于任意(x_i, y_j) 存在一个z_k 与之对应。对于
z_k 满足z_k \perp ab ,则z_k \perp a, z_k \perp b ,所以z_k \bmod a \perp a, z_k \bmod b \perp b ,z_k \bmod a 即是某个x ,z_k \bmod b 即是某个y 。故对于任意z_k 都存在一组(x_i, y_j) 与之对应。综上,对于任意
(x_i, y_j) 存在唯一一个z_k 与之对应。所以\varphi(ab) = \varphi(a) \cdot \varphi(b) 。 -
反演:
n = \sum _ {d \mid n} \varphi(d) 。证明:对于任意正整数
x ,定义f(x) 为满足\gcd(n, i) = x 且i \le n 的正整数i 的个数,即f(x) = \sum _ {i = 1} ^ n [\gcd(n, i) = x] 。则有n = \sum _ {i = 1} ^ {n} f(i) 。易证若
x \nmid n 则有f(x) = 0 ,所以n = \sum _ {d \mid n} f(d) 。所以 $n = \sum _ {d \mid n} \varphi(\frac{n}{d})$。注意到 $n$ 的因数 $d$ 与 $\frac{n}{d}$ 具有对称性,因此 $n = \sum _ {d \mid n} \varphi(d)$。 -
对于任意质数
p ,有\varphi(p ^ k) = p ^ k - p ^ {k - 1} 。证明:
1 \sim p ^ k 这p ^ k 个数中,不与p _ k 互质的数只有p 的倍数,即p, 2p, 3p, \cdots, p ^ {k - 1} \cdot p 共p ^ {k - 1} 个。所以\varphi(p ^ k) = p ^ k - p ^ {k - 1} 。 -
对于正整数
x ,由唯一分解定理,设x = \prod _ {i = 1} ^ s p _ i ^ {k _ i} ,其中p 为质数。则\varphi(x) = x \cdot \prod _ {i = 1} ^ s (1 - \frac{1}{p_i}) 。证明:
-
推论:
\varphi(ab) = \varphi(a) \cdot \varphi(b) \Rightarrow a \perp b 。显然当
a, b 有公共质因子时\varphi(ab) > \varphi(a) \cdot \varphi(b) 。至此我们证明了欧拉函数的积性。
实现
O(\sqrt{n}) 求解 \varphi(n)
因为
int phi(int n)
{
int res = n;
for (int i = 2; i * i <= n; i++)
if (n % i == 0) // i 是 n 的质因子
{
res = res / i * (i - 1);
while (n % i == 0)
n /= i;
}
if (n != 1)
res = res / n * (n - 1);
return res;
}
O(n) 求解 \varphi(1), \varphi(2), \cdots, \varphi(n)
对于任意
-
若
i = p_i ,即i 是质数,则由性质 3 得\varphi(i) = i - 1 。 -
若
p_i \perp \frac{i}{p_i} ,则由性质 2、3 得\varphi(i) = \varphi(p _ i) \cdot \varphi(\frac{i}{p_i}) = (p _ i - 1) \cdot \varphi(\frac{i}{p_i}) 。 -
若
p_i, \frac{i}{p_i} 不互质,则\varphi(i) = p _ i \cdot \varphi(\frac{i}{p_i}) 。证明:若
p_i, \frac{i}{p_i} 不互质,则一定有p_i 是\frac{i}{p_i} 的质因子。设
i = p ^ k q ,其中p \perp q ,则有\begin{aligned} \varphi(i) &= \varphi(p ^ k q) \\ &= \varphi(p ^ k) \cdot \varphi(q) \\ &= (p ^ k - p ^ {k - 1}) \cdot \varphi(q) \\ &= p \cdot \varphi(p ^ {k - 1}) \cdot \varphi(q) \\ &= p \cdot \varphi(p ^ {k - 1} \cdot q) \\ &= p \cdot \varphi(\frac{i}{p_i}). \end{aligned}
所以我们可以在线性筛的基础上求解欧拉函数。
phi[1] = 1;
for (int i = 2; i <= n; i++)
{
if (phi[i] == 0)
{
p[++p[0]] = i;
phi[i] = i - 1;
}
for (int j = 1; j <= p[0] && i * p[j] <= n; j++)
if (i % p[j] == 0)
{
phi[i * p[j]] = p[j] * phi[i];
break;
}
else
phi[i * p[j]] = (p[j] - 1) * phi[i];
}