Die Pi-Funktion ist eine Erweiterung der Fakultät über die Realzahlen (oder sogar komplexe Zahlen). Für ganze Zahlen n ist Π (n) = n! , aber um eine Definition über die Realwerte zu erhalten, definieren wir sie mit einem Integral:
In dieser Challenge werden wir die Π- Funktion invertieren .
Wenn eine reelle Zahl z ≥ 1 gegeben ist , finde positives x, so dass Π (x) = z ist . Ihre Antwort muss mindestens 5 Dezimalstellen lang sein.
Beispiele:
120 -> 5.0000
10 -> 3.39008
3.14 -> 2.44815
2017 -> 6.53847
1.5 -> 1.66277
120 -> -0.991706
. Dies liegt daran, dass Π (x) nach unendlich geht, während x von rechts nach -1 geht. Vielleicht wollen Sie auch darauf bestehen, dass x> 0 ist.Antworten:
Mathematica,
171527 BytesDie Ausgabe sieht aus wie
{{x -> n}}
, won
ist die Lösung, die möglicherweise nicht zulässig ist.quelle
Pyth, 4 Bytes
Ein Programm, das eine Zahl eingibt und das Ergebnis druckt.
Testsuite
Wie es funktioniert
quelle
MATL , 13 Bytes
Dies verwendet die lineare Suche in Schritten von
1e-5
beginnend bei1
. Es ist also furchtbar langsam und läuft im Online-Compiler aus.Zum Testen ersetzt der folgende Link die
1e-5
Genauigkeitsanforderung durch1e-2
. Probieren Sie es online!Erläuterung
quelle
GeoGebra , 25 Bytes
Wird in die CAS-Eingabe eingegeben und erwartet die Eingabe einer Zahl in der Tabellenzelle
A1
. Gibt ein Array mit einem Element des Formulars zurück{x = <result>}
.Hier ist ein GIF der Ausführung:
Wie es funktioniert
N
umerischSolve
folgende Gleichung :,Gamma(x+1)=A1
mit Startwertx=1
.quelle
1.5
. Ich konnte nicht herausfinden, welchen Algorithmus GeoGebra zum numerischen Lösen verwendet, aber der Anfangswert vonx=1
hat für jeden Wert, den ich ausprobiert habe, rein positive Antworten gegeben.MATLAB, 59 Bytes
Hierbei handelt es sich um eine anonyme Funktion, mit der der Minimierer der Quadratdifferenz zwischen der Pi-Funktion und ihrer Eingabe beginnend bei
1
mit einer sehr kleinen Toleranz (gegeben durcheps
) ermittelt wird, um die gewünschte Genauigkeit zu erzielen.Testfälle (laufen auf Matlab R2015b):
Sie könnten es online in Octave versuchen , aber leider fehlt einigen Ergebnissen die erforderliche Präzision.
quelle
J
8633 BytesVerwendet die Newton-Methode mit log Pi, um einen Überlauf zu vermeiden.
Dies ist die vorherige Version, die das Log-Gamma nach Stirlings Näherung berechnet. Die Schrittgröße (1e3) und die Anzahl der Terme in log Gamma (3) kann erhöht werden, um möglicherweise eine höhere Genauigkeit zu erzielen, und dies zu Lasten der Leistung.
Eine andere Version, die die Koeffiziententerme im laufenden Betrieb berechnet
Probieren Sie es online! und die Begriffe konvergieren zu sehen .
Erläuterung
quelle
Mathematica, 21 Bytes
FindRoot
Wendet die Newton-Methode intern an, wenn ein Anfangswert vorliegt.Die beiden folgenden Methoden wenden die Newton-Methode direkt an.
Alternative mit FixedPoint 45 Bytes
Eine genauere Implementierung von Newtons Methode zur Lösung dieses Problems, da Mathematica die Ableitung direkt berechnen kann, anstatt sie zu approximieren.
Die Verwendung von Regeln zum wiederholten Ersetzen wäre kürzer, aber es gibt ein Limit (65536) für die Anzahl der Iterationen, die getroffen werden können, während
FixedPoint
es kein Limit gibt.Alternative mit Regeln, 38 Bytes
quelle
Gelee , 34 Bytes
Probieren Sie es online! oder Zeigen Sie die konvergierenden Zwischenwerte an .
Eine Implementierung von Js Kombination aus Newtons Methode und derivativer Approximation (Sekantenmethode) zur Berechnung der Inversen von Π ( n ) .
Es wird nach der Umkehrung von log aufgelöst ( stattdessen Π ( n )) aufgelöst, um einen Überlauf zu vermeiden.
Es beginnt mit einer anfänglichen Schätzung x 0 = y +1, wobei y = log ( Π ( n )). Dann iteriert es bis zur Konvergenz mit x n + 1 = x n - (log ( Π ( x n )) - y ) / (log (( Π (1.001 * x n )) - log ( Π ( x n )) / (0,001 * x n )).
quelle
1.5
PARI / GP, 30 Bytes
Findet eine Lösung zwischen
1
undx+1
. Leiderx
ist die Obergrenze für Eingaben wie nicht groß genug1.5
.quelle
Mathematica, 26 Bytes
Noch eine Mathematica-Lösung!
Das Lösen von Gleichungen kann immer zu einem Minimierungsproblem werden.
Findet das Argument, das den Unterschied zwischen der linken und der rechten Seite der Gleichung minimiert.
Die Verwendung von NArgMin anstelle von NMinimize erzwingt, dass die Ausgabe nur das gewünschte Ergebnis und nicht die übliche ausführliche regelbasierte Ausgabe ist (und spart ein Byte!)
quelle
C mit libm, 111
Update - behoben für Input 1.5.
gamma(x+1)
ist eine monoton ansteigende Funktion über den fraglichen Bereich, shis ist nur eine binäre Suche, bis der Unterschied zwischen aufeinanderfolgenden Werten gering ist. Die untere Anfangsgrenze ist0
und die obere Anfangsgrenze ist2*x
.Ein- und Ausgabe erfolgt über einen Zeiger auf ein Double, das an die Funktion übergeben wird.
Ich bin mir ziemlich sicher, dass man hier tiefer Golf spielen kann - insbesondere glaube ich nicht, dass ich 4 lokale Doppel brauche, aber bisher sehe ich keine einfache Möglichkeit, dies zu reduzieren.
Online ausprobieren - Erstellt (Verknüpfung mit libm) und läuft in einem Bash-Skript.
Mild ungolfed:
quelle