Erzeugung von eingeschränkten ansteigenden ganzzahligen Sequenzen [Duplikat]
Ich suche nach einem effektiven Weg, um eine vollständige Liste von Ganzzahlsequenzen zu generieren
{a_1,a_2,...,a_n}
der Länge $n$ so dass $$0\le a_1\le a_2\le\dots\le a_n< m,$$
mit zwei ganzzahligen Parametern $n$ und $m$.
Ich kann mir vorstellen, dies über durchzuführen
Table[Sort[IntegerDigits[x-1,m,n]],{x,m^n}]
und dann Duplikate löschen, aber es sollte sicherlich einen viel effektiveren Weg geben.
Antworten
Da können wir solche Reihenfolge abbilden
$$0\leq a_1\leq a_2\leq a_3 \leq \cdots \leq a_{n-1}\leq a_n < m $$ zu $$0 < b1=a_1+1 < b2=a_2+2 < b3=a_3+3 <\cdots < b_n=a_n+n < m+n $$ und $\{b_1,b_2,\cdots b_n\}$ist die n
Teilmenge vonRange[m+n-1]
Und wir können bekommen $\{a_1,a_2,\cdots a_n\}$ von $\{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
Mit einem kleinen Trick können wir dies mit der Table
Funktion tun . Dies ist notwendig, da Table
es das Attribut HoldAll hat.
Für ein kleines Beispiel setzen wir zuerst m und n:
m=4;
n=2;
Wir erstellen dann eine Liste von Variablen und eine Liste von Iteratoren und fügen sie dem Körper von 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]
Schließlich wenden wir uns Table
an den Körper und an Flatten, um überflüssige Zahnspangen zu reiten:
Flatten[Table @@ body, 1]
Das gibt:
{{0, 1}, {0, 2}, {0, 3}, {1, 2}, {1, 3}, {2, 3}}