Loading

「学习笔记」欧拉函数及其证明

Before

耗时一整天,打草纸写了近 \(4\) 页,才终于把所有的基本性质与公式用公式推出来,希望对你有帮助,可以点个赞吗?(期待+疲劳+无力)

定义

对于整数 \(n\),小于等于 \(n\) 中的数中与 \(n\) 互质的数的个数,记作 \(\varphi(n)\)
例如: $\varphi(8) = 4 $ 在 \([1, 8]\) 中,与 \(8\) 互质的数为 \(1, 3, 5, 7\),有 \(4\)

计算通式及证明

\(\varphi(n) = n \times (1 - \frac{1}{p_1}) \times (1 - \frac{1}{p_2}) \ldots \times (1 - \frac{1}{p_n})\)
$(n = p_1^{k_1} \times p_2^{k_2} \times \ldots \times p_n^{k_n}) $
这个的证明过程太麻烦,我用的容斥来证明的,没学的话,先记住这个,所有的减去不互质的就是互质的!


我们来一步一步探究
我们先设 \(n = p_1 p_2 \quad (p_1 \perp p_2)\),我们将 \(n\) 看作是一个 \([1, n]\) 的区间,将区间平均分为 \(p_2\) 段,每段长 \(p_1\),在每一段中,只有最后一个数不与 \(p_1\) 互质(即 \(p_1, 2p_1, 3p_1, \ldots\)),共有 \(p_2\) 段,即有 \(p_2\) 个数不与 \(p_1\) 互质,同理,有 \(p_1\) 个数不与 \(p_2\) 互质
到这里,如果你认为不与 \(p_1 p_2\) 互质的数的个数为 \(p_1 + p_2\),那你就成功的错了,如果你把每个不与 \(p_1 、p_2\) 互质的数全列出来,你会发现,\(n\)\(p_1p_2\),被加了两遍,所以不与 \(p_1 p_2\) 互质的数的个数应该为 \(p_1 + p_2 - 1\),那么,\(\varphi(n) = p_1 p_2 - p_1 - p_2 + 1\),进行化简可以得到 \(\varphi(n) = (p_1 - 1) (p_2 - 1) = \varphi(p_1) \varphi(p_2) = n (1 - \frac{1}{p_1}) (1 - \frac{1}{p_2})\)


我们来进一步探究
\(n = p_1 p_2 p_3 \quad (p_1 \perp p_2 \perp p_3)\),还是将 \(n\) 看作是 \([1, n]\) 的区间,不与 \(p_1\) 互质的数有 \(p_2 p_3\) 个,不与 \(p_2\) 互质的数有 \(p_1 p_3\) 个,不与 \(p_3\) 互质的数有 \(p_1 p_2\) 个,当然,这里面有重复的,我们发现,\(p_1 p_2、p_1 p_3、p_2 p_3\) 的倍数都被加了 \(2\) 遍,即多加了一遍,(为什么?拿 \(p_1 p_2\) 举例子,在平均分成 \(p_1\) 段时加了一遍,在平均分成 \(p_2\) 段时又加了一遍),\(p_1 p_2 p_3、p_1\) 加了 \(3\) 遍,即多加了 \(2\) 遍,我们先减去 \(p_1 p_2、p_1 p_3、p_2 p_3\) 多出来的,即 \(p_1p_2 + p_1p_3 + p_2p_3 - \frac{n}{p_1p_2} - \frac{n}{p_1p_3} - \frac{n}{p_2p_3} = p_1p_2 + p_1p_3 + p_2p_3 - p_3 - p_2 - p_1\),再之后我们在减去 \(p_1p_2p_3\) 多的两遍就行了,对吧?错了!,仔细看这个式子,当我们减去 \(p_3\),即 \(p_1p_2\) 的倍数时,\(p_1p_2p_3\) 也是 \(p_1p_2\) 的倍数,被减了一,其他的同理,所以现在,\(p_1p_2p_3\) 减了 \(3\),而它原来就只加了 \(3\) 遍,所以现在 \(p_1p_2p_3\) 相当于没加,我们还要再 \(+1\),即式子为 \(p_1p_2 + p_1p_3 + p_2p_3 - p_3 - p_2 - p_1 + 1\)\(\varphi(n) = p_1p_2p_3 - p_1p_2 - p_1p_3 - p_2p_3 + p_3 + p_2 + p_1 - 1\)

