Strassenův algoritmus

Z testwiki
Skočit na navigaci Skočit na vyhledávání

Strassenův algoritmus (pojmenovaný po německém matematikovi Volkeru Strassenovi) je algoritmus používaný pro násobení matic. Byl prvním asymptoticky subkubickým algoritmem pro násobení matic (kubickou složitost má klasický naivní algoritmus, tj. násobení pomocí definičního vztahu pro součin matic). Byl objeven roku 1969, ale od roku 1978 se objevila řada algoritmů s výrazně lepší asymptotickou složitostí, jeden z nich byl navržen i Strassenem. Výrazným průlomem byl Coppersmithův–Winogradův algoritmus z roku 1987, ale i ten byl již překonán. Na rozdíl od dalších algoritmů je ale Strassenův algoritmus vhodný pro praktické použití, protože je nejrychlejším algoritmem pro matice, které se v reálných výpočtech objevují (s výjimkou úplně malých matic o maximálně několika desítkách řádků, kde je rychlejší klasický naivní algoritmus).

Algoritmus

Nechť 𝑨 a 𝑩 jsou čtvercové matice nad okruhem R, a nechť 𝑪 je jejich součin, tj.

𝑪=𝑨𝑩𝑨,𝑩,𝑪R2n×2n

Pokud nejsou matice 𝑨 a 𝑩 řádu 2n, matice se patřičně zvětší a chybějící sloupce a řádky se doplní nulami.

Algoritmus využívá rozdělení matic 𝑨, 𝑩 a 𝑪 na bloky (podmatice) řádu 2n1:

𝑨=(𝑨11𝑨12𝑨21𝑨22) , 𝑩=(𝑩11𝑩12𝑩21𝑩22) , 𝑪=(𝑪11𝑪12𝑪21𝑪22)
𝑨ij,𝑩ij,𝑪ijR2n1×2n1
𝑪11=𝑨11𝑩11+𝑨12𝑩21
𝑪12=𝑨11𝑩12+𝑨12𝑩22
𝑪21=𝑨21𝑩11+𝑨22𝑩21
𝑪22=𝑨21𝑩12+𝑨22𝑩22

Prosté rozdělení součinu do bloků počet operací v okruhu R neovlivní. Pro výpočet všech čtyř bloků 𝑪ij je třeba spočítat osm maticových součinů řádu 2n1.

S pomocí nových matic

𝑴1=(𝑨11+𝑨22)(𝑩11+𝑩22)
𝑴2=(𝑨21+𝑨22)𝑩11
𝑴3=𝑨11(𝑩12𝑩22)
𝑴4=𝑨22(𝑩21𝑩11)
𝑴5=(𝑨11+𝑨12)𝑩22
𝑴6=(𝑨21𝑨11)(𝑩11+𝑩12)
𝑴7=(𝑨12𝑨22)(𝑩21+𝑩22)

lze bloky 𝑪ij vyjádřit následujícím způsobem

𝑪11=𝑴1+𝑴4𝑴5+𝑴7
𝑪12=𝑴3+𝑴5
𝑪21=𝑴2+𝑴4
𝑪22=𝑴1𝑴2+𝑴3+𝑴6

Pro výpočet všech čtyř bloků 𝑪ij (samozřejmě včetně sedmi matic 𝑴l) stačilo spočítat pouze sedm maticových součinů řádu 2n1.

Na jednotlivé maticové součiny přitom lze aplikovat stejný postup rekurentně až na úroveň matic řádu 1, tedy na jednotlivá čísla.

Praktická implementace Strassenova algoritmu používá pro matice nižších řádů standardní multiplikační postup, pro které je efektivnější. Dělicí hranice, kdy se Strassenův stává efektivnější než standardní algoritmus, záleží na konkrétní implementaci a hardware.

Numerická analýza

Standardní algoritmus podle definice maticového součinu potřebuje určit

n3=nlog28

jednotlivých součinů v okruhu R. Ignorujeme složitost součtu matic, protože sčítání je pro vyšší řády matice mnohem rychlejší než násobení (s rostoucím řádem matic tento rozdíl dále roste).

Strassenův algoritmus sníží počet součinů na

nlog27n2,807.

Nižší počet součinů je za cenu snížené numerické stability.

Historie

Volker Strassen publikoval svůj algoritmus v roce 1969.[1] Přestože je jeho algoritmus jen mírně rychlejší než standardní multiplikační algoritmus, svou publikací jako první upozornil na to, že tento standardní algoritmus se složitostí Θ(n3) není optimální. Jeho práce iniciovala další výzkum v této oblasti, který vedl k objevu Winogradova algoritmu[2] z roku 1971 (stejně jako Strassenův používá 7 součinů, ale 15 součtů namísto 18), nebo složitějšího Coppersmithova–Winogradova algoritmu publikovaného roku 1987.[3]

Odkazy

Reference

Šablona:Překlad

Literatura

Externí odkazy

Šablona:Autoritní data

Šablona:Portály