Heim > Backend-Entwicklung > C++ > Wie können wir alle Primzahlen innerhalb eines bestimmten Bereichs effizient finden?

Wie können wir alle Primzahlen innerhalb eines bestimmten Bereichs effizient finden?

DDD
Freigeben: 2025-01-13 22:07:44
Original
509 Leute haben es durchsucht

How Can We Efficiently Find All Prime Numbers Within a Given Range?

Primzahlen innerhalb eines gegebenen Bereichs finden: Ein optimierter Ansatz

Dieser Artikel befasst sich mit der Herausforderung, alle Primzahlen innerhalb eines bestimmten Bereichs effizient zu identifizieren. Eine Primzahl ist per Definition eine natürliche Zahl größer als 1, die außer 1 und sich selbst keine positiven Teiler hat.

Ein fehlerhafter Ansatz und seine Korrektur

Ein erster Versuch, dieses Problem zu lösen, enthielt einen kritischen Fehler in seiner Logik. Der Code iterierte ab 0, berücksichtigte fälschlicherweise 0 und 1 als potenzielle Primzahlen und verwendete einen falschen Primzahltest. Die Bedingung if (i != j && i % j == 0) identifiziert zusammengesetzte Zahlen, keine Primzahlen. Der richtige Ansatz besteht darin, zu prüfen, ob eine Zahl nicht durch eine andere Zahl als 1 und sich selbst teilbar ist.

Optimierte Lösung mit einem Probeteilungssieb

Eine weitaus effizientere Methode nutzt ein Probeteilungssieb. Dieser Ansatz nutzt mehrere wichtige Optimierungen:

  1. Quadratwurzel-Limit: Wir müssen nur die Teilbarkeit bis zur Quadratwurzel der Zielzahl testen. Wenn eine Zahl einen Teiler hat, der größer als ihre Quadratwurzel ist, muss sie auch einen Teiler haben, der kleiner als ihre Quadratwurzel ist.

  2. Mehrfachentfernung: Sobald eine Primzahl identifiziert ist, werden ihre Vielfachen aus der Kandidatenliste entfernt, wodurch die Anzahl nachfolgender Prüfungen erheblich reduziert wird.

  3. Iterationsschätzung: Der Code verwendet eine Näherungsformel (π(x) < 1,26 x / ln(x), wobei π(x) die Primzahlzählfunktion ist), um die maximale Anzahl zu schätzen Anzahl der erforderlichen Iterationen, was die Effizienz weiter steigert.

Der optimierte Code (aus Gründen der Prägnanz unter Verwendung von LINQ) setzt diese Strategie effektiv um:

Enumerable.Range(0, Math.Floor(2.52*Math.Sqrt(num)/Math.Log(num))).Aggregate(
    Enumerable.Range(2, num-1).ToList(), 
    (result, index) => { 
        var bp = result[index]; var sqr = bp * bp;
        result.RemoveAll(i => i >= sqr && i % bp == 0); 
        return result; 
    }
);
</p>
<p>Dieser verfeinerte Algorithmus bietet eine erhebliche Leistungsverbesserung im Vergleich zum naiven Ansatz, insbesondere beim Umgang mit umfangreichen Bereichen.  Die Verwendung von <code>Enumerable.Range, ToList, RemoveAll und Aggregate ermöglicht eine kompakte und effiziente Implementierung.

Das obige ist der detaillierte Inhalt vonWie können wir alle Primzahlen innerhalb eines bestimmten Bereichs effizient finden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage