求线性方程的解集
Finding solution set of a Linear equation?
本文关键字:线性方程 更新时间:2023-10-16
我需要找到这个方程的所有可能的解:
x+2y = N
, x<100000
和y<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]
之间的数字,因为x
和2y
都必须不大于10
。