try ai
科普
编辑
分享
反馈
  • 欧几里得算法

欧几里得算法

SciencePedia玻尔百科
核心要点
  • 欧几里得算法通过递归地使用 gcd⁡(a,b)=gcd⁡(b,a(modb))\gcd(a, b) = \gcd(b, a \pmod b)gcd(a,b)=gcd(b,a(modb)) 原理,高效地找到两个数的最大公约数(GCD)。
  • 扩展欧几里得算法反向工作,将最大公约数表示为原始数的线性组合,这一基本结果被称为贝祖恒等式。
  • 该算法对现代密码学至关重要,特别是通过寻找模乘法逆元来生成 RSA 密码系统中的密钥对。
  • 该算法的结构不限于整数;它适用于任何“欧几里得整环”,例如多项式,从而使其能够在控制理论和抽象代数中得到应用。

引言

欧几里得算法是人类已知的最古老、最优雅的算法之一,它是数论的基石,在我们的现代数字时代具有惊人的现实意义。虽然它通常被介绍为一种寻找最大公约数的简单方法,但其真正的力量在于它所揭示的深刻数学结构以及它能解决的广泛问题。本文将层层剖析这一古老的过程,以揭示其隐藏的天才之处。我们将从探索其基本原理和机制开始,从一个简单的几何谜题入手,逐步深入其递归核心、有保证的效率以及贝祖恒等式这一宝藏。随后,我们将穿越其多样化的应用和跨学科的联系,发现这一个算法如何对从保障互联网通信安全、设计稳定控制系统到理解抽象代数的基本结构等方方面面都至关重要。

原理和机制

那么,我们拥有了这个奇妙的工具,一个既古老又强大,构成了现代密码学和数论基石的程序。但它到底是什么?它是如何施展魔法的?要理解欧几里得算法,我们不打算从尘封的方程式开始。相反,让我们从一个优美而具体的问题开始。

公度量的几何学

想象一下,你是一位建筑史学家,正在修复一处宏伟的罗马马赛克地板。你面前有一块长 391 厘米、宽 255 厘米的矩形区域需要重新铺设。为了保证真实性,你必须使用完全相同的正方形瓷砖来完整覆盖该区域,不能有任何切割或缝隙。为了让地板看起来尽可能无缝,你希望使用尽可能大的瓷砖。那么,瓷砖的尺寸应该是多少?

想想这意味着什么。如果边长为 sss 的正方形瓷砖要完美覆盖这个矩形,那么 sss 必须同时整除长度 391 和宽度 255。它必须是一个​​公约数​​。而因为我们想要最大的这种瓷砖,我们寻找的正是 391 和 255 的​​最大公约数​​(​​GCD​​)。

这个几何图像为我们揭示了 GCD 真实而古典的含义。它是两条长度的最大“公度量”。Euclid 本人当年可能就是这样思考的。但是,你如何找到这个神奇的数字 sss 呢?反复试错会让人发疯。我们需要一个系统,一个*算法*。

问题的递归核心

让我们继续讨论这个尺寸为 a×ba \times ba×b 的矩形。对于我们的马赛克问题,尺寸是 391×255391 \times 255391×255。我们假设 a>ba > ba>b。我们当然可以在矩形内至少铺设一个 b×bb \times bb×b 的大正方形。在我们的例子中,我们可以在 391×255391 \times 255391×255 的矩形内放置一个 255×255255 \times 255255×255 的正方形瓷砖区域。

剩下的是什么?一个小一点的矩形。它的尺寸是 (391−255)×255(391 - 255) \times 255(391−255)×255,也就是 136×255136 \times 255136×255。

现在,关键的、惊人简单的洞见来了。任何能够完美覆盖原始大矩形的正方形瓷砖,也必须能完美覆盖这个较小的剩余矩形。为什么?一块能覆盖 391×255391 \times 255391×255 区域的瓷砖是 391 和 255 的公度量。既然它能度量 255,它就能铺满我们刚才在概念上铺设的那个 255×255255 \times 255255×255 的大正方形。又因为它既能度量 391 又能度量 255,所以它也必须能度量它们的差,即 391−255=136391 - 255 = 136391−255=136。因此,任何适用于原始问题的瓷砖,也必须适用于铺设一个 255×136255 \times 136255×136 矩形这个新的、更小的问题!

