PrimzahlenTest

  • C Quelltext: http://pastebin.com/YzChJUjA (Wer es schöner haben möchte...)
    Wer mag kann ja testen und dann sagen wieviele er in wieviel zeit gefunden hat.


    [Blockierte Grafik: http://bktm.ron-welzel.de/Download/C/Primzahlen/primzahlen_2_999999999.png]



  • Hier ein bisschen Feedback/Wüsche:
    Erstmal hast du zwar ohne Kommentare programmiert, aber auch ohne C Kenntnisse konnte ich die Idee deines Skriptes ganz gut nachvollziehen.
    (Selbst wenn ich das Sieb des Eratosthenes nicht bereits gekannt hätte)
    Ich bin zwar keineswegs mit C vertraut, aber dein Sieb des Eratosthenes hätte doch auch in einer Liste von Wahrheitswerten implementiert werden können und dadurch einen kleinen Geschwindigkeitsboost bekommen können, oder?
    Als Erweiterung könntest du ja die Liste in k viele Teile teilen, die von k Threads bei jedem "Sieben" je ein Stück aktualisieren.
    Ich habe den Code zwar nicht getestet, war aber von dem Titel angetan (...), da ich aber keine Liste aller Primzahlen von 2 bis n brauche und von C so gut wie keine Ahnung habe,
    würde ich dich um folgendes Features bitten:
    Eine Funktion IsPrime(x) : boolean, die auf Primzahlen prüft.
    D.h. man kann eine beliebige natürliche Zahl auf ihre Primzahleneigenschaft prüfen. Dazu fallen mir spontan 2 Verfahren ein:
    AKS-Primzahltest (nicht probabilistisch soweit ich weiß und daher hilfreich für mich)
    Miller Rabin Test (probabilistisch)
    *weitere, möglichst effiziente(re) Verfahren die nicht probabilistisch sind fänd ich auch gut*
    Der naive Ansatz die Zahl x auf alle Teiler < WurzelAus(x) dauert viel zu lange, wenn die Primzahl ca. 100 Stellig (<=>10^100) ist.
    Ich würde es Klasse finden, wenn du das mal in C probieren könntest :)

    Wer immer nur das tut, was er bereits kann - wird auch immer nur das bleiben, was er bereits ist!

  • doch auch in einer Liste von Wahrheitswerten implementiert werden können und dadurch einen kleinen Geschwindigkeitsboost bekommen können, oder?

    Das Problem ist das c kein Boolean an sich als datentyp hat.
    Nur von MS z.b. die Definition.
    in C++ schon.

  • Hehe :D
    Oder einfach so:


    AutoIt

    Func IsPrime($x)
    If Not IsNumber($x) Then Return False
    If $x < 2 Then Return False
    If $x - Int($x) Then Return False
    For $i = 2 To $x -1
    If Not Mod($x, $i) Then Return False
    Next
    Return True
    EndFunc


    C++

    Code
    bool IsPrime(unsigned long long x) {
    	if (x < 2) {return false;}
    	for (unsigned long long i = 2; i < x -1; i++) {
    		if (!(x % i)) {return false;}
    	} return true;
    }


    Jede Zahl von 2 bis x einfach mit der Funktion prüfen und schon hat man seine Primzahl. Dauert aber demnach auch länger... ^^

  • Kannst du mir das bitte näher erläutern?


    Ok, nehmen wir als Beispiel 40. Die Grenze wäre in diesem Fall 7.
    40 / 8 = 5 R 0 ; brauchst du aber nicht überprüfen, da du die 5 schon überprüft hast
    40 / 10 = 4 R 0 ; brauchst du auch nicht überprüfen, da du die 4 schon überprüft hast
    40 / 20 = 2 R 0 ; brauchst du auch nicht überprüfen, da du die 2 schon überprüft hast
    ...


    Man könnte also sagen, dass sich die Überprüfungen an der Grenze spiegeln. Ist nicht gerade gut erklärt aber ich hoffe du verstehst was ich meine.

  • Hi,
    zunächst: ich war total stolz den o.a. Code in VC++ mit kleinen Änderungen zum Laufen (und compiliert) bekommen zu haben^^


    Was soll man sagen...C halt...der Code ist 4x langsamer als mein unoptimiertes Assemblerstück, dass sogar noch sämtliche Primzahlen in eine Datei schreibt...


    Mit einem (so wie hier beschrieben) modifizierten Sieb ist nochmal Faktor 3-4 in der Geschwindigkeit drin...


    Btw. früher gab es mal den µ-It (auch als light-Version) hier im Forum, um Primzahlen und Scripte ging es im angehängten Link, viel wichtiger sind die vorgestellten Algorithmen, die entsprechend umgesetzt Welten schneller in einer Compilersprache laufen http://www.autoit.de/index.php?page=Thread&postID=141580#post141580

    ciao
    Andy



    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay


    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    3 Mal editiert, zuletzt von Andy ()

  • Andy, guter Code

    Sie können darum bitten, den gleichen Code zu erstellen, um die Zahl in Primfaktoren zu verteilen


    1232334646758235345 ==> 5*13*2131*1942141*4580903


    948013690567935577 ==> 948013690567935577

  • Oder so prüfen:

    ...... Lieben Gruß, ........
    ...........
    Alina ............

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Ich habe die Deutsche Hilfe auf meinem PC und
    OrganizeIncludes ist beim Scripten mein bester
    Freund. Okay?

  • Alina, Warum zeigst du mir das - dein Code funktioniert nicht mit großen Zahlen


    EDIT BugFix: [Link entfernt]


    Or GMP "__gmpz_probab_prime_p"

    Die Frage war, wie man für große Zahlen


    1232334646758235345 ==> 5*13*2131*1942141*4580903



    948013690567935577 ==> 948013690567935577

    2 Mal editiert, zuletzt von Andrey_A ()

  • Aber für große Zahlen funktioniert es nicht.


    Einmal editiert, zuletzt von Andrey_A ()

  • Folgendes habe ich aus einem Uni-Bereich rausgezogen.


    n < 1.373.653 : es genügt, a= 2 und 3 zu testen,

    n < 9.080.191 : es genügt, a = 31 und 73 zu testen,

    n < 4.759.123.141 : es genügt, a = 2, 7, und 61 zu testen,

    n < 2.152.302.898.747 : es genügt, a = 2, 3, 5, 7, und 11 zu testen,

    n < 3.474.749.660.383 : es genügt, a = 2, 3, 5, 7, 11, und 13 zu testen,

    n < 341.550.071.728.321 : es genügt, a = 2, 3, 5, 7, 11, 13, und 17 zu testen.

    n < 3.825.123.056.546.413.051 : es genügt, a = 2, 3, 5, 7, 11, 13, 17, 19, und 23 zu testen.

    n < 318.665.857.834.031.151.167.461 : es genügt, a = 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37 zu testen.

    Dabei dürfen nur solche n getestet werden, die größer sind als das jeweils größte a !!

    ...... Lieben Gruß, ........
    ...........
    Alina ............

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Ich habe die Deutsche Hilfe auf meinem PC und
    OrganizeIncludes ist beim Scripten mein bester
    Freund. Okay?