-
Notifications
You must be signed in to change notification settings - Fork 3
/
lecture1.tex
41 lines (36 loc) · 1.78 KB
/
lecture1.tex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
\chapter{Introduction}
\section{Meta-algorithms}
\subsection{Divide and conquer}
Objective: to multiply two \(n\)-bit integers, \(A\) and \(B\).
Treat \(A\) as a string contatenated of two integers, \(A_\text{L}\) and \(A_\text{R}\),
so that \(A = 2^{N/2}A_\text{L} + A_\text{R}\).
\begin{align}
AB &= \left(2^{N/2} A_\text{L} + A_\text{R}\right) + \left(2^{N/2} B_\text{L} + B_\text{R}\right) \\
&= 2^N\left(A_\text{L}B_\text{L}\right) + 2^{N/2}\left(A_\text{R}B_\text{L} + A_\text{L}B_\text{R}\right) + A_\text{R}B_\text{R}
\end{align}
\begin{algorithm}
\caption{Multiply two equally-sized integers.}
\begin{algorithmic}
\Function{Mult}{$A,B$}
\State \(P_1 \leftarrow \text{Mult}(A_\text{L}, B_\text{L})\)
\State \(P_2 \leftarrow \text{Mult}(A_\text{R}, B_\text{L})\)
\State \(P_3 \leftarrow \text{Mult}(A_\text{L}, B_\text{R})\)
\State \(P_4 \leftarrow \text{Mult}(A_\text{R}, B_\text{R})\)
\State\Return \(2^NP1 + 2^{N/2}\left(P_2 + P_3\right) + P_4\)
\EndFunction
\end{algorithmic}
\end{algorithm}
This algorithm runs in \(\Theta(N^2)\) (additions are \(\Theta(n)\) and multiplications are \(\Theta(n)\)).
Let's make it faster. Key idea: branch into 3 multiplications instead of 4.
\begin{algorithm}
\caption{Multiply two equally-sized integers efficiently.}
\begin{algorithmic}
\Function{Mult}{$A,B$}
\State \(P_1 \leftarrow \text{Mult}(A_\text{L} + A_\text{R}, B_\text{L} + B_\text{R})\)
\State \(P_2 \leftarrow \text{Mult}(A_\text{R}, B_\text{L})\)
\State \(P_3 \leftarrow \text{Mult}(A_\text{L}, B_\text{R})\)
\State\Return \(2^NP1 + 2^{N/2}\left(P_1 - P_2 - P_3\right) + P_3\)
\EndFunction
\end{algorithmic}
\end{algorithm}
If you make the recursive calls \(\Theta(1)\), \(\text{Mult}\) takes \(\Theta(N)\) per call, for a total runtime of \(\Theta(2^{\log 3}) \approx 1.6\).