Ваша функция:
In[21]:= g[n_, d_] := Select[Tuples[Range[0, n], d], Total[#] == n &]
In[22]:= Timing[g[15, 4];]
Out[22]= {0.219, Null}
Попробуйте FrobeniusSolve :
In[23]:= f[n_, d_] := FrobeniusSolve[ConstantArray[1, d], n]
In[24]:= Timing[f[15, 4];]
Out[24]= {0.031, Null}
Результаты одинаковы:
In[25]:= f[15, 4] == g[15, 4]
Out[25]= True
Вы можетесделайте это быстрее с IntegerPartitions , хотя вы не получите результаты в том же порядке:
In[43]:= h[n_, d_] :=
Flatten[Permutations /@ IntegerPartitions[n, {d}, Range[0, n]], 1]
Сортированные результаты одинаковы:
In[46]:= Sort[h[15, 4]] == Sort[f[15, 4]]
Out[46]= True
Это гораздо быстрее:
In[59]:= {Timing[h[15, 4];], Timing[h[23, 5];]}
Out[59]= {{0., Null}, {0., Null}}
Благодаря быстрому ответу phadej за то, что я снова посмотрю.
Обратите внимание, что вам нужен только вызов Перестановки (и Свести ), если вы действительно хотите все по-разному упорядоченные перестановки, т.е. если вы хотите
In[60]:= h[3, 2]
Out[60]= {{3, 0}, {0, 3}, {2, 1}, {1, 2}}
вместо
In[60]:= etc[3, 2]
Out[60]= {{3, 0}, {2, 1}}