function digit(wert,digits)
  { return Math.round(wert*Math.pow(10,digits))/Math.pow(10,digits);}

function resetbutton(wert)
  {
     switch(wert)
	 {
	 case 1:
           parent.haupt.document.calcform.elements[2].value=""; 
           parent.haupt.document.calcform.elements[1].value="x->F(x)";
     break;
	 case 2:
	       parent.haupt.document.calcform.elements[0].value=""; 
		   parent.haupt.document.calcform.elements[1].value="x<-F(x)";
     break;
     case 3:
		   parent.haupt.document.calcform.elements[1].value="       ";
     break;
	 case 4:
	 	   parent.haupt.document.calcform.elements[2].value="";
           parent.haupt.document.calcform.elements[3].value="";
     break;
	 case 5:
	 	   parent.haupt.document.calcform.elements[0].value="Type here";
	 break;
     }
  }

function ueberpruefe(dis)
    {
	 var anzahl=eval(document.randomform.elements[1].value);
	 var kw=new Array(10);
	 kw[0]=2000;
	 kw[1]=500;
	 kw[2]=2000;
	 kw[3]=2000;
	 kw[4]=500;
	 kw[5]=500;
	 kw[8]=2000;
	 weiter=true;
	 if (anzahl>kw[dis-1])
	     {weiter=confirm("This lasts too long! Continue with "+kw[dis-1]+"?");
		 if (weiter==true)
		 {document.randomform.elements[1].value=kw[dis-1];}}
	 if (weiter==true)
	   randomnumbers(dis);
	 }
   
function berechne(dis)
{   
    var dummyeingabe=0;
	pzahl=document.eingabeform.length;
	eingabekorrekt=true;
    var pm=new Array(pzahl-1);
	for (i=0;i<=pzahl-1;i++){
	pm[i]=eval(document.eingabeform.elements[i].value);
	if (String(pm[i])!=String(document.eingabeform.elements[i].value))
	   document.eingabeform.elements[i].value=pm[i];
	}   
	   
    if ((document.calcform.elements[2].value=="")&(document.calcform.elements[0].value!=""))
     {
	  document.calcform.elements[0].value=eval(document.calcform.elements[0].value);
	  xwert=document.calcform.elements[0].value;
	  if (isNaN(xwert)==false)
	  {
	  switch(dis)
	  {
	  case 1: var dummy=normalv(xwert,pm[0],pm[1]);break;
	  case 2: var dummy=gammav(xwert,pm[0],pm[1]); break;
	  case 3: var dummy=expov(xwert,pm[0],pm[1]);  break;
	  case 4: var dummy=tv(xwert,pm[0],pm[1]);     break;
	  case 5: var dummy=chiv(xwert,pm[0],pm[1]);   break;
	  case 6: var dummy=fv(xwert,pm[0],pm[1]);     break;
	  case 7: var dummy=binomd(pm[0],pm[1],xwert);
	          var dummy2=binomv(pm[0],pm[1],xwert); break;
	  case 8: var dummy=negbind(pm[0],pm[1],xwert);
	          var dummy2=negbinv(pm[0],pm[1],xwert); break;
	  case 9: var dummy=geod(pm[0],xwert);
	          var dummy2=geov(pm[0],xwert); break;
	  case 10: var dummy=poid(pm[0],xwert);
	          var dummy2=poiv(pm[0],xwert); break;
      case 11: var dummy=hypd(pm[0],pm[1],pm[2],xwert);
	          var dummy2=hypv(pm[0],pm[1],pm[2],xwert); break;	  
	  }
      if (isNaN(dummy)==false)
        document.calcform.elements[2].value=digit(dummy,parent.auswahl.document.digitform.digitknopf.value);
      if (isNaN(dummy)==true)
      document.calcform.elements[2].value=dummy;
	  if (dis>=7)
	  {if (isNaN(dummy2)==false)
	          document.calcform.elements[3].value=digit(dummy2,parent.auswahl.document.digitform.digitknopf.value);
	        if (isNaN(dummy2)==true)
      document.calcform.elements[3].value=dummy2;
	   }
      }
	 }
    
	if ((document.calcform.elements[0].value=="")&(document.calcform.elements[2].value!=""))
	{
	document.calcform.elements[2].value=eval(document.calcform.elements[2].value);
	ywert=document.calcform.elements[2].value;
	if (isNaN(ywert)==false)
	{
	switch(dis)
		  {
		  case 1: var dummy=invnormalv(ywert,pm[0],pm[1]); break;
		  case 2: var dummy=invgammav(ywert,pm[0],pm[1]);  break;
		  case 3: var dummy=invexpov(ywert,pm[0]);     	 break;
		  case 4: var dummy=invtv(ywert,pm[0]);		  break;
		  case 5: var dummy=invchiv(ywert,pm[0]);		  break;
		  case 6: var dummy=invfv(ywert,pm[0],pm[1]);   break;
	  }
      if (isNaN(dummy)==false)
      document.calcform.elements[0].value=digit(dummy,parent.auswahl.document.digitform.digitknopf.value);
      if (isNaN(dummy)==true)
      document.calcform.elements[0].value=dummy;
     }
  	}
	
  }


