#include <math.h>
#include "fmat.h"

/* funkcja oblicza silnie podanej liczby calkowitej */
double silnia(int n)
{
   int i=2;
   double s=1.0;

   while( i < n+1 )
   {
      s = s * i;
      i = i + 1;
   }
   return s;
}

/* oblicza potege x^w (gdzie 'w' jest liczba calkowita i nieulemna) */
float potega(float x,int w)
{
   int i;
   float wynik=1;
   
   if ( w<0 && x != 0) 
   {
      x=1/x;
      w=-w;
   }

   for(i=0;i<w;i++)	wynik*=x;

	return wynik;
}

/* funkcja wyznacza miejsca zerowe rownania kwadratowego postaci a*x^2+b*x+c=0.
   Funkcja zwraca liczbe miejsc zerowych (0, 1 lub 2).
   Jezeli istnieja miejsca zerowe wowczas ich wartosc jest podstawiana do zmiennej
   wskazanej przez adresy x1 i x2 */
int pierwiastki (float a, float b, float c, float *x1, float *x2)
{
	float d;
	d=b*b-4*a*c;
	if (d<0 || (a==0 && b==0)) return 0;

   if (a==0) 
   {
      *x1=*x2=-c/b;
      return 1;
   }

   a=2*a;
   *x1=*x2=-b/a;

	if (d==0) return 1;

	*x1=*x1-sqrt(d)/a;
	*x2=*x2+sqrt(d)/a;
	return 2;
}

/* oblicza potege x^w - rekurencyjnie */
float rpotega(float x,int w)
{
   if(w<0 && x!=0) return rpotega(1/x,-w);
	if (w < 1) return 1;
	return x*potega(x,w-1);
}

/* funkcja oblicza silnie liczby calkowitej - rekurencyjnie */
double rsilnia(int n)
{
   if(n <= 1) return 1;
   return n*rsilnia(n-1);
}

/* Funkcja sprawdza czy dana liczba jest liczba pierwsza.
 * Wartoscia zwaracana jest 1 gdy dana liczba jest liczba pierwsza i
 * 0 w przeciwnym wypadku 	*/
int czy_pierwsza(int n)
{
	int i=2;
	while(i<=n/2)
	{
		if (n%i==0) return 0;
		i++;
	}
	return 1;
}
