Funkcja Pi jest rozszerzeniem silni na liczby rzeczywiste (lub nawet liczby zespolone). Dla liczb całkowitych n , Π (n) = n! , ale aby uzyskać definicję rzeczywistą, definiujemy ją za pomocą całki:
W tym wyzwaniu odwrócimy funkcję Π .
Biorąc pod uwagę liczbę rzeczywistą z ≥ 1 , znajdź dodatnią x taką, że Π (x) = z . Twoja odpowiedź musi być dokładna co najmniej 5 cyfr dziesiętnych.
Przykłady:
120 -> 5.0000
10 -> 3.39008
3.14 -> 2.44815
2017 -> 6.53847
1.5 -> 1.66277
120 -> -0.991706
. Wynika to z tego, że Π (x) przechodzi w nieskończoność, gdy x idzie w prawo do -1. Być może masz na myśli, że x> 0 również.Odpowiedzi:
Mathematica,
171527 bajtówDane wyjściowe wyglądają
{{x -> n}}
, gdzien
jest rozwiązanie, które może być niedozwolone.źródło
Pyth, 4 bajty
Program, który pobiera liczbę i wypisuje wynik.
Zestaw testowy
Jak to działa
źródło
MATL , 13 bajtów
Używa to liniowego wyszukiwania w krokach od
1e-5
początku1
. Jest więc bardzo powolny i upływa limit czasu w internetowym kompilatorze.Aby to przetestować, poniższy link zastępuje
1e-5
wymaganie dotyczące dokładności przez1e-2
. Wypróbuj online!Wyjaśnienie
źródło
GeoGebra , 25 bajtów
Wprowadzony w danych wejściowych CAS i oczekuje wprowadzenia liczby w komórce arkusza kalkulacyjnego
A1
. Zwraca tablicę jednoelementową formularza{x = <result>}
.Oto gif z wykonania:
Jak to działa
N
hipotetycznieSolve
następujące równanie :,Gamma(x+1)=A1
z wartością początkowąx=1
.źródło
1.5
. Nie byłem w stanie dowiedzieć się, jakiego algorytmu używa GeoGebra do rozwiązywania liczb, ale początkowa wartośćx=1
dała czysto pozytywne odpowiedzi dla każdej wartości, którą wypróbowałem.MATLAB, 59 bajtów
Jest to anonimowa funkcja, która znajduje minimalizator kwadratowej różnicy między funkcją Pi i jej wejściem, zaczynając od
1
, z bardzo małą tolerancją (podaną przezeps
), aby osiągnąć pożądaną precyzję.Przypadki testowe (uruchamiane na Matlab R2015b):
Możesz spróbować online w Octave, ale niestety niektóre wyniki nie mają wymaganej precyzji.
źródło
J,
8633 bajtówUżywa metody Newtona z logiem Pi, aby uniknąć przepełnienia.
Jest to poprzednia wersja, która oblicza log Gamma przy użyciu przybliżenia Stirlinga. Rozmiar kroku (1e3) i liczbę terminów w log Gamma (3) można zwiększyć, aby uzyskać możliwie wyższą dokładność kosztem wydajności.
Kolejna wersja, która oblicza współczynniki w locie
Wypróbuj online! i zobaczyć, jak warunki się zbiegają .
Wyjaśnienie
źródło
Mathematica, 21 bajtów
FindRoot
stosuje metodę Newtona wewnętrznie, gdy istnieje wartość początkowa.Dwie poniższe metody stosują metodę Newtona bezpośrednio.
Alternatywnie przy użyciu FixedPoint 45 bajtów
Bardziej precyzyjna implementacja metody Newtona do rozwiązania tego, ponieważ Mathematica może obliczyć pochodną bezpośrednio, zamiast ją przybliżać.
Wielokrotne zastępowanie reguł byłoby krótsze, ale istnieje limit (65536) liczby iteracji, które może wykonać, które mogą zostać trafione,
FixedPoint
ale nie ma limitu.Alternatywne użycie reguł, 38 bajtów
źródło
Galaretka , 34 bajty
Wypróbuj online! lub Zobacz wartości pośrednie, gdy się zbiegają .
Implementacja kombinacji metody Newtona i aproksymacji pochodnej (metoda sieczna) w celu obliczenia odwrotności Π ( n ).
Zamiast tego rozwiązuje odwrotność log ( Π ( n )), aby uniknąć przepełnienia.
Zaczyna się od wstępnego odgadnięcia x 0 = y +1, gdzie y = log ( Π ( n )). Następnie iteruje do konwergencji za pomocą x n +1 = x n - (log ( Π ( x n )) - y ) / (log (( Π (1.001 * x n )) - log ( Π ( x n ))) / (0,001 * x n )).
źródło
1.5
PARI / GP, 30 bajtów
Znajduje rozwiązanie między
1
ix+1
. Niestety,x
nie jest wystarczająco duży jako górna granica dla takich danych wejściowych1.5
.źródło
Mathematica, 26 bajtów
Jeszcze jedno rozwiązanie Mathematica!
Rozwiązywanie równań zawsze można przekształcić w problem minimalizacji.
Znajduje argument, który minimalizuje różnicę między lewą i prawą stroną równania.
Użycie NArgMin zamiast NMinimize wymusza, aby wynik był po prostu pożądanym wynikiem, a nie zwykłym pełnym wyjściem opartym na regułach (i oszczędza bajt!)
źródło
C z libm, 111
Aktualizacja - naprawiono dla danych wejściowych 1.5.
gamma(x+1)
jest monotonicznie rosnącą funkcją w danym zakresie, shis jest po prostu wyszukiwaniem binarnym, dopóki różnica między kolejnymi wartościami nie będzie niewielka. Początkowa dolna granica to,0
a początkowa górna granica to2*x
.Wejście i wyjście odbywa się za pomocą wskaźnika do podwójnego przekazanego do funkcji.
Jestem prawie pewien, że można pograć w golfa głębiej - w szczególności nie sądzę, żebym potrzebował 4 miejsc do gry podwójnej, ale jak dotąd nie widzę łatwego sposobu na zmniejszenie tego.
Wypróbuj online - kompiluje (łączy z libm) i działa w skrypcie bash.
Lekko niegolfowany:
źródło