[数学基础] 7 欧拉函数
欧拉函数
非常有用的欧拉函数!嗯……好像应该放在四大定理前讲的来着QAQ
1. 欧拉函数的定义
-
定义φ(N)为1~N中与N互质的数,假设N可以表达为p_1^{a_1}\times p_2^{a_2}...p_k^{a_k},\forall i\in [1,k], p_i为质数,a_i>0
则\varphi(N)=N\times (1-\frac{1}{p_1})\times(1-\frac{1}{p_2})...(1-\frac{1}{p_k})
特别的,规定\varphi(1)=1。(唯一和1互质的数就是1本身)
证明:容斥原理
-
先去掉1~N中p_1的倍数,再去掉1~N中p_2的倍数,……直到去掉1~N中p_k的倍数。那么,此时答案就是
N-\frac{N}{p_1}-\frac{N}{p_2}-...-\frac{N}{p_k} -
这个答案,将p_i\times p_j, (i,j\in[1,k], i\neq j)重复减去了多次,需要把它们加回来
N-\frac{N}{p_1}-\frac{N}{p_2}-...-\frac{N}{p_k}+\frac{N}{p_1p_2}+\frac{N}{p_1p_3}+...+\frac{N}{p_{k-1}p_k} -
考虑这样的三元组p_ap_bp_c,它们先是被1中的式子p_a,p_b,p_c减去了三次,又在2中的式子p_ap_b,p_ap_c,p_bp_c中加了三次,总体没加也没减。因此要把三元组的倍数从N中减去
N-\frac{N}{p_1}-\frac{N}{p_2}-...-\frac{N}{p_k}+\frac{N}{p_1p_2}+\frac{N}{p_1p_3}+...+\frac{N}{p_{k-1}p_k}-\frac{N}{p_1p_2p_3}-...-\frac{N}{p_{k-2}p_{k-1}p_{k}} -
以此类推,最终化简上面的式子,可得
N\times(1-\frac{1}{p_1}-...-\frac{1}{p_k}+\frac{1}{p_1p_2}+...+\frac{1}{p_{k-1}p_k}-...)\\=N\times (1-\frac{1}{p_1})\times(1-\frac{1}{p_2})...(1-\frac{1}{p_k})
- 时间复杂度:欧拉函数时间复杂度最大的地方在于分解质因数,因此时间复杂度为O(\sqrt N)。
欧拉函数模板
int phi(int x){
int res = x;
for (int i=2;(ll)i*i<=x;++i){
if (x % i == 0){
res = res / i * (i - 1);
while (x % i == 0) x /= i;
}
}
if (x > 1) res = res / x * (x - 1);
return res;
}
2. 欧拉函数的性质
性质1
- \sum a=\frac{n\times \varphi(n)}{2}, n>1, a\in[1,n),(a,n)=1。
性质2
- \forall n>2,\varphi(n)为偶数。
证明:\because (n,x)=(n,n-x), n>x
假设\exist x\in[1,n),(n,x)=(n,n-x)=1,x=n-x, n>2,则n=2x,矛盾。
\therefore[1,n)中与n互质的数均是成对出现的,因此[1,n)与n互质的数是偶数,即\varphi(n)为偶数。
观察(n,x)=(n,n-x)=1,也说明了任意一对与n互质的数,相加均为n,所以有\sum a = \frac{n\times\varphi(n)}{2}
性质3
- \sum\limits _{d|n} \varphi(d)=n
设f(n)=\varphi * I=\sum\limits _{d|n}\varphi(d),则f(n)为一个积性函数。
将n唯一分解为n= \prod_{i=1}^kp_i^{a_i} = p_1^{a_1}p_2^{a_2}..p_k^{a_k},则
f(p_i^{a_i})=\varphi(1)+\varphi(p_i)+..+\varphi(p_i^{a_k})\\=1+(p-1)+..+(p^k-p^{k-1})=p^k
f(n)=f(p_1^{a_1})\times f(p_2^{a_2})\times ..\times f(p_k^{a_k})=\prod_{i=1}^kp_i^{a_i}=n,证毕。
性质4
- 欧拉函数为积性函数,但不是完全积性函数,当(n,m)=1时,满足\varphi(m\times n)=\varphi(m)\times \varphi(n)。那么显然,当n唯一分解后,\varphi(n)=\prod_{i=1}^k\varphi(p_i^{a_i})。
证明:若(n,m)=1,则n,m没有相同的质因子,记n的质因子个数为c_1,m的质因子个数为c_2,则
\varphi(n)\times \varphi(m)=n\times m\times \prod_{i=1}^{c_1}(1-\frac 1 {p_i})\times \prod_{i=1}^{c_2}(1-\frac 1 {p_i})=\prod_{i=1}^{c_1+c2}(1-\frac 1 {p_i})=\varphi(n\times m)
例题:cf776E The Holmes Children
性质5
- \frac {\varphi(n)} n=\sum\limits_{d\mid n}\frac{\mu(d)}{d}。
写成狄利克雷卷积的形式
\varphi * I=id,\varphi * I * \mu=id * \mu
\varphi * (I * \mu)=id * \mu
\varphi*e=id*\mu
即\varphi(n)=\sum\limits _{d|n}\frac n d\times \mu(d),也就是\frac {\varphi(n)} n=\sum\limits_{d\mid n}\frac{\mu(d)}{d}
性质6
当n=p^k时,\varphi(n)=p^k-p^{k-1}
证明:当n只有一个质因数时,\varphi(n)=p^k\times(1-\frac 1 p)=p^k-p^{k-1}
3. 筛法求欧拉函数
假设目前已知\varphi(i)的值,p_j为某一质数,求\varphi(i\times p_j)的值。
将i表示为p_1^{a_1}\times p_2^{a_2}...p_k^{a_k},\varphi(i)=i\times (1-\frac{1}{p_1})\times(1-\frac{1}{p_2})...(1-\frac{1}{p_k}),
-
i\%p_j==0时,i\times p_j中不存在新的质因子
\therefore \varphi(i\times p_j)=i\times p_j\times (1-\frac{1}{p_1})\times(1-\frac{1}{p_2})...(1-\frac{1}{p_k})=\varphi(i)\times p_j
-
i\%p_j\neq 0时,p_j为新的质因子
\begin{align} & \therefore \varphi(i\times p_j)=i\times p_j\times (1-\frac{1}{p_1})\times(1-\frac{1}{p_2})...(1-\frac{1}{p_k})\times (1-\frac{1}{p_j})\\ & =\varphi(i)\times p_j\times(1-\frac{1}{p_j})\\ & =\varphi(i)\times(p_j-1) \end{align}
- 代码
int n, cnt;
const int N = 1e6 + 10;
int E[N], p[N];
bool st[N];
void Eulers(){
E[1] = 1;
for (int i=2;i<=n;++i){
if (!st[i]){
p[++cnt] = i;
E[i] = i - 1;
}
for (int j=1;p[j]<=n/i;++j){
int t = p[j] * i;
st[t] = true;
if (i % p[j] == 0){
E[t] = E[i] * p[j];
break;
}
E[t] = E[i] * (p[j] - 1);
}
}
}
【推荐】AI 的力量,开发者的翅膀:欢迎使用 AI 原生开发工具 TRAE
【推荐】2025 HarmonyOS 鸿蒙创新赛正式启动,百万大奖等你挑战
【推荐】博客园的心动:当一群程序员决定开源共建一个真诚相亲平台
· 博客园出海记-开篇:扬帆启航
· 关于布尔类型的变量不要加 is 前缀,被网友们吐槽了,特来完善下
· 30 岁 Java 仍在 “霸榜“:开发者凭什么还在为它熬夜?
· C#中的多级缓存架构设计与实现深度解析
· GPT5写5000行代码,行不行?