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
