素数相关
筛法
埃氏筛
inline void primes(int n)
{
memset(v,0,sizeof v);
for(int i = 2;i <= n;i++){
if(v[i]) continue;
p.push_back(i);
for(int j=i;j<=n/i;j++) v[j*i]=1;
}
}
线性筛
inline void xxs(int n)
{
memset(v,0,sizeof v);
m=0;
for(int i = 2;i <= n;i++){
if(!v[i]) p[++m]=i;
for(int j = 1;j <= m;j++){
if(p[j]*i>n) break;
v[i*p[j]]=1;
if(i%p[j]==0)break;
}
}
}
欧拉函数
表示小于等于 的正整数中与 互质的数的数量。规定 。
性质
- 若 为质数,
- 若 ,
- 若 互质,
性质 证明:
小于等于 的正整数中,不与 互质的只有 共 个数, 。
求欧拉函数
单次求欧拉函数
设 表示 的质因数。
将 质因分解即可,时间复杂度 。
证明:
由性质 可得:
由性质 可变为:
将 提出来得 ,即:
求 1~n 的欧拉函数
与线性筛相结合。
- 若 为质数, 。(性质 )
- 否则对于 的质因数 ,
时间复杂度
void primes(int n)
{
memset(v,0,sizeof v);
m=0;
phi[1]=1;
for(int i = 2;i<= n;i++){
if(!v[i]) p[++m]=i,phi[i]=i-1;
for(int j = 1;j <= m;j++){
if(p[j]*i>n) break;
v[i*p[j]]=1;
if(i%p[j]==0) {phi[i*p[j]]=p[j]*phi[i];break;}
else phi[i*p[j]]=phi[p[j]]*phi[i];
}
}
}
欧拉定理
若正整数 与 互质,则
当 为质数时,退化为费马小定理 。
推论:
利用这个推论可以在 很大的情况下求出 。
扩展欧拉定理
若 ,则:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步