『欧拉函数与线性筛』
<更新提示>
<第一次更新>
<正文>
欧拉函数#
定义#
∀ a,b∈N,若gcd(a,b)=1,则称a,b互质。
对于一个正整数n,我们将1−n中与n互质的数的个数称为欧拉函数,记为ϕ(n)。
求解#
若在算数基本定理中,有n=pa11∗pa22∗...∗pakk,则可以得到:
证明:
设p为n的一个质因子,则1−n中p的倍数有p,2p,3p,...,npp,即1−n中不含有因子p的数的个数为n−np个。
设q为n的另一个质因子,由容斥原理可得1−n中不含有因子p,q的数的个数为n−np−nq+npq=n(p−1p)(q−1q)个。
推广到n的每一个质因子,可得1−n中不与n含有任何共同质因子的数的个数为n∗∏ki=1pi−1pi个,即ϕ(n)=n∗∏ki=1pi−1pi。
利用如上公式,我们可以直接在分解质因数的过程中求得一个数的欧拉函数,时间复杂度为O(√n)。
Code:
inline long long phi(long long x)
{
long long ans=x;
for (long long i=2;i*i<=x;i++)
{
if (x%i==0)
{
ans=ans/i*(i-1);
while (x%i==0)x/=i;
}
}
if (x>1)ans=ans/x*(x-1);
return ans;
}
性质#
1.对于质数p,有ϕ(p)=p−1
证明:由定义可得。
2.∀ n>1,1−n中与n互质的数的和为n2ϕ(n)
证明:
由于gcd(n,x)=gcd(n,n−x),所以与n不互质的数n−x,x成对出现,且平均值为n2,因此与n互质的数的平均值也为n2,n互质的数的和即为n2ϕ(n)。
3.若gcd(a,b)=1,则ϕ(ab)=ϕ(a)ϕ(b)
4.欧拉函数是积性函数,即n=∏paii,ϕ(n)=∏ϕ(paii)
5.对于一个质数p,若有p|n,p2|n,则ϕ(n)=ϕ(np)∗p
6.对于一个质数p,若有p|n,p2⧸|n,则ϕ(n)=ϕ(np)∗(p−1)
证明:
可以由欧拉函数的计算式直接推导得到。
7.∑d|nϕ(d)=n
证明:
设函数f(x)=∑d|nϕ(d),则f(nm)=∑d|nmϕ(d),若n,m互质,利用欧拉函数是积性函数可以得到:f(nm)=∑d|nmϕ(d)=∑d1|n∑d2|mϕ(d1d2)=∑d|nϕ(d)∗∑d|mϕ(d)=f(n)f(m)
即函数f为积性函数。
对于一个质数p,$$f(pm)=\sum_{d|pm}\phi(d)=\sum{m}_{i=0}\phi(pi)$$,由等差数列求和可得f(pm)=pm,即可得到$$f(n)=\prod_{i=1}{m}f(p_i)=\prod_{i=1}{m}p_i=n$$
这些性质在不同的题目中有不同的作用,需要我们注意灵活运用。特别是性质6.,在dirichlet卷积,Möbius反演中等内容中也会起到作用。
线性筛求解#
对于求解1−n所有数的欧拉函数,如果直接使用分解质因数法,时间复杂度为O(n√n)。
事实上,我们可以利用欧拉函数的性质1. 5. 6.,再线性筛的求解过程中顺带地求解欧拉函数(线性筛见『素数 Prime判定和线性欧拉筛法 The sieve of Euler』)。
Code:
inline void eular(void)
{
for (int i=2;i<=n;i++)
{
if (!flag[i])Prime[++cnt]=i,phi[i]=i-1;
for (int j=1;j<=cnt&&i*Prime[j]<=n;j++)
{
flag[ i*Prime[j] ] = true;
if (i%Prime[j]==0)
{
phi[ i*Prime[j] ] = phi[i] * Prime[j];
break;
}
else phi[ i*Prime[j] ] = phi[i] * (Prime[j]-1);
}
}
}
<后记>
感谢hzk 欧拉函数的介绍(附加欧拉定理和费马小定理的介绍)。
【推荐】2025 HarmonyOS 鸿蒙创新赛正式启动,百万大奖等你挑战
【推荐】博客园的心动:当一群程序员决定开源共建一个真诚相亲平台
【推荐】开源 Linux 服务器运维管理面板 1Panel V2 版本正式发布
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· C23和C++26的#embed嵌入资源指南
· 「EF Core」框架是如何识别实体类的属性和主键的
· 独立开发,这条路可行吗?
· 我在厂里搞 wine 的日子
· 如何通过向量化技术比较两段文本是否相似?
· 推荐 5 款实用的 Docker 可视化管理工具,工作效率翻倍!
· 瞧瞧别人家的接口重试,那叫一个优雅!
· 【EF Core】框架是如何识别实体类的属性和主键的
· MySQL 13 为什么表数据删掉一半,表文件大小不变?
· 上周热点回顾(7.7-7.13)