擴展歐幾里得各類問題模板

  擴展歐幾里得各類問題模板

  昨天看了一下擴展歐幾里得,今天找了幾個模板


1.歐幾里得(最大公約數,最小公倍數)

int gcd(int a,int b)
{
    if((b==0)   return a;
    else   gcd(b,a%b);       
}


2.擴展歐幾里得求最小整數解

給出 a*x+b*y=c

int e_gcd(int a,int b,int &x,int &y)
{
    if(b==0)
    {
        x=1;
        y=0;
        return a;
    }
    int ans,tep;
    ans=gcd(b,a%b,x,y);
    tep=x;
    x=y;
    y=tep-a/b*y;
}

這是求的 a*x+b*y=gcd(a,b)   如果 c%gcd(a,b)==0  ,就說明有解,

最小整數解爲 b=b/gcd(a,b)   x=x*(c/gcd(a,b))   x=(x%b+b)%b


3.最小乘法逆元

感覺和最小整數解差不多,就是最後  a*x + m*y = 1

什麼是乘法逆元 

例如:4關於1模7的乘法逆元爲多少?
4X≡1 mod 7
這個方程等價於求一個X和K,滿足
4X=7K+1
其中X和K都是整數。
若ax≡1 mod f, 則稱a關於模f的乘法逆元爲x。也可表示爲ax≡1(mod f)。
int cal(int a,int m)
{
    int x,y;
    int gcd=e_gcd(a,m,x,y);
    if(1%gcd!=0) return -1;
    x*=1/gcd;
    m=abs(m);
    int ans=x%m;
    if(ans<=0) ans+=m;
    return ans;
}





   

發佈了74 篇原創文章 · 獲贊 48 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章