欧拉函数及欧拉定理&逆元学习笔记
——by sunzz3183
欧拉函数
定义
φ(n)=n∑i=1[gcd(n,i)=1]
根据容斥可得
φ(n)=nk∏i=1(1−1pi)
所以可得以下代码
inline int euler(int x){
int res=x;
for(int i=2;i*i<=x;i++)
if(!(x%i)){
res=res/i*(i-1);
while(!(x%i))x/=i;
}
if(x>1)res=res/x*(x-1);
return res;
}
筛法
原理
φ(n)=nk∏i=1(1−1pi)
所以:
- 当 n 为质数的时候 φ(n)=n−1
- 设 d=np 其中 p为 n 的最小质因子。
-
当 p 是 d 的某个质因子时,则 φ(n)=φ(d)×p
-
当 p 与 d 互质时,φ(n)=φ(d)×φ(p)
所以,欧拉函数为积性函数(当 x⊥y 时, φ(xy)=φ(x)×φ(y))
代码
int cnt,prime[M],phi[N],mu[N];
bool is_p[N];
void init(int n){
phi[1]=mu[1]=1;
for(int i=2;i<=n;i++){
if(!is_p[i])prime[++cnt]=i,phi[i]=i-1,mu[i]=-1;
for(int j=1;j<=cnt&&i*prime[j]<=n;j++){
is_p[i*prime[j]]=1;
if(!(i%prime[j])){
phi[i*prime[j]]=phi[i]*prime[j];
mu[i*prime[j]]=0;
break;
}
phi[i*prime[j]]=phi[i]*(prime[j]-1);
mu[i*prime[j]]=-mu[i];
}
}
}
重要公式:
(1)
∑d|nφ(d)=n
证明:
设 f(n)=∑d|nφ(d)
由筛法的原理1,2可知
φ(pk)=φ(p)×pk−1=(p−1)×pk−1=pk−pk−1
对于
∑d|pkφ(d)
显然,d={p0,p1,p2,...,pk}。那么有
=k∑i=0φ(pi)=(k∑i=1pi−pi−1)+1=pk−pk−1+pk−1−pk−2+...+p−1+1=pk
∴f(pk)=pk
∵f(ab)=∑d|abφ(d)=(∑d|aφ(d))×(∑d|bφ(d))=f(a)×f(b)
∴f(n)为积性函数。
∴f(n)=f(pc11×pc22×pc33×...×pckk)=f(pc11)×f(pc22)×f(pc33)×...×f(pckk)=pc11×pc22×pc33×...×pckk=n
(2)
n∑i=1n∑j=1[gcd(i,j)=1]=n∑i=1(2i∑j=1[gcd(i,j)=1])−1=2n∑i=1φ(i)−1
可以使用前缀和,使得 O(1) 查询。
(2.5)
n∑i=1m∑j=1gcd(i,j)=n∑i=1m∑j=1∑d|gcd(i,j)φ(d)=n∑i=1m∑j=1∑d|i,d|jφ(d)=n∑i=1m∑j=1min(n,m)∑d=1φ(d)[d|i][d|j]=min(n,m)∑d=1φ(d)n∑i=1m∑j=1[d|i][d|j]=min(n,m)∑d=1φ(d)⌊nd⌋⌊md⌋
(3)
莫比乌斯反演(拓展)
n∑i=1m∑j=1[gcd(i,j)==1]=n∑i=1m∑j=1∑d|gcd(i,j)μ(d)=n∑i=1min(i,m)∑d=1μ(d)⌊min(i,m)d⌋=min(n,m)∑d=1μ(d)⌊nd⌋⌊md⌋
费马小定理&欧拉定理&扩展欧拉定理
同余
定义
如果
d|(a−b)
则我们称
a≡b(modd)
性质
1.反身性:a≡a(modm);
2.对称性:若 a≡b(modm),则 b≡a(modm);
3.传递性:若 a≡b(modm),b≡c(modm),则 a≡c(modm);
4.同余式相加:若 a≡b(modm),c≡d(modm),则 a±c≡b±d(modm);
5.同余式相乘:若 a≡b(modm),c≡d(modm),则ac≡bd(modm)。
费马小定理
定义
对于一个整数 a 和 质数 p,如果满足
a⊥p
则符合
ap−1≡1(modp)
欧拉定理
定义
费马小定理的广义。
对于两个整数 a 和 m,如果满足
a⊥m
则符合
aφ(m)≡1(modm)
逆元
定义
若
ab≡1modm
则
b 为 a 在 modm 意义下的逆元,同时,a 也为 b 在 modm 意义下的逆元。
任意整数 a 在 modm 意义下的逆元记为 inv(a,m)。
显然,逆元就是在 mod 某个数意义下的倒数,即
inv(a,m)=a−1modm
求法
- 费马小定理求法(p∈Prime,a⊥p)
∵ap−1≡1(modp)∴ap−2=1a(modp)∴inv(a,p)=ap−2(modp)
- 欧拉定理求法(a⊥m)
∵aφ(m)≡1(modm)∴aφ(m)−1=1a(modm)∴inv(a,p)=aφ(m)−1(modm)
- 线性求逆元(p∈Prime,a⊥p)
对于所有的 i<p,有一种线性求逆元(i−1)的方法。
因为 i<p,所以可以用 i 表示 p,即
p=ki+b
即
ik+b≡0(modp)
等式两边同乘 i−1,得
k+bi−1≡0(modp)
移项,分离处 i−1,得
i−1≡−kb−1(modp)
又
∵k=⌊p/i⌋,b=pmodi∴i−1≡−(p/i)(pmodi)−1(modp)∴i−1≡(p−p/i)(pmodi)−1(modp)
因为 (pmodi)−1 已经处理好了
所以可以线性处理
代码
inv[1]=1;
for(int i=2;i<=n;i++)inv[i]=(mod-mod/i)*inv[mod%i]%mod;
- 线性求阶乘逆元
可以在组合数问题上发挥作用
显然
1(n−1)!=n⋅1n!
所以
fac[0]=inv[0]=1;
for(int i=1;i<=n;i++)
fac[i]=fac[i-1]*i%mod;
inv[n]=ksm(fac[n],mod-2);
for(int i=n;i>=1;i--)
inv[i-1]=inv[i]*i%mod;
扩展欧拉定理
ab≡⎧⎪⎨⎪⎩abmodφ(m)a⊥mab¬a⊥m,b<φ(m)abmodφ(m)+φ(m)¬a⊥m,b≥φ(m)modm
互质可以不要
ab≡{abb<φ(m)abmodφ(m)+φ(m)b≥φ(m)modm
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App