【问题标题】: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);但是,我无法弄清楚确切的过程。

【问题讨论】:

    标签: haskell euclidean-algorithm


    【解决方案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”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-26
    相关资源
    最近更新 更多