数论合集
注:本文讨论都在正整数范围内。
质数
定义
我们把只能被
质数的判定
试除法
将
时间复杂度:
埃氏筛
从
时间复杂度:
埃氏筛的优化
不难发现我们可以直接从
因为对于一个
for(int i=2;i<=n;i++){
if(!st[i]){
prime[++cnt]=i;
}
for(int j=1;j<=cnt&&i*prime[j]<=n;j++){
st[i*prime[j]]=1;
}
}
时间复杂度:
线性筛
我们要求每个合数只被它的最小质因子筛掉。
我们令
for(int i=2;i<=n;i++){
if(!st[i]){
prime[++cnt]=i;
}
for(int j=1;j<=cnt&&i*prime[j]<=n;j++){
st[i*prime[j]]=1;
if(i%prime[j]==0) break;
}
}
欧拉函数
定义
欧拉函数
性质
-
对于一个质数,
。 -
对于两个互质的数
,满足 。满足这个条件的函数称为积性函数,例如 也是积性函数。 -
。 -
若
为质数,则 。
计算
法1 试除法
考虑一个数
法2 线性筛
我们可以利用欧拉函数积性函数的性质,若我们知道
在线性筛时,我们干:
-
若
为质数,则 。 -
若
( 为质数),则有 。 -
若
,则 。
void getphi(int n){
phi[1]=1;
for(int i=2;i<=n;i++){
if(!st[i]){
prime[cnt++]=i;
phi[i]=i-1;
}
for(int j=0;prime[j]<=n/i;j++){
int t=prime[j]*i;
st[t]=1;
if(i%prime[j]==0){
phi[t]=phi[i]*prime[j];
break;
}
phi[t]=phi[i]*(prime[j]-1);
}
}
}
模运算
定义
我们令
若
性质
-
。 -
。 -
。 -
。 -
-
。 -
。 -
。 -
。
应用
求 gcd(辗转相除法)
辗转相除法依赖于定理:
证明
令
设
int gcd(int a,int b){
return b?gcd(b,a%b):a;
}
裴蜀定理
令
扩展欧几里得算法
判定
先推一波式子:
容易发现此时
于是我们就可以递归求解了。
void Exgcd(int a,int b,int &x,int &y) {
if(!b){
x=1,y=0;
}
else{
Exgcd(b,a%b,y,x);
y-=a/b*x;
}
}
乘法逆元
定义
若
性质
-
在
意义下, 等价于 。 -
在 意义下有逆元,当且仅当 。
证明:
那么我们求逆元相当于解 。
等价于 。
变形得 。
根据裴蜀定理可得只有 时,原方程有解,即 在 意义下有逆元。
求逆元
费马小定理求逆元
费马小定理:若
给式子变形,得
于是我们可以得出
exgcd 求逆元
我们将
中国剩余定理
给出一个一元线性同余方程组:
中国剩余定理可以判定该方程组是否有解以及解的具体形式。
具体咋做还没学。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话