function EbTraC(N,E) {
	var A=EbTraO(N,E) ;
	var T=A*(1-E) ;
	return (T)
}	

function EbTraO(N,E) {
	var A=(N/(1-E)) ;
	var f=1 ;
	while ((E-f)>0.000005 | (f-E)>0.000005) {
		f=EbPP(N,A) ;
		A-=(A*(f-E)/(f*(N+1-A*f)-E)) }
	return (A)
}

function EbPP(N,A) {
	var E=1 ;
	for (var i = 1; i <= N; i++) {
		E=A*E/(i+A*E) }
	return (E)
}

function EbCtos(A,E) {
	var F=1 ;
	var N=0 ;
	while (F>E) {
		N++ ;
		F=A*F/(N+A*F)	}
	return (N)
}

function EbCurOf(N,T) {
	var A=T ;
	var E=(5*T-4*N+30)/(2*N+50) ;
	if (E<0) {E=0}
	while ((A*(1-E)-T)>0.02 | (A*(1-E)-T)<-0.02) {
		A=T/(1-E)
		E=EbPP(N,A) }
	return (A)
}

function EcTra(N,E) {
	var TraCount;
	TraCount=0.05;
	while (EcPP(N,TraCount)<E)
		{TraCount=TraCount+0.05;}
	return TraCount-0.05;
}

function EcCtos(A,E) {
	var CtosCount;
	CtosCount=1;
	while (EcPP(CtosCount,A)>E) {CtosCount++;}
	return CtosCount;
}

function EcPP(N,A) {
	var carrega,Eb;
	if (A>0) 
		{carrega=A/N;
		Eb=EbPP(N,A);
		return (Eb/(1-carrega*(1-Eb)));}
	else {return 0;}
}

function Ebgen(N,E,A) {
	var f=EbPP(N,A) ;
	var B=A ;
	while (f<E)  {
		B+=0.1 ;
		f=EbPP(N,B) ;
	}
	while (f>E)  {
		B-=0.1 ;
		f=EbPP(N,B) ;
	}
	return (B)
}
function EngsetA(N,P,U) {
	var diferencia=1 ;
	var Apre=EbTraO(N,P) ;
	var alfa=alfaFun(Apre/U,P) ;
	var alfactor=1.0001 ;
	var alfap=alfa*alfactor ;
	var alfaNou ;
	for (var contador=0 ; diferencia> 1e-8 & contador<100 ; contador++) {
		temp=(Bfuncio(alfa,N,U)-P)/(Bfuncio(alfap,N,U)-P) ;
		alfaNou=(alfa-alfap*temp)/(1-temp) ;
		if (Math.abs(1-temp)>9.9999999999999998e-13) {alfaNou=(alfa-alfap*temp)/(1-temp)}
		else {alfaNou=10*Math.random()}
		diferencia=Math.abs(alfa-alfaNou)/alfa ;
		if (alfaNou<=2*alfa) {
			if (alfaNou>=alfa/3) {alfa=alfaNou}
			else {alfa=alfa/3}
		}
		else {alfa=2*alfa}
		alfap=alfa*alfactor ;
	}
	Apre=TasaFun(alfa,N,U)*U ;
	return (Apre)
}

function EngsetP(N,T,U) {
	var tasa = T/U ;
	var diferencia = 1 ;
	var P=-1 ;
	var alfa=0.29999999999999999 ;
	var alfactor=1.0001 ;
	var alfap = alfa*alfactor ;
	var alfaNou ;
	var contador=0 ;
	while (contador<100 & diferencia > 1e-8 ) {
		contador++ ;
		temp = (TasaFun(alfa,N,U)-tasa)/(TasaFun(alfap,N,U)-tasa) ;
		if (Math.abs(1-temp)>9.9999999999999999e-13) {alfaNou=(alfa-alfap*temp)/(1-temp)}
		else {alfaNou=Math.random()}
		diferencia=Math.abs(alfa-alfaNou)/alfa ;
		if (alfaNou<=2*alfa) {
			if (alfaNou>=alfa/3) {alfa=alfaNou}
			else {alfa=alfa/3}
		}
		else {alfa=2*alfa}
		alfap=alfa*alfactor ;
	}
	P=Bfuncio(alfa,N,U) ;
	return (P)
}

function EngsetC(A,P,U) {
	var Tasa=A/U ;
	var N=EbCtos(A,P) ;
	var Npre = 32768 ;
	var Ninter = 99999 ;
	var Bnou = 1 ;
	var alfa = alfaFun(Tasa,P) ;
	var contador = 0 ;
	var Bpre ;
	while (++contador<100) {
		Bpre = Bnou ;
		Bnou = Bfuncio(alfa,N,U) ;
		if (Bnou < P ) {
			Npre = N ;
			N-- ;
			continue ;
		}
		if (Bpre < P) {break;}
		if (N > 32767) {
			N=32767 ;
			Tasa = EbTraO(N,P)/U ;
			alfa = alfaFun(Tasa,P) ;
		}
		else { N += 10 }
	}
	if (contador >= 100) {Ninter=0}
	else {
		Ninter=Math.round(N+(Bnou-P)/(Bnou-Bpre)+0.5) ;
	}
	return (Ninter)
}

function Bfuncio(alfa,N,U) {
	var P=0 ;
	if (U>N) {
		var J=1 ;
		for (var i=1  ; i<=N ; i++) {
			J = 1+i/alfa/(U-i)*J ;
		}
		P=1/J ;
	}
	return (P)
}
	

function alfaFun(Tasa,P) {
	var alfa=Tasa/(1-Tasa*(1-P)) ;
	if (alfa<Tasa) {alfa=Tasa} ;
	return (alfa)
}

function TasaFun(alfa,N,U) {
	var denom = alfa * (1-Bfuncio(alfa,N,U))+1 ;
	return (alfa/denom)
}

