La función Pi es una extensión del factorial sobre los reales (o incluso números complejos). Para enteros n , Π (n) = n! , pero para obtener una definición sobre los reales, la definimos utilizando una integral:
En este desafío invertiremos la función Π .
Dado un número real z ≥ 1 , encuentre x positivo tal que Π (x) = z . Su respuesta debe ser precisa para al menos 5 dígitos decimales.
Ejemplos:
120 -> 5.0000
10 -> 3.39008
3.14 -> 2.44815
2017 -> 6.53847
1.5 -> 1.66277
120 -> -0.991706
. Esto se debe a que Π (x) va al infinito como x va a -1 desde la derecha. Quizás quieras decir que x> 0 también.Respuestas:
Mathematica,
171527 bytesLa salida se ve como
{{x -> n}}
, ¿dónden
está la solución?fuente
Pyth, 4 bytes
Un programa que toma la entrada de un número e imprime el resultado.
Banco de pruebas
Cómo funciona
fuente
MATL , 13 bytes
Esto utiliza búsqueda lineal en pasos de
1e-5
comenzar en1
. Por lo tanto, es terriblemente lento y se agota el tiempo de espera en el compilador en línea.Para probarlo, el siguiente enlace reemplaza el
1e-5
requisito de precisión por1e-2
.Pruébalo en línea!Explicación
fuente
GeoGebra , 25 bytes
Ingresado en la entrada CAS, y espera la entrada de un número en la celda de la hoja de cálculo
A1
. Devuelve una matriz de un elemento del formulario{x = <result>}
.Aquí hay un gif de la ejecución:
Cómo funciona
N
numéricamenteSolve
la siguiente ecuación:,Gamma(x+1)=A1
con valor inicialx=1
.fuente
1.5
. No he podido averiguar qué algoritmo utiliza GeoGebra para la resolución numérica, pero el valor inicial dex=1
ha dado respuestas puramente positivas para cada valor que he probado.MATLAB, 59 bytes
Esta es una función anónima que encuentra el minimizador de la diferencia al cuadrado entre la función Pi y su entrada, comenzando en
1
, con una tolerancia muy pequeña (dada poreps
) para lograr la precisión deseada.Casos de prueba (ejecutados en Matlab R2015b):
Puede probarlo en línea en Octave, pero desafortunadamente algunos de los resultados carecen de la precisión requerida.
fuente
J,
8633 bytesUtiliza el método de Newton con log Pi para evitar el desbordamiento.
Esta es la versión anterior que calcula el registro Gamma utilizando la aproximación de Stirling. El tamaño del paso (1e3) y el número de términos en el registro Gamma (3) se pueden aumentar para obtener posiblemente una mayor precisión a costa del rendimiento.
Otra versión que calcula los términos del coeficiente sobre la marcha.
Pruébalo en línea! y para ver los términos converger .
Explicación
fuente
Mathematica, 21 bytes
FindRoot
aplica el método de Newton internamente cuando hay un valor inicial.Los dos métodos a continuación aplican el método de Newton directamente.
Alternativa usando FixedPoint 45 bytes
Una implementación más precisa del método de Newton para resolver esto ya que Mathematica puede calcular la derivada directamente en lugar de aproximarla.
El uso de reglas para reemplazar repetidamente sería más corto, pero hay un límite (65536) a la cantidad de iteraciones que puede realizar que podrían ser alcanzadas, mientras
FixedPoint
que no tiene un límite.Alternativa usando reglas, 38 bytes
fuente
Jalea , 34 bytes
Pruébalo en línea! o Ver los valores intermedios a medida que convergen .
Una implementación de la combinación de J del método de Newton y la aproximación derivada (método secante) para calcular la inversa de Π ( n ).
En su lugar, resuelve el inverso de log ( Π ( n )) para evitar el desbordamiento.
Comienza con una suposición inicial x 0 = y +1 donde y = log ( Π ( n )). Luego itera hasta la convergencia usando x n +1 = x n - (log ( Π ( x n )) - y ) / (log (( Π (1.001 * x n )) - log ( Π ( x n ))) / (0,001 * x n )).
fuente
1.5
PARI / GP, 30 bytes
Encuentra la solución entre
1
yx+1
. Desafortunadamente,x
no es lo suficientemente grande como límite superior para entradas como1.5
.fuente
Mathematica, 26 Bytes
¡Otra solución más de Mathematica!
La resolución de ecuaciones siempre se puede convertir en un problema de minimización.
Encuentra el argumento que minimiza la diferencia entre los lados izquierdo y derecho de la ecuación.
El uso de NArgMin en lugar de NMinimize obliga a la salida a ser solo el resultado deseado en lugar de la salida basada en reglas detalladas habituales (¡y ahorra un byte!)
fuente
C con libm, 111
Actualización : corregida para la entrada 1.5.
gamma(x+1)
es una función monótonamente creciente en el rango en cuestión, es solo una búsqueda binaria hasta que la diferencia entre valores sucesivos es pequeña. El límite inferior inicial es0
y el límite superior inicial es2*x
.La entrada y salida es a través de un puntero a un doble pasado a la función.
Estoy bastante seguro de que esto puede ser más profundo, en particular, no creo que necesite 4 dobles locales, pero hasta ahora no veo una manera fácil de reducir esto.
Pruébelo en línea : se compila (vincula con libm) y se ejecuta en un script bash.
Ligeramente no golfista:
fuente