domingo, 4 de noviembre de 2018

CÁLCULO DEL VALOR DEL FACTORIAL ¿?


Todos nos hemos enfrentado alguna vez desde el bachillerato al cálculo de factoriales, el cálculo es sencillo:

n!=n x (n-1) x ........1

es decir
0!=1
1!=1
2!=2 x 1
3!=3 x 2 x 1
etc

El problema aparece con los números "grandes", ya sólo el valor de 70!, no da el siguiente valor:

70!=11978571669969891796072783721689098736458938142546425857555362864628009582789845319680000000000000000

un número muy grande, que suele ser el tope de las calculadoras de bolsillo y que nos lo ofrecen sin tantos valores.

Vamos a realizar un test para calcular factoriales usado varios lenguajes de propósito general , y usando buscadores :

Empezamos por los buscadores, la opción más facil:




Empezamos por la opción más rápida (google), el entero más grande que puede procesar a la fecha de edición de este texto es 170!, con un valor de :




Como se puede ver con sólo seis decimales

En el caso de Duck Duck Go, tenemos el siguiete resultado, para un máximo de 170:




Y en en Wolfram Alpha (el que lleva las de ganar):

Sencillamente la parte más agotadora es la de ver todos los números del factorial, que no parecian tener fin.





Entre los Lenguajes de propósito general vamos a usar :

  • Java
  • Python

Para estos lenguajes es necesario realizar un programa muy corto, el problema es la capacidad de soportar enteros muy grandes, se va a hacer uso de librerias propias de los lenguajes, es decir no se van a usar extensiones de terceros.



Vamos a empezar por los lenguajes de propósito general.

Para el caso de Java el código puede ser:



import java.util.Scanner; // libreria de entrada de datos
import java.math.BigInteger; // libreria de BigInteger



public class bigfactorial 
{

public static void main(String[] args)
{
// Factorial para numeros enteros grandes usando BigInteger max 1667!
// sin recursividad
// usar BigDecimal no supone aumentar el valor del factorial calculado
// Generamos la instancia de la entrada
Scanner entrada= new Scanner(System.in);
int numero; // numero el que le vamos a calcular el factorial
BigInteger factorial = BigInteger.valueOf(1);
// introducimos un numero al que le vamos a calcular el factorial
System.out.print("Introduce el numero ");
numero = entrada.nextInt(); 
entrada.close(); // cerramos el Scanner de entrada
// calculo del factorial mediante BigInteger
for (int i=numero;i>0;i--)
{
factorial = factorial.multiply(BigInteger.valueOf(i));
}
System.out.printf("El valor del factorial de %d es %s\n",numero,factorial.toString());
 
}

}

La limitación del tipo BigInteger de Java nos lleva hasta 1667, que no está mal del todo


En el caso del código en lenguaje Python, el código sería por ejemplo :

# scrip para calcular el factorial de un número sin recursividad

numero = int (input("Introduce el número al que calcular el factorial "))
factorial=1

for n in range(1, numero+1):
    factorial*=n

print("El factorial de "+str(numero)+" es "+str(factorial))

# colocamos un input para que no se cierre la ventana del sistema operativo
print("pulsa intro para terminar")

tecla = input()

En este caso se cálculo hasta el 25.000! pero este no es el número más grande del que se puede cálcular el factorial de numeros mayores.

También es posible usar :

  • Octave
  • MatLab
  • Mathematica
  • etc
que implementan funciones para el cálculo del factorial de un número.