輾轉相除法

(重定向自欧几里得算法

数学中,辗转相除法,又称欧几里得算法(英語:Euclidean algorithm),是求最大公约数算法。辗转相除法首次出现于欧几里得的《几何原本》(第VII卷,命题i和ii)中,而在中国则可以追溯至东汉出现的《九章算术》。

辗转相除法的演示动画:
两条线段長分别可表示252和105,則其中每一小分段長代表最大公因數21。如动画所示,只要輾轉地从大数中减去小数,直到其中一段的长度为0,此时剩下的一条线段的长度就是252和105的最大公因数。

两个整数的最大公约数是能够同时整除它们的最大的正整数。辗转相除法基于如下原理:两个整数的最大公约数等于其中较小的数和两数相除余数的最大公约数。例如,252和105的最大公约数是21();因为,所以147和105的最大公约数也是21。在这个过程中,较大的数缩小了,所以继续进行同样的计算可以不断缩小这两个数直至余数为零。这时,所剩下的还没有变成零的数就是两数的最大公约数。由辗转相除法也可以推出,两数的最大公约数可以用两数的整数倍相加来表示,如。这个重要的結論叫做貝祖定理

辗转相除法最早出现在欧几里得的《几何原本》中(大约公元前300年),所以它是现行的算法中歷史最悠久的。这个算法原先只用来处理自然数和几何长度(相當於正實數),但在19世纪,辗转相除法被推广至其他类型的數學對象,如高斯整数和一元多项式。由此,引申出欧几里得整环等等的一些现代抽象代数概念。后来,辗转相除法又扩展至其他数学领域,如纽结理论多元多项式

辗转相除法有很多应用,它甚至可以用来生成全世界不同文化中的传统音乐节奏。[1]在现代密码学方面,它是RSA算法(一种在电子商务中广泛使用的公钥加密算法)的重要部分。它还被用来解丢番图方程,比如寻找满足中国剩余定理的数,或者求有限域元素。辗转相除法还可以用来构造连分数,在施图姆定理和一些整数分解算法中也有应用。辗转相除法是现代数论中的基本工具。

辗转相除法处理大数时非常高效,如果用除法而不是减法实现,它需要的步骤不会超过较小数的位数(十进制下)的五倍。拉梅于1844年证明了这点,同時這也標誌著计算复杂性理论的開端。

背景编辑

最大公约数编辑

欧几里得的辗转相除法计算的是两个自然数  的最大公约数 ,意思是能够同时整除  的自然数中最大的一个。两个数的最大公约数通常写成 ,或者简写成 [2],但是第二种写法也被使用在其他数学概念,如二维向量的坐标。

如果 ,則稱  互素[3]ab是否互素和它们是否素数无关。[4]如,6和35都不是素数,因为它们都可以分解为多于一个素因数的乘积:6 = 2 × 3,35 = 5 × 7。但是,6和35互素,因为除了1以外没有自然数同时整除6和35。

 
一个24×60的长方形正好被十个12×12的方格填满,其中12是24和60的最大公约数。一般地,当且仅当   的公约数时, 尺寸的长方形可被边长c的正方形正好填满。

 。由于  都是 的整数倍,所以可以写成 ,并且不存在更大的整数 使等式成立。为了使 尽可能大,就要使  中所有公约数都提取出来归入 中,所以自然数  一定互素,并且  的最大公约数 可以被  的所有其他公因数 整除。[5]

我们可以用右图来解释最大公约数的概念:[6]設一个长方形的边长为  。因为  的任何公约数 都可以整除  ,所以长方形的边都可以等分为长度为 的线段,也就是长方形可以被边长为 的正方形正好填满。而最大公约数 是所有可能的 中最大的一个。例如,一个24 × 60的长方形区域可以分成1 × 1、2 × 2、3 × 3、6 × 6或12 × 12的正方形网格。也就是说,12是24和60的最大公约数。

  的最大公约数是两数共有的素因数的乘积。[7]例如,462可以分解成2 × 3 × 7 × 11;1071可以分解成3 × 3 × 7 × 17。462和1071的最大公约数等于它们共有的素因数的乘积3 × 7 = 21。如果两数没有公共的素因数,那么它们的最大公约数是1,也即这两个数互素。辗转相除法的优点就在於它能以有系統的方式求出兩數的最大公约数,而無需分別對它們作因式分解。[8][9]大数的素因数分解被認為是一個困難的問題,即使是现代的计算机也非常难於處理,所以许多加密系统的原理都是建基於此。[10]

在数学中,尤其是抽象代数环论中,最大公约数有一个更加巧妙的定义:[11]  的最大公约数 [11]  的线性和中的最小正整數,即所有形如 (其中  是整数)的数中的最小正整数。可以證明,所有 都是 的整数倍( ,其中 是整数)。用现代数学语言來說,  生成的理想即是由 生成的主理想。最大公约数的这个定义和其他定义的等价性将在下面描述。

三个数的最大公约数的定义和两个数的相同,即是它们共有的素因数的积[12],它们或者也可以按下式计算[13]

 

所以,欧几里得的辗转相除法实际可以计算任意多整数的最大公约数。

归纳、递归和无穷递降编辑

下文的論證會用到三種相關的数学方法,分別是数学归纳法递归无穷递降。数学归纳法[14]经常用来证明某個定理對所有自然数成立:[15]首先证明定理对一个特定的数 成立(通常是1);然后證明如果定理对自然数 成立的話,那麼它对自然数 成立。這樣,便可證明定理对所有大于 的自然数也成立。递归[16]是将相关的数组成一个数列 ),[17]當中除初始項外,其中每一项都用前一项或前几项表示。如斐波那契数列就是递归的,每一项 都等于  )。辗转相除法中的一些等式也是递归的。最后,无穷递降[18]是用方程的一个自然数解导出比它小的自然数解。[19]但是,这种转化不能永远进行下去,因为只有有限個小於原來的自然数解的自然数。所以,要麼方程無解,不然在有限步内必然能得出最小的自然數解。在下文會用到此法來证明辗转相除法一定会在有限步内结束。

