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

写下来,怕忘记。

假设二元一次方程的形式是 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都是非负数,问题解决了!

转载于:https://my.oschina.net/mustang/blog/57358

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值