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

/* 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;
}


/* oblicza potege x^y (gdzie 'y' jest liczba calkowita) */
float potega(float x,int y)
{
	float p=1;
	int i;
	if(y<0) 
	{	
		x=1/x;
		y=-y;
	}
	for(i=1;i<=y;i++) p*=x;
	return p;
}

/* 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 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;
}


/* funkcja silnia - wersja iteracyjne */
double silnia(int n)
{
		  int i;
		  double s=1;

		  for(i=2; i <= n ; i++ ) s = s * i;
		  return s;
}


/* funkcja rsilnia - wersja rekurencyjna */
double rsilnia(int n)
{
   if(n <= 1) return 1;
   return n*rsilnia(n-1);
}


