Linear recurrences
This commit is contained in:
parent
58aa6bef6d
commit
864df3289e
104
luku23.tex
104
luku23.tex
|
@ -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) \\
|
||||||
|
|
Loading…
Reference in New Issue