算法描述编辑

计算过程编辑

辗转相除法是一种递归算法,每一步计算的输出值就是下一步计算时的输入值。[20] 表示步骤数(从0开始计数),算法的计算过程如下。

每一步的输入是都是前两次计算的非負余数  。因为每一步计算出的余数都在不断减小,所以, 小于 。在第 步中,算法计算出满足以下等式的 余数 

 

其中 。也就是 要不断减去 直到比 小。

為求簡明,以下只說明如何求兩個非負整數  的最大公約數(負數的情況是簡單的)。在第一步计算时( ),设  分别等于  ,第2步(此时 )时计算 (即 )和 (第一步计算产生的余数)相除产生的商和余数,以此类推。整个算法可以用如下等式表示:

如果有 ,算法的第一步實際上會把兩個數字交換,因為這時 除以 所得的商 會等于0,余数 則等于 。然後,算法的第二步便是把 除以 ,再計算所得之商和餘數。所以,對於 總有 ,即运算的每一步中得出的余数一定小于上一步计算的余数。

由于每一步的余数都在减小并且不为负数,必然存在第 步时 等于0,使算法终止[21] 就是  的最大公约数。其中 不可能无穷大,因为在 和0之间只有有限个自然数。

正确性的证明编辑

辗转相除法的正确性可以分成两步来证明。[20]在第一步,我們會證明算法的最终结果 同时整除  。因为它是一个公约数,所以必然小于或者等于最大公约数 。在第二步,我們證明 能整除 。所以 一定小于或等于 。两个不等式只在 时同时成立。具体证明如下:

  1. 證明 同時整除  
    因爲餘數 是0, 能夠整除 
      因爲 能夠整除 ,所以也能夠整除 
      同理可證 可以整除所有之前步驟的餘數,包括  ,即   的公約數, 
  2. 證明最大公約數 能整除 
    根據定義,  可以寫成 的倍數:  ,其中  是自然數。因爲 ,所以 整除 。同理可證 整除每個餘數 。因爲最大公約數 整除 ,因而 

因为第一步的证明告诉我们 ,所以 。即:[22][23]

 

举例编辑

 
算法的演示动画。最初的绿色矩形的长和宽分别是  ,从中不断铺上462×462的正方形直到剩下部分面积是462×147;然后再铺上147×147的正方形直至剩下21×147的面积;最后,铺上21×21的正方形时,绿色部分就没有了。即21是1071和462的最大公约数。

例如,计算  的最大公约数的过程如下:从1071中不断减去462直到小于462(可以减2次,即商 ),余数是147:

 

然后从462中不断减去147直到小于147(可以减3次,即 ),余数是21:

 

再从147中不断减去21直到小于21(可以减7次,即 ),没有余数:

 

此时,余数是0,所以1071和462的最大公约数是21,这和用素因数分解得出的结果相同(见上文)用表格表示如下:

步骤数 算式 商和余数
0     
1     
2     (算法终止)

图形演示编辑

辗转相除法的计算过程可以用图形演示。[24]假设我们要在 矩形地面上铺正方形瓷砖,并且正好铺满,其中 大于 。我们先尝试用 的瓷砖,但是留下了 的部分,其中 。我们接着尝试用 的正方形瓷砖铺,又留下了 的部分,然后再使用 的正方形铺……直到全部铺满为止,即到某步时正方形刚好覆盖剩余的面积为止。此时用到的最小的正方形的边长就是原来矩形的两条边长的最大公约数。在图中,最小的正方形面积是21×21(红色),而原先的矩形(绿色)边长是1071×462,所以21是1071和462的最大公约数。

