제한된 증가 정수 시퀀스 생성 [중복]
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
함수를 사용하여이를 수행 할 수 있습니다 . 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 :
Flatten[Table @@ body, 1]
이것은 다음을 제공합니다.
{{0, 1}, {0, 2}, {0, 3}, {1, 2}, {1, 3}, {2, 3}}