Naloga/Podatkovne strukture in algoritmi/Strassenovo množenje matrik/Rešitev (Mathematica)

Iz MaFiRaWiki

Ta članek ali del članka je v delu. Veseli bomo, če ga boste dopolnili in popravili.

Kaj pomeni to opozorilo?

Clear[T]
T[i_, i_, p_List] := T[i, i, p] = {0, ""}
T[i_, j_, p_List] := T[i, j, p] = Module[{t, m, k, ls, 
ds}, t = Table[T[i, k, p][[1]] + T[k + 1, 
  j, p][[1]] + p[[i]]*p[[k + 1]]*p[[j + 1]], {k, i, j - 1}];
      m = Min[t];
      k = Position[t, m][[1]][[1]];
      If[i == i + k - 1, ls = StringJoin[" [ ", ToString[i], 
            " ] "], ls = StringJoin["(", T[i, i + k - 1, p][[2]], ")"]];
      If[i + k == j, ds = StringJoin[" * [ ", ToString[j], " ] "], ds = 
      StringJoin[" * (", T[i + k, j, p][[2]], ")"]];
      Return[{m, StringJoin[ls, ds]}]]


Clear[Mnozenje1]
Mnozenje1[s_List] := Module[{i, d, k = {}},
    d = Length[s];
    k = {};
    For[i = 1, i ≤ d, i++, k = Append[k, Length[s[[i]]]]];
    k = Append[k, Length[Last[s][[1]]]];
    Return[k]
    ]

Mnozenje1[s][[i]] * Mnozenje1[s][[i+1]].";

Clear[Mnozenje2]
Mnozenje2[s_List] := T[1, Length[s], Mnozenje1[s]]


Clear[Produkt]
Produkt[s_List] := Module[{i, m = {}},
    m = s[[1]];
    For[i = 2, i ≤ Length[s], i++, m = Dot[m, s[[i]]]];
    Return[m]
    ]

Clear[Mnozenje3]
Mnozenje3[s_List] := Append[Mnozenje2[s], Produkt[s]]

Primer

Clear[T]
In[1]:= T[1, 7, {1, 10, 20, 7, 3, 4, 6, 2}]
Out[1]:= {409, ((((( [ 1 ]  * [ 2 ] ) * [ 3 ] ) * [ 4 ] ) * [ 5 ] ) * [ 6 ] ) * [ 7 ] }
Osebna orodja