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);
}