擴展歐幾里得

前提:參數中的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;
	}
發佈了76 篇原創文章 · 獲贊 3 · 訪問量 3953
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章