研究欧拉函数有感

欧拉函数 (\(\varphi\)),读法为 fai(四声)。

定义

\(\varphi(n)\) 表示有多少个不大于 \(n\) 的正整数与 \(n\) 互质。 特别的 \(\varphi(1)=1\)

性质:

  1. 积性函数,及如果有 \(a\bot b\), 就有 \(\varphi(a\times b)=\varphi(a)\times\varphi(b)\)
    证明:
    如果有 \(a\bot b\),那么 \(a\)\(b\) 就没有大于 \(1\) 的公因数,于是就有这个积性函数的性质。
    也可以看下面的性质三推式子:
    \(a=p_1^{k_1}\times p_2^{k_2}\times \cdots p_m^{k_m}\), \(b=q_1^{w_1}\times q_2^{w_2}\times \cdots q_m^{w_u}\)
    \(\because a\bot b\ \therefore\) 没有任何一个 \(p\) 和任何一个 \(q\) 相同。
    \(\varphi(a\times b)=\prod_{i=1}^{i\leq m} \frac{p_i-1}{p_i}\times \prod_{i=1}^{i\leq u} \frac{q_i-1}{q_i}=\varphi(a)\times \varphi(b)\)
  2. \(\forall n \in \mathbb{P}\),\(\varphi(n^k)=n^k-n^{k-1}=n^{k}\times(1-p^{-1})=n^k\times (1-\frac{1}{p})\)
    证明:
    可以知道 \([1, n^k]\) 里面一共有 \(n^k\) 个数。其中因为 \(n\in \mathbb{P}\),所以满足 \(x|n\) 的数是 \(n^k\) 的因数,这些数为 \(n, n^2, n^3\cdots n^{k-1}\times n\),显然一共有 \(n^{k-1}\) 个数,减去这 \(n^{k-1}\) 个数就可以得到 \(\varphi(n^k)\)
  3. \(n=p_1^{k_1}\times p_2^{k_2}\times p_3^{k_3}\times \cdots p_r^{k_r}\),则有 \(\varphi(n)=n\times\prod_{i=1}^{i\leq r} \frac{p_i-1}{p_i}\)
    证明:
  • 容斥原理:
    假设有 \(n\) 有两个质因数 \(a,b\),那么对于 \(x\in [1, n]\),有 \(\frac{n}{a}\) 个数是 \(a\) 的因数, 有 \(\frac{n}{b}\) 个数是 \(b\) 的因数,有 \(\frac{n}{a\times b}\) 个数是 \(a\times b\) 的因数。显然只考虑 \(a, b\) 的因数就有 \(n-\frac{n}{a}-\frac{n}{b}+\frac{n}{a\times b}\) 个数与 \(n\) 互质。其中因为 \(a\times b\) 的因数被算了两次,所以这里我们将其减去。对于多个质因数我们也可以这样算。同时,上面的式子还可以用十字相乘化简 \(n\times(1-\frac{1}{a}-\frac{1}{b}+\frac{1}{a\times b})=n\times(1-\frac{1}{a})\times(1-\frac{1}{b})\)。可得上面的公式。
  • 利用性质 2:
    通过性质 1 可以知道 \(\varphi(n)=\varphi(p_1^{k_1})\times\varphi(p_2^{k_2})\cdots \times\varphi(p_r^{k_r})=(p_1^{k_1}\times (1-\frac{1}{p_1}))\times(p_2^{k_2}\times (1-\frac{1}{p_2}))\cdots \times(p_r^{k_r}\times (1-\frac{1}{p_r}))=p_1^{k_1}\times p_2^{k_2}\times \cdots \times p_r^{k_r}\times (1-\frac{1}{p_1})\times(1-\frac{1}{p_2})\times \cdots \times(1-\frac{1}{p_r})=n\times\prod_{i=1}^{i\leq r} \frac{p_i-1}{p_i}\)
  1. 所有不大于 \(n\) 的数中与 \(n\) 互质的数的和为 \(\frac{n\times\varphi(n)}{2}\)
    证明:
    \(\gcd(n, x)=\gcd(n, n - x)\) 可知,当一个数 \(x\) 满足 \(\gcd(n,x)=1\) 时,就会有一个数 \(n-x\) 满足 \(\gcd(n,n-x)=1\),及这些数是成对出现的,他们的平均数是 \((n-x+x)\div 2\)\(\frac{n}{2}\),因为一共有 \(\varphi(n)\) 个数与 \(n\) 互质,所以他们的和就是 \(\frac{n\times\varphi(n)}{2}\)
  2. 欧拉反演:\(\sum_{x|n}\varphi(x)=n\)
    证明
    \(f(n)=\sum_{x|n}\varphi(x)\),则有 \(f\) 是一个积性函数。
    \(\forall\ n\bot m,f(n\times m)=\sum_{x|n\times m}\varphi(x)=\sum_{x|n}\varphi(x)\times \sum_{x|m}\varphi(x)=f(n)\times f(m)\)
    于是 \(f(n)=\prod_{i=1}^{i\leq r} f(p_i^{k_i})\)
    先研究 \(l\in \mathbb{P}, f(l^k)\), 发现其中满足是 \(l\) 的因数的数有 \(1,l, l^2, l^3\cdots l^k\)\(f(l^k)=\varphi(1) + \varphi(l)+ \varphi(l^2)+ \varphi(l^3)\cdots + \varphi(l^k)\),有性质 2 可知 \(f(l^k)=1+l-l^0+l^2-l^1+\cdots +l^k-l^{k-1}\) 可以发现其中的项相互抵消了,最后只剩下了 \(l^k\),即 \(\forall x\in \mathbb{P},\ f(x^k)=x^k\)
    于是就有 \(f(n)=\prod_{i=1}^{i\leq r} f(p_i^{k_i})=\prod_{i=1}^{i\leq r} p_i^{k_i}=n\)。 即 \(\sum_{x|n}\varphi(x)=n\)
  3. 如果有 \(p\) 为质数, \(p\mid n\) 并且有 \(p^2 \mid n\) 于是就有 \(\varphi(p)=\varphi(\frac{n}{p})\times p\)
    证明
    可以把 \(n\) 看作 \(x\times p^2\),于是 \(\frac{n}{p}=x\times p\),可以发现除了指数不一样,其他的因数都是一样的,而欧拉函数计算的表达式中只和因数 有关,而不是和指数有关,于是这里就可以得到两个式子,\(\varphi(p)=p\times \prod_{i=1}^{i\leq r} \frac{p_i-1}{p_i}, \varphi(\frac{n}{p})=\frac{n}{p} \times \prod_{i=1}^{i\leq r} \frac{p_i-1}{p_i}\),于是就有 \(\frac{\varphi(p)}{\varphi(\frac{n}{p})}=p\),化简一下就和上面的式子一样了。
  4. 如果有 \(p\) 为质数, \(p\mid n\),但是有 \(p^2 \nmid n\),有 \(\varphi(p)=\varphi(\frac{n}{p})\times(p - 1)\)
    证明
    因为有 \(p^2 \nmid n\),于是就有 \(p \nmid \frac{n}{p}\),于是 \(p \bot \frac{n}{p}\),由于 \(\varphi\) 是积性函数,于是就有 \(\varphi(n)=\varphi(\frac{n}{p})\times \varphi(p)\),又因为 \(p\) 是质数,于是 \(\varphi(p)=p-1\),于是既有上面的结论乐。

怎么求

首先就有一种简单的方式求单个的,对于一个数,我们将其分解质因数,带进公式里面,然后就发现做完了。

还有一种更加合理的方法可以在 \(\mathbb{O(n)}\) 的复杂度里面解决 \([1, n]\) 的欧拉函数,具体思想就是线性筛。

我们知道,线性筛可以得到一个数的最小质因数,然后我们就可以通过性质 6 和性质 7 对其进行递推求解,具体代码见下:

phi[1] = 1;
rep (i, 2, n) {
	if (!pri[i]) {
		pri[++pri[0]] = i;
		phi[i] = i - 1;
	}
	rep (j, 1, pri[0]) {
		pri[i * pri[j]] = 1;
		if (i % pri[j] == 0) {
			phi[i * pri[j]] = phi[i] * pri[j];
			break;
		}
		phi[i * pri[j]] = phi[i] * (pri[j] - 1);
		if (pri[j] * i > n) break;
	}
}
posted @ 2023-03-05 15:47  落花月朦胧  阅读(63)  评论(0编辑  收藏  举报