【学习笔记】欧拉函数
几个基本的定义
数论函数
定义域为正整数的函数
积性函数
(1)若 \(a,b\) 互质,则 \(f(ab) = f(a)f(b)\)
(2)对于一个正整数 \(n\),将其写为 \(n = \prod p_i^{k_i}\),则 \(f(n) = f(p_i^{k_i})f(\frac{n}{p_i^{k_i}}) = \prod f(p_i^{k_i})\)
完全积性函数
在任意条件下,都满足 \(f(ab) = f(a)f(b)\)。
欧拉函数
基本定义
我们定义 \(\varphi(n)\) 为欧拉函数,其定义为不超过 \(n\) 且与 \(n\) 互质的数的个数。
基本性质
性质一
设 \(n = \prod p_i^{k_i}\),那么
\(\varphi(n) = n \prod (1 - \dfrac{1}{p_i})\)
性质二
若 \(a,b\) 互质,那么 \(\varphi(ab) = \varphi(a)\varphi(b)\),即欧拉函数是一个积性函数。
可以通过性质一来证明。
性质三
\(\varphi(p^k) = p^k - p^{k-1} = (p-1)p^{k-1}\)
可以通过性质一来证明。
性质四
若 \(n\) 为奇数,那么存在 \(\varphi(2n) = \varphi(n)\)
可以用欧拉函数的积性来证明。
性质五
若 \(n\) 大于 \(2\),那么存在 \(\varphi(n)\) 为偶数。
所有与 \(n\) 互质的数的和为 \(\dfrac{\varphi(n)}{2}n\) ,因为与 \(n\) 互质的数都是成对存在的,也就是说若存在 \(i\) 与 \(n\) 互质,那么 \(n-i\) 与 \(n\) 也互质,以这个性质就可以得出上文的那个式子
性质六
若 \(n\) 为质数,那么 \(\varphi(n) = n-1\)。
这个是非常显然的。
性质七
\(\sum_{d|n} \varphi(d) = n\)
很有用的一个性质。
线性筛求欧拉函数
(1)若 \(n\) 为质数,根据性质七就好
(2)若 \(i\) 与 \(prime_j\) 不互质,\(\varphi(i \times prime_j) = \varphi(i) \times prime_j\),这个可以通过性质二、三来证明
(3)若 \(i\) 与 \(prime_j\) 互质,\(\varphi(i \times prime_j) = \varphi(i)\varphi(prime_j) = (p-1)\varphi(i)\),可以根据性质二、六证明
代码实现:
点击查看代码
void Phi(long long mx){
phi[1] = 1;
for(long long i=2; i<=mx; i++){ //切记切记 i 从 2 开始,从 1 就会有大错
if(!no_pri[i]){
pri[++size] = i;
phi[i] = i-1;
}
for(long long j=1; j<=size && i * pri[j] <=mx; j++){
no_pri[i * pri[j]] = true;
if(i % pri[j] == 0){
phi[i * pri[j]] = phi[i] * pri[j];
break;
}
else{
phi[i * pri[j]] = phi[i] * (pri[j] - 1);
}
}
}
}
代码解释:
\(pri_i\) 表示第 \(i\) 个质数,\(phi_i\) 表示 \(\varphi(i)\)