\[\begin{aligned} \varphi(n) & = p_1p_2p_3 - p_1p_2 - p_1p_3 - p_2p_3 + p_3 + p_2 + p_1 - 1\\ & = p_3(p_1p_2 - p_1 - p_2 + 1) - (p_1p_2 - p_1 - p_2 + 1)\\ & = (p_3 - 1)(p_1p_2 - p_1 - p_2 + 1)\\ & = (p_3 - 1)(p_2(p_1 - 1) - (p_1 - 1))\\ & = (p_3 - 1)(p_2 - 1)(p_1 - 1)\\ & = n(1 - \frac{1}{p_1})(1 - \frac{1}{p_2})(1 - \frac{1}{p_3}) \end{aligned} \]


其实到这里,你可能就发现规律了,如果没有,继续往下看,如果已经发现了,可以跳过这一部分
再进一步探究
\(n = p_1p_2p_3p_4\)
先写出最初的有重复的式子 \(p_2p_3p_4 + p_1p_3p_4 + p_1p_2p_4 + p_1p_2p_3\)
每种变量加入的次数:
\(p_1p_2、p_1p_3、p_1p_4、p_2p_3、p_2p_4、p_3p_4\):加入了 \(2\)
\(p_1p_2p_3、p_1p_2p_4、p_1p_3p_4、p_2p_3p_4\):加入了 \(3\)
\(p_1p_2p_3p_4\):加入了 \(4\)
再写出去重后的式子:
\(p_2p_3p_4 + p_1p_3p_4 + p_1p_2p_4 + p_1p_2p_3 - \frac{n}{p_1p_2} - \frac{n}{p_1p_3} - \frac{n}{p_1p_4} - \frac{n}{p_2p_3} - \frac{n}{p_2p_4} - \frac{n}{p_3p_4} + \frac{n}{p_1p_2p_3} + \frac{n}{p_1p_2p_4} + \frac{n}{p_1p_3p_4} + \frac{n}{p_2p_3p_4} - \frac{n}{p_1p_2p_3p_4}\)
约分得:
\(p_2p_3p_4 + p_1p_3p_4 + p_1p_2p_4 + p_1p_2p_3 - p_3p_4 - p_2p_4 - p_2p_3 - p_1p_4 - p_1p_3 - p_1p_2 + p_4 + p_3 + p_2 + p_1 - 1\)

\[\begin{aligned} \phi(n) & = p_1p_2p_3p_4 - p_2p_3p_4 - p_1p_3p_4 - p_1p_2p_4 - p_1p_2p_3 + p_3p_4 + p_2p_4 + p_2p_3 + p_1p_4 + p_1p_3 + p_1p_2 - p_4 - p_3 - p_2 - p_1 + 1\\ & = p_4(p_1p_2p_3 - p_2p_3 - p_1p_3 - p_1p_2 + p_3 + p_2 + p_1 - 1) - (p_1p_2p_3 - p_2p_3 - p_1p_3 - p_1p_2 + p_3 + p_2 + p_1 - 1)\\ & = (p_4 - 1)(p_1p_2p_3 - p_2p_3 - p_1p_3 - p_1p_2 + p_3 + p_2 + p_1 - 1)\\ & = (p_4 - 1)(p_3 - 1)(p_2 - 1)(p_1 - 1)\\ & = n(1 - \frac{1}{p_1})(1 - \frac{1}{p_2})(1 - \frac{1}{p_3})(1 - \frac{1}{p_4}) \end{aligned} \]


这是一步新的探索,\(n = p_1^2p_2\)
我们发现,\(p_1\) 带了一个平方,但问题不大,还是按照之前的方法来计算,将 \(n\) 看作 \([1, n]\)
不与 \(p_1\) 互质的数的个数为 \(p_1p_2\)
在这里,虽然 \(p_1\) 是带了平方,但是如果再用 \(p_1\) 来划分求不互质的个数,结果是一样的,所以没有这个必要再求一遍
不与 \(p_2\) 互质的数的个数为 \(p_1^2\)
老样子,还是有重复,但这一次,重复的就不只是 \(p_1^1p_2\) 了,我们列举出这些数来看一下
不与 \(p_1\) 互质的数:\(p_1, 2p_1, 3p_1, \ldots , p_2p_1 , \ldots , 2p_2p_1, \ldots p_1p_2p_1\)
不与 \(p_2\) 互质的数:\(p_2, 2p_2, 3p_2, \ldots , p_1p_2 , \ldots , 2p_1p_2, \ldots p_1p_1p_2\)
发现了吗?重复的数都是 \(p_1p_2\) 的倍数,而这个倍数,有 \(\frac{n}{p_1p_2} = p_1\)
所以,式子为:\(p_1p_2 + p_1^2 - p_1\)

