Na cvičení jsme si ukázali, jak násobit dvě dlouhá čísla $X$ a $Y$ s $n$ ciframi školním algoritmem, který funguje v $\Theta(n^2)$.
Druhý přístup, který jsme uvážili byl přístup pomocí metody Rozděl a panuj, který funguje
následovně. Rozepíšeme si čísla $X=A*10^{n/2}+B$ a $Y=C*10^{n/2}+D$ Součin $XY$ můžeme tedy rozepsat $XY=AB*10^{n}+(AC+BD)*10^{n/2}+CD$, čímž jsme problém součinu rozložili na 4 problémy poloviční velikosti
(sčítání a násobení základem soustavy umíme v lineární složitosti vzhledem k délce zápisu čísla).
Bohužel jsme si tím nepomohli a dostali jsme se ke stejné časové složitosti $\Theta(n^2)$.
Vaším úkolem je použít metodu Rozděl a panuj (najít rozložení na menší počet podproblémů) tak, abychom dostali lepší časovou složitost než $\Theta(n^2)$.
Nápověda: koukněte se na to, jak využít součinu $(A+B)*(C+D)$ ke snížení počtu násobení a tedy i menšímu počtu podproblémů. Chceme tedy zmenšit počet podproblémů a ne jejich velikost.
Při použití nápovědy narazíme na drobný problém a to ten, že součin $(A+B)*(C+D)$ může mít $n/2+1$ cifer, kvůli přenosu při sčítání. Jak se tohoto problému zbavit? Buď ukažte, že nám to při výpočtu složitosti nebude vadit
nebo si pohrajte s danou nápovědou tak, aby přenos nemohl nastat.
Úkol má tedy tři části:
- navrhněte algoritmus, který bude rychlejší než $\Theta(n^2)$,
- ukažte že je skutečně rychlejší (můžete ignorovat to, že podproblémy nejsou velikosti $n/2$ ale mohou být velikosti $n/2+1$) a
- ukažte, jak vyřešit problém většího podproblému.