计算商和余数编辑

在每个步骤 中,辗转相除法都需要计算两个数  的商 和余数 

 

其中 。除法的算法保证这样的商和余数总是存在。自然数的除法算法还指出这样的商和余数是惟一的,但这对辗转相除法而言并非必要。[25]

在欧几里得最初的描述中,商和余数是通过连续的减法来计算的,即从 中不断减去 直到小于 。一個更高效的做法是使用整數除法和模除来计算商和余数:

 

计算机实现编辑

辗转相除法可用伪代码表示,比如除法版本可以寫成[26]

function gcd(a, b)
    while b ≠ 0
        t ← b
        b ← a mod b
        a ← t
    return a

C++版本:

int gcd(int m, int n) {
    int t = 1;
    while(t != 0) {
        t = m % n;
        m = n;
        n = t;
    }
    return m;
}

Rust版本:

fn gcd(x: isize, y: isize) -> Option<isize> {
    match (x,y) {
        (0, 0)         => None,
        (a, 0)         => Some(a.abs()),
        (mut a, mut b) => { 
            while b != 0 {
                let t = b;
                b = a % b;
                a = t;
            }

            Some(a.abs()) 
        },
    }
}

Python 3版本:

def gcd(a, b):
    while b != 0:
        t = a % b
        a = b
        b = t
    return a

在第 次循环开始时,变量 的值是前一次运算的余数 ,变量 的值是再前一次运算的余数 。步骤 的作用等同于递归式 。变量 的功能是在下一个余数 计算过程中临时性地保存 的值。在一次循环结束时,变量 的值是前一次运算的余数 ,变量 的值是再前一次运算的余数 

在欧几里得定义的减法版本,取餘运算被减法替换。[27]

function gcd(a, b)
    if a = 0
       return b
    while b ≠ 0
        if a > b
           a ← a − b
        else
           b ← b − a
    return a

变量  的值分别是前两次的余数  。假定第 次循环开始时 大于 ,那么 等于 ,因为 。在循环过程中, 重复减去 直到比 小,此时 就是下一个余数 ;然后 重复减去 直到比 小,此时 就是下一个余数 ;重复执行直到 

以下是递归版本[28]

function gcd(a, b)
    if b = 0
       return a
    else
       return gcd(b, a mod b)

C++递归版本如下:

int gcd(int n,int m)
{
    return  m == 0 ? n : gcd(m, n % m);
}

Rust递归版本:

fn gcd(x: isize, y: isize) -> Option<isize> {
    match (x,y) {
        (0, 0)  => None,
        (a, 0)  => Some(a.abs()),
        _       => gcd(y, x % y),
    }
}

Java版本:

public class MethodOfSuccessiveDivision {
    public static void main(String[] args) {
        System.out.println(gcd(1071, 462));
    }
    public static int gcd(int a, int b){
        if(b == 0){
            return a;
        }else{
            return gcd(b, a % b );
        }
    }
}

Python 3版本:

def gcd(a, b):
    return a if b == 0 else gcd(b, a % b)

例如 的计算过程是:函数的第一次调用计算 ;下一次调用计算 ,在接下来是 

使用绝对值最小的余数编辑

在另一个版本的算法中,每一步还要把取余运算时计算出的商增加一后再重新计算余数(此时计算出的余数应该是负的),然后取两个余数的绝对值较小的数作为下一步运算时使用的余数。[29][30]取余运算后,设 是计算出的余数(此時為正), 是计算出的商:

 

即假設 。然後使用以下式子计算出一个负的余数 

 

如果 ,那么用 替换 进行下一次运算。如利奥波德·克罗内克所指出的,这个版本需要的运算步骤是欧几里得算法的所有版本中最少的。[29][30]

历史发展编辑

 
辗转相除法可能在欧几里得之前几个世纪就已经有了。图为使用两脚规进行测量。

辗转相除法是目前仍然在使用的历史最悠久的算法之一。[31]它首次出现于《几何原本》(卷7命题1–2、卷10命题2–3)(大约公元前300年)。在卷7中用于整数,在卷10中用于线段的长度(以現代的觀點看,线段的长度可視為正实数,也就是說辗转相除法實際可用於實數上,但是当时未有实数的概念)。卷10中出现的算法是几何的,两段线段ab的最大公约数是ab公度中的最大值。

这个算法可能并非欧几里得发明,因為他也有将先前其他數學家的一些成果编进他的《几何原本》。[32][33]数学家、历史学家范德瓦尔登英语Bartel Leendert van der Waerden认为卷7的内容可能来自毕达哥拉斯学院出身的数学家写的关于数论的教科书。[34]辗转相除法在當時很可能已為尤得塞斯(大約公元前375年)所知 [31][35],甚至可能更早之前就已经存在[36][37],因为欧几里得和亚里士多德的著作中都出现了ἀνθυφαίρεσις一词(意为“辗转相减”)。[38]