\[\begin{aligned} \varphi(n) & = p_1^2p_2 - p_1p_2 - p_1^2 + p_1\\ & = p_1(p_1p_2 - p_2 - p_1^2 + p)\\ & = p_1(p_1 - 1)(p_2 - 1)\\ & = p_1^2p_2(\frac{p_1 - 1}{p_1})(\frac{p_2 - 1}{p_2})\\ & = n(1 - \frac{1}{p_1})(1 - \frac{1}{p_2}) \end{aligned} \]


通过上面我们的一步步推导,我们会发现,只有两个变量组成的变量(\(p_1p_2、p_1p_3\) 之类的,抱歉我不会描述,先姑且称它为二元变量吧QWQ,其他的以此类推)会在计算答案时多加 \(1\) 次,三元变量多加 \(2\) 次,四元变量多加 \(3\) 次,根据规律,我们可以推测得五元变量多加 \(4\) 次,六元变量多加 \(5\) 次……
同时,我们还可以发现,在式子中(这里的式子是求不与 \(n\) 互质的数的个数,不是求 \(\varphi(n)\)),二元变量前面都是 \(-\),三元变量前面是 \(+\),四元变量前面是 \(-\),我们可以以此类推,五元变量前面是 \(+\),六元变量前面是 \(-\)……
通过我们最后推得的式子以及带指数的变量的计算,我们可以推测 \(\varphi(n) = n(1 - \frac{1}{p_1})(1 - \frac{1}{p_2})(1 - \frac{1}{p_3}) \ldots (1 - \frac{1}{p_m}) \quad (n = p_1^{k_1}p_2^{k_2}p_3^{k_3}p_4^{k_4} \ldots p_m^{k_m})\)


性质及证明

以下性质 \(p\) 均为素数
\(1、\) \(\varphi(p) = p - 1\)
证明:这个其实挺好理解的,\(p\) 为素数,它的因子只有 \(1\)\(p\),所以,大于 \(0\) 小于 \(p\) 的数都与 \(p\) 互质,总共有 \(p - 1\) 个数,所以 \(\varphi(p) = p - 1\)
\(2、\) \(\varphi(i \times p) = p \times \varphi(i) \quad (p \mid i)\)
证明:

\[\begin{aligned} \because & \quad p \mid i,且 p 为质数\\ \therefore & \quad i是一个和数,p 是 i 的一个质因子\\ \therefore & \quad i = p^{k} \times a_1^{k_1} \times a_2^{k_2} \times a_3^{k_3} \ldots \times a_n^{k_n}(质因数分解)\\ \therefore & \quad i \times p = p^{k + 1} \times a_1^{k_1} \times a_2^{k_2} \times a_3^{k_3} \ldots \times a_n^{k_n}\\ \because & \quad \varphi(n) = n \times (1 - \frac{1}{p_1}) \times (1 - \frac{1}{p_2}) \ldots \times (1 - \frac{1}{p_n})\\ &(注意,这里只是欧拉函数的计算公式,与前面的证明过程中的变量无关)\\ &(这里 n = p_1^{k_1} \times p_2^{k_2} \times \ldots \times p_n^{k_n})\\ \therefore & \quad \varphi(i \times p) = p \times i \times (1 - \frac{1}{p}) \times (1 - \frac{1}{a_1}) \times (1 - \frac{1}{a_2}) \times \ldots (1 - \frac{1}{a_n})\\ \because & \quad i = p^{k} \times a_1^{k_1} \times a_2^{k_2} \times a_3^{k_3} \ldots \times a_n^{k_n}\\ \therefore & \quad \varphi(i) = i \times (1 - \frac{1}{p}) \times (1 - \frac{1}{a_1}) \ldots \times (1 - \frac{1}{a_n})\\ \therefore & \quad \varphi(i \times p) = p \times \varphi(i)(带入即可) \end{aligned} \]

