Primesieve

Optimiertes Sieb der Eratosthenes-Implementierung
Jetzt downloaden

Primesieve Ranking & Zusammenfassung

Anzeige

  • Rating:
  • Lizenz:
  • BSD License
  • Preis:
  • FREE
  • Name des Herausgebers:
  • Kim Walisch
  • Website des Verlags:
  • http://code.google.com/u/108247660239931147235/

Primesieve Stichworte


Primesieve Beschreibung

PrimeSieve ist C ++ - Bibliothek, die Prime-Zahlen und Prime-K-Tuplets (Twin Primes, Prime-Drillinge, ...) erzeugt <2 ^ 64 mithilfe einer hochoptimierten Umsetzung des Siebs von EratoThenes.algorithmus und Komplexitätsprechtung verwendet das segmentierte Sieb von Eratosthenes mit dem Rad Faktorisierung hat dieser Algorithmus eine Komplexität von O (n log log n) -operationen und verwendet o (sqrt (n)) raum.segmentation ist derzeit die bekannteste praktische Verbesserung des Siebs von Eratosthenes. Anstatt das Intervall gleichzeitig zu erben, unterteilt das Sieb-Intervall in eine Anzahl von gleichgroßen Segmenten, die dann nacheinander gesiebt werden. Die Segmentierung fällt den Speicherbedarf des Siebs von EratoThenes von O (n) bis O (SQRT (N)) ab. Die Segmentgröße wird normalerweise gewählt, um in den FAST L1- oder L2-Cache-Speicher des CPU zu passen, der das Sieben erheblich beschleunigt. Eine segmentierte Version des Siebs von EratoSthenes wurde erstmals von Singleton 1969 veröffentlicht , Buchten und Hudson in beschreiben den Algorithmus detaillierter. Die Wendelfaktorisierung wird verwendet, um Vielfache von kleinen Primaten zu überspringen. Wenn dem Sieb von EratoThenes ein KTH-Rad hinzugefügt wird, sind nur die Multiples abgeschickt, die koprim zu den ersten K-Primen sind, d. H. Viele, die von einem der ersten K-Primierungen teilbar sind, werden übersprungen. Das 1. Rad betrachtet nur ungerade Zahlen, das 2. Rad (MODULO 6) überspringt Multiples von 2 und 3, das dritte Rad (MODULO 30) überspringt Multiples von 2, 3, 5 und so weiter. Pritchard hat sich in gezeigt, dass die Laufzeit des Siebes von EratoThenes um einen Faktor des Protokollprotokolls n verringert werden kann, wenn die Radgröße sqrt (n) ist, aber für Cache-Gründe, warum das Sieb von Eratosthenes normalerweise am besten mit einem Modulo 30 führt oder 210 Rad. Sorenson erklärt Räder in .aditionational primesieve verwendet Tomás Oliveira E SILVAs cachefreundlicher Eimerlistenalgorithmus, falls erforderlich . Dieser Algorithmus ist relativ neu, es wurde 2001 von Tomás Oliveira E Silva entwickelt, um das segmentierte Sieb von Eratosthenes für Primzahlen nach 32 Bits zu beschleunigen. Die Idee besteht darin, die Sieb-Primes in Eimerlisten zu speichern, wobei jede Liste einem Segment zugeordnet ist. Eine Liste von Sieb-Primeten, die sich auf ein bestimmtes Segment beziehen, enthält nur diejenigen Primzahlen, die in diesem Segment mehrere Ereignisse auftreten. Während das Sieben ein Segment nur die Primente der zugehörigen Liste zum Sieben verwendet werden, und jede Prime ist auf die für das nächste mehrfach verantwortliche Liste neu zugewiesen, wenn sie verarbeitet werden. Der Vorteil dieses Ansatzes besteht darin, dass nun, dass es nun möglich ist, Segmente (dh Sieb-Arrays) kleiner als SQRT (n) verwenden, ohne die Effizienz zu verschlechtern, ist dies wichtig, da nur kleine Segmente, die in den L1- oder L2-Cache des CPU passen, einen schnellen Speicherzugriff bereitstellen. ImplementierungPremeve ist vollständig in C ++ geschrieben und hängt nicht von externen Bibliotheken ab. , er kompiliert mit jedem Standard-kompatiblen C ++ - Compiler. Seine Geschwindigkeit ist hauptsächlich auf die Segmentierung des Siebes von EratoThenes zurückzuführen, die ein Cache-Fehlschläge beim Überkreuzen von Multiples in der Siebanordnung und der Verwendung eines Bit-Arrays anstelle des breiter verwendeten Byte-Arrays (boolean) -Array verhindern. Dies sind die Optimierungen, die ich in meiner Implementierung verwende: - Verwendet ein Bit-Array mit 30 Zahlen pro Byte für Sieb-Pre-Sieieves-Multiples von kleinen Primaten 19 - beginnt mit dem Überfahren von Multiples am Square - Verwendet ein Modolo 210-Rad, das ein Modulo 210-Rad verwendet, das Multiples von 2, 3, 5 und 7- Verwendet spezialisierte Algorithmen für kleine, mittlere und große Sieb-Primes - verarbeitet mehrere Sieb-Primes pro Loop-Iteration, um den Parallelismus von Anweisungen (mehrfachgefäß) mit OpenMP zu erhöhen, um den neuesten Primesieve-Quellcode online zu durchsuchen Besuchen Sie die TAB.C ++ - Bibliothek von 'Quelle', die in anderen Projekten wiederverwendbar ist, zeigt das folgende C ++ - Code-Snippet an, wie er libprimeieve für die Erzeugung der Primzahl nummeriert. Hier sind mehr Nutzungsbeispiele.// sum_primes.cpp // berechnet die Summe der Primzahlen unter 1000 # inklusive #include nicht signiert int somat = 0; Leere Rückruf (unsigniert int Prime) {Sum + = Prime;} int main () { Primesieve ps; PS.GeneratePrimes (2, 1000, Rückruf); std :: cout <<"Summe der Primzahlen unter 1000 =" <<<<<<


Primesieve Zugehörige Software