Java 单变量二元简单方程解集的计算算法

Java 单变量二元简单方程解集的计算算法,java,algorithm,math,Java,Algorithm,Math,假设我有一个简单的公式: 7x + 4y = n 其中n由我们选择,x、y和n都是正整数。这是给我们的唯一方程式。在可能的解中,我们需要解(x,y),其中x是最小的。e、 g 7x + 4y = 14, then (2, 0) is the solution 7x + 4y = 15, then (1, 2) is the solution 7x + 4y = 32, then (4, 1) and (0, 8) are the possible solutions, of which (0,

假设我有一个简单的公式:

7x + 4y = n
其中n由我们选择,x、y和n都是正整数。这是给我们的唯一方程式。在可能的解中,我们需要解(x,y),其中x是最小的。e、 g

7x + 4y = 14, then (2, 0) is the solution
7x + 4y = 15, then (1, 2) is the solution
7x + 4y = 32, then (4, 1) and (0, 8) are the possible solutions,
of which (0, 8) is the correct solution
我想设计一个算法,以计算它在尽可能少的运行时间。我想到的当前算法是这样的:

Given an input n
Calculate max(x) = n/7
for i = 0 to max(x)
    If the equation 7*i + 4*y = n holds
        return value of i and y
    else
        continue
我猜想,在最坏的情况下,这个算法的运行时间可达O(n)。有更好的算法来计算解吗?

我们有

7(x-4)+4(y+7)=7x+4y
如果(x,y)是一个解,那么(x-4,y+7)也是一个解。因此,如果存在溶液,则存在一个xO(n)的溶液:


我建议你看看书中的单纯形法。您可以轻松地将C代码视为伪代码,并生成java版本。您想要的单纯形的版本是“受限单纯形”,它只处理正值。这本书很有趣。从第10.8节开始,向前读。

让我们考虑更一般的问题

  • 对于两个互质正整数
    a
    b
    ,给定一个正整数
    n
    ,找到非负整数对
    (x,y)
    ,使
    a*x+b*y=n
    最小
    x
    。(如果有,则不必有,例如
    7*x+4*y=5
    没有非负
    x
    y
    的解决方案)
暂时不考虑非负性,给出任何解

a*x0 + b*y0 = n
对于某些整数
k
,所有解的形式都是
(x0-k*b,y0+k*a)
。因此,
x
b
y
a
的剩余部分是解的不变量,我们有

a*x ≡ n (mod b), and b*y ≡ n (mod a)
所以我们需要解方程
a*x≡ n(mod b)
-另一个在后面

0
为带
a*c的整数≡ 1(模块b)
。例如,您可以通过扩展的欧几里德算法,或者(等效地)以O(logb)步数对
a/b
进行连分数展开来找到它。这两种算法自然会产生具有该属性的唯一
c

那么
x
的最小候选值是
n*c
b
的余数
x0


这个问题有一个非负的
x
y
的解,当且仅当
x0*a你说
如果方程7*i+4*y=n保持
i你从循环中得到,那么y是什么?x和y上有上界吗?如果是这样的话,二进制搜索是你成功的途径。你可能想了解一下。您的问题确实是广义问题的一个具体实例,但我很好奇您所面临的简化问题是否有一个有效的解决方案。这要求解决以下问题:-(@Betlista我应该你想进一步评论,我认为这个方程可以改变。这里有一个例子。如果方程的形式是ax+by=n,那么如果有一个解,那么就有一个xa*x ≡ n (mod b), and b*y ≡ n (mod a)