double binomtail(int n, int t, double p, char c) { /** c = '+': P(S>=t) c = '-': P(S<t) WARNING <= t use binomtail(n, t+1, ... */ double *bindis ; double val ; ZALLOC(bindis, n+1, double) ; genlogbin(bindis, n, p) ; vexp(bindis, bindis, n+1) ; if (c=='+') val = asum(bindis+t, n-t+1) ; else val = asum(bindis, t) ; free(bindis) ; return val ; }
double binlogtail(int n, int t, double p, char c) { double *bindis ; double val, base ; ZALLOC(bindis, n+1, double) ; genlogbin(bindis, n, p) ; base = bindis[t] ; vsp(bindis, bindis, -base, n+1) ; if (c=='+') { vexp(bindis+t, bindis+t, n-t+1) ; val = asum(bindis+t, n-t+1) ; } else { vexp(bindis, bindis, t) ; val = asum(bindis, t) ; } free(bindis) ; return (log(val) + base) ; }
int main() { double p, val ; int n, t, c, i ; char str[MAXS] ; char line[MAXS] ; char *spt[MAXFIELD] ; int nsplit ; double *a ; while (fgets(line,MAXS,stdin) != NULL) { nsplit = splitup(line, spt, MAXFIELD) ; n = atoi(spt[0]) ; p = atof(spt[1]) ; freeup(spt, nsplit) ; if ((p<=0.0) || (p>=1.0)) fatalx("bad line %s\n",line) ; ZALLOC(a, n+1, double) ; genlogbin(a, n, p) ; vexp(a, a, n+1) ; for (i=0; i<=n; i++) { printf("%3d %15.9f\n",i, a[i]) ; } } }