Primzahl-Algorithmus gesucht - Seite 2

Neue Frage »

AD Auf diesen Beitrag antworten »

[Gelöscht - ich mach hier doch kein Kindermädchen für unselbständige.]
WebFritzi Auf diesen Beitrag antworten »

Zitat:
Original von michifold
Meine Analysiskenntnisse sind zwar schon fast vollständig verdrängt, aber konvergiert eine alternierende Reihe nicht, wenn das "Innere" eine Nullfolge ist?


Nein, die Nullfolge muss zudem noch monoton fallend sein.
AD Auf diesen Beitrag antworten »

Nach all der exzessiven Rechnerei will ich auch noch ein wenig Mathematik ergänzen:

Die ganzen numerischen Rechnungen liefern ja nur Partialsummen, und diese sind untere Schranken für den Reihenwert. Um auch noch obere Schranken zu gewinnen, kann man das im Konvergenzbeweis bereits genutzte nutzen:

Daraus folgt für und somit



Es gilt somit

für

Nehmen wir obiges , so kriegt man immerhin die Aussage

,

vermutlich sehr grob, aber immerhin.
michifold Auf diesen Beitrag antworten »

Hallo Arthur,

danke dir fürs Programm und für deine mathematischen Überlegungen!
Könntest du mir vielleicht bei der Bedienung noch helfen?

Da ich windows benutze muss ich wohl das Programm über die Eingabeaufforderung benutzen?
Könntest du mir kurz erklären welche Parameter nötig sind außer -f?
was tut denn z.B. -g, -s, -l und wie lege ich fest bis zu welcher Zahl gesiebt werden soll?

Benötigt dann reciprocalprimes nur noch das -f?

Ich kapiere leider verdammt wenig, wenn ich in den Quellcode schaue unglücklich
AD Auf diesen Beitrag antworten »

Ich hab gewusst, dass es ein Fehler war, das Programm zu posten.
WebFritzi Auf diesen Beitrag antworten »

Ist das Programm gut, so dass es sich lohnt, dieses für Windows aufzumöbeln? Das könnte ich nämlich machen. Fensterchen und so... Augenzwinkern
 
 
AD Auf diesen Beitrag antworten »

Zitat:
Original von WebFritzi
Ist das Programm gut,

Gut ist es, denn es ist ja von mir.

Zitat:
Original von WebFritzi
so dass es sich lohnt, dieses für Windows aufzumöbeln? Das könnte ich nämlich machen. Fensterchen und so... Augenzwinkern

Kotzen

Aber tu, was du nicht lassen kannst. Ich habe es bewusst einfach und platformübergreifend (zumindest einigermaßen) angelegt.
Dual Space Auf diesen Beitrag antworten »

Zitat:
Original von Arthur Dent
Zitat:
Original von WebFritzi
Ist das Programm gut,

Gut ist es, denn es ist ja von mir.

Big Laugh Big Laugh

Zitat:
Zitat:
Original von WebFritzi
so dass es sich lohnt, dieses für Windows aufzumöbeln? Das könnte ich nämlich machen. Fensterchen und so... Augenzwinkern

Kotzen

http://www.v-rodforums.com/forums/images/smilies/rofl3.gif
michifold Auf diesen Beitrag antworten »

Hallo, ich wäre über ein wenig mehr Benutzerfreundlichkeit dankbar. Bei mir funktioniert nix. Ich bin dafür wohl zu blöd.

C:\Dokumente und Einstellungen\Michi\Desktop\Eratosthenes_HD>e -l 1 1 -f era.dat

3 - 0 : primes <= 67108865
67108867 - 0 : primes <= 134217729
134217731 - 0 : primes <= 201326593
201326595 - 0 : primes <= 268435457
268435459 - 0 : primes <= 335544321
335544323 - 0 : primes <= 402653185
402653187 - 0 : primes <= 469762049
469762051 - 0 : primes <= 536870913
536870915 - 0 : primes <= 603979777
603979779 - 0 : primes <= 671088641
671088643 - 0 : primes <= 738197505
738197507 - 0 : primes <= 805306369
805306371 - 0 : primes <= 872415233
872415235 - 0 : primes <= 939524097
939524099 - 0 : primes <= 1000000001
Eratosthenes calculation done.

