Goldberg Variationen

*To*: mathgroup at smc.vnet.net*Subject*: [mg4015] Goldberg Variationen*From*: Vandemoortele CC Group R&D Center <wouter.meeussen.vdmcc at vandemoortele.be>*Date*: Mon, 20 May 1996 02:12:34 -0400*Sender*: owner-wri-mathgroup at wolfram.com

>In article <4menll$jva at dragonfly.wolfram.com>, >Jack Goldberg <jackgold at admin.lsa.umich.edu> wrote: >Hello Mma users, > >... I need to write the trinomial expansion >out in terms of Sum. Something like this: > >tri[a_,b_,c_,n_] := Sum[Multinomial[i,j,k]*a^i*b^j*c*k, ???] >where i+j+k = n. (Multinomial is a built-in function.) > >The problem is with the iterator(s). The condition i+j+k = n >is causing me great difficulty. What would be nice is a solution >that works in the general multinomial case, but perhaps that is asking >too much - I would be happy for the trinomial expansion. > >The more general issue here is this: Many sums in mathematics (most >more important than the above trivial problem) are indexed over more >complicated sets than allowed by the syntax of Sum. For example, >open any book on number theory - I opened my copy of An Introduction >To The Theory of Numbers, I. Niven et. al. - and found the Mobius >inversion formula, pg 194, part >of which reads (subject to the limitation of my keyboard) > >The sum over all divisors d of n of the product of >mu(d)*F(n/d) ... > >Instead of having to recast this remarkable formula into terms >understandable by Sum, wouldn't it be nice to have the set over >which the sum is taken be given as the iterator. Then my trinomial >problem would be solved like this: > >tri[a_,b_,c_,n_] := Sum["as above", {i+j+k=n}] > >Your thoughts are more than welcome! and Dave Wagner answered: >The most general solution to the problem is to write a function that >generates a list of all of the indices, map the summand over the list >(the summand has to be converted to a pure function first), and >then apply Plus to the result. The generator function would be different >for every special sum, but the rest could be automated. For example, >you could make a new definition for Sum[summand_Function, generator_], >in which the first argument is the summand and the second argument >is the index-set generator function. The definition would be >*something* like this (untested!): > > Sum[summand_Function, generator_] := > Plus @@ summand /@ generator[] > >For the multinomial problem, you might use: > > Sum[ Times @@ {a,b,c}^# &, f] > >where f is a suitable function from DiscreteMath`Combinatorics` that >generates a list of the indices. The result should be a list of >triples {i, j, k}. > >I don't have time to work out the details, but you asked for my >thoughts, and those are them. > Elementary, my dear Watson... so I took a look in 'The Book' pg 133 and found no suitable function from DiscreteMath`Combinatorics` that generates a list of the indices. next I looked in 'The Guide to Standard Mma Packages' and again came up blank. so, not being a mathematician but a chemist, I fiddled around with this beautiful gem of a problem, and came up with a 'messy chemists' workaround : the list of indices for a general case with r variables is: n=3; r=3; indic=i/@Range[r]; DeleteCases[ Table[indic , Evaluate[Sequence@@Map[{#,0,n}& , indic]]]~Flatten~(r-1), a_/;Plus@@a !=n] this produces: {{0, 0, 3}, {0, 1, 2}, {0, 2, 1}, {0, 3, 0}, {1, 0, 2}, {1, 1, 1}, {1, 2, 0}, {2, 0, 1}, {2, 1, 0}, {3, 0, 0}} Of course, generaly, n and r need not be equal. I dare (sorry, read: 'invite') you mathematicians out there, to demonstrate us how it should be done properly... If anyone out there could come up with a 'elegant' method, not by first generating all combinations and then leaving out the bad ones, I would be interested to know how (and how it was found). The beauty of the problem (hence forward known as 'Goldberg Variations') deserves it. Wouter. ==== [MESSAGE SEPARATOR] ====