Bases
这里给出的筛法是以线性筛素数的方法为基础的。
利用了欧拉函数是积性函数的性质:对于任意互质的数a,b,有f(a∗b)=f(a)∗f(b)
筛法
类比于线性筛素数。
i以下的欧拉函数已经被筛出,我们利用i和prim往后更新。
如果i是素数,那么φ(i)=i−1
如果i%prim[j]!=0 ,那么(i,prim[j])==1, 则有φ(i∗prim[j])=φ(i)∗φ(prim[j])=φ(i)∗(prim[j]−1)
如果i%prim[j]==0,则φ(i∗prim[j])=φ(i)∗prim[j](先甩结论)
有两个证法:
1.
i%prim[j]==0不能直接算的原因是它两个不互质,那我们把它写成互质的样子。
设i∗prim[j]=A∗prim[j]m−1∗prim[j]=A∗prim[j]m
有个结论:如果p是质数,那么φ(pk)=pk−pk−1=pk−1∗(p−1)
比较显然,pk是数的总数,而pk只有p这一个质因子,所以它的因数都是p的倍数,即1∗p,2∗p,3∗p,...,pk−1∗p,pk的包含自己在内的因数个数有pk−1个。
用总数pk减去因数个数pk−1就是 φ(pk)。(这里总数和因数个数都算了自己本身,一减就把自己减掉了,所以没有影响)
φ(pk)=pk−1∗(p−1)
φ(pk−1)=pk−2∗(p−1)
联立以上二式可得:φ(pk)=φ(pk−1)∗p
以下将prim[j]简写成p
φ(i∗p)=φ(A)∗φ(pm)=φ(A)∗φ(pm−1)∗p
而A∗pm−1=i,则φ(A)∗φ(pm−1)=φ(i)
那么φ(i∗p)=φ(A)∗φ(pm−1)∗p=φ(i)∗p
Q.E.D.
2.
欧拉函数有个通式:(先甩式子再证明)
φ(n)=n∗(1−1p1)∗(1−1p2)∗...∗(1−1pn),pi是质因数
那么
φ(i)=i∗(1−1p1)∗(1−1p2)∗...∗(1−1prim[j])
φ(i∗prim[j])=(i∗prim[j])∗(1−1p1)∗(1−1p2)∗...∗(1−1prim[j])=i∗(1−1p1)∗(1−1p2)∗...∗(1−1prim[j])∗prim[j]=φ(i)∗prim[j]
然后来说一下那个什么通式怎么来的:
这里也给出两个证法:
1.容斥原理
设n的其中一个质因子是p ,[1,n]中p的倍数有p,2p,3p,...np∗p一共np个数,[1,n]中不含因子p的数就一共有n−np个
设n的另外一个质因子是q,同理可得[1,n]中不含因子q的数就一共有n−nq个,根据容斥原理,[1,n]中两个质因子均不含的数的个数为n−np−nq+npq=n(pq−q−p+1)pq=n(p−1)(q−1)pq=n∗p−1p∗q−1q=n∗(1−1p)∗(1−1q)
推广到n的每一个质因子(变形时用到了分组分解因式的方法),可得[1,n]中所有n的质因子均不含的数的个数为n∗∏ki=1(1−1pi),其中,pi是n的质因子。
即φ(n)=n∗∏ki=1(1−1pi)
2.利用积性函数的性质
n=0时,φ(n)=0 成立
n=1时,φ(n)=1 成立
n为质数时,φ(n)=n−1 成立
n为一个质数的正整数次幂,即n=pk时,φ(pk)=pk−pk−1=pk∗(1−1p)=n∗(1−1p) 成立
n为任意正整数时,根据算术基本定理可得n=pk11pk22pk33...pkmm,其中pi为质因数
根据积性函数的性质φ(n)=φ(p1)φ(p2)...φ(pm)=pk11(1−1p1)pk22(1−1p2)pk33(1−1p3)...pkmm(1−1pm)=n∗(1−1p1)(1−1p2)...(1−1pm)
Q.E.D.
(怎么觉得证明通式比证明这个结论本身还要复杂
Code View
void Phi()
{
for(int i=2;i<=n;i++)
{
if(!vis[i]) prim[++pn]=i,phi[i]=i-1;
for(int j=1;j<=pn&&i*prim[j]<=n;j++)
{
vis[i*prim[j]]=1;
if(i%prim[j]==0)
{
phi[i*prim[j]]=phi[i]*prim[j];
break;
}
else phi[i*prim[j]]=phi[i]*(prim[j]-1);
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
2019-08-07 矩阵快速幂 学习笔记
2019-08-07 2019暑假中山纪中集训游记