C:\Dokumente und Einstellungen\Michi\Desktop\Eratosthenes_HD>r -f era.dat
sizeof(long double) = 12
2097152 0 34136029 0.000000000000000000
Summe = -55340788687501867000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000
00000
000000000000000000000000000000000000000000000000000000000000000000000000000
00000
000000000000000000000000000000000000000000000000000000000000000000.0000000000000
00000
n = 3048955
p(n) = 50847529
p(p(n)) = 999999761


ich wollte die qprimelimit möglichst gering halten und hab deswegen für LimitGiga und LimitRest jeweils 1 genommen.

Vielleicht kann mir jemand erklären, was ich falsch gemacht habe? Danke.
AD Auf diesen Beitrag antworten »

Offenbar beherrscht dein System das "long double"-Format nicht, jedenfalls "printf" kann es nicht ausgeben. Der Rest scheint zu klappen.

Nimm gcc und den beiliegenden Makefile - alles andere ist dein Problem.

P.S.: limitGiga und limitRest sind so zu verstehen:

Primzahllimit ist ( limitGiga * 10^9 + limitRest)

Der Grund für diese umständliche Prozedur ist, dass meine gcc-Bibliothek sowas wie atoi64 oder strtoll nicht kennt.
WebFritzi Auf diesen Beitrag antworten »

Zitat:
Original von Arthur Dent
Zitat:
Original von WebFritzi
Ist das Programm gut,

Gut ist es, denn es ist ja von mir.


Du arroganter Sack! Augenzwinkern (<-- den wollte ich mir eigentlich verkneifen, da du auch keinen dahintergesetzt hast, aber ich war dann doch gnädig)
AD Auf diesen Beitrag antworten »

Nun ja, ich rede nicht mit jedem so. Aber manche brauchen das anscheinend so, sonst fühlen sie sich nicht wohl.
WebFritzi Auf diesen Beitrag antworten »

Zitat:
Original von Arthur Dent
Nun ja, ich rede nicht mit jedem so.


Na ja, nicht ganz. Aber mit den meisten. Denk mal drüber nach. Augenzwinkern
AD Auf diesen Beitrag antworten »

Ja richtig, ich bin es, der ständig andere Leute beleidigt. Muss ich wirklich erst eine Umfrage hier dazu machen?
WebFritzi Auf diesen Beitrag antworten »

Hihi, du musst dir ja nicht gleich auf den Schlips getreten fühlen. Ich schrieb ja nur, dass du ja mal drüber nachdenken könntest. Damit habe ich dich nicht kritisiert. Das will ich dazu nochmal anmerken.

Übrigens beleidige ich hier niemanden! Eher werde ich von anderen desöfteren mal beleidigt (zumeist Gäste). Der Grund ist mir klar, denn ich bin ja recht polarisierend. Big Laugh
AD Auf diesen Beitrag antworten »

Zitat:
Original von WebFritzi
Übrigens beleidige ich hier niemanden!

Es dürfte nicht sonderlich schwer sein, eine zumindest zweistellige Anzahl von Leuten hier im Board zu finden, die das anders empfinden.
WebFritzi Auf diesen Beitrag antworten »

Zitat:
Original von Arthur Dent
Zitat:
Original von WebFritzi
Übrigens beleidige ich hier niemanden!

Es dürfte nicht sonderlich schwer sein, eine zumindest zweistellige Anzahl von Leuten hier im Board zu finden, die das anders empfinden.


Und du gehörst scheinbar dazu. "Ach Arthur. Wenn du nicht dikutieren kannst, dann lass es doch lieber sein, hmm?" ist keine Beleidigung. Finde ich. Aber wir sind da scheinbar verschiedener Meinung.

Wenn du es für nötig hältst, mich in Zukunft stets etwas flapsig zu behandeln, dann halte ich das für etwas kindisch und ziemlich nachtragend. Ich finde, da solltest gerade du mit deinem Intellekt drüberstehen.
AD Auf diesen Beitrag antworten »

