理解扩展欧几里得算法的实现
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)
中有一个著名的计算s
和t
的方法。在寻找 gcd 的过程中,我得到了几个方程。
通过反转欧几里得算法中的步骤,可以找到这些整数a
和b
。这些结果方程看起来像表达式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
这解释了为什么 s
和 t - q*s
是返回的好选择。
【讨论】:
非常感谢您的回答。你能解释一下这条线吗? "由于递归调用,我们有:tb + sr = g" @F.Zer 这正是您在问题中所说的属性...“在as + bt = gcd(a, b)
中计算s
和t
”以上是关于理解扩展欧几里得算法的实现的主要内容,如果未能解决你的问题,请参考以下文章
用C语言编制的求模逆元的扩展欧几里德算法,只要能基本上实现这个功能就行