設兩數a,b(a<b). 算法
- 令c=gcd(a,b) . 則 設a=mc, b=nc 。
- 因此 r= r =a-kb=mc-knc=(m-kn)c 。
- 因此 c也是r的因數 。
- 能夠判定 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的最大公約數。
- 得證。
代碼實現:spa
int gcd (int a, int b) { return b == 0 ? a : gcd(b, a%b); }
設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); } }