前提:參數中的a,b必須爲自然數。
1.先上輾轉相除法的代碼:
public static int gcd(int a,int b){
if(b==0){
return a;
}else{
return gcd(b,a%b);
}
}
一開始沒必要比較ab大小,因爲gcd在第一次會自己矯正,使得a>b。
2.擴展歐幾里得:
一定存在一對x,y,使得方程ax+by=gcd(a,b)成立。
如何求解xy?
因爲gcd(a,b)=gcd(b,a%b),又因爲總存在x,y使ax+by=gcd(a,b)
那麼ax1+by1=bx2+a%by2;
又因爲a%b=a-(a/b)*b 注:a/b是向下取整
所以ax1+by1=bx2+(a-(a/b)b)y2=ay2+b(x2-(a/b)y2)
所以x1=y2,y1=x2-(a/b)y2
在gcd中添加幾句代碼,就成了extgcd
3.ax+by=gcd(a,b)解的大小:
如果ab!=0,則|x|<=b且|y|<=a。a、b爲自然數。
class Int{
int v;
}
public class Main {
public static Int x,y;
public static int extgcd(int a,int b,Int x,Int y){
int d=a;
if(b==0){
x.v=1;
y.v=0;
}else{
d=extgcd(b,a%b,y,x);
y.v-=(a/b)*x.v;
}
return d;
}