Recientemente empecé siendo muy fascinado en la logística, y de la nada, vino la pregunta en mi cabeza, ¿qué es el factorial de la cantidad de átomos en el observeable universo, que se dice ser de entre 1,e+78
y 1,e+82
, pero la cantidad de formas de organizar estos átomos es inimaginablemente grande. Así que jugué con este número y pensé que podría ser interesante ver lo lejos que podría llegar a calcular el factorial de 1,e+80
, así que me fui por delante y creado un sencillo programa en java:
import java.awt.Color;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class Factorial {
public static void main(String[] args) {
JFrame frame = new JFrame("Project Factorial");
frame.setAlwaysOnTop(true);
frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
frame.setLocation(0, 0);
frame.setUndecorated(true);
JLabel label = new JLabel();
label.setForeground(Color.white);
frame.getContentPane().setBackground(Color.BLUE);
frame.getContentPane().add(label);
frame.setVisible(true);
BigDecimal atoms = new BigDecimal("1E+80");
BigDecimal total = new BigDecimal("1");
double increment = new BigDecimal("100.0").divide(atoms)
.doubleValue();
double percentage = increment;
for (BigDecimal num = new BigDecimal("2"); num.compareTo(atoms) <= 0; num
.add(BigDecimal.ONE)) {
total = total.multiply(num);
percentage += increment;
label.setText("[" + String.format("%-10.3f%%", percentage) + "]"
+ format(total, total.scale()));
frame.pack();
Thread.yield();
}
}
private static String format(BigDecimal x, int scale) {
NumberFormat formatter = new DecimalFormat("0.0E0");
formatter.setRoundingMode(RoundingMode.HALF_UP);
formatter.setMinimumFractionDigits(scale);
return formatter.format(x);
}
}
Rápidamente después de la ejecución de este programa por alrededor de una hora me di cuenta de ejecutar este tipo de cálculo en cualquier equipo de hoy es absolutamente tomar edades, yo estaba saltando para llegar a 0,001 % en el cálculo, pero sin duda es demasiado grande para calcular, pero entonces la pregunta que surgió exactamente cuánto tiempo tardaría? Esa pregunta no es tan fácil de contestar teniendo en cuenta que hay un montón de factores que intervienen, pero en realidad lo que estoy tratando de resolver es el factorial de 1,e+80
.
$$(1\times10^{80})!$$
El número puede ser muy difícil entender lo grande que es, así que me gustaría visualizar cómo grande que el número es, por ejemplo, si usted podría calcular cuánto tiempo se necesita para que un ordenador para calcular el factorial de 1,e+80
que sería un fresco de la visualización.
(EDIT: Gracias por los grandes respuestas, sin embargo, deseo implementar una forma de calcular el factorial de 1,e+80
en una aplicación a pesar de que sería necesario utilizar algún tipo de aproximación de la fórmula, por lo que decidió utilizar a Stirling aproximación basada en derpy's respuesta.
$$n! \sim \sqrt{2\pi n}\left(\frac{n}{e}\right)^n$$
Así que con la aproximación de Stirling y GMP de la biblioteca para el lenguaje de programación C sería posible hacer una muy precisa y eficiente programa para calcular el factorial de 1,e+80
)