我们将原始问题归约为了一个相同但规模更小的问题。这就是该算法的核心。我们刚刚发现了这个基本恒等式:

gcd⁡(a,b)=gcd⁡(b,a−b)\gcd(a, b) = \gcd(b, a - b)gcd(a,b)=gcd(b,a−b)

更一般地,如果我们铺设 qqq 个边长为 bbb 的正方形,剩余矩形的边长将是 a−qba - qba−qb,这正是 aaa 除以 bbb 的余数,即 a(modb)a \pmod ba(modb)。所以,核心原理是:

gcd⁡(a,b)=gcd⁡(b,a(modb))\gcd(a, b) = \gcd(b, a \pmod b)gcd(a,b)=gcd(b,a(modb))

这是欧几里得算法引擎的中心齿轮。在每一步,我们都用一对新的数 (b,r)(b, r)(b,r) 替换掉我们原来的数对 (a,b)(a, b)(a,b),其中 rrr 是余数。我们把一个对静态数字的搜索,变成了一个动态的、级联的过程。

对于我们的马赛克问题,问题序列变成:

  1. 求 gcd⁡(391,255)\gcd(391, 255)gcd(391,255)。这等同于……
  2. 求 gcd⁡(255,136)\gcd(255, 136)gcd(255,136)。这等同于……
  3. 求 gcd⁡(136,119)\gcd(136, 119)gcd(136,119)。这等同于……
  4. 求 gcd⁡(119,17)\gcd(119, 17)gcd(119,17)。

现在,119119119 恰好是 7×177 \times 177×17。余数是 0。所以下一步将是 gcd⁡(17,0)\gcd(17, 0)gcd(17,0)。能同时整除 17 和 0 的最大数是多少?任何数都能整除 0,所以我们只需要找到能整除 17 的最大数。那就是 17 本身。因此,我们瓷砖的边长必须是 17 厘米。

一段保证会结束的旅程

这个生成越来越小的矩形的过程很优雅,但我们能确定它不会永远进行下去吗?是的,能确定。原因在于数学中最基本的原则之一:​​良序原则​​。

该原则指出,任何非负整数集合都必然有一个最小元素。考虑我们在算法中生成的余数序列:r1,r2,r3,…r_1, r_2, r_3, \dotsr1​,r2​,r3​,…。对于我们的数字 a=874a=874a=874 和 b=322b=322b=322,余数序列是:

r1=874(mod322)=230r_1 = 874 \pmod{322} = 230r1​=874(mod322)=230
r2=322(mod230)=92r_2 = 322 \pmod{230} = 92r2​=322(mod230)=92
r3=230(mod92)=46r_3 = 230 \pmod{92} = 46r3​=230(mod92)=46
r4=92(mod46)=0r_4 = 92 \pmod{46} = 0r4​=92(mod46)=0

根据余数的定义,每个新的余数都严格小于前一个,并且它们都大于或等于零。你不可能永远不断地找到更小的正整数!你正走在一个只向下的楼梯上,而且有一个底层(零)。你绝对保证会到达它。该算法必须终止。

在到达零之前的最后一个余数就是最终答案。在上面的例子中,它是 46。这最后一个非零余数是整个生成的余数序列中最小的正数,也是最大公约数。

揭开隐藏的宝藏:贝祖恒等式

算法给了我们 GCD。但它一直隐藏着一个更大的宝藏。如果你反向追溯算法的步骤,你就能揭示原始数字与其 GCD 之间的一个深刻关系。这个关系被称为​​贝祖恒等式​​。它表明,对于任意两个整数 aaa 和 bbb,它们的 GCD 总可以写成它们的一个“线性组合”。也就是说,你总能找到一些整数 xxx 和 yyy(可以是正数、负数或零),使得:

