辗转相除法的演示动画: 两条线段 长分别可表示252和105,则其中每一小分段长代表最大公约数21。如动画所示,只要辗转地从大数中减去小数,直到其中一段的长度为0,此时剩下的一条线段的长度就是252和105的最大公因数。
在数学 中,辗转相除法 ,又称欧几里得算法 (英语:Euclidean algorithm ),是求最大公约数 的算法 。辗转相除法首次出现于欧几里得 的《几何原本 》(第VII卷,命题i和ii)中,而在中国 则可以追溯至东汉 出现的《九章算术 》。
两个整数 的最大公约数 是能够同时整除 它们的最大的正整数。辗转相除法基于如下原理:两个整数的最大公约数等于其中较小的数和两数相除余数的最大公约数。例如,欲求252和105的最大公约数(
252
=
21
×
12
;
105
=
21
×
5
{\displaystyle 252=21\times 12;105=21\times 5}
);因为
252
÷
105
=
2...42
{\displaystyle 252\div 105=2...42}
,所以这个最大公约数也是42与105的最大公约数(
42
=
21
×
2
{\displaystyle 42=21\times 2}
)。在这个过程中,较大的数缩小了,所以继续进行同样的计算可以不断缩小这两个数直至余数为零。这时,所剩下的还没有变成零的数就是两数的最大公约数。由辗转相除法也可以推出,两数的最大公约数可以用两数的整数倍相加来表示,如
21
=
5
×
105
+
(
−
2
)
×
252
{\displaystyle 21=5\times 105+(-2)\times 252}
。这个重要的结论叫做裴蜀定理 。
辗转相除法最早出现在欧几里得的《几何原本》中(大约公元前 300年),所以它是现行的算法中历史最悠久的。这个算法原先只用来处理自然数 和几何长度(相当于正实数 ),但在19世纪,辗转相除法被推广至其他类型的数学对象 ,如高斯整数 和一元多项式 。由此,引申出欧几里得整环 等等的一些现代抽象代数 概念。后来,辗转相除法又扩展至其他数学领域,如纽结理论 和多元多项式 。
辗转相除法有很多应用,它甚至可以用来生成全世界不同文化中的传统音乐节奏。[ 1] 在现代密码学 方面,它是RSA算法 (一种在电子商务 中广泛使用的公钥加密 算法)的重要部分。它还被用来解丢番图方程 ,比如寻找满足中国剩余定理 的数,或者求有限域 中元素 的逆 。辗转相除法还可以用来构造连分数 ,在施图姆定理 和一些整数分解 算法中也有应用。辗转相除法是现代数论 中的基本工具。
辗转相除法处理大数时非常高效,如果用除法而不是减法实现,它需要的步骤不会超过较小数的位数(十进制 下)的五倍。拉梅 于1844年证明了这点,同时这也标志着计算复杂性理论 的开端。
背景
最大公约数
欧几里得的辗转相除法计算的是两个自然数
a
{\displaystyle a}
和
b
{\displaystyle b}
的最大公约数
g
{\displaystyle g}
,意思是能够同时整除
a
{\displaystyle a}
和
b
{\displaystyle b}
的自然数中最大的一个。两个数的最大公约数通常写成
gcd
(
a
,
b
)
{\displaystyle \gcd(a,b)}
,或者简写成
(
a
,
b
)
{\displaystyle (a,b)}
[ 2] ,但是第二种写法也被使用在其他数学概念,如二维 向量 的坐标。
如果
gcd
(
a
,
b
)
=
1
{\displaystyle \gcd(a,b)=1}
,则称
a
{\displaystyle a}
和
b
{\displaystyle 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
{\displaystyle c}
是
a
{\displaystyle a}
和
b
{\displaystyle b}
的公约数时,
a
×
b
{\displaystyle a\times b}
尺寸的长方形可被边长c 的正方形正好填满。
令
g
=
gcd
(
a
,
b
)
{\displaystyle g=\gcd(a,b)}
。由于
a
{\displaystyle a}
和
b
{\displaystyle b}
都是
g
{\displaystyle g}
的整数倍,所以可以写成
a
=
m
g
,
b
=
n
g
{\displaystyle a=mg,b=ng}
,并且不存在更大的整数
G
>
g
{\displaystyle G>g}
使等式成立。为了使
g
{\displaystyle g}
尽可能大,就要使
a
{\displaystyle a}
和
b
{\displaystyle b}
中所有公约数都提取出来归入
g
{\displaystyle g}
中,所以自然数
m
{\displaystyle m}
和
n
{\displaystyle n}
一定互素,并且
a
{\displaystyle a}
和
b
{\displaystyle b}
的最大公约数
g
{\displaystyle g}
可以被
a
{\displaystyle a}
和
b
{\displaystyle b}
的所有其他公因数
c
{\displaystyle c}
整除。[ 5]
我们可以用右图来解释最大公约数的概念:[ 6] 设一个长方形的边长为
a
{\displaystyle a}
和
b
{\displaystyle b}
。因为
a
{\displaystyle a}
和
b
{\displaystyle b}
的任何公约数
c
{\displaystyle c}
都可以整除
a
{\displaystyle a}
和
b
{\displaystyle b}
,所以长方形的边都可以等分为长度为
c
{\displaystyle c}
的线段,也就是长方形可以被边长为
c
{\displaystyle c}
的正方形正好填满。而最大公约数
g
{\displaystyle g}
是所有可能的
c
{\displaystyle c}
中最大的一个。例如,一个24 × 60的长方形区域可以分成1 × 1、2 × 2、3 × 3、6 × 6或12 × 12的正方形网格。也就是说,12是24和60的最大公约数。
a
{\displaystyle a}
和
b
{\displaystyle b}
的最大公约数是两数共有的素因数的乘积。[ 7] 例如,462可以分解成2 × 3 × 7 × 11;1071可以分解成3 × 3 × 7 × 17。462和1071的最大公约数等于它们共有的素因数的乘积3 × 7 = 21。如果两数没有公共的素因数,那么它们的最大公约数是1,也即这两个数互素。辗转相除法的优点就在于它能以有系统的方式求出两数的最大公约数,而无需分别对它们作因式分解。[ 8] [ 9] 大数的素因数分解 被认为是一个困难的问题,即使是现代的计算机也非常难于处理,所以许多加密系统的原理都是建基于此。[ 10]
在数学中,尤其是抽象代数 的环论 中,最大公约数有一个更加巧妙的定义:[ 11]
a
{\displaystyle a}
和
b
{\displaystyle b}
的最大公约数
g
{\displaystyle g}
是[ 11]
a
{\displaystyle a}
和
b
{\displaystyle b}
的线性和中的最小正整数,即所有形如
u
a
+
v
b
{\displaystyle ua+vb}
(其中
u
{\displaystyle u}
和
v
{\displaystyle v}
是整数)的数中的最小正整数。可以证明,所有
u
a
+
v
b
{\displaystyle ua+vb}
都是
g
{\displaystyle g}
的整数倍(
u
a
+
v
b
=
m
g
{\displaystyle ua+vb=mg}
,其中
m
{\displaystyle m}
是整数)。用现代数学语言来说,
a
{\displaystyle a}
和
b
{\displaystyle b}
生成的理想 即是由
g
{\displaystyle 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
{\displaystyle n_{0}}
成立(通常是1);然后证明如果定理对自然数
n
{\displaystyle n}
成立的话,那么它对自然数
n
+
1
{\displaystyle n+1}
成立。这样,便可证明定理对所有大于
n
0
{\displaystyle n_{0}}
的自然数也成立。递归[ 16] 是将相关的数组成一个数列 (
a
1
,
a
2
,
a
3
,
⋯
{\displaystyle a_{1},a_{2},a_{3},\cdots }
),[ 17] 当中除初始项外,其中每一项都用前一项或前几项表示。如斐波那契数列 就是递归的,每一项
F
n
{\displaystyle 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
{\displaystyle k}
表示步骤数(从0开始计数),算法的计算过程如下。
每一步的输入是都是前两次计算的非负余数
r
k
−
1
{\displaystyle r_{k-1}}
和
r
k
−
2
{\displaystyle r_{k-2}}
。因为每一步计算出的余数都在不断减小,所以,
r
k
−
1
{\displaystyle r_{k-1}}
小于
r
k
−
2
{\displaystyle r_{k-2}}
。在第
k
{\displaystyle k}
步中,算法计算出满足以下等式的商
q
k
{\displaystyle q_{k}}
和余数
r
k
{\displaystyle 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
<
r
k
−
1
{\displaystyle 0\leq r_{k}<r_{k-1}}
。也就是
r
k
−
2
{\displaystyle r_{k-2}}
要不断减去
r
k
−
1
{\displaystyle r_{k-1}}
直到比
r
k
−
1
{\displaystyle r_{k-1}}
小。
为求简明,以下只说明如何求两个非负整数
a
{\displaystyle a}
和
b
{\displaystyle b}
的最大公约数(负数的情况是简单的)。在第一步计算时(
k
=
0
{\displaystyle k=0}
),设
r
−
2
{\displaystyle r_{-2}}
和
r
−
1
{\displaystyle r_{-1}}
分别等于
a
{\displaystyle a}
和
b
{\displaystyle b}
,第2步(此时
k
=
1
{\displaystyle k=1}
)时计算
r
−
1
{\displaystyle r_{-1}}
(即
b
{\displaystyle b}
)和
r
0
{\displaystyle r_{0}}
(第一步计算产生的余数)相除产生的商和余数,以此类推。整个算法可以用如下等式表示:
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
0
=
q
2
r
1
+
r
2
{\displaystyle r_{0}=q_{2}r_{1}+r_{2}}
r
1
=
q
3
r
2
+
r
3
{\displaystyle r_{1}=q_{3}r_{2}+r_{3}}
.
.
.
{\displaystyle ...}
如果有
a
<
b
{\displaystyle a<b}
,算法的第一步实际上会把两个数字交换,因为这时
a
{\displaystyle a}
除以
b
{\displaystyle b}
所得的商
q
0
{\displaystyle q_{0}}
会等于0,余数
r
0
{\displaystyle r_{0}}
则等于
a
{\displaystyle a}
。然后,算法的第二步便是把
b
{\displaystyle b}
除以
a
{\displaystyle a}
,再计算所得之商和余数。所以,对于
k
≥
0
{\displaystyle k\geq 0}
总有
r
k
<
r
k
−
1
{\displaystyle r_{k}<r_{k-1}}
,即运算的每一步中得出的余数一定小于上一步计算的余数。
由于每一步的余数都在减小并且不为负数,必然存在第
n
{\displaystyle n}
步时
r
n
{\displaystyle r_{n}}
等于0,使算法终止[ 21] ,
r
n
−
1
{\displaystyle r_{n-1}}
就是
a
{\displaystyle a}
和
b
{\displaystyle b}
的最大公约数。其中
n
{\displaystyle n}
不可能无穷大,因为在
r
0
{\displaystyle r_{0}}
和0之间只有有限个自然数。
正确性的证明
辗转相除法的正确性可以分成两步来证明。[ 20] 在第一步,我们会证明算法的最终结果
r
n
−
1
{\displaystyle r_{n-1}}
同时整除
a
{\displaystyle a}
和
b
{\displaystyle b}
。因为它是一个公约数,所以必然小于或者等于最大公约数
g
{\displaystyle g}
。在第二步,我们证明
g
{\displaystyle g}
能整除
r
n
−
1
{\displaystyle r_{n-1}}
。所以
g
{\displaystyle 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
{\displaystyle a}
和
b
{\displaystyle b}
:
因为余数
r
n
{\displaystyle 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}}
因为
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}}
同理可证
r
n
−
1
{\displaystyle r_{n-1}}
可以整除所有之前步骤的余数,包括
a
{\displaystyle a}
和
b
{\displaystyle b}
,即
r
n
−
1
{\displaystyle r_{n-1}}
是
a
{\displaystyle a}
和
b
{\displaystyle b}
的公约数,
r
n
−
1
≤
g
{\displaystyle r_{n-1}\leq g}
。
证明最大公约数
g
{\displaystyle g}
能整除
r
n
−
1
{\displaystyle r_{n-1}}
:
根据定义,
a
{\displaystyle a}
和
b
{\displaystyle b}
可以写成
g
{\displaystyle g}
的倍数:
a
=
m
g
{\displaystyle a=mg}
、
b
=
n
g
{\displaystyle b=ng}
,其中
m
{\displaystyle m}
和
n
{\displaystyle 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
{\displaystyle g}
整除
r
0
{\displaystyle r_{0}}
。 同理可证
g
{\displaystyle g}
整除每个余数
r
1
,
r
2
,
…
,
r
n
−
1
{\displaystyle r_{1},r_{2},\ldots ,r_{n-1}}
。
因为最大公约数
g
{\displaystyle 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
{\displaystyle a}
大于
b
{\displaystyle b}
。我们先尝试用
b
×
b
{\displaystyle b\times b}
的瓷砖,但是留下了
r
0
×
b
{\displaystyle r_{0}\times b}
的部分,其中
r
0
<
b
{\displaystyle r_{0}<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
{\displaystyle k}
中,辗转相除法都需要计算两个数
r
k
−
1
{\displaystyle r_{k-1}}
和
r
k
−
2
{\displaystyle r_{k-2}}
的商
q
k
{\displaystyle q_{k}}
和余数
r
k
{\displaystyle 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
<
r
k
−
1
{\displaystyle 0\leq r_{k}<r_{k-1}}
。除法的算法保证这样的商和余数总是存在。自然数的除法算法还指出这样的商和余数是惟一的,但这对辗转相除法而言并非必要。[ 25]
在欧几里得最初的描述中,商和余数是通过连续的减法来计算的,即从
r
k
−
2
{\displaystyle r_{k-2}}
中不断减去
r
k
−
1
{\displaystyle r_{k-1}}
直到小于
r
k
−
1
{\displaystyle 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 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
在第
k
{\displaystyle k}
次循环开始时,变量
b
{\displaystyle b}
的值是前一次运算的余数
r
k
−
1
{\displaystyle r_{k-1}}
,变量
a
{\displaystyle 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
{\displaystyle t}
的功能是在下一个余数
r
k
{\displaystyle r_{k}}
计算过程中临时性地保存
r
k
−
1
{\displaystyle r_{k-1}}
的值。在一次循环结束时,变量
b
{\displaystyle b}
的值是前一次运算的余数
r
k
{\displaystyle r_{k}}
,变量
a
{\displaystyle a}
的值是再前一次运算的余数
r
k
−
1
{\displaystyle r_{k-1}}
。
在欧几里得定义的减法版本,取余运算被减法替换。[ 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
变量
a
{\displaystyle a}
和
b
{\displaystyle b}
的值分别是前两次的余数
r
k
−
1
{\displaystyle r_{k-1}}
和
r
k
−
2
{\displaystyle r_{k-2}}
。假定第
k
{\displaystyle k}
次循环开始时
a
{\displaystyle a}
大于
b
{\displaystyle b}
,那么
a
{\displaystyle a}
等于
r
k
−
2
{\displaystyle r_{k-2}}
,因为
r
k
−
2
>
r
k
−
1
{\displaystyle r_{k-2}>r_{k-1}}
。在循环过程中,
a
{\displaystyle a}
重复减去
b
{\displaystyle b}
直到比
b
{\displaystyle b}
小,此时
a
{\displaystyle a}
就是下一个余数
r
k
{\displaystyle r_{k}}
;然后
b
{\displaystyle b}
重复减去
a
{\displaystyle a}
直到比
a
{\displaystyle a}
小,此时
b
{\displaystyle b}
就是下一个余数
r
k
+
1
{\displaystyle r_{k+1}}
;重复执行直到
b
=
0
{\displaystyle 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 ) -> 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 )
例如
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
{\displaystyle r_{k}}
是计算出的余数(此时为正),
q
{\displaystyle 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
>
r
k
>
0
{\displaystyle r_{k-1}>r_{k}>0}
。然后使用以下式子计算出一个负的余数
e
k
{\displaystyle 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
|
<
|
r
k
|
{\displaystyle |e_{k}|<|r_{k}|}
,那么用
e
k
{\displaystyle e_{k}}
替换
r
k
{\displaystyle r_{k}}
进行下一次运算。如利奥波德·克罗内克 所指出的,这个版本需要的运算步骤是欧几里得算法的所有版本中最少的。[ 29] [ 30]
历史发展
辗转相除法可能在欧几里得 之前几个世纪就已经有了。图为使用两脚规进行测量。
辗转相除法是目前仍然在使用的历史最悠久的算法之一。[ 31] 它首次出现于《几何原本 》(卷7命题1–2、卷10命题2–3)(大约公元前300年)。在卷7中用于整数,在卷10中用于线段的长度(以现代的观点看,线段的长度可视为正实数,也就是说辗转相除法实际可用于实数上,但是当时未有实数的概念)。卷10中出现的算法是几何的,两段线段a 和b 的最大公约数是a 和b 的公度 中的最大值。
这个算法可能并非欧几里得 发明,因为他也有将先前其他数学家的一些成果编进他的《几何原本》。[ 32] [ 33] 数学家、历史学家范德瓦尔登 认为卷7的内容可能来自毕达哥拉斯 学院出身的数学家写的关于数论 的教科书。[ 34] 辗转相除法在当时很可能已为尤得塞斯 (大约公元前375年)所知
[ 31] [ 35] ,甚至可能更早之前就已经存在[ 36] [ 37] ,因为欧几里得和亚里士多德 的著作中都出现了ἀνθυφαίρεσις 一词(意为“辗转相减”)。[ 38]
几个世纪之后,辗转相除法又分别被中国 人和印度 人独立发现,[ 39] 主要用来解天文学中用到的丢番图方程 以及制定准确的历法。5世纪末,印度数学家 、天文学家 阿里亚哈塔 曾称辗转相除法为“粉碎机”,这可能是因为它在解丢番图方程 时很有效[ 40] 。[ 41] 在中国,《九章算术 》中提到了一种类似辗转相减法的“更相减损术”[ 42] 。《孙子算经 》中则出现了中国剩余定理 的一个特例[ 43] ,但是直到1247年秦九韶 才于其《数学九章 》中解答了该定理的一般情况,当中用到了他发明的大衍求一术 。此法的其中一部分实际上便是辗转相除的原理,秦九韶在书中对此有明确表述。[ 44] 在欧洲,辗转相除法首次出现于克劳德·巴希特 的著作《愉悦讨喜的问题》(Problèmes plaisants et délectables )的第二版[ 41] 在欧洲,辗转相除法被用于丢番图方程和构建连分数 。后来,英国数学家桑德森 在其著作中收编了扩展欧几里得算法 ,作为一个有效计算连分数的方法。他将此法的来源归名于罗杰·科茨 。[ 45]
19世纪,辗转相除法促成了新数系 的建立,如高斯整数 和艾森斯坦整数 。1815年,高斯 用辗转相除法证明高斯整数的分解是惟一的,尽管他的研究到了1832年才首度发表。[ 46] 高斯在他的《算数研究 》(出版于1801年)中实际上也有援引这个算法,但仅是以连分数 方法的形式叙述。[ 39] 约翰·狄利克雷 是第一个将辗转相除法作为数论的基础的数学家。[来源请求] 狄利克雷提出,数论中的很多结论,如分解的惟一性,在任何使辗转相除法适用的数系中均有效。[ 47] 狄利克雷的数论讲义后来经理查德·戴德金 编辑和推广,戴德金也有以辗转相除法来研究代数整数 。比如,他是第一个用高斯整数的分解惟一性证明费马平方和定理 的数学家。[ 48] 戴德金还率先定义了欧几里得整环 的概念。19世纪末,戴德金所定义的理想 概念使得数论的重心不必建基于辗转相除法,从而促进了理论的发展。[ 49]
“欧几里得算法是所有算法的鼻祖,因为它是现存最古老的非凡算法。”
——高德纳 ,《计算机程序设计艺术 ,第二卷:半数值算法》,第二版 (1981), p. 318.
辗转相除法的其他应用发展于19世纪。1829年,施图姆 将辗转相除法用于施图姆序列 (用于确定多项式的不同实根的个数的方法)。[ 50]
辗转相除法是历史上第一个整数关系算法 ,即寻找两个可通约 实数的整数关系的算法。近年来,出现了一些新颖的整数关系算法,如埃拉曼·弗格森 和福尔卡德于1979年发表的弗格森-福尔卡德算法 (Ferguson–Forcade algorithm)
[ 51] 、以及与它相关的LLL算法 、HJLS算法 以及PSLQ算法 。[ 52] [ 53]
1969年,科尔(Cole)和戴维(Davie)基于辗转相除法创造了一种二人游戏,叫做“欧几里得游戏”。[ 54] 这个游戏有最优策略。[ 55] 游戏开始于两列分别为a 和b 个棋子组成的序列,玩家轮流从较长一列中取走较短一列棋子数量的m 倍的棋子。如果两列棋子p 和q 分别由x 和y 个棋子组成,其中x 大于y ,那么玩家可以将序列p 的棋子数量减少为自然数x − my 。最后率先将一列棋子清空的玩家胜出。[ 56] [ 57]
数学上的应用
贝祖等式
贝祖等式 说明,两个数
a
{\displaystyle a}
和
b
{\displaystyle b}
的最大公约数
g
{\displaystyle g}
可以表示为
a
{\displaystyle a}
和
b
{\displaystyle b}
的线性和。[ 58] 也就是说,存在整数
s
{\displaystyle s}
和
t
{\displaystyle t}
使
g
=
s
a
+
t
b
{\displaystyle g=sa+tb}
。[ 59] [ 60]
整数
s
{\displaystyle s}
和
t
{\displaystyle t}
可以从辗转相除法算出的商
q
0
,
q
1
,
⋯
{\displaystyle q_{0},q_{1},\cdots }
计算出。[ 61] 从辗转相除法的最后一步开始,
g
{\displaystyle 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
{\displaystyle g}
表示成
r
N
−
4
{\displaystyle r_{N-4}}
和
r
N
−
5
{\displaystyle r_{N-5}}
的线性和。重复进行迭代直到出现
a
{\displaystyle a}
和
b
{\displaystyle 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
{\displaystyle a}
和
b
{\displaystyle b}
的线性和:
g
=
s
a
+
t
b
{\displaystyle g=sa+tb}
。贝祖等式 以及以上证明都可以扩展至欧几里得整环 。
主理想和相关问题
贝祖等式提供了另一种定义
a
{\displaystyle a}
和
b
{\displaystyle b}
的最大公约数
g
{\displaystyle g}
的方法。[ 11] 考虑形如
u
a
+
v
b
{\displaystyle ua+vb}
(其中
u
{\displaystyle u}
和
v
{\displaystyle v}
是整数)的数的集合 。因为
a
{\displaystyle a}
和
b
{\displaystyle b}
都可以被
g
{\displaystyle g}
整除,所以这个集合中的所有元素都可以被
g
{\displaystyle g}
整除。也就是说这个集合中的数都可以表示成
g
{\displaystyle g}
的倍数,或者
a
{\displaystyle a}
和
b
{\displaystyle b}
的其他公约数的倍数。但是,只有最大公约数才是这个集合的元素。根据贝祖等式,有
g
=
s
a
+
t
b
{\displaystyle g=sa+tb}
。换言之,当
u
=
s
{\displaystyle u=s}
、
v
=
t
{\displaystyle v=t}
时得出
g
{\displaystyle g}
。任何其他的公约数都不是这个集合的元素,因为它们都不能被比它们大的
g
{\displaystyle g}
整除。相反地,
g
{\displaystyle 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
{\displaystyle g}
的整数倍的集合。也就是说,任意两个数的线性和的集合等同于它们最大公约数的整数倍的集合。
a
{\displaystyle a}
和
b
{\displaystyle b}
的最大公约数叫做
a
{\displaystyle a}
和
b
{\displaystyle b}
的理想 的生成元素。这个最大公约数的定义导出了两个现代抽象代数 的概念:主理想 (由单个元素生成的理想)以及主理想整环 (其每一理想都是主理想的整环 )。
这个结果可以解决某些实际问题。[ 62] 例如,考虑两个容积分别为
a
{\displaystyle a}
和
b
{\displaystyle b}
的量杯,其中
a
{\displaystyle a}
和
b
{\displaystyle b}
为正整数。通过加入或倒去
u
{\displaystyle u}
倍第一个量杯的体积以及
v
{\displaystyle v}
倍第二个量杯的体积的液体,任何体积为
u
a
+
v
b
{\displaystyle ua+vb}
的液体都可以被量出(只要
u
a
+
v
b
{\displaystyle ua+vb}
为正数)。根据贝祖等式,凡是可以被量出的液体,其体积一定是
a
{\displaystyle a}
和
b
{\displaystyle b}
的最大公约数
g
{\displaystyle 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
{\displaystyle s}
和
t
{\displaystyle t}
分别由
s
N
{\displaystyle s_{N}}
和
t
N
{\displaystyle t_{N}}
给出。
这个算法的正确性可以用数学归纳法来证明。假设递归至第
k
−
1
{\displaystyle k-1}
步是正确的,也就是假设:
r
j
=
s
j
a
+
t
j
b
{\displaystyle r_{j}=s_{j}a+t_{j}b}
在
j
{\displaystyle j}
小于
k
{\displaystyle k}
时皆成立。则第
k
{\displaystyle 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
{\displaystyle r_{k-1}}
被假定是正确的,所以可以用
s
{\displaystyle s}
和
t
{\displaystyle 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
{\displaystyle 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
{\displaystyle s}
和
t
{\displaystyle 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
)
{\displaystyle {\begin{pmatrix}a\\b\end{pmatrix}}={\begin{pmatrix}q_{0}&1\\1&0\end{pmatrix}}{\begin{pmatrix}b\\r_{0}\end{pmatrix}}={\begin{pmatrix}q_{0}&1\\1&0\end{pmatrix}}{\begin{pmatrix}q_{1}&1\\1&0\end{pmatrix}}{\begin{pmatrix}r_{0}\\r_{1}\end{pmatrix}}=\cdots =\prod _{i=0}^{N}{\begin{pmatrix}q_{i}&1\\1&0\end{pmatrix}}{\begin{pmatrix}r_{N-1}\\0\end{pmatrix}}}
令
M
{\displaystyle \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
)
{\displaystyle \mathbf {M} ={\begin{pmatrix}m_{11}&m_{12}\\m_{21}&m_{22}\end{pmatrix}}=\prod _{i=0}^{N}{\begin{pmatrix}q_{i}&1\\1&0\end{pmatrix}}={\begin{pmatrix}q_{0}&1\\1&0\end{pmatrix}}{\begin{pmatrix}q_{1}&1\\1&0\end{pmatrix}}\cdots {\begin{pmatrix}q_{N}&1\\1&0\end{pmatrix}}}
这使辗转相除法化简为:
(
a
b
)
=
M
(
r
N
−
1
0
)
=
M
(
g
0
)
{\displaystyle {\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
{\displaystyle a}
和
b
{\displaystyle b}
的线性和表示
g
{\displaystyle g}
,可将等式两边同时乘以矩阵
M
{\displaystyle \mathbf {M} }
的逆矩阵 。[ 64] [ 65]
M
{\displaystyle \mathbf {M} }
的行列式 等于
(
−
1
)
N
+
1
{\displaystyle (-1)^{N+1}}
,因为它等于商矩阵的行列式的乘积,而每一个的行列式都是−1。因为
M
{\displaystyle \mathbf {M} }
的行列式不为零,最终的余数向量可以利用
M
{\displaystyle \mathbf {M} }
的逆矩阵解出:
(
g
0
)
=
M
−
1
(
a
b
)
=
(
−
1
)
N
+
1
(
m
22
−
m
12
−
m
21
m
11
)
(
a
b
)
{\displaystyle {\begin{pmatrix}g\\0\end{pmatrix}}=\mathbf {M} ^{-1}{\begin{pmatrix}a\\b\end{pmatrix}}=(-1)^{N+1}{\begin{pmatrix}m_{22}&-m_{12}\\-m_{21}&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
{\displaystyle u}
和
v
{\displaystyle v}
的乘积,即
L
=
u
v
{\displaystyle L=uv}
。如果另一个数
w
{\displaystyle w}
与
u
{\displaystyle u}
互素的数也能整除
L
{\displaystyle L}
,那么
w
{\displaystyle w}
必须整除
v
{\displaystyle v}
,证明如下:如果
u
{\displaystyle u}
和
w
{\displaystyle w}
的最大公约数是1,则根据贝祖等式存在
s
{\displaystyle s}
和
t
{\displaystyle t}
使
1
=
s
u
+
t
w
{\displaystyle 1=su+tw}
。
两边都乘以
v
{\displaystyle v}
:
v
=
s
u
v
+
t
w
v
=
s
L
+
t
w
v
{\displaystyle v=suv+twv=sL+twv}
因为
w
{\displaystyle w}
整除等式右边,所以也应整除等式左边的
v
{\displaystyle v}
。这个结果叫做欧几里得引理 。[ 67] 如果一个素数整除
L
{\displaystyle L}
那么它至少整除
L
{\displaystyle L}
的一个因数。如果一个数
w
{\displaystyle 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
{\displaystyle L}
可以分别分解成
m
{\displaystyle m}
个素数和
n
{\displaystyle 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
{\displaystyle p}
都能整除
L
{\displaystyle L}
,因此它必须能够整除某个
q
{\displaystyle q}
;因为
q
{\displaystyle q}
也是一个素数,所以
p
=
q
{\displaystyle p=q}
。同理,对于每一个
p
{\displaystyle p}
都存在一个
q
{\displaystyle q}
与它相等。所以两种分解除了顺序不同以外是完全相同的。整数分解的惟一性在数学证明中有很多应用,下文将会提到。
线性丢番图方程
线性丢番图方程 :
9
x
+
12
y
=
483
{\displaystyle 9x+12y=483}
的图像,它的解用蓝点表示。
丢番图方程 是以亚历山大 数学家丢番图 的名字命名的一类方程,它的解被限制在整数范围。[ 69] 关于整数
x
{\displaystyle x}
和
y
{\displaystyle y}
的线性丢番图方程形如:[ 70]
a
x
+
b
y
=
c
{\displaystyle ax+by=c}
其中
a
{\displaystyle a}
、
b
{\displaystyle b}
、
c
{\displaystyle c}
是已知整数。这个方程可以写成关于
x
{\displaystyle x}
的同余 式:
a
x
≡
c
(
mod
b
)
{\displaystyle ax\equiv c{\pmod {b}}}
令
g
{\displaystyle g}
为
a
{\displaystyle a}
和
b
{\displaystyle b}
的最大公约数,
a
{\displaystyle a}
、
b
{\displaystyle b}
都能被
g
{\displaystyle g}
整除,故
a
x
+
b
y
{\displaystyle ax+by}
能够被
g
{\displaystyle g}
整除。所以,
c
{\displaystyle c}
一定能够被
g
{\displaystyle g}
整除,不然方程就无解。方程两边若同时除以
c
g
{\displaystyle {\frac {c}{g}}}
,方程就变成了贝祖等式:
s
a
+
t
b
=
g
{\displaystyle sa+tb=g}
其中
s
{\displaystyle s}
和
t
{\displaystyle 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
)
{\displaystyle (x_{1},y_{1})}
和
(
x
2
,
y
2
)
{\displaystyle (x_{2},y_{2})}
:
a
x
1
+
b
y
1
=
c
=
a
x
2
+
b
y
2
{\displaystyle ax_{1}+by_{1}=c=ax_{2}+by_{2}}
或者可以写成:
a
(
x
1
−
x
2
)
=
b
(
y
2
−
y
1
)
{\displaystyle a(x_{1}-x_{2})=b(y_{2}-y_{1})}
所以相邻两个解的
x
{\displaystyle x}
之间的差是
b
g
{\displaystyle {\frac {b}{g}}}
,
y
{\displaystyle 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
)
{\displaystyle (x_{1},y_{1})}
计算出来。如果限制为正整数解 (
x
>
0
{\displaystyle x>0}
,
y
>
0
{\displaystyle y>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算法 中,寻找乘法逆是非常重要的一步,它决定了使用哪个数来解密信息。[ 76] 虽然RSA算法不使用域而是使用环,扩展欧几里得算法仍然可以用来求乘法逆。欧几里得算法也被应用于纠错码 ,例如,它可以代替伯利坎普-梅西算法 解基于有限域的BCH码 和里德-所罗门码 。[ 77]
中国剩余定理
辗转相除法也可以用来解线性丢番图方程组。[ 78] 如在中国剩余定理 中,整数可以表示成被
N
{\displaystyle N}
个互素的数
m
i
{\displaystyle m_{i}}
除留下的余数:[ 79]
x
1
≡
x
(
mod
m
1
)
x
2
≡
x
(
mod
m
2
)
⋮
x
N
≡
x
(
mod
m
N
)
{\displaystyle {\begin{aligned}x_{1}&\equiv x{\pmod {m_{1}}}\\x_{2}&\equiv x{\pmod {m_{2}}}\\\vdots &\\x_{N}&\equiv x{\pmod {m_{N}}}\end{aligned}}}
为了从
x
{\displaystyle x}
的
N
{\displaystyle N}
个余数
x
i
{\displaystyle x_{i}}
中确定
x
{\displaystyle x}
的值,我们将这些式子组合成单个线性丢番图方程,其中模数
M
{\displaystyle M}
是所有模数
m
i
{\displaystyle m_{i}}
的乘积,然后定义
M
i
{\displaystyle M_{i}}
如下:
M
i
=
M
m
i
{\displaystyle M_{i}={\frac {M}{m_{i}}}}
也就是,
M
i
{\displaystyle M_{i}}
是除了
m
i
{\displaystyle m_{i}}
以外所有模数的乘积。接着是关键的一步,寻找
N
{\displaystyle N}
个数
h
i
{\displaystyle h_{i}}
使:
M
i
h
i
≡
1
(
mod
m
i
)
{\displaystyle M_{i}h_{i}\equiv 1{\pmod {m_{i}}}}
有了这些数
h
i
{\displaystyle h_{i}}
之后,整数
x
{\displaystyle x}
可以用下式从余数
x
i
{\displaystyle x_{i}}
中解出:
x
≡
(
x
1
M
1
h
1
+
x
2
M
2
h
2
+
⋯
+
x
N
M
N
h
N
)
mod
M
{\displaystyle x\equiv (x_{1}M_{1}h_{1}+x_{2}M_{2}h_{2}+\cdots +x_{N}M_{N}h_{N})\mod M}
因为
h
i
{\displaystyle h_{i}}
是
M
i
{\displaystyle M_{i}}
的乘法逆,所以可以使用扩展欧几里得算法求出(见上一节 )。
连分数
辗转相除法和连分数 有着紧密的关系。[ 80] 计算连分数的过程如下:
a
b
=
q
0
+
r
0
b
b
r
0
=
q
1
+
r
1
r
0
r
0
r
1
=
q
2
+
r
2
r
1
⋮
r
k
−
2
r
k
−
1
=
q
k
+
r
k
r
k
−
1
⋮
r
N
−
2
r
N
−
1
=
q
N
{\displaystyle {\begin{aligned}{\frac {a}{b}}&=q_{0}+{\frac {r_{0}}{b}}\\{\frac {b}{r_{0}}}&=q_{1}+{\frac {r_{1}}{r_{0}}}\\{\frac {r_{0}}{r_{1}}}&=q_{2}+{\frac {r_{2}}{r_{1}}}\\\vdots &\\{\frac {r_{k-2}}{r_{k-1}}}&=q_{k}+{\frac {r_{k}}{r_{k-1}}}\\\vdots &\\{\frac {r_{N-2}}{r_{N-1}}}&=q_{N}\\\end{aligned}}}
其中每个式子的右边最后一项都等于下一个式子的左边项的倒数 。所以前两个式子可以组合成:
a
b
=
q
0
+
1
q
1
+
r
1
r
0
{\displaystyle {\frac {a}{b}}=q_{0}+{\frac {1}{q_{1}+{\frac {r_{1}}{r_{0}}}}}}
第三个式子可以代入分母中的
r
1
r
0
{\displaystyle {\frac {r_{1}}{r_{0}}}}
:
a
b
=
q
0
+
1
q
1
+
1
q
2
+
r
2
r
1
{\displaystyle {\frac {a}{b}}=q_{0}+{\frac {1}{q_{1}+{\frac {1}{q_{2}+{\frac {r_{2}}{r_{1}}}}}}}}
每一步中,最后一项
r
k
r
k
−
1
{\displaystyle {\frac {r_{k}}{r_{k-1}}}}
都可以用下一个式子代换,直至最后一个式子,结果是:
a
b
=
q
0
+
1
q
1
+
1
q
2
+
1
⋱
+
1
q
N
=
[
q
0
;
q
1
,
q
2
,
⋯
,
q
N
]
{\displaystyle {\frac {a}{b}}=q_{0}+{\dfrac {1}{q_{1}+{\dfrac {1}{q_{2}+{\dfrac {1}{\ddots +{\dfrac {1}{q_{N}}}}}}}}}=[q_{0};q_{1},q_{2},\cdots ,q_{N}]}
在上文的例子 中计算了
gcd
(
1071
,
462
)
{\displaystyle \gcd(1071,462)}
,其中商
q
k
{\displaystyle q_{k}}
分别是2、3、7,所以分数
1071
462
{\displaystyle {\frac {1071}{462}}}
可以写成如下连分数形式:
1071
462
=
2
+
1
3
+
1
7
=
[
2
;
3
,
7
]
{\displaystyle {\frac {1071}{462}}=2+{\frac {1}{3+{\frac {1}{7}}}}=[2;3,7]}
整数分解算法
计算最大公约数是很多整数分解 算法的重要步骤[ 81] ,如Pollard's rho算法 [ 82] 、Shor算法 [ 83] 、Dixon分解法 [ 84] 以及Lenstra椭圆曲线分解 [ 85] 。用辗转相除法算最大公约数效率非常高。而连分数分解法 由于用到了连分数,所以也需要使用辗转相除法[ 86] 。
算法效率
用辗转相除法求 GCD(x,y) 时所需的步数。红点表示所需步骤较少(快),黄、绿、蓝点所需步骤依次增加(慢)。
辗转相除法的计算效率已经被彻底研究过了。[ 87] 一个算法的效率可以用计算所需步数乘以每步计算的开销表示。加百利·拉梅 于1884年指出[ 88] ,用辗转相除法计算两个数的最大公约数所需的步数不会超过其中较小数十进制下的位数
h
{\displaystyle h}
的5倍。[ 89] [ 90] 因为每一步的计算开销通常也是
h
{\displaystyle h}
数量级的,所以辗转相除法的复杂度 是
h
2
{\displaystyle h^{2}}
。
计算步数
计算两个自然数
a
{\displaystyle a}
和
b
{\displaystyle b}
的最大公约数所需的步数可以表示为
T
(
a
,
b
)
{\displaystyle T(a,b)}
。[ 91] 如果
a
{\displaystyle a}
和
b
{\displaystyle b}
的最大公约数是
g
{\displaystyle g}
,
a
=
m
g
{\displaystyle a=mg}
,
b
=
n
g
{\displaystyle b=ng}
,而
m
{\displaystyle m}
和
n
{\displaystyle n}
是两个互素整数,那么:
T
(
a
,
b
)
=
T
(
m
,
n
)
{\displaystyle T(a,b)=T(m,n)}
这可以通过在辗转相除法的计算过程中的每一步都除以
g
{\displaystyle g}
来证明。[ 92] 同样,当
a
{\displaystyle a}
和
b
{\displaystyle b}
同时乘以
w
{\displaystyle w}
时,计算步数不变:
T
(
a
,
b
)
=
T
(
w
a
,
w
b
)
{\displaystyle T(a,b)=T(wa,wb)}
。所以,对于数值上相近的数,如
T
(
a
,
b
)
{\displaystyle T(a,b)}
和
T
(
a
,
b
+
1
)
{\displaystyle T(a,b+1)}
,计算步数可能相差很大。
根据辗转相除法的递归性质可以得出另一个公式:
T
(
a
,
b
)
=
1
+
T
(
b
,
r
0
)
=
2
+
T
(
r
0
,
r
1
)
=
⋯
=
N
+
T
(
r
N
−
2
,
r
N
−
1
)
=
N
+
1
{\displaystyle T(a,b)=1+T(b,r_{0})=2+T(r_{0},r_{1})=\cdots =N+T(r_{N-2},r_{N-1})=N+1}
其中,根据定义有
T
(
x
,
0
)
=
0
{\displaystyle T(x,0)=0}
。[ 91]
最差情况
假设用辗转相除法求自然数
a
{\displaystyle a}
和
b
{\displaystyle b}
(
a
>
b
>
0
{\displaystyle a>b>0}
)的最大公约数需要
N
{\displaystyle N}
步,那么满足这一条件的
a
{\displaystyle a}
和
b
{\displaystyle b}
的最小值分别是斐波那契数
F
N
+
2
{\displaystyle F_{N+2}}
和
F
N
+
1
{\displaystyle F_{N+1}}
。[ 93] 这可以用数学归纳法 证明。[ 94] 假设
N
=
1
{\displaystyle N=1}
,
b
{\displaystyle b}
整除
a
{\displaystyle a}
,满足这一条件的
a
{\displaystyle a}
和
b
{\displaystyle b}
最小是
b
=
1
{\displaystyle b=1}
、
a
=
2
{\displaystyle a=2}
,正是
F
2
{\displaystyle F_{2}}
和
F
3
{\displaystyle F_{3}}
。现在假设这一规律对
M
−
1
{\displaystyle M-1}
有效。一个需要
M
{\displaystyle M}
步的算法的第一步是
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}}
。因为算法是递归的,它需要
M
−
1
{\displaystyle M-1}
步才能算出
gcd
(
b
,
r
0
)
{\displaystyle \gcd(b,r_{0})}
,其中
b
{\displaystyle b}
和
r
0
{\displaystyle r_{0}}
的最小值是
F
M
+
1
{\displaystyle F_{M+1}}
和
F
M
{\displaystyle F_{M}}
。所以
a
{\displaystyle a}
的最小值是当
q
0
=
1
{\displaystyle q_{0}=1}
的时候,此时
q
=
b
+
r
0
=
F
M
+
1
+
F
M
=
F
M
+
2
{\displaystyle q=b+r_{0}=F_{M+1}+F_{M}=F_{M+2}}
。1844年,加百利·拉梅发现这个证明标志着计算复杂性理论 的诞生。[ 95] 这也是斐波那契数列 的第一个实际应用。[ 93]
这个结果也证明了辗转相除法的运算步骤不会超过较小数十进制下的位数的五倍。[ 96] 因为如果算法需要
N
{\displaystyle N}
步,那么
b
{\displaystyle b}
一定大于或等于
F
N
+
1
{\displaystyle F_{N+1}}
,也就是一定大于或等于
φ
N
−
1
{\displaystyle \varphi ^{N-1}}
,其中
φ
{\displaystyle \varphi }
是黄金分割比 。因为
b
≥
φ
N
−
1
{\displaystyle b\geq \varphi ^{N-1}}
,所以
N
−
1
≤
log
φ
b
{\displaystyle N-1\leq \log _{\varphi }b}
。因为
log
10
φ
>
1
5
{\displaystyle \log _{10}\varphi >{\frac {1}{5}}}
,
N
−
1
5
<
log
10
φ
log
φ
b
=
log
10
b
{\displaystyle {\frac {N-1}{5}}<\log _{10}\varphi \log _{\varphi }b=\log _{10}b}
,所以
N
≤
5
log
10
b
{\displaystyle N\leq 5\log _{10}b}
。所以,辗转相除法不会进行超过O (h ) 次除法,其中
h
{\displaystyle h}
是较小数
b
{\displaystyle b}
在十进制下的位数。
平均情况
辗转相除法的平均步骤数有三种不同的定义。第一种定义是计算已知自然数
a
{\displaystyle a}
和从0到
a
−
1
{\displaystyle a-1}
范围内随机选取的自然数
b
{\displaystyle b}
的最大公约数所需的时间
T
(
a
)
{\displaystyle T(a)}
:[ 91]
T
(
a
)
=
1
a
∑
0
≤
b
<
a
T
(
a
,
b
)
{\displaystyle T(a)={\frac {1}{a}}\sum _{0\leq b<a}T(a,b)}
但是因为
T
(
a
,
b
)
{\displaystyle T(a,b)}
在连续整数间变化非常剧烈,所以
T
(
a
)
{\displaystyle T(a)}
的值也会显得很杂乱。[ 97]
为了解决这个问题,第二种定义规定
τ
(
a
)
{\displaystyle \tau (a)}
只要取遍其中所有和
a
{\displaystyle a}
互素的数即可:
τ
(
a
)
=
1
φ
(
a
)
∑
0
≤
b
<
a
,
G
C
D
(
a
,
b
)
=
1
T
(
a
,
b
)
{\displaystyle \tau (a)={\frac {1}{\varphi (a)}}\sum _{0\leq b<a,\mathrm {GCD} (a,b)=1}T(a,b)}
在小于
a
{\displaystyle a}
的数中,有
φ
(
a
)
{\displaystyle \varphi (a)}
个数与
a
{\displaystyle a}
互素,其中
φ
{\displaystyle \varphi }
是欧拉函数 。在这个定义中,
τ
(
a
)
{\displaystyle \tau (a)}
的函数值增长得平稳很多。[ 98] [ 99]
τ
(
a
)
=
12
π
2
ln
2
ln
a
+
C
+
O
(
a
−
1
6
+
ε
)
{\displaystyle \tau (a)={\frac {12}{\pi ^{2}}}\ln 2\ln a+C+O(a^{-{\frac {1}{6}}+\varepsilon })}
误差项的增长率为
O
(
a
−
1
6
+
ε
)
{\displaystyle O(a^{-{\frac {1}{6}}+\varepsilon })}
,其中
ε
{\displaystyle \varepsilon }
是无穷小量 。公式中的常数
C
{\displaystyle C}
等于:
C
=
1
2
+
6
(
ln
2
π
2
)
(
4
γ
−
24
π
2
ζ
′
(
2
)
+
3
ln
2
−
2
)
≈
1.467
{\displaystyle C={\frac {1}{2}}+6({\frac {\ln 2}{\pi ^{2}}})(4\gamma -24\pi ^{2}\zeta '(2)+3\ln 2-2)\approx 1.467}
其中
γ
{\displaystyle \gamma }
是欧拉-马歇罗尼常数 ,
ζ
′
{\displaystyle \zeta '}
是黎曼ζ函数 的导数。[ 100] [ 101] 公式最左边的
12
π
2
ln
2
{\displaystyle {\frac {12}{\pi ^{2}}}\ln 2}
由两个独立的方法确定。[ 102] [ 103]
因为第一种定义可以通过用第二种定义的求和来完成:[ 104]
T
(
a
)
=
1
a
∑
d
|
a
φ
(
d
)
τ
(
d
)
{\displaystyle T(a)={\frac {1}{a}}\sum _{d|a}\varphi (d)\tau (d)}
所以也可以由以下公式近似:[ 105]
T
(
a
)
≈
C
+
12
π
2
ln
2
(
ln
a
−
∑
d
|
a
Λ
(
d
)
d
)
{\displaystyle T(a)\approx C+{\frac {12}{\pi ^{2}}}\ln 2(\ln a-\sum _{d|a}{\frac {\Lambda (d)}{d}})}
其中
Λ
(
d
)
{\displaystyle \Lambda (d)}
是冯·曼戈尔特函数 。[ 106]
第三种定义
Y
(
n
)
{\displaystyle Y(n)}
定义为从1到
n
{\displaystyle n}
间随机选取
a
{\displaystyle a}
和
b
{\displaystyle b}
(均匀分布 )时计算它们的最大公约数所需的平均步骤数:[ 105]
Y
(
n
)
=
1
n
2
∑
a
=
1
n
∑
b
=
1
n
T
(
a
,
b
)
=
1
n
∑
a
=
1
n
T
(
a
)
{\displaystyle Y(n)={\frac {1}{n^{2}}}\sum _{a=1}^{n}\sum _{b=1}^{n}T(a,b)={\frac {1}{n}}\sum _{a=1}^{n}T(a)}
将
T
(
a
)
{\displaystyle T(a)}
的近似公式代入,得到
Y
(
n
)
{\displaystyle Y(n)}
的近似:[ 107]
Y
(
n
)
≈
12
π
2
ln
2
ln
n
+
0.06
{\displaystyle Y(n)\approx {\frac {12}{\pi ^{2}}}\ln 2\ln n+0.06}
每一步的计算开销
在辗转相除法的每一步中,商
q
k
{\displaystyle q_{k}}
和余数
r
k
{\displaystyle r_{k}}
都通过
r
k
−
2
{\displaystyle r_{k-2}}
和
r
k
−
1
{\displaystyle r_{k-1}}
求出:
r
k
−
2
=
q
k
r
k
−
1
+
r
k
{\displaystyle r_{k-2}=q_{k}r_{k-1}+r_{k}}
所以每一步的计算开销主要与计算商
q
k
{\displaystyle q_{k}}
的算法有关,因为余数
r
k
{\displaystyle r_{k}}
可以很迅速地从
r
k
−
2
{\displaystyle r_{k-2}}
、
r
k
−
1
{\displaystyle r_{k-1}}
和
q
k
{\displaystyle q_{k}}
计算出来:
r
k
=
r
k
−
2
−
q
k
r
k
−
1
{\displaystyle r_{k}=r_{k-2}-q_{k}r_{k-1}}
而计算一个
h
{\displaystyle h}
位整数的除法的算法复杂度是O (h (ℓ +1)) ,其中ℓ
l
{\displaystyle l}
是商的位数。[ 108]
作为对比,辗转相除法原先的版本使用的是减法,因此效率要慢很多。进行一次除法等同于进行
q
{\displaystyle q}
次减法(其中
q
{\displaystyle q}
是商)。如果
a
{\displaystyle a}
和
b
{\displaystyle b}
的比很大,计算出的商也很大,也就需要进行很多次减法。但在另一方面,计算出来的商在大多数情况下都是非常小的,除法中得出一个确定的商
q
{\displaystyle q}
的概率大约是
log
2
(
u
u
−
1
)
{\displaystyle \log _{2}\left({\frac {u}{u-1}}\right)}
。其中
u
=
(
q
+
1
)
2
{\displaystyle u=(q+1)^{2}}
。[ 109] 比如,商是1、2、3、4的可能性分别是大约41.5%、17.0%、9.3%、5.9%。因为计算机计算减法要快于除法,特别是对于很大的数字[ 110] ,所以减法版本的辗转相除法的性能可以比得上除法版本。[ 111] 这也被运用于二进制 最大公约数算法。[ 112]
综合考虑算法需要的步数和每一步的计算开销,辗转相除法随两个数字
a
{\displaystyle a}
和
b
{\displaystyle b}
的平均位数成平方级的速度增长(
h
2
{\displaystyle h^{2}}
)。设
h
0
,
h
1
,
⋯
,
h
N
−
1
{\displaystyle h_{0},h_{1},\cdots ,h_{N-1}}
表示计算过程中的余数
r
0
,
r
1
,
⋯
,
r
N
−
1
{\displaystyle r_{0},r_{1},\cdots ,r_{N-1}}
的位数,因为算法的步数
N
{\displaystyle N}
随
h
{\displaystyle h}
线性增长,所以算法的运算时间为:
O
(
∑
i
<
N
h
i
(
h
i
−
h
i
+
1
+
2
)
)
⊆
O
(
h
∑
i
<
N
(
h
i
−
h
i
+
1
+
2
)
)
⊆
O
(
h
(
h
0
+
2
N
)
)
⊆
O
(
h
2
)
{\displaystyle O{\Big (}\sum _{i<N}h_{i}(h_{i}-h_{i+1}+2){\Big )}\subseteq O{\Big (}h\sum _{i<N}(h_{i}-h_{i+1}+2){\Big )}\subseteq O(h(h_{0}+2N))\subseteq O(h^{2})}
其他算法的效率
因为辗转相除法的高效率,它在实践中被广泛使用。作为对比,本段中介绍以下辗转相除法以外的其他最大公约数算法的效率。
计算两数
a
{\displaystyle a}
和
b
{\displaystyle b}
的最大公约数有一个效率很慢的算法:将
a
{\displaystyle a}
除以从2到
b
{\displaystyle b}
之间的每一个整数以计算出它们所有的公约数,其中最大的一个即是最大公约数。在这个算法中,步骤数随
b
{\displaystyle b}
线性增长,也就是随输入数字的位数呈指数级增长。另一个很低效的算法是计算出两个数的所有素因数(见上文 ),最大公约数等于所有公共素因数的乘积。[ 7] 但是整数分解 算法效率极低,很多现代的加密系统甚至依靠这种低效率来防止资料被破解。[ 10]
除了辗转相除法之外,也有一些高效的算法存在,如二进制最大公约数算法 将除法操作替换成了二进制 的移位,以进一步提高用计算机运算时的效率。[ 113] [ 114] 但是,这种改变并没有降低算法的复杂度(仍然是O (h ²) ),虽然它在计算机上确实比辗转相除法快些。[ 115] 也可以通过只检视
a
{\displaystyle a}
和
b
{\displaystyle b}
的前几位数来进一步提高效率,不过效果并不明显。[ 116] [ 117] 二进制版的算法还可以扩展到其它进制[ 118] ,效率最多可以提升五倍。[ 119]
对于超过25,000位数的大数,有一种改进使算法复杂度降低至平方级以下[ 120] ,如Schönhage[ 121] [ 122] 、Stehlé、Zimmermann等人提出的算法。[ 123] 这些算法利用2×2的矩阵(见上文 )。这些亚平方级的算法复杂度通常是
O
(
h
(
log
h
)
2
)
(
log
log
h
)
{\displaystyle O(h(\log h)^{2})(\log \log h)}
。[ 115] [ 124]
其他数系
如上文所述,辗转相除法最早用来寻找两自然数的最大公约数,但其实它也可以被推广至实数,甚至是多项式 、二次整数 和赫尔维茨四元数 。在这些数系中,辗转相除法甚至被用来证明一个重要特性:惟一分解,即这些数系中的数能够被惟一地分解成不可约元素 (素数在这些数系的对应物)。惟一分解是数论中很多证明的基础。
有理数和实数
辗转相除法可以被应用至实数 ,如欧几里得在几何原本 第10卷中所说的那样。算法的目的是计算出实数
g
{\displaystyle g}
,使已知实数
a
{\displaystyle a}
和
b
{\displaystyle b}
是它的整数倍:
a
=
m
g
{\displaystyle a=mg}
、
b
=
n
g
{\displaystyle b=ng}
,其中
m
{\displaystyle m}
和
n
{\displaystyle n}
是整数 。[ 32] 这也就找到了
a
{\displaystyle a}
和
b
{\displaystyle b}
的整数关系,即找到整数
s
{\displaystyle s}
和
t
{\displaystyle t}
使
s
a
+
t
b
=
0
{\displaystyle sa+tb=0}
。欧几里得使用辗转相除法来处理不可通约的长度 。[ 125] [ 126]
实数的辗转相除法和整数的算法有两个区别。第一,余数
r
k
{\displaystyle r_{k}}
是实数,虽然商
q
k
{\displaystyle q_{k}}
仍然是整数。第二,算法不能保证在有限步内结束。如果能在有限步内结束,那么分数
a
b
{\displaystyle {\frac {a}{b}}}
是一个有理数 ,即:
a
b
=
m
g
n
g
=
m
n
{\displaystyle {\frac {a}{b}}={\frac {mg}{ng}}={\frac {m}{n}}}
于是我们可以写出它的有限连分数 形式:
[
q
0
;
q
1
,
q
2
,
⋯
,
q
n
]
{\displaystyle [q_{0};q_{1},q_{2},\cdots ,q_{n}]}
。如果算法无法结束,那么
a
b
{\displaystyle {\frac {a}{b}}}
是无理数 ,可以写成无限的连分数形式:
[
q
0
;
q
1
,
q
2
,
⋯
]
{\displaystyle [q_{0};q_{1},q_{2},\cdots ]}
。无限连分数的一个例子是:黄金分割比
φ
=
[
1
;
1
,
1
,
⋯
]
{\displaystyle \varphi =[1;1,1,\cdots ]}
和2的算术平方根 :
2
=
[
1
;
2
,
2
,
…
]
{\displaystyle {\sqrt {2}}=[1;2,2,\ldots ]}
。通常,算法能够结束的可能性是很低的,因为对于实数
a
{\displaystyle a}
和
b
{\displaystyle b}
,几乎所有
a
b
{\displaystyle {\frac {a}{b}}}
都是无理数。
如果算法不结束,也可以在第
k
{\displaystyle k}
步时终止计算,得到近似连分数
[
q
0
;
q
1
,
q
2
,
⋯
,
q
k
]
{\displaystyle [q_{0};q_{1},q_{2},\cdots ,q_{k}]}
。终止时的
k
{\displaystyle k}
越大,则近似越准确。连分数
m
n
{\displaystyle {\frac {m}{n}}}
的分子和分母互素并满足下式:
m
k
=
q
k
m
k
−
1
+
m
k
−
2
{\displaystyle m_{k}=q_{k}m_{k-1}+m_{k-2}}
n
k
=
q
k
n
k
−
1
+
n
k
−
2
{\displaystyle n_{k}=q_{k}n_{k-1}+n_{k-2}}
其中递归的初始值是
m
−
1
=
n
−
2
=
1
{\displaystyle m_{-1}=n_{-2}=1}
,
m
−
2
=
n
−
1
=
0
{\displaystyle m_{-2}=n_{-1}=0}
。
m
k
n
k
{\displaystyle {\frac {m_{k}}{n_{k}}}}
是
a
b
{\displaystyle {\frac {a}{b}}}
在分母是
n
k
{\displaystyle n_{k}}
的数中最精确的有理数 近似值:
|
a
b
−
m
k
n
k
|
<
1
n
k
2
{\displaystyle \left|{\frac {a}{b}}-{\frac {m_{k}}{n_{k}}}\right|<{\frac {1}{n_{k}^{2}}}}
多项式
只含有一个变量
x
{\displaystyle x}
的多项式可以和整数一样进行加法、乘法和分解为不可约多项式 (也就是多项式中的“素数”)。两个多项式
a
(
x
)
{\displaystyle a(x)}
和
b
(
x
)
{\displaystyle b(x)}
的最大公约数
g
(
x
)
{\displaystyle g(x)}
定义为它们分解 之后共有的不可约因式的乘积,这可以用辗转相除法进行计算。[ 127] 对于多项式的算法和整数的算法很相似,在每个步骤
k
{\displaystyle k}
,计算出满足以下递归式的商多项式
q
k
(
x
)
{\displaystyle q_{k}(x)}
和余数多项式
r
k
(
x
)
{\displaystyle r_{k}(x)}
:
r
k
−
2
(
x
)
=
q
k
(
x
)
r
k
−
1
(
x
)
+
r
k
(
x
)
{\displaystyle r_{k-2}(x)=q_{k}(x)r_{k-1}(x)+r_{k}(x)}
其中
r
−
2
(
x
)
=
a
(
x
)
{\displaystyle r_{-2}(x)=a(x)}
,
r
−
1
(
x
)
=
b
(
x
)
{\displaystyle r_{-1}(x)=b(x)}
。所选择的商式必须能使
q
k
(
x
)
r
k
−
1
(
x
)
{\displaystyle q_{k}(x)r_{k-1}(x)}
的首项系数和
r
k
−
2
(
x
)
{\displaystyle r_{k-2}(x)}
的相等,这样才能保证每个余数的次数小于前一个余数(
deg
[
r
k
(
x
)
]
<
deg
[
r
k
−
1
(
x
)
]
{\displaystyle \deg[r_{k}(x)]<\deg[r_{k-1}(x)]}
)。因为非零多项式的次数是非负整数,并且在每一步都减小,所以辗转相除法的计算一定能在有限步内结束。最后一个非零余数即是两个多项式
a
(
x
)
{\displaystyle a(x)}
和
b
(
x
)
{\displaystyle b(x)}
的最大公约数。[ 128]
例如,有如下两个四次多项式,都可以分解成两个二次多项式的乘积:
a
(
x
)
=
x
4
−
4
x
3
+
4
x
2
−
3
x
+
14
=
(
x
2
−
5
x
+
7
)
(
x
2
+
x
+
2
)
{\displaystyle a(x)=x^{4}-4x^{3}+4x^{2}-3x+14=(x^{2}-5x+7)(x^{2}+x+2)}
和
b
(
x
)
=
x
4
+
8
x
3
+
12
x
2
+
17
x
+
6
=
(
x
2
+
7
x
+
3
)
(
x
2
+
x
+
2
)
{\displaystyle b(x)=x^{4}+8x^{3}+12x^{2}+17x+6=(x^{2}+7x+3)(x^{2}+x+2)}
.
a
(
x
)
{\displaystyle a(x)}
除以
b
(
x
)
{\displaystyle b(x)}
得到余数:
r
0
(
x
)
=
x
3
+
2
3
x
2
+
5
3
x
−
2
3
{\displaystyle r_{0}(x)=x^{3}+{\frac {2}{3}}x^{2}+{\frac {5}{3}}x-{\frac {2}{3}}}
在下一步中,
b
(
x
)
{\displaystyle b(x)}
除以
r
0
(
x
)
{\displaystyle r_{0}(x)}
得到
r
1
(
x
)
=
x
2
+
x
+
2
{\displaystyle r_{1}(x)=x^{2}+x+2}
。最终,
r
0
(
x
)
{\displaystyle r_{0}(x)}
除以
r
1
(
x
)
{\displaystyle r_{1}(x)}
得到的余数为0,所以
r
1
(
x
)
{\displaystyle r_{1}(x)}
是
a
(
x
)
{\displaystyle a(x)}
和
b
(
x
)
{\displaystyle b(x)}
的最大公约数,这和它们因式分解的结果相符合。
上文所述的很多应用也适用于多项式。[ 129] 辗转相除法可以解多项式的线性丢番图方程和中国剩余定理,也可以用来定义多项式的连分数展开式。
多项式的辗转相除法也有其他应用,如施图姆定理 ,一个用于计算多项式在给定区间内的实根个数的方法。这被应用于其他领域,如控制论 的劳斯-赫尔维茨稳定性判据 。
最后,多项式的系数不必局限于整数、实数、甚至复数。这些系数可以是其他域 中的元素,如上文 所述的有限域
G
F
(
p
)
{\displaystyle \mathrm {GF} (p)}
。从辗转相除法得出的结论也可以直接推广至这类多项式。[ 127]
高斯整数
高斯素数u + vi 在复平面 的分布,其中u 2 + v 2 小于500。
高斯整数是满足
α
=
u
+
v
i
{\displaystyle \alpha =u+vi}
的复数,其中
u
{\displaystyle u}
和
v
{\displaystyle v}
是普通整数 ,
i
{\displaystyle i}
是虚数单位 (-1的平方根)。[ 130] 通过在高斯整数中定义辗转相除法,根据上文贝祖等式 可以证明高斯整数的惟一分解。[ 46] 高斯整数的惟一分解性质在很多应用中都很重要,如计算勾股数 或者证明费马平方和定理 。[ 130] 辗转相除法用于这些应用很方便,但并非必不可少,一些定理也可以由其他方式证明。
对于两个高斯整数
α
{\displaystyle \alpha }
和
β
{\displaystyle \beta }
的辗转相除法和普通整数只有两个区别。像整数一样,算法的第
k
{\displaystyle k}
步计算出商
q
k
{\displaystyle q_{k}}
和余数
r
k
{\displaystyle r_{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}=\alpha }
,
r
k
−
1
=
β
{\displaystyle r_{k-1}=\beta }
,每个余数都严格地小于前一个余数,
|
r
k
|
<
|
r
k
−
1
|
{\displaystyle |r_{k}|<|r_{k-1}|}
。第一个区别即是:商和余数都是高斯整数,也就是复数 ,所以商
q
k
{\displaystyle q_{k}}
是透过对实际比例(如复数
α
{\displaystyle \alpha }
/
β
{\displaystyle \beta }
)的实部和虚部取最近似整数来找出的。第二个区别就是需要定义复数比较大小的方法。所以我们定义一个范数 函数
f
(
u
+
v
i
)
=
u
2
+
v
2
{\displaystyle f(u+vi)=u^{2}+v^{2}}
,以将高斯整数
u
+
v
i
{\displaystyle u+vi}
转换成普通整数来比较大小。在每个步骤
k
{\displaystyle k}
中,余数的范数
f
(
r
k
)
{\displaystyle {\ce {f(r_k)}}}
必须小于前一个余数的范数
f
(
r
k
−
1
)
{\displaystyle f(r_{k-1})}
。因为范数是非负整数并且在每一步都减小,所以辗转相除法在有限步内一定能结束。最后一个非零余数即是
α
{\displaystyle \alpha }
和
β
{\displaystyle \beta }
的最大公约数,即能同时整除
α
{\displaystyle \alpha }
和
β
{\displaystyle \beta }
的整数中范数最大的一个。若把乘以
±
1
{\displaystyle \pm 1}
或
±
i
{\displaystyle \pm i}
的所得结果考虑在内,那么可以说
α
{\displaystyle \alpha }
和
β
{\displaystyle \beta }
的最大公约数是唯一的。
很多其他应用如线性丢番图方程、中国剩余定理都适用于高斯整数,高斯整数的连分数也可以用辗转相除法定义。
欧几里得整环
如果一个支持两种二元运算 (+ 和 ·)的元素的集合形成一个交换环 R 并且可以使用辗转相除法求最大公约数,那么这个集合叫做欧几里得整环 。[ 131] [ 132] 这两个二元运算不必是平常算数中的加法和乘法,它们可以是更广泛的概念,如群 或幺半群 中的运算。但是这些运算仍然需要遵守交换律 、结合律 、分配律 。
推广之后的辗转相除法需要一个欧几里得函数,即一个将
R
{\displaystyle R}
映射到非负整数集合的函数
f
{\displaystyle f}
,使得对于
R
{\displaystyle R}
中非零元素
a
{\displaystyle a}
和
b
{\displaystyle b}
,
R
{\displaystyle R}
中存在
q
{\displaystyle q}
和
r
{\displaystyle r}
满足
a
=
q
b
+
r
{\displaystyle a=qb+r}
,
f
(
r
)
<
f
(
b
)
{\displaystyle f(r)<f(b)}
。例如上文 中用于高斯整数的范数函数。这个函数
f
{\displaystyle f}
可以是数的绝对值或模,也可以是多项式的次数,只要辗转相除法计算过程中它的值不断减小就行,这样算法便能在有限步内结束。这非常依赖于非负整数的良序 性,即每个非空的非负整数集合都有一个最小数。
任何欧几里得整环都满足算数基本定理 :欧几里得整环中的数可以惟一分解 。所以任何欧几里得整环都是惟一分解整环 ,但反之不然。欧几里得整环是GCD整环 (任意两元素都存在最大公约数的整环)的子类。也就是说,在某些整环中,两元素存在最大公约数但却不能用辗转相除法计算。欧几里得整环都是主理想环 ,即其中每一个理想 都是主理想 ,但并不是每个主理想环都是欧几里得整环。
欧几里得整环的惟一分解性质在很多场合都非常有用。例如,高斯整数的惟一分解性质可以方便地导出勾股数 的公式,或者证明费马平方和定理 。[ 130] 惟一分解性质也是加百利·拉梅于1847年基于约瑟夫·刘维尔 的建议发表的证明费马最后定理 的尝试中的关键部分。[ 133] 拉梅的尝试需要形如
x
+
ω
y
{\displaystyle x+\omega y}
的数的惟一分解性质,其中
x
{\displaystyle x}
和
y
{\displaystyle y}
是整数,
ω
=
e
2
i
π
n
{\displaystyle \omega =e^{\frac {2i\pi }{n}}}
是1的
n
{\displaystyle n}
次方根,即
ω
n
=
1
{\displaystyle \omega ^{n}=1}
。虽然这对于某些
n
{\displaystyle n}
成立(如
n
=
3
{\displaystyle n=3}
时的艾森斯坦整数 ),但在其他情况下并非总是正确的。惟一分解性质在分圆域 的失效使恩斯特·库默尔 发明了理想数 的概念,随后理查德·戴德金 创造了理想 的概念。[来源请求]
二次整数的惟一分解
艾森斯坦素数
u
+
v
ω
{\displaystyle u+v\omega }
在复平面的分布(范数小于500,
ω
{\displaystyle \omega }
等于1的立方根 )。
二次整数环 对于解释欧几里得整环很有帮助。二次整数是高斯整数的推广,高斯整数中的虚数单位i 被替换成一个复数ω。二次整数的形式是
u
+
v
ω
{\displaystyle u+v\omega }
,其中
u
{\displaystyle u}
和
v
{\displaystyle v}
是整数,
ω
{\displaystyle \omega }
有两种形式,取决于参数
D
{\displaystyle D}
。如果
D
{\displaystyle D}
不等于四的倍数加一,那么:
ω
=
D
{\displaystyle \omega ={\sqrt {D}}}
如果
D
{\displaystyle D}
等于四的倍数加一,那么:
ω
=
1
+
D
2
{\displaystyle \omega ={\frac {1+{\sqrt {D}}}{2}}}
如果二次整数环有像上文 用来比较高斯整数的那样的范数 函数,那么它就是规范欧几里德整环。只有当
D
=
{\displaystyle D=}
−11, −7, −3, −2, −1, 2, 3, 5, 6, 7, 11, 13, 17, 19, 21, 29, 33, 37, 41, 57或73时,二次整数环才是规范欧几里德整环[ 25] 。
D
=
{\displaystyle D=}
−1和−3时的二次整数分别叫作高斯整数 和艾森斯坦整数 。
但如果范数 函数
f
{\displaystyle f}
可以是任何欧几里得函数,那么使二次整数环是欧几里得整环的
D
{\displaystyle D}
的可能值到目前为止还不确定。[ 134] 是欧几里得整环但不是规范欧几里德整环的第一个例子(
D
=
69
{\displaystyle D=69}
)发表于1994年[ 134] 。温伯格于1973年证明,在广义黎曼猜想 成立的前提下,
D
>
0
{\displaystyle D>0}
时的二次整数环是欧几里得整环,当且仅当它是一个主理想环 。[ 135]
非交换环
辗转相除法也可以应用至非交换环,如赫尔维茨四元数 。[ 136] 令
α
{\displaystyle \alpha }
和
β
{\displaystyle \beta }
表示这样一个环中的两个元素。他们有右公约数
δ
{\displaystyle \delta }
如果
α
=
ξ
δ
{\displaystyle \alpha =\xi \delta }
,
β
=
η
δ
{\displaystyle \beta =\eta \delta }
(
ξ
{\displaystyle \xi }
和
η
{\displaystyle \eta }
是环中的元素)。同样,他们有左公约数
δ
{\displaystyle \delta }
如果
α
=
δ
ζ
{\displaystyle \alpha =\delta \zeta }
,
β
=
δ
η
{\displaystyle \beta =\delta \eta }
(
ξ
{\displaystyle \xi }
和
η
{\displaystyle \eta }
是环中的元素)。因为乘法不符合交换律,也就有两个版本的辗转相除法,一个计算右公约数,一个计算左公约数。例如对于右公约数,辗转相除法求最大公约数的第一步可以写成:
ρ
0
=
α
−
ψ
0
β
=
(
ζ
−
ψ
0
η
)
δ
{\displaystyle \rho _{0}=\alpha -\psi _{0}\beta =(\zeta -\psi _{0}\eta )\delta }
其中
ψ
0
{\displaystyle \psi _{0}}
是商,
ρ
0
{\displaystyle \rho _{0}}
是余数。对于左公约数,第一步过程是:
ρ
0
=
α
−
β
ψ
0
=
δ
(
ζ
−
η
ψ
0
)
{\displaystyle \rho _{0}=\alpha -\beta \psi _{0}=\delta (\zeta -\eta \psi _{0})}
不管是哪一种,这个过程都会重复到最大左公约数或者最大右公约数计算出,像在欧几里得整环中一样,
ρ
0
{\displaystyle \rho _{0}}
的“大小”一定小于
β
{\displaystyle \beta }
,并且对于
ρ
0
{\displaystyle \rho _{0}}
只有有限种的可能大小,这样才能保证算法能够结束。
由辗转相除法得出的大多数结果都适用于非交换环。例如,贝祖等式 表明最大右公约数可以表示成α 的倍数和β 的倍数的和,即,存在
σ
{\displaystyle \sigma }
和
τ
{\displaystyle \tau }
使:
Γ
右
=
σ
α
+
τ
β
{\displaystyle \Gamma _{\text{右 }}=\sigma \alpha +\tau \beta }
对于最大左公约数,等式如下:
Γ
左
=
α
σ
+
β
τ
{\displaystyle \Gamma _{\text{左 }}=\alpha \sigma +\beta \tau }
贝祖等式可以用来解非交换环的丢番图方程。
推广至其他数学结构
辗转相除法可以推广至纽结理论 。[ 137]
辗转相除法有三个性质保证它不会永远进行下去。第一,它可以写成一系列递归式:
r
k
=
r
k
−
2
−
q
k
r
k
−
1
{\displaystyle r_{k}=r_{k-2}-q_{k}r_{k-1}}
其中每一个余数都比前一个余数小,
|
r
k
|
<
|
r
k
−
1
|
{\displaystyle |r_{k}|<|r_{k-1}|}
。第二,余数的大小有严格下限,如
|
r
k
|
≥
0
{\displaystyle |r_{k}|\geq 0}
。第三,小于
|
r
k
|
{\displaystyle |r_{k}|}
的数的数量是有限的。辗转相除法推广至其他数学结构,如缠结 [ 138] 和超限 序数 [ 139] 时仍保持这种性质。
辗转相除法的一个重要推广是代数几何 中格罗布纳基 的概念。像前文所述,
a
{\displaystyle a}
和
b
{\displaystyle b}
的最大公约数
g
{\displaystyle g}
是它们的理想 的生成元素。也就是说,对任何整数
s
{\displaystyle s}
和
t
{\displaystyle t}
,存在另一个整数
m
{\displaystyle m}
使:
s
a
+
t
b
=
m
g
{\displaystyle sa+tb=mg}
虽然这对一元多项式也成立,但是对多元多项式就不成立了。[ 140] 在多元多项式的情况下,生成元素的有限集合
g
1
,
g
2
,
⋯
{\displaystyle g_{1},g_{2},\cdots }
可以定义如下:
s
a
+
t
b
=
∑
k
m
k
g
k
{\displaystyle sa+tb=\mathrm {\sum } _{k}m_{k}g_{k}}
其中
s
{\displaystyle s}
、
t
{\displaystyle t}
和
m
k
{\displaystyle m_{k}}
是多元多项式。[ 141] 任何这样的多元多项式
f
{\displaystyle f}
可以表示成生成多项式的和加上惟一的余数多项式
r
{\displaystyle r}
, 通常叫做多项式
f
{\displaystyle f}
的一般形式。
f
=
r
+
∑
k
q
k
g
k
{\displaystyle f=r+\mathrm {\sum } _{k}q_{k}g_{k}}
虽然商多项式
q
k
{\displaystyle q_{k}}
可能不惟一。[ 142] 这些生成多项式的集合就叫做格罗布纳基。[ 143]
参考文献
引用
^ Godfried Toussaint , "The Euclidean algorithm generates traditional musical rhythms," Proceedings of BRIDGES: Mathematical Connections in Art, Music, and Science , Banff, Alberta, Canada, July 31 to August 3, 2005, pp. 47–56.
^ Stark, p. 16.
^ Stark, p. 21.
^ LeVeque, p. 32.
^ Leveque, p. 31.
^ Grossman JW. Discrete Mathematics. New York: Macmillan. 1990: 213. ISBN 0-02-348331-8 .
^ 7.0 7.1 Schroeder, pp. 21–22.
^ Schroeder, p. 19.
^ Ogilvy CS, Anderson JT. Excursions in number theory. New York: Oxford University Press . 1966: 27–29. .
^ 10.0 10.1 Schroeder, pp. 216–219.
^ 11.0 11.1 11.2 Leveque, p. 33.
^ Stark, p. 25.
^ Ore, pp. 47–48.
^ 高德纳. The Art of Computer Programming(计算机程序设计艺术 ), Volume 1: Fundamental Algorithms 3rd. Addison-Wesley. 1997. ISBN 0-201-89683-4 . (Section 1.2.1: Mathematical Induction, pp. 11–21.)
^ Rosen, pp. 18–21.
^ Rosen, pp. 21–24.
^ Anderson JA. Discrete Mathematics with Combinatorics . Upper Saddle River, NJ: Prentice Hall. 2001: 165 –223. ISBN 0-13-086998-8 .
^ Rosen, p. 492.
^ Anderson JA. Discrete Mathematics with Combinatorics . Upper Saddle River, NJ: Prentice Hall. 2001: 109 –119. ISBN 0-13-086998-8 .
^ 20.0 20.1 Stark, pp. 16–20.
^ Stark, p. 18.
^ 高德纳, p. 320.
^ Lovász L, Pelikán J, Vesztergombi K. Discrete Mathematics: Elementary and Beyond. New York: Springer-Verlag. 2003: 100–101. ISBN 0-387-95584-4 .
^ Kimberling C. A Visual Euclidean Algorithm . Mathematics Teacher. 1983, 76 : 108–109.
^ 25.0 25.1 Cohn, pp. 104–110.
^ 高德纳, pp. 319–320.
^ 高德纳, pp. 318–319.
^ Stillwell, p. 14.
^ 29.0 29.1 Ore, p. 43.
^ 30.0 30.1 Stewart BM. Theory of Numbers 2nd. New York: Macmillan. 1964: 43–44. .
^ 31.0 31.1 高德纳, p. 318.
^ 32.0 32.1 Weil A . Number Theory. Boston: Birkhäuser. 1983: 4–6. ISBN 0-8176-3141-0 .
^ Jones A. Greek mathematics to AD 300. Companion encyclopedia of the history and philosophy of the mathematical sciences. New York: Routledge. 1994: 46–48. ISBN 0-415-09238-8 .
^ van der Waerden BL . Science Awakening . translated by Arnold Dresden. Groningen: P. Noordhoff Ltd. 1954: 114 –115.
^ von Fritz K. The Discovery of Incommensurability by Hippasus of Metapontum . Ann. Math. 1945, 46 : 242–264. doi:10.2307/1969021 .
^ Heath TL . Mathematics in Aristotle . Oxford Press. 1949: 80 –83.
^ Fowler DH . The Mathematics of Plato's Academy: A New Reconstruction . Oxford: Oxford University Press. 1987: 31 –66. ISBN 0-19-853912-6 .
^ Becker O. Eudoxus-Studien I. Eine voreuklidische Proportionslehre und ihre Spuren bei Aristoteles und Euklid. Quellen und Studien zur Geschichte der Mathematik B. 1933, 2 : 311–333.
^ 39.0 39.1 Stillwell, p. 31.
^ Rosen, pp. 86–87.
^ 41.0 41.1 Tattersall, p. 70.
^ 九章算术 . 维基文库 (中文) . 可半者半之;不可半者,副置分母、子之数,以少减多,更相减损,求其等也。以等数约之。
^ Ore, pp. 247–248.
^ 洪万生. 中國π的一頁滄桑 . [2015-04-28 ] . (原始内容 存档于2016-03-05).
^ Tattersall, pp. 72–76.
^ 46.0 46.1 Gauss CF . Theoria residuorum biquadraticorum. Comm. Soc. Reg. Sci. Gött. Rec. 1832, 4 . See also Werke , 2 :67–148.
^ 狄利克雷, pp. 29–31.
^ Dedekind R . Supplement XI. PGL 狄利克雷 (编). Vorlesungen über Zahlentheorie. 1894.
^ Stillwell J . Elements of Number Theory. New York: Springer-Verlag. 2003: 41–42. ISBN 0-387-95587-9 .
^ Sturm C. Mémoire sur la résolution des équations numériques. Bull. des sciences de Férussac. 1829, 11 : 419–422.
^ Weisstein, Eric W. (编). Integer Relation . at MathWorld --A Wolfram Web Resource. Wolfram Research, Inc. (英语) .
^ Peterson I. Jazzing Up Euclid's Algorithm . ScienceNews. 12 August 2002.
^ Cipra BA. The Best of the 20th Century: Editors Name Top 10 Algorithms . SIAM News (Society for Industrial and Applied Mathematics ). 16 May 2000, 33 (4).
^ Cole AJ, Davie AJT. A game based on the Euclidean algorithm and a winning strategy for it . Math. Gaz. 1969, 53 : 354–357. doi:10.2307/3612461 .
^ Spitznagel EL. Properties of a game based on Euclid's algorithm. Math. Mag. 1973, 46 : 87–92.
^ Rosen, p. 95.
^ Roberts J. Elementary Number Theory: A Problem Oriented Approach . Cambridge, MA: MIT Press . 1977: 1 –8. ISBN 0-262-68028-9 .
^ Jones GA, Jones JM. Bezout's Identity. Elementary Number Theory. New York: Springer-Verlag. 1998: 7–11.
^ Rosen, p. 81.
^ Cohn, p. 104.
^ Rosen, p. 91.
^ Schroeder, p. 23.
^ Rosen, pp. 90–93.
^ 64.0 64.1 Koshy T. Elementary Number Theory with Applications. Burlington, MA: Harcourt/Academic Press. 2002: 167–169. ISBN 0-12-421171-2 .
^ Bach E, Shallit J. Algorithmic number theory. Cambridge, MA: MIT Press. 1996: 70–73. ISBN 0-262-02405-5 .
^ Stark, pp. 26–36.
^ 67.0 67.1 Ore, p. 44.
^ Stark, pp. 281–292.
^ Rosen, pp. 119–125.
^ Schroeder, pp. 106–107.
^ Schroeder, pp. 108–109.
^ Rosen, pp. 120–121.
^ Stark, p. 47.
^ Schroeder, pp. 107–109.
^ Stillwell, pp. 186–187.
^ Schroeder, p. 134.
^ "Error correction coding: mathematical methods and algorithms", page 266, Todd K. Moon, John Wiley and Sons, 2005, ISBN 978-0-471-64800-0
^ Rosen, pp. 143–170.
^ Schroeder, pp. 194–195.
^ Vinogradov IM . Elements of Number Theory. New York: Dover. 1954: 3–13.
^ Crandall R, Pomerance C. Prime Numbers: A Computational Perspective 1st. New York: Springer-Verlag. 2001: 225 –349. ISBN 0-387-94777-9 .
^ 高德纳, pp. 369–371.
^ Shor PW . Polynomial-Time Algorithms for Prime Factorization and Discrete Logarithms on a Quantum Computer. SIAM J. Sci. Statist. Comput. 1997, 26 : 1484.
^ Dixon JD. Asymptotically fast factorization of integers . Math. Comput. 1981, 36 : 255–260. doi:10.2307/2007743 .
^ Lenstra Jr. HW . Factoring integers with elliptic curves . Annals of Mathematics. 1987, 126 : 649–673. doi:10.2307/1971363 .
^ 高德纳, pp. 380–384.
^ 高德纳, pp. 339–364.
^ 加百利·拉梅 . Note sur la limite du nombre des divisions dans la recherche du plus grand commun diviseur entre deux nombres entiers. Comptes Rendus Acad. Sci. 1844, 19 : 867–870.
^ Grossman H. On the Number of Divisions in Finding a G.C.D. . The American Mathematical Monthly. 1924, 31 : 443. doi:10.2307/2298146 .
^ Honsberger R. Mathematical Gems II. The Mathematical Association of America . 1976: 54–57. ISBN 0-88385-302-7 .
^ 91.0 91.1 91.2 高德纳, p. 344.
^ Ore, p. 45.
^ 93.0 93.1 高德纳, p. 343.
^ Mollin, p. 21.
^ LeVeque, p. 35.
^ Mollin, pp. 21–22.
^ 高德纳, p. 353.
^ 高德纳, p. 357.
^ Tonkov T. On the average length of finite continued fractions. Acta arithmetica. 1974, 26 : 47–57.
^ Porter JW. On a Theorem of Heilbronn. Mathematika. 1975, 22 : 20–28.
^ 高德纳 DE. Evaluation of Porter's Constant . Computers and Mathematics with Applications. 1976, 2 : 137–139. doi:10.1016/0898-1221(76)90025-0 .
^ Dixon JD. The Number of Steps in the Euclidean Algorithm. J. Number Theory. 1970, 2 : 414–422. doi:10.1016/0022-314X(70)90044-2 .
^ Heilbronn HA. On the Average Length of a Class of Finite Continued Fractions. Paul Turán (编). Number Theory and Analysis. New York: Plenum. 1969: 87–96. .
^ 高德纳, p. 354.
^ 105.0 105.1 Norton GH. On the Asymptotic Analysis of the Euclidean Algorithm. Journal of Symbolic Computation. 1990, 10 : 53–58. doi:10.1016/S0747-7171(08)80036-3 .
^ 高德纳, p. 355.
^ 高德纳, p. 356.
^ 高德纳, pp. 257–261.
^ 高德纳, p. 352.
^ Wagon S. Mathematica in Action. New York: Springer-Verlag. 1999: 335–336. ISBN 0-387-98252-3 .
^ Cohen, p. 14.
^ Cohen, pp. 14–15, 17–18.
^ 高德纳, pp. 321–323.
^ Stein J. Computational problems associated with Racah algebra. Journal of Computational Physics. 1967, 1 : 397–405. doi:10.1016/0021-9991(67)90047-2 .
^ 115.0 115.1 Crandall R, Pomerance C. Prime Numbers: A Computational Perspective 1st. New York: Springer-Verlag. 2001: 77 –79, 81–85, 425–431. ISBN 0-387-94777-9 .
^ 高德纳, p. 328.
^ Lehmer DH. Euclid's Algorithm for Large Numbers . The American Mathematical Monthly. 1938, 45 : 227–233. doi:10.2307/2302607 .
^ Sorenson J. Two fast GCD algorithms. J. Algorithms. 1994, 16 : 110–144. doi:10.1006/jagm.1994.1006 .
^ Weber K. The accelerated GCD algorithm. ACM Trans. Math. Soft. 1995, 21 : 111–122. doi:10.1145/200979.201042 .
^ Aho A, Hopcroft J, Ullman J. The Design and Analysis of Computer Algorithms. New York: Addison–Wesley. 1974: 300–310.
^ Schönhage A. Schnelle Berechnung von Kettenbruchentwicklungen. Acta Informatica. 1971, 1 : 139–144. doi:10.1007/BF00289520 .
^ Cesari G. Parallel implementation of Schönhage's integer GCD algorithm. G. Buhler (编). Algorithmic Number Theory: Proc. ANTS-III, Portland, OR . New York: Springer-Verlag. 1998: 64 –76. Volume 1423 in Lecture notes in Computer Science .
^ Stehlé D, Zimmermann P. Gal’s accurate tables method revisited. Proceedings of the 17th IEEE Symposium on Computer Arithmetic (ARITH-17). Los Alamitos, CA: IEEE Computer Society Press . 2005.
^ Möller N. On Schönhage's algorithm and subquadratic integer gcd computation . Mathematics of Computation. 2008, 77 : 589–607. doi:10.1090/S0025-5718-07-02017-0 .
^ Boyer CB, Merzbach UC. A History of Mathematics 2nd. New York: Wiley. 1991: 116–117. ISBN 0-471-54397-7 .
^ Cajori F . A History of Mathematics . New York: Macmillan. 1894: 70 .
^ 127.0 127.1 塞尔日·兰 . Algebra 2nd. Menlo Park, CA: Addison–Wesley. 1984: 190 –194. ISBN 0-201-05487-6 .
^ Cox, pp. 37–46.
^ Schroeder, pp. 254–259.
^ 130.0 130.1 130.2 Stillwell J . Elements of Number Theory. New York: Springer-Verlag. 2003: 101–116. ISBN 0-387-95587-9 .
^ Stark, p. 290.
^ Cohn, pp. 104–105.
^ Lamé G. Mémoire sur la résolution, en nombres complexes, de l'équation An + Bn + Cn = 0. J. Math. Pures Appl. 1847, 12 : 172–184.
^ 134.0 134.1 Clark DA. A quadratic field which is Euclidean but not norm-Euclidean . Manuscripta mathematica. 1994, 83 : 327–330. doi:10.1007/BF02567617 .
^ Weinberger P. Proc. Sympos. Pure Math.: 321–332.
^ Stillwell J . Elements of Number Theory. New York: Springer-Verlag. 2003: 151–152. ISBN 0-387-95587-9 .
^ Yamada Y. Generalized rational blow-down, torus knots, and Euclidean algorithm . arXiv:0708.2316v1. 2007.
^ John Horton Conway . An enumeration of knots and links, and some of their algebraic properties. Computational Problems in Abstract Algebra (Proc. Conf., Oxford, 1967). Pergamon. 1970: 329–358.
^ Jategaonkar AV. Rings with transfinite left division algorithm . Bull. Amer. Math. Soc. 1969, 75 : 559–561. doi:10.1090/S0002-9904-1969-12242-1 .
^ Cox, p. 65.
^ Cox, pp. 73–79.
^ Cox, pp. 79–86.
^ Cox, p. 74.
来源
书籍
(英文) Cohen H . A Course in Computational Algebraic Number Theory . New York: Springer-Verlag. 1993 [2022-07-25 ] . ISBN 0-387-55640-0 . (原始内容 存档于2019-05-03).
(英文) Cohn H. Advanced Number Theory . New York: Dover. 1962 [2022-07-25 ] . ISBN 0-486-64023-X . (原始内容 存档于2019-05-02).
(英文) Cormen TH , Leiserson CE , Rivest RL , and Stein C . Introduction to Algorithms 2nd. MIT Press and McGraw–Hill. 2001 [2022-07-25 ] . ISBN 0262032937 . (原始内容 存档于2021-04-14).
(英文) Cox D, Little J, and O'Shea D. Ideals, Varieties, and Algorithms: An Introduction to Computational Algebraic Geometry and Commutative Algebra 2nd. Springer-Verlag. 1997 [2022-07-25 ] . ISBN 0-387-94680-2 . (原始内容 存档于2019-05-02).
(英文) 狄利克雷 . Richard Dedekind , 编. Vorlesungen über Zahlentheorie . Braunschweig: Vieweg. 1894.
(英文) 戈弗雷·哈罗德·哈代 , Wright EM [revised by D.R. Heath-Brown and J.H. Silverman]. An Introduction to the Theory of Numbers 6th. Oxford: Clarendon Press. 2008 [2022-07-25 ] . ISBN 0199219869 . (原始内容 存档于2021-04-15).
(英文) 高德纳 . The Art of Computer Programming(计算机程序设计艺术 ), Volume 2: Seminumerical Algorithms 3rd. Addison–Wesley. 1997. ISBN 0201896842 .
(英文) LeVeque WJ . Fundamentals of Number Theory. New York: Dover. 1977. ISBN 0-486-68906-9 .
(英文) Mollin RA. Fundamental Number Theory with Applications 2nd. Boca Raton: Chapman & Hall/CRC. 2008. ISBN 9781420066593 .
(英文) Ore Ø . Number Theory and Its History . New York: McGraw–Hill. 1948. ISBN 0486656209 .
(英文) Rosen KH. Elementary Number Theory and its Applications 4th. Reading, MA: Addison–Wesley. 2000. ISBN 0201870738 .
(英文) Schroeder MR . Number Theory in Science and Communication 4th. Springer-Verlag. 2005. ISBN 0387158006 .
(英文) Stark H . An Introduction to Number Theory . MIT Press. 1978. ISBN 0-262-69060-8 .
(英文) Stillwell J . Numbers and Geometry. New York: Springer-Verlag. 1997. ISBN 0-387-98289-2 .
(英文) Tattersall JJ. Elementary number theory in nine chapters . Cambridge: Cambridge University Press . 2005. ISBN 9780521850148 .
(英文) Uspensky JV; Heaslet MA. Elementary Number Theory. New York: McGraw–Hill. 1939. ISBN 0070667500 .
外部链接