制限された増加する整数シーケンスの生成[重複]
Dec 02 2020
整数列の完全なリストを生成する効果的な方法を探しています
{a_1,a_2,...,a_n}
長さの $n$ そのような $$0\le a_1\le a_2\le\dots\le a_n< m,$$
2つの整数パラメータを使用 $n$ そして $m$。
私はこれを介して実行することを想像することができます
Table[Sort[IntegerDigits[x-1,m,n]],{x,m^n}]
重複を削除しますが、もっと効果的な方法が確かに存在するはずです。
回答
7 cvgmt Dec 02 2020 at 18:51
そのようなシーケンスをマッピングできるので
$$0\leq a_1\leq a_2\leq a_3 \leq \cdots \leq a_{n-1}\leq a_n < m $$ に $$0 < b1=a_1+1 < b2=a_2+2 < b3=a_3+3 <\cdots < b_n=a_n+n < m+n $$ そして $\{b_1,b_2,\cdots b_n\}$のn
サブセットですRange[m+n-1]
そして、私たちは得ることができます $\{a_1,a_2,\cdots a_n\}$ から $\{b_1,b_2,\cdots b_n\}-\{1,2,\cdots,n\}$
m = 8;
n = 5;
list = Subsets[Range[m+n-1], {n}]
Subtract[#, Range[n]] & /@ list
3 DanielHuber Dec 02 2020 at 18:38
ちょっとしたトリックで、Table
関数を使ってこれを行うことができます。これはTable
、HoldAll属性があるために必要です。
小さな例として、最初にmとnを設定します。
m=4;
n=2;
次に、変数のリストとイテレータのリストを作成し、それらをTable
:の本体に結合します。
var = Table[x[i], {i, n}];
iter = Table[{x[i], x[i - 1] + 1, m-1}, {i, n}] /. x[0] -> -1;
body = PrependTo[iter, var]
最後Table
に、体に適用し、余分なブレースに乗るために平らにします。
Flatten[Table @@ body, 1]
これは与える:
{{0, 1}, {0, 2}, {0, 3}, {1, 2}, {1, 3}, {2, 3}}