求逆元[數論]

來源:互聯網
上載者:User

這兩天都沒什麼東西做出來的../.T_T

第一次接觸到逆元是11年大連的最後一題.囧啊,不會..什麼都不會,網賽z怎麼破

比如:  (8/2)%5 
我們求a*b*c*d*e*f*g..../z 前面乘積部分LL存不下所以要一邊mod一邊乘
最後處理到除z時,不一定能除盡
比如前面那個例子,8/5=3,3除不盡2就乘以2%5的逆元在%5
2%5的逆元=2^(5-2)=8 這是計算逆元的一種方法,後面講。還有一直哦你方法是擴充歐幾裡德演算法也是後面詳細講。
(3*8)%5=4=4%5

===

在計算(a/b)%Mod時,往往需要先計算b%Mod的逆元p(b有逆元的條件是gcd(b,Mod)==1,顯然素數肯定有逆元),然後由(a*p)%Mod得結果c。這裡b的逆元p滿足(b*p)%Mod=1。先來簡單證明一下:
(a/b)%Mod=c;    (b*p)%Mod=1;    ==》   (a/b)*(b*p) %Mod=c;    ==》    (a*p)%Mod=c;


從上面可以看出結論的正確性,當然這裡b需要是a的因子。接下來就需要知道根據b和Mod,我們怎麼計算逆元p了。擴充歐幾裡德演算法,大家應該都知道,就是已知a、b,求一組解(x,y)使得a*x+b*y=1。這裡求得的x即為a%b的逆元,y為b%a的逆元(想想為什嗎?把方程兩邊都模上b或a看看)。調用ExtGcd(b,Mod,x,y),x即為b%Mod的逆元p。
 求b%Mod的逆元p還有另外一種方法,即p=b^(Mod-2)%Mod,因為b^(Mod-1)%Mod=1(這裡需要Mod為素數)。

以上來自:http://hi.baidu.com/zhanggmcn/item/ef4dadceb4fb993e449416e7

如例子    3/2%5=4; 2*3%5=1  ==>  (3/2)*(2*8)%5=4  ==> (3*8)%5=4

===

關於擴充歐幾裡德:
首先擴充歐幾裡德主要是用來與求解線性方程相關的問題,所以我們從一個線性方程開始分析。現在假設這個線性方程為a*x+b*y=m,如果這個線性方程有解,那麼一定有gcd(a,b) | m,即a,b的最大公約數能夠整除m(m%gcd(a,b)==0)。證明很簡單,由於a%gcd(a,b)==b%gcd(a,b)==0,所以a*x+b*y肯定能夠整除gcd(a,b),如果線性方程成立,那麼就可以用m代替a*x+b*y,從而得到上面的結論,利用上面的結論就可以用來判斷一個線性方程是否有解。
      那麼在a*x+b*y=m這個線性方程成立的情況下,如何來求解x和y呢?
      1.令a1=a/gcd(a,b),b1=b/gcd(a,b),m1=m/gcd(a,b)。如果我們能夠首先求出滿足a*x1+b*y1=gcd(a,b)這個方程的x1和y1,那麼x=x1*m1,y=y1*m1就可以求出來了。由歐幾裡德演算法gcd(a,b)=gcd(b,a%b),所以a*x1+b*y1=gcd(a,b)=gcd(b,a%b)=b*x2+(a%b)*y2,現在只要做一些變形就可以得到擴充歐幾裡德演算法中的用到的式子了。令k=a/b(商),r=a%b(餘數),那麼a=k*b+r。所以r=a-k*b,帶入上式,得到a*x1+b*y1=b*x2+(a-(a/b)*b)y2=a*y2+b*(x2-(a/b)*y2)
=> x1=y2,y1=x2-(a/b)*y2。有了這兩個式子我們就知道了在用歐幾裡德求最大公約數的時候,相應的參數x,y的變化。現在再回過頭來看一下擴充歐幾裡德演算法的代碼就很好理解了,實際上擴充歐幾裡德就是在求a和b的最大公約數的同時,也將滿足方程a*x1+b*y1=gcd(a,b)的一組x1和y1的值求了出來。下面代碼中突出的部分就是標準的歐幾裡德演算法的代碼。

