Faktorisierung von Polynomen < Maple < Mathe-Software < Mathe < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 15:49 Fr 15.01.2010 | Autor: | Dani13 |
Aufgabe | Die quadratfreie Faktorisierung von Polynomen über Zp: diesen algorithmus sollte in in maple implementieren:
SQUAREFREE(f(x))
INPUT: a monic polynomial f(x) e Fq(x) of degree > 1, where Fq has quaractaristic p.
OUTPUT: the square-free factorisation of f(x)
1. set i<-- 1, F<--1 and compute f´(x).
2. if f´(x) =0 then set f(x) [mm] =f(x)^1/p [/mm] and [mm] F<--SQUAREFREE(f(x))^p.
[/mm]
otherwise do the following:
a. compute g(x) <--gcd(f(x),f´(x)) and h(x)<-- f(x)/g(x).
b. while h(x) ≠1 do the following:
compute h1(x)<--gcd(h(x),g(x)) and l(x) <--h(x)/h1(x).
set [mm] F<--F*l(x)^i, [/mm] i<-- i+1, h(x)<--h1(x) and g(x)<--(g(x)/h1(x)).
c. If g(x) ≠ 1 then set g(x)<-- [mm] g(x)^1/p [/mm] and [mm] F<--F*(SQUAREFREE(g(x)))^p.
[/mm]
3. return F.
|
Hallo, ich bin Maple anfängerin (und auch programmieranfängerin), was man vermutlich bei dem Code da merkt, jedenfalls hab ich jetzt mal das versucht:
faktorisierung := proc(b::polynom,x::symbol)
local i, f, h1, h, f1, g, l, F;
F:=1;
f1:=diff(f,x);
if f1 = 0
then [mm] f=f^1/2 [/mm]
else
g:=gcd(f,f1) ; h=f/g
end if;
for i while h <> 1 do
h1:=gcd(h,g); l:=h/h1;
if l<>1 then
[mm] F=F*l^i [/mm] end if;
h=h1; g=g/h1 end do;
g*F
end proc:
nach 4 stunden die ich daran gesessen bin, weiss ich nun wirklich nicht mehr weiter und hoffe sehr irgendjemand kann mir helfen das zu verbessern...
ganz lieben dank schon im voraus
dani
Ich habe diese Frage in keinem Forum auf anderen Internetseiten gestellt.
|
|
|
|
Hallo,
leider hab ich nicht wirklich viel Ahnung von Maple und was dein Programm machen soll, ist mir auch nicht ganz klar, aber es wäre vielleicht sinnvoll, wenn du angeben könntest, was eigentlich nicht funktioniert.
Trotzdem habe ich eine Idee, was ein Problem sein könnte:
> faktorisierung := proc(b::polynom,x::symbol)
> local i, f, h1, h, f1, g, l, F;
> F:=1;
> f1:=diff(f,x);
Wo wird denn f auf die Funktion gesetzt? Irgendwie musst du doch aus dem Polynom b, was übergeben wird, f machen.
> if f1 = 0
> then [mm]f=f^1/2[/mm]
> else
> g:=gcd(f,f1) ; h=f/g
Auch hier ist laut Aufgabenstellung f(x) usw. zu nehmen und nicht nur f.
> end if;
> for i while h <> 1 do
> h1:=gcd(h,g); l:=h/h1;
> if l<>1 then
> [mm]F=F*l^i[/mm] end if;
> h=h1; g=g/h1 end do;
> g*F
> end proc:
>
>
> nach 4 stunden die ich daran gesessen bin, weiss ich nun
> wirklich nicht mehr weiter und hoffe sehr irgendjemand kann
> mir helfen das zu verbessern...
>
> ganz lieben dank schon im voraus
> dani
So wie ich das sehe, muss f eine Funktion sein. Die soll sicherlich übergeben werden.
Was für mich als "Alle-Sprachen-Außer-Deutsch-Nichtversteher" wünschenswert ist, wäre ein kleines Beispiel, mit Werten (Zahlen, Polynomen, was auch immer) die in die Funktion hineinkommen sollen und der dazugehörigen Ausgabe (also das was du erhalten willst - nicht das was dein Programm zur Zeit liefert). Im nächsten Schritt ist es natürlich sinnvoll zu wissen, was dein Programm liefert...
Viel Erfolg,
Roland.
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 20:16 Fr 15.01.2010 | Autor: | Dani13 |
Aufgabe | weitere idee:
faktorisierung := proc(f::polynom,x::symbol)
local i, h1, f1, g, F,h,l;
F:=1;
f1:=diff(f,x);
if f1 = 0
then F:=f^(1/p)
else
g:=gcd(f,f1); h:=(f/g);
for i while h <> 1 do
h1:=gcd(h,g); l:=(h/h1);
if l<>1 then
[mm] F:=F*l^i [/mm] end if;
h:=h1; g:=(g/h1) end do;
end if;
g*F
end proc: |
hallo roland
so, hab jetz nochmal weiter daran gearbeitet, wie oben ersichtlich
der hintergrund dieser aufgabenstellung ist dass ein polynom vom n-ten grad also zum Bsp: [mm] x^4+3x³+2x².... [/mm] in die form (x-3)*(x-2),....
gebracht wird, also dass keine quadrate bei den x mehr vorhanden sind, so hab ich das jedenfalls verstanden,...
im moment macht mein programm eigentlich gar nichts, also es wird auf kein fehler angezeigt, also es gibt mir wenn ich eingebe:
f := [mm] x^4+2*x^3-41*x^2-42*x+360
[/mm]
dieselben werte wieder zurück...
immer noch für hilfe sehr dankbar.. :)
|
|
|
|
|
Hallo,
aus deinen Ausführungen wurde ich dann doch nicht so richtig schlau. Doch es existiert ein wikipedia-Artikel, der - obwohl auf englisch - mir verraten konnte, was gemeint ist:
Das Problem sind die Nullstellen von Polynomen. Nun kann man ein Polynom einfach so schreiben, dass die Nullstellen gleich ablesbar sind (z.B.: f(x)=(x-2)*(x-4)*(x+12)) aber so ist es ja nicht immer gegeben. Das spezielle an deinem Algorithmus ist, dass es keine doppelte (bzw. n-fache) Nullstelle gibt (wie es bei f(x)=(x-2)*(x-2)*(x+4)) der Fall wäre.
Nun würde ich dir empfehlen den Pseudocode des Algorithmus an einem konkreten Beispiel nachzuvollziehen. Denn dann erkennst du was der Reihe nach gemacht wird. Ein einfaches Beispiel [mm] (f(x)=x^2+2x) [/mm] sollte vielleicht schon genügen.
Wenn du per Hand auf die Faktorisierung kommst, dann sollte es auch mit Maple nicht mehr schwer sein.
Was mir an deiner Funktion noch auffiel: Gibt es in maple kein "return"? Wie wird denn das Ergebnis zurückgegeben?
Hoffe es hilft trotzdem ein wenig weiter...
Viel Erfolg noch,
Roland.
|
|
|
|