/****************************************************
*                   numeros.bc                     *
****************************************************

 Autor: Marc Mel�ndez Schofield

 Funciones de teor�a de n�meros.

 Se permite la reproducci�n y modificaci�n total o
 parcial de este c�digo. */


scale = 0;

/* Valor absoluto */

define abs(n) {
 return sqrt(n^2);
}

/* M�ximo com�n divisor */

define mcd(n, m) {
 if(abs(n) < abs(m))
  return mcd(m, n);
 if(n % m == 0)
  return abs(m);
 return mcd(m, n % m);
}

/* M�nimo com�n m�ltiplo */

define mcm(n, m) {
 return abs(n)*abs(m)/mcd(n, m);
}

/* N�meros de Mersenne */

define mersenne(n) {
 return 2^n - 1;
}

/* N�meros de Fermat */

define fermat(n) {
 return 2^(2^n) + 1;
}

/* N�meros de Fibonacci */

define fibonacci(n) {
 if(n == 0)
  return 0;
 if(n == 1)
  return 1;
 return fibonacci(n - 1) + fibonacci(n - 2);
}

/* Factores primos */

define factores(n) {
 auto m, i;

 if(n < 2)
 {
    print "\n";
 }

 if(n >= 2)
 {

   m = n;
   i = 2;

   while(i <= sqrt(n))
   {
     if((m % i) == 0)
     {
       if(m < n) print ", ";
       print  i;
       m = m / i;
       i = i - 1;
     }
     i = i + 1;
   }
 }
 if(m > 1)
 {
   if (m < n) print ", ";
   print m;
 }
 print ".\n";
 return n;
}

/* Definici�n recursiva de la funci�n factorial */

define factorial(x) {
 if (x <= 1) return (1);
 return (factorial(x-1) * x);
}

/* N�meros combinatorios */

define comb(n, m) {
 return factorial(n)/(factorial(m)*factorial(n - m));
}