7 votos

Factorial de 1, y + 80

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 )

25voto

derpy Puntos 1073

Forma más fácil de calcular que el número es emplear la aproximación de Stirling: usted tiene

$$ n! \sim \sqrt{2\pi n}\left(\frac{n}{e}\right)^n $$

(esta es la notación asintótica), o incluso más rudamente hablando, $ n! \approx e^{n\ln n} $ como orden de magnitud. En su caso, decir $ n = 10^{80} $, usted tiene

$$ n! \approx e^{80\cdot\ln{10}\cdot10^{80}} \approx 10^{10^{81.9}}. $$

(EDICIÓN de: Yo había escrito 81 en lugar de 81.9 en el exponente; no sólo fue el redondeo incorrecta, pero sobre todo, el redondeo de los exponentes de las necesidades de un montón de atención cuando se habla de órdenes de magnitud!)

Por cierto, este es también el plausible orden de magnitud (en unidades naturales) para el volumen del espacio de fase del universo observable.

Gráficamente hablando, la expansión decimal de este número habría que convertir cada partícula en el universo observable en un dígito con el fin de ser escrito.

Para una aún más pictórica comparación, la edad del universo es pensamiento acerca de la $ 10^{17} $ segundos. Esto es mucho menor que el número de dígitos que usted tendrá que escribir el número anterior. Incluso si se pudiera producir, digamos, mil millones de dígitos por segundos, usted todavía necesita acerca de la $ 10^{82}/10^9 = 10^{73} $ segundos para completar la tarea, que es ridículamente prohibición cantidad de tiempo.

15voto

OMA Puntos 131

Para el tiempo de cálculo aspecto de la cuestión:
Supongamos que una sola multiplicación se lleva a una "constante" en el tiempo (y que podemos realizar ~$10^9$ dichas operaciones en un segundo--una aproximación razonable de hoy procesador).

Para calcular el factorial de $n$, debe realizar $n$ multiplicaciones. Recordemos que podemos realizar $10^9$ multiplicaciones por segundo. Así, el tiempo de ejecución de que el factorial es: $$\frac{10^{80} \text{ multiplications}}{10^9 \text{ multiplications per second}} = 10^{71}\text{ seconds} \approx 3\times 10^{63} \text{ years}$$

Básicamente, usted nunca verá que factorial programa de terminar.

14voto

Umberto Puntos 1146

Con la ayuda de alfa wolfram se obtiene una aproximación del número en base 10 $$ 10 ^ {10 ^ {10 ^ {1.9133}}} $$ cheque aquí otra información que debe dar una idea de cuán grande es el número.

7voto

Adam Kahtava Puntos 383

La función generalmente para trabajar con números grandes como este no es $\Gamma(x)$ $\log\Gamma(x)$ que aumenta sólo un poco más de forma lineal. Por lo tanto

lngamma(1e80+1)

da

1.832068074395236547214393164 E82

en PARI/GP, lo que significa que $$ (10^{80})!\approx\exp\left(1.832068074395236547214393164\times10^{82}\right) $$ que es aproximadamente $$ 10 ^ {79565705518096748172348871081083394917705602994196333433885546216834135350791129623} $$ o $$ 10 ^ {10 ^ {81.9007}}. $$

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X