Die Goldbach-Vermutung besagt, dass jede gerade Zahl größer als zwei als die Summe zweier Primzahlen ausgedrückt werden kann. Beispielsweise,
4 = 2 + 2
6 = 3 + 3
8 = 5 + 3
Sobald wir jedoch 10 sind, passiert etwas Interessantes. Nicht nur 10 kann als geschrieben werden
5 + 5
es kann aber auch so geschrieben werden
7 + 3
Da 10 auf zwei Arten als die Summe zweier Primzahlen ausgedrückt werden kann , sagen wir, dass die "Goldbach-Partition" 10 ist 2
. Oder allgemeiner
Die Goldbach-Teilung einer Zahl ist die Gesamtzahl der unterschiedlichen Schreibweisen, bei
n = p + q
denenp
undq
Primzahlen und sindp >= q
Ihre Herausforderung besteht darin, ein Programm oder eine Funktion zu schreiben, die die Goldbach-Partition einer Zahl findet. Technisch wird der Begriff "Goldbach-Partition" nur für gerade Zahlen verwendet. Da die ungerade ganze Zahl p + 2 auch als Summe zweier Primzahlen ausgedrückt werden kann, wenn p> 2 eine Primzahl ist, wird dies auf alle positiven ganzen Zahlen ausgedehnt ( A061358 ).
Sie können davon ausgehen, dass Ihre Eingabe immer eine positive Ganzzahl ist, und Sie können Eingaben und Ausgaben in einer unserer zulässigen Standardmethoden vornehmen, z. B. Funktionsargumente und Rückgabewerte, STDIN und STDOUT, Lesen und Schreiben in eine Datei usw.
Die Goldbach-Partitionen der positiven ganzen Zahlen bis zu 100 sind:
0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 0, 1, 1, 2, 1, 2, 0, 2, 1, 2, 1, 3, 0, 3, 1,
3, 0, 2, 0, 3, 1, 2, 1, 4, 0, 4, 0, 2, 1, 3, 0, 4, 1, 3, 1, 4, 0, 5, 1, 4,
0, 3, 0, 5, 1, 3, 0, 4, 0, 6, 1, 3, 1, 5, 0, 6, 0, 2, 1, 5, 0, 6, 1, 5, 1,
5, 0, 7, 0, 4, 1, 5, 0, 8, 1, 5, 0, 4, 0, 9, 1, 4, 0, 5, 0, 7, 0, 3, 1, 6
Wie üblich gelten Standardlücken und die kürzeste Antwort in Bytes gewinnt!
Antworten:
Gelee , 8 Bytes
Probieren Sie es online! oder überprüfen Sie alle Testfälle .
Wie es funktioniert
quelle
Python 2, 76 Bytes
Kriecht rekursiv von
k=2
bisn/2
und addiert Werte, bei denen beidek
undn-k
Primzahlen sind. Es sei schön, zu zählen ,n
statt zur gleichen Zeit nach unten, aber das hat ein Problem , dask=0
undk=1
fälschlicherweise prime genannt werden:Die Primalitätsprüfung ist eine Probedivision, die durch die Prüfung beider
k
undn-k
zusammen verkürzt wird . Ich fand dies kürzer als die Verwendung eines Wilson-Theorem-Generators (79 Bytes):Die Idee für dieses ist, eine Liste aller Primzahlen in der unteren Hälfte zu führen, um sie zu überprüfen, bis wir in der oberen Hälfte sind, aber für den Mittelpunkt
k=n/2
hatten wir keine Zeitn-k
, die Liste zu erweitern, wenn wir ankommenk
. Eine iterative Version umgeht dies, hat aber 82 Bytes:quelle
MATL , 8 Bytes
Probieren Sie es online!
Erläuterung
Betrachten Sie die Eingabe
8
als BeispielEs ist interessant, das Diagramm der Sequenz mit einer leicht modifizierten Version des Codes zu beobachten:
Für die Eingabe ist
10000
das ErgebnisSie können es bei MATL Online ausprobieren (Aktualisieren Sie die Seite, wenn sich die Schaltfläche "Ausführen" nicht in "Töten" ändert, wenn Sie darauf klicken ). Es dauert einige ungefähr 25 Sekunden, um das Diagramm für die Eingabe zu erzeugen
3000
. Eingaben über ein paar Tausend werden auslaufen.quelle
Upper triangular part
Trick ist wirklich cool!JavaScript (ES6),
777370 Byte3 Bytes dank @Arnauld eingespart
f
ist eine Primalitätstestfunktion; die relevante Funktion istg
.f
arbeitet, indem rekursiv von n-1 heruntergezählt wird ; Der Kontrollfluss in jeder Phase sieht folgendermaßen aus:x<2||
Wenn x <2 ist , ist die Zahl eine Primzahl; return 1 .n%x&&
Wenn andernfalls n mod x = 0 ist , ist die Zahl keine Primzahl; zurückkehrenn%x
.f(n,x-1)
Andernfalls kann die Zahl eine Primzahl sein oder nicht. Dekrementiere x und versuche es erneut.g
funktioniert ähnlich, allerdings mit weniger Kontrollfluss. Es funktioniert, indem f (b) mit f (ab) für jede ganze Zahl b im Bereich [2, Etage (a / 2)] multipliziert und dann die Ergebnisse summiert werden. Dies gibt uns die Anzahl der Paare, die sich zu einer Summe summieren, bei der beide Zahlen im Paar Primzahlen sind, und genau das ist, was wir wollen.quelle
a
ist positiv,b=a>>1
sollte man sich ein Byte sparen.>>
Operator erinnern sollen ...f=(n,x=n)=>--x<2||n%x&&f(n,x)
?05AB1E ,
108 BytesExtrem ineffizient.
Probieren Sie es online! oder Versuchen Sie es mit einer weniger effizienten Methode zum Generieren von Primzahlen
Erläuterung
n = 10
als Beispiel verwendet.quelle
ü
stattdessen verwenden? WieD!fü+r¢
?n=10
count (10, [5,8,12]), das 0 statt 2ü
ist, wird nur zwischen jedem Elementpaar angewendet. Es gab mir die Idee, es zu versuchenã
, aber das stellte sich leider 1 Byte länger heraus.GAP , 57 Bytes
Ich denke nicht, dass GAP einen kürzeren Weg als diesen offensichtlichen hat.
Number
zählt, wie viele Elemente einer Liste ein Prädikat erfüllen.Verwenden Sie es, um die ersten 100 Werte zu berechnen:
quelle
Brachylog , 22 Bytes
Probieren Sie es online!
Erläuterung
Eine direkte Abschrift des Problems.
quelle
Mathematica, 52 Bytes
Das Ergebnis wird als anonyme Funktion bereitgestellt. Versuchen Sie, ein Diagramm darüber zu zeichnen:
Der Code hat übrigens die gleiche Länge wie die Funktionsversion des Demo-Codes auf OEIS.
quelle
PrimeQ[#~IntegerPartitions~{2}]~Count~{a=True,a}&
Gelee , 12 Bytes
TryItOnline
1-100
Wie?
quelle
Schläger 219 Bytes
Ungolfed:
Testen:
Ausgabe:
quelle
Eigentlich 11 Bytes
Probieren Sie es online!
Erläuterung:
quelle
05AB1E , 6 Bytes
Probieren Sie es online!
Erläuterung:
quelle
Haskell, 73 Bytes
Anwendungsbeispiel:
map f [1..25]
->[0,0,0,1,1,1,1,1,1,2,0,1,1,2,1,2,0,2,1,2,1,3,0,3,1]
.Direkte Implementierung der Definition: Zuerst
r
an alle Primzahlen bindenn
, dann ein1
für allep
undq
vonr
woq<=p
undp+q==n
und addieren.quelle