「学习笔记」欧拉函数及其证明
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\)
其实到这里,你可能就发现规律了,如果没有,继续往下看,如果已经发现了,可以跳过这一部分
再进一步探究
\(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\)
这是一步新的探索,\(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\)
通过上面我们的一步步推导,我们会发现,只有两个变量组成的变量(\(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)\)
证明:
\(3、\) \(\varphi(i \times p) = (p - 1) \times \varphi(i) \quad (p \nmid i)\)
证明:
推论、引理
\(1\)、\(\varphi(p \times q) = \varphi(p) \times \varphi(q) \quad (p \perp q)\)
这个的证明其实上面已经证过了,也可以用上面的性质 \(3\) 继续往下推一步即可
\(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;
}