同余
同余的定义
给定整数$m$,若用$m$除两个整数$a$和$b$所得的余数相同,称$a$和$b$对模$m$同余,记作$a\equiv b\pmod{m}$
同余系与剩余系
对于$a\in[0,m-1]$,集合$\{a+km\}(k\in Z)$的所有数模$m$ 同余,余数都是$a$,该集合称为一个模$m$的同余类,简记为$\bar{a}$.
模$m$的同余类一共有$m$个,分别为$\bar{0}$,$\bar{1}$,$\bar{2}$ $.$ $.$ $.$ ,$\bar{m-1}$ 。它们构成$m$的完全剩余系。
$[1,m]$中与m互质的数代表的同余类共有$\phi(m)$个,它们构成的$m$简化剩余系。
说白了,完全剩余系是$[0,m-1]$中所有的同余类,简化剩余系是互质的同余类。
上面并没有什么用
同余的性质
对于整数$a$,$b$,$c$和自然数$n$,$m$,对模$m$同余满足:
自反性:$a\equiv a\pmod{m}$
对称性:若$a\equiv b\pmod{m}$,那么$b\equiv a\pmod{m}$
传递性:若$a\equiv b\pmod{m}$,$b\equiv c\pmod{m}$,那么$a\equiv c\pmod{m}$
同加性:若$a\equiv b\pmod{m}$,$c\equiv d\pmod{m}$,那么$a\pm c\equiv b\pm d\pmod{m}$
同乘性:若$a\equiv b\pmod{m}$,$c\equiv d\pmod{m}$,那么$ac\equiv bd\pmod{m}$
同除性(自己取的):若$ac\equiv bd\pmod{m}$,$\gcd(c,m)=1$,那么$a\equiv b\pmod{m}$
同幂性:若$a\equiv b\pmod{m}$,那么$a^n\equiv b^n\pmod{m}$
不知道什么性:若$a\mod p=x$,$a\mod q=x$,其中$gcd(p,q)=1$,则有$a\mod pq=x $
$a\equiv b\pmod{m}$,当且仅当$m\mid(a-b)$
$a\equiv b\pmod{m}$,当且仅当存在整数$k$,使得$a=b+km$
同余的基本定理
学科分割线
费马小定理
若$p$是质数,则对于任意整数$a$,有$a^p\equiv a\pmod{p}$。
欧拉定理及其推论
若正整数$a$,$n$互质,则$a^{\phi(n)}\equiv 1\pmod{n}$。
推论:若$gcd(a,n)=1$,对于任意正整数$b$,有$a^b\equiv a^{b\mod \phi(n)}\pmod{n}$(这很牛逼,意味着我们可以把一个天文数字级别的指数拉下来)
由以上两个定理:当$p$为质数,$a$,$p$互质时,$a^{p-1}\equiv 1\pmod{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)$怎么办呢?
$B\acute{e}zout$定理说$ax+by=\gcd(a,b)$一定有解,证明在文章最后的附录里
在证明过程中,$B\acute{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\nmid c$,原方程应该无解
二、用拓展欧几里得算法找出$ax+by=\gcd(a,b)$的特解$(x_0,y_0)$
三、原方程的解为$(x_0\times\dfrac{c}{d},y_0\times\dfrac{c}{d})$
乘法逆元
定义:若整数$a$,$p$互质,并且$a\mid b$,若存在一个整数$x$,使得$b/a\equiv b*x\pmod{p}$。称$x$为$a$的模$p$乘法逆元,记为$a^{-1}\pmod p$。
一句话,因为$b\times a^{-1}\equiv b/a\equiv b/a\times a\times a^{-1}\pmod{p}$,所以$a\times a^{-1}\equiv 1\pmod{p}$(这里的$-1$不是$-1$次方哟)
所以有了更简单的定义:$a$与$p$互质时,$ax\equiv 1\pmod{p}$,此时$x$为$a$的模$p$乘法逆元
介绍三种求法
一、费马小定理
当p是质数,a,p互质时,我们有费马小定理$a^{p-1}\equiv 1\pmod{p}$,即$a\times a^{p-2}\equiv 1\pmod{p}$,就是$a$的模$p$乘法逆元,快速幂计算即可。
二、拓展欧几里得
$ax\equiv1\pmod {b}$把它变为等式$ax+by=1$
在上面我们讨论过此类不定方程的解法,这里只温习一遍。
首先要想有解就要满足$\gcd(x,y)\mid1$
所以$\gcd(x,y)$必须等于1,用$\gcd(x,y)$代替1
原式就变成了$ax+by=\gcd(a,b)$
这不就是裸的拓欧吗?直接跑一遍就行了呗。
三、线性递推
用于求一连串数字模$p$意义下的逆元
首先$1^{-1}=1\pmod p$,即1在模所有数的意义下逆元都是1(在模1意义下没有意义)
然后设$p=k\times i+r$(理解为$p$是被除数,$i$是除数,商$k$,余$r$)
在模p意义下$k\times i+r\equiv 0\pmod {p}$
两边同时乘以i的逆元和r的逆元$k\times i\times i^{-1}\times r^{-1}+r\times r^{-1}\times i^{-1}\equiv 0\pmod {p}$
就是$k\times r^{-1}+i^{-1}\equiv 0\pmod {p}$
$i^{-1}$这一项已经出现了,所以我们移项$i^{-1}\equiv -k\times r^{-1}\pmod {p}$
把$k$和$r$都用$p$和$i$代替$i^{-1}\equiv -\left\lfloor\dfrac{p}{i}\right\rfloor\times(p\mod 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]\times 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\times b^{-1}\mod p$
线性同余方程
对于给定的整数$a$,$b$,$m$,求解满足$ax\equiv b\pmod m$的未知数$x$,或者无解。因为未知数的指数为1,所以称形如这样的方程一次同余方程,亦称线性同余方程。
解法:$ax\equiv b\pmod {m}$可以变形为$ax+my=b$,对于这类不定方程,我们在拓展欧几里得算法提到过解法,就不再说了。
中国剩余定理
设$m_1$,$m_2$,$.$ $.$ $.$,$m_n$是两两互质的整数,$M=\prod_{i=1}^nm_i $,$M_i=M/m$,$t_i$是线性同余方程组$M_it_i\equiv1\pmod {m_i}$的一个解。对于任意的$n$个整数$a_1$,$a_2$,$.$ $.$ $.$,$a_n$,方程组
$$\begin{cases}x\equiv a_1\pmod {m_1}\\x\equiv a_2\pmod {m_2}\\\dots\dots \\x\equiv a_n\pmod {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;
}
拓展中国剩余定理
求解同余方程组
$$\begin{cases}x\equiv a_1\pmod {m_1}\\x\equiv a_2\pmod {m_2}\\\dots\dots \\x\equiv a_n\pmod {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\times M(i\in Z)\right\}$ 是前$k-1$方程解的集合
我们设$x+t\times M\equiv a_k\pmod {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^x\equiv b\pmod{p}$。
Baby Step, Giant Step算法
设$x=i\times t-j$,其中$t=\left\lceil\ \sqrt{p}\right\rceil$,则方程变为$a^{i\times t-j}\equiv b\pmod {p}$, 即$a^{i\times t}\equiv b\times a^j\pmod p$我们枚举每一个$j$,用快速幂算得 $b\times a^j\mod p$,再插入$hash$。
第二次枚举$i$在$[0,t]$中每一个取值,算得$a^{t\times i}\mod p$,若在$hash$中有值,意味着我们找到了最小的$i$和$j$,此时$x=i\times 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^x\equiv b\pmod p$。
$a$,$p$不一定互质了,那我们尽力把它搞成互质的。
先变成等式
$$a^x+py=b$$
设$d_1=\gcd(a,p)$,两边同时除以$d_1$
$$a^{x-1}\times \dfrac{a}{d1}+\dfrac{p}{d_1}\times y=\dfrac{b}{d}$$
再次变为同余式
$$a^{x-1}\times \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}\times D_1\times \dfrac{a}{d_2}\equiv\dfrac{b_1}{d_2}\pmod \dfrac{p_1}{d_2}$$
经过$n$波操作后,我们终于得到了一个互质的式子
$$a^{x-n}\times D_n\equiv b_n\pmod {p_n}$$
其中$D_n=\prod_{i=1}^n\dfrac{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^p\equiv a\pmod{p}$。
证明:
若$\gcd(a,p)=1$,由欧拉定理
$$a^{\phi(p)}\equiv 1\pmod{p}$$
因为$p$是质数,所以$\phi(p)=p-1$,即
$$a^{p-1}\equiv 1\pmod{p}$$
两边同时乘$a$
$$a^p\equiv a\pmod{p}$$
否则$\gcd(a,p)\ne 1$,即$p\mid a$,所以
$$a^p\equiv a\equiv 0\pmod{p}$$
综上所述,得证。
欧拉定理及其证明
若正整数a,n互质,则$a^{\phi(n)}\equiv 1\pmod{n}$。
证明:
用运算封闭和简化剩余系怕讲不懂,来个简单版的。
设$[1,n]$内与$n$互质的数的集合为$A=\left\{a_1,a_2,...,a_{\phi(n)}\right\}$,集合元素有$\phi(n)$个且互不相同。
因为$\gcd(a,n)=1$,所以对于任意的$i$,有
$$\gcd(a\times a_i\mod n,n)=1$$
又因为对于任意的$i,j$,$a_i\not\equiv a_j\pmod n$,所以
$$a_i\times a\not\equiv a_j\times a\pmod n$$
我们可以构造这样一个集合$B=\left\{a_1\times a\mod n,a_2\times a\mod n,...,a_{\phi(n)}\times a\mod n\right\}$,其中每个元素小于$n$且与$n$互质,互不相同,总数为$\phi(n)$个。
发现了什么?$A$集合和$B$集合完全是相等的!
我们分别把两个集合的元素累乘起来,得到
$$a_1\times a_2\times ... \times a_{\phi(n)}\equiv a_1\times a\times a_2\times a\times... \times a_{\phi(n)}\times a$$
两边约掉$A$集合的所有元素,即
$$a^{\phi(n)}\equiv 1\pmod{n}$$
得证
拓展欧拉定理及其证明
$$a^b\equiv\begin{cases}a^{b\mod\phi(m)}&\gcd(a,m)=1\\a^b&\gcd(a,m)\ne1&b<\phi(m)\\a^{b\mod\phi(m)+\phi(m)}&\gcd(a,m)\ne1&b\geqslant\phi(m)\end{cases}$$
上式在$\mod m$意义下
证明推论一:
设$b=k\times\phi(m)+r$,所以$r=b\mod\phi(m)$
$$a^b\equiv a^{k\times\phi(m)+r}\equiv (a^{\phi(m)})^k\times a^r\pmod m$$
因为$\gcd(a,m)=1$,由欧拉定理知,$a^{\phi(m)}\equiv1\pmod m$,代入原式
$$a^b\equiv a^{k\times\phi(m)+r}\equiv (a^{\phi(m)})^k\times a^r\equiv a^r\equiv a^{b\mod\phi(m)}\pmod m$$
推论一得证
证明推论二:
太显然了,略。
证明推论三:
思路来自@ouuan巨佬
取$m$的一个质因数$p$,$m$可以表示为$p^r\times s$的形式,显然$\gcd(p,s)=1$
所以有欧拉定理$p^{\phi(s)}\equiv 1\pmod s$,又因为$\phi(m)=\phi(p^r)\times\phi(s)$,所以
$$(p^{\phi(s)})^{\phi(p^r)}\equiv 1^{\phi(p^r)}\pmod s$$
$$p^{\phi(m)}\equiv 1\pmod s$$
设$p^{\phi(m)}=ks+1$,两边同时乘$p^r$,得到
$$p^{\phi(m)+r}\equiv ks\times p^r+p^r$$
$$p^{\phi(m)+r}\equiv km+p^r$$
$$p^{\phi(m)+r}\equiv p^r\pmod m$$
当$b\geqslant r$时
$$p^b\equiv p^{b-r}\times p^r\equiv p^{b-r}\times p^{\phi(m)+r}\equiv p^{b+\phi(m)}\pmod m$$
施工中……