Te numery Bernoulliego (w szczególności, drugie numery Bernoulliego) są zdefiniowane w następujący rekurencyjnej definicji:
Gdzie oznacza kombinację .
Biorąc pod uwagę nieujemną liczbę całkowitą m
jako dane wejściowe, wyprowadzaj reprezentację dziesiętną LUB zmniejszoną część dla m
drugiej drugiej liczby Bernoulliego. Jeśli wyprowadzasz reprezentację dziesiętną, musisz mieć co najmniej 6 miejsc dziesiętnych (cyfry po przecinku) precyzji i musi ona być dokładna, gdy zostanie zaokrąglona do 6 miejsc dziesiętnych. Na przykład, w przypadku m = 2
, 0.166666523
jest do przyjęcia, ponieważ rund 0.166667
. 0.166666389
jest nie do przyjęcia, ponieważ zaokrągla do 0.166666
. Końcowe zera można pominąć. Do reprezentacji dziesiętnej można stosować notację naukową.
Oto dane wejściowe i oczekiwane wyniki dla m
maksymalnie 60 włącznie, w notacji naukowej, w zaokrągleniu do 6 miejsc po przecinku, i jako ułamki zredukowane:
0 -> 1.000000e+00 (1/1)
1 -> 5.000000e-01 (1/2)
2 -> 1.666667e-01 (1/6)
3 -> 0.000000e+00 (0/1)
4 -> -3.333333e-02 (-1/30)
5 -> 0.000000e+00 (0/1)
6 -> 2.380952e-02 (1/42)
7 -> 0.000000e+00 (0/1)
8 -> -3.333333e-02 (-1/30)
9 -> 0.000000e+00 (0/1)
10 -> 7.575758e-02 (5/66)
11 -> 0.000000e+00 (0/1)
12 -> -2.531136e-01 (-691/2730)
13 -> 0.000000e+00 (0/1)
14 -> 1.166667e+00 (7/6)
15 -> 0.000000e+00 (0/1)
16 -> -7.092157e+00 (-3617/510)
17 -> 0.000000e+00 (0/1)
18 -> 5.497118e+01 (43867/798)
19 -> 0.000000e+00 (0/1)
20 -> -5.291242e+02 (-174611/330)
21 -> 0.000000e+00 (0/1)
22 -> 6.192123e+03 (854513/138)
23 -> 0.000000e+00 (0/1)
24 -> -8.658025e+04 (-236364091/2730)
25 -> 0.000000e+00 (0/1)
26 -> 1.425517e+06 (8553103/6)
27 -> 0.000000e+00 (0/1)
28 -> -2.729823e+07 (-23749461029/870)
29 -> 0.000000e+00 (0/1)
30 -> 6.015809e+08 (8615841276005/14322)
31 -> 0.000000e+00 (0/1)
32 -> -1.511632e+10 (-7709321041217/510)
33 -> 0.000000e+00 (0/1)
34 -> 4.296146e+11 (2577687858367/6)
35 -> 0.000000e+00 (0/1)
36 -> -1.371166e+13 (-26315271553053477373/1919190)
37 -> 0.000000e+00 (0/1)
38 -> 4.883323e+14 (2929993913841559/6)
39 -> 0.000000e+00 (0/1)
40 -> -1.929658e+16 (-261082718496449122051/13530)
41 -> 0.000000e+00 (0/1)
42 -> 8.416930e+17 (1520097643918070802691/1806)
43 -> 0.000000e+00 (0/1)
44 -> -4.033807e+19 (-27833269579301024235023/690)
45 -> 0.000000e+00 (0/1)
46 -> 2.115075e+21 (596451111593912163277961/282)
47 -> 0.000000e+00 (0/1)
48 -> -1.208663e+23 (-5609403368997817686249127547/46410)
49 -> 0.000000e+00 (0/1)
50 -> 7.500867e+24 (495057205241079648212477525/66)
51 -> 0.000000e+00 (0/1)
52 -> -5.038778e+26 (-801165718135489957347924991853/1590)
53 -> 0.000000e+00 (0/1)
54 -> 3.652878e+28 (29149963634884862421418123812691/798)
55 -> 0.000000e+00 (0/1)
56 -> -2.849877e+30 (-2479392929313226753685415739663229/870)
57 -> 0.000000e+00 (0/1)
58 -> 2.386543e+32 (84483613348880041862046775994036021/354)
59 -> 0.000000e+00 (0/1)
60 -> -2.139995e+34 (-1215233140483755572040304994079820246041491/56786730)
Implementacja referencyjna (w Python 3):
def factorial(n):
if n < 1:
return 1
else:
return n * factorial(n - 1)
def combination(m,k):
if k <= m:
return factorial(m)/(factorial(k) * factorial(m - k))
else:
return 0
def Bernoulli(m):
if m == 0:
return 1
else:
t = 0
for k in range(0, m):
t += combination(m, k) * Bernoulli(k) / (m - k + 1)
return 1 - t
Zasady
- To jest golf golfowy , więc wygrywa najkrótszy kod w bajtach
- Nie można używać żadnych funkcji, wbudowanych lub zawartych w bibliotece zewnętrznej, które obliczają dowolny typ liczb Bernoulliego lub wielomiany Bernoulliego.
- Twoja odpowiedź musi zawierać poprawny wynik dla wszystkich danych wejściowych do 60 włącznie.
Tabela liderów
Fragment kodu na dole tego postu generuje tabelę wyników na podstawie odpowiedzi a) jako lista najkrótszych rozwiązań dla każdego języka oraz b) jako ogólna tabela wyników.
Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:
## Language Name, N bytes
gdzie N
jest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik to suma dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:
## Perl, 43 + 2 (-p flag) = 45 bytes
Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie:
## [><>](http://esolangs.org/wiki/Fish), 121 bytes
Odpowiedzi:
Julia,
2320 bajtówOszczędność 3 bajtów dzięki Alexowi A.
Używa tej samej formuły, co moje rozwiązanie Mathematica i rozwiązanie PARI / GP .
źródło
n->n>0?-zeta(1-n)n:1
zeta(n)
generuje błąd, gdyn
jest liczbą całkowitą ujemną. Używam Julii 0.2.1 na Linuksie.Mathematica,
40282322 bajtówUżywając znanej formuły n * ζ (1− n ) = - B n , gdzie ζ jest funkcją Riemanna Zety .
Ta sama długość:
Oryginalne rozwiązanie, 40 bajtów, wykorzystujące funkcję generowania liczb Bernoulliego .
źródło
Julia, 58 bajtów
Tworzy to funkcję rekurencyjną,
B
która przyjmuje liczbę całkowitą i zwracaBigFloat
(tj. Zmiennoprzecinkowy o wysokiej precyzji).Nie golfowany:
źródło
Minkolang 0,14 , 97 bajtów
Właściwie najpierw próbowałem zrobić to rekurencyjnie, ale mój tłumacz, tak jak obecnie zaprojektowany, tak naprawdę nie może tego zrobić. Jeśli spróbujesz wykonać rekurencję z pętli for, rozpocznie się nowa rekurencja. Więc wybrałem podejście tabelaryczne ... które miało problemy z precyzją. Zrobiłem wszystko z ułamkami. Bez wbudowanej obsługi ułamków. [ westchnienie ]
Wypróbuj tutaj. Bonus: tablica zawiera wszystkie ułamki dla każdego poprzedniego numeru Bernoulli!
Objaśnienie (za chwilę)
Trzecia linia odpowiada za
1/2
ifm
równą 1, a0/1
jeślim
liczba nieparzysta jest większa niż 1. Druga linia oblicza naB_m
podstawie wzoru sumowania podanego w pytaniu i robi to całkowicie za pomocą liczników i mianowników. W przeciwnym razie byłoby znacznie krócej. Pierwsza połowa pierwszego wiersza zajmuje się księgowością i wybiera, czy wykonać drugą czy trzecią linię, a druga połowa dzieli licznik i mianownik przez ich GCD (jeśli dotyczy) i przechowuje te wartości. I podaje odpowiedź na końcu.źródło
Python 2, 118 bajtów
Zapisano 6 bajtów z powodu xsot .
Zaoszczędź
610 więcej dzięki Peterowi Taylorowi .Wykorzystuje następującą tożsamość:
gdzie A n jest n- tą liczbą naprzemienną , którą można formalnie zdefiniować jako liczbę naprzemiennych permutacji w zbiorze wielkości n , zmniejszoną o połowę (patrz także: A000111 ).
Zastosowany algorytm pierwotnie podali Knuth i Buckholtz (1967) :
Python 2, 152 bajty
Drukuje dokładną reprezentację ułamkową, niezbędną dla wartości większych niż około 200.
źródło
range(2,n)
narange(n-2)
, możesz skrócićn-k+1
don+~k
. Czy istnieje powód, dla którego>>1
zamiast tego używasz/2
? Wreszcie trywialne ulepszenie, ale możesz zaoszczędzić kilka bajtów, aliasingrange
.>>1
się/2
.print+(n<1)or-(-1.)**(n+n/2)*n/(4**n-2**n)*a[n%2^1%n]
. Obliczenia można wykonać dla tej samej liczby znaków, coa=[1]*(n+1);exec"a=[(a[j-1]+a[j+1])*j/2for j in range(len(a)-1)];"*(n-1)
n+n/2
is clever; 1 nie musi być wyróżniane, ponieważ wszystkie inne nieparzyste wartości i tak są zerowe. Alternatywne obliczenia są w rzeczywistości o 4 bajty krótsze przy odwróceniu bitów, ale z jakiegoś powodu są również znacznie wolniejsze.range
i pomijając jedną iterację, by być sprytnym sposobem na skrócenie inicjalizacji. Droga już teraz podzielić się parzystych i nieparzystych indeksów jest bardzo ładny, i pozwala na dalsze oszczędności, pociągając za znak do definicjia
:a=[(-1)**(n/2),n<2]*n
. Zatem zwracana wartość to+(n<1)or-n/(2.**n-4**n)*a[1]
. Masz również zbłąkany średnik na końcu drugiego wierszaPARI / GP,
5223 bajtyUżywając znanej formuły n * ζ (1− n ) = - B n , gdzie ζ jest funkcją Riemanna Zety .
Oryginalne rozwiązanie, 52 bajty, wykorzystujące funkcję generowania liczb Bernoulliego .
źródło
zeta
funkcja jest obliczana za pomocą liczb Bernoulliego, w rzeczywistości.bernfrac
ibernreal
to 8 bajtów każdy i są one już działa, więc ma potrzebyn->
. Ale +1 za dobre rozwiązanie.Python 3, 112 bajtów
Edycja: Wyczyściłem tę odpowiedź. Jeśli chcesz zobaczyć wszystkie inne sposoby, w jakie chciałem odpowiedzieć na to pytanie w Pythonie 2 i 3, zajrzyj do wersji.
Jeśli nie używam tabeli odnośników (zamiast tego używam zapamiętywania), uda mi się uzyskać definicję rekurencyjną do 112 bajtów! ZABIEGAĆ! Zauważ, że
b(m)
zwraca aFraction
. Jak zwykle liczba bajtów i link do testowania .I funkcja, która korzysta z tabeli odnośników i zwraca całą tabelę ułamków od
b(0)
dob(m)
włącznie.źródło
1.
Zamiast1.0
..0
zs
całości, ponieważ szybko stają się pływak później.p=v=1;exec('[...];p+=1'*k)
zamiast swojej najbardziej wewnętrznej pętli?CJam,
69 49 3433 bajtówDemo online
Dzięki Cabbie407 , którego odpowiedź uświadomiła mi algorytm Akiyama – Tanigawa.
Sekcja
źródło
PARI / GP, 45 bajtów
Przy użyciu tej samej formuły, co moja odpowiedź w języku Python , z A n wygenerowanym przez polilog.
Skrypt testowy
Uruchom
gp
, w odpowiedzi na monit wklej następujące informacje:źródło
Mathematica,
524842 bajtówNienazwana funkcja, która używa dosłownej definicji.
źródło
Sign@#
konieczne?Sign@#
nadal zwraca poprawną odpowiedź dla 0.Python 2,
132130 bajtówTo tylko wersja referencyjna implementacji w golfa.
Jest to trochę powolne w praktyce, ale można znacznie przyspieszyć dzięki zapamiętywaniu:
Możesz wypróbować tę wersję online w Ideone .
źródło
gawk4, 79 bajtów
Kod 77 bajtów + 2 bajty na
-M
flagęJest to implementacja algorytmu Akiyama – Tanigawa ze strony Wikipedii.
Wystąpił problem z „regułą 6 cyfr dziesiętnych”, ponieważ powoduje to wydrukowanie liczby całkowitej, a następnie 6 cyfr, ale nie ma tu listy, w której można by porównać wyniki.
Wadą jest to, że drukuje znak minus przed
0.000000
wieloma razy, ale nie sądzę, że to źle.Przykład użycia
Wyjście od 0 do 60
źródło
printf"%e"
zadziała?0.00000
s są tylko bardzo małe i nie są tak naprawdę zerowe.GolfScript, 63 bajty
Demo online .
Używam tej samej formuły, co moja odpowiedź w języku Python .
Skrypt testowy
Link do Apphb przekroczy limit czasu. Jeśli nie masz zainstalowanego GolfScript lokalnie, polecam skorzystanie z anarchicznego interpretera golfa (użyj formularza, wybierz GolfScript, wklej, prześlij).
źródło
Perl, 101 bajtów
Licząc shebang jako trzy, dane wejściowe są pobierane ze standardowego wejścia.
Używam tej samej formuły, co moja odpowiedź w języku Python .
Przykładowe użycie
Demo online .
źródło
R, 93 bajty
Niezupełnie oryginalne jako rozwiązanie. Jeśli jakikolwiek komentarz, prosimy o kontakt!
Nie golfowany:
źródło
if
/else
i używaj zamiast niejm>0
pętli1:m-1
.W rzeczywistości ,
4645 bajtów (nie konkurują)Zamierzałem odpowiedzieć poważnie / właściwie od miesięcy, a teraz mogę. Ponieważ korzysta z poleceń, których Poważnie nie było w listopadzie 2015 r., Nie jest konkurencyjny. Sugestie dotyczące gry w golfa mile widziane. Wypróbuj online!
Edycja: W lutym 2017 r. Wprowadzono aktualizację w rzeczywistości, która zmieniła, które literały funkcyjne są które. Zwykle byłoby to po prostu niekonkurujące z jakimkolwiek wyzwaniem napisanym przed lutym, ale ponieważ ta odpowiedź już nie jest konkurencyjna, i tak ją zredagowałem. Cieszyć się.
Wykorzystuje to wyraźną definicję liczb Bernoulliego na Wikipedii.
Ungolfing
źródło
Ruby,
6661 bajtówTo jest Rubinowa wersja mojej odpowiedzi w Pythonie.
Ponieważ używa to
Rational
w swoich odpowiedziach, jestem całkiem pewien, że działa do 60, ale miałem nawet problemy z uruchomieniemb[24]
, więc ponownie zaimplementowałem tabelę wyszukiwania dla868180 bajtów.źródło
J, 10 bajtów
Oblicza n th liczby Bernoulliego przez znalezienie n th współczynnik funkcji wykładniczej tworzącej x / (1 - e -X ).
Stosowanie
Jeśli dane wejściowe zostaną podane jako liczba całkowita lub liczba zmiennoprzecinkowa jako argument, wyprowadzi wartość zmiennoprzecinkową. Jeśli podano rozszerzoną liczbę całkowitą, oznaczoną sufiksem
x
, wyświetli ona rozszerzoną liczbę całkowitą lub wymierne, dwie rozszerzone liczby całkowite oddzieloner
.Wyjaśnienie
źródło
Aksjomat,
134147 bajtówgolf i test
źródło
APL (NARS), 83 znaki, 166 bajtów
Wejście jako wyjście całkowite jako duże racjonalne
źródło
Haskell, 95 bajtów
To implementuje wyraźną definicję liczb Bernoulliego przedstawioną na stronie Wikipedii .
źródło
Perl 6, 83 bajtów
Szybsze, 114-bajtowe rozwiązanie:
źródło
JavaScript, 168 bajtów
Ustaw zmienną „k” na żądaną liczbę Bernoulliego, a wynikiem będzie c [0] powyżej [0]. (licznik i mianownik)
Przykładowe użycie
Nie tak mały jak inne, ale jedyny, który napisałem, jest bliski. Zobacz inne https://marquisdegeek.com/code_ada99 dla moich innych prób (innych niż golf).
źródło
Aksjomat, 57 bajtów
kod testu i wyników
należy zauważyć, że ta funkcja nie jest tą, którą ktoś napisał powyżej, ale
t*%e^t/(%e^t-1))
z% e Euler costantźródło
Pyth , 22 bajty
Wypróbuj online!
Definiuje funkcję wywoływaną jako
y<number>
npyQ
.źródło