歐幾里得演算法及其擴充套件學習筆記
阿新 • • 發佈:2019-01-22
歐幾里得演算法
在歐幾里得著的《幾何原本》裡面,有用線段的劃分來講解這個數學方法的,這裡我們從代數而不是幾何上來講,並且側重於演算法OI競賽。
歐幾里得演算法(),又稱輾轉相除法,可以用來快速計算兩個整數的最大公約數,並有許多擴充套件應用。
下面我們來看公式:
我們可以簡單的證明一下這個公式的正確性:
我們令,那麼顯然(表示為的因子)。又因為,那麼我們可以將寫為,那麼,而肯定為整數,所以,那麼顯然,(因為為的因子)。接下來我們令,那麼顯然有,又因為前面我們可以得知,所以就有,那麼。
所以程式碼就簡單啦!
遞迴邊界為時,因為模數不能為0,所以此時就可以直接返回。
int gcd(int n,int m){
if(!m) return n;
else return gcd(m,n%m);
}//也可以用自帶的__gcd(n,m);
擴充套件歐幾里得演算法
-
前置
-
裴蜀定理(貝祖定理)
內容:對於一個係數為整數(為整數)的二元一次方程,若其存在整數解,當且僅當。
用處:判斷一個上述的二元一次方程是否有整數解。
簡單的證明:
我們令,同樣的我們可以將寫成,那麼顯然,所以。
所以當時必然有整數解,下面我們將在擴充套件歐幾里得演算法講解給出證明,及其整數解的求法。
正題
- Exgcd
在前提下是否一定有整數解呢?
因為有了前提,所以我們可以將原式寫成,由於為整數,那麼如果有整數解,那麼原式一定有整數解(倍數關係),那麼只需證明並求出的一組特殊解,然後所有的解都可以表示出來(原來的解就是現在解的倍)。
所以現在我們只需證明有解即可。
通過的遞推式可知,我們如果的到如下式子的一組解:
令解為,那麼就有如下推導:
一個小引理當,必然有一組解為。
所以有一組解為