function log_binom_prob(f, n, m, p, i) { # log of the probability of obtaining "m" hits in "n" independent # trials, when the probability of a hit is "f". if (m > n-m) { m = n-m; } if ((n,m) in log_comb) { p = log_comb[n,m]; } else { p = 0; for(i=1; i<=m; i++) { p += log((n-m+i)/i); } log_comb[n,m] = p; } return(p + m*log(f) + (n-m)*log(1-f)); } function log_max_binom_prob(f, n, m,p0,p1) { # log of the maximum probability of any outcome of # "n" trials with probability "f". m = int(f*n); if (m >= n) { error("bad rounding"); } p0 = log_binom_prob(f, n, m); p1 = log_binom_prob(f, n, m+1); return (p0 > p1 ? p0 : p1); }