Mag sein. Aber gerade ich den letzten Wochen habe ich öfter gesehen, wie Fragesuchende ziemlich verärgert und deutlich "WebFritzi, von dir will ich keine Hilfe" (sinngemäß) zu verstehen gegeben haben, wenn du dich in einem Thread da zu Wort gemeldet hast. Woher kommt das? Sind das alles nur Idioten? Jetzt könnte ich auch diesen blöden Satz mit dem "Denk mal ..." sagen.
michifold Auf diesen Beitrag antworten »

Ich will euch nur ungern in eurem Meinungsaustausch unterbrechen. Wollte nur nochmal dem Arthur für seine Mühen und Erklärungen danken.
Hab mir jetzt cygwin runtergeladen. Damit funktionierts jetzt super. Vielleicht hab ich mal die Ruhe (und Geduld) mich dem Programm richtig auseinanderzusetzen und es zu verstehen.
WebFritzi Auf diesen Beitrag antworten »

Zitat:
Original von Arthur Dent
Mag sein. Aber gerade ich den letzten Wochen habe ich öfter gesehen, wie Fragesuchende ziemlich verärgert und deutlich "WebFritzi, von dir will ich keine Hilfe" (sinngemäß) zu verstehen gegeben haben, wenn du dich in einem Thread da zu Wort gemeldet hast. Woher kommt das? Sind das alles nur Idioten? Jetzt könnte ich auch diesen blöden Satz mit dem "Denk mal ..." sagen.


Ich finde den Satz nicht blöd, denn ich habe drüber nachgedacht. Idioten sind das zwar für mich nciht, aber doch bin ich mir keiner Schuld bewusst. Du weißt sicherlich, wie mein Stil ist zu helfen. Ich lege sehr großen Wert darauf, dass der Fragesteller sich auch Mühe gibt (so wie ich mir die Zeit nehme zu helfen). Leider tun dies einige nicht und wissen die Zeit, die sich der andere für sie nimmt, nicht zu würdigen. Daraufhin werde ich halt desöfteren etwas patzig und weise den Fragesteller darauf hin. Dann fällt der von dir zitierte Satz (oder sowas ähnliches oder halt eine Beleidigung). Das kommt glücklicherweise nicht allzu oft vor, aber doch in letzter Zeit etwas öfter - wie du ja auch bemerkt hattest. Aber in der Vielzahl der Threads steht dann doch am Ende "Danke, WebFritzi".
kiste Auf diesen Beitrag antworten »

Hi Arthur,

Können Leute die in der Lage sind Programme zu kompilieren und auszuführen das Programm trotzdem noch haben? Wäre echt nett von dir.

Gruß kiste
AD Auf diesen Beitrag antworten »

So gut sind die Programme nun auch nicht (auch wenn ich WebFritzi aus og. Gründen anders geantwortet habe). Das entscheidende ist doch die Idee, die ich hier detailliert skizziert habe. Das kann dann jeder selbst nach eigenem Gutdünken programmieren, ohne dass ich hier Support leisten muss.

-----------------------------------------------

Kleiner Nachtrag:

Ich hab die Geschichte mal noch bis zum Ende des einigermaßen Erträglichen ausgereizt:



mit

sowie
(knapp unterhalb von ) .

Gerechnet wurden die Reziproken nunmehr mit echten "long double", also etwa 19 Stellen Mantisse (64 Bit), statt nur "double" - um die numerischen Auslöschungsfehler bei der Partialsummenbildung möglichst gering zu halten. Hätte ich gleich machen sollen, aber erst bei den ersten Programmläufen wurde mir so richtig bewusst, dass das Auslöschungsproblem hier durchaus einige Stellen vernichtet.

------------------------

Bei der Gelegenheit habe ich auch gleich



bestimmt, also den "Moment" der Überschreitung der Eins. Die Berechnungen ergaben



mit



