同余
定义
同余类
对于 ∀a∈[0,m−1],集合 {a+km}(k∈Z) 的所有数模 m 同余,余数都是 a 。该集合称为一个模 m 的同余类,简记为 aˉ 。
剩余系
模 m 的同余类一共有 m 个,分别为 1ˉ,2ˉ,⋯,m−1—— 。他们构成 m 的完全剩余系。
1~m 中与 m 互质的数代表的同余类共有 φ(m) 个,它们构成 m 的简化剩余系。
性质
最大公约数
欧几里得算法
∀a,b∈N,b=0,gcd(a,b)=gcd(b,amodb)
裴蜀定理
对任意整数 a,b,x,y,ax+by 一定是 gcd(a,b)的倍数
∀a,b ,x,y,k∈Z ,满足ax+by=k∗gcd(a,b)
特别的∃x,y∈Z,满足ax+by=gcd(a,b)
扩展欧几里得算法
点击查看代码
ll exgcd(ll a,ll b,ll &x,ll &y){
if(b==0){
x=1;
y=0;
return a;
}
ll d=exgcd(b,a%b,x,y); //也可以写成
ll t=x; // ll d=exgcd(b,a%b,y,x);
x=y; //y-=(a/b)*x;
y=t-y*(a/b);
return d;
}
该算法解得 x0,y0 为一组特解,d 为 gcd(a,b) 对于不定方程 ax+by=c 的通解可以表示为:
x=dcx0+kdb,y=dcy0−kda(k∈Z)
令 m1=db ,m2=da ,则有 x=xmin+km1, y=ymin+km2
故 xmin=x(modm1),ymin=y(modm2)
费马小定理
若 p 是素数,则对于任意整数 a ,有 ap≡a(modp)
欧拉定理
若正整数 a,n 互质,则 aφ(n)≡1(modn), 其中 φ(n) 为欧拉函数
推论:若正整数 a,n 互质,则对于任意正整数 b,有 ab≡abmodφ(n)(modn)
特别地,当 a,n 不一定互质且 b≥φ(n) 时,有ab≡abmodφ(n)+φ(n)(modn)
即扩展欧拉定理(欧拉降幂公式)有:
⎩⎪⎨⎪⎧ab≡abmodφ(n)(modn)ab≡ab(modn)ab≡abmodφ(n)+φ(n)(modn)gcd(a,n)=1gcd(a,n)=1,b<φ(n)gcd(a,n)=1,b≥φ(n)
威尔逊定理
任意一个大于1的数是素数的充要条件为:
p>1, (p−1)!+1≡0(modp)⇔p∈P
中国剩余定理
设 m1,m2,⋯,mn 是两两互素的整数,m=∏i=1nmi, Mi=mim, Mi−1 是 Mi 在模 mi 下的逆元。对于任意的 n 个整数 a1,a2,⋯,an ,方程组
⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧x≡a1(modm1)x≡a1(modm1)⋮x≡an(modmn)
有整数解,解为 x=∑i=1naiMiMi−1
原理:其中的第 i 项,由于 Mi−1 是 Mi 在模 mi 下的逆元,故在令该项对 mi 取模时得到 ai,而对于其他所有项,由于 Mi 为其他所有模数的公倍数,故为 0
点击查看代码
ll CRT(vector<Pll>&v){//v[i].ft=mi,v[i].sd=ai
ll M = 1, ans = 0,m;
for(auto&it:v)M *= it.ft;
for(auto&it:v){
m = M / it.ft;
ans = (ans + it.sd * m * inv(m, it.ft)) % M;
}
return ans;
}
当问题中的模数 mi 不再两两互素时,可多次扩展欧几里得进行求解
扩展中国剩余定理
点击查看代码
ll exCRT(vector<Pll>&v){//v[i].ft=mi,v[i].sd=ai
ll a, b, c, x, y, M = v[0].ft, ans = v[0].sd;
for(int i=1;i<(int)v.size();i++)
{
a=M,b=v[i].ft,c=(v[i].sd-ans%b+b)%b;
ll gcd=exgcd(a,b,x,y),bg=b/gcd;
if(c%gcd!=0) return -1;
x=quick_mul(x,c/gcd,bg);
ans+=x*M;
M*=bg;
ans=(ans%M+M)%M;
}
return ans;
}
乘法逆元
定义
若整数 a,p 互素 a∗x≡1(modp),则称 x 为 a 的模 m 乘法逆元
-
若 p 为素数,则可以利用费马小定理有 a∗ap−2≡1(modp), 故只需要用快速幂求解 ap−2
-
若 p 不一定是素数,那么可以通过求解同余方程 a∗x≡1(modp) ,利用扩展欧几里得算法即可
线性逆元递推公式
若要求对 1~n 个数求模 p 的逆元,可推导关系得到递推公式线性求解
首先 1−1≡1(modp)
令 p=k∗i+r,(1<r<i<p), k=⌊ip⌋, r=p−⌊ip⌋∗i=p(modi)
有 k∗i+r≡0(modp),则 i≡−r∗k−1(modp),
故 i−1≡−r−1∗k(modp)
i−1≡−⌊ip⌋∗(pmodi)−1(modp)
i−1≡(p−⌊ip⌋)∗(pmodi)−1(modp)