Eculid算法 以及Extend_Eculid算法 證實及實現

Eculid算法  歐幾里得算法

證實:

設兩數a,b(a<b). 算法

  1. 令c=gcd(a,b) . 則 設a=mc, b=nc 。
  2. 因此 r= r =a-kb=mc-knc=(m-kn)c  。
  3. 因此 c也是r的因數 。
  4. 能夠判定 m-kn 與 n 互質 。【假設m-kn=xd,n=yd (d>1),則m=kn+xd=kyd+xd=(ky+x)d,則a=mc=(ky+x)cd,b=nc=ycd,則a與b的一個公約數cd>c,故c非a與b的最大公約數,與前面結論矛盾】,所以,c也是b與r的最大公約數。
  5. 得證。

代碼實現:spa

int gcd (int a, int b) { return b == 0 ? a : gcd(b, a%b); }

Extend_Eculid  拓展歐幾里得算法

證實:

設a>bcode

當b=0時,a∗1+b∗0=a=gcd(a,b),此時x=1,y=0blog

當b!=0時,設遞歸

a∗x1+b∗y1=gcd(a,b) class

b∗x2+a%b∗y2=gcd(b,a%b)gc

因爲gcd(a,b)=gcd(b,a%b),因此有a∗x1+b∗y1=b∗x2+a%b∗y2di

將a%b=a−(a/b)∗b代入,co

獲得 a∗x1+b∗y1=a∗y2+b∗x2−(a/b)∗b∗y2block

即 x1=y2,y1=x2−(a/b)∗y2

所以能夠遞歸的定義exgcd,一樣b=0時遞歸結束。返回最大公約數

代碼實現:

void ext_gcd(int a, int b, int &d, int &x, int &y) { if(!b) { d = a; x = 1; y = 0; } else { ext_gcd(b, a%b, d, y, x); y -= x*(a/b); } }
相關文章
相關標籤/搜索