Da es sehr viele normale Fibonacci-Herausforderungen gab, entschied ich, dass es interessant sein könnte, die reziproke Fibonacci-Konstante zu berechnen - nämlich die Summe der Reziprokwerte der Fibonacci-Sequenz.
Die Herausforderung besteht darin, die reziproke Fibonacci-Konstante mit der Anzahl der Fibonacci-Reihen zu berechnen, um die als Eingabe angegebene Ziffer zu verwenden, dh eine Eingabe von 10 bedeutet, basierend auf den Kehrwerten der ersten 10 Fibonacci-Zahlen zu berechnen. Im wahrscheinlichen Fall eines Unentschieden gewinnt der kürzeste Code.
Der Gewinner wird in drei Wochen nach den Standard-Code-Golf-Regeln ermittelt.
φ
eingebaut ist. (zur Abwechslung nicht APL)Antworten:
K (19)
(oder 17, wenn Sie die Definition als Funktion überspringen)
Auf Kona getestet.
Grundsätzlich werden die ersten x-Werte der Fibonacci-Sequenz in einem Array generiert (ohne eingebaute Elemente), 1 durch jeden Wert des gesamten Arrays dividiert, transponiert und zusammengefasst.
(danke an @tmartin für die bessere Summenmethode)
quelle
{+/*+%x(|+\)\|!2}
Perl - 35 Bytes
Beispielnutzung:
Weitere Analyse
Es ist interessant festzustellen, dass die Summe
ist konvergent. Angenommen, wir wollten ein paar tausend Stellen oder so berechnen, ist der naive Ansatz fast ausreichend. Die Konvergenz ist zunächst recht langsam, beschleunigt sich jedoch schnell, sodass 1000 Stellen nur etwa 4800 Terme benötigen . Eine Beispiel-Python-Implementierung könnte sein:
was nach einer Sekunde oder so ausgibt:
(Die letzten vier Ziffern konvergieren nicht ganz, aber das werden wir vorerst ignorieren.)
Versuchen wir, die Konvergenz etwas zu beschleunigen. Ein Standardtrick ist die Verwendung von Eulers Transformation . Nach Erweiterung und Vereinfachung ergibt sich ein schöneres Ergebnis:
Es sollte ziemlich offensichtlich sein, warum dies schneller konvergiert; Jeder Term hat 3 Terme im Nenner und nicht nur einen. Die Berechnung von 1000 Stellen erfordert nur 1600 (ein Drittel so viele) Begriffe:
Ausgabe:
(Auch hier konvergieren die letzten 4 Ziffern nicht.)
Wir sind noch nicht ganz fertig. Wenn wir benachbarte Begriffe kombinieren, erhalten wir Folgendes:
Das Ausklammern jedes Terms aus dem Rest der Summierung ergibt den verschachtelten Ausdruck:
Jetzt kommen wir irgendwohin. Beachten Sie, dass die Zähler von OEIS A206351 folgen (mit Ausnahme des ersten Terms, der verdoppelt wird):
und die Nenner folgen OEIS A081016 (um einen Begriff verschoben):
Jedes von diesen hat sehr einfache Wiederholungsrelationen, nämlich:
und
beziehungsweise. Alles in allem benötigen wir nur 800 Iterationen für 1000 Ziffern:
welche Ausgänge:
(Hier konvergieren schließlich die letzten 4 Ziffern korrekt.)
Das ist aber noch nicht alles. Wenn wir die Zwischenwerte für s beobachten , stellen wir fest, dass sie vollständig auf einen anderen Wert konvergieren, bevor sie auf den tatsächlichen Konvergenzpunkt konvergieren. Der Grund dafür ist folgender:
Wenn wir nach einem stabilen s suchen, finden wir Folgendes:
Da dies eine einfache Wurzel ist, können wir die Newtonsche Methode verwenden , um den größten Teil des Weges dorthin zu finden, und dann zu einem viel späteren Zeitpunkt in der Iteration einspringen. Es sind nur etwa 400 Stellen Genauigkeit erforderlich (da die b- und c- Werte ohnehin nicht größer sind), was mit nur 7 Iterationen erreicht werden kann, während 320 Iterationen der Hauptschleife gespeichert werden:
Die Ausgabe ist identisch mit der vorherigen, die Laufzeit beträgt auf meinem System mit PyPy v2.1 etwa 0,02 Sekunden. Obwohl es ein Zehntel der Anzahl von Iterationen wie das Original benötigt, ist es aufgrund der Multiplikation und Division durch viel kleinere Begriffe deutlich schneller als das Zehnfache. Ich denke nicht, dass viel mehr daran geändert werden kann, obwohl ich froh wäre, wenn ich falsch dargestellt würde.
quelle
Mathematica (32 Zeichen ohne eingebauten Fibonacci)
Hier habe ich die Rundungsformel für Fibonacci-Zahlen verwendet
Wo
φ
ist der goldene Schnitt?quelle
Kona (
2521)Könnte wahrscheinlich von Experten verkleinert werden, aber ich lerne immer noch die Sprache.
Der letzte hat nicht länger gedauert als die anderen.
quelle
%
als wechselseitige Funktion verwenden, anstatt1.%
-{+/%(x(|+\)\1 1)[;1]}
für 21 Zeichenf 0
Ergebnisse in1.0
,f 1 -> 2.0
und so weiter.Mathematica
3024Mit 6 Zeichen dank ybeltukov gespeichert.
Vor dem Hinzufügen der Begriffe:
Mit Zusatz enthalten:
quelle
Fibonacci
istListable
:) Es kann reduziert werden aufTr[1/Fibonacci@Range@#]&
APL, 21 Zeichen / Bytes *
Beispiel
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ *: APL kann in einem eigenen ( alten) Einzelbyte -Zeichensatz geschrieben werden, der APL-Symbole den oberen 128-Byte-Werten zuordnet
. Für die Bewertung kann daher ein Programm mit N Zeichen , das nur ASCII-Zeichen und APL-Symbole verwendet, als N Byte lang angesehen werden.
quelle
Javascript, 33
Eingang:
n = 10
Basierend auf meinem ersten Beitrag in Perl ist hier das Ergebnis direkt von der Google Chrome-Konsole .
quelle
K, 22
...
quelle
GTB , 35
Läuft auf einem TI-84-Rechner
1
inY
und0
inX
N
als EingabeFor
SchleifeX
Y
inZ
undX+Y
inY
Z
inX
For
Schleifequelle
BC - 116
rufe r (n) mit n auf, um zu lösen. Die Genauigkeit kann beliebig eingestellt werden, daher ist dies die genaueste Lösung.
quelle
PERL,
6243Bearbeiten:
Nachdem ich mir meinen Code noch einmal angesehen hatte, konnte ich 19 Zeichen speichern:
quelle
Viertens 64
Verwendungszweck:
quelle
Python (
5551)Im interaktiven Modus:
quelle
Perl 6 , 27 Bytes
Probieren Sie es online aus!
Alternative
Probieren Sie es online aus!
quelle
Japt
-mx
, 6 BytesVersuch es
quelle
C # (.NET Core) , 66 Byte
Probieren Sie es online aus!
Floats können wegen Ungenauigkeit nicht verwendet werden.
Beispiel mit Eingabe = 8:
Ungolfed:
quelle
RPL (HP 49G / G + / 50 g), 50 Bytes
Beispiele:
10 -> 3.33046904076
11 -> 3.34170499582
30 -> 3,35988372158
55 -> 3.35988566622
Theoretisch würde die Summe der ersten 55 Ziffern 12 korrekte Ziffern ergeben. Die letzte Ziffer sollte '4' anstelle von '2' sein. Dies sollte behoben werden, indem die Begriffe rückwärts addiert werden, der Code wäre jedoch etwas länger.
Wenn die Konstante unter Verwendung der Definition auf 1000 Dezimalstellen berechnet werden soll, sollte die Summe mindestens zu den ersten 4790 Termen ausgeführt werden, was auf dem HP 50g, wenn möglich, zu viel Zeit in Anspruch nehmen würde. Für diese Aufgabe ist eine effizientere Methode erforderlich, wie sie im folgenden RPL-Programm (464 Byte, Prüfsumme Nr. 207Eh) verwendet wird, dessen Argument die gewünschte Anzahl von Dezimalstellen ist:
1000 RFC ->
3.3598856662431775531720113029189271796889051337319684864955538153251303189966833836154162164567900872970453429288539133041367890171008836795913517330771190785803335503325077531875998504871797778970060395645092153758927752656733540240331694417992939346109926262579646476518686594497102165589843608814726932495910794738736733785233268774997627277579468536769185419814676687429987673820969139012177220244052081510942649349513745416672789553444707777758478025963407690748474155579104200675015203410705335285129792635242062267537568055761955669720848843854407983324292851368070827522662579751188646464096737461572387236295562053612203024635409252678424224347036310363201466298040249015578724456176000319551987905969942029178866949174808096746523682654086938399069873211752166957063859411814553647364268782462926166650100098903804823359519893146150108288726392887669917149304053057745574321561167298985617729731395370735291966884327898022165047585028091806291002444277017460241040417786069190065037142835294
(22 min 23 sec, auf dem echten HP 50g)
Für tausend Stellen werden die ersten 50 Terme der Reihe plus weitere 50 Terme eines fortgesetzten Bruchs ausgewertet, jeweils zwei in nur 25 Iterationen (jeweils 48 Terme hätten ausgereicht). Ein gleichwertiges DECIMAL BASIC-Programm benötigt auf meinem Computer nur 10 Millisekunden (Intel (R) Core (TM) Duo-CPU E4700 bei 2,6 GHz).
quelle
JAEL,
97 BytesDas Ändern der diakritischen Zeichen von einem Zeichen zu einem anderen gab mir 1 Byte
Arbeitet noch an der SBCS-Codierung.
Erläuterung (automatisch generiert):
quelle
u.
. Beim Thema SBCS können Probleme auftreten, da in Ihren Dokumenten über 600 Befehle oder Befehlskombinationen aufgeführt sind und eine SBCS-Sprache nur 256 Einzelbyte-Befehle enthalten kann. Auf der anderen Seite gibt es eine große Anzahl nutzloser Einzelübersetzungen ...Gelee , 5 Bytes
Probieren Sie es online aus!
Wie es funktioniert
quelle
cQuents ,
1311 BytesProbieren Sie es online aus!
Erläuterung
quelle