Group Abstract Group Abstract

Message Boards Message Boards

Partitioning a number into integer partition lengths.

GROUPS:
Lets say I have a number n = 3245 and I want to split the number in to all integer partition lengths like:- ( I may wish to extend this to numbers greater than 30 digits).
{3, 245}, {32, 45}, {324, 5}, {3, 2, 45}, {32, 4, 5}, {3, 2, 4, 5}.
I have devised a way to determine the partitions like so.
a = IntegerPartitions[4]; b = Reverse /@ a; c =
Select[Sort[Join[a, b]], Length[#] > 1 &] // DeleteDuplicates

{{1, 3}, {2, 2}, {3, 1}, {1, 1, 2}, {2, 1, 1}, {1, 1, 1, 1}}
However, I can' t see how to map those partitions to the actual number,  I have tried using strings but there doesn' t seem to be a function to split a string by its position.
Any help or ideas would be appreciated.

Paul.
POSTED BY: Paul Cleary
Answer
1 year ago
Credit for this approach goes to Arnoud Buzing:
In[4]:= Map[FromDigits, MapThread[IntegerDigits[n][[#1 ;; #2]] &,
                 Module[{a = Accumulate[#]}, {a - # + 1, a}]] & /@ c, {2}]

Out[4]= {{3, 245}, {32, 45}, {324, 5}, {3, 2, 45}, {32, 4, 5}, {3, 2, 4, 5}}
Can be written more concisely in terms of the following undocumented function
?Internal`PartitionRagged
for example, assuming we also want to get {3245} and {3, 24, 5}:
part[n_Integer] := With[{l = IntegerDigits[n]},
  Map[FromDigits, Internal`PartitionRagged[l, #] & /@ Join @@ (Permutations /@ IntegerPartitions[Length[l]]), {2}]]

In[6]:= part[3245]

Out[6]= {{3245}, {324, 5}, {3, 245}, {32, 45}, {32, 4, 5}, {3, 24, 5}, {3, 2, 45}, {3, 2, 4, 5}}
POSTED BY: Ilian Gachevski
Answer
1 year ago
Thank you Ilian, that's perfect, the second example was also what I really needed.

Paul.
POSTED BY: Paul Cleary
Answer
1 year ago