[学习笔记] 欧拉函数
欧拉函数
定义
\(\phi(n)\) 表示\(1 ~ n\)中与\(n\)互质的数。
这里有个通项公式\(\phi(n) = n * \prod_{p|k} (1-\frac{1}{p})\)
证明可以先考虑 只有两个质因数的情况,再用数学归纳法去做。
性质
由通式得到
1.若\(n\)是质数,\(\phi(n)=n-1\)
2.若\(n\)是质数,\(\phi(n^k)=n^k*(1-\frac{1}{n})=n^k - n^{k-1}\)
3.若\(n\)和\(m\)是质数,\(\phi(n*m) = \phi(n)*\phi(m)\) (积性函数) 可以用通式直接推。
4.若\(n\)为奇数,那么\(n\)没有\(2\)这个质因数,那么\(\phi(2n)=2*\phi(n)*\frac{1}{2}=\phi(n)\)
欧拉公式
1.对于互质的\(a\)和\(b\),则\(a^{\phi(b)}\bmod b = 1\)
2.对于互质的\(a\)和\(b\),则\(a^{b-1} \bmod b = 1\)
其他
1.所有小于\(n\)与\(n\)互质的数的和\(sum = n*\frac{\phi(n)}{2}\)
2.如果\(a \bmod b = 0\),那么\(\phi(a*b) = \phi(a)*b\),否则\(\phi(a*b)=\phi(a)*(b-1)\)
3.\(\sum_{d|n} \phi(d) = n\)
4.\(\sum_{d|n} \mu(d)* \frac{n}{d} = \sum_{d|n} \mu(\frac{n}{d})*d = \phi(n)\)
证明
1.首先一个结论若\(\gcd(n, i) = 0\),那么\(\gcd(n,n-i) = 0\) 说明这些数都是成对出现的,所以可以用类似等差数列的做法证明。
递推求法
inline void init() {
phi[1] = 1;
for (int i = 2; i <= n; i++) {
if (!flag[i]) {
prime[++tot] = i;
phi[i] = i - 1;
}
for (int j = 1; j <= tot && prime[j] * i <= n; j++) {
flag[i * prime[j]] = 1;
if (i % prime[j] == 0) {
phi[i * prime[j]] = phi[i] * prime[j];
} else {
phi[i * prime[j]] = phi[i] * phi[prime[j]];
}
}
}
}