double dirmult(double *pp, int *aa, int len) { int t, i, m ; double y1, y2, ysum ; double top, bot ; m = len ; t = intsum(aa,m) ; if (t < 1) return 0.0 ; top = bot = 0.0 ; ysum = asum(pp,m) ; for (i=0; i<m; i++) { top += lgamma(pp[i] + (double) aa[i]) ; bot += lgamma(pp[i]) ; } top += lgamma(ysum) ; bot += lgamma(ysum + (double) t) ; y1 = top-bot ; return y1 -y2 ; }
int dekodeitb(int *xx, int kode, int len, int base) { int i, t ; t = kode ; for (i=len-1; i>=0; --i) { xx[i] = t % base ; t /= base ; } return intsum(xx, len) ; // weight }
int dekodeitbb(int *xx, int kode, int len, int *baselist) { // return weight int i, t, base ; t = kode ; for (i=len-1; i>=0; --i) { base = baselist[i] ; xx[i] = t % base ; t /= base ; } return intsum(xx, len) ; }
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 ; }