1.來源
設兩數為a、b(a>b),求a和b最大公約數(a,b)的步驟如下:用a除以b,得a÷b=q
......r1(0≤r1)。若r1=0,則(a,b)=b;若r1≠0,則再用b除以r1,得b÷r1=q......r2 (0≤r2).若r2=0,則(a,b)=r1,若r2≠0,則繼續用r1除以r2,……如此下去,直到能整除為止。其最后一個為被除數的余數的除數即為(a, b)。
例如:a=25,b=15,a/b=1
......10,b/10=1......5,10/5=2.......0,最后一個為被除數余數的除數就是5,5就是所求最大公約數。
2.原理

3.算法
自然語言描述
用輾轉相除法確定兩個正整數 a 和 b(a≥b) 的最大公因數gcd(a,b):
當a mod b=0 時gcd(a,b)=b,否則
gcd(a,b) = gcd(b,a mod b)
遞歸或循環運算得出結果
/** * * @return int * @tags @param m * @tags @param n * @tags @return * @todo 【方法二】利用輾除法 */ public static int gcd(int m, int n) { while (true) { if ((m = m % n) == 0) return n; if ((n = n % m) == 0) return m; } }
4.時間復雜度
輾轉相除法的運算速度為 O(n),其中 n 為輸入數值的位數。
輾轉相除法處理大數時非常高效,它需要的步驟不會超過較小數的位數(十進制下)的五倍。加百利·拉梅(GabrielLamé)於1844年證明了這點,開創了計算復雜性理論。
5.應用
求不定方程的一組整數解方法
[注:以下出現的qi,ri括號中的是下標,gcd(a,b)為a,b的最大公約數]
輾轉相除法可以求出特定條件的不定方程的一組整數解。
設不定方程為ax+by=c,其中a,b,c為整數,且 gcd(a,b) | c
a,b輾轉相除的算式為
b=q1 a+r2
a=q2 r2+r3
r2=q3 r3+r4
...
rn-2=qn-1rn-1+rn
rn-1=qnrn
其中rn=gcd(a,b),不妨令b=r0,a=r1,rn+1=0
第i個算式為
ri-1= qi×ri+ ri+1
所以ri+1= ri-1 - qi×r(i)
......(1)
用公式(1)可以得到rn=gcd(a,b)關於a,b的線性組合sa+tb=gcd(a,b)
舉例說明
例如不定方程為326x+78y=4,求出一組整數解x,y
求(326,78)的算式為:
326=4*78+14
14=326-4*78
78=5*14+8
8=78-5*14
14=1*8+6
6=14-1*8
8=1*6+2
2=8-1*6
6=3*2
所以
2=8-6=8-(14-8)
=2*8-14=2*(78-5*14)-14
=2*78-11*14=2*78-11*(326-4*78)
=46*78-11*326
即2=(-11)*326+46*78
所以4=(-22)*326+92*78
所以x = - 22, y = 92是不定方程326x+78y=4的一組解。
6.相關原理
兩個整數的最大公約數是能夠同時整除它們的最大的正整數。
輾轉相除法基於如下原理:兩個整數的最大公約數等於其中較小的數和兩數的相除余數的最大公約數。
例如,252和105的最大公約數是21(252 = 21 × 12;105 = 21 × 5);
因為252 ÷105 = 2
......42,所以(105,42)是21。在這個過程中,較大的數縮小了,所以繼續進行同樣的計算可以不斷縮小這兩個數直至余數變為零。這時的除數就是所求的兩個數的最大公約數。由輾轉相除法也可以推出,兩數的最大公約數可以用兩數的整數倍相加來表示,如21 = 5 × 105 + (−2) × 252。這個重要的等式叫做貝祖等式(又稱“裴蜀定理”)。