Several alternative approaches using (1) FrobeniusSolve
, (2) Tuples
, (3) Outer
, and (4) IntegerPartitions
:
ClearAll[f1, f2, f3 , f4, f5]
f1[n_, m_] := Join @@ (FrobeniusSolve[ConstantArray[1, m], #] & /@ Range[0, n])
f2[n_, m_] := If[Total @ # <= n, #, ## &[]] & /@ Tuples[Range[0, n], {m}]
f3[n_, m_] := Flatten[Outer[If[+## <= n, {##}, ## &[]] &, ## & @@
ConstantArray[Range[0, n], m]], 2]
f4[n_, m_] := Join @@ (Permutations /@ PadRight[Join @@
(IntegerPartitions[#, m] & /@ Range[0, n])])
f5[n_, m_] := Join @@ (Permutations /@ (Join @@ (IntegerPartitions[#, {m},
Range[0, n]] & /@ Range[0, n])))
Sort@f1[3, 3] == Sort@f2[3, 3] == Sort@f3[3, 3] == Sort@f4[3, 3] == Sort@f5[3, 3]
True
f1[3, 3]
{{0, 0, 0}, {0, 0, 1}, {0, 1, 0}, {1, 0, 0}, {0, 0, 2}, {0, 1, 1}, {0,
2, 0}, {1, 0, 1}, {1, 1, 0}, {2, 0, 0}, {0, 0, 3}, {0, 1, 2}, {0,
2, 1}, {0, 3, 0}, {1, 0, 2}, {1, 1, 1}, {1, 2, 0}, {2, 0, 1}, {2, 1,
0}, {3, 0, 0}}
f1[4, 2]
{{0, 0}, {0, 1}, {1, 0}, {0, 2}, {1, 1}, {2, 0}, {0, 3}, {1, 2}, {2,
1}, {3, 0}, {0, 4}, {1, 3}, {2, 2}, {3, 1}, {4, 0}}
{1,1,1}
. Is that correct? $\endgroup$ – AccidentalFourierTransform Jul 2 at 15:11