【学习笔记】数学知识-质数
前置知识
- 质数的个数是无限的。
- 若
为正整数,有 的所有质因子不超过 。- 证明:对于所有的
,一定有 ,易证 。
- 证明:对于所有的
- 一个合数
一定包含一个不超过 的质因子。 - 试除法:若一个正整数
为合数,则存在一个能整除 的数 ,其中 。-
时间复杂度为
。 -
代码实现
点击查看代码
bool isprime(int n) { if (n < 2) return false; for (int i = 2; i <= sqrt(n); i++) if (n % i == 0) return false; return true; }
-
筛法
- Eratosthenes 筛法(埃式筛法)
-
时间复杂度为
。 -
点击查看代码
bool m[100000010]; int main() { int n,i,j,ans=0; cin>>n; m[1]=1; for(i=2;i<=sqrt(n);i++) { if(m[i]==0) { for(j=2;i*j<=n;j++) { m[i*j]=1; } } } for(i=2;i<=n;i++) { if(m[i]==0) { ans++; } } cout<<ans; return 0; }
-
- 线性筛法(欧拉筛法)
-
时间复杂度为
。 -
点击查看代码
int prime[100000001],len=0; bool vis[100000001]; void isprime(int n) { int i,j; memset(vis,false,sizeof(vis)); for(i=2;i<=n;i++) { if(vis[i]==false) { len++; prime[len]=i; } for(j=1;j<=len&&i*prime[j]<=n;j++) { vis[i*prime[j]]=true; if(i%prime[j]==0) { break; } } } } int main() { int n,q,i,k; cin>>n>>q; isprime(n); for(i=1;i<=q;i++) { cin>>k; cout<<prime[k]<<endl; } return 0; }
-
- 例题
- luogu P1835 素数密度
-
直接对
进行线性筛显然不可做。 -
筛法求出
之间的质数,对于每个质数 ,把 中能被 整除的数标记,即标记 为合数。点击查看代码
ll prime[70000],len=0; bool vis[70000]; bitset<2000001>dis;//bitset大法好 void isprime(ll n) { memset(vis,false,sizeof(vis)); for(ll i=2;i<=n;i++) { if(vis[i]==false) { len++; prime[len]=i; } for(ll j=1;j<=len&&i*prime[j]<=n;j++) { vis[i*prime[j]]=true; if(i%prime[j]==0) { break; } } } } int main() { ll l,r,i,j,ans=0; cin>>l>>r; isprime(70000); if(l==1) { l=2; } for(i=1;i<=len;i++) { for(j=max(2ll,(ll)ceil(1.0*l/prime[i]));j<=(ll)ceil(1.0*r/prime[i]);j++) { dis[j*prime[i]-l]=1; } } for(i=l;i<=r;i++) { if(dis[i-l]==0) { ans++; } } cout<<ans<<endl; return 0; }
-
- UVA10140 Prime Distance
- luogu P10495 阶乘分解
- luogu P1835 素数密度
算术基本定理(唯一分解定理)
- 任何一个大于
的正整数都能唯一分解成有限个的质数的乘积,即若 为大于 的正整数,则有 ,其中对于每一个 均满足 为正整数, ,且 。 - 应用
- 若
为大于 的正整数,设 ,则有如下性质: 的正约数集合可写作 ,其中对于每一个 均有 。
- 例题
- CF1444A Division
- 简化题意
组数据,每组数据给定 ,求满足 的最大正整数解。
- 解法
- 当
时,有 是一组最大的解。 - 当
时,设 是满足 的最大正整数, 是满足 的最大正整数,由 有存在一个 满足 ,构造一个 满足 即可。故有 是一组最大的解。
- 当
- 简化题意
- CF1444A Division
- 若
互质
- 若
,则称 互质。 - 对于三个数或更多个数的情况,将
的情况称为 互质;将 的情况称为 两两互质。
欧拉函数
中与 互质的数的个数被称为欧拉函数,记作 。- 证明
- 当
时,显然。 - 当
时,设 是 的质因子, 中 的倍数共有 个, 的倍数共有 个,依据容斥原理, 中不与 含有共同质因子 或 的个数为 。类似地,可在 的全部质因子上使用容斥原理,即可得到与 互质的数的个数。
- 当
- 证明
- 性质
-
若
为质数,则 。- 证明:设
,比 小的正整数有 个。其中共有 个数能被 整除,即这些数不与 互质。故 。
- 证明:设
-
若
为正整数,则 。- 证明
- 当
时,显然。 - 当
时,依据更相减损法,有 ,即与 互质的数 成对出现,平均值为 。
- 当
- 证明
-
若
,则 。 -
若
为偶数,有 。 -
若
为奇数,则 。 -
若
互质,则 。- 证明:依据算术基本定理,设
,又因为 互质,所以不存在一组 满足 ,故 ,又有 ,故 。- 由本条性质可知欧拉函数是积性函数。
- 证明:依据算术基本定理,设
-
若
,则 。- 证明:因为
和 所有的质因子是相同的,只是部分质因子的指数发生变化,故 。
- 证明:因为
-
若
为质数,且 ,则 。- 证明:因为
,所以 有相同的质因子(其中 的指数不同),依据欧拉函数的计算公式,此时有 ,故 。
- 证明:因为
-
若
为质数,且 ,则 。- 证明:因为
,所以 互质,又因为 是积性函数,故 。
- 证明:因为
-
欧拉反演:
。- 证明:设
满足 ,则 ;设 表示满足 的 的个数,则 。又因为 与 互质,有 ,则 。易知 与 是一一对应的,故 。
- 证明:设
-
依据算术基本定理,有
,又因为 是积性函数,则 。- PS:本条性质用于已知
是积性函数求 的计算式,可作了解。
- PS:本条性质用于已知
-
若
为正整数,且满足 ,有 。-
证明
首先显然有
。
-
若
为正整数,则 。 -
若
为正整数,则 。 -
若
为正整数,则 。 -
若
为正整数,则 。 -
若
为正整数,则 。 -
若
为正整数,则 。-
证明
-
拓展:若
为正整数,则 。
-
若
为正整数,则 。-
证明
-
拓展:若
为正整数,则有 link(太长就放这里了) 。
-
若
为正整数,则 。 -
若
为正整数,则 。 -
若
均为正整数,且 ,有 。 -
若
为正整数,有 。
-
- 例题
- SP4141 ETF - Euler Totient Function | UVA10179 Irreducable Basic Fractions | UVA10299 Relatives
-
对原数进行 分解质因数 ,顺便求出欧拉函数。
点击查看代码
int phi(int n) { int ans=n,i; for(i=2;i<=sqrt(n);i++) { if(n%i==0) { ans=ans/i*(i-1); while(n%i==0) { n/=i; } } } if(n>1) { ans=ans/n*(n-1); } return ans; }
-
- UVA11327 Enumerating Rational Numbers
-
线性筛欧拉函数板子
- 线性筛欧拉函数的时间复杂度为
。
点击查看代码
void euler(ll n) { memset(vis,false,sizeof(vis)); phi[1]=1; for(ll i=2;i<=n;i++) { if(vis[i]==false) { len++; prime[len]=i; phi[i]=i-1;//phi[i]表示i的欧拉函数 } for(ll j=1;j<=len&&i*prime[j]<=n;j++) { vis[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); } } } }
- 线性筛欧拉函数的时间复杂度为
-
- SP4141 ETF - Euler Totient Function | UVA10179 Irreducable Basic Fractions | UVA10299 Relatives
积性函数
- 若函数
满足 且 均有 ,那么称函数 为积性函数。 - 若函数
满足 且 均有 ,那么称函数 为完全积性函数。 - 性质
- 若函数
是积性函数,依据算术基本定理,有 ,则 ;若函数 是完全积性函数,依据算术基本定理,有 ,则 。 - 若
均为积性函数, 均是积性函数。
- 若函数
- 常见的积性函数
- 单位函数(完全积性):
。 - 恒等函数(完全积性):
, 常简记作 。 - 常数函数(完全积性):
。 - 除数函数:
, 常简记作 或 , 常简记作 。 - 欧拉函数:
。 - 莫比乌斯函数:
。
- 单位函数(完全积性):
- 线性筛任意积性函数
- 记
表示 的最小质因子 的最高次幂的次数,即 。预处理 表示 的最小质因子 的最高次幂,即 。 - 在线性筛的过程中,需要对
进行边界处理。当 是素数时,需要对 进行预值处理。-
当
时,因为 的所有质因子都大于 ,所以 。 -
否则,有
。- 当
,即 仅有一个质因子时,此时 需要根据实际处理。 - 当
,即 不仅有一个质因子时,因为 ,所以 。
点击查看代码
ll val(ll i ,ll prime) { if(i==prime) { return ...; } else { return ...; } } void euler(ll n,ll val0) { memset(vis,false,sizeof(vis)); f[1]=val0;//边界处理 for(ll i=2;i<=n;i++) { if(vis[i]==false) { len++; prime[len]=i; f[i]=val(i,i);//当i是素数时,预值处理 low[i]=i; } for(ll j=1;j<=len&&i*prime[j]<=n;j++) { vis[i*prime[j]]=true; if(i%prime[j]==0) { low[i*prime[j]]=low[i]*prime[j]; if(i==low[i]) { f[i*prime[j]]=val(i,prime[j]);//根据实际处理 } else { f[i*prime[j]]=f[i/low[i]]*f[low[i*prime[j]]]; } break; } else { low[i*prime[j]]=prime[j]; f[i*prime[j]]=f[i]*f[prime[j]]; } } } }
- 当
-
- 应用
-
线性筛预处理
。点击查看代码
void euler(ll n) { memset(vis,false,sizeof(vis)); f[1]=1; for(ll i=2;i<=n;i++) { if(vis[i]==false) { len++; prime[len]=i; f[i]=1+i*(i-1); low[i]=i; } for(ll j=1;j<=len&&i*prime[j]<=n;j++) { vis[i*prime[j]]=true; if(i%prime[j]==0) { low[i*prime[j]]=low[i]*prime[j]; if(i==low[i]) { f[i*prime[j]]=f[i]+i*prime[j]*i*(prime[j]-1); } else { f[i*prime[j]]=f[i/low[i]]*f[low[i*prime[j]]]; } break; } else { low[i*prime[j]]=prime[j]; f[i*prime[j]]=f[i]*f[prime[j]]; } } } }
-
- 记
莫比乌斯函数
-
莫比乌斯函数
的定义为 。 -
性质
- 证明
- 当
时,原结论成立。 - 当
时,设 。此时有 ,又因为 ,所以原式等于 ,原结论成立。
- 当
- 证明
- 证明
- 令
即可。
- 令
- 证明
为积性函数。 为加性函数,即 均有 。- 令莫比乌斯反演形式一中的
即可。
- 令莫比乌斯反演形式一中的
-
线性筛莫比乌斯函数
点击查看代码
int prime[1000010],vis[1000010],miu[1000010],len=0; void isprime(int n) { memset(vis,0,sizeof(vis)); miu[1]=1; for(ll i=2;i<=n;i++) { if(vis[i]==0) { len++; prime[len]=i; miu[i]=-1; } for(ll j=1;j<=len&&i*prime[j]<=n;j++) { vis[i*prime[j]]=1; if(i%prime[j]==0) { miu[i*prime[j]]=0;//有重复因子 prime[j] break; } else { miu[i*prime[j]]=-miu[i];//互质,等于 miu[prime[j]]*miu[i] } } } } int main() { ll n,i; cin>>n; isprime(n); for(i=1;i<=n;i++) { cout<<miu[i]<<endl; } return 0; }
-
莫比乌斯反演(变换)
- 基本知识
- 设
为两个数论函数。 - 形式一:若
,则有 。- 证明
- 证明
- 形式二:若
,则有 。- 证明
- 证明
- 设
- 例题
- luogu P2257 YY的GCD
- UVA10214 树林里的树 Trees in a Wood.
- UVA12888 Count LCM
- SP3871 GCDEX - GCD Extreme
- P3455 [POI2007] ZAP-Queries
- 多倍经验: luogu P4450 双亲数
- 题解
- luogu P2522 [HAOI2011] Problem b
- luogu P6156 简单题
- 多倍经验: luogu P6222 「P6156 简单题」加强版
- 题解
- luogu P3327 [SDOI2015] 约数个数和
- luogu P3312 [SDOI2014] 数表
- BZOJ3309 DZY Loves Math
- luogu P3704 [SDOI2017] 数字表格
- luogu P4449 于神之怒加强版
- luogu P1829 [国家集训队] Crash的数字表格 / JZPTAB
- luogu P6271 [湖北省队互测2014] 一个人的数论
- 基本知识
本文来自博客园,作者:hzoi_Shadow,原文链接:https://www.cnblogs.com/The-Shadow-Dragon/p/17640996.html,未经允许严禁转载。
版权声明:本作品采用 「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0) 进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具