我需要创建一个2 n
矩阵
x y
1 x1 y1
2 x2 y2
3 x3 y3
4 x4 y4
5 x5 y5
. .. ..
n xn yn
需要从包含3个输入的函数创建:x
,y
和n
,我们称之为make_m(x,y,n)
矩阵需要遵循以下标准:
x
y
x/y
n
行数现在我有一个函数可以找到所有可能的x
和y
对,并将它们返回到元组列表中,但我不知道如何处理查找哪些元组的问题将行作为行来满足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)]
但现在不要担心这些。
真正的问题是许多结果可能性有很多可能性,因此我不仅需要一个算法函数来挑选正确的元组,而是最好的元组。
如果可能的话,我希望它选择的元组在大小上彼此接近,这意味着最好的解决方案是整个序列只重复一个元组。
那么如何编写一个能够创建我需要的矩阵的函数呢?
答案 0 :(得分:2)
有什么可以帮助您找到x
和y
的{{3}}。它会告诉您仍然产生结果的最大n
是什么,并且还可以帮助您找到矩阵的行。
如果您将x
和y
除以GCD,您将获得满足比率要求的x#
和y#
的最低组合。让我们用它来表示为z
。现在你需要从1到GCD找到n
个数字,其总和等于GCD。这些数字表示用作矩阵行的z
的倍数。
示例强>:
我会将您的列表用于x = 100
,y = 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
都不会产生任何结果。
我希望这会有所帮助。此外,它期望你只能使用正整数 - 任务将变得微不足道,负面的。