【C語言】聊聊輾轉相除法

xVIX發表於2020-12-13

輾轉相除法,又名歐幾里德演算法。
用於計算兩數最大公約數(gcd)

主要思想是:gcd(a,b)=gcd(b,a%b) (a>=b)

原理證明也很簡單:
先不妨設a=kb+r,a=cx,b=cy(c為最大公約數,也即x和y已無公因式)

r=a-kb=c(x-ky)=>說明c是約數,那麼只需證明c是最大的公約數,也即x-ky和y無公因式即可

這裡的證明採用反證法
假設x-ky=md,y=nd (d>1)
則x=md+ky=md+knd=d(m+kn)
a=cx=(m+kn)cd,b=cy=ncd =>a與b存在一個公約數cd>c
與c是a與b的最大公約數矛盾
也即結論錯誤,二者無公因式

QED

那麼清楚原理後,程式碼實現就很簡單了

你可以寫成遞迴的

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

也可以寫成迴圈的

int gcd(int a,int b)
{
	while(b!=0)
	{
		int r=a%b;
		a=b;
		b=r;
	}		
	return a;
}

相關文章