Ich würde allerdings nicht meine Hand dafür ins Feuer halten, dass das der genaue Zeitpunkt der Eins-Überschtreitung ist. Durch die og. numerischen Fehler kann es durchaus etwas früher oder später gewesen sein - Numerik halt. Augenzwinkern
michifold Auf diesen Beitrag antworten »

Hallo Arthur,

scheint dich ja nicht mehr losgelassen zu haben :-)

wie schaut denn die letzte Zahl vor der 1-Überschreitung aus? (wie viele 9er hinterm Komma?)

Mhh, schon erstaunlich nahe an der 1. Aber da es die 1 ja nicht ist, behaupte ich jetzt einfach, da kommt Pi/3 raus Big Laugh

Mit deiner Abschätzung ergibt sich jetz als neue obere Schranke 1,0518. Da hat sich also nicht viel verändert. Wenn du die Abschätzung nicht verbesserst, kannst du wenigstens nicht (numerisch) widerlegen, dass da Pi/3 rauskommt Augenzwinkern
AD Auf diesen Beitrag antworten »

Zitat:
Original von michifold
Mhh, schon erstaunlich nahe an der 1. Aber da es die 1 ja nicht ist, behaupte ich jetzt einfach, da kommt Pi/3 raus Big Laugh

Und ich sage, das stimmt nicht.

Da es mit Beweisen/Widerlegen 1:0 für mich steht, bist du jetzt am Zug. smile


P.S.: Weiter treibe ich die Geschichte oben nicht, für die Primzahlen bis 550 Milliarden habe ich schon einen 32 GByte großen Zwischenfile gebraucht - meine Festplatte brauche ich schon noch für was anderes. Big Laugh

Zitat:
Original von michifold
wie schaut denn die letzte Zahl vor der 1-Überschreitung aus? (wie viele 9er hinterm Komma?)

Das kannst du dir aus den Angaben doch selbst ausrechnen: Du kennst die Summe und den letzten Summanden - einfach mal subtrahieren. LOL Hammer
Dual Space Auf diesen Beitrag antworten »

Zitat:
Original von michifold
wie schaut denn die letzte Zahl vor der 1-Überschreitung aus?


AD Auf diesen Beitrag antworten »

Genau - hatte ich eben grad noch editiert, hat sich wohl überkreuzt. Augenzwinkern


Edit (Dual Space): Na wenn ich ehrlich bin, hatte ich dein Edit schon im letzten Vorschaufenster registriert. Augenzwinkern
Diec! Auf diesen Beitrag antworten »
Zusammenhang zwischen Pi und den Primzahlen!
Es gibt einen sehr schönen Zusammenhang zwischen Pi und den Primzahlen!:

Produkt über alle Primzahlen p : p²/(p²-1) = Pi²/6
Justice Auf diesen Beitrag antworten »

Zitat:
Original von Lazarus
...


abgerundet ist auch 23... und eleganzter
reinkie Auf diesen Beitrag antworten »

Ich habe einen neuen Thread aufgemacht für Primzahl-Interessierte:
Mersenneprimzahlen finden (Teilertest)

Dort ist auch unter anderem mit Link-Verweisen beschrieben, wie man die Primzahlen im Bereich von 7 bis 550 Mrd. auf der Platte mit 18,34 GB statt mit 32 GB speichern kann. Hatte ich weiter oben hier gelesen.

Die Primzahlen 2, 3, 5 lassen sich mit diesem Verfahren allerdings nicht speichern!

Außerdem interessiert mich alles, was an neuen Erkenntnissen zu Primzahlen (insbesondere sehr hohe) bekannt ist.

Die Möglichkeit, Mersennezahlen als Nicht-Prim zu entlarven, weil ein Teiler gefunden wurde, wird dort beschrieben. z.B.: 2.446.546.362.665.521 teilt 2^1.040.516.809 - 1
Sowohl 2.446.546.362.665.521 und auch die 2er-Potenz: 1.040.516.809 sind Primzahlen.
Die von mir dort beispielhaft untersuchten Bereiche, gehen über den durchsuchten Bereich von GIMPS www.mersenne.org hinaus.
HAL 9000 Auf diesen Beitrag antworten »

