double MothurFisher::lnbico(double n, double k){ try { return(lnfact(n)-lnfact(k)-lnfact(n-k)); }catch(exception& e) { m->errorOut(e, "MothurFisher", "lnbico"); exit(1); } }
static gdouble wigner (guint l, gint m1, gint m2, gdouble beta) { gdouble ret = 0.; gint l_m_m1, l_p_m1, l_m_m2, l_p_m2, m1_m_m2; gint k, kmin, kmax; gdouble cb2, sb2, a; g_assert (ABS (m1) <= ((gint) l)); g_assert (ABS (m2) <= ((gint) l)); l_m_m1 = l - m1; l_p_m1 = l + m1; l_m_m2 = l - m2; l_p_m2 = l + m2; m1_m_m2 = m1 - m2; kmin = MAX (0, -m1_m_m2); kmax = MIN (l_m_m1, l_p_m2); if (kmin > kmax) return ret; aran_coefficient_bufferd_require (_lnfact, 2*l); a = (lnfact (l_p_m1) + lnfact (l_m_m1) + lnfact (l_p_m2) + lnfact (l_m_m2)) * 0.5; cb2 = cos (beta * 0.5); sb2 = sin (beta * 0.5); for (k = kmin; k <= kmax; k++) { gdouble b = lnfact (k) + lnfact (l_m_m1 - k) + lnfact (l_p_m2 - k) + lnfact (m1_m_m2 + k); gdouble c = pow (cb2, l_m_m1 + l_p_m2 - 2 * k); gdouble d = pow (sb2, m1_m_m2 + 2 * k); ret += PHASE (m1_m_m2 + k) * exp (a - b) * c * d; } return ret; }
double lnbico(int n, int k) { return lnfact(n) - lnfact(k) - lnfact(n-k); }
double bico(int n, int k) { return floor(0.5 + exp(lnfact(n) - lnfact(k) - lnfact(n-k))); }
float_t lnmultinomial::lnmultinomcoef(const count_t *s){ return lnfact(s[0]+s[1]+s[2]+s[3])-lnfact(s[0])-lnfact(s[1])-lnfact(s[2])-lnfact(s[3]); }