专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > C++

如何判断一个二元一次方程有正整数解

发布时间:2011-06-28 13:54:47 文章来源:www.iduyao.cn 采编人员:星星草
怎么判断一个二元一次方程有正整数解?
例如: aX + bY = c( a, b, c 都大于零 )
怎么判断该方程是否有正整数解?(注意是正整数解)

------解决方案--------------------
拓展欧几里德, c % gcd(a,b) == 0, 必定有整数解(这里的整数可能是负数)
算法我简单说一下, 具体的可以自己百度 or google

对于
ax + by = gcd(a, b), 由于 gcd(a,b) = gcd(b, a % b) = ...
所以 ax1 + by1 = gcd(a,b) = bx2 + a % b y2 = .... = 1xn + 0yn = gcd(a,b)
至此可以求出xn, 然后反推回去, 就可以得到x1 和 y1 (程序一般直接用递归执行)
于是得到ax1 + by1 = gcd(a,b),那如何得到 ax + by = c的解呢
ax1 + by1 = gcd(a,b) -> a(x1 * c/gcd(a,b)) + b(y1 * c/gcd(a,b)) = c
于是可以求出, 一组 x = x1 * c/gcd(a,b), y = y1 * c/gcd(a,b)
然后你要判断整数解的话, 也是简单, 如果(x,y)是一组解, (x + b/gcd(a,b), y - a/gcd(a,b))也是一组解
(x - b/gcd(a,b), y + a / gcd(a,b))也是一组解
我们可以先求出x是正整数的一组解, 用取模既可
x = (x % b/gcd(a,b) + b/gcd(a,b)) % b/gcd(a,b) //这里保证x >= 0 
y = (c - ax) / b, 这样的x已经是最接近0的数,于是不能在减少了
所以
如果y < 0, 那么无正整数解
如果y > 0有正整数解.
------解决方案--------------------
这更像一个数学问题
楼主给出的问题没有假定a,b,c是整数
a,b,c是实数的话gcd就不行了

由 ax + by = c
=>      ax = c - by
=>       x = (c/a) - (b/a)y

得到这个方程

用 u ,v 替换 (c/a) ,(b/a) 得:
         x = u - vy
假设 u,v 写成 “整数i.小数f”的形式
   u = ui + uf (ui∈Z*,uf∈[0,1)))
   v = vi + vf (vi∈Z*,vf∈[0,1)))

问题要求 x,y∈Z*
要方程成立
令 t = vf * y
   t = ti + tf
显然有:
      tf 等于 uf 的整数倍
   或 uf 等于 tf 的整数倍

即    tf/uf ∈ Z*
   或 uf/tf ∈ Z*

因此,判断u,v的尾数即可
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: