Forum: PC-Programmierung Gerade Zahl als Summe zweier Primzahlen darstellen


von Grey (Gast)


Lesenswert?

Hallo leute, wir haben neulich in unserer Laborübung die Aufgabe 
bekommen in C ein Programm zu schreiben, welches eine gerade Zahl als 
summe zweier Primzahlen darstellen soll.

Nun habe ich folgende Überlegungen gehabt:
Wenn ich die Zahl durch 2 teile, dann kann es immer noch sein, dass die 
entstandenen Zahlen wieder gerade sind, was aber nicht gut ist, denn ich 
will ja 2 Primzahlen errechnen. Wenn ich eine Primfaktorzerlegung mache, 
dann bringt mich das auch nicht weiter, weil ich habe daruch zwar nur 
Primzahlen drinnen, aber eine Multiplikation zwischen diesen 
entstandenen Primzahlen so zu gestalten dass zwei weitere rauskommen, 
ist meines erachtens nach nicht möglich...

Wie würdet ihr das ganze angehen?

: Verschoben durch Moderator
von Dussel (Gast)


Lesenswert?

Kommt drauf an, wie viel mir eine gute Lösung der Aufgabe wert ist. Wenn 
die Aufgabe nur schnell erfüllt sein soll, würde ich es einfach 
ausprobieren. Von der gegebenen geraden Zahl nacheinander Primzahlen 
abziehen, bis das Ergebnis eine Primzahl ist.

von radiostar (Gast)


Lesenswert?

Grey schrieb:
> Wenn ich eine Primfaktorzerlegung mache,
> dann bringt mich das auch nicht weiter, weil ich habe daruch zwar nur
> Primzahlen drinnen, aber eine Multiplikation zwischen diesen
> entstandenen Primzahlen so zu gestalten dass zwei weitere rauskommen,
> ist meines erachtens nach nicht möglich...

Nein, aber Du könntest alle Primzahlen kleiner als die gegebene Zahl 
bestimmen. Und dann probierst Du einfach aus, welche Kombination passt.

von Christian B. (casandro)


Lesenswert?

OK, C deutet darauf hin, dass es sich um kleine Zahlen handelt, da C für 
große Zahlen spezielle Bibliotheken braucht.

Du findest sicherlich relativ schnell einen Algorithmus zur Bestimmung 
ob eine Zahl eine Primzahl ist oder nicht, bzw einen Algorithmus mit dem 
Du Primzahlen bestimmen kannst. (Gibts sicher auf Wikipedia oder so)

Wenn Deine gerade Zahl x ist, bestimme Primzahlen die kleiner als x/2 
sind. Schaue bei jeder dieser Primzahlen nach ob die Differenz prim ist, 
ist sie das so hast Du ein Beispiel gefunden.

von Josef (Gast)


Lesenswert?

Siehe auch Goldbachsche Vermutung.

Du kannst also noch beruehmt werden.

von g457 (Gast)


Lesenswert?

> OK, C deutet darauf hin, dass es sich um kleine Zahlen handelt, da C für
> große Zahlen spezielle Bibliotheken braucht.

'klein' und 'groß' sind relativ. Ich betrachte 2^64-1 als ziemlich groß 
:-) Unabhängig davon wird man die Goldbachvermutung wohl am 
einfachsten(tm) so angehen. Einen schnellen Prim-Checker wirds 
allerdings brauchen.

[0] Linux/amd64, long long unsigned int

von Grey (Gast)


Lesenswert?

Christian Berger schrieb:
> Wenn Deine gerade Zahl x ist, bestimme Primzahlen die kleiner als x/2
> sind. Schaue bei jeder dieser Primzahlen nach ob die Differenz prim ist,
> ist sie das so hast Du ein Beispiel gefunden.

Ist diese FUnktionsweise aber garantiert? Oder kann es sein, dass bei 
der ein oder anderen es doch nicht funktioniert?

von Dussel (Gast)


Lesenswert?

Grey schrieb:
> Christian Berger schrieb:
>> Wenn Deine gerade Zahl x ist, bestimme Primzahlen die kleiner als x/2
>> sind. Schaue bei jeder dieser Primzahlen nach ob die Differenz prim ist,
>> ist sie das so hast Du ein Beispiel gefunden.
>
> Ist diese FUnktionsweise aber garantiert? Oder kann es sein, dass bei
> der ein oder anderen es doch nicht funktioniert?
Unter der Annahme, dass die besagte Goldbachsche Vermutung stimmt, die 
bis 10^17 oder sowas nachgewiesen ist, funktioniert das für alle Zahlen 
größer als 2.

von Dussel (Gast)


Lesenswert?

Ich muss mich verbessern: Die Bedingung muss 'kleiner oder gleich x/2' 
sein.

von Grey (Gast)


Lesenswert?

Na das funktioniert ja fix!!
Ich frag mich nur was passiert, wenn unter x/2 keine Primzahlen mehr 
vorhanden sind? Dann würde doch der Algorithmus nicht funktionieren. 
Also sprich, alle Kombinationen haben nicht funktioniert, und jetzt bin 
ich bei 2 angelangt. Was jetzt?

von Grey (Gast)


Lesenswert?

Ach ja, das ist das bisherige Programm, welches sehr gut funktioniert:
1
void makePrime(long number){
2
    long i = 0, zahl;
3
4
    while(TRUE){
5
        while(TRUE){
6
            zahl = number/2-i;
7
            if(isprime(zahl)){
8
                printf("zahl = %ld ist eine Primzahl\n", zahl);
9
                break;
10
            }
11
            i++;
12
        }
13
14
        if( isprime(number - zahl) ){
15
            printf("\nDie Zahl %ld ist eine Primzahl \n", (number-zahl) );
16
            printf("\nDie Zahl %ld kann als: %ld + %ld dargestellt werden", number, (number-zahl), zahl);
17
            return;
18
        }
19
        i++;
20
    }
21
}

von Christian B. (casandro)


Lesenswert?

Grey schrieb:
> Ich frag mich nur was passiert, wenn unter x/2 keine Primzahlen mehr
> vorhanden sind?

Naja, dann gibts keine weiteres Primzahlenpaar. Natürlich muss es 
kleiner Gleich x/2 heißen, da war ich unpräzise.

von g457 (Gast)


Lesenswert?

> Also sprich, alle Kombinationen haben nicht funktioniert, und jetzt bin
> ich bei 2 angelangt. Was jetzt?

Sofern Du geprüft hast, dass..
   - die Eingabe gerade
und
   - echt größer als 2 ist
und Du sodann bei obigem Problem angelangt bist, gibt es genau zwei 
Möglichkeiten:
   - Dein Programm ist falsch (oder ein Myon hat den Speicher
     korrumpiert)
oder
   - Du hast ein Gegenbeispiel zur Goldbachvermutung gefunden. Auf jeden
     Fall aufschreiben und veröffentlichen!

Ersterer Fall ist aber wahrscheinlicher.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.