Algoritmizace

Kvaternionová maticová násobička

Zadání

Kvaterniony (quaternions) a kvaternionovou algebru vymyslel v roce 1843 známý irský matematik sir William Rowan Hamilton, který původně hledal rozšíření komplexních čísel z 2D plochy do 3D prostoru. Takové rozšíření však není možné vytvořit, nejbližší ekvivalent komplexních čísel jsou až čtyřrozměrné struktury. Hamilton provedl revoluční krok v tom, že jím vymyšlené kvaterniony nesplňovaly vlastnost do té doby považovanou za samozřejmost — komutativitu. Později se objevily i další užitečné struktury, které komutativitu nesplňují, například matice.

Kvaterniony jsou obdobou komplexních čísel, ovšem s tím rozdílem, že mají čtyři na sebe kolmé jednotky, které označujeme symboly 1, i, j a k. Každý kvaternion lze popsat lineární kombinací všech čtyř jednotek: q=x+yi+zj+wk. Pro vzájemné násobení těchto jednotek platí následující vztahy:

1×1 = 1,
1×i = i,
1×j = j,
1×k = k,
i×1 = i,
j×1 = j,
k×1 = k,
i×j = k,
j×i = −k,
j×k = i,
k×j = −i,
k×i = j,
i×k = −j,
i×i=j×j=k×k = −1,
i×j×k = −1.

Všimněte si, že při násobení není obecně zachována komutativita operací, tj. například výsledek operace jk se nerovná výsledku operace kj. To znamená, že kvaterniony netvoří algebraickou strukturu — komutativní těleso a při násobení dvou kvaternionů si musíme dát pozor na pořadí operací (ostatně podobně jako při násobení matic). Násobení jedničkou (skalární složkou, 1) zachovává hodnotu druhého prvku, podobně jako je tomu u reálných i komplexních čísel.

Vaším úkolem je vytvořit program, který co nejrychleji vynásobí posloupnost různě velikých kvaternionových matic. Násobení kvaternionových matic je analogické běžnému násobení matic. Uvědomte si však, že násobení matic je asociativní. To znamená, že A×B×C = (A×B)×C = A×(B×C), kde A,B,C jsou matice. Výpočetní složitost násobení posloupnosti matic se tedy může lišit v závislosti na rozměrech jednotlivých matic a jejich uzávorkování.

Vstup

Ve vstupním souboru je na prvním řádku uveden počet matic, které chceme vynásobit. Další řádky obsahují vždy specifikaci kvaternionové matice. První řádek obsahuje počet řádků matice a na druhém řádku je počet sloupců matice. Další řádky obsahují vlastní matici tak, že jeden řádek vstupu je jeden řádek matice. Čísla na řádcích jsou oddělena mezerami. Čtveřice čísel představuje vždy jeden kvaternion. Každá složka kvaternionu je vždy celé číslo v rozsahu −2 147 483 648 až 2 147 483 647. Jednotlivé matice jsou zadány korektně (tj. matice jsou mezi sebou rozměrově kompatibilní tak, aby se daly vzájemně násobit). Navíc můžete předpokládat, že při násobení matic nedojde nikdy k přetečení.

Výstup

První řádek obsahuje počet řádků výsledné matice a na druhém řádku je počet sloupců výsledné matice. Další řádky obsahují vlastní matici tak, že jeden řádek vstupu je jeden řádek matice. Čísla na řádcích jsou oddělena mezerami. Čtveřice čísel představuje vždy jeden kvaternion. Výsledná matice odpovídá matici, která by vznikla postupným násobením matic na vstupu.

Příklady

Příklad 1

Vstup
2
2
3
9 9 -7 3 -9 0 -9 -1 -2 0 2 7
-3 1 -1 2 -2 -6 8 1 0 0 -4 -4
3
2
3 -4 -8 -7 -3 6 4 -6
-4 5 8 -4 8 4 7 -4
-5 -1 -3 -7 -5 5 -10 -8
Výstup
2
2
197 72 -94 -88 38 108 35 50
-61 28 -23 -53 -97 -126 39 4

Příklad 2

Vstup
5
4
4
-6 -4 -7 2 -4 4 -9 1 0 1 -4 6 -5 4 -7 -2
-1 3 0 5 -4 9 5 1 -7 4 -8 -7 6 -5 -5 8
-5 0 1 -3 -4 -3 4 5 -3 9 -4 0 2 1 6 -10
8 4 -8 8 -2 -10 -1 -4 7 -1 -6 -8 4 7 -8 9
4
4
-4 0 -5 9 -9 8 1 4 -4 -3 7 -1 4 4 6 7
-1 -1 7 5 0 -3 -10 1 2 -8 8 0 -3 -5 -4 1
7 -2 4 6 0 -5 -1 -10 6 8 1 -5 3 -6 -5 -8
1 -9 -8 0 -7 0 3 6 0 1 7 9 4 -7 -8 -1
4
2
-2 7 -9 1 5 -3 -2 9
-10 -10 2 7 -5 5 -7 -8
5 -1 0 2 9 8 5 2
6 7 -1 -10 6 -7 2 6
2
3
9 -6 6 8 -6 -2 -3 2 9 -9 1 -4
-8 -10 -2 -6 6 -5 -10 7 2 -6 1 -3
3
4
-9 1 -10 -2 9 -10 -7 -5 3 -7 -9 9 9 -6 -2 7
-1 9 -2 2 -1 -6 -10 0 -10 -6 -9 -10 1 5 -6 -7
3 6 -5 5 6 1 -9 -8 9 8 -1 -4 -7 -4 -5 5
Výstup
4
4
188765 708846 189091 2072703 -2361335 -719201 -887513 394607 -1440125 -231730 988517 64311 -1379173 -609789 675614 -406502
681997 -640454 2892744 -534423 -1862191 4354353 792233 1815647 -1104177 1679708 -303852 235943 -1539063 354467 -318105 -1842533
-1103144 -313687 -238575 225746 -764875 -442232 -193415 -629730 -215531 -1712355 -229113 319109 389506 -1366005 738725 -1103048
626056 -104476 1661163 1069075 -2966309 1543122 -614005 -220576 -1433737 1543696 -914649 -1130986 -238887 -512032 -676802 -348559