\(3、\) \(\varphi(i \times p) = (p - 1) \times \varphi(i) \quad (p \nmid i)\)
证明:

\[\begin{aligned} \because & \quad p是质数,且 p \nmid i\\ \therefore & \quad p \perp i\\ \because & \quad i = a_1^{k_1} \times a_2^{k_2} \times a_3^{k_3} \ldots \times a_n^{k_n}, p = p^1\\ \therefore & \quad i \times p = p^1 \times a_1^{k_1} \times a_2^{k_2} \times a_3^{k_3} \ldots \times a_n^{k_n}\\ \therefore & \quad \varphi(i \times p) = i \times p \times (1 - \frac{1}{p}) \times (1 - \frac{1}{a_1}) \times (1 - \frac{1}{a_2}) \times \ldots \times (1 - \frac{1}{a_n})\\ & \quad = (p - 1) \times [i \times (1 - \frac{1}{a_1}) \times (1 - \frac{1}{a_2}) \times \ldots \times (1 - \frac{1}{a_n}))\\ \because & \quad \varphi(i) = i \times (1 - \frac{1}{p}) \times (1 - \frac{1}{a_1}) \ldots \times (1 - \frac{1}{a_n})\\ \therefore & \quad \varphi(i \times p) = (p- 1) \times \varphi(i) \end{aligned} \]

推论、引理

\(1\)\(\varphi(p \times q) = \varphi(p) \times \varphi(q) \quad (p \perp q)\)
这个的证明其实上面已经证过了,也可以用上面的性质 \(3\) 继续往下推一步即可

\[\varphi(p \times q) = (p - 1) \times \varphi(q)\\ \begin{aligned} \because & \quad \varphi(p) = p - 1\\ \therefore & \quad \varphi(p \times q) = \varphi(p) \times \varphi(q)\\ \end{aligned} \]

\(2\)、$\varphi(p^a) = (p - 1) \times p^{a - 1} $
证明: $\varphi(p^a) = (p - 1) \times p^{a - 1} = p^a - p^{a - 1} $
这里我们可以这么理解,我们将区间 \([1, p^a]\) 平均分成 \(p^{a - 1}\) 段,每段长 \(p\),在每段中,只有最后一个数不与 \(p\) 互质(这些数就是 \(p, 2p, 3p \ldots\)),因此,在 \([1, p^a]\) 上,有 \(p ^ {a - 1}\) 个数不与 \(p\) 互质,即 \(a ^ p - a^{p - 1}\) 个,所以 $\varphi(p^a) = (p - 1) \times p^{a - 1} = p^a - p^{a - 1} $

欧拉线性筛

线性筛,又叫欧拉筛,我们利用欧拉函数的性质,再配合线性筛,可以线性求出每个数的 \(\varphi\) 值。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

inline ll read() {
	ll x = 0;
	int fg = 0;
	char ch = getchar();
	while (ch < '0' || ch > '9') {
		fg |= (ch == '-');
		ch = getchar();
	}
	while (ch >= '0' && ch <= '9') {
		x = (x << 3) + (x << 1) + (ch ^ 48);
		ch = getchar();
	}
	return fg ? ~x + 1 : x;
}

const int N = 1e7 + 5;

int n, cnt;
ll phi[N], prime[N];
bool inp[N];

int main() {
	n = read();
	for (int i = 2; i <= n; ++ i) {
		if (!inp[i]) {
			prime[cnt ++] = i;
			phi[i] = i - 1;
		}
		for (int j = 0; j < cnt && i * prime[j] <= n; ++ j) {
			inp[i * prime[j]] = 1;
			if (!(i % prime[j])) {
				phi[i * prime[j]] = phi[i] * prime[j];
				break;
			}
			else {
				phi[i * prime[j]] = phi[i] * phi[prime[j]];
			}
		}
	}
	for (int i = 2; i <= n; ++ i) {
		printf("%lld ", phi[i]);
	}
	return 0;
}
posted @ 2023-01-10 16:48  yi_fan0305  阅读(155)  评论(0编辑  收藏  举报