5

I want to partition an integer into $k$ integers all possible orderings. This can be done in the following way

integerPartitions[n_, {k_}] := Select[FrobeniusSolve[Table[1, {k}], n], FreeQ[#, 0] &]

For example,

integerPartitions[4, {2}]

gives

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

But this is very slow if the partition number is large as compared to IntegerPartitions, which gives partitions in reverse lexicographic order. For instance, integerPartitions[60, {5}] will take more than 4 seconds in my laptop in contrast to 0 seconds of IntegerPartitions[60, {5}].

So my question is: what would be the most efficient Mathematica code for this problem?

unstable
  • 1,497
  • 15
  • 14

2 Answers2

12

This seems to be quite quick :

output = Flatten[Permutations /@ IntegerPartitions[60, {5}], 1]; // AbsoluteTiming
(* {0.245025, Null} *)

output // Dimensions
(* {455126, 5} *)
Mr.Wizard
  • 271,378
  • 34
  • 587
  • 1,371
b.gates.you.know.what
  • 20,103
  • 2
  • 43
  • 84
0

If order does matter, you are generating integer compositions. Integer compositions are related to the operation multichoose. You can use the Resource Functions IntegerCompositions, where 0 s are allowed like {0,0,5} for 5 into 3 parts, and StrictIntegerCompositions for this, where 0 s are not allowed like {2,1,2} for 5 into 3 parts.

Peter Burbery
  • 1,695
  • 4
  • 15