double loghprob(int n, int a, int m, int k) // http://www.math.uah.edu/stat/urn/Hypergeometric.xhtml { /** n balls a black. Pick m without replacement return log prob (k black) */ double ytop, ybot ; if (k<0) return -1.0e30 ; if (k>a) return -1.0e30 ; if (k>m) return -1.0e30 ; if ((m-k)>(n-a)) return -1.0e30 ; ytop = logbino(a, k) + logbino(n-a, m-k) ; ybot = logbino(n, m) ; return ytop - ybot ; }
double logmultinom(int *cc, int n) /* log multinomial */ { int t, k, i ; double y, ytot ; if (n<=1) return 0.0 ; t = intsum(cc, n) ; if (t==0) return 0.0 ; ytot = 0 ; for (i=0; i<n-1; i++) { k = cc[i] ; y = logbino(t,k) ; ytot += y ; t -= k ; } return ytot ; }