function tabelle(dis)
  {
    var dig=parent.auswahl.document.digitform.digitknopf.value;
    ntab=open("","table","scrollbars=yes,toolbar=no,directories=no,menubar=yes");
	switch(dis)
	{case 1: {dname='Normal';break}
	 case 2: {dname='Gamma';break}
	 case 3: {dname='Exponential';break}
	 case 4: {dname='t';break}
	 case 5: {dname='Chi Square';break}
	 case 6: {dname='F';break}
	 case 7: {dname='Binomial';break}
	 case 8: {dname='Negative Binomial';break}
	 case 9: {dname='Geometric';break}
	 case 10: {dname='Poisson';break}
	 case 11: {dname='Hypergeometric';break}
	}
	var pzahl=document.eingabeform.length;
	var pm=new Array(pzahl-1);
	for (i=0;i<=pzahl-1;i++)
	pm[i]=eval(document.eingabeform.elements[i].value);
	
	
	if ((dis==4)||(dis==5)||(dis==6)||(dis==7)||(dis==8)||(dis==11))
	pm[0]=Math.round(pm[0]);
    if ((dis==6)||(dis==11))
	pm[1]=Math.round(pm[1]);
	if ((dis==11))
	pm[2]=Math.round(pm[2]);
	with(ntab.document)
	{
    clear();
	write("<html><head><title>"+dname+" Distribution</title></head><body bgcolor=#FFFFFF>");
    write("<h5>Copyright by <a href='http://www.alewand.de'>Dr. Achim Lewandowski</a> (http://www.alewand.de)</h5>");
    write("<form><input type=button value='Close' onclick='window.close()'>");
    writeln(" <input type=button value='Print' onclick='window.print()'></form>");
	write("<h3>"+dname+" Distribution</h3>");
    write("<p>The table gives the cumulative distribution function of a "+dname+"(");
	for (i=0;i<=pzahl-2;i++)
	write(pm[i]+",");
	write(pm[pzahl-1]+")-distributed random variable.</p>");
	if (dis<=6)
	{var xu=eval(document.tableform.elements[1].value);
    var xo=eval(document.tableform.elements[2].value);
    var step=eval(document.tableform.elements[3].value);}
	else
	{var xu=Math.ceil(eval(document.tableform.elements[1].value));
	var xo=Math.floor(eval(document.tableform.elements[2].value));
	var step=1;};
    var x=xu;
    if (step>0)
    {
     if ((((xo-xu)/step)<=300)&&(xo>xu))
     {
    var iter=(xo-xu)/step;
    var spumbruch=Math.floor(iter/3.5+0.5);
    write("<table border=2 cellpadding=5 cellspacing=2 bordercolor=#0000FF>");
    var zaehl=0;
	while (x<=(xo+1E-7))
       {
    if ((zaehl==0)&&(dis<=6))
        {write("<tr><td valign=top><table cellpadding=0 cellspacing=10><tr><th>x</th><th>F(x)</th>");}
	if ((zaehl==0)&&(dis>6))
        {write("<tr><td valign=top><table cellpadding=0 cellspacing=10><tr><th>k</th><th>f(k)</th><th>F(k)</th>");}	
    if ((Math.floor(zaehl/spumbruch)*spumbruch==zaehl)&&(zaehl>0)&&(dis<=6))
        {write("</table><td valign=top><table cellpadding=0 cellspacing=10><tr><th>x</th><th>F(x)</th>");}
	if ((Math.floor(zaehl/spumbruch)*spumbruch==zaehl)&&(zaehl>0)&&(dis>6))
		{write("</table><td valign=top><table cellpadding=0 cellspacing=10><tr><th>k</th><th>f(k)</th><th>F(k)</th>");}
		
       write("<tr><td align=left>"+digit(x,dig)+"</td>");
	 switch(dis)
	 {case 1: write("<td align=left>"+digit(normalv(x,pm[0],pm[1]),dig)+"</td>");  break;
	  case 2: write("<td align=left>"+digit(gammav(x,pm[0],pm[1]),dig)+"</td>");   break;
	  case 3: write("<td align=left>"+digit(expov(x,pm[0]),dig)+"</td>");	   break;
	  case 4: write("<td align=left>"+digit(tv(x,pm[0]),dig)+"</td>");	   break;
	  case 5: write("<td align=left>"+digit(chiv(x,pm[0]),dig)+"</td>");  break;
	  case 6: write("<td align=left>"+digit(fv(x,pm[0],pm[1]),dig)+"</td>");   break; 
	  case 7: write("<td align=left>"+digit(binomd(pm[0],pm[1],x),dig)+"</td>");
	   write("<td align=left>"+digit(binomv(pm[0],pm[1],x),dig)+"</td>");   break; 
	  case 8: 
	   write("<td align=left>"+digit(negbind(pm[0],pm[1],x),dig)+"</td>");
	   write("<td align=left>"+digit(negbinv(pm[0],pm[1],x),dig)+"</td>");   break; 
	  case 9: 
	   write("<td align=left>"+digit(geod(pm[0],x),dig)+"</td>");
	   write("<td align=left>"+digit(geov(pm[0],x),dig)+"</td>");	   break; 
	  case 10: 
	   write("<td align=left>"+digit(poid(pm[0],x),dig)+"</td>");
	   write("<td align=left>"+digit(poiv(pm[0],x),dig)+"</td>");	   break; 
	  case 11: 
	   write("<td align=left>"+digit(hypd(pm[0],pm[1],pm[2],x),dig)+"</td>");
	   write("<td align=left>"+digit(hypv(pm[0],pm[1],pm[2],x),dig)+"</td>");	  break; 
	 }
	   x+=step;
       zaehl+=1;
        }
     write("</table></table>");
     }
     else write("Too many items (more than 300) or wrong interval!<br>");
     }
     else write("Step size negative!");
     write("</p><br>");
     writeln("</body></html>");
     close();
    }
    }

