제한된 증가 정수 시퀀스 생성 [중복]

Dec 02 2020

정수 시퀀스의 전체 목록을 생성하는 효과적인 방법을 찾고 있습니다.

 {a_1,a_2,...,a_n} 

길이의 $n$ 그런 $$0\le a_1\le a_2\le\dots\le a_n< m,$$

두 개의 정수 매개 변수 사용 $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함수를 사용하여이를 수행 할 수 있습니다 . TableHoldAll 속성 이 있기 때문에 필요 합니다.

작은 예를 들어, 먼저 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 :

Flatten[Table @@ body, 1]

이것은 다음을 제공합니다.

{{0, 1}, {0, 2}, {0, 3}, {1, 2}, {1, 3}, {2, 3}}