Zainspirowany tym filmem z serii Infinite .
Wprowadzenie
Pi jest zdefiniowane jako stosunek obwodu do średnicy koła. Ale jak zdefiniowano okrąg? Zwykle okrąg definiuje się jako punkty o stałej odległości od punktu środkowego (załóżmy, że środek znajduje się w punkcie (0,0)
). Następne pytanie brzmi: jak zdefiniować odległość ? Poniżej rozważamy różne pojęcia odległości (wywołane przez Lp
-normy):
Biorąc pod uwagę normę (= coś, co mierzy długość ), możemy łatwo skonstruować odległość (= odległość między dwoma punktami) w następujący sposób:
dist(A,B) := norm (A-B)
Normę euklidesową podaje:
norm((x,y)) = (x^2 + y^2)^(1/2)
Jest to również nazywane normą L2 . Pozostałe normy Lp są konstruowane przez zastąpienie 2
powyższej formuły innymi wartościami od 1 do nieskończoności:
norm_p((x,y)) = (|x|^p + |y|^p)^(1/p)
Koła jednostek dla tych różnych norm mają dość wyraźne kształty:
Wyzwanie
Biorąc pod uwagę a p >= 1
, obliczyć stosunek obwodu do średnicy koła Lp w odniesieniu do Lp
-normy z dokładnością do czterech znaczących cyfr.
Przypadki testowe
Możemy użyć że p,q
ze 1 = 1/p + 1/q
mamy ten sam stosunek dla Lp
jak również Lq
normy. Co więcej, p = q = 2
stosunek jest minimalny, a dla p = 1, q = infinity
współczynnika 4, więc stosunki są zawsze pomiędzy pi
i 4
.
p or q ratio
1 infinity 4
2 2 3.141592
1.623 2.60513 3.200
1.5 3 3.25976
4 1.33333 3.39693
A = πr²
) nie obowiązuje dlap ≠ 2
Odpowiedzi:
Python + scipy, 92 bajty
Formula pochodzi z tego pytania matematycznego .
źródło
x=1
, jak radzi sobie twoje poddanie?MATL , 31 bajtów
Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie
To generuje współrzędne x , y jednej czwartej koła jednostki próbkowanej w 1001 punktach z krokiem 0,001 w x . Długość ćwiartki koła jest przybliżona przez długość linii wielokąta, która przechodzi przez te punkty; to jest suma długości 1000 segmentów. Długość jest oczywiście obliczana zgodnie z
p
-norm. Pomnożenie wyniku przez 2 daje przybliżoną długość półkola, czyli pi.źródło
Mathematica,
4946 bajtów3 bajty zapisane z powodu alephalpha .
Funkcja anonimowa. Pobiera liczbę jako dane wejściowe i zwraca liczbę jako dane wyjściowe.
źródło
2NIntegrate[(1+(a^-#-1)^(1-#))^(1/#),{a,0,1}]&
PARI / GP,
4843 bajtówŁatwo jest po znalezieniu formuły przez @orlp, a wersja @ alephalpha zapisuje 5 bajtów:
Aby dodać coś nieco przydatnego, obliczmy,
p
za co otrzymujemy3.2
:Prawidłowa obsługa
Natomiast kod daje wyniki, które są znacznie bardziej dokładny niż żądań wyzwanie, może łatwo ulec poprawie wiele: czy możemy zastąpić górną granicę integracji
1
z[1,1/p-1]
(co daje ręczne połączenia wykładnik osobliwość) to wszystko pokazane cyfryf(2)
zgadzają sięPi
. Jest to nadal prawdą, jeśli zwiększymy precyzję do 100 (typ\p100
).Jednak po tej zmianie
solve
obliczenia przestały działać. Zmieniłem wewnętrzny termin, aby jawnie obsłużyć sprawę,u=0
a także zmieniłem na inny komputer z nowszą wersją PARI i 64-bitową (co oznacza wyższą domyślną precyzję).Oto ulepszone obliczanie
p
wartościPi=3.2
i spójrzmy również na prawdziwe Pi:źródło
p->2*intnum(u=0,1,(1+(u^-p-1)^(1-p))^(1/p))
JavaScript (ES7), 80 bajtów
Na podstawie odpowiedzi orlp . Ta implementacja JS jest dość powolna. Możesz spróbować
i=1e-7
(lub nawet wyżej), aby uzyskać szybsze zbliżenie.Uwaga : jest to zasadniczo przeznaczone tylko dla Chrome i Edge. Równoważna wersja ES6 używająca
Math.pow()
przeglądarki Firefox 50.1 wydaje się być znacznie wolniejsza.Edycja : Według Neila powinno to również działać dobrze w przeglądarce Firefox 52.
źródło