function randomnumbers(dis)
  {     
        switch(dis)
		{case 1: {dname='Normal';break}
		 case 2: {dname='Gamma';break}
		 case 3: {dname='Exponential';break}
		 case 4: {dname='t';break}
		 case 5: {dname='Chi Square';break}
		 case 6: {dname='F';break}
		 case 7: {dname='Binomial';break}
		 case 8: {dname='Negative Binomial';break}
		 case 9: {dname='Geometric';break}
		 case 10: {dname='Poisson';break}
		 case 11: {dname='Hypergeometric';break}
		}
		
		var pzahl=document.eingabeform.length;
		var pm=new Array(pzahl-1);
		for (i=0;i<=pzahl-1;i++)
		pm[i]=eval(document.eingabeform.elements[i].value);
		
		
		if ((dis==4)||(dis==5)||(dis==6)||(dis==7)||(dis==8)||(dis==11))
		pm[0]=Math.round(pm[0]);
	    if ((dis==6)||(dis==11))
		pm[1]=Math.round(pm[1]);
		if ((dis==11))
    	pm[2]=Math.round(pm[2]);
        ntab=open("","randomnumbers","scrollbars=yes,toolbar=no,directories=yes,menubar=yes");
    	with(ntab.document)
       {
    clear();
    write("<html><head><title>"+dname+" random numbers</title></head><body bgcolor=#FFFFFF>");
    write("<h5>Copyright by <a href='http://www.alewand.de'>Dr. Achim Lewandowski</a> (http://www.alewand.de)</h5>");
    write("<form><input type=button value='Close' onclick='window.close()'></form>");
	writeln("<h2>"+dname+" random numbers</h2>");
	var anzahl=eval(document.randomform.elements[1].value);
    
	write(anzahl+" random numbers of a "+dname+"(");
    
	for (i=0;i<=pzahl-2;i++)
		write(pm[i]+",");
	write(pm[pzahl-1]+")-distributed random variable. Please wait a moment...<br>");
	
	
	if ((dis<=6)||(dis==8)||(dis==9))
	{
	var zufall=new Array(anzahl-1);
	var variance=0;
	var mean=0;
	switch(dis)
	{
	case 1:
	var truemean=pm[0];
	var truesigma=Math.pow(pm[1],2);
	break;
	case 2:
		var truemean=pm[0]*pm[1];
	    var truesigma=pm[0]*Math.pow(pm[1],2);
	break;
	case 3:
		var truemean=1/pm[0];
		var truesigma=Math.pow(1/pm[0],2);
	break;
	case 4:
	    if (pm[0]>1)
		var truemean=0;
		if (pm[0]==1)
		var truemean='Does not exist for n=1';
		if (pm[0]>2)
		var truesigma=pm[0]/(pm[0]-2);
		if (pm[0]<=2)
		var truesigma='Does not exist for n<=2';
	break;
	case 5:
		var truemean=pm[0];
		var truesigma=2*pm[0];
	break;
	case 6:
	    if (pm[1]>2)
				{
				var truemean=pm[1]/(pm[1]-2);
				}
				else
		        var truemean='Does not exist for n2<=2';
	    if (pm[1]>4)
				{
				var truesigma=2*Math.pow(pm[1],2)*(pm[0]+pm[1]-2)/(pm[0]*Math.pow(pm[1]-2,2)*(pm[1]-4));
				}
				else
				var truesigma='Does not exist for n2<=4';
	break;
	case 8:
		  var truemean=pm[0]*(1-pm[1])/pm[1];
		  var truesigma=pm[0]*(1-pm[1])/(pm[1]*pm[1]);
	break;
	case 9:
	  var truemean=(1-pm[0])/pm[0];
	  var truesigma=(1-pm[0])/(pm[0]*pm[0]);
	break;
	}

	var i=0;
	var z=0;
    while (i<anzahl)
       {
	   z=Math.random();
	   switch(dis)
	   {
	   case 1:  z2=Math.random();
               zufall[i]=randomnormal(pm[0],pm[1],z,z2); break;
	   case 2:  zufall[i]=invgammav(z,pm[0],pm[1]); break;
	   case 3:  zufall[i]=invexpov(z,pm[0]);break;
	   case 4:  zufall[i]=invtv(z,pm[0]);break;
	   case 5:  zufall[i]=invchiv(z,pm[0]);break;
	   case 6:  zufall[i]=invfv(z,pm[0],pm[1]);break;
	   case 8: 
	   {zufall[i]=0;
	   for (zz=1;zz<=pm[0];zz++)
	   {z=Math.random();
	   zufall[i]+=Math.floor(Math.log(1-z)/Math.log(1-pm[1]));
	   }
	   };
	   break; 
	   case 9:  zufall[i]=Math.floor(Math.log(1-z)/Math.log(1-pm[0]));break; 
	   }
	   mean+=zufall[i]/anzahl;
	   variance+=Math.pow(zufall[i],2)/anzahl;
       i++; 
	   }
	variance=variance-Math.pow(mean,2);
	writeln("<table>");
	writeln("<td>True Expectation: <td>"+truemean);
	writeln("<td>True Variance: <td>"+truesigma+'<tr>');
	writeln("<td>Empirical Mean: <td>"+mean);
	writeln("<td>Empirical Variance: <td>"+variance);
	writeln("</table>"); 
	if (anzahl>10)
		writeln("<form><textarea rows=15 cols=30 name='rnumbers' wrap=physical readonly>");    
	if (anzahl<=10)
        writeln("<form><textarea rows="+anzahl+" name='rnumbers' wrap=physical readonly>");
    var i=0;
    while (i<anzahl)
	 {
	 writeln(zufall[i]);
	 i++; 
	   }
	writeln("</textarea></form>");   
	writeln("Remember Copy and Paste! Click upper left corner...Scroll down...Shift...Click bottom right");
	}
	
	
	if ((dis>6)&&(dis!=9)&&(dis!=8))
	writeln("<br><br>Will be implemented in a few weeks :-)");
	
    writeln("</body></html>");
    close();
    }
	
	}




 function normalv(xwert,muewert,sigmawert)
 {           x=eval(xwert);
             mue=eval(muewert);
             sigma=eval(sigmawert);   
             if (eval(sigma)<=0) return "Error: Sigma<=0 !";
             if (eval(sigma)>0)
             {  
             var  LTONE = 8;
             var  CON = 1.28;
             var  A1 = 0.398942280444;
	     var  A2 = 0.399903438504;
	     var  A3 = 5.75885480458;
	     var  A4 = 29.8213557808;
	     var  A5 = 2.62433121679;
	     var  A6 = 48.6959930692;
	     var  A7 = 5.92885724438;

	     var  B1 = 0.398942280385;
	     var  B2 = 0.8052E-8;
	     var  B3 = 1.00000615302;
	     var  B4 = 3.98064794E-4;
	     var  B5 = 1.98615381364;
	     var  B6 = 0.151679116635;
	     var  B7 = 5.29330324926;
	     var  B8 = 4.8385912808;
	     var  B9 = 15.1508972451;
	     var  B10= 0.742380924027;
	     var  B11= 30.789933034;
	     var  B12= 3.99019417011;

	var  UTZERO;
        var  Z;
        var  YY;
        var  ALNORM;
        var  DYN;
	var  UP;
	UTZERO = Math.pow(-2 * (Math.log(1.E-300)+1),0.5) - 0.3;
		UP= 0;
		Z = eval((x - mue)/sigma);
		if (Z < 0)
                      { UP = 1;
                        Z = -Z;
                      }
		if ((Z > LTONE) && ((UP==1)|| (Z > UTZERO)))
			ALNORM = 0;
                if ((Z <= LTONE) || ((UP!=1)|| (Z <= UTZERO)))
		      {	yy = 0.5 * Z * Z;
			if (Z <=  CON)
                        { 
                        ALNORM = 0.5 - Z * (A1 - A2 * yy/(yy + A3 - A4/(yy + A5 + A6/(yy + A7))));
			}
			if (Z>CON)
                   	{
                       ALNORM = Math.exp(-yy) * B1;
         		dummy = (Z + B4 + B5/(Z - B6 + B7/(Z + B8 - B9/(Z + B10 + B11/(Z +B12)))));
			ALNORM = ALNORM / (Z - B2 + B3/dummy);
			}
		      }
				

		if (UP==0) DYN = 1-ALNORM;
                if (UP!=0) DYN = ALNORM;
                return DYN 
                }
                }

  function invnormalv(ywert,muewert,sigmawert)
  { 	
       y=eval(ywert);
       mue=eval(muewert);
       sigma=eval(sigmawert);   
       if (eval(sigma)<=0) return "Error: Sigma<=0 !";
       if (eval(sigma)>0)
        {
        var   A0 =   2.50662823884;
	var   A1 = -18.61500062529;
	var   A2 =  41.39119773534;
        var   A3 = -25.44106049637;
        var   B1 =  -8.47351093090;
	var   B2 =  23.08336743743;
	var   B3 = -21.06224101826;
        var   B4 =   3.13082909833;
        var   C0 =  -2.78718931138;
        var   C1 =  -2.29796479134;
	var   C2 =   4.85014127135;
        var   C3 =   2.32121276858;
        var   D1 =   3.54388924762;
	var   D2 =   1.63706781897;
	var P;
        var Q;
        var R;
        var PPND;
        var DXN;				

		P = eval(y);
                if ((P<=0)) return "F(x) too small!";
				if ((P>=1)) return "F(x) too large!";
                if ((P>0) && (P<1)) 
                {
		Q = P - 0.5;
		if (Math.abs(Q) <= 0.42) 
			{
                        R = Q * Q;
			PPND = Q * (((A3*R + A2)*R + A1)*R + A0) / ((((B4*R + B3)*R + B2)*R + B1)*R + 1);
			DXN = PPND;
                        }
		if (Math.abs(Q)>0.42)
                        {
			R = eval(y);
			if (Q > 0)  R = 1 - eval(y);
			R = Math.pow(-Math.log(R),0.5);
			PPND = (((C3*R+C2)*R+C1)*R+C0) / ((D2*R+D1)*R+1);
			if (Q < 0) PPND = -PPND;
			DXN = PPND;
                        }
		return  (DXN *eval(sigma) + eval(mue));
                };
        }}    
 

  function gammav(xwert,alpha,beta)
  {
    var a=eval(alpha);
    var alpha2=a;
    var b=eval(beta);
    var beta2=b;
    var x=eval(xwert);
    if ((a>0) &&(b>0) &&(x>0))
    { 
	  var lg=incgammafunction(a,x/b);
	  return lg;
      
     }
      if ((a>0) &&(b>0) &&(x<=0)) return 0;
      if ((a<=0) ||(b<=0)) return "Error: a and b not positive!";
    } 
  
  function invgammav(ywert,alpha,beta)
     {
	  
      var y=eval(ywert);
      var a=eval(alpha);
      var b=eval(beta);
      var xneu=0;
      var yneu=0;
      var schleife=0;
      if ((a<=0) ||(b<=0)) return "Error: a and b not positive!";
      if ((a>0) &&(b>0))
      {
      if ((y<=0) || (y>=1)) return "Error F(x)!";
      if ((y>0)&&(y<1))
      { 
	  var eps=1E-5*Math.min(y,1-y);
      var xu=0.000000;
      var xo=1;
      var yu=0;
      var yo=gammav(xo,a,b);
      while (yo<=y)
       {xu=xo;
	    yu=yo;
	    xo*=2;
        yo=gammav(xo,a,b);
       }
	  xneu=(xu+xo)/2;
	        yneu=gammav(xneu,a,b);
	        while ((Math.abs(yneu-y)>=eps)&&(schleife<200))
	           { if (yneu>y) xo=xneu;
	             if (yneu<=y) xu=xneu;
	             xneu=(xu+xo)/2;
	             yneu=gammav(xneu,a,b);
	             ++schleife;
         }
	  if(schleife>=200) return "No convergence";
      if (schleife<200) return xneu;
      }
      }
      }
 
 
 
 
 function incgammafunction(a,x)
 {
 eps=1e-12;
 a=eval(a);
 x=eval(x);
 gam = gammln(a+1e-300);
 
 res = x;
 if (x==0) res=0;
 if (a==0) res=1;
 
 
 if ((x<a+1)&&(x>0)&&(a>0))
 {
    var ap = a;
	var summe = 1/ap;
    var d = summe;
	
    while ((Math.abs(d))>=( 10*eps*Math.abs(summe)))
       {
	   ap = ap + 1;
       d = x*d/ ap;
       summe = summe + d;
	  }
   
    res = summe * Math.exp(-x+a*Math.log(x)-gam);
 }
 
 if ((x>=a+1)&&(x>0)&&(a>0))
  {
    a0 = 1;
    a1 = x;
    b0 = 0;
    b1 = a0;
    fac = 1;
    n = 1;
    g = b1;
    gold = b0;
    while ((Math.abs(g-gold))>= (10*eps*Math.abs(g)))
       {
	   gold = g;
       ana = n - a;
       a0 = (a1 + a0 *ana)* fac;
       b0 = (b1 + b0 *ana)* fac;
       anf = n*fac;
       a1 = x* a0 + anf* a1;
       b1 = x* b0 + anf* b1;
       fac = 1/ a1;
       g = b1* fac;
       n = n + 1;
	   }
    res = 1-Math.exp(-x+ a*Math.log(x)-gam) * g;
   }
   return res;
}
 
 
 
 
 
    function expov(xwert,lambda)
  { var la=eval(lambda);
    var x=eval(xwert);
    if (la<=0) return "Error: Lambda negative!";
    if ((la>0)&&(x<=0)) return 0;
    if ((la>0)&&(x>0))
    { var ergeb=1-Math.exp(-la*x);
      return ergeb;
    }
  }

    function invexpov(ywert,lambda)
  { var y=eval(ywert);
    var la=eval(lambda);
    if (la<=0) return "Errorr: Lambda negative!";
    if ((la>0) && ((y<=0)||(y>=1))) return "Error F(x)!";
    if ((la>0) && ((y>0)&&(y<1))) 
     {  var ergeb=-Math.log(1-y)/la;
        return ergeb}
   }

     function tv(xwert,fgrad)
    { var weiter=true;
      var x=eval(xwert);
      var fg=Math.round(eval(fgrad));
     
      if (fg<=0) return "Error: D of F <= 0 !";
      if (fg>0) 
      {

      if (fg>5000)
      {
       weiter=false; 
      } 
      if(weiter==true)
      {
      document.eingabeform.elements[0].value=fg;
      var k3=0;
      var c3=0;
      var a3 = x/Math.pow(fg,0.5);
      var b3 = 1 + Math.pow(a3,2);
      var y  = 0.5;
		if (Math.abs(Math.floor(fg/2)*2-fg)<1E-6)
                        {
		        c3 = a3/(2*Math.pow(b3,0.5));
			k3 = 0;
			}
                if (Math.abs(Math.floor(fg/2)*2-fg)>=1E-6)  		
			{
                        c3 = a3/(b3*Math.PI);
			y  += Math.atan(a3)/Math.PI;
			k3 = 1;
                         }
		if (fg > 1)
                        {k3+=2;
                         y+=c3;
                         c3*=(k3-1)/(k3*b3);
			while (k3<fg)
                        {
                  		k3+=2;
				y  +=c3;
				c3 *= (k3-1)/(k3*b3);
                        }
                        }
                return y;
                }
      }
     if (weiter==false)
        {return normalv(x,0,1);}
     }


     
     function invtv(ywert,fgrad)
     {
	var x=0;
        var a4=0;
        var b4=0;
        var c4=0;
        var d4=0;
        var e4=0;
        var k4=0;
        var yt=0;
        var xn=0;
        var schleife=0;
        var y=eval(ywert);
        var fg=Math.round(eval(fgrad));
        if  (fg<1) return "Error: D of F <= 0 !";
        if (fg>=1)
	if  ((y >= 1)||(y<=0))  return "Error F(x)!";
        if  ((y>0)&&(y<1)) 
                {
                 if (fg>5000) return invnormalv(y,0,1);
                 if (fg<=5000) 
                 {
                 if (fg == 1)	{x = Math.tan(Math.PI * (y-0.5));
                                 return x}
		 if (fg!=1)
                    {   c4 = Math.pow(fg,0.5);
			if (Math.abs(Math.floor(fg/2)*2-fg)<1E-5)
                            {
			    c4 *= 2;
			    k4 = 2;
			    }
                        if (Math.abs(Math.floor(fg/2)*2-fg)>=1E-5)
		            {
			    c4 *=Math.PI;
			    k4 = 1;
			    }
			if (fg >= 3)
			    {while (k4 <= (fg - 2))
                               {c4 *= k4 /(k4+1);
				k4+= 2;
				}
                            }  
			xn = invnormalv(y,0,1);
			a4 = xn*xn;
			x = xn + (a4+1) * xn/(4*fg);
			x +=((5 * a4 + 16) * a4 + 3) * xn/(96 * fg * fg);
			x +=(((3 * a4 + 19) * a4 + 17) * a4 - 15) * xn/(384 *fg * fg * fg); 
			b4 = ((((79 * a4 + 776) * a4 + 1482) * a4 - 1920) * a4 - 945) * xn;
			x += b4/(92160 * Math.pow(fg,4));
              		e4 = y;
                        yt=tv(x,Math.round(fg));
                      	d4 = (yt - e4) * c4 * Math.pow((1 + x * x / fg),(fg+1)/2);
			x -= d4;  
                        var schleife=0;
				while ((Math.abs(d4)>1E-8) &&(schleife<100))
                                     {
					yt = tv(x,Math.round(fg));
					d4 = (yt - e4) * c4 * Math.pow((1 + x * x / fg),(fg+1)/2);
					x -= d4;
                                        ++schleife;
                                     }
			if (schleife>=100) return "No convergence"
                        if (schleife<100) return x;
                        }
                    
         }      
        }
        }



     function chiv(xwert,n)
     {var dummy1=eval(n)/2;
      var x=eval(xwert);
      var dummy3=gammav(x,dummy1,2);
      return dummy3}

     function invchiv(ywert,n)
     {var dummy1=eval(n)/2;
      var y=eval(ywert);
      var dummy3=invgammav(ywert,dummy1,2);
      return dummy3}
   
     function fv(xwert,n1wert,n2wert)
    { var x=eval(xwert);
      if (x<0) x=0;
      var n1=Math.round(eval(n1wert));
      var n2=Math.round(eval(n2wert));
      document.eingabeform.elements[0].value=n1;
      document.eingabeform.elements[1].value=n2;
     if (n1<1) return "Error n1";
     if (n2<1) return "Error n2";
     var xbeta=n2/(n2+n1*x);
     var dummy=1-betai(n2/2,n1/2,xbeta);
     if (dummy>1) return "No convergence"
     if (dummy<=1)return dummy;
     }    

     function lnbeta(r1,r2)
       {return (gammln(r1)+gammln(r2)-gammln(r1+r2));}
         
     function gammln(xx)
       {  xxklein=(xx<1e-9); 
	    if (xxklein==true)
	    dummy=-Math.log(xx);

	 if (xxklein==false)
	 {
	 var stp= 2.50662827465;
        var  x = xx-1.0;
        var  tmp = x+5.5;
         tmp = (x+0.5)*Math.log(tmp)-tmp;
      var  ser = 1.0+76.18009173/(x+1.0)-86.50532033/(x+2.0)+24.01409822/(x+3.0)
            -1.231739516/(x+4.0)+0.120858003e-2/(x+5.0)-0.536382e-5/(x+6.0);
     var dummy= tmp+Math.log(stp*ser);}
     return dummy;
	 
     } 





     function betai(awert,bwert,xwert)
     {  var bt;
        var btwert;
        var a=eval(awert);
        var b=eval(bwert);
        var x=eval(xwert);
        if ((x<0)||(x>1)) return 0;
        if (x==0) return 0;
        if (x==1) return 1;
        if ((x>0)&&(x<1))
         {
          bt=Math.exp(-lnbeta(a,b)+a*Math.log(x)+b*Math.log(1-x));
          if (x<((a+1)/(a+b+2)))
            {btwert= betacf(x,a,b)/a;
             bt*= btwert;
            }
          if (x>=((a+1)/(a+b+2)))
            {btwert=betacf(1-x,b,a)/b;
             bt=1-bt*btwert;
            }
         if (btwert<0) return -111111;
         if (btwert>=0) return bt;
         }          
     }

