理解扩展欧几里得算法的实现

Posted

技术标签:

【中文标题】理解扩展欧几里得算法的实现【英文标题】:Understanding implementation of Extended Euclidean algorithm 【发布时间】:2021-12-13 16:51:10 【问题描述】:

经过一些实验和搜索,我想出了以下定义:

emcd' :: Integer -> Integer -> (Integer,Integer,Integer)
emcd' a 0 = (a, 1, 0)
emcd' a b = 
  let (g, t, s) = emcd' b r
  in (g, s, t - (q * s))
    where
      (q, r) = divMod a b
t - (q * s) 这个表达式背后的含义是什么?

我尝试过手动评估它;即使我得到了正确的结果(1, -4, 15),我也看不出为什么该表达式会返回t 的值。

as + bt = gcd(a, b)中有一个著名的计算st的方法。在寻找 gcd 的过程中,我得到了几个方程。

通过反转欧几里得算法中的步骤,可以找到这些整数ab。这些结果方程看起来像表达式t - (q * s);但是,我无法弄清楚确切的过程。

【问题讨论】:

【参考方案1】:

由于(q, r) = divMod a b,我们有等式

a = qb + r

由于递归调用,我们有:

tb + sr = g

a-qb 代替第二个等式中的r,这意味着

tb + s(a-qb) = g
tb + sa - qsb = g
sa + (t-qs)b = g

这解释了为什么 st - q*s 是返回的好选择。

【讨论】:

非常感谢您的回答。你能解释一下这条线吗? "由于递归调用,我们有:tb + sr = g" @F.Zer 这正是您在问题中所说的属性...“在as + bt = gcd(a, b) 中计算st

以上是关于理解扩展欧几里得算法的实现的主要内容,如果未能解决你的问题,请参考以下文章

扩展欧几里得算法的模板实现

数论 逆元求解(扩展欧几里得算法+费马小定理)

用C语言编制的求模逆元的扩展欧几里德算法,只要能基本上实现这个功能就行

在 Java 中使用扩展欧几里得算法实现 modInverse

欧几里得算法和扩展欧几里得算法

c++中扩展欧几里得算法的递归到底发生了啥?