欧拉函数

\(\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}}\)

\[\varphi(n) = n \cdot \prod\limits_{i=1}^m{(1 - \frac{1}{p_i})} \tag{1} \]

证明:

证法一:

\(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}) = \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

洛谷 P2398 GCD SUM

给定正整数 \(n\)\(n \leq 10^5\),求 \(\sum\limits_{i=1}^n \sum\limits_{j=1}^n \gcd(i, j)\)

\[\begin{aligned} &\sum\limits_{i=1}^n \sum\limits_{j=1}^n \gcd(i, j) \\ &=\sum\limits_{i=1}^n \sum\limits_{j=1}^n\sum\limits_{d|\gcd(i,j)}\varphi(d)\\ &=\sum\limits_{i=1}^n \sum\limits_{j=1}^n\sum\limits_{d|i,d|j}\varphi(d) \\ &=\sum\limits_{i=1}^n \sum\limits_{j=1}^n\sum\limits_{d=1}^n[d|i][d|j]\varphi(d) \\ &=\sum\limits_{d=1}^n\sum\limits_{i=1}^n \sum\limits_{j=1}^n[d|i][d|j]\varphi(d) \\ &=\sum\limits_{d=1}^n\varphi(d)\sum\limits_{i=1}^n \sum\limits_{j=1}^n[d|i][d|j] \\ &=\sum\limits_{d=1}^n\varphi(d)\sum\limits_{i=1}^n[d|i]\sum\limits_{j=1}^n[d|j] \\ &=\sum\limits_{d=1}^n\varphi(d)\lfloor\frac{n}{d}\rfloor^2\\ \end{aligned} \]

筛出 \(1 \sim n\)\(\varphi\) 然后 O(n) 求即可,总时间复杂度 \(O(n + n) = O(n)\)


#2 - 洛谷 P2158 [SDOI2008] 仪仗队

洛谷 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

洛谷 P2568 GCD

给定正整数 \(n, n \leq 10^7\),求 \(\sum\limits_{i=1}^n\sum\limits_{j=1}^n[\gcd(i,j) \in \mathbb{P}]\)

\[\begin{aligned} & \sum\limits_{i=1}^n\sum\limits_{j=1}^n[\gcd(i,j) \in \mathbb{P}] \\ &= \sum\limits_{p<=n,p\in\mathbb{P}}\sum\limits_{i=1}^n\sum\limits_{j=1}^n[\gcd(i,j) = p] \\ &= \sum\limits_{p<=n,p\in\mathbb{P}}\sum\limits_{i=1}^{\frac{n}{p}}\sum\limits_{j=1}^{\frac{n}{p}}[\gcd(i,j) = 1] \end{aligned} \]

\(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)\)

\[\begin{aligned} & \sum\limits^n_{i=1}\gcd(i, n) \\ &= \sum\limits^n_{i=1}\sum\limits_{d|gcd(i,n)}\varphi(d) \\ &= \sum\limits^n_{i=1}\sum\limits_{d|i,d|n}\varphi(d) \\ &= \sum\limits^n_{i=1}\sum\limits_{d|i,d|n}\varphi(d) \\ &= \sum\limits^n_{i=1}\sum\limits_{d|n}^n[d|i]\varphi(d) \\ &= \sum\limits_{d|n}^n\varphi(d)\sum\limits^n_{i=1}[d|i] \\ &= \sum\limits_{d|n}^n\varphi(d)\lfloor\frac{n}{d}\rfloor \\ \end{aligned} \]

\(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;
}
posted @ 2024-07-08 07:34  kuailedetongnian  阅读(12)  评论(0编辑  收藏  举报