【问题标题】:How to find 2 integers that 'solves' a linear equation fast?如何找到快速“解决”线性方程的 2 个整数?
【发布时间】:2017-06-28 08:09:39
【问题描述】:

我需要一种方法来找到满足具有两个未知数的方程的整数。约束是两个整数都在 1 到 10000 之间。例如:

value = 21
for x in range(1, 10001):
    for y in range(1, 10001):
        if (3 * x) + (5 * y) == value:
            x_val = x
            y_val = y
        break

在这种情况下,我会得到x_val = 2y_val = 3如果没有整数解或多重解,那么输出应该是0

我想要一个快速方法来解决这个“方程”,而不是重复迭代。这在python中可能吗?谢谢。

【问题讨论】:

  • 什么样的方程式?
  • @Blender 这是一个线性方程。
  • 只有一个方程,如果不迭代就无法求解。
  • 看看 scipy.linalg 包...它有一个求解器
  • Pyomo(或任何其他线性编程工具)会更容易

标签: python iteration equation


【解决方案1】:

很多解决方案,这里是最简单的:

for x in xrange(1, 10001):
    y = float(value - (x * x_val)) / y_val
    if int(y) == y and 10000 >= y >= 1:
        print ("x={}, y={}".format(int(x), int(y)))

例子:

>>> x_val = 2
>>> y_val = 3
>>> value = 21
>>> for x in xrange(1, 10001):
...     y = float(value - (x * x_val)) / y_val
...     if int(y) == y and 10000 >= y >= 1:
...         print ("x={}, y={}".format(int(x), int(y)))
... 
x=3, y=5
x=6, y=3
x=9, y=1

一个优化的机会出现了,因为我们不想要负值......

for x in xrange(1, 10001):
    y = float(value - (x * x_val)) / y_val
    if x * x_val > value:
        break
    if int(y) == y and 10000 >= y >= 1:
        print ("x={}, y={}".format(int(x), int(y)))

【讨论】:

    【解决方案2】:

    这里的关键是要知道方程中只有正输入。通过这种方式,您可以减少需要检查的数字数量。例如,如果值为 3000,您只需要检查 1 到 1000 而不是 1 到 10000。您需要将方程中的变量值除以方程中的最小公分母并将其用作上限,减少迭代方法的负担。

    【讨论】:

      猜你喜欢
      • 2011-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-24
      • 1970-01-01
      • 2014-09-08
      • 1970-01-01
      相关资源
      最近更新 更多