0

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

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.

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

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

4

1 回答 1

2

因为(q, r) = divMod a b,我们有方程

a = qb + r

由于递归调用,我们有:

tb + sr = g

a-qbr第二个等式,这意味着

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

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

于 2021-12-13T17:53:53.367 回答