0

我需要通过n矩阵创建一个 2

    x   y
1  x1  y1
2  x2  y2
3  x3  y3
4  x4  y4
5  x5  y5
.  ..  ..
n  xn  yn

它需要从具有 3 个输入的函数创建:xyn,让我们称之为make_m(x,y,n)

矩阵需要遵循以下标准:

  1. x列中数字的总和=x
  2. y 列中的数字之和 =y
  3. 在任何给定的行中,x#/y# =x/y
  4. 必须有n行数

现在我有一个函数可以找到所有可能的对xy在元组列表中返回它们,但是我不知道如何解决如何找到将哪些元组作为行来满足 4 个要求的问题。这是该功能:

def find_r(x,y):
   return [(a, a*num2/num1) for a in range(1, num1) if (a*num2) % num1 == 0]

是的,会有一些例子因为这个比例而不起作用,例如:

In [60]: find_r(100,891)
Out[60]: []

并且会有一些对某些数量的n. n例如,对于高于 4的值,以下将是不可能的

In [57]: find_r(100,364)
Out[57]: [(25, 91), (50, 182), (75, 273)]

但暂时不要担心这些。

真正的问题是许多产生的可能性有大量的可能性,所以我不仅需要一个算法函数来挑选正确的元组,还需要最好的元组。

我希望它选择的元组在大小上尽可能接近,这意味着最好的解决方案是在整个序列中只重复一个元组。

那么如何编写一个能够创建我需要的矩阵的函数呢?

4

1 回答 1

2

可以帮助您找到 和 的最大公约数( GCD)。它将告诉您仍然产生结果的最大值是多少,并帮助您找到矩阵的行。xyn

如果将两者x除以它们的 GCD,您将得到满足比率要求的和y的最低组合。我们将其表示为。现在你需要找到从 1 到 GCD 之和等于 GCD 的数字。这些数字指示用作矩阵行的倍数。x#y#znz

示例:我将使用您的列表x = 100y = 364

In [57]: find_r(100,364)
Out[57]: [(25, 91), (50, 182), (75, 273)]

n= 2。

GCD(100, 364) = 4。所以在这种情况下,z= (25, 91)。使用n= 2,我们需要 1 和 4 之间的两个数字加起来为 4。这给了我们两种组合:2、2 (使用它们相乘z,我们得到两对数字:[(50, 182),(50, 182)])或 1, 3 ([(25, 91), (75, 273)])

对于n= 3,唯一的解决方案是 1、1、2;而对于n= 4,只有 1、1、1、1。任何更高n都不会产生任何结果。

我希望这有帮助。此外,它希望您只能使用正整数 - 负整数的任务将变得微不足道。

于 2013-05-04T20:45:25.817 回答