La fonction Pi est une extension de la factorielle sur les réels (ou même des nombres complexes). Pour les entiers n , Π (n) = n! , mais pour obtenir une définition sur les réels, nous la définissons en utilisant une intégrale:
Dans ce défi, nous allons inverser la fonction Π .
Étant donné un nombre réel z ≥ 1 , trouver x positif tel que Π (x) = z . Votre réponse doit être précise pour au moins 5 chiffres décimaux.
Exemples:
120 -> 5.0000
10 -> 3.39008
3.14 -> 2.44815
2017 -> 6.53847
1.5 -> 1.66277
120 -> -0.991706
. En effet, Π (x) va à l'infini lorsque x va à -1 à partir de la droite. Vous voulez peut-être aussi insister sur le fait que x> 0.Réponses:
Mathematica,
171527 octetsLa sortie ressemble
{{x -> n}}
, oùn
est la solution, qui peut ne pas être autorisée.la source
Pyth, 4 octets
Un programme qui prend l'entrée d'un nombre et imprime le résultat.
Suite de tests
Comment ça fonctionne
la source
MATL , 13 octets
Cela utilise la recherche linéaire par étapes de
1e-5
départ1
. C'est donc terriblement lent et arrive à expiration dans le compilateur en ligne.Pour le tester, le lien suivant remplace l'
1e-5
exigence de précision par1e-2
. Essayez-le en ligne!Explication
la source
GeoGebra , 25 octets
Entré dans l'entrée CAS et attend l'entrée d'un nombre dans la cellule de la feuille de calcul
A1
. Renvoie un tableau à un élément du formulaire{x = <result>}
.Voici un gif de l'exécution:
Comment ça fonctionne
N
umeriquementSolve
l'équation suivante :,Gamma(x+1)=A1
avec valeur de départx=1
.la source
1.5
. Je n'ai pas pu découvrir quel algorithme GeoGebra utilise pour la résolution numérique, mais la valeur initiale dex=1
a donné des réponses purement positives pour chaque valeur que j'ai essayée.MATLAB, 59 octets
Il s'agit d'une fonction anonyme qui trouve le minimiseur de la différence au carré entre la fonction Pi et son entrée, à partir de
1
, avec une très petite tolérance (donnée pareps
) pour atteindre la précision souhaitée.Cas de test (exécutés sur Matlab R2015b):
Vous pouvez l' essayer en ligne dans Octave, mais malheureusement certains résultats manquent de la précision requise.
la source
J,
8633 octetsUtilise la méthode de Newton avec log Pi pour éviter le débordement.
Il s'agit de la version précédente qui calcule le log Gamma en utilisant l'approximation de Stirling. La taille de pas (1e3) et le nombre de termes dans le log Gamma (3) peuvent être augmentés pour une précision éventuellement plus élevée au détriment des performances.
Une autre version qui calcule les termes des coefficients à la volée
Essayez-le en ligne! et de voir les termes converger .
Explication
la source
Mathematica, 21 octets
FindRoot
applique la méthode de Newton en interne lorsqu'il existe une valeur initiale.Les deux méthodes ci-dessous appliquent directement la méthode de Newton.
Alternative utilisant FixedPoint 45 octets
Une implémentation plus précise de la méthode de Newton pour résoudre ce problème car Mathematica peut calculer la dérivée directement au lieu de l'approximer.
L'utilisation de règles à remplacer de manière répétée serait plus courte, mais il y a une limite (65536) au nombre d'itérations qu'elle peut effectuer qui pourraient être atteintes alors qu'elle
FixedPoint
n'a pas de limite.Alternative utilisant des règles, 38 octets
la source
Gelée , 34 octets
Essayez-le en ligne! ou Affichez les valeurs intermédiaires lorsqu'elles convergent .
Une implémentation de la combinaison de J de la méthode de Newton et de l'approximation dérivée (méthode sécante) pour calculer l'inverse de Π ( n ).
Il résout plutôt l'inverse de log ( Π ( n )) afin d'éviter un débordement.
Il commence par une estimation initiale x 0 = y +1 où y = log ( Π ( n )). Ensuite, il itère jusqu'à la convergence en utilisant x n +1 = x n - (log ( Π ( x n )) - y ) / (log (( Π (1.001 * x n )) - log ( Π ( x n ))) / (0,001 * x n )).
la source
1.5
PARI / GP, 30 octets
Trouve la solution entre
1
etx+1
. Malheureusement, cex
n'est pas assez grand comme limite supérieure pour l'entrée comme1.5
.la source
Mathematica, 26 octets
Encore une autre solution Mathematica!
La résolution d'équations peut toujours devenir un problème de minimisation.
Recherche l'argument qui minimise la différence entre les côtés gauche et droit de l'équation.
L'utilisation de NArgMin plutôt que de NMinimize force la sortie à être le résultat souhaité plutôt que la sortie verbeuse habituelle basée sur des règles (et cela économise un octet!)
la source
C avec libm, 111
Mise à jour - corrigé pour l'entrée 1.5.
gamma(x+1)
est une fonction qui augmente de façon monotone sur la plage en question, shis n'est qu'une recherche binaire jusqu'à ce que la différence entre les valeurs successives soit petite. La borne inférieure de départ est0
et la borne supérieure de départ est2*x
.L'entrée et la sortie se font via un pointeur vers un double passé à la fonction.
Je suis presque sûr que cela peut être approfondi - en particulier, je ne pense pas avoir besoin de 4 doubles locaux, mais jusqu'à présent, je ne vois pas de moyen facile de réduire cela.
Essayez-le en ligne - Construit (liaison avec libm) et s'exécute dans un script bash.
Légèrement non golfé:
la source