10.5 Umocňování

Vedle problému třídění lze uvést další jednoduchou ilustraci na problému umocňování.

  • Vstup: reálné číslo $\alpha$ a přirozené číslo $N \in \N$.

  • Výstup: Hodnota $\alpha^N$.

  • Elementární operace: aritmetická operace (sčítání, odčítání, násobení, dělení).

Naivní implementace dle definice $\alpha^N = \underbrace{\alpha \cdot \alpha \cdots \alpha}_{N\times}$ vyžaduje přesně $N-1$ operací násobení. Řádově jde tedy o $\mathcal{O}(N)$ (resp. $\Omega(N)$ a $\Theta(N)$) algoritmus.

Všechny tyto poznámky platí třeba i pro násobení matic, nebo čísel v konečných tělesech, chápeme-li elementární operaci jako násobení příslušných objektů.

10.5.1 Square-and-multiply

Typicky ale máme k dispozici binární reprezentaci čísla $N = (N_k N_{k-1} \dots N_1 N_0)_2$, kde $N_0,\ldots,N_{k-1} \in \{0,1\}$ a $N_k = 1$, tj.

\begin{equation*} N = \sum_{j = 0}^k N_j 2^{j}. \end{equation*}

Za tohoto předpokladu pak platí

\begin{equation*} \alpha^N = \alpha^{\sum_{j = 0}^k N_j 2^{j}} = \prod_{j=0}^k \alpha^{N_j 2^{j}}. \end{equation*}

Pro výpočet $\alpha^N$ je pak tedy potřeba získat opakovaným umocňováním $\alpha^{2^k}$ – to je $k-1$ operací násobení – a násobit mezivýsledek pokud $N_j \neq 0$ – to je také nejhůře $k$ operací násobení.

Pro square-and-multiply algoritmus tak dostáváme operační složitost řádově $2k = \mathcal{O}(\log_2 N) = \mathcal{O}(\ln N)$. Skutečně, stačí si uvědomit implikaci

\begin{equation*} N \geq 2^k \ \Rightarrow \log_2 N \geq k. \end{equation*}