欧拉函数
\(\varphi(x) = \sum\limits_{i=1}^x[\gcd(x, i)=1]\),即 \(1 \sim x\) 中与 \(x\) 互质的数的个数。
求法
将 \(n\) 唯一分解,\(n = \prod\limits_{i=1}^m{p_i^{c_i}}\)
证明:
证法一:
设 \(p,q\) 为 \(n\) 的质因子。对于 \(p\),有 \(\frac{n}{p}\) 个数与 n 不互质。对于 \(q\),有 \(\frac{n}{q}\) 个数与 \(n\) 不互质。对于 \(pq\),有 \(\frac{n}{pq}\) 个数与 \(n\) 不互质,但是这种情况包含于前两种情况,所以要去掉,避免重复计算,则 \(1 ~ n\) 中不与 \(n\) 含有共同的因子 \(p, q\) 的个数为 \(n - \frac{n}{p} - \frac{n}{q} + \frac{n}{pq} = n(1 - \frac{1}{p} - \frac{1}{q} + \frac{1}{pq}) = n(1 - \frac{1}{p})(1 - \frac{1}{q})\)。类似的,利用容斥原理可得原式。
证法二:
对于 \(n\) 的一个质因数 \(p\),在 \(1 \sim n\) 中,是 \(p\) 的倍数的个数占比为 \(\frac{1}{p}\),则 \(1 \sim n\) 中,不是 \(p\) 的倍数的占比为 \(1 - \frac{1}{p}\),则 \(1 ~ n\) 中不是 \(n\) 的任意一个质因数的倍数的个数占比为 \(\prod\limits^m_{i=1}{(1 - \frac{1}{p_i})}\),乘上总个数 \(n\) 即可得到原式。
根据\((1)\) 式,可以将 \(n\) 质因数分解求 \(\varphi(n)\),时间复杂度 \(O(\sqrt{n})\)
积性函数
对于函数 \(f\),若 \(\gcd(a,b) = 1, f(ab) = f(a)f(b)\),则称 \(f\) 为积性函数。
对于函数 \(f\),若 \(f(ab) = f(a)f(b)\),则称 \(f\) 为完全积性函数。
性质 1
对于积性函数或完全积性函数 \(f\),存在 \(a \neq 0\),使得 \(f(a) \neq 0\),则 \(f(1) = 1\)
证明:
\(f(a) = f(1 \cdot a) = f(1) \cdot f(a) \Rightarrow f(1) = 1\)
性质 2
对于积性函数 \(f\),\(n\) 唯一分解 \(n = \prod\limits^m_{i=1}{p_i^{c_i}}\),则 \(f(n) = \prod\limits^m_{i=1}{f(p_i^{c_i})}\)
证明:
由积性函数的定义即可得。
性质
性质 1
\(\forall n > 1, 1\sim n\) 中与 \(n\) 互质的数的和为 \(\frac{n\varphi(n)}{2}\)
证明:
因为 \(\gcd(n, x) = \gcd(n, n - x) = 1\),所以与 \(n\) 互质的数总是成对出现,且和为 \(n\),共有 \(\varphi(n)\) 对,因为每个数算了两遍,所以要除以 \(2\),即可得到 \(\frac{n\varphi}{2}\)
性质 2
\(\varphi\) 是积性函数。
证明:
设 \(a,b, \gcd(a, b) = 1\),唯一分解 \(a,b\),\(a=\prod\limits^{m_1}_{i=1}{p_{a,i}^{c_{a,i}}}, b=\prod\limits^{m_2}_{i=1}{p_{b_i}^{c_{b,i}}}\),则 \(\varphi(a)\varphi(b) = a\prod\limits^{m_1}_{i=1}{(1-\frac{1}{p_{a,i}})} \cdot b\prod\limits^{m_2}_{i=1}{(1-\frac{1}{p_{b,i}})}\),因为 \(\gcd(a,b)=1\),所以 \(a\) 与 \(b\) 的质因子没有相同的,则 \(\varphi(ab)=ab\prod\limits^{m_1}_{i=1}{(1-\frac{1}{p_{a,i}})}\prod\limits^{m_2}_{i=1}{(1-\frac{1}{p_{b,i}})} = \varphi(a)\varphi(b)\)
性质 3
\(\forall p \in \mathbb{P},p|n,p^2|n\),则 \(\varphi(n) = \varphi(\frac{n}{p}) \cdot p\)
证明:
将 \(n\) 唯一分解,\(n=\prod\limits^m_{i=1}{p_i^{c_i}}\),因为 \(p^2|n\),所以 \(p\) 对应的指数大于等于 \(2\),则 \(\frac{n}{p}\) 唯一分解后,\(p\) 对应的指数大于等于 \(2\),则 \(n\) 与 \(\frac{n}{p}\) 的质因数集合相同。则 \(\varphi(n)=n\cdot\prod\limits^m_{i=1}(1-\frac{1}{p_i}),\varphi(\frac{n}{p}) = \frac{n}{p}\cdot\prod\limits^m_{i=1}(1-\frac{1}{p_i})\),则 \(\varphi(n) = \varphi(\frac{n}{p})\cdot p\),原命题得证。
性质 4
\(\forall p \in \mathbb{P},p|n,p^2\nmid n\),则 \(\varphi(n) = \varphi(\frac{n}{p}) \cdot (p - 1)\)
证明:
将 \(n\) 唯一分解,根据 \(p|n,p^2\nmid n\) 得 \(p\) 对应的指数为 \(1\),则 \(\gcd(\frac{n}{p},p) = 1\)。因为 \(\varphi\) 是积性函数,所以 \(\varphi(n) = \varphi(\frac{n}{p} \cdot p) = \varphi(\frac{n}{p})\varphi(p)=\varphi(\frac{n}{p})\cdot (p-1)\),原命题得证。
性质 5
\(\sum\limits_{d|n}{\varphi(d)}=n\)
证明:
对于 \(\sum\limits_{P(i)}kf(i)\),若 \(k\) 与 \(i\) 无关,则 \(\sum\limits_{P(i)}kf(i)=k\sum\limits_{P(i)}f(i)\),记为 \((2)\) 式。
设 \(f(n) = \sum\limits_{d|n}{\varphi(d)}\)。设 \(a,b,\gcd(a,b)=1\)。\(f(ab)=\sum\limits_{d|ab}{\varphi(d)}\),因为 \(\gcd(a,b)=1\),即 \(a\) 与 \(b\) 没有相同的因数,则 \(d\) 一定是 \(a\) 的一个因数 \(x\) 乘 \(b\) 的因数 \(y\),则
\( \begin{aligned} &f(ab) \\ &= \sum\limits_{x|a}\sum\limits_{y|b}{\varphi(xy)} \\ &= \sum\limits_{x|a}\sum\limits_{y|b}{\varphi(x)\varphi(y)} \\ &= \sum\limits_{x|a}(\varphi(x)\sum\limits_{y|b}{\varphi(y)}) (将 \varphi(x) 看做 (2) 式的 k) \\ &= (\sum\limits_{x|a}\varphi(x))(\sum\limits_{y|b}\varphi(y)) (将 \sum\limits_{y|b}{\varphi(y)} 看做 (2) 式的 k) \\ &=f(a)f(b) \end{aligned} \)
则 \(f\) 是积性函数。
将 \(n\) 唯一分解,\(n = \prod\limits^m_{i=1}{p_i^{c_i}}\),因为 \(f\) 是积性函数,则 \(f(n) = \prod\limits^m_{i=1}f(p_i^{c_i})\)。
对于 \(p \in \mathbb{P}, k \in \mathbb{N}_+, f(p^k)=\sum\limits_{d|p^k}\varphi(d)\),因为 \(p \in \mathbb{P}\),所以满足 \(d|p^k\) 的 \(d \in \{x | x=p^c,c\in \mathbb{Z} \cap [0, k] \}\),即 \(d \in \{1, p, p^2, p^3, \dots, p^k \}\)。
对于 \(p \in \mathbb{P}, k \in \mathbb{N}_+\), 根据 \((1)\) 式得 \(\varphi(p^k)=p^k \cdot (1 - \frac{1}{p})=p^k-p^{k-1}\)。则 \(f(p^k) = \varphi(1) + \varphi(p) + \varphi(p^2) + \varphi(p^3) + \cdots + \varphi(p^k) = 1 + (p - 1) + (p^2 - p) + (p^3 - p^2) + \cdots + (p^k - p^{k-1}) = p^k\)。
则 \(f(n) = \prod\limits^m_{i=1}f(p_i^{c_i})=\prod\limits^m_{i=1}p_i^{c_i}=n\),原命题得证。
筛法
根据 \(\text{Eratosthenes}\) 筛和 \((1)\) 式,可以在 \(O(n \log\log n)\) 的时间内求 \(2 \sim n\) 中每个数的欧拉函数。
void calc_phi(int n) {
for(int i = 1; i <= n; i++)
phi[i] = i;
for(int i = 2; i <= n; i++)
if(phi[i] == i)
for(int j = i; j <= n; j += i)
f[j] = phi[j] / i * (i - 1);
}
根据 \(\text{Euler}\) 筛,和 \(\varphi\) 的性质 \(3\) 和性质 \(4\),可以从 \(\varphi(\frac{n}{p})\) 推到 \(\varphi(n)\),时间复杂度 \(O(n)\)
int v[N];
int phi[N];
::std::vector<int> ps;
void calc_phi(int n) {
phi[1] = 1;
rep(i, 2, n)
{
if(!v[i]) {
ps.push_back(v[i] = i);
phi[i] = i - 1;
}
for(int j : ps)
{
if(j > v[i] || j > n / i)
break;
v[i * j] = j;
if(i % j == 0)
phi[i * j] = phi[i] * j;
else
phi[i * j] = phi[i] * (j - 1);
}
}
}
例题
#1 - 洛谷 P2398 GCD SUM
给定正整数 \(n\),\(n \leq 10^5\),求 \(\sum\limits_{i=1}^n \sum\limits_{j=1}^n \gcd(i, j)\)
筛出 \(1 \sim n\) 的 \(\varphi\) 然后 O(n) 求即可,总时间复杂度 \(O(n + n) = O(n)\)
#2 - 洛谷 P2158 [SDOI2008] 仪仗队
点 \((x, y), x> 1,y>1\) 当且仅当 \(gcd(x,y)=1\) 时被看到。
证明:反证法。假设存在最小的一组正整数对 \((a, b),1<a<x,1<b<y\),可以挡住 \((x, y)\),那么 \((a,b)\),一定满足 \(b = \frac{y}{x}\cdot a \Rightarrow x \cdot b = y \cdot a\),\((a, b)\) 即为 \((\frac{\text{lcm}(a,b)}{y},\frac{\text{lcm}(a,b)}{x})\),因为 \(x \cdot y = \gcd(x, y) \cdot \text{lcm}(a, b), \gcd(x, y)=1\),所以 \((a,b) = (x, y)\),与 \(a < x, b < y\) 矛盾,故原命题成立。
可见点的分布关于 \(y=x\) 对称,所以求一半在乘 \(2\) 即可。对于 \(x,x>1\),与 \(x\) 互质且在 \(1 \sim n-1\) 的 \(y\) 有 \(\varphi(x)\) 个。答案即为 \(3 + 2 \cdot \sum\limits_{i=2}^{n-1}\),加 \(3\) 是因为有 \((1, 1),(1, 2),(2, 1)\) 这三个特殊点。
#3 - 洛谷 P2568 GCD
给定正整数 \(n, n \leq 10^7\),求 \(\sum\limits_{i=1}^n\sum\limits_{j=1}^n[\gcd(i,j) \in \mathbb{P}]\)
设 \(f(x) = \sum\limits_{i=1}^x\sum\limits_{j=1}^x[\gcd(i,j) = 1]\),显然有 \(f(1) = 1\)。若已知 \(f(n-1)\),考虑求 \(f(n)\),对于 \(1 \sim n - 1\) ,和 \(n\) 互质的有 \(\varphi(n)\),反过来,对于 \(n\),和 \(1 \sim n - 1\) 之中的数互质的有 \(\varphi(n)\),则 \(f(n) = f(n - 1) + 2 \cdot \varphi(n)\)。则 \(\sum\limits_{i=1}^n\sum\limits_{j=1}^n[\gcd(i,j) \in \mathbb{P}] = \sum\limits_{p<=n,p\in\mathbb{P}}f(\lfloor\frac{n}{p}\rfloor)\)
\(O(n)\) 求 \(1 \sim n\) 的 \(\varphi\),\(O(n)\) 求 \(1 \sim n\) 的 \(f\),\(O(\pi(n))\) 求答案,总时间复杂度 \(O(n)\)
#4 - 洛谷 P2303 [SDOI2012] Longge 的问题
洛谷 P2303 [SDOI2012] Longge 的问题
给定正整数 \(n, n < 2^{32}\),求 \(\sum\limits^n_{i=1}\gcd(i, n)\)
将 \(n\) 质因数分解,dfs 枚举 \(n\) 的因子 \(d\),枚举的时候根据 \((1)\) 式求 \(\varphi(d)\),总时间复杂度 \(O(\sqrt n + 2\sqrt n) = O(\sqrt n)\)
ll ps[30], c[30], pp = 0;
void pd(ll n) {
pp = 0;
for(ll i = 2; i <= n / i; i++)
if(n % i == 0) {
c[++pp] = 0;
ps[pp] = i;
while(n % i == 0)
c[pp]++, n /= i;
}
if(n > 1)
c[++pp] = 1, ps[pp] = n;
}
ll n;
ll ans = 0;
void dfs(ll s, int p) {
if(p == pp + 1) {
ans += s;
return;
}
for(int i = 0; i <= c[p]; i++)
if(i)
dfs(s * (ps[p] - 1) / ps[p], p + 1);
else
dfs(s, p + 1);
}
int main() {
scanf("%lld", &n);
pd(n);
dfs(n, 1);
printf("%lld", ans);
return 0;
}