Goldbachzahl
Zerlegt eine gerade Zahl in alle möglichen Summen zweier Primzahlen und zählt, wie viele es sind.
Dieses Script von unserem User „Vollautomatisch" beschäftigt sich mit einer der bekanntesten offenen Fragen der Mathematik. Die Goldbachsche Vermutung besagt: Jede gerade Zahl größer als 2 lässt sich als Summe zweier Primzahlen schreiben. Für 512 gilt zum Beispiel 512 = 3 + 509, aber auch 512 = 13 + 499 und noch etliche Kombinationen mehr. Die Anzahl dieser verschiedenen Möglichkeiten nennt man die Goldbachzahl der betreffenden Zahl.
Tragt eine Zahl in das Feld ein und klickt auf „Zerlegungen anzeigen". Im Textfeld darunter erscheinen dann alle Summen zweier Primzahlen, die eure Zahl ergeben, und in der Ergebniszeile steht am Ende die Goldbachzahl — also schlicht die Anzahl der gefundenen Zerlegungen. Der zweite Knopf leert alle Felder wieder. Vorbelegt ist die 512.
Ein paar Eigenheiten der Rechnung solltet ihr kennen: Ungerade Eingaben werden automatisch um eins erhöht, denn für ungerade Zahlen ist die Frage nicht gestellt. Zahlen unter 6 setzt das Script auf 6 hoch. Und gezählt wird jede Zerlegung nur einmal — 512 = 3 + 509 und 512 = 509 + 3 sind dieselbe Summe, deshalb sucht das Script nur bis zur Hälfte der Zahl.
Die Vermutung stammt aus einem Briefwechsel zwischen Christian Goldbach und Leonhard Euler aus dem Jahr 1742. Bis heute ist sie nicht bewiesen, obwohl sie mit Computern für alle geraden Zahlen bis weit über eine Trillion hinaus überprüft wurde. Auffällig ist dabei: Je größer die Zahl, desto mehr Zerlegungen gibt es in der Regel — ein Gegenbeispiel wird also immer unwahrscheinlicher, was aber eben kein Beweis ist.
Wer sich für Primzahlen selbst interessiert, findet im selben Fach die Primzahlen, die Primzahlen innerhalb eines Wertebereichs und die Primfaktorzerlegung.
Ungerade Eingaben werden auf die nächste gerade Zahl erhöht. Aus Rücksicht auf den Browser ist bei 100.000 Schluss.
So funktioniert das Script
Das Script hat zwei klar getrennte Aufgaben. Die Funktion istPrim() beantwortet für eine einzelne Zahl die Frage „Primzahl oder nicht?". Die Funktion zerlegen() bereitet die Eingabe auf, probiert alle in Frage kommenden Summanden durch und schreibt die Fundstellen ins Textfeld. Beides steckt in einer sofort ausgeführten Funktion, damit die Namen im Script nicht mit anderen Scripts der Seite kollidieren.
function istPrim(zahl) {
if (zahl === 2 || zahl === 3) return true;
if (zahl < 2 || zahl % 2 === 0) return false;
const wurzel = Math.sqrt(zahl);
for (let teiler = 3; teiler <= wurzel; teiler = teiler + 2) {
if (zahl % teiler === 0) return false;
}
return true;
}
Der Primzahltest arbeitet mit dem Rest-Operator %: zahl % teiler liefert den Rest der Division. Ist er 0, geht die Division auf — die Zahl hat also einen Teiler und ist keine Primzahl. Zuerst werden 2 und 3 als Sonderfälle abgehakt, dann alles unter 2 und alle geraden Zahlen aussortiert. Danach probiert die Schleife nur noch ungerade Teiler durch, denn gerade Teiler sind schon ausgeschlossen.
Der eigentliche Trick steckt in Math.sqrt(zahl): Die Schleife läuft nur bis zur Quadratwurzel. Das genügt, weil ein Teiler oberhalb der Wurzel immer einen Partner unterhalb der Wurzel hätte — den hätte die Schleife also längst gefunden. Bei 10.000 spart das den Unterschied zwischen 100 und 5.000 Prüfungen, und genau davon lebt die Geschwindigkeit des Scripts.
if (zahl < 5) {
zahl = 6;
}
if (zahl % 2 !== 0) {
zahl = zahl + 1;
}
Bevor gesucht wird, bringt das Script die Eingabe in eine brauchbare Form. Zu kleine Zahlen werden auf 6 gesetzt, ungerade Zahlen um eins erhöht — die Goldbachsche Vermutung ist ja eine Aussage über gerade Zahlen. parseInt(eingabe.value, 10) davor macht aus dem Text des Eingabefelds eine ganze Zahl; die 10 gibt an, dass die Ziffern im Zehnersystem zu lesen sind.
for (let summand = 3; summand <= zahl / 2; summand = summand + 2) {
if (istPrim(summand) && istPrim(zahl - summand)) {
const kopf = zeilen.length === 0 ? String(zahl) : " ";
zeilen.push(kopf + " = " + summand + " + " + (zahl - summand));
}
}
Das ist die Suche selbst. Der erste Summand läuft von 3 in Zweierschritten aufwärts — nur ungerade Zahlen, denn außer 2 ist keine gerade Zahl prim. Für jeden Kandidaten prüft das && („und") zwei Bedingungen gleichzeitig: Der Summand muss prim sein und der Rest zahl - summand ebenfalls. Nur dann ist eine Zerlegung gefunden.
Die Schleife endet bei zahl / 2. Danach kämen nur noch Spiegelbilder bereits gefundener Summen — 512 = 509 + 3 ist dieselbe Zerlegung wie 512 = 3 + 509. Der Ausdruck mit dem Fragezeichen heißt Bedingungsoperator und ist eine Kurzform für „wenn … dann … sonst …": In der ersten Zeile steht die Zahl selbst, in allen weiteren nur drei Leerzeichen, damit die Gleichheitszeichen darunter bündig stehen.
liste.value = zeilen.join("\n");
ausgabe.innerHTML =
"Goldbachzahl (" + zahl + ") = <strong>" + zeilen.length + "</strong>";
Gesammelt werden die Treffer in dem Feld zeilen — einem Array, also einer Liste von Werten. join("\n") hängt alle Einträge mit einem Zeilenumbruch dazwischen zu einem einzigen Text zusammen, der ins Textfeld geschrieben wird. Und weil ein Array seine Länge kennt, ist zeilen.length ganz nebenbei schon die gesuchte Goldbachzahl — es muss gar nicht extra mitgezählt werden.
Zum Anpassen: Die Konstante GRENZE ganz oben legt fest, wie große Zahlen zugelassen sind. Sie schützt davor, dass der Browser bei Millionenwerten minutenlang blockiert — wer einen schnellen Rechner hat, darf sie vorsichtig erhöhen. Und wenn ihr statt der Liste nur die Anzahl braucht, lasst einfach die Zeile mit zeilen.push(…) weg und zählt stattdessen mit anzahl++ hoch.
Script für die eigene Homepage
Kopiert euch den kompletten Code und fügt ihn an der Stelle eurer Seite ein, an der das Script erscheinen soll. Er läuft ohne weitere Dateien und ohne fremde Server.
Mehr aus der Kategorie Mathematik
-
5 Zahlen
-
Altersberechnungen
-
Anzahl der Stellen von Potenzen kalkulieren
-
Barrel in Liter
-
Beliebige Wurzel ziehen
-
Binomialverteilung
-
Collatz Problem
-
Denk Dir eine Zahl
-
Dezimalbruch
-
Dezimalzahl in Binärzahl umwandeln
-
Die Kamelhändler
-
Downloadzeit-Rechner
-
Drehender Kreis 1
-
Drehender Kreis 2
-
Drehender Kreis 3
-
Dreiecksrechner
-
Dreisatz
-
Dreisatz antiproportional
-
Einfacher Euro-Rechner
-
Fakultät berechnen
-
Fakultätsrechner
-
Fibonacci Reihe berechnen
-
Fibonacci-Zahlen
-
Flächenberechnung / Dreieck
-
Flächenberechnung / Kreis
-
Flächenberechnung / Parallelogramm
-
Flächenberechnung / Rechteck
-
Flächenberechnung / Trapez
-
Gedanken lesen
-
Geschwindigkeitsmesser