http://code.jsoftware.com/wiki/Essays/Divisors

What you have been asking for are computations on all possible subsets.
When dealing with all possible subsets, start with the boolean matrix
#:@i.@(2&^)@#
 .  You can then do B +/ .* x for all sums or B */ . (^~) x for all
products.  Combinations are not the way to go because m comb n will get you
the indices for the subsets of size m, whereas you want subsets of size 0,
1, ..., n.



On Mon, Oct 2, 2017 at 1:03 PM, Skip Cave <[email protected]> wrote:

> My initial goal was to find all the divisors of a number, eg 100:
> Get the prime factors:
>     q:100
> 2 2 5 5
>
> Get all combinations of those prime factors (the power set)
>
>     ps0 =: #:@i.@(2&^)@#<@#"1 _]
>
> ps0 q:100
>
> ┌┬─┬─┬───┬─┬───┬───┬─────┬─┬───┬───┬─────┬───┬─────┬─────┬───────┐
>
> ││5│5│5 5│2│2 5│2 5│2 5 5│2│2 5│2 5│2 5 5│2 2│2 2 5│2 2 5│2 2 5 5│
>
> └┴─┴─┴───┴─┴───┴───┴─────┴─┴───┴───┴─────┴───┴─────┴─────┴───────┘
>
> Get the products of each box:
>
>       */ each ps0 q: 100
>
> ┌─┬─┬─┬──┬─┬──┬──┬──┬─┬──┬──┬──┬─┬──┬──┬───┐
>
> │1│5│5│25│2│10│10│50│2│10│10│50│4│20│20│100│
>
> └─┴─┴─┴──┴─┴──┴──┴──┴─┴──┴──┴──┴─┴──┴──┴───┘
>
>
> Get the unique set of divisors and sort them:
>
>       /:~ ~.>*/ each ps0 q:100
>
> 1 2 4 5 10 20 25 50 100
>
>
> Now thanks to everyone's help, I can find all the divisors of any number:
>
>       f=.3 :'/:~ ~.>*/ each ps0 q:y'
>
>       f 110
>
> 1 2 5 10 11 22 55 110
>
>       f 43
>
> 1 43
>
>       f 444
>
> 1 2 3 4 6 12 37 74 111 148 222 444
>
>
> Skip
>
>
>
> Skip Cave
> Cave Consulting LLC
>
> On Mon, Oct 2, 2017 at 2:40 PM, Raul Miller <[email protected]> wrote:
>
> > Perhaps this is closer to what you want?
> >
> >     F=:1 :', u@> { (~. (u@#"0~ i.@>:)&.> #/.~) y'
> >     f=: /F
> >
> >     *f 2 2 5 7
> > 1 7 5 35 2 14 10 70 4 28 20 140
> >     +f 2 2 5 7
> > 0 7 5 12 2 9 7 14 4 11 9 16
> >
> > I probably should just merge the two definitions together, but I think
> > this works?
> >
> > (Note that I have sort of assumed that the verb argument to f is an
> > associative verb. If you're doing something where that is not the
> > case... well... I guess I would need more specification.)
> >
> > Thanks,
> >
> > --
> > Raul
> >
> >
> > On Mon, Oct 2, 2017 at 3:17 PM, Skip Cave <[email protected]>
> wrote:
> > > Sorry about the wrong terminology. What i meant was:
> > >
> > > Given a vector of random integers (there may be duplicates), what is
> the
> > > most concise and or efficient way to
> > > generate a list of the numbers along with the sum of all combinations
> of
> > > the numbers in a single vector? How about the     products of all
> > > combinations?
> > >
> > > Skip Cave
> > > Cave Consulting LLC
> > >
> > > On Mon, Oct 2, 2017 at 1:51 PM, Raul Miller <[email protected]>
> > wrote:
> > >
> > >> Prime factors of an integer are not, in the general case, a set. And
> > >> you really should be careful to avoid specifying a set when what you
> > >> want is not a set.
> > >>
> > >> You might be interested in
> > >> https://rosettacode.org/wiki/Factors_of_an_integer#J ?
> > >>
> > >> That said, refinement is an important part of the specification
> > >> process, so - since it seems you were looking for something different
> > >> - maybe it's worth redoing the specification?
> > >>
> > >> Thanks,
> > >>
> > >> --
> > >> Raul
> > >>
> > >>
> > >> On Mon, Oct 2, 2017 at 2:09 PM, Skip Cave <[email protected]>
> > wrote:
> > >> > My original approach was even more naive than Marc's:
> > >> >
> > >> > NB. from       Roger Hui's Combinations essay on the J website:
> > >> > https://goo.gl/WL4nXn
> > >> >
> > >> > c=: ((= +/"1) |.@:I.@# ]) #:@i.@(2&^)         NB. Roger called this
> > >> 'comb2'
> > >> >
> > >> > NB. I used this definition because I could cut & paste one line, and
> > not
> > >> > require an editor
> > >> >
> > >> >         a =. 2 2 5 5
> > >> >
> > >> > ~.(*/"1(4 c 4){a),(*/"1(3 c 4){a),(*/"1(2 c 4){a),, |:(1 c 4){a
> > >> >
> > >> > 100 20 50 4 10 25 2 5
> > >> >
> > >> >
> > >> > I like to sort it:
> > >> >
> > >> >         /:~~.(*/"1(4 c 4){a),(*/"1(3 c 4){a),(*/"1(2 c 4){a),, |:(1
> c
> > 4){a
> > >> >
> > >> > 2 4 5 10 20 25 50 100
> > >> >
> > >> >
> > >> > The final goal of this exercise was to find all the divisors of an
> > >> integer
> > >> > (not just the prime divisors).
> > >> >
> > >> >
> > >> > So you need to find the prime factors of the integer, for example
> 100:
> > >> >
> > >> >
> > >> >         ]a =. q:100
> > >> >
> > >> > 2 2 5 5
> > >> >
> > >> >             /:~~.(*/"1(4 c 4){a),(*/"1(3 c 4){a),(*/"1(2 c 4){a),,
> > |:(1 c
> > >> 4){a
> > >> >
> > >> > 2 4 5 10 20 25 50 100
> > >> >
> > >> >
> > >> > So these are all the divisors of 100.
> > >> >
> > >> >
> > >> > To use Raul's verb, it needs some mods. I can't do the unique until
> > the
> > >> > end, because prime factors of an integer are often duplicated.
> > >> >
> > >> >
> > >> >         F1=:1 :'u@#~ #:@i.@(2^#)'       NB. Here's Raul's verb
> minus
> > the
> > >> initial
> > >> > unique
> > >> >
> > >> > */F1 q:100         NB. we take the product
> > >> >
> > >> > 1 5 5 25 2 10 10 50 2 10 10 50 4 20 20 100
> > >> >
> > >> > ~.*/F1 q:100       NB. Now we take the unique
> > >> >
> > >> > 1 5 25 2 10 50 4 20 100
> > >> >
> > >> > /:~~.*/F1 q:100         NB. Sort it to make it pretty
> > >> >
> > >> > 1 2 4 5 10 20 25 50 100
> > >> >
> > >> >
> > >> > Didn't really need the 1, but Raul likes the empty combination.
> > >> >
> > >> >
> > >> > Now we put it all in one verb:
> > >> >
> > >> >
> > >> >         F2=. /:~~.*/F1 q:
> > >> >
> > >> >         F2 100
> > >> >
> > >> > |length error: F2
> > >> >
> > >> > | F2 100
> > >> >
> > >> >         F2=. /:~~.*/F1 q:]
> > >> >
> > >> >         F2 100
> > >> >
> > >> > |domain error: F2
> > >> >
> > >> > | F2 100
> > >> >
> > >> >
> > >> > So this is above my pay grade. I'll have to stick with my inline
> code:
> > >> >
> > >> >
> > >> >         /:~~.*/F1 q:110
> > >> >
> > >> > 1 2 5 10 11 22 55 110
> > >> >
> > >> >         /:~~.*/F1 q:43
> > >> >
> > >> > 1 43
> > >> >
> > >> >         /:~~.*/F1 q:45
> > >> >
> > >> > 1 3 5 9 15 45
> > >> >
> > >> >         /:~~.*/F1 q:444
> > >> >
> > >> > 1 2 3 4 6 12 37 74 111 148 222 444
> > >> >
> > >> >
> > >> > So I can find all the divisors of an integer.
> > >> >
> > >> >
> > >> > Skip
> > >> >
> > >> >
> > >> >
> > >> >
> > >> >
> > >> >
> > >> > Skip Cave
> > >> > Cave Consulting LLC
> > >> >
> > >> > On Mon, Oct 2, 2017 at 12:15 PM, Marc Simpson <[email protected]>
> > wrote:
> > >> >
> > >> >> More naive than Raul's approach, first pass using the 'stats' lib:
> > >> >>
> > >> >>         a=.2 5 7
> > >> >>         require'stats'
> > >> >>         combv=: ] {~ (comb #@])
> > >> >>         3 combv a
> > >> >> 2 5 7
> > >> >>         2 combv a
> > >> >> 2 5
> > >> >> 2 7
> > >> >> 5 7
> > >> >>         1 combv a
> > >> >> 2
> > >> >> 5
> > >> >> 7
> > >> >>         combos=: (1 + i.@#) <@combv"0 1 ]
> > >> >>         combos a
> > >> >> ┌─┬───┬─────┐
> > >> >> │2│2 5│2 5 7│
> > >> >> │5│2 7│           │
> > >> >> │7│5 7│           │
> > >> >> └─┴───┴─────┘
> > >> >>         f=: 1 : ';u/"1 each combos y'
> > >> >>         +f a
> > >> >> 2 5 7 7 9 12 14
> > >> >>         *f a
> > >> >> 2 5 7 10 14 35 70
> > >> >>
> > >> >> /M
> > >> >>
> > >> >> On Mon, Oct 2, 2017 at 10:06 AM, Raul Miller <
> [email protected]>
> > >> >> wrote:
> > >> >> > For a first effort, I would go with
> > >> >> >
> > >> >> >         F=:1 :'(u@#~ #:@i.@(2^#))@~.'
> > >> >> >         f=: /F
> > >> >> >
> > >> >> > Hopefully that makes the issues obvious - the specification here
> > calls
> > >> >> > for a result which grows exponentially with the size of the
> > argument
> > >> >> > set.
> > >> >> >
> > >> >> > Also:
> > >> >> >
> > >> >> > The ~. might be extra work, but for typical cases the effort of
> > >> >> > ensuring that the argument is a set is trivial compared to the
> > effort
> > >> >> > of constructing the result.
> > >> >> >
> > >> >> > You did not include the empty combination in your example
> results,
> > but
> > >> >> > given your specification my initial inclination is to treat that
> > as an
> > >> >> > oversight.
> > >> >> >
> > >> >> > I defined F instead of going straight for f because for testing
> > >> >> > purposes I want to be able to do (<F a), and perhaps similar
> > things.
> > >> >> >
> > >> >> > Thanks,
> > >> >> >
> > >> >> > --
> > >> >> > Raul
> > >> >> >
> > >> >> >
> > >> >> > On Mon, Oct 2, 2017 at 12:49 PM, Skip Cave <
> > [email protected]>
> > >> >> wrote:
> > >> >> >> Given a set of integers, what is the most concise and or
> efficient
> > >> way
> > >> >> to
> > >> >> >> list the numbers along with the sum of all combinations of the
> > >> numbers?
> > >> >> the
> > >> >> >> products of all combinations?
> > >> >> >>
> > >> >> >> for example:
> > >> >> >>
> > >> >> >> a =. 2 5 7
> > >> >> >> + f a         NB. 2, 5, 7, (2+5), (2+7), (5+7), (2+5+7)
> > >> >> >> 2 5 7 7 9 12 14
> > >> >> >>
> > >> >> >> * f a         NB. 2, 5, 7, (2*5), (2*7), (5*7), (2*5*7)
> > >> >> >> 2 5 7 10 14 35 70
> > >> >> >>
> > >> >> >> The function 'f' should work for any verb and any size right
> > argument
> > >> >> noun
> > >> >> >> vector.
> > >> >> >>
> > >> >> >> Skip
> > >> >> >>
> > >> >> >> Skip Cave
> > >> >> >> Cave Consulting LLC
> > >> >> >> ------------------------------------------------------------
> > >> ----------
> > >> >> >> 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
> >
> ----------------------------------------------------------------------
> 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