__int64 exGcd(__int64 a,__int64 b,__int64 &x,__int64 &y){    if(b==0){        x=1;        y=0;        return a;    }    __int64 g=exGcd(b,a%b,x,y);    __int64 temp=x;    x=y;    y=temp-(a/b)*y;    return g;}

     2.那麼x,y的一組解就是x1*m1,y1*m1,但是由於滿足方程的解無窮多個,在實際的解題中一般都會去求解x或是y的最小正數的值。以求x為例,又該如何求解呢?還是從方程入手,現在的x,y已經滿足a*x+b*y=m,那麼a*(x+n*b)+b*(y-n*a)=m顯然也是成立的。可以得出x+n*b(n=…,-2,-1,0,1,2,…)就是方程的所有x解的集合,由於每一個x都肯定有一個y和其對應,所以在求解x的時候可以不考慮y的取值。取k使得x+k*b>0,x的最小正數值就應該是(x+k*b)%b,但是這個值真的是最小的嗎??如果我們將方程最有兩邊同時除以gcd(a,b),則方程變為a1*x+b1*y=m1,同上面的分析可知,此時的最小值應該為(x+k*b1)%b1,由於b1<=b,所以這個值一定會小於等於之前的值。在實際的求解過程中一般都是用while(x<0)x+=b1來使得為正的條件滿足,為了更快的退出迴圈,可以將b1改為b(b是b1的倍數),並將b乘以一個倍數後再加到x上。

以上轉自:http://cie.xtu.edu.cn/acmfan_cn/viewthread.php?tid=844

===

擴充歐幾裡德求逆元模板:#include<iostream>#define __int64 long longusing namespace std;//舉例 3x+4y=1 ax+by=1//得到一組解x0=-1,y0=1 通解為x=-1+4k,y=1-3kinline __int64 extend_gcd(__int64 a,__int64 b,__int64 &x,__int64 &y)//ax+by=1返回a,b的gcd,同時求的一組滿足題目的最小正整數解{    __int64 ans,t;    if(b==0){x=1;y=0;return a;}    ans=extend_gcd(b,a%b,x,y);t=x;x=y;y=t-(a/b)*y;    return ans;    }//(a/b)%mod=c 逆元為p,(p*b)%mod=1//(a/b)*(p*b)%mod=c*1%mod=c// (p*b)%mod=1 等價於 p*b-(p*b)/mod*mod=1其中要求p,b已知 等價於 ax+by=1//其中x=p(x就是逆元),y=p/mod,a=b,b=b*mod 那麼調用extend_gcd(b,b*mod,x,y)即可求(a/b)%mod的逆元等價於a*p%modint main(){    __int64 a,b,x,y,c,gcd,mod,p;//ax+by=c    while(cin>>a>>b>>c)    {          gcd=extend_gcd(a,b,x,y);          cout<<x<<"  "<<y<<endl;          if(c%gcd){cout<<"無解!"<<endl;continue;}          cout<<"x="<<x*c/gcd<<" y="<<y*c/gcd<<endl;          }    return 0;    }

轉自:http://hi.baidu.com/foreverlin1204/item/5e3da7d437b4d290270ae76c

===

根據大連I題和大神代碼..再改了一個一個模板:

貼上模板:

#include <iostream>using namespace std;int x,y,rev;
void extend_Euclid(int a, int b){    if(b==0)    {        x = 1;        y = 0;        return;    }    extend_Euclid(b, a%b);    int t = x;    x = y;    y = t - a/b*y;}int main(){    //b%mod的逆元    int b,mod;    while(cin>>b>>mod){       // x=0;y=0;        extend_Euclid(b,mod);        cout<<(x%mod+mod)%mod<<endl;    }    return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.