几个世纪之后,辗转相除法又分别被中国人和印度人独立发现,[39]主要用来解天文学中用到的丢番图方程以及制定准确的历法。5世纪末,印度数学家天文学家阿里亚哈塔曾稱辗转相除法为“粉碎机”,這可能是因为它在解丢番图方程时很有效[40][41]在中国,《九章算术》中提到了一种类似辗转相减法的“更相减损术”[42]。《孙子算经》中則出现了中国剩余定理的一个特例[43],但是直到1247年秦九韶才於其《数学九章》中解答了該定理的一般情況,當中用到了他發明的大衍求一术。此法的其中一部分實際上便是輾轉相除的原理,秦九韶在書中對此有明確表述。[44]在欧洲,辗转相除法首次出现于克劳德·巴希特英语Claude Gaspard Bachet de Méziriac的著作《愉悦讨喜的问题》(Problèmes plaisants et délectables)的第二版[41]在欧洲,辗转相除法被用于丢番图方程和構建连分数。后来,英国数学家桑德森英语Nicholas Saunderson在其著作中收編了扩展欧几里得算法,作为一個有效计算连分数的方法。他將此法的來源歸名於罗杰·科茨英语Roger Cotes[45]

19世纪,辗转相除法促成了新数系的建立,如高斯整数艾森斯坦整数。1815年,高斯用辗转相除法证明高斯整数的分解是惟一的,儘管他的研究到了1832年才首度发表。[46]高斯在他的《算数研究》(出版于1801年)中實際上也有援引这个算法,但僅是以连分数方法的形式敘述。[39]约翰·狄利克雷是第一个将辗转相除法作为数论的基础的数学家。[來源請求]狄利克雷提出,数论中的很多结论,如分解的惟一性,在任何使辗转相除法適用的数系中均有效。[47]狄利克雷的數論講義後來經理查德·戴德金編輯和推广,戴德金也有以辗转相除法來研究代数整数。比如,他是第一个用高斯整数的分解惟一性证明费马平方和定理的数学家。[48]戴德金还率先定义了欧几里得整环的概念。19世纪末,戴德金所定義的理想概念使得數論的重心不必建基於輾轉相除法,從而促進了理論的發展。[49]

“欧几里得算法是所有算法的鼻祖,因为它是现存最古老的非凡算法。”

——高德纳,《计算机程序设计艺术,第二卷:半数值算法》,第二版 (1981), p. 318.

辗转相除法的其他应用发展于19世纪。1829年,施图姆将辗转相除法用于施图姆序列(用于确定多项式的不同实根的个数的方法)。[50]

辗转相除法是历史上第一个整数关系算法英语integer relation algorithm,即寻找两個可通約實數的整数关系的算法。近年来,出现了一些新颖的整数关系算法,如埃拉曼·弗格森英语Helaman Ferguson和福尔卡德于1979年发表的弗格森-福尔卡德算法(Ferguson–Forcade algorithm) [51]、以及与它相关的LLL算法英语Lenstra–Lenstra–Lovász lattice basis reduction algorithmHJLS算法以及PSLQ算法[52][53]

1969年,科尔(Cole)和戴维(Davie)基于辗转相除法创造了一种二人游戏,叫做「欧几里得游戏」。[54]这个游戏有最优策略。[55]游戏开始于两列分别为ab个棋子组成的序列,玩家轮流从较长一列中取走较短一列棋子数量的m倍的棋子。如果两列棋子pq分别由xy个棋子组成,其中x大于y,那么玩家可以將序列p的棋子数量减少为自然数xmy。最后率先将一列棋子清空的玩家胜出。[56][57]

数学上的应用编辑

贝祖等式编辑

贝祖等式说明,两个数  的最大公约数 可以表示为  的线性和。[58]也就是说,存在整数  使 [59][60]

整数  可以从辗转相除法算出的商 计算出。[61] 从辗转相除法的最后一步开始, 可以表示成前一步的商 和前两步的余数  

 

而前两步的余数又分别可以表示成它们前两步的余数和商:

 
 

将这两行式子先後代入第一个式子,可以将 表示成  的线性和。重复进行迭代直到出现  

 
 
 

最终,g可以表示成  的线性和: 贝祖等式以及以上证明都可以扩展至欧几里得整环

主理想和相关问题编辑

贝祖等式提供了另一种定义  的最大公约数 的方法。[11]考虑形如 (其中  是整数)的数的集合。因为  都可以被 整除,所以这个集合中的所有元素都可以被 整除。也就是说这个集合中的数都可以表示成 的倍数,或者  的其他公约数的倍数。但是,只有最大公约数才是这个集合的元素。根据贝祖等式,有 。換言之,当  时得出 。任何其他的公约数都不是这个集合的元素,因为它们都不能被比它们大的 整除。相反地, 的任何倍数都属于这个集合,只要令  ,便有:

 

