1. 程式人生 > >求最大公約數——歐幾里得演算法

求最大公約數——歐幾里得演算法

歐幾里得演算法

部分內容轉載於:歐幾里得演算法(輾轉相除法)原理 **輾轉相除法:**以大數除以小數,如果能整除,那麼小數就是所求的最大公約數(Greatest CommonDivisor:gcd)。否則就用餘數來除剛才的除數;再用這新除法的餘數去除剛才的餘數。依此類推,直到一個除法能夠整除,這時作為除數的數就是所求的最大公約數。即:gcd(x,y)表示x與y的最大公約數,有gcd(x,y)=gcd(y,x%y),如此便可把原問題轉化為求兩個更小數的公約數,直到其中一個數為0,剩下的另外一個數就是兩者的最大公約數。

int gcd(int a, int b)
{//遞迴版本的歐幾里得演算法求最大公約數(a>b)
	return b ? gcd(b, a%b) : a;
}

證明:a可以表示成a = kb + r,則r = a mod b

假設d是a,b的一個公約數,則有d|a, d|b (表示a,b 能夠zhen整除d) r = a - kb,因此d|r

因此d是(b,a mod b)的公約數 (試想為什麼寫(b,a mod b ),而不寫(a,a mod b )?) -------疑問1

假設d 是(b,a mod b)的公約數,則d | b , d |r ,但是a = kb +r

因此d也是(a,b)的公約數

因此(a,b)和(b,a mod b)的公約數是一樣的,其最大公約數也必然相等,得證。

答疑1 :因為 a = kb + r,b 和 r 的公約數一定就是被a整除,也一定是(a,b)公約數。如果寫成(a,a mod b )的話,不能保證r能被b

整除。

2 ?為什麼終止條件是b=0?

因為(a,b) 和(b,r)有共同的一樣公約數,最大公約數就是r