寫詩或者寫程序的時候,我們經常要跟歐幾里得算法打交道。然而有沒要考慮到為什么歐幾里得算法是有效且高效的,一些偏激(好吧,請允許我用這個帶有濃重個人情感色彩的詞匯)的計算機科學家認為,除非程序的正確性在數學上得到了完全嚴格的證實,否則我們不能認為程序是正確的。既然存在即合理,因此下面我就詳細得解說一下歐幾里得算法,它為什么是正確的算法(算法過程就不給出了,有了思想,無論是迭代還是循環實現應該都不成問題),為什么有那么好的時間復雜性。
首先還是證明上述命題:注意到證明了該命題就證明了歐幾里得算法的正確性。
證明:令d = gcd(m, n),則d|m 且d|n。設m = kn + r(0≤ r < n),則 d|(kn+r)。又有d|n,因此d|kn,所以有d|r。即我們由d|m 且d|n 這個前提可以得出d|r。換就話說,我們也可以說成由d|m 且d|n 這個前提推出了d|n 且 d|r。使用類似的推理過程同樣可以得到:由d|n 且 d|r 可以推出d|m 且 d|n。注意到這里的r 即 m mod n。因此我們可以說gcd(m, n) = gcd(n, m mod n)是雙向成立的,命題得證。
關於歐幾里得定理我還是想多說一點,那就是歐幾里得本人給出的證明過程,他的思維清晰,邏輯嚴密,雖然采用的幾何證法,但是不失嚴密和優美。下面我就簡略地復述一遍我們敬愛的歐幾里得先生給出的證明,原版證明見歐幾里得的成名作品《幾何原本》:如果m 和n 互素,那么它們的最大公約數顯然是1。如果兩者不互素的話:首先,想象兩段線段,它們的長度分別是m 和n。姑且把他們稱作線段AB 和CD。我們取其中較短的一段量取另一段,姑且認為CD 是其中較短的線段,如果CD 量盡AB,這時它也量盡它自己,那么CD 就是CD、AB的一個公度數,顯然CD 同時也是最大公度數,因為沒有比CD 大的數能量盡CD。但是,如果CD 量不盡AB,那么從AB,CD中的較大者中不斷地減去較小者,如此,將有一個余數能量盡它前面一個。我們說這個數就是m 和n 的最大公度數,為什么呢?假設這個余數不是最大公度數,那么必有大於該數的一個數能量盡AB 和 CD,最后我們能推出大於該余數的這個數能量盡這個余數,注意到這是不可能的,因為較大的數量盡較小的數是不可能的。通過這個反證的過程,我們知道沒有大於該余數的數能量盡AB,CD。因而這個數就是AB 和 CD也即m 和n 的最大公度數。
好了,證明到這里先告一段落,下面我們來考察一下歐幾里得算法的效率。
令r0 = m mod n, r1 = n mod r0。於是有gcd(m, n) = gcd(n, r0) = gcd(r0, r1)。只需要注意到這一事實:r0 < m/2 或者 r1 < n/2。就可以知道在兩步之內算法的規模減半了,也就是說,其時間復雜度為2logn = O(logn)。這就是其時間復雜度的上界。如果你隨便寫一個算法,它的時間復雜度是O(logn),那么世界該有多么美好啊。
All Rights Reserved.
Author:海峰:)
Copyright © xp_jiang.
轉載請標明出處:http://www.cnblogs.com/xpjiang/p/4485409.html