ax+by=gcd⁡(a,b)ax + by = \gcd(a, b)ax+by=gcd(a,b)

这似乎相当抽象。但找到这些数字 xxx 和 yyy 就像找到一个秘密配方。我们该怎么做呢?我们只需逆向运行欧几里得算法的步骤。让我们来求 408 和 170 的 GCD。

  1. 408=2⋅170+68408 = 2 \cdot 170 + 68408=2⋅170+68
  2. 170=2⋅68+34170 = 2 \cdot 68 + 34170=2⋅68+34
  3. 68=2⋅34+068 = 2 \cdot 34 + 068=2⋅34+0

GCD 是 34。现在,我们向后推。我们从倒数第二个方程开始,解出我们的 GCD,即 34:

34=170−2⋅6834 = 170 - 2 \cdot 6834=170−2⋅68

这将 34 表示为 170 和 68 的组合。但我们希望它用 408 和 170 来表示。所以,我们看它上面的方程(步骤1),解出前一个余数 68:

68=408−2⋅17068 = 408 - 2 \cdot 17068=408−2⋅170

现在,将这个关于 68 的表达式代入我们关于 34 的方程中:

34=170−2⋅(408−2⋅170)34 = 170 - 2 \cdot (408 - 2 \cdot 170)34=170−2⋅(408−2⋅170)

现在只需做一些代数运算。注意不要把任何东西乘开,只需合并 408 和 170 的项:

34=170−2⋅408+4⋅17034 = 170 - 2 \cdot 408 + 4 \cdot 17034=170−2⋅408+4⋅170
34=(1+4)⋅170+(−2)⋅40834 = (1 + 4) \cdot 170 + (-2) \cdot 40834=(1+4)⋅170+(−2)⋅408

于是我们得到了:

5⋅170+(−2)⋅408=345 \cdot 170 + (-2) \cdot 408 = 345⋅170+(−2)⋅408=34

我们找到了我们的配方!在这个例子中,x=−2x=-2x=−2 且 y=5y=5y=5。这个过程,被称为​​扩展欧几里得算法​​,不仅仅是一个派对戏法。它是求解线性丢番图方程的关键,也是计算模逆元的基本步骤,而模逆元是现代公钥密码学的支柱。而且这个思想不限于两个数;它可以迭代地应用于求任意一组数的 GCD,并将其表示为这些数的线性组合。

算法的节奏:快有多快?

所以,这个算法是正确的,它总能停止,并且能给我们额外的信息。但它快吗?对于我们的马赛克瓷砖,它只用了几步。但对于巨大的数字,比如有几百位数的数字,情况又如何呢?

这个问题在19世纪由 Gabriel Lamé 回答了。他发现了欧几里得算法与​​斐波那契数列​​(1,1,2,3,5,8,…1, 1, 2, 3, 5, 8, \dots1,1,2,3,5,8,…,其中每个数是前两个数的和)之间一个惊人而优美的联系。

拉梅定理指出,算法所执行的步骤数,在最坏情况下,是较小数的位数的五倍。这是一个极其强大的保证!这意味着其复杂度是​​对数级​​的。将数字的大小加倍并不会使工作量加倍;它只会增加几个步骤。

更重要的是,“最坏情况”——即那些使算法在同等规模下执行最多步骤的输入——是连续的斐波那契数!例如,如果你想找一对数字 (a,b)(a, b)(a,b),使得算法恰好需要12步,那么最小的这样一对数是 (377,233)(377, 233)(377,233),它们是第14和第13个斐波那契数,F14F_{14}F14​ 和 F13F_{13}F13​。这是因为在除法步骤中所有的商都是1,这使得数字缩小的速度尽可能慢。这种联系揭示了算法运行中隐藏的、优雅的节奏。在计算机科学领域,效率至上,欧几里得算法是一位冠军,是速度与优雅的典范。

普适的交响曲:超越整数

这里,我们退后一步,审视全局。这个算法仅仅是针对整数的一个聪明技巧吗?还是它体现了一个更深层、更普适的原理?

