0

2 bynマトリックスを作成する必要があります

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

xy、およびの3 つの入力を持つ関数から作成する必要がありますnmake_m(x,y,n)

マトリックスは次の基準に従う必要があります。

  1. 列 x の数値の合計 =x
  2. 列 y の数値の合計 =y
  3. 任意の行で、x#/y# =x/y
  4. n行数が必要です

今、可能なすべてのxandのペアを見つけ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ます。たとえば、n4 より大きい値の場合、次のことはできません。

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

しかし、今のところそれらについて心配する必要はありません。

本当の問題は、結果として得られる多くの可能性には大量の可能性があるということです。したがって、正しいタプルを選択するためのアルゴリズム関数だけでなく、最適なタプルも必要です。

可能であれば、選択するタプルのサイズが互いに近いようにしたいと思います。つまり、シーケンス全体で 1 つのタプルのみが繰り返されることが最善の解決策です。

では、必要な行列を作成できる関数を作成するにはどうすればよいでしょうか?

4

1 に答える 1

2

との最大公約数 (GCD)を見つけることが役に立ちます。それでも結果が得られる最大値がわかり、行列の行を見つけるのにも役立ちます。xyn

xと の両方をyGCD で割ると、比率要件を満たすx#との最小の組み合わせが得られます。ここで、合計が GCD に等しい 1 から GCD までの数を見つける必要があります。これらの数値は、行列の行として使用する倍数を示します。y#znz

: 私はあなたのリストを次の目的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) です。= 2 の場合、1 と 4 の間の合計が 4にnなる 2 つの数値が必要です。これにより、2 か 2 のいずれかの 2 つの組み合わせが得られます(これらを使用して乗算zすると、[(50, 182),(50, 182)])または 1, 3 ([(25, 91), (75, 273)]) .

= 3 の場合n、唯一の解は 1、1、2 です。for n= 4 は 1, 1, 1, 1 だけです。それ以上の値nを指定すると、結果が得られません。

これが役立つことを願っています。また、正の整数のみを使用できると想定しています。負の整数を使用すると、タスクは簡単になります。

于 2013-05-04T20:45:25.817 に答える