fbpx
维基百科

輾轉相除法

數學中,辗转相除法,又称欧几里得算法(英語: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. 證明最大公約數 能整除 
    根據定義,  可以寫成 的倍數:  ,其中  是自然數。
    因爲 ,所以 整除 。 同理可證 整除每個餘數 
    因爲最大公約數 整除 ,因而 
  3. 所以 。即:[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 algorithm、HJLS算法以及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算法中,寻找乘法逆是非常重要的一步,它决定了使用哪个数来解密信息。

輾轉相除法, 在數學中, 辗转相除法, 又称欧几里得算法, 英語, euclidean, algorithm, 是求最大公约数的算法, 辗转相除法首次出现于欧几里得的, 几何原本, 第vii卷, 命题i和ii, 而在中国则可以追溯至东汉出现的, 九章算术, 辗转相除法的演示动画, 两条线段長分别可表示252和105, 則其中每一小分段長代表最大公因數21, 如动画所示, 只要輾轉地从大数中减去小数, 直到其中一段的长度为0, 此时剩下的一条线段的长度就是252和105的最大公因数, 两个整数的最大公约数是能够同时整. 在數學中 辗转相除法 又称欧几里得算法 英語 Euclidean algorithm 是求最大公约数的算法 辗转相除法首次出现于欧几里得的 几何原本 第VII卷 命题i和ii 中 而在中国则可以追溯至东汉出现的 九章算术 辗转相除法的演示动画 两条线段長分别可表示252和105 則其中每一小分段長代表最大公因數21 如动画所示 只要輾轉地从大数中减去小数 直到其中一段的长度为0 此时剩下的一条线段的长度就是252和105的最大公因数 两个整数的最大公约数是能够同时整除它们的最大的正整数 辗转相除法基于如下原理 两个整数的最大公约数等于其中较小的数和两数相除余数的最大公约数 例如 252和105的最大公约数是21 252 21 12 105 21 5 displaystyle 252 21 times 12 105 21 times 5 因为252 105 21 12 5 147 displaystyle 252 105 21 times 12 5 147 所以147和105的最大公约数也是21 在这个过程中 较大的数缩小了 所以继续进行同样的计算可以不断缩小这两个数直至余数为零 这时 所剩下的还没有变成零的数就是两数的最大公约数 由辗转相除法也可以推出 两数的最大公约数可以用两数的整数倍相加来表示 如21 5 105 2 252 displaystyle 21 5 times 105 2 times 252 这个重要的結論叫做貝祖定理 辗转相除法最早出现在欧几里得的 几何原本 中 大约公元前300年 所以它是现行的算法中歷史最悠久的 这个算法原先只用来处理自然数和几何长度 相當於正實數 但在19世纪 辗转相除法被推广至其他类型的數學對象 如高斯整数和一元多项式 由此 引申出欧几里得整环等等的一些现代抽象代数概念 后来 辗转相除法又扩展至其他数学领域 如纽结理论和多元多项式 辗转相除法有很多应用 它甚至可以用来生成全世界不同文化中的传统音乐节奏 1 在现代密码学方面 它是RSA算法 一种在电子商务中广泛使用的公钥加密算法 的重要部分 它还被用来解丢番图方程 比如寻找满足中国剩余定理的数 或者求有限域中元素的逆 辗转相除法还可以用来构造连分数 在施图姆定理和一些整数分解算法中也有应用 辗转相除法是现代数论中的基本工具 辗转相除法处理大数时非常高效 如果用除法而不是减法实现 它需要的步骤不会超过较小数的位数 十进制下 的五倍 拉梅于1844年证明了这点 同時這也標誌著计算复杂性理论的開端 目录 1 背景 1 1 最大公约数 1 2 归纳 递归和无穷递降 2 算法描述 2 1 计算过程 2 2 正确性的证明 2 3 举例 2 4 图形演示 2 5 计算商和余数 2 6 计算机实现 2 7 使用绝对值最小的余数 3 历史发展 4 数学上的应用 4 1 贝祖等式 4 2 主理想和相关问题 4 3 扩展欧几里得算法 4 4 矩阵法 4 5 欧几里得引理和唯一分解 4 6 线性丢番图方程 4 7 乘法逆和RSA算法 4 8 中国剩余定理 4 9 连分数 4 10 整数分解算法 5 算法效率 5 1 计算步数 5 1 1 最差情况 5 1 2 平均情况 5 2 每一步的计算开销 5 3 其他算法的效率 6 其他数系 6 1 有理数和实数 6 2 多项式 6 3 高斯整数 6 4 欧几里得整环 6 4 1 二次整数的惟一分解 6 5 非交换环 7 推广至其他数学结构 8 参考文献 8 1 引用 8 2 来源 9 外部链接背景 编辑最大公约数 编辑 欧几里得的辗转相除法计算的是两个自然数a a 和b b 的最大公约数g g 意思是能够同时整除a a 和b b 的自然数中最大的一个 两个数的最大公约数通常写成gcd a b displaystyle gcd a b 或者简写成 a b a b 2 但是第二种写法也被使用在其他数学概念 如二维向量的坐标 如果gcd a b 1 displaystyle gcd a b 1 則稱a a 和b b 互素 3 a和b是否互素和它们是否素数无关 4 如 6和35都不是素数 因为它们都可以分解为多于一个素因数的乘积 6 2 3 35 5 7 但是 6和35互素 因为除了1以外没有自然数同时整除6和35 一个24 60的长方形正好被十个12 12的方格填满 其中12是24和60的最大公约数 一般地 当且仅当c c 是a a 和b b 的公约数时 a b displaystyle a times b 尺寸的长方形可被边长c的正方形正好填满 令g gcd a b displaystyle g gcd a b 由于a a 和b b 都是g g 的整数倍 所以可以写成a m g b n g displaystyle a mg b ng 并且不存在更大的整数G gt g displaystyle G gt g 使等式成立 为了使g g 尽可能大 就要使a a 和b b 中所有公约数都提取出来归入g g 中 所以自然数m m 和n n 一定互素 并且a a 和b b 的最大公约数g g 可以被a a 和b b 的所有其他公因数c c 整除 5 我们可以用右图来解释最大公约数的概念 6 設一个长方形的边长为a a 和b b 因为a a 和b b 的任何公约数c c 都可以整除a a 和b b 所以长方形的边都可以等分为长度为c c 的线段 也就是长方形可以被边长为c c 的正方形正好填满 而最大公约数g g 是所有可能的c c 中最大的一个 例如 一个24 60的长方形区域可以分成1 1 2 2 3 3 6 6或12 12的正方形网格 也就是说 12是24和60的最大公约数 a a 和b b 的最大公约数是两数共有的素因数的乘积 7 例如 462可以分解成2 3 7 11 1071可以分解成3 3 7 17 462和1071的最大公约数等于它们共有的素因数的乘积3 7 21 如果两数没有公共的素因数 那么它们的最大公约数是1 也即这两个数互素 辗转相除法的优点就在於它能以有系統的方式求出兩數的最大公约数 而無需分別對它們作因式分解 8 9 大数的素因数分解被認為是一個困難的問題 即使是现代的计算机也非常难於處理 所以许多加密系统的原理都是建基於此 10 在数学中 尤其是抽象代数的环论中 最大公约数有一个更加巧妙的定义 11 a a 和b b 的最大公约数g g 是 11 a a 和b b 的线性和中的最小正整數 即所有形如u a v b displaystyle ua vb 其中u u 和v v 是整数 的数中的最小正整数 可以證明 所有u a v b displaystyle ua vb 都是g g 的整数倍 u a v b m g displaystyle ua vb mg 其中m m 是整数 用现代数学语言來說 a a 和b b 生成的理想即是由g g 生成的主理想 最大公约数的这个定义和其他定义的等价性将在下面描述 三个数的最大公约数的定义和两个数的相同 即是它们共有的素因数的积 12 它们或者也可以按下式计算 13 gcd a b c gcd a gcd b c gcd gcd a b c gcd gcd a c b displaystyle gcd a b c gcd a gcd b c gcd gcd a b c gcd gcd a c b 所以 欧几里得的辗转相除法实际可以计算任意多整数的最大公约数 归纳 递归和无穷递降 编辑 下文的論證會用到三種相關的数学方法 分別是数学归纳法 递归和无穷递降 数学归纳法 14 经常用来证明某個定理對所有自然数成立 15 首先证明定理对一个特定的数n 0 n 0 成立 通常是1 然后證明如果定理对自然数n n 成立的話 那麼它对自然数n 1 n 1 成立 這樣 便可證明定理对所有大于n 0 n 0 的自然数也成立 递归 16 是将相关的数组成一个数列 a 1 a 2 a 3 displaystyle a 1 a 2 a 3 cdots 17 當中除初始項外 其中每一项都用前一项或前几项表示 如斐波那契数列就是递归的 每一项F n F n 都等于F n 1 F n 2 displaystyle F n 1 F n 2 n 2 displaystyle n geqq 2 辗转相除法中的一些等式也是递归的 最后 无穷递降 18 是用方程的一个自然数解导出比它小的自然数解 19 但是 这种转化不能永远进行下去 因为只有有限個小於原來的自然数解的自然数 所以 要麼方程無解 不然在有限步内必然能得出最小的自然數解 在下文會用到此法來证明辗转相除法一定会在有限步内结束 算法描述 编辑计算过程 编辑 辗转相除法是一种递归算法 每一步计算的输出值就是下一步计算时的输入值 20 设k k 表示步骤数 从0开始计数 算法的计算过程如下 每一步的输入是都是前两次计算的非負余数r k 1 r k 1 和r k 2 displaystyle r k 2 因为每一步计算出的余数都在不断减小 所以 r k 1 r k 1 小于r k 2 displaystyle r k 2 在第k k 步中 算法计算出满足以下等式的商q k q k 和余数r k r k r k 2 q k r k 1 r k displaystyle r k 2 q k r k 1 r k 其中0 r k lt r k 1 displaystyle 0 leq r k lt r k 1 也就是r k 2 displaystyle r k 2 要不断减去r k 1 r k 1 直到比r k 1 r k 1 小 為求簡明 以下只說明如何求兩個非負整數a a 和b b 的最大公約數 負數的情況是簡單的 在第一步计算时 k 0 k 0 设r 2 displaystyle r 2 和r 1 displaystyle r 1 分别等于a a 和b b 第2步 此时k 1 k 1 时计算r 1 displaystyle r 1 即b b 和r 0 r 0 第一步计算产生的余数 相除产生的商和余数 以此类推 整个算法可以用如下等式表示 如果有a lt b a lt b 算法的第一步實際上會把兩個數字交換 因為這時a a 除以b b 所得的商q 0 q 0 會等于0 余数r 0 r 0 則等于a a 然後 算法的第二步便是把b b 除以a a 再計算所得之商和餘數 所以 對於k 0 k geq 0 總有r k lt r k 1 displaystyle r k lt r k 1 即运算的每一步中得出的余数一定小于上一步计算的余数 由于每一步的余数都在减小并且不为负数 必然存在第n n 步时r n r n 等于0 使算法终止 21 r n 1 displaystyle r n 1 就是a a 和b b 的最大公约数 其中n n 不可能无穷大 因为在r 0 r 0 和0之间只有有限个自然数 正确性的证明 编辑 辗转相除法的正确性可以分成两步来证明 20 在第一步 我們會證明算法的最终结果r n 1 displaystyle r n 1 同时整除a a 和b b 因为它是一个公约数 所以必然小于或者等于最大公约数g g 在第二步 我們證明g g 能整除r n 1 displaystyle r n 1 所以g g 一定小于或等于r n 1 displaystyle r n 1 两个不等式只在r n 1 g displaystyle r n 1 g 时同时成立 具体证明如下 證明r n 1 displaystyle r n 1 同時整除a a 和b b 因爲餘數r n r n 是0 r n 1 displaystyle r n 1 能夠整除r n 2 displaystyle r n 2 r n 2 q n r n 1 r n displaystyle r n 2 q n r n 1 r n dd 因爲r n 1 displaystyle r n 1 能夠整除r n 2 displaystyle r n 2 所以也能夠整除r n 3 displaystyle r n 3 r n 3 q n 1 r n 2 r n 1 displaystyle r n 3 q n 1 r n 2 r n 1 dd 同理可證r n 1 displaystyle r n 1 可以整除所有之前步驟的餘數 包括a a 和b b 即r n 1 displaystyle r n 1 是a a 和b b 的公約數 r n 1 g displaystyle r n 1 leq g 證明最大公約數g g 能整除r n 1 displaystyle r n 1 根據定義 a a 和b b 可以寫成g g 的倍數 a m g displaystyle a mg b n g displaystyle b ng 其中m m 和n n 是自然數 因爲r 0 a q 0 b m g q 0 n g m q 0 n g displaystyle r 0 a q 0 b mg q 0 ng m q 0 n g 所以g g 整除r 0 r 0 同理可證g g 整除每個餘數r 1 r 2 r n 1 displaystyle r 1 r 2 ldots r n 1 因爲最大公約數g g 整除r n 1 displaystyle r n 1 因而g r n 1 displaystyle g leq r n 1 所以g r n 1 displaystyle g r n 1 即 22 23 g gcd a b gcd b r 0 gcd r 0 r 1 gcd r n 2 r n 1 r n 1 displaystyle g gcd a b gcd b r 0 gcd r 0 r 1 ldots gcd r n 2 r n 1 r n 1 举例 编辑 算法的演示动画 最初的绿色矩形的长和宽分别是a 1071 displaystyle a 1071 b 462 displaystyle b 462 从中不断铺上462 462的正方形直到剩下部分面积是462 147 然后再铺上147 147的正方形直至剩下21 147的面积 最后 铺上21 21的正方形时 绿色部分就没有了 即21是1071和462的最大公约数 例如 计算a 1071 displaystyle a 1071 和b 462 displaystyle b 462 的最大公约数的过程如下 从1071中不断减去462直到小于462 可以减2次 即商q 0 2 displaystyle q 0 2 余数是147 1071 2 462 147 displaystyle 1071 2 times 462 147 然后从462中不断减去147直到小于147 可以减3次 即q 1 3 displaystyle q 1 3 余数是21 462 3 147 21 displaystyle 462 3 times 147 21 再从147中不断减去21直到小于21 可以减7次 即q 2 7 displaystyle q 2 7 没有余数 147 7 21 0 displaystyle 147 7 times 21 0 此时 余数是0 所以1071和462的最大公约数是21 这和用素因数分解得出的结果相同 见上文 用表格表示如下 步骤数 算式 商和余数0 1071 462 q 0 r 0 displaystyle 1071 462q 0 r 0 q 0 2 displaystyle q 0 2 r 0 147 displaystyle r 0 147 1 462 147 q 1 r 1 displaystyle 462 147q 1 r 1 q 1 3 displaystyle q 1 3 r 1 21 displaystyle r 1 21 2 147 21 q 2 r 2 displaystyle 147 21q 2 r 2 q 2 7 displaystyle q 2 7 r 2 0 displaystyle r 2 0 算法终止 图形演示 编辑 辗转相除法的计算过程可以用图形演示 24 假设我们要在a b displaystyle a times b 的矩形地面上铺正方形瓷砖 并且正好铺满 其中a a 大于b b 我们先尝试用b b displaystyle b times b 的瓷砖 但是留下了r 0 b displaystyle r 0 times b 的部分 其中r 0 lt b displaystyle r 0 lt b 我们接着尝试用r 0 r 0 displaystyle r 0 times r 0 的正方形瓷砖铺 又留下了r 1 r 0 displaystyle r 1 times r 0 的部分 然后再使用r 1 r 1 displaystyle r 1 times r 1 的正方形铺 直到全部铺满为止 即到某步时正方形刚好覆盖剩余的面积为止 此时用到的最小的正方形的边长就是原来矩形的两条边长的最大公约数 在图中 最小的正方形面积是21 21 红色 而原先的矩形 绿色 边长是1071 462 所以21是1071和462的最大公约数 计算商和余数 编辑 参见 模除和带余除法 在每个步骤k k 中 辗转相除法都需要计算两个数r k 1 r k 1 和r k 2 displaystyle r k 2 的商q k q k 和余数r k r k r k 2 q k r k 1 r k displaystyle r k 2 q k r k 1 r k 其中0 r k lt r k 1 displaystyle 0 leq r k lt r k 1 除法的算法保证这样的商和余数总是存在 自然数的除法算法还指出这样的商和余数是惟一的 但这对辗转相除法而言并非必要 25 在欧几里得最初的描述中 商和余数是通过连续的减法来计算的 即从r k 2 displaystyle r k 2 中不断减去r k 1 r k 1 直到小于r k 1 r k 1 一個更高效的做法是使用整數除法和模除来计算商和余数 r k r k 2 mod r k 1 displaystyle r k equiv r k 2 bmod r k 1 计算机实现 编辑 辗转相除法可用伪代码表示 比如除法版本可以寫成 26 function gcd a b while b 0 t b b a mod b a t return aC 版本 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 gt Option lt isize gt match x y 0 0 gt None a 0 gt Some a abs mut a mut b gt 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 在第k k 次循环开始时 变量b b 的值是前一次运算的余数r k 1 r k 1 变量a a 的值是再前一次运算的余数r k 2 displaystyle r k 2 步骤b a mod b displaystyle b a bmod b 的作用等同于递归式r k r k 2 mod r k 1 displaystyle r k equiv r k 2 bmod r k 1 变量t t 的功能是在下一个余数r k r k 计算过程中临时性地保存r k 1 r k 1 的值 在一次循环结束时 变量b b 的值是前一次运算的余数r k r k 变量a a 的值是再前一次运算的余数r k 1 r k 1 在欧几里得定义的减法版本 取餘运算被减法替换 27 function gcd a b if a 0 return b while b 0 if a gt b a a b else b b a return a 变量a a 和b b 的值分别是前两次的余数r k 1 r k 1 和r k 2 displaystyle r k 2 假定第k k 次循环开始时a a 大于b b 那么a a 等于r k 2 displaystyle r k 2 因为r k 2 gt r k 1 displaystyle r k 2 gt r k 1 在循环过程中 a a 重复减去b b 直到比b b 小 此时a a 就是下一个余数r k r k 然后b b 重复减去a a 直到比a a 小 此时b b 就是下一个余数r k 1 displaystyle r k 1 重复执行直到b 0 b 0 以下是递归版本 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 gt Option lt isize gt match x y 0 0 gt None a 0 gt Some a abs gt 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 例如gcd 1071 462 displaystyle gcd 1071 462 的计算过程是 函数的第一次调用计算gcd 462 1071 mod 4 62 gcd 462 147 displaystyle gcd 462 1071 bmod 4 62 gcd 462 147 下一次调用计算gcd 147 462 mod 1 47 gcd 147 21 displaystyle gcd 147 462 bmod 1 47 gcd 147 21 在接下来是gcd 21 147 mod 2 1 gcd 21 0 21 displaystyle gcd 21 147 bmod 2 1 gcd 21 0 21 使用绝对值最小的余数 编辑 在另一个版本的算法中 每一步还要把取余运算时计算出的商增加一后再重新计算余数 此时计算出的余数应该是负的 然后取两个余数的绝对值较小的数作为下一步运算时使用的余数 29 30 取余运算后 设r k r k 是计算出的余数 此時為正 q q 是计算出的商 r k 2 q k r k 1 r k displaystyle r k 2 q k r k 1 r k 即假設r k 1 gt r k gt 0 displaystyle r k 1 gt r k gt 0 然後使用以下式子计算出一个负的余数e k e k r k 2 q k 1 r k 1 e k displaystyle r k 2 q k 1 r k 1 e k 如果 e k lt r k displaystyle e k lt r k 那么用e k e k 替换r k r k 进行下一次运算 如利奥波德 克罗内克所指出的 这个版本需要的运算步骤是欧几里得算法的所有版本中最少的 29 30 历史发展 编辑 辗转相除法可能在欧几里得之前几个世纪就已经有了 图为使用两脚规进行测量 辗转相除法是目前仍然在使用的历史最悠久的算法之一 31 它首次出现于 几何原本 卷7命题1 2 卷10命题2 3 大约公元前300年 在卷7中用于整数 在卷10中用于线段的长度 以現代的觀點看 线段的长度可視為正实数 也就是說辗转相除法實際可用於實數上 但是当时未有实数的概念 卷10中出现的算法是几何的 两段线段a和b的最大公约数是a和b的公度中的最大值 这个算法可能并非欧几里得发明 因為他也有将先前其他數學家的一些成果编进他的 几何原本 32 33 数学家 历史学家范德瓦尔登 英语 Bartel Leendert van der Waerden 认为卷7的内容可能来自毕达哥拉斯学院出身的数学家写的关于数论的教科书 34 辗转相除法在當時很可能已為尤得塞斯 大約公元前375年 所知 31 35 甚至可能更早之前就已经存在 36 37 因为欧几里得和亚里士多德的著作中都出现了ἀn8yfairesis 一词 意为 辗转相减 38 几个世纪之后 辗转相除法又分别被中国人和印度人独立发现 39 主要用来解天文学中用到的丢番图方程以及制定准确的历法 5世纪末 印度数学家 天文学家阿里亚哈塔曾稱辗转相除法为 粉碎机 這可能是因为它在解丢番图方程时很有效 40 41 在中国 九章算术 中提到了一种类似辗转相减法的 更相减损术 42 孙子算经 中則出现了中国剩余定理的一个特例 43 但是直到1247年秦九韶才於其 数学九章 中解答了該定理的一般情況 當中用到了他發明的大衍求一术 此法的其中一部分實際上便是輾轉相除的原理 秦九韶在書中對此有明確表述 44 在欧洲 辗转相除法首次出现于克劳德 巴希特 英语 Claude Gaspard Bachet de Meziriac 的著作 愉悦讨喜的问题 Problemes plaisants et delectables 的第二版 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 Lovasz lattice basis reduction algorithm HJLS算法以及PSLQ算法 52 53 1969年 科尔 Cole 和戴维 Davie 基于辗转相除法创造了一种二人游戏 叫做 欧几里得游戏 54 这个游戏有最优策略 55 游戏开始于两列分别为a和b个棋子组成的序列 玩家轮流从较长一列中取走较短一列棋子数量的m倍的棋子 如果两列棋子p和q分别由x和y个棋子组成 其中x大于y 那么玩家可以將序列p的棋子数量减少为自然数x my 最后率先将一列棋子清空的玩家胜出 56 57 数学上的应用 编辑贝祖等式 编辑 贝祖等式说明 两个数a a 和b b 的最大公约数g g 可以表示为a a 和b b 的线性和 58 也就是说 存在整数s s 和t t 使g s a t b displaystyle g sa tb 59 60 整数s s 和t t 可以从辗转相除法算出的商q 0 q 1 displaystyle q 0 q 1 cdots 计算出 61 从辗转相除法的最后一步开始 g g 可以表示成前一步的商q N 1 displaystyle q N 1 和前两步的余数r N 2 displaystyle r N 2 和r N 3 displaystyle r N 3 g r N 1 r N 3 q N 1 r N 2 displaystyle g r N 1 r N 3 q N 1 r N 2 而前两步的余数又分别可以表示成它们前两步的余数和商 r N 2 r N 4 q N 2 r N 3 displaystyle r N 2 r N 4 q N 2 r N 3 r N 3 r N 5 q N 3 r N 4 displaystyle r N 3 r N 5 q N 3 r N 4 将这两行式子先後代入第一个式子 可以将g g 表示成r N 4 displaystyle r N 4 和r N 5 displaystyle r N 5 的线性和 重复进行迭代直到出现a a 和b b r 2 r 0 q 2 r 1 displaystyle r 2 r 0 q 2 r 1 r 1 b q 1 r 0 displaystyle r 1 b q 1 r 0 r 0 a q 0 b displaystyle r 0 a q 0 b 最终 g可以表示成a a 和b b 的线性和 g s a t b displaystyle g sa tb 贝祖等式以及以上证明都可以扩展至欧几里得整环 主理想和相关问题 编辑 贝祖等式提供了另一种定义a a 和b b 的最大公约数g g 的方法 11 考虑形如u a v b displaystyle ua vb 其中u u 和v v 是整数 的数的集合 因为a a 和b b 都可以被g g 整除 所以这个集合中的所有元素都可以被g g 整除 也就是说这个集合中的数都可以表示成g g 的倍数 或者a a 和b b 的其他公约数的倍数 但是 只有最大公约数才是这个集合的元素 根据贝祖等式 有g s a t b displaystyle g sa tb 換言之 当u s displaystyle u s v t displaystyle v t 时得出g g 任何其他的公约数都不是这个集合的元素 因为它们都不能被比它们大的g g 整除 相反地 g g 的任何倍数都属于这个集合 只要令u m s displaystyle u ms v m t displaystyle v mt 便有 m g m s a m t b displaystyle mg msa mtb 所以 形如u a v b displaystyle ua vb 的数的集合等于g g 的整数倍的集合 也就是说 任意两个数的线性和的集合等同于它们最大公约数的整数倍的集合 a a 和b b 的最大公约数叫做a a 和b b 的理想的生成元素 这个最大公约数的定义导出了兩個现代抽象代数的概念 主理想 由单个元素生成的理想 以及主理想整环 其每一理想都是主理想的整环 这个结果可以解决某些實際问题 62 例如 考虑两个容积分别为a a 和b b 的量杯 其中a a 和b b 為正整數 通过加入或倒去u u 倍第一个量杯的体积以及v v 倍第二个量杯的体积的液体 任何体积为u a v b displaystyle ua vb 的液体都可以被量出 只要u a v b displaystyle ua vb 為正數 根據贝祖等式 凡是可以被量出的液体 其体积一定是a a 和b b 的最大公约数g g 的倍數 扩展欧几里得算法 编辑 主条目 扩展欧几里得算法 贝祖等式的整数s和t可以通过扩展欧几里得算法算出 这个扩展算法在原有辗转相除法的基础上增加了两个递归等式 63 s k s k 2 q k s k 1 displaystyle s k s k 2 q k s k 1 t k t k 2 q k t k 1 displaystyle t k t k 2 q k t k 1 算法开始时 s 2 1 displaystyle s 2 1 t 2 0 displaystyle t 2 0 s 1 0 displaystyle s 1 0 t 1 1 displaystyle t 1 1 加上这兩个递归式后 当算法终止于r N 0 displaystyle r N 0 贝祖等式的整数s s 和t t 分别由s N displaystyle s N 和t N displaystyle t N 给出 这个算法的正确性可以用数学归纳法来证明 假设递归至第k 1 k 1 步是正确的 也就是假设 r j s j a t j b displaystyle r j s j a t j b 在j j 小于k k 時皆成立 则第k k 步运算得出以下等式 r k r k 2 q k r k 1 displaystyle r k r k 2 q k r k 1 因为r k 2 displaystyle r k 2 和r k 1 r k 1 被假定是正确的 所以可以用s s 和t t 表示 r k s k 2 a t k 2 b q k s k 1 a t k 1 b displaystyle r k s k 2 a t k 2 b q k s k 1 a t k 1 b 整理后得到第k k 步的结果 和我们期望得到的结果一致 r k s k a t k b s k 2 q k s k 1 a t k 2 q k t k 1 b displaystyle r k s k a t k b s k 2 q k s k 1 a t k 2 q k t k 1 b 矩阵法 编辑 整数s s 和t t 也可以用矩阵运算得出 64 辗转相除法的计算过程 a q 0 b r 0 displaystyle a q 0 b r 0 b q 1 r 0 r 1 displaystyle b q 1 r 0 r 1 r N 2 q N r N 1 0 displaystyle r N 2 q N r N 1 0 可以写作2 2的商矩阵乘以一个2维余数向量 a b q 0 1 1 0 b r 0 q 0 1 1 0 q 1 1 1 0 r 0 r 1 i 0 N q i 1 1 0 r N 1 0 begin pmatrix a b end pmatrix begin pmatrix q 0 amp 1 1 amp 0 end pmatrix begin pmatrix b r 0 end pmatrix begin pmatrix q 0 amp 1 1 amp 0 end pmatrix begin pmatrix q 1 amp 1 1 amp 0 end pmatrix begin pmatrix r 0 r 1 end pmatrix cdots prod i 0 N begin pmatrix q i amp 1 1 amp 0 end pmatrix begin pmatrix r N 1 0 end pmatrix 令M mathbf M 表示所有商矩阵的乘积 M m 11 m 12 m 21 m 22 i 0 N q i 1 1 0 q 0 1 1 0 q 1 1 1 0 q N 1 1 0 mathbf M begin pmatrix m 11 amp m 12 m 21 amp m 22 end pmatrix prod i 0 N begin pmatrix q i amp 1 1 amp 0 end pmatrix begin pmatrix q 0 amp 1 1 amp 0 end pmatrix begin pmatrix q 1 amp 1 1 amp 0 end pmatrix cdots begin pmatrix q N amp 1 1 amp 0 end pmatrix 这使辗转相除法化简为 a b M r N 1 0 M g 0 begin pmatrix a b end pmatrix mathbf M begin pmatrix r N 1 0 end pmatrix mathbf M begin pmatrix g 0 end pmatrix 如要用a a 和b b 的线性和表示g g 可將等式两边同时乘以矩阵M mathbf M 的逆矩阵 64 65 M mathbf M 的行列式等于 1 N 1 displaystyle 1 N 1 因为它等于商矩阵的行列式的乘积 而每一个的行列式都是 1 因为M mathbf M 的行列式不为零 最终的余数向量可以利用M mathbf M 的逆矩阵解出 g 0 M 1 a b 1 N 1 m 22 m 12 m 21 m 11 a b begin pmatrix g 0 end pmatrix mathbf M 1 begin pmatrix a b end pmatrix 1 N 1 begin pmatrix m 22 amp m 12 m 21 amp m 11 end pmatrix begin pmatrix a b end pmatrix 由上式可以得出g 1 N 1 m 22 a m 12 b displaystyle g 1 N 1 m 22 a m 12 b 贝祖等式中的两个整数分别是s 1 N 1 m 22 displaystyle s 1 N 1 m 22 t 1 N m 12 displaystyle t 1 N m 12 矩阵法的效率可前文描述的辗转相除法的递归算法是相同的 每一步都有两次乘法和两次加法 欧几里得引理和唯一分解 编辑 贝祖等式对辗转相除法的很多应用都很重要 如证明自然数的唯一分解性质 66 假设数字L可以写成两个因数u u 和v v 的乘积 即L u v displaystyle L uv 如果另一个数w w 与u u 互素的数也能整除L L 那么w w 必须整除v v 证明如下 如果u u 和w w 的最大公约数是1 则根据贝祖等式存在s s 和t t 使 1 s u t w displaystyle 1 su tw 两边都乘以v v v s u v t w v s L t w v displaystyle v suv twv sL twv 因为w w 整除等式右边 所以也应整除等式左边的v v 这个结果叫做欧几里得引理 67 如果一个素数整除L L 那么它至少整除L L 的一个因数 如果一个数w w 互素于数列a 1 a 2 a n displaystyle a 1 a 2 ldots a n 中的每一个数 则w也一定互素于它们的乘积a 1 a 2 a n displaystyle a 1 times a 2 times ldots times a n 67 欧几里得引理足以证明每一个自然数的素数分解是惟一的 68 我们用反证法来证明 假设L L 可以分别分解成m m 个素数和n n 个素数 即 L p 1 p 2 p m q 1 q 2 q n displaystyle L p 1 p 2 cdots p m q 1 q 2 cdots q n 根据假设 每个素数p p 都能整除L L 因此它必须能够整除某個q q 因为q q 也是一个素数 所以p q p q 同理 对于每一个p p 都存在一个q q 与它相等 所以两种分解除了顺序不同以外是完全相同的 整数分解的惟一性在数学证明中有很多应用 下文将会提到 线性丢番图方程 编辑 线性丢番图方程 9 x 12 y 483 displaystyle 9x 12y 483 的图像 它的解用蓝点表示 丢番图方程是以亚历山大数学家丢番图的名字命名的一类方程 它的解被限制在整数范围 69 关于整数x x 和y y 的线性丢番图方程形如 70 a x b y c ax by c 其中a a b b c c 是已知整数 这个方程可以写成关于x x 的同余式 a x c mod b displaystyle ax equiv c pmod b 令g g 为a a 和b b 的最大公约数 a a b b 都能被g g 整除 故a x b y ax by 能够被g g 整除 所以 c c 一定能够被g g 整除 不然方程就无解 方程两边若同时除以 c g displaystyle frac c g 方程就变成了贝祖等式 s a t b g sa tb g 其中s s 和t t 可以用扩展欧几里得算法求解 71 所以这个丢番图方程的一个解即是 x 1 s c g y 1 t c g displaystyle begin aligned x 1 s frac c g y 1 t frac c g end aligned 总体而言 丢番图方程如果有解 就一定有无数个解 72 只需要考虑两个解 x 1 y 1 x 1 y 1 和 x 2 y 2 x 2 y 2 a x 1 b y 1 c a x 2 b y 2 ax 1 by 1 c ax 2 by 2 或者可以写成 a x 1 x 2 b y 2 y 1 a x 1 x 2 b y 2 y 1 所以相邻两个解的x x 之间的差是b g displaystyle frac b g y y 之间的差是a g displaystyle frac a g 这样 所有的解都可以表示成 x x 1 b t g y y 1 a t g displaystyle begin aligned x x 1 frac bt g y y 1 frac at g end aligned 当t displaystyle t 取遍所有整数时 方程所有的解都可以从 x 1 y 1 x 1 y 1 计算出来 如果限制為正整数解 x gt 0 displaystyle x gt 0 y gt 0 displaystyle y gt 0 的话 那么解的数量就可能是有限的 有時候 这种对解的限制使丢番图方程在未知数個數比方程數更多的情况下仍然能有唯一解 73 而在允許實數解的线性方程组中 这種情況是不可能的 乘法逆和RSA算法 编辑 有限域是一个支持四种运算的数集 这四种运算也通稱為加法 减法 乘法 除法 跟一般的四則運算有相同的性质 如交换律 结合律和分配律 举例来说 使用同余可以让13个数字的集合 0 1 2 12 displaystyle 0 1 2 cdots 12 构成一个有限域 在这个域中 任何数学运算 加减乘除 都归约成13的模 例如 5 7 35 mod 1 3 9 displaystyle 5 times 7 35 bmod 1 3 9 对于任意素数p displaystyle p 都可以定义这种有限域 使用更复杂的方法 也可以对素数p displaystyle p 的m displaystyle m 次方定义这样的有限域 有限域也叫做伽罗瓦域 其缩写為 G F P displaystyle mathrm GF P 或G F P m displaystyle mathrm GF P m 在这样一个有m displaystyle m 个数的域中 任何非零元素a displaystyle a 都存在惟一乘法逆 a 1 displaystyle a 1 使a a 1 a 1 a 1 mod m displaystyle aa 1 a 1 a equiv 1 bmod m 这可以通过解同余式a x 1 mod m displaystyle ax equiv 1 bmod m 得出 74 或者也可以解与之等价的丢番图方程 75 a x m y 1 displaystyle ax my 1 这个方程可用扩展欧几里得算法解出 参见上文 在RSA算法中 寻找乘法逆是非常重要的一步 它决定了使用哪个数来解密信息 sup, 维基百科,wiki,书籍,书籍,图书馆,

文章

,阅读,下载,免费,免费下载,mp3,视频,mp4,3gp, jpg,jpeg,gif,png,图片,音乐,歌曲,电影,书籍,游戏,游戏。