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)