#include <ncbi.h>
#include <gishlib.h>

/*
	Return the number of distinct ways to sample k items without
	respect to their order from a population of size n.  "N take K"
*/
double LIBCALL
fct_ntakek(n, k)
	unsigned long	n, k;
{
	if (k > n)
		return 0;
	switch (n - k) {
	case 0:
		return 1;
	case 1:
		return n;
	case 2:
		return (double)n * (n-1) / 2.;
	case 3:
		return (double)n * (n-1) * (n-2) / 6.;
	case 4:
		return (double)n * (n-1) * (n-2) * (n-3) / 24.;
	default:
		if (n < 64)
			return fct_factorial(n) / fct_factorial(k) / fct_factorial(n-k);
		else
			return floor(0.5 + exp(fct_gammln(n) - fct_gammln(k) - fct_gammln(n-k)));
	}
}

