Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11
  1. #1
    Trojaner Avatar von Avior
    Registriert seit
    17.03.2010
    Beiträge
    59

    Standard [C++] Priemzahlenoptimierung

    Hallo!

    Ich habe zu Übungszwecken das bekannte Priemzahlen-errechen-Programm geschrieben [Ich bin Anfänger]. Es funktioniert einwandfrei, allerdings ist mir ein Problem aufgefallen:

    Der Arbeitsspeicher ist mit 600 kb für das Programm nicht sonderlich überlastet, aber wenn man beispielsweise alle Priemzahlen zwischen 1 und 10.000.000 errechnen möchte, dauert es bei mir ~10 Stunden.
    (Code ist schon in meine Idee geändert, daher 10.000.000 zZt. nicht errechenbar )

    Ich hatte als Lösungsidee mir vorgestellt, dass man einhundertK und zweihundertK gleichzeitig per && ablaufen lässt, jedoch schreit bei mir da der Compiler los!

    Würde mich über etwas Hilfe freuen!

    Source:

    Von der Erde aus ist Avior etwa 630 Lichtjahre entfernt und ein direkter Nachbar von Turais.

  2. #2
    NoClose Wurm Avatar von Zer0Flag
    Registriert seit
    27.06.2009
    Beiträge
    198

    Standard

    Multi-Threading würde dir sicher helfen den Vorgang zu optimieren

    ~Zer0Flag

  3. #3
    has one Avatar von noctem
    Registriert seit
    08.06.2008
    Beiträge
    392

    Standard

    Hi.

    Eine "parallele" Ausführung wird dir nichts an Performance bringen.

    Du solltest lieber einen besseren Algorithmus verwenden, z.B. folgenden:
    Sieb des Eratosthenes – Wikipedia
    (Ich weiß gerade gar nicht was es da sonst noch gibt. Falls Bedarf besteht kann ich nochmal in den Aufschrieben schauen, ob ich noch was habe. Ansonsten einfach mal googlen.)
    Auf der Wikipedia-Seite findest du auch eine Implementierung als Pseudocode.

    ~noctem
    Geändert von noctem (31.05.2010 um 18:27 Uhr)
    noctem{aet}jabber.ccc.de

  4. #4
    BackNine Wurm
    Registriert seit
    15.08.2007
    Beiträge
    301

    Standard

    Es heißt "Primzahl"!!!

  5. #5
    Trojaner
    Registriert seit
    11.07.2009
    Beiträge
    65

    Standard

    Weitere regeln:

    mind. 1 Primzahl zw. ihr und dem doppelten von ihr,
    d.h. zw. 5 und 10 ist 7, zw. 6 und 12 ist 11

    mind. 1 Primzahl zw. der Primz. zum Quadrat und der Primz.+1 zum Quadrat
    z.B.: 2^2 = 4 und 3^2 = 9 --> zw. 4 und 9 ist 5 und 7

    die hab ich aus irgentsoeinem buch

    wenn dich sowas interessiert kannst du ja mal nach Riemannsche Zeta-Funktion googlen
    „Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren.“

    Benjamin Franklin

  6. #6
    Master of Porn Avatar von sp1nny
    Registriert seit
    28.05.2007
    Beiträge
    533

    Standard

    Du hast zudem vergessen einen Wert in der main-Funktion zurückzugeben.
    Desweiteren wird Multithreading keinen Performanceboost bringen, da die Leistungsfähigkeit von dem Prozessor und dem Algorithmus beeinflusst wird, nicht aber durch die Anzahl der Threads. Btw: Threads laufen nur scheinbar gleichzeitig und nicht tatsächlich.
    XMPP: sp1nny @ exploit.im
    MAIL: sp1nny @ tuta.io

    PGP:

    Wir müssen wissen — wir werden wissen.


  7. #7
    OpCodeKiddy Avatar von EBFE
    Registriert seit
    30.03.2009
    Beiträge
    442

    Standard

    Abgesehen von erwähnten besseren Algos könnte man auch an diesem noch etwas feilen:
    1) es reicht vollkommen aus, den "divisor" bis zur Wurzel(Primzahl_kandidat) laufen zu lassen
    2) statt den Divisor immer um 1 zu erhöhen (und damit jedes zweite mal den "Teilbar durch 2 oder ein vielfaches davon" Test zu machen, sollte der Divisor > 2 dann gleich in 2-er Schritten erhöht werden - also [3, 5, 7, 9] usw.
    3) eigentlich braucht man nur zu testen, ob eine Zahl durch eine Primzahl < dieser Zahl teilbar ist. Denn alle anderen
    Zahlen sind ja eher nur aus Primzahlen zusammengetzt
    4) wenn eher die größte Zahl errechnet werden soll, macht es doch keinen Sinn, mit der kleinsten zu beginnen

    Habs mal schnell die Punkte 1 bis 3 in Python umgesetzt (Suche nach der größten Primzahl bis X, wobei man stur von klein nach groß geht):

    braucht bis 1 Mio 3 Sekunden und bis 10 Mio 61 Sekunden (wobei der Rechner schon älter ist )
    und die "ultimative" Version ("Optimierungen" 1) 2) und 4) ), die die Test mit der größten Zahl beginnt und dann runterzählt:

    (Zeit für 1 Mrd: 0.02s == nicht messbar )
    Geändert von EBFE (01.06.2010 um 10:04 Uhr) Grund: len(prim_numbers) -> len(prim_numbers)-1, soll ja nicht alle Primzahlen, sondern bis zur aktuellen ausgeben
    TrueCrypt/RAR/Zip Passwort vergessen und das Bruten dauert ewig? Oder brauchst du fein abgestimmte Wortlisten? Hilf dir selbst mit WLML - Word List Markup Language
    Gib Stoned/Mebroot/Sinowal und anderen Bootkits keine Chance: Anti Bootkit v 0.8.5

  8. #8
    Fortgeschrittener Avatar von The-God-of-all
    Registriert seit
    02.09.2007
    Beiträge
    46

    Standard

    Oh da kommen Errinnerungen auf... Ich hatte auch mal einen Primzahlenrechner in C++ programmiert. Natürlich mit dem Sieb des Eratosthenes, und daran ein paar Optimierungen vorgenommen. Mit meinem C++ Programm kann man wenn man es auf einem 64 Bit Computer compiliert und ausführt und 4GB Ram oder mehr hat problemlos alle Primzahlen bis 50 Mrd. ausrechnen und das in ca. 1 Stunde (je nach Hardware).
    Der Trick den ich angewendet habe um Speicher zu sparen ist, dass ich für alle Zahlen nur 1 Bit verwende (ist es eine Primzahl oder nicht) und, dass ich die geraden Zahlen von Anfang an ignoriere.
    Hier mal mein Programm (Achtung, sehr komplex und nicht kommentiert):
    Geändert von The-God-of-all (28.04.2012 um 20:12 Uhr)
    "Zwei Dinge sind unendlich: Das Universum und die menschliche Dummheit. Aber beim Universum bin ich mir nicht ganz sicher."
    Albert Einstein

  9. #9
    Trojaner
    Registriert seit
    13.11.2008
    Beiträge
    88

    Standard

    Zitat Zitat von The-God-of-all Beitrag anzeigen
    dass ich die geraden Zahlen von Anfang an ignoriere.
    Das bedeutet du lässt die Primzahl 2 einfach weg, oder schreibst sie manuell dazu...
    Wer Rechtschreibfehler findet, darf sie behalten!

    Für alle die einen Überfall planen, hier der passende Spruch:
    Dies ist ein Überfall, geben sie ihre Daten in kleinen unnummerierten IP-Paketen herraus!!

  10. #10
    Stanley Jobson Avatar von GregorSamsa
    Registriert seit
    23.08.2008
    Beiträge
    729

    Standard

    Eine Ausgabe (cout o.ä.) dimmt auch die Geschwindigkeit.
    Am besten erst berechnen, und am Ende ausgeben/loggen.

    Ansonsten sind hier alle, soweit mir bekannten, Optimierungen schon genannt worden, mit dem wissen solltest du das wohl hinbekommen.

Seite 1 von 2 12 LetzteLetzte

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •