227 Stimmen

Welcher ist der schnellste Algorithmus zur Auffindung von Primzahlen?

Welcher ist der schnellste Algorithmus, um Primzahlen mit C++ zu finden? Ich habe das Siebverfahren verwendet, aber ich möchte immer noch, dass es schneller wird!

0 Stimmen

Ein altes Artikel, das ich gefunden habe, aber interessant aussieht: Spaß mit Primzahlen

30 Stimmen

@Jaider dies scheitert bereits bei Zahlen so niedrig wie 7 (111). Es scheitert auch für 1001=9. Und offensichtlich scheitert es für fast alle Primzahlen im Allgemeinen (deckt nicht den Fall 2^p - 1 ab, die Mersenne-Primzahlen sind - klassisch generierte Beispiele - die immer in Form von 111...1 sein werden)

2 Stimmen

@Kasperasky - Sie haben nicht erwähnt, welches Sieb? Sie meinen wahrscheinlich das Sieb von Eranthoses!

-4voto

vidura Punkte 3
#include 

using namespace std;

int set [1000000];

int main (){

    for (int i=0; i<1000000; i++){
        set [i] = 0;
    }
    int set_size= 1000;
    set [set_size];
    set [0] = 2;
    set [1] = 3;
    int Ps = 0;
    int last = 2;

    cout << 2 << " " << 3 << " ";

    for (int n=1; n<10000; n++){
        int t = 0;
        Ps = (n%2)+1+(3*n);
        for (int i=0; i==i; i++){
            if (set [i] == 0) break;
            if (Ps%set[i]==0){
                t=1;
                break;
            }
        }
        if (t==0){
            cout << Ps << " ";
            set [last] = Ps;
            last++;
        }
    }
    //cout << last << endl;

    cout << endl;

    system ("pause");
    return 0;
}

12 Stimmen

Dies sollte eine Antwort auf "Wie man unstrukturierten Code schreibt, ohne tatsächlich GOTO zu verwenden" sein. All diese Verwirrung nur, um eine einfache Trial-Division zu codieren! (n%2)+1+(3*n) ist jedoch irgendwie schön. :)

1 Stimmen

@Will Ness Ich hätte das als Antwort auf diese Frage abgewertet; warum eine for-Schleife verwenden, wenn ein Makro ausreicht? :)

-4voto

Robin Nixon Punkte 43

Ich weiß, es ist etwas später, aber das könnte für Leute nützlich sein, die von Suchen hierher kommen. Wie auch immer, hier ist etwas JavaScript, das darauf beruht, dass nur Primfaktoren getestet werden müssen, daher werden die zuvor generierten Primzahlen als Testfaktoren für spätere wiederverwendet. Natürlich werden zuerst alle geraden und Mod-5-Werte herausgefiltert. Das Ergebnis wird im Array P sein, und dieser Code kann 10 Millionen Primzahlen in weniger als 1,5 Sekunden auf einem i7-PC (oder 100 Millionen in etwa 20) berechnen. In C umgeschrieben sollte er sehr schnell sein.

var P = [1, 2], j, k, l = 3

for (k = 3 ; k < 10000000 ; k += 2)
{
  loop: if (++l < 5)
  {
    for (j = 2 ; P[j] <= Math.sqrt(k) ; ++j)
      if (k % P[j] == 0) break loop

    P[P.length] = k
  }
  else l = 0
}

2 Stimmen

Dies wird Ihnen viele Probleme bereiten, wenn Sie eine große Anzahl von Primzahlen generieren, und für Vergleiche ist es besser, P[j]*P[j] <= k zu verwenden, weil sqrt ziemlich langsam ist

2 Stimmen

@Simon sqrt kann aus der Schleife herausgezogen und nur einmal berechnet werden, während P[j]*P[j] bei jeder Iteration berechnet werden muss. Ich würde nicht voraussetzen, dass das Eine schneller ist als das Andere, ohne es zu testen.

0 Stimmen

Der Ansatz mit sqrt außerhalb der Schleife kann definitiv schneller sein, wenn anstelle einer präzisen sqrt eine einfache Näherung berechnet wird, die auf eine nahegelegene ganze Zahl aufrundet. Unabhängig davon macht k % P[j] in der innersten Schleife den Algorithmus zu einem der langsameren.

-13voto

Gaurav Punkte 25
#include
using namespace std;

void main()
{
    int num,i,j,prime;
    cout<<"Geben Sie das obere Limit ein :";
    cin>>num;

    cout<<"Primzahlen bis "<

68 Stimmen

Dies ist ungefähr das langsamste, was du tun kannst.

1 Stimmen

Dies ist sehr langsam, wenn das obere Limit beispielsweise 10000000 beträgt, wird dieser Code viel Zeit in Anspruch nehmen!!

0 Stimmen

Dieser Code hat eine Laufzeit von O(N^2/log N). Ohne break; wäre er noch langsamer, O(N^2), was jedoch bereits als Codierungsfehler angesehen werden könnte. Das Speichern und Testen durch Primzahlen ist O(N^2/(log N)^2), und das Testen durch Primzahlen unterhalb der Quadratwurzel der Zahl ist O(N^1.5/(log N)^2).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X