package utilities;

import java.awt.*;

public class NumRecipes {
	private static final double cof[] = {76.18009172947146, -86.50532032941677,
										  24.01409824083091, -1.231739572450155,
										  0.1208650973866179e-2,-0.5395239384953e-5};
	private static float a[] = new float[101];
	
	public static float factln(int n) {
		if (n<0) return 0;
		if (n <= 1) return 0;
		if (n<=100) {
			if (a[n] != 0) return a[n];
			else {
				a[n] = gammaln((float)(n+1.0));
				return (float)(a[n]);
			}
		}
		else 
			return gammaln((float)(n+1.0));
	}
	
	public static float gammaln(float xx) {
		double x,y,tmp,ser;
		int j;
		y=x=xx;
		tmp = x+5.5;
		tmp -= (x+0.5)*Math.log(tmp);
		ser=1.000000000190015;
		for (j=0;j<=5;j++) ser+=cof[j]/++y;
		return (float)(-tmp+Math.log(2.5066282746310005*ser/x));
	}
	
	public static float bico(int n, int k) {
		return (float)(Math.floor(0.5+Math.exp(factln(n)-factln(k)-factln(n-k))));
	}
		
}