Rešitev: Zapis redkega polinoma (Mathematica)

Iz MaFiRaWiki

Naloga: Zapis redkega polinoma


Zapis polinoma

Clear[SPolinom, Pripravi, Vstavi, Stopnja, Spremenljivka, Koeficienti, 
      Potence, Prosti, Vodilni, ItiClen, Elementi, Izpisi, Sestej]

Pripravi[e_List:{}, spr_:x] := Module[{els, n},
    els = Cases[e, {_, p_} /; p > 0];
    n = Max[Transpose[els][[2]]];
    SPolinom[spr, n, els]]

Spremenljivka[SPolinom[spr_, _, _]] := spr
Stopnja[SPolinom[_, n_, _]] := n
Elementi[SPolinom[_, _, e_List]] := e
Koeficienti[p_SPolinom] := Transpose[Elementi[p]][[1]]
Potence[p_SPolinom] := Transpose[Elementi[p]][[2]]
Prosti[p_SPolinom] := First[Koeficienti[p]]
Vodilni[p_SPolinom] := Last[Koeficienti[p]]

ItiClen[SPolinom[spr_, n_, e_List], i_] := Module[{r},
    If[i > n || i < 0 , Return[0]];
    r = Cases[e, {_, i}];
    If[Length[r] ≤ 0 , Return[0]];
    Return[{r[[1]]} /. {a_, q_} -> a*spr^q]]

Vstavi[p_SPolinom, {v_, i_Integer}] := Vstavi[p, v, i]
Vstavi[p_SPolinom, v_, i_Integer] /; i ≥ 0 := Module[{e, r, st},
    e = Elementi[p];
    r = Cases[e, {_, i}];
    If[Length[r] ≤ 0 ,
      (* Dodamo novi element. *)
      st = Max[Stopnja[p], i];
      SPolinom[Spremenljivka[p], st, Append[e, {v, i}]],
      (* Popravimo stari element. *)
      e = Cases[e, {_, q_} /; q ≠ i];
      If[v ≠ 0, e = Append[e, {v, i}]];
      SPolinom[Spremenljivka[p], Stopnja[p], e]]]

Izpisi[p_SPolinom] := Apply[Plus, Replace[Elementi[p], {a_, q_} -> 
    a*Spremenljivka[p]^q, 1]] 

Dodatne funkcije

Clear[UrediEksponente, SestejKoeficiente]

UrediEksponente[ex_List] := Sort[ex, #1[[2]] <= #2[[2]] &]

SestejKoeficiente[k_List] /; Length[k] == 1 := k
SestejKoeficiente[k_List] :=
       k //. {l___, {m_, o_}, p___, {n_, o_}, r___} -> {l, {m + n, o}, p, r}

Funkcija zmnoži

Clear[Zmnozi]

Zmnozi[p_, q_] := \
Pripravi[SestejKoeficiente[UrediEksponente[Flatten[Table[Table[{Elementi[p]\
〚i〛〚1〛*Elementi[q]〚j〛〚1〛, Elementi[p]〚i〛〚2〛 +
           Elementi[q]
            〚j〛〚2〛}, {i,
               1, Length[Elementi[p]]}], {j, 
                    1, Length[Elementi[q]]}], 1]]], x]

Uporaba

a={{1,2},{3,4},{5,6}}
b={{7,8},{9,10},{11,12}}

In[22]:= c=Pripravi[a,x]
Out[22]= SPolinom[x,6,{{1,2},{3,4},{5,6}}]

In[23]:= Izpisi[c]
Out[23]= x2 + 3x4 + 5x6

In[24]:= d=Pripravi[b,x]
Out[24]= SPolinom[x,12,{{7,8},{9,10},{11,12}}]

In[25]:= Izpisi[d]
Out[25]= 7x8 + 9x10 + 11x12

In[26]:= Zmnozi[c,d]
Out[26]= SPolinom[x,18,{{7,10},{30,12},{73,14},{78,16},{55,18}}]

In[27]:= Izpisi[Zmnozi[c,d]]
Out[27]= 7x10 + 30x12 + 73x14 + 78x16 + 55x18

In[28]:= Zmnozi[c,c]
Out[28]= SPolinom[x,12,{{1,4},{6,6},{19,8},{30,10},{25,12}}]

In[29]:= Izpisi[Zmnozi[c,c]]
Out[29]= x4 + 6x6 + 19x8 + 30x10 + 25x12

In[30]:= Zmnozi[d,d]
Out[30]= SPolinom[x,24,{{49,16},{126,18},{235,20},{198,22},{121,24}}]

In[31]:= Izpisi[Zmnozi[d,d]]
Out[31]= 49x16 + 126x18 + 235x20 + 198x22 + 121x24
Osebna orodja