所以,形如 的数的集合等于 的整数倍的集合。也就是说,任意两个数的线性和的集合等同于它们最大公约数的整数倍的集合。  的最大公约数叫做  理想的生成元素。这个最大公约数的定义导出了兩個现代抽象代数的概念:主理想(由单个元素生成的理想)以及主理想整环(其每一理想都是主理想的整环)。

这个结果可以解决某些實際问题。[62]例如,考虑两个容积分别为  的量杯,其中  為正整數。通过加入或倒去 倍第一个量杯的体积以及 倍第二个量杯的体积的液体,任何体积为 的液体都可以被量出(只要 為正數)。根據贝祖等式,凡是可以被量出的液体,其体积一定是  的最大公约数 的倍數。

扩展欧几里得算法编辑

贝祖等式的整数st可以通过扩展欧几里得算法算出。这个扩展算法在原有辗转相除法的基础上增加了两个递归等式:[63]

 
 

算法开始时:

 ,  
 ,  

加上这兩个递归式后,当算法终止于 ,贝祖等式的整数  分别由  给出。

这个算法的正确性可以用数学归纳法来证明。假设递归至第 步是正确的,也就是假设:

 

 小于 時皆成立。则第 步运算得出以下等式:

 

因为  被假定是正确的,所以可以用  表示:

 

整理后得到第 步的结果,和我们期望得到的结果一致:

 

矩阵法编辑

整数  也可以用矩阵运算得出。[64]辗转相除法的计算过程:

 
 
...
 

可以写作2×2的商矩阵乘以一个2维余数向量:

 

 表示所有商矩阵的乘积:

 

这使辗转相除法化简为:

 

如要用  的线性和表示 ,可將等式两边同时乘以矩阵 逆矩阵[64][65] 行列式等于 ,因为它等于商矩阵的行列式的乘积,而每一个的行列式都是−1。因为 的行列式不为零,最终的余数向量可以利用 的逆矩阵解出:

 

由上式可以得出 

贝祖等式中的两个整数分别是  。矩阵法的效率可前文描述的辗转相除法的递归算法是相同的,每一步都有两次乘法和两次加法。

欧几里得引理和唯一分解编辑

贝祖等式对辗转相除法的很多应用都很重要,如证明自然数的唯一分解性质[66]假设数字L可以写成两个因数  的乘积,即 。如果另一个数  互素的数也能整除 ,那么 必须整除 ,证明如下:如果  的最大公约数是1,则根据贝祖等式存在  使

 

两边都乘以 

 

因为 整除等式右边,所以也应整除等式左边的 。这个结果叫做欧几里得引理[67]如果一个素数整除 那么它至少整除 的一个因数。如果一个数 互素于数列  中的每一个数,则w也一定互素于它们的乘积 [67]

欧几里得引理足以证明每一个自然数的素数分解是惟一的。[68]我们用反证法来证明,假设 可以分别分解成 个素数和 个素数,即:

 

根据假设,每个素数 都能整除 ,因此它必须能够整除某個 ;因为 也是一个素数,所以 。同理,对于每一个 都存在一个 与它相等。所以两种分解除了顺序不同以外是完全相同的。整数分解的惟一性在数学证明中有很多应用,下文将会提到。

线性丢番图方程编辑

 
线性丢番图方程 的图像,它的解用蓝点表示。

丢番图方程是以亚历山大数学家丢番图的名字命名的一类方程,它的解被限制在整数范围。[69]关于整数  的线性丢番图方程形如:[70]

 

其中   是已知整数。这个方程可以写成关于 同余式:

 

   的最大公约数,  都能被 整除,故 能够被 整除。所以, 一定能够被 整除,不然方程就无解。方程两边若同时除以  ,方程就变成了贝祖等式:

 

其中  可以用扩展欧几里得算法求解。[71]所以这个丢番图方程的一个解即是:

 

总体而言,丢番图方程如果有解,就一定有无数个解。[72]只需要考虑两个解  

 

或者可以写成:

 

所以相邻两个解的 之间的差是  之间的差是 。这样,所有的解都可以表示成:

 

 取遍所有整数时,方程所有的解都可以从 计算出来。如果限制為正整数解 (  ) 的话,那么解的数量就可能是有限的。有時候,这种对解的限制使丢番图方程在未知数個數比方程數更多的情况下仍然能有唯一解[73],而在允許實數解的线性方程组中,这種情況是不可能的。

乘法逆和RSA算法编辑

有限域是一个支持四种运算的数集。这四种运算也通稱為加法、减法、乘法、除法,跟一般的四則運算有相同的性质,如交换律结合律分配律。举例来说,使用同余可以让13个数字的集合   构成一个有限域。在这个域中,任何数学运算(加减乘除)都归约成13的,例如  。对于任意素数 ,都可以定义这种有限域;使用更复杂的方法,也可以对素数  次方定义这样的有限域。有限域也叫做伽罗瓦域,其缩写為   

