最大公約數與歐幾里得演算法
最大公約數
《哈代數論》第1.1節首先對整除性作出定義:
稱一個整數 a 能被另一個整數 b (b≠0) 整除(divisible),假設存在第3個整數 c 使得 a = bc。用記號 b|a 來表示 a 被 b 整除,或 b 是 a 的一個因子(divisor)。
第2.9節給出了最大公約數的定義:
定義兩個不全為零的整數 a 和 b 的最大公約數(highest common divisor)d:如果 d 是能同時整除 a 和 b 的最大正整數。記為 d = (a,b)。於是有 (0,a) = |a|。可以用同樣的方法定義任意一組正整數 a,b,c,...,k 的最大公約數 (a,b,c,...,k)。
highest common divisor 或 highest common factor 是英國數學界對最大公約數的稱呼(本書作者G.H.哈代和E.M.賴特都是英國數學家),而更為普遍的說法是 gcd(greatest common divisor)。
第2.9節接著證明了下面這個重要的定理(注意:這裡我們所說的數都是指整數,因為這是數論):
定理25 對任意給定的不全為零的整數 a 和 b,令 d = (a,b),方程 ax + by = n 有整數解 x, y,當且僅當 d|n。特別地,ax + by = d 可解。
證明 對任意給定的不全為零的整數 a 和 b,考慮所有形如 ax + by 的整陣列成的集合 S,假設 c 是 S 中的最小正數(S 中含有正數是顯而易見的),如果 n 是 S 中任何一個正數,那麼對所有的 z,n - zc ∈ S。如果 r 是 n 被 c 除得到的餘數,且 n = zc + r,則有 r ∈ S 且 0 ≤ r < c。既然 c 是 S 中的最小正數,故有 r = 0 以及 n = zc。同樣的推理對 S 中的負數也成立。所以,S 是某個正數 c 的倍數 zc 組成的集合。由於 c 整除 S 中的每一個數,所以它必整除 a 和 b,於是 c ≤ d。另一方面,由 d|a, d|b 可得 d|(ax + by),所以 d 整除 S 中的每一個數,特別有 d|c。由此推得 c = d,於是 S 就是 d 的倍陣列成的集合。這就證明了定理。
歐幾里得演算法
第12.3節介紹了歐幾里得演算法(在中國稱為輾轉相除法,可追溯至東漢出現的《九章算術》):
假設 a ≥ b > 0。用 b 除 a 得到 a = q1b + r1,其中 0 ≤ r1 < b。如果 r1 ≠ 0,則可以重複這個程式得到 b = q2r1 + r2,其中 0 ≤ r2 < r1。如果 r2 ≠ 0,則有 r1 = q3r2 + r3,其中 0 ≤ r3 < r2。如此一直下去。非負整數 b, r1, r2, … 構成一個遞減序列,故必然有某個 n 使得 rn+1 = 0。這個程式中的最後兩步是
rn-2 = qnrn-1 + rn (0 < rn < rn-1),
rn-1 = qn+1rn。
關於 r1, r2, … 的這一組方程稱為歐幾里得演算法。
正如同下面的定理所指出的那樣,歐幾里得演算法包含了求 a 和 b 的最大公約數的常用程式。
定理207 rn = (a,b)。
證明 令 d = (a,b)。那麼,通過連續使用這個演算法,我們得到
d|a, d|b → d|r1 → d|r2 → … → d|rn,
所以 d ≤ rn。再次倒推回去,即得
rn|rn-1 → rn|rn-2 → rn|rn-3 → … → rn|b → rn|a。
於是 rn 同時整除 a 和 b。由於 d 是 a 和 b 的公約數中的最大者,故得到 rn ≤ d,從而有 rn = d。
參考資料
相關文章
- 求最大公公約數(最大公因數)—— 歐幾里得演算法演算法
- 最大公約數與最小公倍數演算法演算法
- 最大公約數的演算法演算法
- 尋找最大公因數(歐幾里得演算法)--C語言描述演算法C語言
- java演算法 求最大公約數Java演算法
- 【演算法拾遺】最大公約數演算法
- 演算法設計與分析:求兩個自然數的最大公約數演算法
- 歐幾里得演算法與擴充套件歐幾里得演算法演算法套件
- 最大公約數GCDGC
- C++:最小公倍數與最大公約數C++
- CCF NOI 1028 判斷互質 :利用歐幾里得演算法最大公因數演算法
- 歐幾里得演算法與 EX演算法
- C. 最大公約數
- 《九章算術》中的最大公約數演算法演算法
- 最大公約數和最小公倍數
- 演算法第四版-找兩個數的最大公約數演算法演算法
- 【shell 指令碼】求最大公約數指令碼
- php判斷二個數最大公約數PHP
- 演算法設計與分析-01歐幾里得演算法
- 求多個數最大公約數、最小公倍數的一種變換演算法演算法
- 最大公約數和最小公倍數--java實現Java
- python語言程式設計——求最大公約數和最小公倍數演算法Python程式設計演算法
- acwing246 區間最大公約數
- 求兩個正整數的最大公約數與最小公倍數--C#實現C#
- 歐幾里德演算法(又稱輾轉相除法)求最大公約數,以及最小公倍數演算法
- c語言遞迴函式實現求最大公約數(Euclid演算法)C語言遞迴函式演算法
- 萬能歐幾里得演算法演算法
- linux C(hello world)最大公約數和最小公倍數Linux
- python用輾轉相除法求最大公約數Python
- 輾轉相除法求最大公約數——[js練習]JS
- 6-8 使用函式求最大公約數 (10分)函式
- 進位制均值-進位制轉換+最大公約數
- 51nod1040 最大公約數之和 (尤拉函式 )函式
- 數論學習筆記 (4):擴充套件歐幾里得演算法筆記套件演算法
- 質數與約數
- 演算法學習之路|歐幾里得遊戲演算法遊戲
- 求一個數的最大公約數的三種思路——解題筆記筆記
- 淺談擴充套件歐幾里得演算法套件演算法