प्रतिबंधित बढ़ते पूर्णांक अनुक्रमों की उत्पत्ति [डुप्लिकेट]

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विशेषता होल्डऑल है।

एक छोटे से उदाहरण के लिए, हम पहले 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}}