C++ Primfaktorzerlegung nur bis 9-stellige Zahlen

Wobei ich die Wurzel auch nur einmal berechnen würde und nicht bei jedem Schleifendurchgang... auch wenn es durchaus sein kann, dass es durch Compiler-/CPU-Optimierungen auch nur einmal berechnet wird.
 
Mein Programm funktioniert jetzt auch mit größeren Zahlen, vielen Dank für die ganze Hilfe und Optimierungen. ^^
 
Die Wurzelberechnung würde sich bei jeder Schleife neu berechnen, da sich ja die Variable bei jeden durchgang geändert hat (zahl /= p).
 
  • Gefällt mir
Reaktionen: KitKat::new()
Eben, genau, danke, war mir anfangs beim Betrachten klar, aber als der Vorschlag kam, hab ich mich in die Irre führen lassen.

Vermutlich würde ich statt der Wurzel jedes Mal das Quadrat von p berechnen, dürfte schneller gehen.
 
Mein Vorschlag wäre ja,das ganze zu partitionieren.

1. Prinzahlen sind invariabel.
Ergo kann man bis zu einem festzulegenden n alle Primzahlen irgendwo festschreiben (preseed) oder in einem ersten Schritt ermitteln. Praktisch ergibt sich eine solche Obergrenze bereits aus dem nutzbaren Wertebereich mit max(Primzahl) <= sqrt(maximaler Input) zum einen und maxInput element (unsigned)int64.

2. Die Liste der so ermittelten Primzahlen ist insbesondere in Relation zur Gesamtmenge der möglichen (und zulässigen) Inputs minimal.

3. Infolgedessen läßt sich mein Kandidat i, für den ich einen Primzahlzerlegung haben will, per einfacher Iteration über die in (1) festgeschriebene Menge der Primzahlen ermitteln mit absteigender Ordnung, um erwarteten Aufwand zu sparen (da es keinen fixen Abstand zwischen den einzelnen Primzahlen gibt).

4. Insbesondere können wir den Vorgang rekursiv angehen: Jeder Input setzt sich notwendigerweise zusammen aus einer Primzahl (dh. der Faktor p steck in meinem Primzahl-Preseed) und einer Unbekannten, von der gesucht ist, ob diese denn eine Primzahl ist oder nicht.

5. Entsprechend erhalten wir eine Handlungsanweisung nach:
A übernehme Subrange des Primzahl-Preseeds von 2 bis zur größten Primzahl, die noch kleiner(oder gleich) srt(input) ist
B Führe ganzzahlige Division durch mit input DIV pz, angefangen mit der größten PZ aus (A) und nimm auch den Divisionsrest mit
C Brich ab wenn der Divisionsrest gleich 0 ist
D Gib die aktuelle PZ aus als Faktor und starte die Funktion mit dem Divisionsergebnis neu.

(Natürlich ist ein geeignetes Abbruchkriterum zu finden, damit meine 8 auch wirklich drei "2" auf den Bildschirm zeichnet; nicht weniger, aber auch nicht mehr.)

Ergebnisse sollten so signifikant schneller auf der Konsole landen.

Protip: niemals in einer Schleife irgendwas auf den Bildschirm zeichnen => verlangsamt den Ablauf signifikant.
Stattdessen das Ergebnis aufheben und nach der Schleife als Ganzes ausgegen.
 
Zuletzt bearbeitet von einem Moderator:
  • Gefällt mir
Reaktionen: BeBur
@RalphS: Ich denke der TE wird für deine Ausführungen sehr froh sein. Ich denke, er war auf der Suche nach dem perfekten und optimiertesten Algorithmus für das Problem.

Warum eigentlich mit der größten Primzahl anfangen in (B)? Welchen Unterschied macht es aus deiner Sicht, ob man mit der kleinsten oder der größten Primzahl anfängt? Spart man sich damit Arbeit?

Mein Vorschlag wäre, übrigens, dass der TE das hier implementiert: https://de.wikipedia.org/wiki/Quadratisches_Sieb
Und anschließend das: https://de.wikipedia.org/wiki/Zahlkörpersieb
 
Okay, die Verarbeitungsrichtung der PZ ist sicherlich eher uninteressant. Ansatz war da, daß ich weniger PZ angucken muß. Aber natürlich gibt es trotzdem nur eine fixe Anzahl PZ zum anschauen und das sind wenige, sodaß dies wenn überhaupt kaum ins Gewicht fällt.

Ich ganz persönlich halte das Sieb in der Programmierung für suboptimal- zumindest auf heimischen PCs - wegen des in Abhängigkeit der größten gesuchten PZ quadratischen Speicherbedarfs. Da kann man iterativ vorgehen und sich einfach die gefundenen PZ merken - nicht alles was die Mathematik optimal nennt, ist auch für die Informatik optimal.

Aber der Einwand war vermutlich nicht ganz ernst gemeint, im Hinblick auf das NFS — das braucht zuhause keiner und es wird dort wohl auch nicht viele Ergebnisse liefern.
 

Ähnliche Themen

Zurück
Oben