|
Schreiben Sie eine Prozedur, die die Goldbachvermutung testet. Eingabe soll eine natürliche Zahl sein. Ist n ungerade oder nicht größer als 4, dann soll die Ausgabe "falsche Eingabe sein". Wenn gerade und Summe von zwei Primzahlen ist, soll die Ausgabe sein, und wenn gerade und nicht Summe von zwei Primzahlen ist, soll die Ausgabe sein. Verwenden Sie eine while-Schleife.
Zunächst mal meine (Programm-)Idee: Ich erstelle eine Liste (Menge) aller Primzahlen bis zu diesem . Und anschließend soll er jedes Element dieser Liste mit jedem anderen addieren. Dazu habe ich eine Doppewhileschleife verwendet um beide Summationsindizes laufen zu lassen. Kommt da das gewünschte heraus, soll die Ausgabe "true" sein sonst eben "false". Es ist zwar ein (mathematisch) primitives Programm, aber das wird wohl nicht angemeckert werden. Denn es ist sicherlich nicht einfach systematisch (ohne probieren) die Primzahl(summen)zerlegung einer geraden Zahl zu finden.
Ich bitte euch nun, mir zu sagen, was in meinem Programm nicht ganz stimmt. Es funktioniert nämlich nicht obwohl ich es schon probiert habe.
Wäre euch sehr dankbar.
Hier mein Programm:
Goldbachtest:=proc(n) local a,b,i,j,M; n:=900; i:=n; M:={}; while i>2 do j:=prevprime(i) i:=j; M:= M union {i}; od; if n = odd or n<=4 then print("falsche Eingabe"); else a=1; b=1; while a<|M| do b=1; while b<|M| do if M[a] + M[b] = n then print("true") else print("false"); fi; b:=b+1; end do; a:= a+1; end do; fi;
Für alle, die mir helfen möchten (automatisch von OnlineMathe generiert): "Ich möchte die Lösung in Zusammenarbeit mit anderen erstellen." |
|
|
Hallo,
was funktioniert denn nicht? Bricht das Programm mit einem SyntaxFehler ab oder liefert es einfach ein falsches Ergebnis?
Warum hast Du die Primzahlen als Menge gespeichert und nicht als Liste? Kann man dann trozdem noch mit in einer bestimmten Reihenfolge zugreifen?
Gruß pwm
|
|
Hallo pwm,
das Problem ist, dass das Programm einfach nicht laufen will. Also offenbar eher ein Syntaxfehler, was natürlich einen Inhaltfehler logisch nicht ausschließt.
Stimmt, das sehe ich gerade. Es muss oben als Liste definiert werden.
Kennst du dich in maple aus oder betrachtest du das nur im Augen eines allgemeinen Programmierers? :-)
Also mit der Liste sieht es so aus:
Goldbachtest:=proc(n) local a,b,i,j,M; n:=900; i:=n; M:=[]; while i>2 do j:=prevprime(i); i:=j; M[i]:= i; od; if n = odd or n<=4 then print("falsche Eingabe"); else a=1; b=1; while a<|M| do b=1; while b<|M| do if M[a] + M[b] = n then print("true") else print("false"); fi; b:=b+1; end do; a:= a+1; end do; fi;
|
|
"Kennst du dich in maple aus oder betrachtest du das nur im Augen eines allgemeinen Programmierers? :-) " Halb-Halb :-)
Welche Maple-Version verwendest Du?
Jedenfalls ist jetzt die Besetzung der Liste falsch: Du nimmst als Listenindex zugleich den Wert, nämlich die Primzahl. Du musst jede gefundene Primzahl an das Ende der Liste anhängen.
Lass Dir doch einfach mal die Liste ausrucken, bevor Du damit arbeitest.
Gruß pwm
|
|
Hallo pwm,
ich verwende maple 18.
In den Zeilen j:=prevprime(i) i:=j; M[i]:= i;
wird ja jede neu gefundene (kleinere) Primzahl der Liste angehängt.
Aber die Doppelschleife dürfte logisch korrekt sein, oder? Ich sah dies als einzige Möglichkeit um die k^2 Operationen durchzuführen (wobei k=|M|).
|
|
Hallo,
mir ist noch aufgefallen, dass Du zweifach verwendest: Es soll der Parameter sein, der getestet wird und an das Unterprogramm übergeben wird und gleichzeitig setzt Du im Unterprogramm?
Nochmal mein Rat: Teste zunächst nur die Erzeugung von und lass Dir ausdrucken.
Gruß pwm
|
|
Lieber pwm,
mit deinen Tipps habe ich das Programm lösen können.
Vielen, vielen Dank dir für deine Unterstützung! :-)
|