同余


同余的定义

给定整数$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$$

 施工中……

posted @ 2019-08-15 16:41  Soledad_S  阅读(900)  评论(1编辑  收藏  举报