解二元一次不定方程的算法

写下来,怕忘记。

假设二元一次方程的形式是 ax + by = c

先来简单的。假设a,b,c都是大于等于0的。假设d = gcd(a,b),那么c肯定可以表示为 c = nd,这个告诉我们,只要我们可以解出 ax + by = d 这个方程,然后两边乘以n,就可以得到 a(nx)+b(ny)=(nd) = c了。

注意到,ax + by = d 可以用扩展欧几里得算法搞定。所以,问题就搞定了。

然后看一下,如果允许a,b,c为负数的时候应该怎么做。
先把c弄成非负数,如果是c是负数,就把方程两边乘以-1吧。
然后,设A = abs(a), B = abs(b)
再定义个符号函数 s(x) = 1 if x >=0 else (-1)
那么,ax + by = c可以化为
A*s(a)*x + B*s(b)*y = c
也就是
A * ( s(a) * x ) + B ( s(b) * y ) = c
这个时候,A,B和c都是非负数,问题解决了!

你可能感兴趣的:(解二元一次不定方程的算法)