答案是,它是一首普适的交响曲。该算法在任何我们拥有“带余除法”概念,并且可以用一种方式度量“大小”使得余数总是比除数“小”的数学世界中都有效。这样的世界被称为​​欧几里得整环​​。

考虑系数来自有限域(如模5的整数,记作 Z5[x]\mathbb{Z}_5[x]Z5​[x])的多项式环。在这里,“数”是像 f(x)=x4+3x3+2x2+4x+1f(x) = x^4 + 3x^3 + 2x^2 + 4x + 1f(x)=x4+3x3+2x2+4x+1 这样的多项式。我们可以对它们进行加、减、乘运算。我们也可以执行带余除法,其中多项式的“大小”是它的次数。奇迹般地,欧几里得算法在这里完全适用!我们可以找到两个多项式的“最大公约数”,甚至可以使用扩展版本来找到多项式的贝祖恒等式:

s(x)f(x)+t(x)g(x)=gcd⁡(f(x),g(x))s(x)f(x) + t(x)g(x) = \gcd(f(x), g(x))s(x)f(x)+t(x)g(x)=gcd(f(x),g(x))

这表明,算法的结构并非关乎整数本身,而是关乎除法这一基本结构。

这引出了最后一个深刻的思考。存在一个可以写成线性组合的 GCD(贝祖恒等式)是所有​​主理想整环(PID)​​的属性,这是一个比欧几里得整环更广泛的数学系统类别。存在一些奇怪的世界,它们是 PID 但不是欧几里得整环——在这些世界里,贝祖恒等式成立,但没有欧几里得算法来找到那些系数。这告诉我们一些深刻的事情:算法是一种构造,一条通往结果的美丽而高效的路径。但结果的存在性是底层数学结构一个更基本的真理,一个即使在我们最喜欢的通往它的路径消失时依然存在的真理。因此,欧几里得算法是我们宏伟的向导,但它所探索的数学真理的景观,远比它本身更为广阔和神秘。

应用与跨学科联系

我们已经花时间拆解了欧几里得算法这台精美的时计,检查了它的齿轮和弹簧。我们已经看到它简单重复的步骤如何准确无误地找到两个数的最大公约数。但要真正欣赏一台机器,我们必须看到它实际运作。这个古老的算法到底能做什么?

你可能会认为它的用途仅限于简化分数,这是小学数学中的一项烦人任务。但这就像认为一把万能钥匙只能打开一扇门。事实上,欧几里得算法是一把钥匙,它在众多学科中解锁了深刻的思想和强大的技术。重要的不仅仅是它产生的结果(GCD),而是整个过程以及它揭示的关于数和结构的更深层次的真理。让我们踏上一段旅程,看看这把钥匙能用在何处。

可能性的艺术:从秘密代码到系统设计

该算法最直接的推论,是通过逆向运行它来解锁的,即它能够求解形如 ax+by=cax + by = cax+by=c 的方程。这不仅仅是一个代数上的好奇心;它回答了一个非常根本的问题:“给定两种类型的基本构件,我们能构造出什么?”

例如,想象一个专门的通信协议,它只发送两种固定大小的数据包,比如 114114114 KB 和 258258258 KB。你可以发送或接收任意数量的这些数据包。那么,哪些净数据传输量是可能实现的?你能否实现恰好 121212 KB 的净传输?444444 KB 呢?这不是一个谜题,而是对一个丢番图方程的重述。扩展欧几里得算法告诉我们,唯一可以实现的总量是 gcd⁡(114,258)\gcd(114, 258)gcd(114,258) 的整数倍,而这个值恰好是 666。因此,121212 KB 的传输是可能的,但 444444 KB 的传输则从根本上不可能,无论你发送或接收多少数据包。这个原则无处不在,从平衡化学方程式到用固定面额的硬币计算可能的货币交易。算法在可能与不可能之间划下了一条清晰的界线。

