#include <math.h>
#include <assert.h>

#include "betaDF.h"

ENTRY double
FDF(double n1, double n2, double x)
// Вычисляется вероятность того, что случайная величина,
// подчиняющаяся центральному F-распределению с параметрами n1 и n2,
// не превосходит заданного значения x.
{
   assert(x >= 0.0);
   return 1.0 - BetaDF(0.5 * n2, 0.5 * n1).value(n2 / (n2 + n1 * x));
}/*FDF*/

ENTRY double
inv_FDF(double n1, double n2, double p)
// Ищет точку, в которой функция F-распределения
// с параметрами  n1 и n2 равняется p
{
   double y=BetaDF(0.5 * n1, 0.5 * n2).inv(p);
   return n2*y/n1/(1-y);
}/*inv_FDF*/

#ifdef TEST_IT

#include <stdio.h>

LOCAL void
tryF(void)
{
   double m, n, x, p;
   double alpha=0.95;

   while (1) {
      printf("\n\n\rEnter integer n1: ");
      scanf("%lg", &n);
      if (n <= 0)
     break;
      printf("\rEnter integer n2: ");
      scanf("%lg", &m);
      printf("\rEnter F: ");
      scanf("%lg", &p);
      x = FDF(n, m, p);
      printf("\nF(%.0lf, %.0lf, %lg) = %lg", n, m, p, x);
   }

}/*tryF*/

LOCAL void
try_invF(void)
{
   double n1, n2, bound;
   double alpha=0.95;

   while (1) {
      printf("\n\n\rEnter integer n1: ");
      scanf("%lg", &n1);
      if (n1 <= 0)
     break;
      printf("\rEnter integer n2: ");
      scanf("%lg", &n2);
      bound = inv_FDF(n1,n2,alpha);
      printf("\n%.2f bound = %lg", alpha, bound);
   }

}/*try_invF*/

void main(void)
{
   tryF();
   try_invF();
}

#endif         /* Ends #ifdef TEST_IT  */

