Hi,
ein paar Algorithmen zur Primzahlsuche findest du hier:
http://rhlx01.rz.fht-esslingen.de/projects/krypto/pr…
Wir haben in unserem Studium Primzahlen mit dem von Martin genannten Algorithmus (Sieb des Eratosthenes) erzeugt.
Dazu haben wir einen „virtuellen“ Parallelrechner verwendet, bei dem sich jeder Prozessor mit einem der Teiler beschäftigte.
Das Prinzip genauer erklärt, denn man könnte diesen Alg. auch schön unter Linux mit mehreren Prozessen implementieren:
Es sollen alle Primzahlen in der Zahlenmenge 1…n ermittelt werden. Dazu müssen lediglich alle Vielfachen der Zahlen von 1 bis sqrt(n) eliminiert werden. 1 ist keine Primzahl, also kann man die gleich mal von Haus aus weglassen (ich schreibe aber trotzdem immer 1…n).
Man stellt sich also eine Zahlenkette vor, die wie an einem Fließband (Pipelining) alle einzelnen Prozesse durchläuft.
Jeder Prozess erhält eine eindeutige Zahl und eliminiert alle ihm gegebenen Zahlen, die durch diese Zahl teilbar sind. Alle anderen reicht er an seinen Nachfolger weiter.
-> 2 -> 3 -> 5 -> …
Prozess 2 eliminiert alles, was durch 2 teilbar ist. Dies kann man eigentlich weglassen und sich den Rechenaufwand sparen indem man in der Schleife 1…n nur alle ungeraden Zahlen übergibt.
Also besser:
-> 3 -> 5 -> 7 -> …
Der erste Prozess erhält also die Kennzahl 3 und eliminiert alles, was durch 3 teilbar ist. Prozess 5 alles, was durch 5 teilbar usw.
Am Anfang weiß man natürlich nicht, welche Prozesse man benötigt. Hier war es ja recht einfach, weil dies die wohl bekanntesten Primzahlen sind.
Die Prozesse werden also dynamisch generiert.
Pseudo-Code im Prozess:
- eliminiere alle Zahlen, die Vielfache meiner Kennziffer sind
- erhalte ich eine Zahl, die ich weitergeben werde, und ich tue dies zum ersten Mal, dann erzeuge einen Nachfolgeprozess, der alle Vielfachen dieser Zahl eliminiert (diese Prozesserzeugung ist durch sqrt(n) eingeschränkt)
- ansonsten Zahl weitergeben
Es werden also x Prozesse erzeugt, der letzte Prozess arbeitet mit einer Kennziffer