当我们转向“时钟算术”,即模算术时,这种解方程的能力变得改变世界。在现代密码学中,我们常常需要找到一个数的“乘法逆元”。这是一种能够“撤销”乘法操作的数。在著名的 RSA 公钥密码系统中,你的公钥包含一个用于加密的数字 eee。要解密消息,你需要一个私钥 ddd。它们之间的关系很简单:ed≡1(modϕ(n))ed \equiv 1 \pmod{\phi(n)}ed≡1(modϕ(n)),其中 ϕ(n)\phi(n)ϕ(n) 是一个从系统秘密素数派生出的值。找到 ddd 就等同于求解方程 ed+kϕ(n)=1ed + k\phi(n) = 1ed+kϕ(n)=1(对于某个整数 k)。这正是扩展欧几里得算法的用武之地!没有它,就没有高效的方法来生成保护无数互联网交易(从电子邮件到金融数据)的私钥。

在一个美妙的命运转折中,欧几里得算法也出现在可能威胁到 RSA 的地方。Shor 算法是一种用于分解大数的革命性量子算法,它以一个纯粹的经典步骤开始:它会随机选择一个数 aaa 并计算 gcd⁡(a,N)\gcd(a, N)gcd(a,N),其中 NNN 是要分解的数。如果这个 GCD 大于 1,就立即找到了一个因子,甚至都不需要动用量子计算机!。即使在量子时代,这个古老的算法也依然是第一道防线。

算法的隐藏乐章:从分数到斐波那契

让我们更仔细地观察算法的执行过程。当它嗡嗡作响,进行除法和求余时,它会产生一系列整数商。我们通常将这些商视为无用的脚手架而丢弃。但如果它们才是真正的宝藏呢?

事实证明,这个商的序列,比如 (c1,c2,…,cn)(c_1, c_2, \dots, c_n)(c1​,c2​,…,cn​),正是原始比率 a/ba/ba/b 的*简单连分数*展开式的系数集。这并非巧合。欧几里得算法连续切分出最大可能整数倍的过程,正是连分数的定义本身。这在离散的整数和整除世界与连续的实数逼近世界之间提供了一个深刻的联系。由我们的算法生成的连分数,提供了无理数的“最佳”有理逼近,这一原理在从设计日历到调校音阶等各种领域都有历史应用。

惊喜不止于此。考虑著名的斐波那契数列:0,1,1,2,3,5,8,…0, 1, 1, 2, 3, 5, 8, \dots0,1,1,2,3,5,8,…,其中每个数是前两个数的和。如果你取两个斐波那契数 FmF_mFm​ 和 FnF_nFn​,并求它们的最大公约数,你会发现一个真正优雅的结果:gcd⁡(Fm,Fn)=Fgcd⁡(m,n)\gcd(F_m, F_n) = F_{\gcd(m,n)}gcd(Fm​,Fn​)=Fgcd(m,n)​。例如,gcd⁡(F96,F60)=Fgcd⁡(96,60)=F12=144\gcd(F_{96}, F_{60}) = F_{\gcd(96, 60)} = F_{12} = 144gcd(F96​,F60​)=Fgcd(96,60)​=F12​=144。为什么这是真的?因为斐波那契数的整除性质使得将欧几里得算法应用于 FmF_mFm​ 和 FnF_nFn​ 会产生一个余数序列,这些余数本身也是斐波那契数,其下标恰好遵循将欧几里得算法应用于 mmm 和 nnn 的步骤!这两个过程完美地相互映照。这种紧密的联系也揭示了连续的斐波那契数是该算法的“最坏情况”输入,对于它们这样大小的数,需要最多的步骤。

一种通用语言:从多项式到其他世界

到目前为止,我们一直生活在熟悉的整数世界里。但欧几里得算法真正的天才之处在于,其底层结构并不依赖于处理的数是整数。它在任何具有一致的“大小”和“带余除法”概念的数学系统,即所谓的“欧几里得整环”中都有效。正是在这里,算法成为一种通用的结构语言。

