擴充歐幾裡得演算法(exgcd)

來源:互聯網
上載者:User

標籤:soft   演算法   sof   ccf   sub   div   乘法   應用   gcd   

Bezout定理

  對於任意整數a,b,存在一對整數x,y滿足:a*x+b*y=gcd(a,b)

證明如下:

  在歐幾裡得演算法的最後一步:b=0,即:gcd(a,0)=a

對於b>0,根據歐幾裡得演算法gcd(a,b)=gcd(b,a%b)。假設存在一對x,y滿足:b*x+(a%b)*y=gcd(b,a%b)

因為b*x+(a%b)*y=b*x+(a-b*(a/b))*y=a*y+b*(x-(a/b)*y)   //規定這裡和下一行的除號‘/‘是向下取整。

所以令x‘=y,y‘=x-(a/b)*y,就得到了a*x‘+b*y‘=gcd(a,b)。對歐幾裡得演算法過程應用數學歸納法,該定理成立。

代碼模板如下:

int exgcd(int a,int b,int &x,int &y){    if (b==0) return {x=1; y=0; return a;}//歐幾裡得演算法最後一步,返回gcd(a,b)    int d=gcd(b,a%b,x,y);//歐幾裡得演算法遞迴     int z=x; x=y; y=z-(a/b)*y;    return d; }

注意到,上述的代碼中x,y均是引用的方式進行傳遞的,求出x,y的一組解,並且返回a,b的最大公約數d。

那麼Bezout有什麼具體用處呢?求解線性方程!

具體說明如下:

對於一般的方程:a*x+b*y=c 若方程有解,則滿足裴蜀定理:gcd(a,b) | c ,我們可以先求出a*x+b*y=gcd(a,b)的一組特

解x0,y0,再令x0,y0同*c/d,那麼就是a*x+b*y=c 的一組特解(x0*c/d,y0*c/d)。

乘法逆元,線性同意方程求解都是需要Bezout的。

 

擴充歐幾裡得演算法(exgcd)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.