Zitat:
Original von reinkie
Dort ist auch unter anderem mit Link-Verweisen beschrieben, wie man die Primzahlen im Bereich von 7 bis 550 Mrd. auf der Platte mit 18,34 GB statt mit 32 GB speichern kann.

Jaja, zum zigten Mal der Kiebartkamm - meines Erachtens eher unwichtig.

Bei diesem Algorithmus ist entscheidend, dass man schnell durch das Sieb pflügt - eine zusätzliche Übersetzungsschicht (wie sie der Kiebartkamm darstellt) stört da eher, selbst wenn man sie schnell mit einer LUT umsetzt. Der Speicherplatzmehrbedarf einer einfacheren Speicherung "jede ungerade Zahl ein Bit" gegebenüber deinen nur 8 Bit für 15 ungerade Zahlen ist nicht so wichtig wie die Rechengeschwindigkeit der Umsetzung Bitfeld in Zahl bzw. umgekehrt.

Speicher (sowohl RAM als auch HD) ist für diese Zwecke genug da. Da zu knausern auf Kosten der Rechengeschwindigkeit macht für mich keinen Sinn.
reinkie Auf diesen Beitrag antworten »

Hallo HAL 9000,
bei dem Kiebartkamm geht es nicht um Bits, sondern um ein Siebverfahren, welches jede Nicht-Primzahl genau einmal markiert. Leider habe ich auf meiner Internetseite das Speichern und das Kämmen (Sieben) vermengt. Du kannst also die Anzahl der Markierungen zählen und mittels entsprechender Subtraktion: Anzahl - Markierungen + 3 (damit sind 2, 3, 5 gemeint)
direkt wissen, wie viele Primzahlen in deinem Bereich sind.
Jede Nicht-Primzahl wurde ja genau einmal markiert.
Wenn du das Sieben mit 3 * 5, 3 * 7, 3 * 11 beginnen möchtest, um nur die ungeraden Zahlen zu speichern, funktioniert der Kiebartkamm genauso gut.
Nur und das ist wichtig bei diesem Verfahren: Du darfst die Quadratzahlen nicht streichen.
Also 3 * 3 wird erstmal nicht gestrichen in deiner 3er-Schleife.
Dadurch streicht der Algorithmus auch die 3*9=27
Diese 3-er Schleife ist die zeitaufwendigste Schleife! Die 5er-Schleife die zweitaufwendigste.
Daher starte ich persönlich mit 7 * 11 und streiche als erstes die 77, dann 7*13, 7 * 17 usw.
Da ich die 7*7 noch nicht gestrichen habe, wird auch 7*49 gestrichen!!!

Wenn die Schleife durchgelaufen ist, enthält dein Speicher (Bits oder Bytes) die Primzahlen und noch Quadratzahlen. Diese werden ebenfalls von der Wurzel(Grenze) beginnend gestrichen.

Anmerkung von mir: Es gibt kein anderes effizienteres Verfahren (Sieb), welches jede Nicht-Primzahl genau einmal streicht.
HAL 9000 Auf diesen Beitrag antworten »

Zitat:
Original von reinkie
Diese 3-er Schleife ist die zeitaufwendigste Schleife! Die 5er-Schleife die zweitaufwendigste.

Für große n ist es vernachlässigbar, ob man dies zwei Schleifen für 3 und 5 durchführen muss oder nicht.

Zitat:
Original von reinkie
Jede Nicht-Primzahl wurde ja genau einmal markiert.

Interessante Idee, aber: Um festzustellen, ob man noch markieren muss oder nicht, muss man ja das bestehende Primzahlfeld selbst konsultieren. Und das frisst auch wieder Zeit, gerade auch wegen der komplizierten Übersetzungsschicht des Kiebartkamms. Insgesamt glaube ich erst dann an einen Zeitvorteil, wenn ich das selbst gesehen habe.

Zum Vergleich: Einfaches Eratosthenes-Verfahren auf Bitfeld, wo pro ungerade Zahl ein Bit vorgesehen ist: Alle Primzahlen bis 2 Milliarden in 6.1 Sekunden auf einem 6 Jahre alten PC (nur ein Kern wird genutzt).
reinkie Auf diesen Beitrag antworten »