在这样一个有 个数的域中,任何非零元素 都存在惟一乘法逆  使 。这可以通过解同余式 得出,[74]或者也可以解与之等价的丢番图方程[75]

 

这个方程可用扩展欧几里得算法解出(参见上文)。在RSA算法中,寻找乘法逆是非常重要的一步,它决定了使用哪个数来解密信息。[76]虽然RSA算法不使用域而是使用环,扩展欧几里得算法仍然可以用来求乘法逆。欧几里得算法也被应用于纠错码,例如,它可以代替伯利坎普-梅西算法解基于有限域的BCH码里德-所罗门码[77]

中国剩余定理编辑

辗转相除法也可以用來解线性丢番图方程组。[78]如在中国剩余定理中,整数可以表示成被 个互素的数 除留下的余数:[79]

 

为了从  个余数 中确定 的值,我们将这些式子组合成单个线性丢番图方程,其中模数 是所有模数 的乘积,然后定义 如下:

 

也就是, 是除了 以外所有模数的乘积。接着是关键的一步,寻找 个数 使:

 

有了这些数 之后,整数 可以用下式从余数 中解出:

 

因为  的乘法逆,所以可以使用扩展欧几里得算法求出(见上一节)。

连分数编辑

辗转相除法和连分数有着紧密的关系。[80]计算连分数的过程如下:

 

其中每个式子的右边最后一项都等于下一个式子的左边项的倒数。所以前两个式子可以组合成:

 

第三个式子可以代入分母中的 

 

每一步中,最后一项 都可以用下一个式子代换,直至最后一个式子,结果是:

 

上文的例子中计算了 ,其中商 分别是2、3、7,所以分数   可以写成如下连分数形式:

 

整数分解算法编辑

计算最大公约数是很多整数分解算法的重要步骤[81],如Pollard's rho算法英语Pollard's rho algorithm[82]Shor算法[83]Dixon分解法英语Dixon's factorization method[84]以及Lenstra椭圆曲线分解英语Lenstra elliptic curve factorization[85]。用辗转相除法算最大公约数效率非常高。而连分数分解法由于用到了连分数,所以也需要使用辗转相除法[86]

算法效率编辑

 
用辗转相除法求 GCD(x,y) 时所需的步数。红点表示所需步骤较少(快),黄、绿、蓝点所需步骤依次增加(慢)。

辗转相除法的计算效率已经被彻底研究过了。[87]一个算法的效率可以用计算所需步数乘以每步计算的开销表示。加百利·拉梅于1884年指出[88],用辗转相除法计算两个数的最大公约数所需的步数不会超过其中较小数十進制下的位数 的5倍。[89][90]因为每一步的计算开销通常也是 数量级的,所以辗转相除法的复杂度 

计算步数编辑

计算两个自然数  的最大公约数所需的步数可以表示为 [91]如果  的最大公约数是   ,而  是两个互素整数,那么:

 

这可以通过在辗转相除法的计算过程中的每一步都除以 来证明。[92]同样,当  同时乘以 时,计算步数不变: 。所以,对于数值上相近的数,如  ,计算步数可能相差很大。

根据辗转相除法的递归性质可以得出另一个公式:

 

其中,根據定义有 [91]

最差情况编辑

假设用辗转相除法求自然数   )的最大公约数需要 步,那么满足这一条件的  的最小值分别是斐波那契数  [93]这可以用数学归纳法证明。[94]假设  整除 ,满足这一条件的  最小是  ,正是  。现在假设这一规律对 有效。一个需要 步的算法的第一步是 ,第二步是 。因为算法是递归的,它需要 步才能算出 ,其中  的最小值是  。所以 的最小值是当 的时候,此时  。1844年,加百利·拉梅发现这个证明标志着计算复杂性理论的诞生。[95]这也是斐波那契数列的第一个实际应用。[93]

这个结果也证明了辗转相除法的运算步骤不会超过较小数十进制下的位数的五倍。[96]因为如果算法需要 步,那么 一定大于或等于 ,也就是一定大于或等于 ,其中 黄金分割比。因为 ,所以 。因为  ,所以 。所以,辗转相除法不会进行超过O(h)次除法,其中 是较小数 在十进制下的位数。

平均情况编辑

辗转相除法的平均步骤数有三种不同的定义。第一种定义是计算已知自然数 和从0到 范围内随机选取的自然数 的最大公约数所需的时间 [91]

 

但是因为 在连续整数间变化非常剧烈,所以 的值也会显得很杂乱。[97]

为了解决这个问题,第二种定义规定 只要取遍其中所有和 互素的数即可:

 

在小于 的数中,有 个数与 互素,其中 欧拉函数。在这个定义中, 的函数值增长得平稳很多。[98][99]

 

