求线性方程的解集

Finding solution set of a Linear equation?

本文关键字:线性方程      更新时间:2023-10-16

我需要找到这个方程的所有可能的解:

x+2y = N, x<100000y<100000

给定N=10,设。

我在python:

中这样做
for x in range(1,100000):
    for y in range(1,100000):
        if x + 2*y == 10:
             print x, y

我应该如何优化这个速度?我该怎么办?

本质上这是一个语言不可知论问题。 C/c++ 回答也会有所帮助。

如果x+2y = N,则y = (N-x)/2(假设N-x是偶数)。你不需要遍历range(1,100000)

像这样

(对于给定的N)

if (N % 2): x0 = 1
else: x0 = 0
for x in range(x0, min(x,100000), 2):
    print x, (N-x)/2

编辑:你必须注意N-x不会变成负的。这就是min应该做的

Leftris的答案实际上比我的好,因为这些特殊情况被以一种优雅的方式处理了

我们可以遍历y的定义域并计算x。同样考虑到x也有一个有限的范围,我们进一步将y的定义域限制为[1,N/2](因为y大于N/2的任何值都将为x提供负值)

x=N;
for y in range(1,N/2-1):
     x = x-2
     print x, y
  • 这只是循环N/2次(而不是50000次)
  • 它甚至不做那些昂贵的乘法和除法

运行时间为二次元。您可以通过将等式重新排列为形式y = ...将其减少为线性时间。这允许您只遍历x,计算y,并检查它是否是整数。

Lefteris E的回答是正确的,

但我确实觉得y应该在[1,N/2]而不是[1,2*N]的范围内

解释:

x+2*y = N
//replace x with N-2*y
N-2*(y) + 2*y = N
N-2*(N/2) + 2*y = N
2*y = N
//therefore, when x=0, y is maximum, and y = N/2
y = N/2

现在你可以输入:

for y in range(1,int(N/2)):
   x = N - (y<<1)
   print x, y

在给定N =10的情况下,您可以尝试只检查x的偶数;原因是:2y必须是偶数,因此x必须是偶数。这将使总运行时间减少到检查所有x的一半。

如果还要求答案为自然数,则排除负数。然后,您只需检查x[0,10]之间的数字,因为x2y都必须不大于10