Die Bernoulli-Zahlen (insbesondere die zweiten Bernoulli-Zahlen) werden durch die folgende rekursive Definition definiert:
Wobei eine Kombination bezeichnet .
Geben Sie bei einer nichtnegativen Ganzzahl m
als Eingabe die Dezimaldarstellung ODER einen reduzierten Bruch für die m
zweite Bernoulli-Zahl aus. Wenn Sie eine Dezimaldarstellung ausgeben, müssen Sie eine Genauigkeit von mindestens 6 Dezimalstellen (Nachkommastellen) haben und auf 6 Dezimalstellen gerundet genau sein. Zum Beispiel für m = 2
, 0.166666523
akzeptabel ist , weil es rundet auf 0.166667
. 0.166666389
ist nicht akzeptabel, weil es auf rundet 0.166666
. Nachgestellte Nullen können weggelassen werden. Für Dezimaldarstellungen kann die wissenschaftliche Notation verwendet werden.
Hier ist die Eingabe und die erwartete Ausgabe für m
bis zu einschließlich 60, in wissenschaftlicher Notation auf 6 Dezimalstellen gerundet und als reduzierte Brüche:
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)
Referenzimplementierung (in 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
Regeln
- Das ist Code-Golf , also gewinnt der kürzeste Code in Bytes
- Sie dürfen keine integrierten oder in einer externen Bibliothek enthaltenen Funktionen verwenden, die entweder einen Bernoulli-Zahlentyp oder ein Bernoulli-Polynom berechnen.
- Ihre Antwort muss für alle Eingaben bis einschließlich 60 die richtige Ausgabe ergeben.
Bestenliste
Das Stapel-Snippet am Ende dieses Beitrags generiert die Rangliste aus den Antworten a) als Liste der kürzesten Lösungen pro Sprache und b) als Gesamtrangliste.
Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:
## Language Name, N bytes
Wo N
ist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Wenn Sie mehrere Zahlen in Ihre Kopfzeile aufnehmen möchten (z. B. weil Ihre Punktzahl die Summe von zwei Dateien ist oder wenn Sie die Strafen für Interpreter-Flags separat auflisten möchten), stellen Sie sicher, dass die tatsächliche Punktzahl die letzte Zahl in der Kopfzeile ist:
## Perl, 43 + 2 (-p flag) = 45 bytes
Sie können den Namen der Sprache auch als Link festlegen, der dann im Snippet angezeigt wird:
## [><>](http://esolangs.org/wiki/Fish), 121 bytes
Antworten:
Julia,
2320 Bytes3 Bytes gespart dank Alex A.
Es verwendet dieselbe Formel wie meine Mathematica-Lösung und meine PARI / GP-Lösung .
quelle
n->n>0?-zeta(1-n)n:1
zeta(n)
wirft einen Fehler, wennn
eine negative ganze Zahl ist. Ich benutze Julia 0.2.1 unter Linux.Mathematica,
40282322 BytesUnter Verwendung der berühmten Formel n * ζ (1 - n ) = - B n , wobei ζ die Riemannsche Zetafunktion ist .
Die gleiche Länge:
Ursprüngliche Lösung, 40 Bytes, unter Verwendung der Erzeugungsfunktion von Bernoulli-Zahlen .
quelle
Julia, 58 Bytes
Dadurch wird eine rekursive Funktion erstellt
B
, die eine Ganzzahl akzeptiert und einenBigFloat
(dh hochgenauen Gleitkommawert) zurückgibt .Ungolfed:
quelle
Minkolang 0,14 , 97 Bytes
Eigentlich habe ich es zuerst rekursiv versucht, aber mein Dolmetscher, wie er gerade entworfen wurde, kann es tatsächlich nicht. Wenn Sie versuchen, innerhalb einer for-Schleife eine Rekursion durchzuführen, wird eine neue Rekursion gestartet. Also habe ich mich für den tabellarischen Ansatz entschieden ... der Präzisionsprobleme hatte. Also habe ich das Ganze mit Brüchen gemacht. Ohne eingebaute Unterstützung für Brüche. [ seufzt ]
Probieren Sie es hier aus. Bonus: Das Array enthält alle Brüche für jede vorherige Bernoulli-Zahl!
Erklärung (kurz)
Die dritte Zeile ist verantwortlich für
1/2
ifm
ist 1 und0/1
ifm
ist eine ungerade Zahl größer als 1. Die zweite Zeile berechnetB_m
mit der in der Frage angegebenen Summenformel und zwar vollständig mit Zählern und Nennern. Sonst wäre es viel kürzer. Die erste Hälfte der ersten Zeile führt einige Buchhaltungsaufgaben aus und entscheidet, ob die zweite oder die dritte Zeile ausgeführt werden soll. In der zweiten Hälfte werden Zähler und Nenner durch ihre GCD (falls zutreffend) geteilt und diese Werte gespeichert. Und gibt die Antwort am Ende aus.quelle
Python 2, 118 Bytes
6 Bytes aufgrund von xsot gespeichert .
Sparte
610 mehr durch Peter Taylor .Verwendet die folgende Identität:
wo A n ist die n - te Alternating Anzahl , die formal als die Anzahl der alternierenden Permutationen auf einen Satz von Größe definiert werden kann , n , halbierte (siehe auch: A000111 ).
Der verwendete Algorithmus wurde ursprünglich von Knuth und Buckholtz (1967) angegeben :
Python 2, 152 Bytes
Gibt die exakte gebrochene Darstellung aus, die für Werte über 200 erforderlich ist.
quelle
range(2,n)
zurange(n-2)
können verkürzenn-k+1
zun+~k
. Gibt es auch einen Grund, den Sie>>1
anstelle von verwenden/2
? Zuletzt eine triviale Verbesserung, aber Sie können ein paar Bytes durch Aliasing sparenrange
.>>1
mit/2
.print+(n<1)or-(-1.)**(n+n/2)*n/(4**n-2**n)*a[n%2^1%n]
. Und die Berechnung kann für die gleiche Zeichenanzahl erfolgen wiea=[1]*(n+1);exec"a=[(a[j-1]+a[j+1])*j/2for j in range(len(a)-1)];"*(n-1)
n+n/2
ist schlau; 1 muss nicht herausgegriffen werden, da alle anderen ungeraden Werte ohnehin Null sind. Die alternative Berechnung ist bei Bit-Inversionen tatsächlich 4 Byte kürzer, aber aus irgendeinem Grund auch erheblich langsamer.range
eine Iteration gefunden und ausgelassen, um die Initialisierung zu verkürzen. Die Art und Weise, wie Sie gerade und ungerade Indizes aufteilen, ist sehr schön und ermöglicht ein weiteres Speichern, indem Sie das Vorzeichen in die Definition vona
: ziehena=[(-1)**(n/2),n<2]*n
. Dann ist der Rückgabewert+(n<1)or-n/(2.**n-4**n)*a[1]
. Sie haben auch ein Streusemikolon am Ende von Zeile 2.PARI / GP,
5223 BytesUnter Verwendung der berühmten Formel n * ζ (1 - n ) = - B n , wobei ζ die Riemannsche Zetafunktion ist .
Ursprüngliche Lösung, 52 Bytes, unter Verwendung der Erzeugungsfunktion von Bernoulli-Zahlen .
quelle
zeta
Funktion tatsächlich mit Bernoulli-Zahlen berechnet.bernfrac
undbernreal
mit jeweils 8 Bytes sind sie bereits funktionsfähig, daher ist das nicht erforderlichn->
. Aber +1 für eine gute Lösung.Python 3, 112 Bytes
Edit: Ich habe diese Antwort aufgeräumt. Wenn Sie alle anderen Möglichkeiten sehen möchten, die ich mir vorgestellt habe, um diese Frage in Python 2 und 3 zu beantworten, lesen Sie die Überarbeitungen.
Wenn ich die Nachschlagetabelle nicht verwende (und stattdessen Memoization verwende), schaffe ich es, die rekursive Definition auf 112 Bytes zu bringen! WOO! Beachten Sie, dass a
b(m)
zurückgibtFraction
. Wie üblich die Byteanzahl und ein Link zum Testen .Und eine Funktion, die eine Nachschlagetabelle verwendet und die gesamte Bruchtabelle von
b(0)
bisb(m)
einschließlich zurückgibt .quelle
1.
anstelle von1.0
..0
vons
ganz, weil es später schnell ein Schwimmer werden wird.p=v=1;exec('[...];p+=1'*k)
anstelle Ihrer innersten Schleife verwenden?CJam,
69 49 3433 BytesOnline-Demo
Vielen Dank an Cabbie407 , dessen Antwort mich auf den Akiyama-Tanigawa-Algorithmus aufmerksam machte.
Präparation
quelle
PARI / GP, 45 Bytes
Unter Verwendung der gleichen Formel wie meine Python Antwort , mit A n über polylog erzeugt.
Skript testen
Führen Sie
gp
an der Eingabeaufforderung Folgendes aus:quelle
Mathematica,
524842 BytesUnbenannte Funktion, die die Literaldefinition verwendet.
quelle
Sign@#
nötig?Sign@#
gibt es immer noch die richtige Antwort für 0 zurück.Python 2,
132130 BytesDies ist nur eine Golfversion der Referenzimplementierung.
Dies ist in der Praxis etwas langsam, kann aber durch Memoization erheblich beschleunigt werden:
Sie können diese Version online auf Ideone testen .
quelle
gawk4, 79 bytes
77 Byte Code + 2 Byte für
-M
FlagEs ist eine Implementierung des Akiyama-Tanigawa-Algorithmus von der Wikipedia-Seite.
Hatte einige Probleme mit der "6-Dezimalstellen-Regel", da diese die ganze Zahl und dann 6 Stellen ausgibt, aber es gibt hier keine Liste, um die Ergebnisse zu vergleichen.
Ein Fehler ist, dass dies oftmals ein Minuszeichen vor sich zeigt
0.000000
, aber ich denke nicht, dass das falsch ist.Anwendungsbeispiel
Ausgabe von 0 bis 60
quelle
printf"%e"
funktionieren0.00000
s sind nur sehr klein und nicht wirklich Null.GolfScript, 63 Bytes
Online Demo .
Verwenden Sie die gleiche Formel wie meine Python-Antwort .
Skript testen
Der AppHB-Link wird diesbezüglich eine Zeitüberschreitung aufweisen. Wenn Sie GolfScript nicht lokal installiert haben, empfehle ich die Verwendung des Anarchy Golf Interpreters (Formular verwenden, GolfScript auswählen, einfügen, senden).
quelle
Perl, 101 Bytes
Zählt man den Shebang als drei, wird die Eingabe von stdin übernommen.
Verwenden Sie die gleiche Formel wie meine Python-Antwort .
Beispielnutzung
Online Demo .
quelle
R 93 Bytes
Nicht wirklich originell als Lösung. Wenn Sie einen Kommentar haben, zögern Sie nicht!
Ungolfed:
quelle
if
/else
statement-Reihenfolge ändern und verwendenm>0
sowie1:m-1
stattdessen eine Schleife durchführen .Eigentlich ,
4645 Bytes (nicht konkurrierende)Ich wollte schon seit Monaten eine ernsthafte / tatsächliche Antwort geben und jetzt kann ich. Da dies Befehle verwendet, die Seriously im November 2015 nicht hatte, ist es nicht konkurrierend. Golfvorschläge sind willkommen. Probieren Sie es online!
Bearbeiten: Im Februar 2017 gab es ein Update auf Actually, das änderte, welche Funktionsliterale welche sind. Normalerweise würde dies für jede Herausforderung, die vor Februar geschrieben wurde, einfach nicht konkurrieren, aber da diese Antwort bereits nicht konkurriert, habe ich diese Antwort trotzdem bearbeitet. Genießen.
Hierfür wird die explizite Definition der Bernoulli-Zahlen in Wikipedia verwendet.
Ungolfing
quelle
Rubin,
6661 BytesDies ist eine Ruby-Version meiner Python-Antwort.
Da dies
Rational
in seinen Antworten verwendet wird, bin ich mir ziemlich sicher, dass dies bis zu 60 funktioniert, aber ich hatte sogar Probleme beim Ausführenb[24]
, so dass ich die Nachschlagetabelle erneut für868180 Bytes implementiert habe .quelle
J 10 Bytes
Berechnet die n- te Bernoulli-Zahl, indem der n- te Koeffizient der exponentiellen Erzeugungsfunktion von x ermittelt wird / (1 - e -x ).
Verwendung
Wenn der Eingabe eine Ganzzahl oder ein Gleitkomma als Argument übergeben wird, wird ein Gleitkomma ausgegeben. Wenn eine erweiterte Ganzzahl angegeben wird, wird diese mit einem Suffix markiert
x
, wird entweder eine erweiterte Ganzzahl oder eine rationale, zwei durch getrennte erweiterte Ganzzahlen ausgegebenr
.Erläuterung
quelle
Axiom,
134147 Bytesungolf und test
quelle
APL (NARS), 83 Zeichen, 166 Byte
Eingabe als Integerausgabe als Big Rational
quelle
Haskell, 95 Bytes
Dies implementiert die explizite Definition von Bernoulli-Zahlen auf der Wikipedia-Seite .
quelle
Perl 6, 83 Bytes
Eine schnellere 114-Byte-Lösung:
quelle
Javascript, 168 Bytes
Setzen Sie die Variable 'k' auf die gewünschte Bernoulli-Zahl und das Ergebnis ist c [0] über a [0]. (Zähler Nenner)
Beispielnutzung
Nicht so klein wie die anderen, aber der einzige, den ich geschrieben habe, der nahe kommt. Unter https://marquisdegeek.com/code_ada99 finden Sie Informationen zu meinen anderen (nicht Golf-) Versuchen.
quelle
Axiom, 57 Bytes
Code für Test und Ergebnisse
man muss beachten, dass die Funktion nicht diejenige ist, die oben geschrieben wurde, sondern
t*%e^t/(%e^t-1))
mit% e Euler costantquelle
Pyth , 22 Bytes
Probieren Sie es online!
Definiert eine Funktion, die aufgerufen wird als
y<number>
zyQ
.quelle