• 同余



    同余的定义

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

     施工中……

  • 相关阅读:
    关于《注意力模型--Attention注意力机制》的学习
    神经网络参数计算
    FPN(feature pyramid networks)算法讲解
    RetinaNet-focal loss
    论文阅读: RetinaNet
    CNN+LSTM:看图说话
    非极大值抑制-NMS
    python IO文件操作 file文件操作
    软件测试定义 分类
    软件生命周期
  • 原文地址:https://www.cnblogs.com/soledadstar/p/11358903.html
Copyright © 2020-2023  润新知