15.10. Решение рекуррентных соотношений возведением матрицы в степень
Определение
Линейное рекуррентное соотношение (linear recurrence) порядка $k$:
$$f_j = a_1 f_{j-1} + a_2 f_{j-2} + \cdots + a_k f_{j-k} + b,$$с начальными значениями $f_0, \ldots, f_{k-1}$. Требуется найти $f_n$.
Простой способ — применить метод динамического программирования: вычислить все значения $f_j$ по очереди за $O(nk)$. Для более быстрого решения выпишем рекуррентное соотношение в матричном виде:
$$ \begin{pmatrix} f_j \\ f_{j-1} \\ \vdots \\ f_{j-k+1} \\ 1 \end{pmatrix} = \begin{pmatrix} a_1 & a_2 & \cdots & a_k & b \\ 1 & 0 & \cdots & 0 & 0 \\ & \ddots & & & \vdots \\ 0 & \cdots & 1 & 0 & 0 \\ 0 & 0 & \cdots & 0 & 1 \end{pmatrix} \cdot \begin{pmatrix} f_{j-1} \\ f_{j-2} \\ \vdots \\ f_{j-k} \\ 1 \end{pmatrix}. $$Тогда $f_n$ можно найти через $(n - k + 1)$-ю степень матрицы $(k+1) \times (k+1)$.
Теорема
$(n - k + 1)$-ю степень матрицы $(k+1) \times (k+1)$ можно вычислить за $O(k^3 \log n)$ с помощью быстрого возведения в степень. После этого $f_n$ находится за $O(k)$.
Пример: числа Фибоначчи
Применим этот метод к числам Фибоначчи. Поскольку рекуррентное соотношение $f_n = f_{n-1} + f_{n-2}$ не содержит свободного члена, можно обойтись без последних строки и столбца матрицы.
$$ \binom{f_n}{f_{n-1}} = \begin{pmatrix} 1 & 1 \\ 1 & 0 \end{pmatrix}^{n-1} \cdot \binom{1}{1}. $$Свойства
С учётом того, что $f_n$ имеет длину $\Theta(n)$, и при использовании алгоритма Карацубы для умножения чисел, полное время вычисления $f_n$ составляет $O(n^{\log_2 3})$. Тот же метод возведения матрицы в степень применим к любой задаче, сводящейся к произведению матриц.