http://lem12.uksw.edu.pl/index.php?title=Algorytm_Winograda&feed=atom&action=history
Algorytm Winograda - Historia wersji
2024-03-28T08:46:25Z
Historia wersji tej strony wiki
MediaWiki 1.23.8
http://lem12.uksw.edu.pl/index.php?title=Algorytm_Winograda&diff=195&oldid=prev
AndrzejSalwicki o 14:50, 13 lut 2013
2013-02-13T14:50:21Z
<p></p>
<a href="http://lem12.uksw.edu.pl/index.php?title=Algorytm_Winograda&diff=195&oldid=170">Podgląd zmian</a>
AndrzejSalwicki
http://lem12.uksw.edu.pl/index.php?title=Algorytm_Winograda&diff=170&oldid=prev
AndrzejSalwicki: Utworzył nową stronę „(* Algorytm Winograda mnozenia macierzy o rozmiarze n x n *) '''program''' Winograd; '''signal''' Niezgoda; '''unit''' Winograd: '''procedure'''(A,B: '''arrayof a...”
2013-02-12T14:06:10Z
<p>Utworzył nową stronę „(* Algorytm Winograda mnozenia macierzy o rozmiarze n x n *) '''program''' Winograd; '''signal''' Niezgoda; '''unit''' Winograd: '''procedure'''(A,B: '''arrayof a...”</p>
<p><b>Nowa strona</b></p><div>(* Algorytm Winograda mnozenia macierzy o rozmiarze n x n *)<br />
<br />
'''program''' Winograd;<br />
<br />
'''signal''' Niezgoda;<br />
<br />
'''unit''' Winograd: '''procedure'''(A,B: '''arrayof arrayof''' real;<br />
'''output''' C: '''arrayof arrayof''' real);<br />
<br />
: '''var''' i,j,k,n,m: integer,<br />
: W,V: '''arrayof''' real,<br />
: p: boolean,<br />
: s: real;<br />
<br />
'''begin'''<br />
(* ustalic czy macierze moga byc mnozone tzn. czy ilosc wierszy w A = ilosc kolumn w B? *)<br />
(* ustalic czy n jest parzyste? *) <br />
(* obliczyc "preprocessing" *)<br />
<br />
:i := upper(A);<br />
:j := lower(A);<br />
:k := i-j;<br />
:i:= upper(B);<br />
:j:= lower(B);<br />
:if i-j <> k then raise Niezgoda fi;<br />
<br />
:(* mozna mnozyc *)<br />
<br />
:n := k+1;<br />
:p := (n mod 2) = 0;<br />
:m := n div 2;<br />
:'''array''' W '''dim''' (1:n);<br />
:'''array''' V '''dim''' (1:n);<br />
:'''array''' C '''dim''' (1:n);<br />
:'''for''' i := 1 '''to''' n<br />
:'''do'''<br />
:: '''array''' C(i) '''dim''' (1:n)<br />
:'''od'''; <br />
(* obliczanie "preprocessingu" *)<br />
for j:= 1 to n<br />
do<br />
s:=0;<br />
for i := 1 to m <br />
do<br />
s := A(j,2*i-1) * A(j,2*i) +s;<br />
od;<br />
W(j) := s;<br />
od;<br />
for j:= 1 to n<br />
do<br />
s:=0;<br />
for i := 1 to m <br />
do<br />
s := B(2*i-1,j) * B(2*i,j) +s;<br />
od;<br />
V(j) := s;<br />
od;<br />
<br />
(* obliczanie iloczynu macierzy *)<br />
for i := 1 to n<br />
do<br />
for j := 1 to n<br />
do<br />
s:= 0;<br />
for k:= 1 to m<br />
do<br />
s:= (A(i,2*k-1)+B(2*k,j)) * (B(2*k-1,j)+A(i,2*k)) +s;<br />
od;<br />
C(i,j) :=s-W(i)-V(j);<br />
if not p<br />
then <br />
C(i,j) := C(i,j) + A(i,n)*B(n,j);<br />
fi;<br />
od;<br />
od; <br />
end Winograd;<br />
<br />
var M1,K1,J1,J2 : arrayof arrayof real,<br />
i,j,n,t,k : integer,<br />
s: real;<br />
<br />
<br />
(* ------------------------------------------------------------------------- *)<br />
begin (*programu *)<br />
write("podaj wartosc n=");<br />
readln(n);writeln(n);<br />
array M1 dim (1:n);<br />
array K1 dim (1:n);<br />
array J1 dim (1:n);<br />
array J2 dim (1:n);<br />
for i := 1 to n do<br />
array M1(i) dim (1:n);<br />
array K1(i) dim (1:n);<br />
array J1(i) dim (1:n);<br />
array J2(i) dim (1:n);<br />
od; <br />
for i := 1 to n do<br />
for j := 1 to n do<br />
if i=j then M1(i,j):= 1 else M1(i,j):=0 fi;<br />
K1(i,j):= (i-1)*n+j;<br />
od;<br />
od;<br />
<br />
t:=time;<br />
call Winograd(M1,K1,J1);<br />
t:=time - t;<br />
writeln("czas Win=",t:6);<br />
<br />
t:=time;<br />
for i:=1 to n do<br />
for j:=1 to n do<br />
s:=0;<br />
for k:=1 to n do<br />
s := s + M1(i,k)*K1(k,j);<br />
od;<br />
J2(i,j):=s;<br />
od;<br />
od;<br />
t:=time-t;<br />
writeln("czas norm=",t:6);<br />
<br />
<br />
for i := 1 to n do<br />
writeln;<br />
for j := 1 to n do<br />
write(J1(i,j):5:0);<br />
od;<br />
od;<br />
<br />
<br />
<br />
end program;�</div>
AndrzejSalwicki