Finden nächste Primzahl-Algorithmus
Ich freue mich zu verbessern, meinen Algorithmus zu finden, der nächste primenumber das Recht auf eine bestimmte Anzahl.
Was ich habe, so weit ist diese:
int NextPrime(int a)
{
int i, j, count, num;
for (i = a + 1; 1; i++)
{
for (j = 2, count = 0; j <= i; j++)
{
if (i%j == 0)
{
count++;
}
}
if (count == 1)
{
return i;
break;
}
}
}
Tho dieser Algorithmus ist nicht effizient beim laufen oft.
Kann mir jemand Ratschläge geben, wie der Algorithmus könnte beschleunigt oder verbessert.
- en.wikipedia.org/wiki/Sieve_of_Eratosthenes
- Die beiden basic-speed-ups zu erhöhen j mit 2 (ab 3, nach dem Test für 2), da nur ungerade zahlen außer 2 sind prim. Darüber hinaus nur überprüfen bis zu der Quadratwurzel der Anzahl (als einer der Faktoren für eine Zahl <= die Quadrat-Wurzel.)
- siehe auch > diese Frage
- Verwenden
break;
nachcount++;
. - Ich verstehe nicht, warum Menschen downvoting jede Frage. Dieses ist einfach urkomisch. Das Sieb des Eratosthenes ist nicht der richtige Weg hier.
- Haben Sie versuchen zu tun, einige probabilistic primality tests vor dem start der innere Zyklus? en.wikipedia.org/wiki/Primality_test
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sieb des Eratosthenes ist nicht die beste Lösung, wenn nur eine Primzahl, die gefunden werden sollen. Hier ist die Lösung, die nützlich für diesen Zweck. Es basiert auf der Idee, dass alle Primzahlen werden in form 6k+-1, so bin ich nur die Tests 2, 3 und zahlen in der form 6+-1. Natürlich, wird die Schleife beendet, wenn divisor Verstöße gegen sqrt(a), da alle diese zahlen sind bereits erfolgreich getestet worden.
Ergebnis ist, dass diese Schleife funktioniert sehr schnell auf ein paar große Nummern, die ich ausprobiert habe.
IsPrime
funktioniert nicht immer richtig, zum Beispiel das Ergebnis für die Anzahl64144081 = 8009 ^ 2
isttrue
.Kann man verbessern auf das Sieb des Eratosthenes durch eine Menge, wenn Sie nur überprüfen Sie jede Zahl, die gegen jede prime, bevor es bis in die Wurzel der Primzahl. Für diese Sie benötigen, um eine Liste aller Primzahlen bis dann. Dies erhöht die Speicher Kosten, sondern erhöht die Ausführungsgeschwindigkeit durch eine lange erschossen.
Pseudocode: