欧拉函数
欧拉函数
与\(n\)互质的数的个数,记作\(\varphi(n)\)。
这个函数的求解:\(\varphi(n)=n\prod_{p_i}(1-\frac{1}{p_i})\),其中\(p_i\)是\(n\)的质因子。
\(Proof\):
\[用容斥
\]
\[\varphi(n)=n-\frac{n}{p_1}-\frac{n}{p_2}-\dotsb+\frac{n}{p_1p_2}+\frac{n}{p_1p_3}-\dotsb\frac{n}{p_1p_2p_3}-\dotsb
\]
\[(显然这里所有的除法均能整除)
\]
\[提出其中一个素因子:
\]
\[\begin{aligned}
\varphi(n)&=n[(1-\frac{1}{p_1}-\frac{1}{p_2}\dotsb-\frac{1}{p_{s-1}}+\frac{1}{p_1p_2}+\frac{1}{p_1p_3}+\dotsb)-\frac{1}{p_s}(1-\frac{1}{p_1}-\frac{1}{p_2}\dotsb-\frac{1}{p_{s-1}}+\frac{1}{p_1p_2}+\frac{1}{p_1p_3}+\dotsb)]\\
&=n(1-\frac{1}{p_s})(1-\frac{1}{p_1}-\frac{1}{p_2}\dotsb-\frac{1}{p_{s-1}}+\frac{1}{p_1p_2}+\frac{1}{p_1p_3}+\dotsb)\\
&=\dotsb \\
&=n\prod_{p_i}(1-\frac{1}{p_i})
\end{aligned}
\]
解释下:就是每次在容斥的式子里面提出一个素因子,剩下的因式与没有该素因子的式子一样,可以合并,于是命题得证。
由此,我们看出\(\varphi(n)\)是积性函数,可以用线性筛求解。
int p[maxn], check[maxn], phi[maxn];
void init(int N) {
check[1] = 1; phi[1] = 1;
rep(i, 2, N) {
if (!check[i]) { p[++p[0]] = i, phi[i] = i-1; }
for (int j = 1; j <= p[0] && i*p[j] <= N; j++) {
check[i*p[j]] = 1;
if (!(p[j] % i)) {
phi[i*p[j]] = phi[i]*p[j]; // 不互质
break;
}
phi[i*p[j]] = phi[i]*(p[j]-1); // 互质
}
}
}
当\(n>2\)时,互质的数是成对出现的,若\((n,m)=1\),则\((n,n-m)=1\),显然\(m\neq n-m\),这一有用的性质可以证明:所有与\(n\)互质的数的和为\(\frac{n\varphi(n)}{2}\)。\(n\leq 2\)时特殊代入一下即可。