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:
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.
Mehrfachentfernung: Sobald eine Primzahl identifiziert ist, werden ihre Vielfachen aus der Kandidatenliste entfernt, wodurch die Anzahl nachfolgender Prüfungen erheblich reduziert wird.
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
undAggregate
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!