同余的定义
给定整数$m$,若用$m$除两个整数$a$和$b$所得的余数相同,称$a$和$b$对模$m$同余,记作$aequiv bpmod{m}$
同余系与剩余系
对于$ain[0,m-1]$,集合${a+km}(kin Z)$的所有数模$m$ 同余,余数都是$a$,该集合称为一个模$m$的同余类,简记为$ar{a}$.
模$m$的同余类一共有$m$个,分别为$ar{0}$,$ar{1}$,$ar{2}$ $.$ $.$ $.$ ,$ar{m-1}$ 。它们构成$m$的完全剩余系。
$[1,m]$中与m互质的数代表的同余类共有$phi(m)$个,它们构成的$m$简化剩余系。
说白了,完全剩余系是$[0,m-1]$中所有的同余类,简化剩余系是互质的同余类。
上面并没有什么用
同余的性质
对于整数$a$,$b$,$c$和自然数$n$,$m$,对模$m$同余满足:
自反性:$aequiv apmod{m}$
对称性:若$aequiv bpmod{m}$,那么$bequiv apmod{m}$
传递性:若$aequiv bpmod{m}$,$bequiv cpmod{m}$,那么$aequiv cpmod{m}$
同加性:若$aequiv bpmod{m}$,$cequiv dpmod{m}$,那么$apm cequiv bpm dpmod{m}$
同乘性:若$aequiv bpmod{m}$,$cequiv dpmod{m}$,那么$acequiv bdpmod{m}$
同除性(自己取的):若$acequiv bdpmod{m}$,$gcd(c,m)=1$,那么$aequiv bpmod{m}$
同幂性:若$aequiv bpmod{m}$,那么$a^nequiv b^npmod{m}$
不知道什么性:若$amod p=x$,$amod q=x$,其中$gcd(p,q)=1$,则有$amod pq=x $
$aequiv bpmod{m}$,当且仅当$mmid(a-b)$
$aequiv bpmod{m}$,当且仅当存在整数$k$,使得$a=b+km$
同余的基本定理
学科分割线
费马小定理
若$p$是质数,则对于任意整数$a$,有$a^pequiv apmod{p}$。
欧拉定理及其推论
若正整数$a$,$n$互质,则$a^{phi(n)}equiv 1pmod{n}$。
推论:若$gcd(a,n)=1$,对于任意正整数$b$,有$a^bequiv a^{bmod phi(n)}pmod{n}$(这很牛逼,意味着我们可以把一个天文数字级别的指数拉下来)
由以上两个定理:当$p$为质数,$a$,$p$互质时,$a^{p-1}equiv 1pmod{p}$,费马小定理的另一种形式。
拓展欧几里得算法
欧几里得算法
想一想,在远古时代(滑稽),如果我们要求$gcd(a,b)$怎么办呀,这时候一个名叫欧几里得的家伙出现了,他告诉我们$gcd(a,b)=gcd(b,a\%b)$,这样一切都变得和谐了
inline int gcd(int x,int y){
return y?gcd(y,x%y):x;
}
因为这是质数与合数的内容,本文不在赘述。
拓展欧几里得算法
如果我们还想要$ax+by=gcd(a,b)$的解$(x,y)$怎么办呢?
$Bacute{e}zout$定理说$ax+by=gcd(a,b)$一定有解,证明在文章最后的附录里
在证明过程中,$Bacute{e}zout$定理顺便给了我们求解的方法(建议这个地方先看一下附录,如果不理解的话一定要搞懂,拓欧在后面应用很广)。
inline int Exgcd(int a,int b,int &x,int &y){
if(!b){
x=1;
y=0;
return a;
}
int d=Exgcd(b,a%b,x,y);
int z=x;
x=y;
y=z-y*(a/b);
return d;
}
不定方程的解法
我们这里指的是狭义不定方程,即形如$ax+by=c$的方程
一、设$d=gcd(a,b)$,显然知道,如果$d mid c$,原方程应该无解
二、用拓展欧几里得算法找出$ax+by=gcd(a,b)$的特解$(x_0,y_0)$
三、原方程的解为$(x_0 imesdfrac{c}{d},y_0 imesdfrac{c}{d})$
乘法逆元
定义:若整数$a$,$p$互质,并且$amid b$,若存在一个整数$x$,使得$b/aequiv b*xpmod{p}$。称$x$为$a$的模$p$乘法逆元,记为$a^{-1}pmod p$。
一句话,因为$b imes a^{-1}equiv b/aequiv b/a imes a imes a^{-1}pmod{p}$,所以$a imes a^{-1}equiv 1pmod{p}$(这里的$-1$不是$-1$次方哟)
所以有了更简单的定义:$a$与$p$互质时,$axequiv 1pmod{p}$,此时$x$为$a$的模$p$乘法逆元
介绍三种求法
一、费马小定理
当p是质数,a,p互质时,我们有费马小定理$a^{p-1}equiv 1pmod{p}$,即$a imes a^{p-2}equiv 1pmod{p}$,就是$a$的模$p$乘法逆元,快速幂计算即可。
二、拓展欧几里得
$axequiv1pmod {b}$把它变为等式$ax+by=1$
在上面我们讨论过此类不定方程的解法,这里只温习一遍。
首先要想有解就要满足$gcd(x,y)mid1$
所以$gcd(x,y)$必须等于1,用$gcd(x,y)$代替1
原式就变成了$ax+by=gcd(a,b)$
这不就是裸的拓欧吗?直接跑一遍就行了呗。
三、线性递推
用于求一连串数字模$p$意义下的逆元
首先$1^{-1}=1pmod p$,即1在模所有数的意义下逆元都是1(在模1意义下没有意义)
然后设$p=k imes i+r$(理解为$p$是被除数,$i$是除数,商$k$,余$r$)
在模p意义下$k imes i+requiv 0pmod {p}$
两边同时乘以i的逆元和r的逆元$k imes i imes i^{-1} imes r^{-1}+r imes r^{-1} imes i^{-1}equiv 0pmod {p}$
就是$k imes r^{-1}+i^{-1}equiv 0pmod {p}$
$i^{-1}$这一项已经出现了,所以我们移项$i^{-1}equiv -k imes r^{-1}pmod {p}$
把$k$和$r$都用$p$和$i$代替$i^{-1}equiv -leftlfloordfrac{p}{i} ight floor imes(pmod i)^{-1}pmod{p}$
inv[1]=1;
for(int i=2; i<p; i++)
inv[i]=(p-p/i)*inv[p%i]%p;
四、线性逆推(阶乘逆元)
有时候,在组合数问题中,我们经常会求$n!$的逆元,而此时方法三的数组会爆炸,前两种的时间复杂度太高,这时我们需要一种算法来快速求出$[1,n]$阶乘的逆元
对于$i$,设$i!^{-1}=inv[i]$
$$inv[i-1]=inv[i] imes i$$
用这个式子,我们可以先求出$n!^{-1}$,再线性逆推
fac[0]=1; for(int i=1;i<=n;i++)fac[i]=fac[i-1]*i%mod; inv[n]=quick_pow(fac[n]); for(int i=n-1;i>=1;i--)inv[i]=inv[i+1]*(i+1)%mod;
乘法逆元有啥用
按照定义,我们在进行模意义下的除法时可以转化为乘这个数的逆元。举个例子,如果我们在模9的意义下除以2,其实跟乘以5的结果是一样的(2在模9意义下的逆元是5)
说白了$dfrac{a}{b}mod p=a imes b^{-1}mod p$
线性同余方程
对于给定的整数$a$,$b$,$m$,求解满足$axequiv bpmod m$的未知数$x$,或者无解。因为未知数的指数为1,所以称形如这样的方程一次同余方程,亦称线性同余方程。
解法:$axequiv bpmod {m}$可以变形为$ax+my=b$,对于这类不定方程,我们在拓展欧几里得算法提到过解法,就不再说了。
中国剩余定理
设$m_1$,$m_2$,$.$ $.$ $.$,$m_n$是两两互质的整数,$M=prod_{i=1}^nm_i $,$M_i=M/m$,$t_i$是线性同余方程组$M_it_iequiv1pmod {m_i}$的一个解。对于任意的$n$个整数$a_1$,$a_2$,$.$ $.$ $.$,$a_n$,方程组
$$egin{cases}xequiv a_1pmod {m_1}\xequiv a_2pmod {m_2}\dotsdots \xequiv a_npmod {m_n}end{cases}$$
有整数解,解为$x=sum_{i=1}^nM_it_ia_i$。(证明在附录)
inline int China(){
int M=1,ans=0,x,y,Mi;
for(int i=1;i<=n;i++)M*=m[i];
for(int i=1;i<=n;i++){
Mi=M/m[i];
Exgcd(Mi,m[i],x,y);
ans=(ans+Mi*x*a[i])%M;
}
return (ans+M)%M;
}
拓展中国剩余定理
求解同余方程组
$$egin{cases}xequiv a_1pmod {m_1}\xequiv a_2pmod {m_2}\dotsdots \xequiv a_npmod {m_n}end{cases}$$
$m_1$,$m_2$,$.$ $.$ $.$,$m_n$不一定两两互质,求$x$的最小非负整数解
假设已经求出了前$k-1$个方程的解$x$,记$M=lcm(m_1,m_2,$.$ $.$ $.$,m_{k-1})$,轻易得出 $left{x+i imes M(iin Z) ight}$ 是前$k-1$方程解的集合
我们设$x+t imes Mequiv a_kpmod {m_k}$,这是一个线性同余方程,我们可以用拓欧轻松得到$t$,若这个线性同余方程无解,就意味着整个同余方程组无解。
综上,$n-1$次拓展欧几里得即可解决问题。
inline int quick_mul(int a,int n,int p){
int ans=0;
while(n){
if(n&1)ans=(ans+a)%p;
a=(a+a)%p;
n>>=1;
}
return ans%p;
}
int ExChina(){
int x,y,k,M=m[1],ans=a[1];
for(int i=2;i<=n;i++){
int aa=M,bb=m[i],cc=(a[i]-ans%bb+bb)%bb;
int tmp=Exgcd(aa,bb,x,y);
if(cc%tmp!=0)return -1;
x=quick_mul(x,cc/tmp,bb/tmp);
ans+=x*M;
M*=bb/tmp;
ans=(ans%M+M)%M;
}
return (ans%M+M)%M;
}
高次同余方程
我们之前讨论了线性同余方程的解法,现在看看高次同余方程。
给定整数$a$,$b$,$p$,其中$gcd(a,p)=1$,求一个非负整数$x$,使得$a^xequiv bpmod{p}$。
Baby Step, Giant Step算法
设$x=i imes t-j$,其中$t=leftlceil sqrt{p} ight ceil$,则方程变为$a^{i imes t-j}equiv bpmod {p}$, 即$a^{i imes t}equiv b imes a^jpmod p$我们枚举每一个$j$,用快速幂算得 $b imes a^jmod p$,再插入$hash$。
第二次枚举$i$在$[0,t]$中每一个取值,算得$a^{t imes i}mod p$,若在$hash$中有值,意味着我们找到了最小的$i$和$j$,此时$x=i imes t-j$就是答案。
int BSGS(int a,int b,int p) {
map<int,int>hash;
hash.clear();
b%=p;
int t=(int)sqrt(p)+1;
for(int j=0; j<t; j++) {
int val=b*quick_pow(a,j,p)%p;
hash[val]=j;
}
a=quick_pow(a,t,p);
if(!a)return !b?1:-1;
for(int i=0; i<=t; i++) {
int val=quick_pow(a,i,p);
int j=hash.find(val)==hash.end()?-1:hash[val];
if(j>=0&&i*t-j>=0)return i*t-j;
}
return -1;
}
拓展BSGS算法
给定整数$a$,$b$,$p$。$a$,$p$不一定互质,求一个非负整数$x$,使得$a^xequiv bpmod p$。
$a$,$p$不一定互质了,那我们尽力把它搞成互质的。
先变成等式
$$a^x+py=b$$
设$d_1=gcd(a,p)$,两边同时除以$d_1$
$$a^{x-1} imes dfrac{a}{d1}+dfrac{p}{d_1} imes y=dfrac{b}{d}$$
再次变为同余式
$$a^{x-1} imes dfrac{a}{d_1}equiv dfrac{b}{d_1}pmod dfrac{p}{d_1}$$
如果$b$不是$d_1$的倍数,则方程无解。
如果此时$a$,$dfrac{p}{d_1}$还不互质,那我们设$D_1=dfrac{a}{d_1}$,$b_1=dfrac{b}{d_1}$,$p_1=dfrac{p}{d_1}$,$d_2=gcd(a,p_1)$
得到原式等于
$$a^{x-2} imes D_1 imes dfrac{a}{d_2}equivdfrac{b_1}{d_2}pmod dfrac{p_1}{d_2}$$
经过$n$波操作后,我们终于得到了一个互质的式子
$$a^{x-n} imes D_nequiv b_npmod {p_n}$$
其中$D_n=prod_{i=1}^ndfrac{a}{d_i}$,$b_n=dfrac{b}{prod_{i=1}^nd_i}$,$p_n=dfrac{p}{prod_{i=1}^nd_i}$。
直接跑$BSGS$就可以啦。
int ExBSGS(int a,int b,int p) {
if(b==1||p==1)return 0;
int g=gcd(a,p),k=0,tmp=1;
while(g>1) {
if(b%g!=0)return -1;
k++;
b/=g;
p/=g;
tmp=tmp*(a/g)%p;
if(tmp==b)return k;
g=gcd(a,p);
}
int x=BSGS(a,b*inv(tmp,p)%p,p);
if(x==-1)return -1;
return x+k;
}
附录
费马小定理及其证明
若$p$是质数,则对于任意整数$a$,有$a^pequiv apmod{p}$。
证明:
若$gcd(a,p)=1$,由欧拉定理
$$a^{phi(p)}equiv 1pmod{p}$$
因为$p$是质数,所以$phi(p)=p-1$,即
$$a^{p-1}equiv 1pmod{p}$$
两边同时乘$a$
$$a^pequiv apmod{p}$$
否则$gcd(a,p)
e 1$,即$pmid a$,所以
$$a^pequiv aequiv 0pmod{p}$$
综上所述,得证。
欧拉定理及其证明
若正整数a,n互质,则$a^{phi(n)}equiv 1pmod{n}$。
证明:
用运算封闭和简化剩余系怕讲不懂,来个简单版的。
设$[1,n]$内与$n$互质的数的集合为$A=left{a_1,a_2,...,a_{phi(n)} ight}$,集合元素有$phi(n)$个且互不相同。
因为$gcd(a,n)=1$,所以对于任意的$i$,有
$$gcd(a imes a_imod n,n)=1$$
又因为对于任意的$i,j$,$a_i
otequiv a_jpmod n$,所以
$$a_i imes a
otequiv a_j imes apmod n$$
我们可以构造这样一个集合$B=left{a_1 imes amod n,a_2 imes amod n,...,a_{phi(n)} imes amod n ight}$,其中每个元素小于$n$且与$n$互质,互不相同,总数为$phi(n)$个。
发现了什么?$A$集合和$B$集合完全是相等的!
我们分别把两个集合的元素累乘起来,得到
$$a_1 imes a_2 imes ... imes a_{phi(n)}equiv a_1 imes a imes a_2 imes a imes... imes a_{phi(n)} imes a$$
两边约掉$A$集合的所有元素,即
$$a^{phi(n)}equiv 1pmod{n}$$
得证
拓展欧拉定理及其证明
$$a^bequivegin{cases}a^{bmodphi(m)}&gcd(a,m)=1\a^b&gcd(a,m)
e1&b<phi(m)\a^{bmodphi(m)+phi(m)}&gcd(a,m)
e1&bgeqslantphi(m)end{cases}$$
上式在$mod m$意义下
证明推论一:
设$b=k imesphi(m)+r$,所以$r=bmodphi(m)$
$$a^bequiv a^{k imesphi(m)+r}equiv (a^{phi(m)})^k imes a^rpmod m$$
因为$gcd(a,m)=1$,由欧拉定理知,$a^{phi(m)}equiv1pmod m$,代入原式
$$a^bequiv a^{k imesphi(m)+r}equiv (a^{phi(m)})^k imes a^requiv a^requiv a^{bmodphi(m)}pmod m$$
推论一得证
证明推论二:
太显然了,略。
证明推论三:
思路来自@ouuan巨佬
取$m$的一个质因数$p$,$m$可以表示为$p^r imes s$的形式,显然$gcd(p,s)=1$
所以有欧拉定理$p^{phi(s)}equiv 1pmod s$,又因为$phi(m)=phi(p^r) imesphi(s)$,所以
$$(p^{phi(s)})^{phi(p^r)}equiv 1^{phi(p^r)}pmod s$$
$$p^{phi(m)}equiv 1pmod s$$
设$p^{phi(m)}=ks+1$,两边同时乘$p^r$,得到
$$p^{phi(m)+r}equiv ks imes p^r+p^r$$
$$p^{phi(m)+r}equiv km+p^r$$
$$p^{phi(m)+r}equiv p^rpmod m$$
当$bgeqslant r$时
$$p^bequiv p^{b-r} imes p^requiv p^{b-r} imes p^{phi(m)+r}equiv p^{b+phi(m)}pmod m$$
施工中……