誤差項的增長率為 ,其中 无穷小量。公式中的常数 等于:

 

其中 欧拉-马歇罗尼常数 黎曼ζ函数的导数。[100][101]公式最左边的 由两个独立的方法确定。[102][103]

因为第一种定义可以通过用第二种定义的求和来完成:[104]

 

所以也可以由以下公式近似:[105]

 

其中 冯·曼戈尔特函数[106]

第三种定义 定义为从1到 间随机选取  均勻分佈)时计算它们的最大公约数所需的平均步骤数:[105]

 

 的近似公式代入,得到 的近似:[107]

 

每一步的计算开销编辑

在辗转相除法的每一步中,商 和余数 都通过  求出:

 

所以每一步的计算开销主要与计算商 的算法有关,因为余数 可以很迅速地从   计算出来:

 

而计算一个 位整数的除法的算法复杂度是O(h(+1)),其中 是商的位数。[108]

作为对比,辗转相除法原先的版本使用的是减法,因此效率要慢很多。进行一次除法等同于进行 次减法(其中 是商)。如果  的比很大,计算出的商也很大,也就需要进行很多次减法。但在另一方面,计算出来的商在大多数情况下都是非常小的,除法中得出一个确定的商 的概率大约是 。其中 [109]比如,商是1、2、3、4的可能性分别是大约41.5%、17.0%、9.3%、5.9%。因为计算机计算减法要快于除法,特別是对于很大的数字[110],所以减法版本的辗转相除法的性能可以比得上除法版本。[111]这也被运用于二进制最大公约数算法。[112]

综合考虑算法需要的步数和每一步的计算开销,辗转相除法随两个数字  的平均位数成平方级的速度增长( )。设 表示计算过程中的余数 的位数,因为算法的步数  线性增长,所以算法的运算时间为:

 

其他算法的效率编辑

因为辗转相除法的高效率,它在实践中被广泛使用。作为对比,本段中介绍以下辗转相除法以外的其他最大公约数算法的效率。

计算两数  的最大公约数有一个效率很慢的算法:将 除以从2到 之间的每一个整数以计算出它们所有的公约数,其中最大的一个即是最大公约数。在这个算法中,步骤数随 线性增长,也就是随输入数字的位数呈指数级增长。另一个很低效的算法是计算出两个数的所有素因数(见上文),最大公约数等于所有公共素因数的乘积。[7]但是整数分解算法效率极低,很多现代的加密系统甚至依靠这种低效率来防止资料被破解。[10]

除了辗转相除法之外,也有一些高效的算法存在,如二进制最大公约数算法将除法操作替换成了二进制的移位,以进一步提高用计算机运算时的效率。[113][114]但是,这种改变并没有降低算法的复杂度(仍然是O(h²)),虽然它在计算机上确实比辗转相除法快些。[115]也可以通过只检視  的前几位数来进一步提高效率,不过效果并不明显。[116][117]二进制版的算法还可以扩展到其它进制[118],效率最多可以提升五倍。[119]

对于超过25,000位数的大数,有一种改进使算法复杂度降低至平方级以下[120],如Schönhage[121][122]、Stehlé、Zimmermann等人提出的算法。[123]这些算法利用2×2的矩阵(见上文)。这些亚平方级的算法复杂度通常是 [115][124]

其他数系编辑

如上文所述,辗转相除法最早用来寻找两自然数的最大公约数,但其实它也可以被推广至实数,甚至是多项式二次整数赫尔维茨四元数。在这些数系中,辗转相除法甚至被用来證明一个重要特性:惟一分解,即这些数系中的数能够被惟一地分解成不可約元素(素数在这些数系的对应物)。惟一分解是数论中很多证明的基础。

有理数和实数编辑

辗转相除法可以被应用至实数,如欧几里得在几何原本第10卷中所说的那样。算法的目的是计算出实数 ,使已知实数  是它的整数倍:  ,其中  整数[32]这也就找到了  的整数关系,即找到整数  使 。欧几里得使用辗转相除法来处理不可通约的长度[125][126]

实数的辗转相除法和整数的算法有两个区别。第一,余数 是实数,虽然商 仍然是整数。第二,算法不能保证在有限步内结束。如果能在有限步内结束,那么分数 是一个有理数,即:

 

于是我们可以写出它的有限连分数形式: 。如果算法无法结束,那么 无理数,可以写成无限的连分数形式: 。无限连分数的一个例子是:黄金分割比 2的算術平方根 。通常,算法能够结束的可能性是很低的,因为对于实数  ,几乎所有 都是无理数。

如果算法不结束,也可以在第 步时终止计算,得到近似连分数 。终止时的 越大,则近似越准确。连分数 的分子和分母互素并满足下式:

 
 

其中递归的初始值是 ,    在分母是 的数中最精确的有理数近似值:

 

多项式编辑

