Primfaktorzerlegung < Mathematica < Mathe-Software < Mathe < Vorhilfe
|
Aufgabe | Definieren Sie in Mathematica eine eigene Funktion, die die Primfaktorzerlegung einer natürlichen Zahl bestimmt. Testen Sie Ihre Funktion an der Zahl 504.
(Nach dem Hauptsatz der Zahlentheorie existiert zu jeder natürlichen Zahl eine (bis auf Reihenfolge) eindeutige Primfaktorzerlegung!)
|
Hallo,
wahrscheinlich für Könner eine absolut einfache Aufgabe. Ich allerdings hatte erst zwei Stunden Computeralgebra und bin schon froh, dass ich inzwischen rausgefunden habe, wie man einen Befehl abschickt. Ich hab auch keinerlei Erfahrung mit ähnlichen Programmen oder dem Programmieren allgemein. Mein Ansatz ist daher leider trotz stundenlanger Rumprobiererei sehr dürftig:
Ich möchte das irgendwie mit der While-Funktion machen. Wie sie funktioniert, habe ich inzwischen glücklicherweise grob verstanden.
Mein Plan:
Funktion definieren mit einer Variablen k.
Dann soll ein n bei 2 beginnen und so lange getestet werden, bis es nicht mehr kleiner als k ist.
Das n soll getestet werden, ob es eine Primzahl ist (PrimeQ[n]) und wenn es eine ist, dann soll getestet werden, ob k durch n ohne Rest teilbar ist, wenn ja dann soll n ausgegeben werden (Print[n]) oder besser noch in eine Liste eingefügt werden (Append[liste]??? oder so), die dann am ende ausgegeben wird. dann soll er nochmal das gleiche n prüfen (kann ja sein, dass es mehrmals als Primfaktor vorkommt. Wenn solch eine Prüfung verneint würde, soll er beim n eins dazu zählen (n++).
Das magere bißchen habe ich bis jetzt:
n=2; test[k_]:= While[n<k, .............Print[n];n++]
Aber wie bekomme ich meinen Plan jetzt so hingeschrieben, dass Mathematica versteht, was ich will? :D
Ich hoffe, dass sich jemand erbarmt, mir etwas zu helfen! Vielen Dank!
Ich habe die Frage in keinem anderen Forum gestellt.
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 01:30 Mo 26.04.2010 | Autor: | Andariella |
nach einem positiven Durchgang (wenn also ein Primfaktor n gefunden wurde) soll k durch k/n ersetzt werden. das hatte ich noch vergessen zu schreiben.
|
|
|
|
|
Hallo Andariella,
obwohl ich Mathematica schon recht lange kenne (aber
nur von Zeit zu Zeit einmal nutze), habe ich in solchen
Dingen noch keine große Routine. Immer wieder muss
ich auch nachschlagen, wie einzelne Befehle genau
aussehen und wie ihre Syntax ist. Lange "Mathematica-
Einzeiler" versuche ich im allgemeinen zu meiden; da
ist mir eine konventionelle Programmiersprache (bei
mir meistens Pascal) lieber ...
Ich würde also zuerst eine mehrzeilige Funktion ent-
werfen und erst dann versuchen, daraus den Mathema-
tica-Einzeiler (oder allenfalls auch eine mehrzeilig
notierte Funktion) zu erzeugen.
Mit deinem Ansatz bist du auf dem (einem möglichen)
richtigen Weg. Wenn ich richtig verstanden habe, läuft
es auf eine rekursive Definition heraus, wobei als output
der Funktion test[k] die Liste der Primteiler von k
entstehen soll. Man fängt also mit der leeren Liste {}
an und fügt ihr nacheinander (rekursiv) alle gefundenen
Primteiler in aufsteigender Reihenfolge zu.
Jetzt muss ich zuerst selber eine Weile hirnen, um eine
kleine entsprechende rekursive Pascal-Funktion zu
entwerfen ...
LG Al-Chw.
|
|
|
|
|
Hallo Andariella,
> Jetzt muss ich zuerst selber eine Weile hirnen, um eine
> kleine entsprechende rekursive Pascal-Funktion zu
> entwerfen ...
Inzwischen habe ich es geschafft, ein entsprechendes Pascal-
programm zu basteln, das funktioniert. Die rekursiv definierte
Funktion "primelist(k)" sieht so aus:
function primelist(k:integer):liste;
var i: integer;
begin
if k=1 then primelist:=emptylist
else begin
i:=leastprime(k);
primelist:=append(primelist(k div i),i)
end
end;
Das könnte inhaltlich so ziemlich genau dem entsprechen, was
halirutan inzwischen geliefert hat. Natürlich musste ich die
Funktionen "leastprime(k:integer)" , "append(l:liste;i:integer)"
sowie die Liste "emptylist" zuerst selber kreieren, da solche
Sachen in Pascal nicht einfach so verfügbar sind ...
LG Al-Chwarizmi
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 13:44 Di 27.04.2010 | Autor: | Andariella |
danke! :)
|
|
|
|
|
Moin,
> Ich hoffe, dass sich jemand erbarmt, mir etwas zu helfen! Vielen Dank!
naja, ich hab mal "Hilfe" bei Wikipedia nachgeschlagen: "Sie dient dazu, einen erkannten Mangel oder eine änderungswürdige Situation zu verbessern." Laut der Definition kann ich dir nicht helfen, denn ich kann weder den Mangel beheben, dass du keine konkrete Vorstellung von einem Algorithmus fuer dein Problem hast, noch kann ich dir ueber die aenderungswuerdige Situation helfen, dass du wenig Mathematica-Syntax beherrschst. Das musst du dir selbst erarbeiten.
Obwohl die Erfahrung zeigt, dass fertige Loesungen bei den Hilfesuchenden meist das Gegenteil von Erkenntniszuwachs bewirken, lasse ich es mal drauf ankommen:
1: | primerize[n_] :=
| 2: | Block[{i, res = {}, nn = n},
| 3: | For[i = 2, i <= nn, i++, While[Mod[nn, i] == 0, AppendTo[res, i];
| 4: | nn /= i]];
| 5: | Tally[res]]
| 6: |
| 7: | primerize[504]
|
Das ist der am leichtesten zu verstehende "Nicht-Einzeiler", der mir eingefallen ist.
Geh Zeile fuer Zeile durch und versuch zu verstehen, was genau passiert.
Ich hoffe es hilft trotzdem.
Cheers
Patrick
PS: Da es "Tally" erst am MMA 6 gibt, laeuft es mit 5.2 nicht.
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 11:24 Di 27.04.2010 | Autor: | Andariella |
Vielen Dank für eure Mühe, das funktioniert bei mir jetzt auch (habe zum glück MMA 7). Muss mir das jetzt aber noch genauer anschauen, die nächsten Aufgaben werden sicher nicht leichter!
|
|
|
|