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
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.
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.
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.
Siehe auch Goldbachsche Vermutung. Du kannst also noch beruehmt werden.
> 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
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?
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.
Ich muss mich verbessern: Die Bedingung muss 'kleiner oder gleich x/2' sein.
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?
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 | }
|
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.
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.