1. 程式人生 > >歐幾里得演算法及其擴充套件學習筆記

歐幾里得演算法及其擴充套件學習筆記

歐幾里得演算法

在歐幾里得著的《幾何原本》裡面,有用線段的劃分來講解這個數學方法的,這裡我們從代數而不是幾何上來講,並且側重於演算法OI競賽。

歐幾里得演算法(gcdgcd),又稱輾轉相除法,可以用來快速計算兩個整數的最大公約數,並有許多擴充套件應用。

下面我們來看公式:
gcd(n,m)=gcd(m,nmodm)gcd(n,m)=gcd(m,n\ \rm mod\ m)

我們可以簡單的證明一下這個公式的正確性:
我們令g=gcd(n,m)g=gcd(n,m),那麼顯然gn,gmg|n,g|m

aba|b表示aabb的因子)。又因為nmodm=nm×nmn\ \rm mod\ m=n-m\times \lfloor\frac{n}{m}\rfloor,那麼我們可以將n,mn,m寫為n=k1g,m=k2gn=k_1g,m=k_2g,那麼nmodm=nm×nm=k1gk2gk1gk2g=g(k1k2k1gk2g)n\ \rm mod\ m=n-m\times \lfloor\frac{n}{m}\rfloor=k_1g-k_2g\lfloor\frac{k_1g}{k_2g}\rfloor=g\left(k_1-k_2\left\lfloor\frac{k_1g}{k_2g}\right\rfloor\right)
,而(k1k2k1gk2g)\left(k_1-k_2\left\lfloor\frac{k_1g}{k_2g}\right\rfloor\right)肯定為整數,所以g(nmodm)g|(n\ \rm mod\ m),那麼顯然ggcd(m,nmodm)g|gcd(m,n\ \rm mod\ m),(因為ggn,mn,m的因子)。接下來我們令g^=gcd(m,nmodm)\hat g=gcd(m,n\ \rm mod\ m)
,那麼顯然有g^g\hat g|g,又因為前面我們可以得知gg^g|\hat g,所以就有g=g^g=\hat g,那麼gcd(n,m)=gcd(m,nmodm)gcd(n,m)=gcd(m,n\ \rm mod\ m)

所以程式碼就簡單啦!
遞迴邊界為m=0m=0時,因為模數不能為0,所以此時就可以直接返回nn

int gcd(int n,int m){
	if(!m) return n;
	else return gcd(m,n%m); 
}//也可以用自帶的__gcd(n,m);

擴充套件歐幾里得演算法

  • 前置

  • 裴蜀定理(貝祖定理)

內容:對於一個係數為整數(a,b,ca,b,c為整數)的二元一次方程ax+by=cax+by=c,若其存在整數解,當且僅當gcd(a,b)cgcd(a,b)|c
用處:判斷一個上述的二元一次方程是否有整數解。

簡單的證明:
我們令g=gcd(a,b)g=gcd(a,b),同樣的我們可以將a,ba,b寫成a=k1g,b=k2ga=k_1g,b=k_2g,那麼顯然ax+by=g(k1x+k2y)ax+by=g(k_1x+k_2y),所以g(ax+by)g|(ax+by)

所以當gcd(a,b)cgcd(a,b)|c時必然有整數解,下面我們將在擴充套件歐幾里得演算法講解給出證明,及其整數解的求法。

正題

  • Exgcd

ax+by=cax+by=ccgcd(a,b)c|gcd(a,b)前提下是否一定有整數解呢?

因為有了前提,所以我們可以將原式寫成ax+by=kgcd(a,b)ax+by=k\cdot gcd(a,b),由於kk為整數,那麼如果ax+by=gcd(a,b)ax+by=gcd(a,b)有整數解,那麼原式一定有整數解(倍數關係),那麼只需證明並求出ax+by=gcd(a,b)ax+by=gcd(a,b)的一組特殊解(x1,y1)(x_1,y_1),然後所有的解都可以表示出來(原來的解就是現在解的kk倍)。

所以現在我們只需證明ax+by=gcd(a,b)ax+by=gcd(a,b)有解即可。

通過gcdgcd的遞推式可知,我們如果的到如下式子的一組解:
bx+(amodb)y=gcd(b,amodb)bx+(a\ \rm mod\ b)y=gcd(b,a\ \rm mod\ b)
令解為(x1,y1)(x_1,y_1),那麼就有如下推導:
ax+by=bx1+(amodb)y1ax+by=bx_1+(a\ \rm mod\ b)y_1
=bx1+(aab×b)y1=bx_1+(a-\left\lfloor\frac{a}{b}\right\rfloor\times b)y_1
=ay1+(x1aby1)b=ay_1+(x_1-\left\lfloor\frac{a}{b}\right\rfloor y_1)b
一個小引理當ax+by=az+bkax+by=az+bk,必然x,yx,y有一組解為x=z,y=kx=z,y=k
ax+by=ay1+(x1aby1)bax+by=ay_1+(x_1-\left\lfloor\frac{a}{b}\right\rfloor y_1)b
所以有一組解為x=y1,y=x1