function betacf(x,a,b)
        {var itmax = 1000;
        var epsilon=3E-7;
	var tem;
        var qap;
        var qam;
        var qab;
        var d;
        var bz;
        var bpp;
        var bp;
        var bm=1;
        var az=1;
        var app;
        var am=1;
        var aold;
        var ap;
        var m=1;
		qab = a+b;
		qap = a+1.0;
		qam = a-1.0;
		bz = 1.0 - qab * x / qap;
        var abbruch=0;
		while ((m<=itmax)&&(abbruch!=1))
			{
                        tem = m + m;
			d= m * (b - m) * x / ((qam + tem) * (a + tem));
			ap = az + d * am;
			bp = bz + d * bm;
			d = -(a + m) * (qab+m) * x / ((a + tem) * (qap + tem));
			app = ap + d * az;
			bpp = bp + d * bz;
			aold = az;
			am = ap / bpp;
			bm = bp / bpp;
			az = app / bpp;
			bz = 1;
			if (Math.abs(az - aold) < (epsilon * Math.abs(az)))  abbruch=1;
                        m+=1; 
                        }
		if (Math.abs(abbruch-1)<1E-5) return az;
                if (Math.abs(abbruch)<1E-5) return -111111;
	}



  	function betainv(alpha,p,q)
        {
	var const1 = 2.30753;
	var const2 = 0.27061;
	var const3 = 0.99229;
	var const4 = 0.04481;
        var epsilon=3E-12;
        var schluss;
	var a;
        var adj;
        var beta;var g; var h; var pp;var prev; var qq;
        var r; var s; var sq; var t; var tx; var w; var y;
        var  yprev; var x; var inde;
		x = alpha;
		if ((alpha <= 0)|| (alpha >= 1)) return "Error!";
                if ((alpha>0)&&(alpha<1))
                {
		if (alpha>=0.5) inde=1;
                if (alpha<0.5) inde=0;
		if (Math.abs(inde-1)<1E-7)
                   { 
			a= 1 - alpha;  pp = q;  qq = p; 
                   }
         if (Math.abs(inde)<1E-7)
                  {
			a = alpha;  pp = p;  qq = q;
		  }

	     r = -2*Math.log(a);
	     r = Math.pow(r,0.5);
             y = r - (const1 + const2 * r) / (1 + (const3 + const4 * r) * r);

             if ((pp > 1)&& (qq > 1)) 
                {	r = (y * y - 3) / 6;
			s = 1 / (pp + pp - 1);
			t = 1 / (qq + qq - 1);
			h = 2 / (s + t);
			w = y * Math.pow((h + r),0.5) / h - (t - s) * (r + 5/6 - 2 / (3 * h));
			x = pp / (pp + qq * Math.exp(w + w)); 
                } 
             if ((pp<=1) ||(qq<=1))
               {	r = pp + qq;  t = 1 / (9 * qq);
			t = r * Math.pow(1 - t + y * Math.pow(t,0.5),3);
                 if (t <= 0) 
 	         {x = 1 - Math.exp((Math.log((1 - a) * qq)+lnbeta(p,q))/qq);} 
                 if (t>0)
                 {t = (4 * pp + r - 2) / t;
                    if (t<=1) 
			x = Math.exp((Math.log(a * pp) + lnbeta(p,q)) / pp);
                    if (t>1)
			x = 1 - 2 / (t + 1);
                  }
                } 
		r = 1 - pp;  t = 1 - qq;  yprev = 0;  sq = 1;  prev = 1;
		if (x < 0.0001) x = 0.0001;
		if (x > 0.9999) x = 0.9999;
                var kont1=1;
                var kont2=1;
                var kont3=1;
                var kont4=1; 
                var kont5=1;
                schluss=0;
                var zaehl=0;  
              while ((schluss<1E-7)&&(zaehl<200)) 
               {
                if ((kont1>0.99999)&&(zaehl<200))
                {
               y = betai(pp,qq,x);
		y = (y - a) * Math.exp(lnbeta(p,q) + r * Math.log(x) +
                                     t * Math.log(1 - x));
		if ((y * yprev) <= 0) prev = sq;
		g = 1;
                }

              if ((kont2>0.99999)&&(zaehl<200))
                {
		adj = g * y;  sq = adj * adj;
                zaehl+=1; 
		if (sq >= prev)  
                 {kont3=0;
                  kont4=1;}
                }
		if ((kont3>0.9999)&&(zaehl<200))
                {
                tx = x - adj;
		if ((tx >= 0) && (tx <= 1)) 
                         {
                          kont4=0;
                          kont5=1}
                }
 
                if ((kont4>0.9999)&&(zaehl<200))
		{g = g / 3;
                 kont1=0;
                 kont2=1;
                 kont3=0;
                 kont4=0;
                 kont5=0;
                 zaehl+=1;
                }
            
                if ((kont5>0.9999)&&(zaehl<200))
                {  
		if (prev <= epsilon)  schluss=1;
		if ((y * y) <= epsilon)  schluss=1;
		if ((tx == 0) || (tx == 1)) 
                {  kont1=0;
                   kont2=0;
                   kont3=0;
                   kont4=1;
                   kont5=1;
                   zaehl+=1;
                }
		if (tx == x)  schluss=1;
		x = tx;
		yprev = y;
                zaehl++;
                kont5=1;
		}
                }
 
		if (Math.abs(1-inde)<1E-7)  x = 1 - x;
                if (zaehl<100) return x;
                if (zaehl>=100) return '-1111111';
                }
}


     function invfv(ywert,n1wert,n2wert)
      { var y=eval(ywert);
      if ((y<=0)||(y>=1)) return "Error F(x)";
      var n1=Math.round(eval(n1wert));
      var n2=Math.round(eval(n2wert));
      document.eingabeform.elements[0].value=n1;
      document.eingabeform.elements[1].value=n2;
     if (n1<1) return "Error n1";
     if (n2<1) return "Error n2";
     var xbeta=betainv(y,n1/2,n2/2);
     if (xbeta<0) return "No convergence!"
     if (xbeta>=0) 
      {
     var dummy=n2/2*xbeta/(n1/2*(1-xbeta));
     return dummy;
      }
     }
	 
	 
	 
	 
	 
	 function binomv(nwert,pwert,kwert)
	      {var n=Math.round(eval(nwert));
		  if (n!=nwert)
	       {document.eingabeform.elements[0].value=n;}
	       var p=eval(pwert);
		  
	       var k=Math.floor(eval(kwert));
		   if (k!=kwert)
	       {document.calcform.elements[0].value=k;}
	       if ((p<=0) || (p>=1)) return "Incorrect p";
	       if (n<=0) return "Incorrect n";
	       if ((0<p) &&(p<1)&&(n>0))
	        { if (k<0) return 0;
	          if (k==0) return Math.exp(n*Math.log(1-p));
	          if (k>=n) return 1;
	          if ((0<k)&&(k<n)) 
	          {var dummy=1-betai(k+1,n-k,p);
	           return dummy}
	        }
	       }
	 
	 
	   function binomd(nwert,pwert,kwert)
	      {var n=Math.round(eval(nwert));
		   if (n!=nwert)
	      { document.eingabeform.elements[0].value=n;}
	       var p=eval(pwert);
		  
	       var k=Math.floor(eval(kwert));
		    if (k!=kwert)
	       {document.calcform.elements[0].value=k;}
	       if ((p<=0) || (p>=1)) return "Incorrect p";
	       if (n<=0) return "Incorrect n";
	       if ((0<p) &&(p<1)&&(n>0))
	        { if (k<0) return 0;
	          if (k==0) return Math.exp(n*Math.log(1-p));
	          if (k>n) return 0;
	          if ((0<k)&&(k<=n)) 
	          {var dummy=gammln(n+1)-gammln(k+1)-gammln(n-k+1)+k*Math.log(p)+(n-k)*
	                         Math.log(1-p);
	           return Math.exp(dummy)}
	        }
	       }
	 
	   function negbinv(rwert,pwert,kwert)
	      {var r=Math.round(eval(rwert));
		   if (r!=rwert)
	      { document.eingabeform.elements[0].value=r;}
	       var p=eval(pwert);
		   var k=Math.floor(eval(kwert));
		   if (k!=kwert)
	       {document.calcform.elements[0].value=k;}
	       if ((p<=0) || (p>=1)) return "Incorrect p";
	       if (r<=0) return "Incorrect r";
	       if ((0<p) &&(p<1)&&(r>0))
	        { if (k<0) return 0;
	          if (k==0) return Math.exp(r*Math.log(p));
	          if (0<k) 
	          {var dummy=betai(r,k+1,p);
	           return dummy}
	        }
	       }
	 
	 
	   function negbind(rwert,pwert,kwert)
	      {
	       var r=Math.round(eval(rwert));
		   if (r!=rwert)
	       {document.eingabeform.elements[0].value=r;}
	       var p=eval(pwert);
		  
	       var k=Math.floor(eval(kwert));
		   if (k!=kwert)
	       {document.calcform.elements[0].value=k;}
	       if ((p<=0) || (p>=1)) return "Incorrect p";
	       if (r<=0) return "Incorrect r";
	       if ((0<p) &&(p<1)&&(r>0))
	        { if (k<0) return 0;
	          if (k==0) return Math.exp(r*Math.log(p));
	          if (0<k) 
	          {if (r<=1)
	           {var dummy=r*Math.log(p)+k*Math.log(1-p);}
	           if (r>1)
	          {var dummy=gammln(k+r)-gammln(r)-gammln(k+1)+r*Math.log(p)+k*
	                         Math.log(1-p);}
	           return Math.exp(dummy)}
	        }
	       }
	 
	 
	   function geov(pwert,kwert)
	      {
	       var p=eval(pwert);
		  
	       var k=Math.floor(eval(kwert));
		   if (k!=kwert)
	       document.calcform.elements[0].value=k;
	       if ((p<=0) || (p>=1)) return "Incorrect p";
	       if ((0<p) &&(p<1))
	        { if (k<0) return 0;
	          if (k==0) return p;
	          if (k>0)
	          {var dummy=1-Math.exp((k+1)*Math.log(1-p));
	           return dummy}
	        }
	       }
	 
	 
	   function geod(pwert,kwert)
	      {
	       var p=eval(pwert);
		   
	       var k=Math.floor(eval(kwert));
		   if (k!=kwert)
	       document.calcform.elements[0].value=k;
	       if ((p<=0) || (p>=1)) return "Incorrect p";
	       if ((0<p) &&(p<1))
	        { if (k<0) return 0;
	          if (k==0) return p;
	          if (0<k) 
	          {var dummy=p*Math.exp(k*Math.log(1-p));
	           return dummy}
	        }
	       }
	 
	   function poiv(lwert,kwert)
	      {
	       var lambda=eval(lwert);
		   
	       var k=Math.floor(eval(kwert));
		   if (k!=kwert)   
	       document.calcform.elements[0].value=k;
	       if (lambda<=0) return "Incorrect Lambda!";
		   if (0<lambda)
	        { if (k<0) return 0;
	          if (k==0) return Math.exp(-lambda);
	          if (k>0) return (1-chiv(2*lambda,2*(k+1)));
	        }
	       }
	 
	 
	   function poid(lwert,kwert)
	      {
	       var lambda=eval(lwert);
		  
	       var k=Math.floor(eval(kwert));
		   if (k!=kwert)
	       document.calcform.elements[0].value=k;
	       if (lambda<=0 ) return "Incorrect Lambda!";
	       if (0<lambda)
	        { if (k<0) return 0;
	          if (k==0) return Math.exp(-lambda);
	          if (0<k) 
	          {var dummy=Math.exp(-lambda+k*Math.log(lambda)-gammln(k+1));
			  
	           return dummy}
	        }
	       }
	   
	   function hypd(mwert,nwert,knwert,kwert)
	     {
	      var m=Math.floor(eval(mwert));
		    if (m!=mwert)
	         document.eingabeform.elements[0].value=m;
		  var n=Math.floor(eval(nwert));
		    if (n!=nwert)
	         document.eingabeform.elements[1].value=n;
	      var kn=Math.floor(eval(knwert));
	        if (kn!=knwert)
		      document.eingabeform.elements[2].value=kn;
	      var k=Math.floor(eval(kwert));
	        if (k!=kwert)
     		  document.eingabeform.elements[0].value=k;
		   
	      if (n<1)  return "Error: N too small!";
	      if (m>n)  return "Error: M>N";
	      if (m<1)  return "Error: M too small!";
	      if (kn>n) return "Error: n too big!";
	      if (kn<1) return "Error: n<1!";
	      if ((n>=1)&&(m<=n)&&(m>=1)&&(kn<=n)&&(kn>=1))
	        {
	          if ((k<0)||(k>m)||(k>kn)||(k<(kn-(n-m)))) return 0;  
	          if ((k>=0)&&(k<=m)&&(k<=kn)&&(k>=(kn-(n-m)))) 
	            { var dummy=gammln(m+1)-gammln(k+1)-gammln(m-k+1)+
	                        gammln(n-m+1)-gammln(kn-k+1)-gammln(n-m-kn+k+1)-
	                        gammln(n+1)+gammln(kn+1)+gammln(n-kn+1);
	              var dummy2= Math.exp(dummy);
	              if (Math.abs(dummy2-1)<1E-9) return 1;
	              if (Math.abs(dummy2-1)>=1E-9) return dummy2;
	            }  
	        }
	     }
	 
	    function hypv(mwert,nwert,knwert,kwert)
	     {
	      var m=Math.floor(eval(mwert));
		   if (m!=mwert)
		     document.eingabeform.elements[0].value=m;
		  var n=Math.floor(eval(nwert));
		   if (n!=nwert)
		      document.eingabeform.elements[1].value=n;
		  var kn=Math.floor(eval(knwert));
		   if (kn!=knwert)
		      document.eingabeform.elements[2].value=kn;
		  var k=Math.floor(eval(kwert));
		   if (k!=kwert)
     		  document.eingabeform.elements[0].value=k;
	      if (n<1)  return "Error: N too small!";
	      if (m>n)  return "Error: M>N";
	      if (m<1)  return "Error: M too small!";
	      if (kn>n) return "Error: n too big!";
	      if (kn<1) return "Error: n<1!";
	 
	      if ((n>=1)&&(m<=n)&&(m>=1)&&(kn<=n)&&(kn>=1))
	        { var dummy=0;
	          if (k<Math.max(0,kn-(n-m))) return 0;
	          if (k>Math.min(kn,m))  return 1;
	          if ((k>=Math.max(0,kn-(n-m)))&&(k<=Math.min(kn,m)))
	          {
	          var diff=k-Math.max(0,kn-(n-m));
	          if (k<100) 
	          {
	          for (i=Math.max(0,kn-(n-m));i<=k;i++)
	          {  dummy+=hypd(m,n,kn,i);}
	          if (Math.abs(dummy-1)<1E-9) dummy=1;
	          return dummy;  
	          }
	          }
	          if (k>=100) return "Too much effort!"
	                
	        }
	     }
	 
  function randomnormal(mu,sigma,r1,r2)
  {
     	var t= Math.pow(-2.0*Math.log(r1),0.5);
		res=t*Math.sin(2.0*Math.PI*r2)*sigma + mu;
		return res;
  }	 
	 
	 