Hallo Hal 9000,
ich habe einen neuen Thread "Kiebartkamm Siebverfahren" begonnen, mit einer Art Pseudocode (Visual-Basic-angelehnt), den du recht leicht umbauen kannst.
Also nicht mit 2 starten, sondern wenn du die ungeraden Zahlen speichern willst mit 3.

Sehr, sehr einfach zu codieren! Jedenfalls, wenn du das Sieb des Eratosthenes schon mit Bitspeicherung für die ungeraden Zahlen programmiert hast.

Deine Ergebnisse würden mich sehr interessieren.
reinkie Auf diesen Beitrag antworten »

Zitat von Hal 9000: Interessante Idee, aber: Um festzustellen, ob man noch markieren muss oder nicht, muss man ja das bestehende Primzahlfeld selbst konsultieren.

Nein! Das brauchst du nicht. Alle Produkte, die du bildest, sind noch nicht markiert!!!!
HAL 9000 Auf diesen Beitrag antworten »

Fettdruck mit Ausrufezeichen ersetzt keine Argumentation:

Ich verstehe dein Verfahren so, dass du nur dann das Vielfache der Primzahl im Sieb wegstreichst, falls kein Vielfaches von Primzahlen (oder doch ?) ist. Aber wie stellst du denn fest, dass diese Eigenschaft aufweist, ohne dass du dein Primzahlfeld konsultierst? unglücklich


EDIT: Ich sehe gerade im Pseudocode

Zitat:
Streiche(1)
FOR P1 = 2 To Wurzel(Grenze)
IF IstDiesEineNochprimzahl(P1) Then
FOR P2 = P1 + 1 To Grenze
IF IstDiesEineNochprimzahl(P2)
Ergebnis = P1 * P2
IF Ergebnis > Grenze Then Exit For (Verlasse die innere Schleife)
Streiche(P1*P2)
END IF
NEXT P2
END IF
NEXT P1

dass du doch das Primzahlfeld konsultierst, genau wie ich vermutet hatte. Also war dein fettgedrucktes Nein! etwas unüberlegt vorgebracht.

Meine Erfahrung ist: Da das Streichen vom Rechenaufwand nicht teurer ist als dieses Nachschauen im Primzahlfeld (einen leidlich gut optimierenden Compiler vorausgesetzt), lohnt sich das vorherige Nachschauen i.d.R. gar nicht.
reinkie Auf diesen Beitrag antworten »

Ja, HAL 9000, ich habe dich missverstanden, Entschuldigung.

IstDiesEineNochprimzahl(P1) prüft natürlich das vorhandene Primzahlfeld.
reinkie Auf diesen Beitrag antworten »

Zitat:
Original von HAL 9000
Meine Erfahrung ist: Da das Streichen vom Rechenaufwand nicht teurer ist als dieses Nachschauen im Primzahlfeld (einen ledlich gut optimierenden Compiler vorausgesetzt), lohnt sich das vorherige Nachschauen i.d.R. gar nicht.


Ich möchte dir gerne empfehlen, diesen Code mal auszuprobieren, um dich vom Gegenteil zu überzeugen.
reinkie Auf diesen Beitrag antworten »

Hallo HAL 9000.
In den For-Schleifen würde ich dir empfehlen, deine Bit-Speicherung zu durchlaufen, und nur für P1 bzw. P2 die echten Zahlen zu errechnen und einzusetzen, wenn das Bit auf Nochprimzahl steht, also nicht gestrichen wurde. So habe ich dies in KK.EXE gelöst.
HAL 9000 Auf diesen Beitrag antworten »

Hab den Kamm mal ausprobiert: Mit LUT und bei ist es mit der Kiebartkammspeicherung tatsächlich einen Hauch schneller (ca. 5%). Allerdings ohne dieses vorherige Nachschauen im Primzahlfeld (das bringt - wie oben erwähnt - keinen Zeitgewinn).

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
int nKiebartLUT[8]               = { 1, 7, 11, 13, 17, 19, 23, 29 };
unsigned char bKiebartInvLUT[15] = { 1, 0, 0, 2, 0, 4, 8, 0, 16, 32, 0, 64, 0, 0, 128 };

