Offtopic Projekte
Kommentare Zurück zur Übersicht

Asymmetrische Probleme - Primfaktorenzerlegung

Manchmal ist es leichter, etwas zu verbinden,
als es wieder voneinander zu lösen.
Computer können heutzutage Primzahlen mit Millionen von Stellen multiplizieren,
aber die Prozedur umzukehren ist nahezu unmöglich.
David Lagercrantz, Verschwörung, Seite 471, Verlag Heyne 2015

Bitte geben Sie in das Feld darunter eine Zahl ein, die in Primfaktoren zerlegt werden soll. Die Berechnungsdauer hängt von der Komplexität der Zahl ab - nicht unbedingt von seiner Größe allein.
Natürlich ist eine Scriptsprache wie JavaScript und die Debug-Umgebung eines Browers nicht darauf ausgelegt, extrem hohe arithmetische Operationen durchzuführen aber dennoch ist das Ergebniss brauchbar.


Hier stehen die Anzahl der Iterationen: z. B. 51

Hier steht das Ergebnis: z. B. 2 x 3 x 5 x 7 x 11 x 13 x 17 = 510510

Werfen wir einen Blick auf den Code. Zuerst brauchen wir vier HTML Elemente. Eines für die Eingabe. Einen Button um die Berechnung zu starten und zwei Ausgabefeld, wobei eines die Anzahl der Iterationen anzeigt und das andere die Primfaktoren Zerlegung.

<input type="text" id="startwert" name="startwert" value="510510"><br>
<input type="button" value="In Primfaktoren zerlegen" id="startbutton" onClick="berechnung();>
<p id="iterat"></p>
<p id="ausgabe"></p>

Der HTML Spass kann selbstverständlich mit CSS angepasst werden, wie man es für schön und richtig hält!
Der Value-Wert (sodenn es den Begriff überhaupt gibt ... Value-Wert, was habe ich mir dabei gedacht?) ist hier mit 510510 vorgegeben. Eine zutiefst mystische Zahl - oder? Aber es ist der Faktor der ersten sieben Primzahlen (wenn man halt die Eins nicht als Primzahl betrachtet, denn dann wären es nämlich acht).

Jetzt zum fleißigen JavaScript, dass für uns die mühsame Arbeit abnimmt:

function berechnung() {
  var sw = 0;
  var ausgabe = "";
  var ps = 1;
  var zae = 0;
  var abschluss = "";

  document.getElementById("ausgabe").innerHTML = "";

  sw = document.getElementById("startwert").value;
  abschluss = " = " + sw;

  if(isNaN(sw) || sw == "" || sw < 0 || (sw % 1) != 0) 
  { 
    document.getElementById("startwert").value = "";
    document.getElementById("startwert").focus();
    ausgabe = "Bitte eine positive Zahl eingeben und nicht: ";
    abschluss = " oder " + sw;
    sw = 0;
  }

  while (sw > ps
  {
    ps = ps + 1;
    zae = zae + 1;
    if ((sw%ps) == 0 && (sw/ps) !== 1 && (sw/ps) !== sw
    {
    ausgabe = ausgabe + ps + " x ";
    sw = sw /ps;
    ps = 1;
    }
  }
  ausgabe = ausgabe + sw + abschluss;
  document.getElementById("iterat").innerHTML = "Anzahl der Iterationen: " + zae;
  document.getElementById("ausgabe").innerHTML = ausgabe;
}

Natürlich gehört zum guten Programmieren auch sehr viel Kosmetik dazu.
Der folgende Codeblock überprüft eigentlich nur die Integrität des Users und kann als arroganter Teil des Codings verstanden werden.
Obgleich natürlich sich auch jegliche Form von Überheblichkeit sofort gegen den Schreiber bzw. die Schreiberin richtet, denn, wieso sollte es keine Primfaktorenzerlegung mit negativen Zahlen geben?
Ich sage es ganz ehrlich: Das wäre eine andere Gehaltsklasse!

if(isNaN(sw) || sw == "" || sw < 0 || (sw % 1) != 0) 

  document.getElementById("startwert").value = "";
  document.getElementById("startwert").focus();
  ausgabe = "Bitte eine positive Zahl eingeben und nicht: ";
  abschluss = " oder " + sw;
  sw = 0;
}

Das Herzstück kommt aber jetzt, weil es die logische Abfolge der Primfaktorenzerlegung beschreibt.

while (sw > ps
{
  ps = ps + 1;
  zae = zae + 1;
  if ((sw % ps) == 0 && (sw / ps) !== 1 && (sw / ps) !== sw
  {
    ausgabe = ausgabe + ps + " x ";
    sw = sw /ps;
    ps = 1;
  }
}

Aber da ich ja ein massiv unterbezahlter und eher minderbemittelter JavaScript-Spieler bin, ist das auch das einzige was ich präsentieren kann. Wahrscheinlich gibt es eine effizientere rekursive Lösung. Wahrscheinlich könnte die Eingabe auch in vierer oder achter Blöcke aufgespalten werden um noch größere Zahlen in schnellere Zeit aufzulösen. Aber genau deshalb habe ich mir die Arbeit angetan und diesem Script eine Kommentarfunktion hinzugefügt!

24. Jun 2024 - 14:37
Hier könnte dein Kommentar stehen!

Thomas Maier css4.at Logo
Thomas Maier Impressum OER: CC BY NC SA 2022-08-10