日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

同余逆元简单总结

發(fā)布時(shí)間:2023/12/10 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 同余逆元简单总结 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

# 同余&逆元

1. 同余

1. 同余的基本概念及性質(zhì)

  • \(x\)%\(m=a\)即m是 x-a 的一個(gè)因子, 則稱x與a關(guān)于m同余,記作:\[x \equiv a(mod \;m)\]
  • 同余基本性質(zhì):
  • ○1. 自反性:\(a \equiv a(mod\;m)\)

    ○2. 對(duì)稱性:\(a \equiv b(mod\;m) \rightarrow b \equiv a(mod\;m)\)

    ○3. 傳遞性:\(a \equiv b(mod\;m),b \equiv c(mod\;m) \rightarrow a \equiv c(mod\;m)\)

    ○4. 同加性:\(a \equiv b(mod\;m) c \equiv d(mod\;m) \rightarrow a+c \equiv b+d(mod\;m)\)

    ○5. 同乘性:\(a \equiv b(mod\;m) c \equiv d(mod\;m) \rightarrow ac \equiv bd(mod\;m)\)

    ○6. 同冪性:\(a \equiv b (mod\;m) \rightarrow a^n \equiv b^n(mod m)\)n是自然數(shù)

    ○7. 若\(a \equiv b(mod\;m),n|m\)\(a \equiv b(mod\;n)\)

    ○8. 若\(ac \equiv bc(mod\;m),(c,m)=d\)\(a \equiv b(mod\;\dfrac{m}ozvdkddzhkzd)\)

    ○9. 若\((m,n)=1,a \equiv b(mod\;m),a \equiv b(mod\;n) \Leftrightarrow a \equiv b(mod\;mn)\)

    2. 求解線性同余方程 \(ax≡c(mod\;b)\)

    可轉(zhuǎn)化為求解方程: \(ax+by=c\)
    (同余方程和線性方程的關(guān)系很重要,經(jīng)常用到!!)
    1.預(yù)處理:

    if(a<0) a=-a,c=-c;while(c<0) c+=b;//保證 a,c 為正

    2.第一步: 檢驗(yàn)是否有解

    int gcd=Gcd(a,b);if((c%gcd)!=0) return -1;//若c不是gcd(a,b) 的倍數(shù),則無(wú)解//可以轉(zhuǎn)化為直線上的整點(diǎn)來(lái)理解

    3.第二步:求解同余方程:\(ax≡gcd(a,b)(mod b)\)\(ax+by=gcd(a,b)\)
    擴(kuò)展歐幾里得算法

    inline int ex_gcd(int a,int b) {if(b==0) {x=1;y=0;return a;}int gcd=ex_gcd(b,a%b);int tmp=x;x=y;y=tmp-a/b*y;//擴(kuò)歐return gcd; } //最后得到的x即為原同余方程的一個(gè)可行解;

    擴(kuò)歐的證明:
    當(dāng)最后 b'==0 時(shí)a'==gcd(a,b) 則此時(shí) \(a'x+b'y=gcd(a,b)*x\)
    \(x=1,y=0\)即得最后的一組解。
    考慮從后往前推出\(ax+by=c\)的解:
    設(shè)我們前一步求出的解為\(x_1,y_1,此時(shí)a,b的值就表示為a,b,當(dāng)前的解表示為x,y\)
    那么因?yàn)?span id="ozvdkddzhkzd" class="math inline">\(gcd(a,b)=gcd(b,a\)%\(b),a\)%\(b=a-(a/b)*b\)有:\[b*x_1+(a-(a/b)*b)y_1=gcd(a,b)\]
    則:
    \[b*x_1+(a-(a/b)*b)y_1=ax+by\]
    整理得:
    \[ay_1+b(x_1-(a/b)y_1)=ax+by\]
    容易看出:
    \[x=y_1,y=x_1-(a/b)y_1\]
    即證。

    4.第四步:根據(jù)題意得出答案

    若要求出最小正整數(shù)解:

    while(x<0) x+=b;x%=b;b/=gcd;//mod 要變成 mod/gcd ;(mod 即為 b)x=x*c/gcd;//同余的同乘性質(zhì)while(x<0) x+=b;x%=b;//最小正整數(shù)解

    若要求出解的個(gè)數(shù)(或所有解)

    int tot=gcd(a,b);// 只有g(shù)cd(a,b) 個(gè)解//要求出每個(gè)解,只需對(duì)其不斷加 b/gcd 即可(同時(shí)y-=a/gcd)

    3.求解單變量模線性方程組(中國(guó)剩余定理)

    有如下方程:
    \[\begin{cases} x \equiv a_1 (mod\;m_1)\\ x \equiv a_2 (mod\;m_2)\\ x \equiv a_3 (mod\;m_3)\\ \dots\dots \dots\\ x \equiv a_n (mod\;m_n)\\ \end{cases} \]
    其中\((m_1\;m_2\;m_3\dots m_n\)兩兩互質(zhì)\()\)
    為了方便表示,將x設(shè)為S
    (1)設(shè)\(M=\Pi^n_{i=1}m_i\), 設(shè)\(M_i=M/m_i\)
    (2)可知對(duì)于每一個(gè)\(i有:(M_i,m_i)=1\)
    即:
    \(\qquad\qquad\qquad\qquad\qquad M_ix+m_iy=1\)
    那么\(x為M_1\)的逆元,用\(t_i\)表示
    兩邊同時(shí)擴(kuò)大\(a_i倍\)
    \(\qquad\qquad\qquad\qquad\qquad M_ia_it_i+m_ia_iy=a_i\)

    \(y\)的取值與求解無(wú)關(guān),可將\(a_iy\)視為\(y\),則:

    \(\qquad\qquad\qquad\qquad\qquad M_ia_it_i+m_iy=a_i\)

    那么易知 \(S=M_ia_it_i\)
    則原同余方程組通解為:
    \[x=a_1t_1M_1+a_2t_2M_2+....+a_nt_nM_n+kM,k∈Z\]

    為什么把每一個(gè)加起來(lái)就行了呢?
    因?yàn)槊恳粋€(gè)\(M_i\)都含有因子\(m_j(j\ne i)\),對(duì)于其他的同余方程不產(chǎn)生影響。
    若要求最小正整數(shù)解,則對(duì)\(M\)取模即可。

    代碼如下:

    //中國(guó)剩余定理求解單變量模線性同余方程組 int CRT(int a[],int m[],int h) {int ans=0;int M=1;for(int i=1;i<=h;i++) M*=m[i];//求Mfor(int i=1;i<=h;i++) {ll Mi,ti;Mi=M/m[i];//求Miti=Rev(Mi,m[i]);//求Mi的逆元ans+=((a[i]*Mi%M)*ti)%M;//累加答案if(ans>=M) ans-=M;//取模}return ans; }

    4.擴(kuò)展中國(guó)剩余定理

    這同樣是用來(lái)解決單變量模線性方程組的,但是能夠應(yīng)用于模數(shù)不互質(zhì)的情況
    其實(shí)這個(gè)和中國(guó)剩余定理沒有什么關(guān)系,CRT是用構(gòu)造法,而EXCRT則基于擴(kuò)展歐基里德算法

    做法:
    還是如下方程:
    \[\begin{cases} x≡a_1 (mod\;m_1)\\ x≡a_2 (mod\;m_2)\\ x≡a_3 (mod\;m_3)\\ \dots\dots \dots\\ x≡a_n (mod\;m_n)\\ \end{cases} \]

    其中\(m_1\ m_2\ m_3\ m_4 \dots m_n\)不一定互質(zhì)

    我們可以發(fā)現(xiàn)左邊的式子都是相同的,于是有了同余方程合并這種操作
    既然是合并,我們只要討論兩個(gè)式子的時(shí)候的情況
    對(duì)于:
    \[\begin{cases} x \equiv a_1\ (mod\ m_1)\\ x \equiv a_2\ (mod\ m_2)\\ \end{cases} \]
    可以看做是兩個(gè)方程:
    \[\begin{cases} x =a_1+x_1m_1\\ x =a_2+x_2m_2\\ \end{cases} \]
    合并一下得到:\[a_1+x_1m_1=a_2+x_2m_2\]
    移項(xiàng):\[x_1m_1=a_2-a_1+x_2m_2\]
    假定\(a_2 \geq a_1\),設(shè)為\(c\),再化為同余方程:\[m_1x_1\equiv c\ (mod\ m_2)\]

    \(gcd(m_1,m_2)=d\),該同于方程有解當(dāng)且僅當(dāng)\(d|c\),所以如果\(d\)不整除\(c\)則整個(gè)同余方程組無(wú)解
    反之,由同余的性質(zhì)得:\[\frac{m_1}ozvdkddzhkzdx_1\equiv \frac{c}ozvdkddzhkzd\ (mod \frac{m_2}ozvdkddzhkzd)\]
    \(d_1=\dfrac{m_1}ozvdkddzhkzd,d_2=\dfrac{m_2}ozvdkddzhkzd,c_2=\dfrac{c}ozvdkddzhkzd\)
    由于此時(shí)\(d_1,d_2\) 一定互質(zhì),所以\(d_1\)在模\(d_2\)的意義下一定有逆元,記為\(d_1^{-1}\),那么可以解出\(x_1\)(其實(shí)就是擴(kuò)歐)
    \[x_1=d_1^{-1}c_2+d_2x_2\]
    回代進(jìn)一開始的方程:
    \[x=c+(d_1^{-1}c_2+d_2x_2)m_1\]
    展開化簡(jiǎn)得:
    \[x=d_1^{-1}c_2m_1+c+\frac{m_1m_2}ozvdkddzhkzdx_2\]
    于是我們可以得到一個(gè)新的同余方程:
    \[x\equiv d_1^{-1}c_2m_1+c \ (mod\ \frac{m_1m_2}ozvdkddzhkzd)\]

    于是就這樣一直合并下去,最后的解就直接出來(lái)了(注意最后的模數(shù)會(huì)變成\(lcm(m_1,m_2,...,m_n)\))

    中間結(jié)果注意防溢出
    函數(shù)代碼:

    inline void EXCRT() {ll p1,b1,p2,b2;scanf("%lld %lld",&p1,&b1);for(register int i=2;i<=n;++i) {scanf("%lld %lld",&p2,&b2);ll d=gcd(p1,p2);ll c=b2-b1;if(c%d) return void(puts("no solution"));ll d1=p1/d,d2=p2/d,lcm=p1/d*p2;// 這里根據(jù)的是負(fù)數(shù)也能取模 , 可以簡(jiǎn)化代碼c/=d;ll inv,y;exgcd(d1,d2,inv,y);ll x1=Mul(inv,c,d2);b1=(b1+Mul(x1,p1,lcm))%lcm;p1=lcm;}printf("%lld\n",b1%p1);return; }

    5.盧卡斯定理(大組合數(shù)取模)

    對(duì)于組合數(shù)取模,如\[C^m_n\ mod\ p\]
    其中p是一個(gè)質(zhì)數(shù),有如下定理:

    盧卡斯定理:組合數(shù)\(C^m_n\)在模意義下等價(jià)于把n和m看成一個(gè)p進(jìn)制數(shù),對(duì)每一位分別求出組合數(shù)后乘起來(lái)
    比如說(shuō)假設(shè):
    \(n=a_1*p^0+a_2*p^1+a_3*p^3+\dots a_k*p^k,m=b_1*p^0+b_2*p^1+b_3*p^3+\dots b_k*p^k\)
    那么:\[C^m_n\; mod\; p=\prod_{i=0}^k C^{b_i}_{a_i} \; mod\;p\]

    顯然如果p很大的話沒有什么鳥用
    但是當(dāng)p不是特別大的話,我們可以發(fā)現(xiàn)通過這個(gè)定理我們要求的組合數(shù)的n,m都不會(huì)超過p,可以使用階乘來(lái)解決,并且這時(shí)階乘一定和p是互質(zhì)的,一定存在逆元,通過階乘逆元我們可以直接算出組合數(shù)
    復(fù)雜度是\(O(p\ log_pn)\),預(yù)處理階乘逆元就直接是\(O(p+log_pn)\)了,看上去還是很有用的

    主要代碼:

    inline ll C(ll n,ll m,ll p){if(m>n) return 0;return fac[n]*fpow(fac[m],p-2,p)%p*fpow(fac[n-m],p-2,p)%p; } ll Lucas(ll n,ll m,ll p) {if(!m) return 1;return C(n%p,m%p,p)*Lucas(n/p,m/p,p)%p; }

    6.擴(kuò)展盧卡斯定理

    還是這個(gè)東西:\[C^m_n\ mod\ p\]
    但是p不一定是質(zhì)數(shù)
    這個(gè)其實(shí)和盧卡斯定理也沒有什么很大的關(guān)系
    我們先把p給質(zhì)因數(shù)分解:\[p=p_1^{k_1}p_2^{k_2}p_3^{k_3}\dots p_n^{k_n}\]
    可以看出,如果所有的k都是1的話,我們?cè)O(shè)\(C_n^m=x\),對(duì)每一個(gè)\(p_i\)分別用盧卡斯定理求出組合數(shù)\(C_i\),那么就變成了求解一系列的同余方程組:
    \[\begin{cases} x \equiv C_1 \ mod\ p_1 \\ x \equiv C_2 \ mod\ p_2 \\ x \equiv C_3 \ mod\ p_3 \\ x \equiv C_4 \ mod\ p_4 \\ x \equiv C_5 \ mod\ p_5 \\ \end{cases} \]
    于是我們可以用中國(guó)剩余定理進(jìn)行合并,求出最后的x,顯然在模p意義下最后只會(huì)有唯一解

    問題在于我們現(xiàn)在的p可能不是一次,而是有k次,要想用CRT來(lái)進(jìn)行合并只能靠求出\(C_n^m\ mod\ p_i^{k_i}\)
    因?yàn)橐淹嗍?span id="ozvdkddzhkzd" class="math inline">\(x\equiv a\ (mod\ p_1p_2)\)拆開必須要滿足\(p_1\)\(p_2\)互質(zhì),顯然兩個(gè)相同的數(shù)不會(huì)互質(zhì)

    于是問題轉(zhuǎn)化為快速求出\(C_n^m\ mod\ p_i^{k_i}\)
    為方便,我們?cè)O(shè)現(xiàn)在考慮的模數(shù)是\(p^k\),\(p\)是一個(gè)質(zhì)數(shù)
    還是考慮用階乘來(lái)解決:\[C^m_n=\dfrac{n!}{m!(n-m)!}\]
    我們仔細(xì)觀察可以發(fā)現(xiàn)\(n!\)中含有的\(p\)這個(gè)因子的個(gè)數(shù)一定會(huì)不少于\(m!(n-m)!\)中p的個(gè)數(shù),我們可以很容易得到一個(gè)階乘中含有的p的個(gè)數(shù)的遞推公式:\[f(n)=f(\lfloor { \frac{n}{p} }\rfloor)*\lfloor { \frac{n}{p} }\rfloor\]
    例如我們要求:\(9!\)\(2\)的個(gè)數(shù):
    \[9!=1\times2\times3\times4\times5\times6\times7\times8\times9 \\ =1\times3\times5\times7\times9\times[2\times(1\times2\times3\times4)] \]
    這就比較直觀了,有了這個(gè)的話,我們假設(shè)求出階乘中不含\(p\)的項(xiàng)的積,這樣就可以通過逆元來(lái)進(jìn)行組合數(shù)計(jì)算了,只需要最后把因該有的\(p\)給再乘上去就行了

    于是問題再次變?yōu)槿绾慰焖偾蟪鲭A乘

    其實(shí)方法在上面\(9!\)的變換中就可以發(fā)現(xiàn)了,由于我們不管\(p\)有多少,發(fā)現(xiàn)提出來(lái)一個(gè)\(p\)之后,右邊那部分的階乘可以遞歸進(jìn)行計(jì)算,就是\(\lfloor { \frac{n}{p} }\rfloor!\),于是關(guān)鍵在于計(jì)算左邊
    由于是模p意義下,在上面的式子中,可以發(fā)現(xiàn)左邊其實(shí)全部都是1,手玩一下其他的發(fā)現(xiàn)顯然這個(gè)東西是以p個(gè)一循環(huán)的,并且可能會(huì)剩下不超過p個(gè)數(shù)
    所以循環(huán)部分算出一個(gè)然后快速冪\(n/p\)次,最后還會(huì)剩下\(n\%p\)個(gè),直接暴力算這些
    所以對(duì)于一次的階乘要算的次數(shù)也不會(huì)超過\(O(p)\)次,總共有\(log_pn\)
    所以計(jì)算一個(gè)階乘的復(fù)雜度為\(O(p\ log_pn)\)
    總復(fù)雜度也就是把所有模數(shù)的復(fù)雜度加起來(lái),最高也不超過最大質(zhì)因子的復(fù)雜度
    所以我們就解決了這個(gè)問題
    剩下的就是算出逆元,求出組合數(shù),處理多余的質(zhì)因子p,然后CRT合并

    代碼:

    #include<bits/stdc++.h> using namespace std; typedef long long ll; ll n,m;int p; inline void exgcd(int a,int b,int&x,int &y){if(!b) {x=1;y=0;return;}exgcd(b,a%b,x,y);int tmp=x;x=y;y=tmp-a/b*y;return; } template<class T>inline int fpow(int x,T k,int mod){int ret=1;for(;k;k>>=1,x=(ll)x*x%mod) if(k&1) ret=(ll)ret*x%mod;return ret;} template<class T>inline void Inc(T&x,int y,int mod){x+=y;if(x>=mod) x-=mod;return;} inline int Fac(ll n,int pi,int pk){if(n<=1) return 1;int ret=1,rsub=Fac(n/pi,pi,pk),res=n%pk;if(n>=pk) {for(int i=2;i<=pk;++i) if(i%pi) ret=(ll)ret*i%pk;ret=fpow(ret,n/pk,pk)%pk;} // 統(tǒng)計(jì)長(zhǎng)度為模數(shù)且不含該模數(shù)質(zhì)因子的階乘for(int i=2;i<=res;++i) if(i%pi) ret=(ll)ret*i%pk;//模意義下,直接枚舉模了之后的未統(tǒng)計(jì)數(shù)也可以return (ll)ret*rsub%pk; } inline int Inv(int a,int b) {int x,y;exgcd(a,b,x,y);x=(x+b)%b;return x;} inline ll Count(ll n,int d){return n<d? 0:(Count(n/d,d)+n/d);} inline int C(ll n,ll m,int pi,int pk) {if(m>n) return 0;int facn=Fac(n,pi,pk),facm=Fac(m,pi,pk),facmn=Fac(n-m,pi,pk);//求解三個(gè)階乘ll num=Count(n,pi)-Count(m,pi)-Count(n-m,pi);//把p這個(gè)質(zhì)因子都提出來(lái)單獨(dú)算(其實(shí)算階乘的時(shí)候沒有處理這些數(shù))return (ll)facn*Inv(facm,pk)%pk*Inv(facmn,pk)%pk*fpow(pi,num,pk)%pk; } inline int EXLucas(ll n,ll m,int p){if(n<m) return 0;if(n==m||!m) return 1;int ans=0;int x=p;for(int i=2;i<=p;++i)if(!(x%i)){int pk=1;while(!(x%i)) pk*=i,x/=i;int res=C(n,m,i,pk);Inc(ans,(ll)res*(p/pk)%p*Inv(p/pk,pk)%p,p);}return ans; } int main(){scanf("%lld %lld %d",&n,&m,&p);printf("%d\n",EXLucas(n,m,p));}

    Upd: 稍微改了一下上面的模板 , 下面的模板是預(yù)處理階乘后的 , 這樣 \(p\) 這部分的復(fù)雜度就不用帶 \(log\) 了。

    int FC[4][N],Pr[4]={0,3,11,100003},mo[4]={0,81,121,100003};//這里用于預(yù)處理到模數(shù)(不含其質(zhì)因子)的階乘,存放質(zhì)因子和分解后模數(shù) inline int gcd(int a,int b){return b? gcd(b,a%b):a;} inline int Count(int n,int d){return n<d? 0:(n/d+Count(n/d,d));}//計(jì)算階乘中的該因子個(gè)數(shù) inline void Exgcd(int a,int b,int &x,int &y){if(!b) {x=1;y=0;return;}Exgcd(b,a%b,x,y);int tmp=x;x=y;y=tmp-a/b*y;return; } inline int Inv(int a,int mod){a%=mod;int x,y;Exgcd(a,mod,x,y);return (x+mod)%mod;} inline int Fac(int n,int id){//階乘return n<=Pr[id]? FC[id][n]:((ll)fpow(FC[id][mo[id]],n/mo[id],mo[id])*FC[id][n%mo[id]]%mo[id]*Fac(n/Pr[id],id))%mo[id]; } inline int Comb(int n,int m,int id){//組合數(shù)int facn=Fac(n,id),facm=Fac(m,id),facnm=Fac(n-m,id);int Pop=fpow(Pr[id],Count(n,Pr[id])-Count(m,Pr[id])-Count(n-m,Pr[id]),mo[id]);if(!Pop) return 0;return (ll)facn*Inv(facm,mo[id])%mo[id]*Inv(facnm,mo[id])%mo[id]*Pop%mo[id]; } inline int ExLucas(int n,int m){if(n<m) return 0;if(!n&&!m) return 1;int ret=0;for(int i=1;i<=3;++i) {int C=Comb(n,m,i);Inc(ret,(ll)C*Inv(mod/mo[i],mo[i])%mod*(mod/mo[i])%mod);}return ret%mod; }//壓行真的好看多了

    7.二次剩余

    求解 \(x\) 使得:
    \[x^2\equiv n \ (mod\ p)\]
    \(p\) 如果是 \(2\) 那么 \(x=n\) 一定是 \(n\)的一個(gè)二次剩余 , 所以這里討論的 \(p\)都是奇質(zhì)數(shù)。

    首先二次剩余并不一定存在 , 其存在的充要條件是: \(n^{\frac{p-1}{2}} \equiv 1\ (mod\ p)\)
    證明(以下運(yùn)算均在模意義下):
    首先我們有 \(x^{p-1}=1\)
    把要求的東西左右各 \(\frac{p-1}{2}\) 次方那么就是 \(n^{\frac{p-1}{2}}=x^{p-1}=1,\)證畢。

    求解方法:

    法1:
    我們可以利用質(zhì)數(shù) \(p\) 的原根 \(g\) 來(lái)解決這個(gè)問題
    我們找到一個(gè) \(d\) 使得,\(g^d=n\),因?yàn)?\(g\)\(p\) 的原根那么一定是有解的,可以使用 \(BSGS\) 求解。
    那么問題變成 \(x^2=g^d\) , 可以證明 \(d\) 一定是一個(gè)偶數(shù) ,所以 \(x=g^{\fracozvdkddzhkzd{2}}\) ,就做完了。
    復(fù)雜度為 \(O(\sqrt p)\) ,因?yàn)橐褂?\(BSGS\) 算法求解離散對(duì)數(shù)。

    法2:
    這就是一種很數(shù)學(xué)的方法了。
    我們隨機(jī)一個(gè)數(shù) \(a\) 滿足 \(a^2-n\) 沒有二次剩余,這樣的期望次數(shù)為 2 。
    然后令 \(\delta=\sqrt{a^2-n}\),定義一個(gè)新的數(shù)域,所有數(shù)可以表示為 \(a+b\delta\)
    結(jié)論是 \((a+\delta)^{\frac{p+1}{2}}\) 就是 \(n\) 的二次剩余。

    證明:
    因?yàn)?\(a^2-n\) 沒有二次剩余,所以 \((a^2-n)^{\frac{p-1}{2}}\neq 1\)
    由費(fèi)馬小定理得到 \((a^2-n)^{p-1}=1\) , 那么由代數(shù)基本定理這個(gè)形如 \(x^2=1\) 的方程只有 \(+1,-1\) 兩個(gè)根,所以 \((a^2-n)^{\frac{p-1}{2}}=-1\)
    也就是 \(\delta^{p-1}=-1\)

    然后考慮 \((a+\delta)^{p}\)
    \[(a+\delta)^p=\sum_{i=0}^p a^i\delta^{p-i}{p\choose i}\]

    因?yàn)?\(p\) 是一個(gè)奇質(zhì)數(shù),所以組合數(shù)在\(\mod p\) 意義下時(shí)當(dāng)且僅當(dāng) \(i=0\)\(i=p\) 時(shí)才不為0

    所以:\((a+\delta)^p=a^p+\delta^p\)
    因?yàn)?\(a^p=a,\delta^p=-\delta\)

    \((a+\delta)^p=a-\delta\)
    \((a+\delta)^{p+1}=a-\delta\)

    代碼:

    inline int Get_sqrt(int n){//二次剩余if(n<=1) return n;if((int)sqrt(n)*(int)sqrt(n)==n) return (int)sqrt(n);srand(time(NULL));int a,delta,D=(mod-1)>>1;while(233) {a=rand()%mod;delta=Dif((ll)a*a%mod,n);if(fpow(delta,D)!=1) break;}D=(mod+1)>>1;int b=1;int c=1,d=0;while(D){if(D&1) {int _c=c;c=((ll)a*c+(ll)b*d%mod*delta)%mod,d=((ll)a*d+(ll)b*_c)%mod;}int _a=a;a=((ll)a*a+(ll)b*b%mod*delta)%mod;b=(2ll*b*_a)%mod;D>>=1;}c=min(c,mod-c);return c; }

    2.逆元

    1.定義:在 mod m 的意義下,設(shè)b是a的逆元,則:\(a*b≡1 (mod\;m)\)

    2.求解方法:

    1.線性遞推法
    逆元的遞推公式:\[inv[i]=(P-P/i)*inv[P\%i]\%P\]

    階乘逆元的遞推公式:\[inv[i]=inv[i+1]*(i+1)\%P\]

    上面的\(inv[i]\)表示 \(i!\) 的逆元

    2.擴(kuò)展歐基里德法:

    在上面我們用擴(kuò)歐求了如下同余方程的解:\[ax \equiv b\ (mod\ p)\]

    而逆元是求的這個(gè)同余方程:\[ax \equiv 1\ (mod\ p)\]

    所以把b直接設(shè)為1然后擴(kuò)歐解出x的最小正整數(shù)解就是a的逆元了

    可以發(fā)現(xiàn)a,p一定要互質(zhì),不然同余方程無(wú)解,即a在a和p不互質(zhì)的情況下是沒有逆元的

    3.費(fèi)馬小定理

    費(fèi)馬小定理:
    當(dāng)a和p互質(zhì)且p是質(zhì)數(shù)時(shí),有
    \[a^{p-1} \equiv 1 \ (mod\ p)\]

    相當(dāng)于是:\[a^{p-2}*a \equiv 1\ (mod\ p)\]
    所以\(a^{p-2}\)就是a的逆元了

    4.歐拉定理

    歐拉定理:
    當(dāng)a和p互質(zhì)時(shí),有
    \[a^{\varphi(p)} \equiv 1\ (mod\ p)\]

    所以\(a\)的逆元是\(a^{\varphi(p)-1}\),其實(shí)費(fèi)馬小定理是歐拉定理在p是質(zhì)數(shù)時(shí)的一個(gè)特殊情況

    補(bǔ)充:
    擴(kuò)展歐拉定理:
    \[ a^b \equiv\begin{cases} a^{b \%\varphi(p)+\varphi(p)}\ (mod\ p) & ,b> \varphi(p)\\ a^b & ,b\leq \varphi(p)\\ \end{cases} \]

    證明不會(huì)

    小結(jié):逆元在a和p互質(zhì)的情況下才有

    轉(zhuǎn)載于:https://www.cnblogs.com/NeosKnight/p/10391254.html

    總結(jié)

    以上是生活随笔為你收集整理的同余逆元简单总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。