Primzahltest und Zahleingabe < Maple < Mathe-Software < Mathe < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 00:37 Mi 07.11.2007 | Autor: | blueeyes |
Aufgabe | Erstellen Sie MAPLE-Prozeduren für die folgenden Aufgabe.
(a) Es soll ein sehr einfacher Primzahltest durchgeführt werden: Wenn eine natürliche Zahl n eingegeben wird, soll die Prozedur für alle zwischen 2 und [mm] \wurzel(n) [/mm] ausprobieren, ob sie n teilen. Wenn n nicht prim ist, soll der kleinste nicht triviale Teiler von n ausgegeben werden, sonst 1. Ist 19596341 prim? Die Maple-Befehle "sqrt", "floor" und "mod" können dabei nützlich sein. |
So, ich bin absoluter Leihe in Sachen Mapleprogrammieren. Wir hatten bisher eine Stunde eine Einführung in dieses Programm. Könntet ihr mir sagen,wie ich an die Aufgabe an besten rangehen könnte? LG
|
|
|
|
Hallo,
das Grundgerüst könnte so aussehen:
ptest := proc(n) local i, wurzel;
...
end proc;
Darin berechnest du zuerst die Wurzel von n und rundest ab. Die Befehle dafür kennst du ja bereits.
Danach durchläufst i eine for-Schleife (Syntax siehe Hilfe) von 2 bis zu der Wurzel.
In jedem Schritt prüfst du, ob n teilbar ist durch das aktuelle i. Das geht per mod (siehe Hilfe). Falls ja, gibst du dieses i per return zurück.
Nach Ende der Schleife gibst du eine 1 zurück. So weit kommt das Programm nur, falls nicht schon in der Schleife ein Wert zurückgegeben wurde.
Gruß
Martin
|
|
|
|
|
Hey ich sitze auch gerade an der selben Aufgabe.
bin soweit gekommen, dass das mod in der Schleife prüft, ob das n das i teil! Dabei kommt 0 raus wenn ja und eine andere Zahl wenn nicht!
Leider komme ich nicht weiter und weiß nicht, wie ich das i per return zurückgeben kann, falls n mod i = 0!
Soweit bisher meine Fragen aber es kommen bestimmt noch mehr! ;)
aber schonmal danke für eine Antwort!
|
|
|
|
|
Hallo und ,
> Leider komme ich nicht weiter und weiß nicht, wie ich das i per return zurückgeben kann, falls n mod i = 0!
Na per:
if n mod i = 0 then return i; end if;
Gruß
Martin
|
|
|
|
|
Soweit bin ich jetzt:
test := proc (n)
local i;
j := round(sqrt(n));
for i from 2 to j do
if n mod j = 0 then return i;
fi;
od;
end proc;
aber weiter hab ich doch keine Ahnung mehr, hab schon einiges probiert aber das war ohne Hand und Fuß!
danke schonmal für hoffentlich schnelle Hilfe
|
|
|
|
|
Hallo,
das ist gut, du bist fast fertig!
Du solltest aber der Form halber auch das j mal als local deklarieren, zählt aber nicht als Fehler...
Ein echter Fehler ist, dass du i und j verwechselst, denn du sollst modulo i rechnen, nicht modulo j. j ist nämlich konstant.
Wenn du das berichtigt hast, fehlt nur noch die Ausgabe für den Fall, dass n eine Primzahl ist!
Gruß
Martin
|
|
|
|
|
Und noch eine Frage!
Ich musste bei mir ja nur noch ein
if n mod i = 1 then return 1;
fi;
einbringen oder?
Wenn ja funktionier der tolle Test irgendwie nicht mit n=5
Oder hab ich doch noch was falsch gemacht?
|
|
|
|
|
ich bin zu dumm! hab mir die Frage selbst beantwortet! =)
|
|
|
|
|
Nur der Vollständigkeit halber: Einfach ein return 1; direkt hinter der for-Schleife reicht auch.
Gruß
Martin
|
|
|
|