考虑多项式,那些像 x3−3x2+4x^3 - 3x^2 + 4x3−3x2+4 这样作为代数基石的表达式。我们可以对它们进行加、减、乘,以及至关重要的除法运算。因此,我们可以在它们上面运行欧几里得算法。两个多项式的“最大公约数”是另一个多项式,它捕捉了它们的公共根。一个引人入胜的应用是通过计算 gcd⁡(f(x),f′(x))\gcd(f(x), f'(x))gcd(f(x),f′(x)) 来找到多项式 f(x)f(x)f(x) 的重根,其中 f′(x)f'(x)f′(x) 是它的形式导数。f(x)f(x)f(x) 的任何重根也必然是 f′(x)f'(x)f′(x) 的根,因此会出现在它们的 GCD 中。

这不仅仅是一个学术游戏。在控制理论中,一个物理系统——无人机、化学反应器、电网——的行为通常由一个传递函数来建模,它是两个多项式的分数,即 P(s)=n(s)m(s)P(s) = \frac{n(s)}{m(s)}P(s)=m(s)n(s)​。为了设计一个稳定的控制器以防止无人机坠毁或反应器过热,至关重要的是这两个多项式必须是*互质的(它们的 GCD 只是一个常数)。针对多项式的扩展欧几里得算法是工程师们使用的工具,它不仅可以验证互质性,还能找到满足贝祖恒等式 x(s)m(s)+y(s)n(s)=1x(s)m(s) + y(s)n(s) = 1x(s)m(s)+y(s)n(s)=1 的一对特定多项式 x(s)x(s)x(s) 和 y(s)y(s)y(s)。这个恒等式是 Youla-Kučera 参数化的基石,这是一种强大的技术,它刻画了给定系统的所有可能的稳定控制器*。从古希腊的数字谜题到现代自主系统的稳定性,其逻辑线索一脉相承。

我们可以将这种抽象推得更远。让我们将“数”的概念扩展到高斯整数——形如 a+bia+bia+bi 的复数,其中 aaa 和 bbb 是整数。这在复平面上形成了一个美丽的格点。我们能在这里谈论整除性和“素数”吗?可以。我们能找到,比如说,−8+34i-8+34i−8+34i 和 −4+7i-4+7i−4+7i 的最大公约数吗?当然可以。欧几里得算法,在适配了用范数 N(a+bi)=a2+b2N(a+bi) = a^2+b^2N(a+bi)=a2+b2 来度量大小后,同样完美无瑕地工作。我们甚至可以逆向运行它来找到高斯整数 xxx 和 yyy 以求解贝祖恒等式 xα+yβ=gcd⁡(α,β)x\alpha + y\beta = \gcd(\alpha, \beta)xα+yβ=gcd(α,β)。这表明,该算法的力量并非源于整数本身,而是一种关于结构和除法的深刻代数属性。

最后,该算法的触角延伸到了几何学和群论。考虑两个互质整数 aaa 和 ccc。它们定义了一个列向量 (ac)\begin{pmatrix} a \\ c \end{pmatrix}(ac​)。扩展欧几里得算法找到了另外两个整数 bbb 和 ddd,满足贝祖恒等式 ad−bc=1ad - bc = 1ad−bc=1。当你将这四个数组成一个矩阵 (abcd)\begin{pmatrix} a & b \\ c & d \end{pmatrix}(ac​bd​) 时,你创造了一些特别的东西。这是一个行列式为1的矩阵,是特殊线性群 SL(2,Z)SL(2, \mathbb{Z})SL(2,Z) 的一个元素。这些矩阵代表了基本的几何变换(剪切和反射),它们会重排整数格点但完美保持其面积。该算法为我们提供了一种直接的、构造性的方法,仅用一对互质数就能构建出这些基本的几何算子。

从保障我们的数据安全到稳定我们的机器,从数列的隐藏模式到代数和几何的根本结构,欧几里得算法是一条金线。它的简单性具有欺骗性,因为它是整个数学中最深刻、影响最深远的概念之一——一个永恒的明证,证明了思想世界中隐藏的统一性。