同时求出 x,y ,使 gcd ( a, b ) = x * a + y * b
扩展欧几里得算法几个月前就听过,但一直没仔细看过,感觉有点高深似的。
一看发现和我们高代多项式一章学的一个公式很像,不过把多项式变成了数,按理说还应该更简单。
有的是有返回值的,返回了最大公约数,不过这问题不大。
这个函数不大好理解,开始我打算用几个数试试,结果根本理不出头绪,结果上网找一找讲解,有点明白了。
首先要知道 gcd(a, b) = gcd(b, a%b),其实求最大公约数就是用的这个公式。
这样,gcd(b, a%b) = x' b + y' a%b。其中 x' 和 y' 是本次求出的,和原来的x和y没关系。
继续 = x' b + y' (a - a/b*b) = x' b + y' a - y' a/b*b = y' a + (x' - a/b*y') b。
其中‘/’为“地板除”。这样 gcd(a, b) = y' a + (x' - a/b*y') b。也就是说,如果我们求出了gcd(b, a%b) = x' b + y' a%b,就可以解出 gcd(a, b) = xa + yb,这样一直下去,我们知道到最后 gcd(b, a%b)会变成 gcd(c, 0)的形式,这时可以解出此时的x'=1 和 y' = 0,这样就可以再往上一层一层求了。
发现具体用时还是有返回值比较好,另外,有个更简洁的写法:
这样再看是不是明白点了。我想我是明白了,感觉数学不好就是吃亏。
当然用的时候就不用现推了,当然也很好推,直接记下来就可以了。
通过写这个总结我发现写总结是很有用的,写之前我还不太明白,写完就基本差不多了。