unsigned char *eratosthenes (int nSize, int *pnFlagArraySize)
{
    if (nSize < 2)
    {
        return NULL;
    }
    else
    {
        int nFlagArraySize = (nSize + 29) / 30;     // Feldgroesse geeignet aufrunden
                                                    // Variable ?Odd repraesentiert die ungerade natuerliche Zahl (2*?Odd+1):
        int nOdd = 15 * nFlagArraySize;             // n = obere Grenze (ist sicher >nSize)
        int pOdd = 3;                               // Start p = 7
        int qOdd = 24;                              // Start q = p^2 = 49
        unsigned char *bSieve = (unsigned char *)malloc(nFlagArraySize);
        memset(bSieve, 0xFF, nFlagArraySize);       // Grundinitialisierung: Alle weder durch 2,3,5 teilbaren Zahlen sind zunaechst unter Primzahlverdacht
        bSieve[0] &= ~1;                            // 1 ist keine Primzahl
        while (qOdd < nOdd)
        {
            if ((bSieve[pOdd / 15] & bKiebartInvLUT[pOdd % 15]) > 0)
            {
                int p = 2 * pOdd + 1;               // naechste Primzahl im Sieb
                int rOdd = qOdd;                    // r = p^2
                while (rOdd < nOdd)                 // solange r < n)
                {
                    unsigned char bMask = bKiebartInvLUT[rOdd % 15];
                    if (bMask != 0)
                    {
                        // hierher zum Streichen wird nur verzweigt,
                        // wenn r weder durch 2,3,5 teilbar ist
                        bSieve[rOdd / 15] &= ~bMask;
                    }
                    rOdd += p;                      // r = r + 2p
                }
            }
            pOdd++;                                 // p = p+2
            qOdd += 4 * pOdd;                       // q = q + 4p , entspricht q = p^2
        }
        *pnFlagArraySize = nFlagArraySize;
        return bSieve;
    }
}

void printSieve (unsigned char *bSieve, int nFlagArraySize)
{
    printf("2,3,5");
    for (int nIndex = 0; nIndex < nFlagArraySize; nIndex++)
    {
        unsigned char bMask = bSieve[nIndex];
        for (int nBitPos = 0; nBitPos < 8; nBitPos++)
        {
            if (bMask & 1)
            {
                printf(",%d", 30 * nIndex + nKiebartLUT[nBitPos]);
            }
            bMask >>= 1;
        }
    }
    printf("\n");
}
Meine Vermutung ist, dass der minimale Zeitgewinn hauptsächlich daraus resultiert, dass der Prozessor-Cache durch die kleinere Feldgröße besser wirksam ist.

Die obige Variante ist wie zu sehen eine Single-Thread-Variante. Eine gute Möglichkeit zur Parallelisierung wäre sicher für die Streichoperationen (Zeilen 24..36) drin:

Das kann man gut und gern für mehrere parallel durchführen, zumal man sich die Threads da nicht ins Gehege kommen durch gegenseitiges Aufeinander-Warten-Müssen.
reinkie Auf diesen Beitrag antworten »

Dieser Programmcode ist ja das Sieb des Erathosthenes. Du benutzt ja nur die Speicherung im "8 von 30" -Verfahren.
Ein guter Anfang.
Ich denke eher, dass die 5% dadurch zustande kommen, dass du nun nicht mehr die 3er und die 5er Schleife durchläufst. Diese beiden haben ja die meisten Durchläufe.
Probiere doch mal das Verfahren "Kiebartkamm" aus. Hab ich in einem Extra-Thread beschrieben.
Dann wirst du den Geschwindigkeitsvorteil spüren...
Auch meine 32-Bit-Version von kk.exe in VB6 (Oberfläche) und Intel-Assembler (Math.DLL) läuft auf einem Thread. Obwohl mein Rechner 8 Cores hat.
Neue Frage »
Antworten »



Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »