I’ve been trying to simply count solutions. The best I could do is with the 
prime decomposition powers.

Say we want to find the number of unordered solutions to
n = */v
solving for vector v where n is a scalar, and both are non-negative integers.

Let p=: {: __ q: n.
Then we need to “partition” these powers into #v buckets.

For each x in p we need to calculate a sort of “ordered partition number” of x. 
That is, in x=4 and 3 = #v:
4 + 0 + 0
0 + 4 + 0
0 + 0 + 4
3 + 1 + 0
3 + 0 + 1
1 + 3 + 0
1 + 0 + 3
0 + 3 + 1
0 + 1 + 3
2 + 1 + 1
1 + 2 + 1
1 + 1 + 2
are all possible “partitions” of x.
More specifically, we need to count the number of functions f from {1...#v} to 
the naturals such that x = +/f”0 >:i.#v.

Then we could simply take the product of f applied to each of the items of p 
and divide by !#v.

Unfortunately I doubt counting valid f is easy, and I haven’t found anything 
yet.

Cheers,
Louis

> On 22 Oct 2017, at 12:53, R.E. Boss <[email protected]> wrote:
> 
> In one of my more successful years I studied partitions as well, see 
> http://www.jsoftware.com/pipermail/programming/2006-September/003209.html
> 
> 
> R.E. Boss
> 
> 
>> -----Original Message-----
>> From: Programming [mailto:[email protected]]
>> On Behalf Of Rob B
>> Sent: zondag 22 oktober 2017 11:40
>> To: [email protected]
>> Subject: Re: [Jprogramming] Partitions
>> 
>> In the twelvefold way at https://www.johndcook.com/TwelvefoldWay.pdf I
>> think this is case 6, labelled, unlabelled, >=1.
>> 
>> Regards, Rob.
>> 
>>> On 22 Oct 2017, at 01:29, Rob Hodgkinson <[email protected]> wrote:
>>> 
>>> Skip, not sure the status of a solution for this yet (Raul’s was last 
>>> closest I
>> believe ?).
>>> 
>>> I thought through the following analysis over the weekend, more around
>> combinatorics.
>>> 
>>> Problem is to split a list of objects o, into y “buckets” and you want to 
>>> all the
>> ways possible given the constraints below.
>>> 
>>> A combinatoric view is to consider filling each bucket (without
>>> replacement) until no more objects, for example; Suppose 7 objects (e.g.
>> ‘abcdefg’) split into 3 buckets of size 2 3 2.
>>>   There are 2C7 (or 2!7) ways to fill the first bucket, leaving 5 left.
>>>   From these 5 there are then 3!5 ways to fill the second bucket, leaving 2
>> left.
>>>   From these 2 there are then 2!2 ways to fill the last bucket
>>> 
>>> The combinations (with decreasing sample sets) can be calculated as
>> follows (I pasted in Courier New, hope this appears OK).
>>>  smoutput bset=:(+/bsize)- +/\ 0,}:bsize=:2 3 2
>>> 7 5 2
>>> 
>>> So from the reducing sample from which to fill each successive bucket, the
>> possible combinations are:
>>>  bsize ! bset=:(+/bsize)- +/\ 0,}:bsize=:2 3 2
>>> 21 10 1
>>> 
>>> And the combinations in each bucket are then “indices” within each bucket
>> from the available objects remaining;
>>>  smoutput bcombs=:bsize comb each bset=:(+/bsize)- +/\ 0,}:bsize=:2 3
>>> 2 ┌───┬─────┬───┐
>>> │0 1│0 1 2│0 1│
>>> │0 2│0 1 3│   │
>>> │0 3│0 1 4│   │
>>> │0 4│0 2 3│   │
>>> │0 5│0 2 4│   │
>>> │0 6│0 3 4│   │
>>> │1 2│1 2 3│   │
>>> │1 3│1 2 4│   │
>>> │1 4│1 3 4│   │
>>> │1 5│2 3 4│   │
>>> │1 6│     │   │
>>> │2 3│     │   │
>>> │2 4│     │   │
>>> │2 5│     │   │
>>> │2 6│     │   │
>>> │3 4│     │   │
>>> │3 5│     │   │
>>> │3 6│     │   │
>>> │4 5│     │   │
>>> │4 6│     │   │
>>> │5 6│     │   │
>>> └───┴─────┴───┘
>>> So for example the first row in each bucket only says e.g. from ‘abcdefg’,
>> choose (‘ab’;’cde’;’fg’), the first “trial”.
>>>  $ each bcombs
>>> ┌────┬────┬───┐
>>> │21 2│10 3│1 2│
>>> └────┴────┴───┘
>>> 
>>> This shows there would be 210 possible combinations (trials), although I am
>> unclear on your rule 5 below, to remove “like” combinations, but this could
>> be achieved post the algorithm.
>>> To get the actual 210 samples you could then index into each cell, but the
>> “samples remaining” would then change for each combination.
>>> 
>>> For example, bucket1 is straightforward to calculate, along with the
>> remainder samples available to fill the remaining buckets …
>>>  smoutput bucket1=:'abcdefg' {~ >{.bcombs ab ac ad ae af ag bc bd be
>>> bf bg cd ce cf cg de df dg ef eg fg
>>>  bucket1;'abcdefg'-."1 bucket1
>>> ┌──┬─────┐
>>> │ab│cdefg│
>>> │ac│bdefg│
>>> │ad│bcefg│
>>> │ae│bcdfg│
>>> │af│bcdeg│
>>> │ag│bcdef│
>>> │bc│adefg│
>>> │bd│acefg│
>>> │be│acdfg│
>>> │bf│acdeg│
>>> │bg│acdef│
>>> │cd│abefg│
>>> │ce│abdfg│
>>> │cf│abdeg│
>>> │cg│abdef│
>>> │de│abcfg│
>>> │df│abceg│
>>> │dg│abcef│
>>> │ef│abcdg│
>>> │eg│abcdf│
>>> │fg│abcde│
>>> └──┴─────┘
>>> The steps would be repeated for each product, at each stage “expanding”
>> the combinations within each bucket by the successive indices (avoiding
>> selecting any items already in existing buckets).
>>> This will become a cartesian product of samples at each iteration to
>> generate the final 210 samples.
>>> 
>>> This would likely involve recursion or some form of (f ,/), but wanted to
>> check my understanding is on track.  It may make the solution clearer.
>>> 
>>> I hope this makes sense, Rob
>>> 
>>>> On 21 Oct 2017, at 10:06 am, 'Skip Cave' via Programming
>> <[email protected]> wrote:
>>>> 
>>>> Perhaps here is a better way to describe the problem I was trying to solve:
>>>> 
>>>> 1. I have y unique objects. I have x containers. I want to find all
>>>> the different ways I can put those y unique objects into x containers.
>>>> 
>>>> 2. A single trial is defined as distributing *all* y of the objects
>>>> into all of the x containers. After the trial, the objects are
>>>> removed from the containers and redistributed in the containers for
>>>> the next trial. Objects can not be duplicated.
>>>> 
>>>> 3. Empty containers are not allowed in any trial. There must be at
>>>> least one object in every container in every trial.
>>>> 
>>>> 4. There is no order requirement for objects in a container. If two
>>>> trials are identical except for the order of the objects in any of
>>>> the containers, those two trials are considered as one trial.
>>>> 
>>>> 5. There is no order requirement for the containers. If two trials
>>>> are identical in that both trials have the same number of objects in
>>>> each of the x containers, but the order of the containers is
>>>> different, those two trials are considered as one trial.
>>>> 
>>>> Skip
>>>> 
>>>> Skip Cave
>>>> Cave Consulting LLC
>>>> 
>>>>> On Fri, Oct 20, 2017 at 3:54 AM, Raul Miller <[email protected]>
>> wrote:
>>>>> 
>>>>> With that description, I think I might do something like this:
>>>>> 
>>>>> nparts=: ~.@([: /:~"1 i.@] </."1~ [ #.^:_1 [ i.@^ ])
>>>>> 2 nparts 3
>>>>> ┌───┬─────┐
>>>>> │   │0 1 2│
>>>>> ├───┼─────┤
>>>>> │0 1│2    │
>>>>> ├───┼─────┤
>>>>> │0 2│1    │
>>>>> ├───┼─────┤
>>>>> │0  │1 2  │
>>>>> └───┴─────┘
>>>>> 
>>>>> I should be able to do something more efficient, but before I
>>>>> attempt that, I would like to clarify something:
>>>>> 
>>>>> In your examples, you do not have any empty partitions, so is that a
>>>>> part of the specification also?
>>>>> 
>>>>> I am unsure if I should be paying close attention to your examples
>>>>> because you said "The order of the objects in each partition is not
>>>>> important" but your examples also omit partitions which contain the
>>>>> objects out of order.
>>>>> 
>>>>> Actually... there's several kinds of order here which we could be
>>>>> discussing:
>>>>> 
>>>>> (1) the order of objects within a partition.
>>>>> (2) the order of objects across partitions.
>>>>> (3) the order of partitions.
>>>>> 
>>>>> In other words:
>>>>> 
>>>>> NB. (1) the order of objects within a partition  \:~each 2 nparts 3
>>>>> ┌───┬─────┐
>>>>> │   │2 1 0│
>>>>> ├───┼─────┤
>>>>> │1 0│2    │
>>>>> ├───┼─────┤
>>>>> │2 0│1    │
>>>>> ├───┼─────┤
>>>>> │0  │2 1  │
>>>>> └───┴─────┘
>>>>> 
>>>>> NB. (2) the order of objects across partitions
>>>>> 2 ~.@([: \:~"1 i.@] </."1~ [ #.^:_1 [ i.@^ ]) 3 ┌─────┬───┐
>>>>> │0 1 2│   │
>>>>> ├─────┼───┤
>>>>> │2    │0 1│
>>>>> ├─────┼───┤
>>>>> │1    │0 2│
>>>>> ├─────┼───┤
>>>>> │1 2  │0  │
>>>>> └─────┴───┘
>>>>> 
>>>>> NB. (3) the order of partitions
>>>>> 2 ((i.@[ ,"1 [ #.^:_1 i.@^) <@}./."1 {. , i.@]) 3 ┌─────┬─────┐
>>>>> │0 1 2│     │
>>>>> ├─────┼─────┤
>>>>> │0 1  │2    │
>>>>> ├─────┼─────┤
>>>>> │0 2  │1    │
>>>>> ├─────┼─────┤
>>>>> │0    │1 2  │
>>>>> ├─────┼─────┤
>>>>> │1 2  │0    │
>>>>> ├─────┼─────┤
>>>>> │1    │0 2  │
>>>>> ├─────┼─────┤
>>>>> │2    │0 1  │
>>>>> ├─────┼─────┤
>>>>> │     │0 1 2│
>>>>> └─────┴─────┘
>>>>> 
>>>>> I have presumed that you are thinking of both the partition contents
>>>>> and the partitions themselves as sets. In other words, I think that
>>>>> none of these orders matter. But... this kind of thing is worth
>>>>> verifying?
>>>>> 
>>>>> Thanks,
>>>>> 
>>>>> --
>>>>> Raul
>>>>> 
>>>>> On Fri, Oct 20, 2017 at 12:19 AM, 'Skip Cave' via Programming
>>>>> <[email protected]> wrote:
>>>>>> Mike,
>>>>>> 
>>>>>> I wasn't very thorough in my definition of the original problem. I
>>>>> thought
>>>>>> that the example I gave was enough to clarify the requirements, but
>>>>> looking
>>>>>> back, more definition would have been good.
>>>>>> 
>>>>>> The original problem I posted was to develop a dyadic verb that
>>>>>> would
>>>>> take
>>>>>> y objects and show all the ways that those y objects could be
>>>>>> partitioned into x groups. Each partition set must include all objects
>> exactly once.
>>>>>> Duplication of objects is not allowed. The order of the objects in
>>>>>> each partition is not important.
>>>>>> 
>>>>>> Erling got the right idea in his previous post:
>>>>>> 
>>>>>> par=: 4 : '(1,.2</\"1(i.x)#/~(y=+/"1 o)#o=.((x$v)#:i.v^x){1+i.v=.1+
>>>>>> y-x)<;.1[1+i.y'
>>>>>> 
>>>>>> 2 par 3
>>>>>> ┌───┬───┐
>>>>>> │1  │2 3│
>>>>>> ├───┼───┤
>>>>>> │1 2│3  │
>>>>>> └───┴───┘
>>>>>> 2 par 4
>>>>>> ┌─────┬─────┐
>>>>>> │1    │2 3 4│
>>>>>> ├─────┼─────┤
>>>>>> │1 2  │3 4  │
>>>>>> ├─────┼─────┤
>>>>>> │1 2 3│4    │
>>>>>> └─────┴─────┘
>>>>>> 2 par 5
>>>>>> ┌───────┬───────┐
>>>>>> │1      │2 3 4 5│
>>>>>> ├───────┼───────┤
>>>>>> │1 2    │3 4 5  │
>>>>>> ├───────┼───────┤
>>>>>> │1 2 3  │4 5    │
>>>>>> ├───────┼───────┤
>>>>>> │1 2 3 4│5      │
>>>>>> └───────┴───────┘
>>>>>> 3 par 4
>>>>>> ┌───┬───┬───┐
>>>>>> │1  │2  │3 4│
>>>>>> ├───┼───┼───┤
>>>>>> │1  │2 3│4  │
>>>>>> ├───┼───┼───┤
>>>>>> │1 2│3  │4  │
>>>>>> └───┴───┴───┘
>>>>>> 3 par 5
>>>>>> ┌─────┬─────┬─────┐
>>>>>> │1    │2    │3 4 5│
>>>>>> ├─────┼─────┼─────┤
>>>>>> │1    │2 3  │4 5  │
>>>>>> ├─────┼─────┼─────┤
>>>>>> │1    │2 3 4│5    │
>>>>>> ├─────┼─────┼─────┤
>>>>>> │1 2  │3    │4 5  │
>>>>>> ├─────┼─────┼─────┤
>>>>>> │1 2  │3 4  │5    │
>>>>>> ├─────┼─────┼─────┤
>>>>>> │1 2 3│4    │5    │
>>>>>> └─────┴─────┴─────┘
>>>>>> 3 par 6
>>>>>> ┌───────┬───────┬───────┐
>>>>>> │1      │2      │3 4 5 6│
>>>>>> ├───────┼───────┼───────┤
>>>>>> │1      │2 3    │4 5 6  │
>>>>>> ├───────┼───────┼───────┤
>>>>>> │1      │2 3 4  │5 6    │
>>>>>> ├───────┼───────┼───────┤
>>>>>> │1      │2 3 4 5│6      │
>>>>>> ├───────┼───────┼───────┤
>>>>>> │1 2    │3      │4 5 6  │
>>>>>> ├───────┼───────┼───────┤
>>>>>> │1 2    │3 4    │5 6    │
>>>>>> ├───────┼───────┼───────┤
>>>>>> │1 2    │3 4 5  │6      │
>>>>>> ├───────┼───────┼───────┤
>>>>>> │1 2 3  │4      │5 6    │
>>>>>> ├───────┼───────┼───────┤
>>>>>> │1 2 3  │4 5    │6      │
>>>>>> ├───────┼───────┼───────┤
>>>>>> │1 2 3 4│5      │6      │
>>>>>> └───────┴───────┴───────┘
>>>>>> 
>>>>>> Skip Cave
>>>>>> Cave Consulting LLC
>>>>>> 
>>>>>> On Thu, Oct 19, 2017 at 5:47 PM, 'Mike Day' via Programming <
>>>>>> [email protected]> wrote:
>>>>>> 
>>>>>>> Skip,  in your actual Quora Problem,  why not include other triads,
>>>>>>> such as 1 1 24,  2 3 4 etc;   or, otherwise,  why include both 2 4 3
>>>>> and 4
>>>>>>> 2 3 ?
>>>>>>> 
>>>>>>> Anyway,  this is (quite) short and brutish but not too nasty to
>>>>>>> solve
>>>>> your
>>>>>>> Quora problem for quite small numbers and numbers of factors:
>>>>>>> 
>>>>>>> |: 24 ([ ( (= */"1)#])  [:>:[#.inv i.@^ ) 3  NB. transpose
>>>>> gratuitous!
>>>>>>> 1  1 1 1 1 1  1  1  2 2 2 2 2  2 3 3 3 3 4 4 4 4 6 6 6 8 8 12 12
>>>>>>> 24
>>>>>>> 1  2 3 4 6 8 12 24  1 2 3 4 6 12 1 2 4 8 1 2 3 6 1 2 4 1 3  1  2 1
>>>>>>> 24 12 8 6 4 3  2  1 12 6 4 3 2  1 8 4 2 1 6 3 2 1 4 2 1 3 1  2  1
>>>>>>> 1
>>>>>>> 
>>>>>>> It builds triads 1 1 1 , 1 1 2 ,...1 1 24, ... up to 24 24 24, and
>>>>>>> keeps
>>>>>>> 
>>>>>>> just those whose product is 24.
>>>>>>> 
>>>>>>> 
>>>>>>> No points for space or time, filtering 30 out of 13824 candidates,
>>>>>>> but
>>>>> it's
>>>>>>> 
>>>>>>> quite straightforward,  and it does yield all 30 permutations,
>>>>>>> which
>>>>> some
>>>>>>> 
>>>>>>> of the Quora corresondents appear to consider the requirement.
>>>>>>> 
>>>>>>> 
>>>>>>> NB - it's not clear to me what the problem actually is - is 30 the
>>>>> required
>>>>>>> 
>>>>>>> answer (number of permutations of 3 suitable factors),  or 6
>>>>>>> (number of
>>>>>>> 
>>>>>>> combinations of same)?
>>>>>>> 
>>>>>>> 
>>>>>>> Mike
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>> -------------------------------------------------------------------
>>>>>> --- For information about J forums see
>>>>>> http://www.jsoftware.com/forums.htm
>>>>> --------------------------------------------------------------------
>>>>> -- For information about J forums see
>>>>> http://www.jsoftware.com/forums.htm
>>>> ---------------------------------------------------------------------
>>>> - For information about J forums see
>>>> http://www.jsoftware.com/forums.htm
>>> 
>>> ----------------------------------------------------------------------
>>> For information about J forums see
>> http://www.jsoftware.com/forums.htm
>> ----------------------------------------------------------------------
>> For information about J forums see http://www.jsoftware.com/forums.htm
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm

----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to