Linear recurrences

This commit is contained in:
Antti H S Laaksonen 2017-01-14 17:48:57 +02:00
parent 58aa6bef6d
commit 864df3289e
1 changed files with 50 additions and 54 deletions

View File

@ -420,35 +420,32 @@ For example,
}_{I}. }_{I}.
\] \]
\section{Lineaariset rekursioyhtälöt} \section{Linear recurrences}
\index{rekursioyhtxlz@rekursioyhtälö} \index{linear recurrence}
\index{lineaarinen rekursioyhtxlz@lineaarinen rekursioyhtälö}
\key{Lineaarinen rekursioyhtälö} A \key{linear recurrence}
voidaan esittää funktiona $f(n)$, can be represented as a function $f(n)$
jolle on annettu alkuarvot with initial values
$f(0),f(1),\ldots,f(k-1)$ $f(0),f(1),\ldots,f(k-1)$,
ja jonka suuremmat arvot whose values for $k$ and larger parameters
parametrista $k$ lähtien lasketaan are calculated recursively using a formula
rekursiivisesti kaavalla
\[f(n) = c_1 f(n-1) + c_2 f(n-2) + \ldots + c_k f (n-k),\] \[f(n) = c_1 f(n-1) + c_2 f(n-2) + \ldots + c_k f (n-k),\]
missä $c_1,c_2,\ldots,c_k$ ovat vakiokertoimia. where $c_1,c_2,\ldots,c_k$ are constant multipliers.
Funktion arvon $f(n)$ voi laskea dynaamisella We can use dynamic programming to calculate
ohjelmoinnilla ajassa $O(kn)$ any value $f(n)$ in $O(kn)$ time by calculating
laskemalla kaikki arvot $f(0),f(1),\ldots,f(n)$ järjestyksessä. all values $f(0),f(1),\ldots,f(n)$ one after another.
Tätä ratkaisua voi kuitenkin tehostaa merkittävästi However, if $k$ is small, it is possible to calculate
matriisien avulla, kun $k$ on pieni. $f(n)$ much more efficiently in $O(k^3 \log n)$
Seuraavaksi näemme, miten arvon $f(n)$ time using matrix operations.
voi laskea ajassa $O(k^3 \log n)$.
\subsubsection{Fibonaccin luvut} \subsubsection{Fibonacci numbers}
\index{Fibonaccin luku@Fibonaccin luku} \index{Fibonacci number}
Yksinkertainen esimerkki lineaarisesta rekursioyhtälöstä A simple example of a linear recurrence is the
on Fibonaccin luvut määrittelevä funktio: function that calculates Fibonacci numbers:
\[ \[
\begin{array}{lcl} \begin{array}{lcl}
f(0) & = & 0 \\ f(0) & = & 0 \\
@ -456,12 +453,13 @@ f(1) & = & 1 \\
f(n) & = & f(n-1)+f(n-2) \\ f(n) & = & f(n-1)+f(n-2) \\
\end{array} \end{array}
\] \]
Tässä tapauksessa $k=2$ ja $c_1=c_2=1$. In this case, $k=2$ and $c_1=c_2=1$.
\begin{samepage} \begin{samepage}
Ideana on esittää Fibonaccin lukujen laskukaava The idea is to represent the formula for
$2 \times 2$ -kokoisena neliömatriisina calculating Fibonacci numbers as a
$X$, jolle pätee square matrix $X$ of size $2 \times 2$
for which the following holds:
\[ X \cdot \[ X \cdot
\begin{bmatrix} \begin{bmatrix}
f(i) \\ f(i) \\
@ -471,13 +469,13 @@ $X$, jolle pätee
\begin{bmatrix} \begin{bmatrix}
f(i+1) \\ f(i+1) \\
f(i+2) \\ f(i+2) \\
\end{bmatrix}, \end{bmatrix}
\] \]
eli $X$:lle annetaan Thus, values $f(i)$ and $f(i+1)$ are given as
''syötteenä'' arvot $f(i)$ ja $f(i+1)$, ''input'' for $X$,
ja $X$ muodostaa niistä and $X$ constructs values $f(i+1)$ and $f(i+2)$
arvot $f(i+1)$ ja $f(i+2)$. from them.
Osoittautuu, että tällainen matriisi on It turns out that such a matrix is
\[ X = \[ X =
\begin{bmatrix} \begin{bmatrix}
@ -487,7 +485,7 @@ Osoittautuu, että tällainen matriisi on
\] \]
\end{samepage} \end{samepage}
\noindent \noindent
Esimerkiksi For example,
\[ \[
\begin{bmatrix} \begin{bmatrix}
0 & 1 \\ 0 & 1 \\
@ -519,8 +517,7 @@ Esimerkiksi
f(7) \\ f(7) \\
\end{bmatrix}. \end{bmatrix}.
\] \]
Tämän ansiosta arvon $f(n)$ sisältävän matriisin saa laskettua Thus, we can calculate $f(n)$ using the formula
kaavalla
\[ \[
\begin{bmatrix} \begin{bmatrix}
f(n) \\ f(n) \\
@ -543,17 +540,17 @@ X^n \cdot
1 \\ 1 \\
\end{bmatrix}. \end{bmatrix}.
\] \]
Potenssilasku $X^n$ on mahdollista laskea ajassa The power $X^n$ on can be calculated in
$O(k^3 \log n)$, $O(k^3 \log n)$ time,
joten myös funktion arvon $f(n)$ so the value $f(n)$ can also be calculated
saa laskettua ajassa $O(k^3 \log n)$. in $O(k^3 \log n)$ time.
\subsubsection{Yleinen tapaus} \subsubsection{General case}
Tarkastellaan sitten yleistä tapausta, Let's now consider a general case where
missä $f(n)$ on mikä tahansa lineaarinen $f(n)$ is any linear recurrence.
rekursioyhtälö. Nyt tavoitteena on etsiä Again, our goal is to construct a matrix $X$
matriisi $X$, jolle pätee for which
\[ X \cdot \[ X \cdot
\begin{bmatrix} \begin{bmatrix}
@ -570,7 +567,7 @@ matriisi $X$, jolle pätee
f(i+k) \\ f(i+k) \\
\end{bmatrix}. \end{bmatrix}.
\] \]
Tällainen matriisi on Such a matrix is
\[ \[
X = X =
\begin{bmatrix} \begin{bmatrix}
@ -582,17 +579,16 @@ X =
c_k & c_{k-1} & c_{k-2} & c_{k-3} & \cdots & c_1 \\ c_k & c_{k-1} & c_{k-2} & c_{k-3} & \cdots & c_1 \\
\end{bmatrix}. \end{bmatrix}.
\] \]
Matriisin $k-1$ ensimmäisen rivin jokainen alkio on 0, In the first $k-1$ rows, each element is 0
paitsi yksi alkio on 1. except that one element is 1.
Nämä rivit kopioivat These rows replace $f(i)$ with $f(i+1)$,
arvon $f(i+1)$ arvon $f(i)$ tilalle, $f(i+1)$ with $f(i+2)$, etc.
arvon $f(i+2)$ arvon $f(i+1)$ tilalle jne. The last row contains the multipliers in the recurrence,
Viimeinen rivi sisältää rekursiokaavan kertoimet, and it calculates the new value $f(i+k)$.
joiden avulla muodostuu uusi arvo $f(i+k)$.
\begin{samepage} \begin{samepage}
Nyt arvon $f(n)$ pystyy laskemaan ajassa $O(k^3 \log n)$ Now, $f(n)$ can be calculated in
kaavalla $O(k^3 \log n)$ time using the formula
\[ \[
\begin{bmatrix} \begin{bmatrix}
f(n) \\ f(n) \\