I want to calculate the multinomial coefficient:
where it is satisifed
Sorry to resurrect an old post, but for future searchers, you should almost certainly just write your multinomial coefficient as a product of binomial coefficients and use a built-in method to compute binomial coefficients (or write your own, either using Pascal's triangle or another method). The relevant formula appears in the first paragraph of the Wikipedia section on multinomial coefficients. (I'd write it here, but there doesn't seem to be a way to render LaTeX.)
Another benefit of this approach is that it's as good as you can possibly get about overflow since the factors are all integers. There's no intrinsic need to divide when computing multinomial coefficients.
using the tip provided by @jemidiah,
and here is the code
function c = multicoeff (k),
c = 1;
for i=1:length(k),
c = c* bincoeff(sum(k(1:i)),k(i));
end;
end
and some usage examples:
octave:88> multicoeff([2 2 2])
ans = 90
octave:89> factorial(6)/(factorial(2)*factorial(2)*factorial(2))
ans = 90
octave:90> multicoeff([5 4 3])
ans = 27720
octave:91> factorial(12)/(factorial(5)*factorial(4)*factorial(3))
ans = 27720
Another approach is to use Yannis Manolopoulos iterative method.
Suppose we have a vector k
with the multinomial entries.
function N = multicoeff (k),
n=sum(k);
[_,imax]=max(k);
num=[n:-1:n-k(imax)-1];
den=[]; k(imax)=[];
for i=1:length(k), den=[den 1:k(i)]; endfor;
N=prod(num./den);
endfunction
example
octave:2> k = [5 4 3];
octave:3> multicoeff (k)
ans = 27720
Reference: Yannis Manolopoulos. Binomial coefficient computation. ACM SIGCSE Bulletin, 34(4):65, December 2002. doi: 10.1145/820127.820168. URL https: //doi.org/10.1145/820127.820168.
Why not use this? It's fast and doesn't suffer from overflow:
N = prod([1:n]./[1:n0 1:n1 1:n2]);