只含有一个变量 的多项式可以和整数一样进行加法、乘法和分解為不可約多项式(也就是多项式中的“素数”)。两个多项式  的最大公约数 定义为它们分解之后共有的不可約因式的乘积,这可以用辗转相除法进行计算。[127]对于多项式的算法和整数的算法很相似,在每个步骤 ,计算出满足以下递归式的商多项式 和余数多项式 

 

其中  。所选择的商式必须能使 的首项系數和 的相等,这样才能保证每个余数的次数小于前一个余数( )。因为非零多项式的次数是非负整数,并且在每一步都减小,所以辗转相除法的计算一定能在有限步内结束。最后一个非零余数即是两个多项式  的最大公约数。[128]

例如,有如下两个四次多项式,都可以分解成两个二次多项式的乘积:

 

 .

 除以 得到余数:

 

在下一步中, 除以 得到 。最终, 除以 得到的余数为0,所以   的最大公约数,这和它们因式分解的结果相符合。

上文所述的很多应用也适用于多项式。[129]辗转相除法可以解多项式的线性丢番图方程和中国剩余定理,也可以用来定义多项式的连分数展开式。

多项式的辗转相除法也有其他应用,如施图姆定理,一个用于计算多项式在给定区间内的实根个数的方法。这被应用于其他领域,如控制论劳斯-赫尔维茨稳定性判据

最后,多项式的系数不必局限于整数、实数、甚至复数。这些系数可以是其他中的元素,如上文所述的有限域 。从辗转相除法得出的结论也可以直接推广至这类多项式。[127]

高斯整数编辑

 
高斯素数u + vi复平面的分布,其中u2 + v2小于500。

高斯整数是满足 的复数,其中  是普通整数 虚数单位(-1的平方根)。[130]通过在高斯整数中定义辗转相除法,根据上文贝祖等式可以证明高斯整数的惟一分解。[46]高斯整数的惟一分解性质在很多应用中都很重要,如计算勾股数或者证明费马平方和定理[130]辗转相除法用于这些应用很方便,但并非必不可少,一些定理也可以由其他方式证明。

对于两个高斯整数  的辗转相除法和普通整数只有两个区别。像整数一样,算法的第 步计算出商 和余数 

 

其中  ,每个余数都严格地小于前一个余数, 。第一个区别即是:商和余数都是高斯整数,也就是复数,所以商 是透過對實際比例(如複數 / )的实部和虚部取最近似整數來找出的。第二个区别就是需要定义复数比较大小的方法。所以我们定义一个范数函数 ,以将高斯整数 转换成普通整数来比较大小。在每个步骤 中,余数的范数 必须小于前一个余数的范数 。因为范数是非负整数并且在每一步都减小,所以辗转相除法在有限步内一定能结束。最后一个非零余数即是  的最大公约数,即能同时整除  的整数中范数最大的一个。若把乘以  的所得結果考慮在內,那麼可以說  的最大公约数是唯一的。

很多其他应用如线性丢番图方程、中国剩余定理都適用于高斯整数,高斯整数的连分数也可以用辗转相除法定义。

欧几里得整环编辑

如果一个支持两种二元运算(+ 和 ·)的元素的集合形成一个交换环R并且可以使用辗转相除法求最大公约数,那么这个集合叫做欧几里得整环[131][132]这两个二元运算不必是平常算数中的加法和乘法,它们可以是更广泛的概念,如幺半群中的运算。但是这些运算仍然需要遵守交换律结合律分配律

推广之后的辗转相除法需要一个欧几里得函数,即一個将 映射到非负整数集合的函數 ,使得对于 中非零元素   中存在  满足  。例如上文中用于高斯整数的范数函数。这个函数 可以是数的绝对值或模,也可以是多项式的次数,只要辗转相除法计算过程中它的值不断减小就行,这样算法便能在有限步内结束。这非常依赖于非负整数的良序性,即每个非空的非负整数集合都有一个最小数。

任何欧几里得整环都满足算数基本定理:欧几里得整环中的数可以惟一分解。所以任何欧几里得整环都是惟一分解整环,但反之不然。欧几里得整环是GCD整环(任意两元素都存在最大公约数的整环)的子类。也就是说,在某些整环中,两元素存在最大公约数但却不能用辗转相除法计算。欧几里得整环都是主理想环,即其中每一个理想都是主理想,但并不是每个主理想环都是欧几里得整环。

欧几里得整环的惟一分解性质在很多场合都非常有用。例如,高斯整数的惟一分解性质可以方便地导出勾股数的公式,或者证明费马平方和定理[130]惟一分解性质也是加百利·拉梅于1847年基于约瑟夫·刘维尔的建议发表的证明费马最后定理的尝试中的关键部分。[133]拉梅的尝试需要形如 的数的惟一分解性质,其中  是整数, 是1的 次方根,即 。虽然这对于某些