数论基础
数论基础
基本概念:
模:
整除:
质数:有且只有两个约数的数(
质因数分解:将一个正整数
同余:
最大公约数:
互质:
快速幂
目的:快速求出
考虑将
其中
根据幂运算的性质
因此我们只需要求出
code:
typedef long long ll;
ll fast_pow(ll a,ll b,ll p){
ll ans=1;
while(b){
if(b&1)ans=ans*a%p;
a=a*a%p;
b>>=1;
}
return ans;
}
最大公约数
显然的性质:
由第二条性质可以推得:
其中
我们只需要一直模到
这就是著名的欧几里得算法(辗转相除法),复杂度
code:
int gcd(int a,int b){
return !b?a:gcd(b,a%b);
}
扩展欧几里得算法
形如
其中显然,当且仅当
扩展欧几里得算法就是求出
如果我们还知道一组
由于
因此当
时,方程一定有解。
那么这个过程就变成了一个递归的过程,每次递归下去都会由
方程
code:
void exgcd(int a,int b,int &x,int &y){
if(!b){
x=1,y=0;
return;
}
exgcd(b,a%b,x,y);
int tmp=x;
x=y;
y=tmp-a/b*y;
}
最后对答案做一些处理,令
注意:利用扩展欧几里得求解时,参数不能为无符号,因为可能存在负数!
质数筛
埃氏筛
如果一个数是质数,它的所有不是自己的倍数都不是质数,因此将这些数标记不是质数。
而如果一个数不是任何小于它且不是
code:
bool not_prime[N];//标记数组
void init(){
not_prime[1]=1;
for(int i=2;i<=n;i++){
if(not_prime[i])continue;
for(int j=2;i*j<=n;j++)
not_prime[i*j]=1;//标记质数的所有倍数
}
}
时间复杂度
欧拉筛(线性筛)
埃氏筛的复杂度里带一个
欧拉筛可以避免这个问题,其目标是令每个合数只被其最小质因子标记一次。
code:
bool not_prime[N];//标记数组
int prime[N];//记录已经筛出来的质数
void init(){
not_prime[1]=1;
for(int i=2;i<=n;i++){
if(!not_prime[i])prime[++tot]=i;
for(int j=1;j<=tot;j++){//遍历已经筛出来的质数
if(i*prime[j]>n)break;
not_prime[i*prime[j]]=1;
if(i%prime[j]==0)break;//精髓
}
}
}
由于我太菜不会讲,正确性及原理详情出门左转洛谷线性筛模板题解区。
复杂度
此外,可以通过线性筛预处理每个数的最小质因数,进行高效的质因数分解。
费马小定理
欧拉函数
欧拉函数定义为小于等于
特别地,
对于这个式子,可以用容斥原理证明。
证明过程中最后那个因式分解可以用数学归纳法验证。
有了这个式子,则性质显然:
- 若
为质数,则 - 若
, - 若
,
因此,每个数的欧拉函数值可以用线性筛求出来:
bool not_prime[N];
int prime[N],phi[N];
void init(){
vis[1]=1;phi[1]=1;
for(int i=2;i<=n;i++){
if(!vis[i]){
prime[tot++]=i;
phi[i]=i-1;
vis[i]=1;
}
for(int j=0;j<tot;j++){
if(i*prime[j]>n)break;
vis[i*prime[j]]=1;
if(i%prime[j]==0){
phi[i*prime[j]]=phi[i]*prime[j];
break;
}
else phi[i*prime[j]]=phi[i]*(prime[j]-1);
}
}
}
欧拉定理
证明:
对于整数
对于一个整数
第一条显然。
对于第二条可利用反证法:若
二者结合可知:如果令
因此:
即:
提取
约简可得:
容易看出费马小定理就是欧拉定理在
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?