MathGroup Archive 2006

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Multinomial coefficients evaluation

  • To: mathgroup at smc.vnet.net
  • Subject: [mg68133] Re: [mg68105] Multinomial coefficients evaluation
  • From: Daniel Lichtblau <danl at wolfram.com>
  • Date: Tue, 25 Jul 2006 04:01:32 -0400 (EDT)
  • References: <200607240455.AAA25326@smc.vnet.net>
  • Sender: owner-wri-mathgroup at wolfram.com

Michal Kvasnicka wrote:
> Why is  function Multinomial so slower than its direct definition??? See
> attached notebook with three equivalent ways of the simple multinomial 
> series expansion.
> 
> Michal Kvasnicka

It isn't.

What you had, slightly altered for readability and checking of results:

n = 100;

Timing[s1 = Sum[Multinomial[n1,n2,n3]*a1^n1*a2^n2*a3^n3 /.
   n3 -> n-n1-n2, {n1,0,n}, {n2,0,n-n1}];]

Timing[s2 = Sum[((n1+n2+n3)!/(n1!*n2!*n3!))*a1^n1*a2^n2*a3^n3 /.
   n3 -> n-n1-n2, {n1,0,n}, {n2,0,n-n1}];]

Timing[s3 = Expand[(a1 + a2 + a3)^n];]

On my machine these take about 2.5, 0.42, and 0.04 seconds respectively. 
The last is quite fast among other reasons because Expand is free to 
take variouas steps that avoid the Mathematica evaluator for Plus.

The real question is why the second is substantially faster than the 
first. The speed bump is in evaluation Multinomial[n1,n2,n3] for 
symbolic n3. Direct multinomial expansion, avoiding excess symbolic 
evaluations, would be along the lines below.

In[5]:= Timing[s1 =
   Sum[Multinomial[n1,n2,n-n1-n2]*a1^n1*a2^n2*a3^(n-n1-n2),
   {n1,0,n}, {n2,0,n-n1}];]

Out[5]= {0.140009, Null}

In[6]:= Timing[s2 =
   Sum[(n!/(n1!*n2!*(n-n1-n2)!))*a1^n1*a2^n2*a3^(n-n1-n2),
   {n1,0,n}, {n2,0,n-n1}];]

Out[6]= {0.15601, Null}

In[7]:= s1===s2

Out[7]= True


Daniel Lichtblau
Wolfram Research


  • Prev by Date: Using methods from packages
  • Next by Date: Re: word
  • Previous by thread: Multinomial coefficients evaluation
  • Next by thread: Re: Multinomial coefficients evaluation