<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Bobru</id>
	<title>Алговики - Вклад [ru]</title>
	<link rel="self" type="application/atom+xml" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Bobru"/>
	<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/ru/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Bobru"/>
	<updated>2026-10-23T01:46:03Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%97%D0%B5%D0%BC%D0%BB%D1%8F%D0%BD%D1%81%D0%BA%D0%B8%D0%B9/Zavolskov/Zemlyanskiy&amp;diff=15670</id>
		<title>Участник:Роман Землянский/Zavolskov/Zemlyanskiy</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%97%D0%B5%D0%BC%D0%BB%D1%8F%D0%BD%D1%81%D0%BA%D0%B8%D0%B9/Zavolskov/Zemlyanskiy&amp;diff=15670"/>
		<updated>2016-11-01T20:53:35Z</updated>

		<summary type="html">&lt;p&gt;Bobru: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&#039;&#039;&#039;Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Авторы статьи: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Завольсков Владислав&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
[[#Вычислительное ядро алгоритма]]&lt;br /&gt;
&lt;br /&gt;
[[#Макроструктура алгоритма]]&lt;br /&gt;
&lt;br /&gt;
[[#Схема реализации последовательного алгоритма]]&lt;br /&gt;
&lt;br /&gt;
[[#Информационный граф]]&lt;br /&gt;
&lt;br /&gt;
[[#Существующие реализации алгоритма]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Землянский Роман&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[#Общее описание алгоритма]]&lt;br /&gt;
&lt;br /&gt;
[[#Математическое описание алгоритма]]&lt;br /&gt;
&lt;br /&gt;
[[#Последовательная сложность алгоритма]]&lt;br /&gt;
&lt;br /&gt;
[[#Ресурс параллелизма алгоритма]]&lt;br /&gt;
&lt;br /&gt;
[[#Входные и выходные данные алгоритма]]&lt;br /&gt;
&lt;br /&gt;
[[#Свойства алгоритма]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
614 группа&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Метод разделяй и властвуй вычисления собственных значений и векторов трёхдиагональной матрицы&#039;&#039;&#039; - это наиболее быстрый из существующих методов, если нужны все собственные значения и собственные векторы трехдиагональной матрицы, начиная с порядка n, примерно равного 26. (Точное значение этого порогового порядка зависит от компьютера.) Его численно устойчивая реализация весьма не тривиальна. В самом деле, хотя впервые метод был предложен еще в 1981 г., &amp;quot;правильный&amp;quot; способ его реализации был найден лишь в 1992 г. Этот способ воплощен LAPACK-программами ssyevd (для плотных матриц) и sstevd (для трехдиагональных матриц). В них стратегия &amp;quot;разделяй-и-влавствуй&amp;quot; используется для матриц порядка, большего чем 25. Для матриц меньшего порядка (или если нужны только собственные значения) происходит автоматический переход к QR-итерации.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть &lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
L = \begin{bmatrix}&lt;br /&gt;
 a_{1} &amp;amp; b_{1}&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 b_{1} &amp;amp; \ddots  &amp;amp; \ddots \\&lt;br /&gt;
   &amp;amp; \ddots &amp;amp; a_{m-1} &amp;amp; b_{m-1} \\&lt;br /&gt;
 &amp;amp;&amp;amp; b_{m-1} &amp;amp; a_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp; b_{m} &amp;amp; a_{m+1} &amp;amp; b_{m+1} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp; b_{m+1} &amp;amp; \ddots \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \ddots &amp;amp; b_{n-1} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; b_{n-1} &amp;amp; a_{n} \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
= \begin{bmatrix}&lt;br /&gt;
  a_{1} &amp;amp; b_{1} &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 b_{1} &amp;amp; \ddots  &amp;amp; \ddots \\&lt;br /&gt;
   &amp;amp; \ddots &amp;amp; a_{m-1} &amp;amp; b_{m-1} \\&lt;br /&gt;
 &amp;amp;&amp;amp; b_{m-1} &amp;amp; a_{m} - b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp; a_{m+1} - b_{m} &amp;amp; b_{m+1} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp; b_{m+1} &amp;amp; \ddots \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \ddots &amp;amp; b_{n-1} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; b_{n-1} &amp;amp; a_{n} \\&lt;br /&gt;
\end{bmatrix} +&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
+ \begin{bmatrix}&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&lt;br /&gt;
= \begin{bmatrix} T_{1} &amp;amp; 0 \\ 0 &amp;amp; T_{2}\end{bmatrix} + b_{m} * \begin{bmatrix} 0 \\ \vdots \\ 0 \\ 1 \\ 1 \\ 0 \\ \vdots \\ 0 \end{bmatrix} \begin{bmatrix} 0 , \ldots  ,  0 , 1 , 1 , 0 \ldots , 0 \end{bmatrix} &lt;br /&gt;
&lt;br /&gt;
\equiv \begin{bmatrix} T_{1} &amp;amp; 0 \\ 0 &amp;amp; T_{2}\end{bmatrix} + b_{m}vv^{T}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Предположим, что нам известны спектральные разложения матриц &amp;lt;math&amp;gt;T_{1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; T_{2} &amp;lt;/math&amp;gt;: &lt;br /&gt;
&amp;lt;math&amp;gt; T_{i} = Q_{i} \Lambda_{i} Q_{i}^{T} &amp;lt;/math&amp;gt;. В действительности, они будут рекурсивно вычисляться тем же самым алгоритмом. Установим связь между собственными значениями матрицы Т и собственными значениями матриц&lt;br /&gt;
&amp;lt;math&amp;gt;T_{1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{2}&amp;lt;/math&amp;gt;. Имеем:&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;math&amp;gt; &lt;br /&gt;
T = \begin{bmatrix} T_{1} &amp;amp; 0 \\ 0 &amp;amp; T_{2}\end{bmatrix} + b_{m}vv^{T} &lt;br /&gt;
= \begin{bmatrix} Q_{1} \Lambda_{1} Q_{1}^{T} &amp;amp; 0 \\ 0 &amp;amp; Q_{2} L_{2} Q_{2}^{T}\end{bmatrix} + b_{m}vv^{T} &lt;br /&gt;
= \begin{bmatrix} Q_{1} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}\end{bmatrix}(\begin{bmatrix} \Lambda_{1} &amp;amp; \\  &amp;amp; \Lambda_{2}\end{bmatrix} + b_{m}vv^{T})\begin{bmatrix} Q_{1}^{T} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}^{T}\end{bmatrix}&lt;br /&gt;
  &amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &lt;br /&gt;
&lt;br /&gt;
  &amp;lt;math&amp;gt;&lt;br /&gt;
u = \begin{bmatrix} Q_{1}^{T} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}^{T}\end{bmatrix}v&lt;br /&gt;
  &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
так как &amp;lt;math&amp;gt;v = \begin{bmatrix} 0 , \ldots  ,  0 , 1 , 1 , 0 \ldots , 0 \end{bmatrix}^T&amp;lt;/math&amp;gt;, получим матрицу, состоящую из последнего столбца матрицы &amp;lt;math&amp;gt; Q_{1}^{T}&amp;lt;/math&amp;gt; и первого столбца матрицы &amp;lt;math&amp;gt; Q_{2}^{T}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Следовательно, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; имеет те же собственные значения, что и пдобная ей матрица &amp;lt;math&amp;gt;D + \rho uu^{T}&amp;lt;/math&amp;gt;, &lt;br /&gt;
где &amp;lt;math&amp;gt;D = \begin{bmatrix} L_{1} &amp;amp; 0 \\ 0 &amp;amp; L_{2}\end{bmatrix}&amp;lt;/math&amp;gt; - диагональная матрица, &lt;br /&gt;
&amp;lt;math&amp;gt;\rho = b_{m}&amp;lt;/math&amp;gt; - число, а &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; - вектор. &lt;br /&gt;
&lt;br /&gt;
Будем предполагать, не ограничивая общности, что диагональные элементы &amp;lt;math&amp;gt;d_{1}, \ldots, d_{n}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; упорядочены по убыванию: &amp;lt;math&amp;gt;d_{n} &amp;lt;= \ldots &amp;lt;=d_{1}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Чтобы найти собственные значения матрицы &amp;lt;math&amp;gt;D + \rho uu^{T}&amp;lt;/math&amp;gt;, вычислим её характеристический многочлен, считая пока матрицу &amp;lt;math&amp;gt;D - \lambda I&amp;lt;/math&amp;gt; невырожденной.&lt;br /&gt;
Тогда&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;math&amp;gt;det(D + \rho uu^{T} - \lambda I) = det((D - \lambda I)(I + \rho (D- \lambda I)^{-1} uu^{T}))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Поскольку &amp;lt;math&amp;gt;D - \lambda I&amp;lt;/math&amp;gt; невырожденна, &amp;lt;math&amp;gt;det(I + \rho (D - \lambda I)^{-1}uu^{T}) = 0&amp;lt;/math&amp;gt; тогда и только тогда, когда &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; - собственное значение. Заметим, что матрица &amp;lt;math&amp;gt;I + \rho (D - \lambda I)^{-1}uu^{T}&amp;lt;/math&amp;gt; получается из единичной добавлением матрицы ранга 1. Определитель такой матрицы легко вычислить.&lt;br /&gt;
&lt;br /&gt;
  &#039;&#039;&#039;Лемма 1.&#039;&#039;&#039; Справедливо равенство &amp;lt;math&amp;gt;det(I + xy^{T}) = 1 + y^{T}x&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; - векторы.&lt;br /&gt;
&lt;br /&gt;
Таким образом,&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;math&amp;gt;det(I + \rho (D - \lambda I)^{-1}uu^{T}) = 1 + \rho u^{T}(D - \lambda I)^{-1}u&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt; = 1 + \rho \sum_{i=1, n} \frac{u_{i}^{2}} {d_{i}-\lambda} \equiv f(\lambda)&amp;lt;/math&amp;gt; , &lt;br /&gt;
&lt;br /&gt;
т.е. собственные значения матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; есть корни так называемого векового уравнения &amp;lt;math&amp;gt;f(\lambda) = 0&amp;lt;/math&amp;gt;. Если все числа &amp;lt;math&amp;gt;d_{i}&amp;lt;/math&amp;gt; различны и все &amp;lt;math&amp;gt;u_{i} &amp;lt;&amp;gt; 0&amp;lt;/math&amp;gt; (случай общего положения), то &amp;lt;math&amp;gt;f(\lambda)&amp;lt;/math&amp;gt; имеет график типа показанного на рис.1(где &amp;lt;math&amp;gt;n = 4&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\rho &amp;gt; 0&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
[[File:Graphics.PNG|thumb|center|800px|Рис. 1. График функции &amp;lt;math&amp;gt; f(\lambda) = 1 + \frac{0.5}{1 - \lambda} + \frac{0.5}{2 - \lambda} + \frac{0.5}{3 - \lambda} + \frac{0.5}{4 - \lambda}&amp;lt;/math&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Можно видеть, что прямая &amp;lt;math&amp;gt;y = 1&amp;lt;/math&amp;gt; является горизонтальной асимптотой для этого графика, а прямые &amp;lt;math&amp;gt;\lambda = d_{i}&amp;lt;/math&amp;gt; есть вертикальные асимптоты. Поскольку &amp;lt;math&amp;gt;f^{&#039;}(\lambda) =  \rho \sum_{i=1, n} \frac{u_{i}^{2}} {(d_{i}-\lambda)^{2}}&amp;gt; 0 &amp;lt;/math&amp;gt;, функция возрастает всюду, кроме точек &amp;lt;math&amp;gt;\lambda = d_{i}&amp;lt;/math&amp;gt;. Поэтому корни функции разделяются числами &amp;lt;math&amp;gt;d_{i}&amp;lt;/math&amp;gt; и ещё один корень находится справа от точки &amp;lt;math&amp;gt;d_{1}&amp;lt;/math&amp;gt; (на рис. 1 &amp;lt;math&amp;gt;d_{1} = 4&amp;lt;/math&amp;gt;). (При &amp;lt;math&amp;gt;\rho&amp;lt;0&amp;lt;/math&amp;gt; функция &amp;lt;math&amp;gt;f(\lambda)&amp;lt;/math&amp;gt; всюду убывает и соответствующий корень находится слева от точки &amp;lt;math&amp;gt;d_{n}&amp;lt;/math&amp;gt;). Для функции &amp;lt;math&amp;gt;f(\lambda)&amp;lt;/math&amp;gt;, монотонной и гладкой на каждом из интервалов &amp;lt;math&amp;gt;(d_{i+1},d_{i})&amp;lt;/math&amp;gt;, можно найти вариант метода Ньютона, который быстро и монотонно сходится к каждому из корней, если начальная точка взята в &amp;lt;math&amp;gt;(d_{i+1},d_{i})&amp;lt;/math&amp;gt;. Нам достаточно знать, что на практике метод сходится к каждому собственному значению за ограниченное число шагов. Поскольку вычисление &amp;lt;math&amp;gt;f(\lambda)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;f^{&#039;}(\lambda)&amp;lt;/math&amp;gt; стоит &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; флопов, для вычисления одного собственного значения достаточно &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, а для вычисления всех &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; собственных значений матрицы &amp;lt;math&amp;gt;D + \rho uu^{T}&amp;lt;/math&amp;gt; требуется &amp;lt;math&amp;gt;O(n^{2})&amp;lt;/math&amp;gt; флопов.&lt;br /&gt;
Для собственных векторов матрицы &amp;lt;math&amp;gt;D + \rho uu^{T}&amp;lt;/math&amp;gt; мы легко можем получить явные выражения.&lt;br /&gt;
&lt;br /&gt;
  &#039;&#039;&#039;Лемма 2.&#039;&#039;&#039; Если &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; - собственное значение матрицы &amp;lt;math&amp;gt;D + \rho uu^{T}&amp;lt;/math&amp;gt;, то соответствующий вектор равен &amp;lt;math&amp;gt;(D - \alpha I)^{-1}u&amp;lt;/math&amp;gt;. Поскольку матрица &amp;lt;math&amp;gt;D - \alpha I&amp;lt;/math&amp;gt; диагональная, для вычисления такого вектора достаточно &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; флопов.&lt;br /&gt;
&lt;br /&gt;
Доказательство.&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;math&amp;gt;(D + \rho uu^{T})[(D - \alpha I)^{-1}u] = (D - \alpha I + \alpha I + \rho uu^{T})(D - \alpha I)^{-1}u&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;math&amp;gt;=u + \alpha (D - \alpha I)^{-1}u + u[\rho u^{T}(D - \alpha I)^{-1}u] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;math&amp;gt;=u + \alpha(D - \alpha I)^{-1}u - u&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
                                                       поскольку &amp;lt;math&amp;gt; \rho u^{T}(D - \alpha I)^{-1}u + 1 = f(\alpha) = 0 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;math&amp;gt;=\alpha [(D - \alpha I)^{-1}u]&amp;lt;/math&amp;gt;, что и требовалось.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для вычисления по этой простой формуле всех &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; собственных векторов требуется &amp;lt;math&amp;gt;O(n^{2})&amp;lt;/math&amp;gt; флопов. К сожалению, формула не обеспечивает численной устойчивости, так как для двух очень близких значений &amp;lt;math&amp;gt;\alpha_{i}&amp;lt;/math&amp;gt; может давать неортогональные приближенные собственные векторы &amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt;. Потребовалось целое десятилетие для того, чтобы найти устойчивую альтернативу исходному описанию алгоритма. Снова детали будут обсуждаться позднее в данном разделе. &lt;br /&gt;
&lt;br /&gt;
Алгоритм является рекурсивным.&lt;br /&gt;
&lt;br /&gt;
=== Дефляция ===&lt;br /&gt;
&lt;br /&gt;
До сих пор полагалось, что все &amp;lt;math&amp;gt;d_{i}&amp;lt;/math&amp;gt; различны и все &amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; отличны от нуля. Если это не так, вековое уравнение &amp;lt;math&amp;gt;f(\lambda)=0&amp;lt;/math&amp;gt; имеет &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; вертикальных асимптот, где &amp;lt;math&amp;gt;k&amp;lt;n&amp;lt;/math&amp;gt;, а потому &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; корней. Однако оказывается, что остальные &amp;lt;math&amp;gt;n - k&amp;lt;/math&amp;gt; собственных значений могут быть определены без каких-либо усилий: если &amp;lt;math&amp;gt;d_{i}=d_{i+1}&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;u_{i}=0&amp;lt;/math&amp;gt;, то легко показать, что &amp;lt;math&amp;gt;d_{i}&amp;lt;/math&amp;gt; является собственным значением и для матрицы &amp;lt;math&amp;gt;D + \rho uu^{T}&amp;lt;/math&amp;gt;. В такой ситуации мы говорим о &#039;&#039;дефляции&#039;&#039;. На практике выбирается некоторое пороговое значение и дефляция для числа &amp;lt;math&amp;gt;d_{i}&amp;lt;/math&amp;gt; регистрируется, если в смысле этого порога &amp;lt;math&amp;gt;d_{i}&amp;lt;/math&amp;gt; достаточно близко к &amp;lt;math&amp;gt;d_{i+1}&amp;lt;/math&amp;gt; либо &amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; достаточно мало.&lt;br /&gt;
&lt;br /&gt;
Основной выигрыш от использования дефляции состоит не в том, что убыстряется решение векового уравнения - этот этап в любом случае стоит лишь &amp;lt;math&amp;gt;O(n^{2})&amp;lt;/math&amp;gt; операций. Выигрыш заключается в ускорении матричного умножения на последнем шаге алгоритма. Действительно, если &amp;lt;math&amp;gt;u_{i}=0&amp;lt;/math&amp;gt;, то соответствующий собственный вектор есть i-й столбец &amp;lt;math&amp;gt;e_{i}&amp;lt;/math&amp;gt; единичной матрицы. Это означает, что &amp;lt;math&amp;gt;e_{i}&amp;lt;/math&amp;gt; является i-м столбцом в матрице &amp;lt;math&amp;gt;Q_{&#039;}&amp;lt;/math&amp;gt;, поэтому при формировании матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; посредством левого умножения &amp;lt;math&amp;gt;Q_{1}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;Q_{2}&amp;lt;/math&amp;gt; вычисление i-го столбца не требует никаких затрат. Аналогичное упрощение имеет место в случае &amp;lt;math&amp;gt;d_{i} = d_{i+1}&amp;lt;/math&amp;gt;. При дефляции многих собственных значений устраняется большая часть работы, связанной с матричным умножением.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Вычислительным ядром последовательной схемы решения является вычисление матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; собственных векторов путём умножения матрицы &amp;lt;math&amp;gt;Q = \begin{bmatrix} Q_{1} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}\end{bmatrix}&amp;lt;/math&amp;gt; на матрицу &amp;lt;math&amp;gt;Q^{&#039;}&amp;lt;/math&amp;gt; Данная операция имеет сложность &amp;lt;math&amp;gt;cn^{3}&amp;lt;/math&amp;gt; о чём и говорится в разделе [[#Последовательная сложность алгоритма]] .&lt;br /&gt;
Ей предшествует вычисление собственных значений и векторов матрицы &amp;lt;math&amp;gt; D + \rho uu^{T}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
В разделе [[#Информационный граф]] описана структура алгоритма, в которой есть блок умножения матриц для вычисления собственных векторов, являющийся вычислительным ядром алгоритма. В соответствующем разделе ([[#Вычислительное ядро алгоритма]]) мы упоминали о том, что данному блоку предшествует вычисление собственных значений, которое производится [https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%9D%D1%8C%D1%8E%D1%82%D0%BE%D0%BD%D0%B0 методом Ньютона].&lt;br /&gt;
&lt;br /&gt;
=== Решение векового уравнения ===&lt;br /&gt;
Подробно стоит поговорить о решении векового уравнения, которое является одной из основных частей алгоритма.&lt;br /&gt;
&lt;br /&gt;
Предположим, что некоторое &amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt;, хотя и мало, все же недостаточно мало для того, чтобы была зарегистрирована дефляция. В этом случае применение метода Ньютона к решению векового уравнения встречается с затруднениями. Вспомним, что пересчет приближённого решения &amp;lt;math&amp;gt;u_{j}&amp;lt;/math&amp;gt; уравнения &amp;lt;math&amp;gt;f(\lambda) = 0&amp;lt;/math&amp;gt; в методе Ньютона основан на следующих положениях:&lt;br /&gt;
&lt;br /&gt;
 1. Вблизи точки &amp;lt;math&amp;gt;\lambda = \lambda_{j}&amp;lt;/math&amp;gt; функция &amp;lt;math&amp;gt;f(\lambda)&amp;lt;/math&amp;gt; аппроксимируется линейной функцией &amp;lt;math&amp;gt;l(\lambda)&amp;lt;/math&amp;gt;; график есть прямая линия, касающаяся графика функции &amp;lt;math&amp;gt;f(\lambda)&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;\lambda = \lambda_{j}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 2. В качестве &amp;lt;math&amp;gt;\lambda_{j+1}&amp;lt;/math&amp;gt; берётся нуль этого линейного приближения, т.е. &amp;lt;math&amp;gt;l(\lambda_{j+1})=0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Функция, показанная на рис.1, не доставляет видимых трудностей методу Ньютона, поскольку вблизи каждого своего нуля &amp;lt;math&amp;gt;f(\lambda)&amp;lt;/math&amp;gt; достаточно хорошо аппроксимируется линейными функциями. Однако рассмотрим график функции на рис. 2. Она получена из функции на рис. 1 заменой значения .5 для &amp;lt;math&amp;gt;u_{i}^{2}&amp;lt;/math&amp;gt; на .001. Это новое значение недостаточно мало для того, чтобы вызвать дефляцию. График функции в левой части рис.2 визуально не отличим от её вертикальных и горизонтальных асимптот, поэтому в правой части укрупненно воспроизведён фрагмент графика, прилегающий к вертикальной асимптоте &amp;lt;math&amp;gt;\lambda = 2&amp;lt;/math&amp;gt;. Видно, что график слишком быстро &amp;quot;выполняет поворот&amp;quot; и для большей части значений &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; почти горизонтален. Поэтому, применяя метод Ньютона почти к любому начальному приближению &amp;lt;math&amp;gt;\lambda_{0}&amp;lt;/math&amp;gt;, мы получаем линейное приближение &amp;lt;math&amp;gt;l(\lambda)&amp;lt;/math&amp;gt; с почти горизонтальным графиком и малым положительным угловым коэффициентом. В результате &amp;lt;math&amp;gt;\lambda_{1}&amp;lt;/math&amp;gt; является отрицательным числом, огромным по абсолютной величине, которое совершенно бесполезно в качестве приближения к истинному корню.&lt;br /&gt;
&lt;br /&gt;
[[File:GraphNewton.png|thumb|center|800px|Рис. 2. График функции &amp;lt;math&amp;gt; f(\lambda) = 1 + \frac{10^{-3}}{1 - \lambda} + \frac{10^{-3}}{2 - \lambda} + \frac{10^{-3}}{3 - \lambda} + \frac{10^{-3}}{4 - \lambda}&amp;lt;/math&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Чтобы найти выход из этого положения, можно модифицировать метод Ньютона следующим образом: раз &amp;lt;math&amp;gt;f(\lambda)&amp;lt;/math&amp;gt; нельзя хорошо приблизить линейной функцией &amp;lt;math&amp;gt;l(\lambda)&amp;lt;/math&amp;gt;, попробуем взять в качестве приближения какую-нибудь другую простую функцию &amp;lt;math&amp;gt;h(\lambda)&amp;lt;/math&amp;gt;. Нет ничего особого именно в прямых линиях: для метода Ньютона вместо &amp;lt;math&amp;gt;l(\lambda)&amp;lt;/math&amp;gt; можно взять любое приближение &amp;lt;math&amp;gt;h(\lambda)&amp;lt;/math&amp;gt;, значения и нули которого легко вычисляются. Функция &amp;lt;math&amp;gt;f(\lambda)&amp;lt;/math&amp;gt; имеет полюсы в точках &amp;lt;math&amp;gt;d_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;d_{i+1}&amp;lt;/math&amp;gt;, которые определяют её поведение в соответствующих окрестностях. Поэтому при поиске корня в интервале &amp;lt;math&amp;gt;(d_{i+1}, d_{i})&amp;lt;/math&amp;gt; естественно выбрать функцию &amp;lt;math&amp;gt;h(\lambda)&amp;lt;/math&amp;gt;, также имеющую эти полюсы, т.е. функцию вида&lt;br /&gt;
 &amp;lt;math&amp;gt;h(\lambda)= \frac{c_{1}}{d_{i}-\lambda} + \frac{c_{2}}{d_{i+1}-\lambda} + c_{3}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Константы &amp;lt;math&amp;gt;c_{1},c_{2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c_{3}&amp;lt;/math&amp;gt; обеспечивающие, что &amp;lt;math&amp;gt;h(\lambda)&amp;lt;/math&amp;gt; есть приближение к &amp;lt;math&amp;gt;f(\lambda)&amp;lt;/math&amp;gt;, можно выбрать несколькими способами. Отметим, что если &amp;lt;math&amp;gt;c_{1},c_{2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c_{3}&amp;lt;/math&amp;gt; уже известны, то уравнение &amp;lt;math&amp;gt;h(\lambda)=0&amp;lt;/math&amp;gt; легко решается относительно &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;, поскольку сводится к эквивалентному квадратному уравнению&lt;br /&gt;
 &amp;lt;math&amp;gt;c_{1}(d_{i+1}-\lambda)+c_{2}(d_{i}-\lambda)+c_{3}(d_{i}-\lambda)(d_{i+1}-\lambda)=0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;\lambda_{j}&amp;lt;/math&amp;gt; - приближённое значение корня. определим &amp;lt;math&amp;gt;c_{1},c_{2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c_{3}&amp;lt;/math&amp;gt; так, чтобы&lt;br /&gt;
 &amp;lt;math&amp;gt;\frac{c_{1}}{d_{i}-\lambda} + \frac{c_{2}}{d_{i+1}-\lambda} + c_{3} = h(\lambda) \approx f(\lambda) = 1 + \rho \sum_{k=1, n} \frac{u_{k}^{2}} {d_{k}-\lambda} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
для &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; в окрестности &amp;lt;math&amp;gt;\lambda_{j}&amp;lt;/math&amp;gt;. Заметим, что&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;f(\lambda) = 1 + \rho \sum_{k=1, i} \frac{u_{k}^{2}} {d_{k}-\lambda} + \rho \sum_{k=i+1, n} \frac{u_{k}^{2}} {d_{k}-\lambda} \equiv 1 + \psi_{1}(\lambda) + \psi_{2}(\lambda)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;\lambda \in (d_{i+1},d_{i})&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;\psi_{1}(\lambda)&amp;lt;/math&amp;gt; есть сумма положительных слагаемых, а &amp;lt;math&amp;gt;\psi_{2}(\lambda)&amp;lt;/math&amp;gt; - сумма отрицательных. Поэтому и &amp;lt;math&amp;gt;\psi_{1}(\lambda)&amp;lt;/math&amp;gt;, и &amp;lt;math&amp;gt;\psi_{2}(\lambda)&amp;lt;/math&amp;gt; могут быть вычислены с высокой точностью; однако при их сложении вполне вероятно взаимное уничтожение верных разрядов и потеря относительной точности в сумме. Возьмем числа &amp;lt;math&amp;gt;c_{1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\hat{c_{1}}&amp;lt;/math&amp;gt;, такие, что функция &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;h_{1}(\lambda) \equiv \hat{c_{1}} + \frac{c_{1}}{d_{i}-\lambda}&amp;lt;/math&amp;gt;   удовлетворяет условиям  &amp;lt;math&amp;gt;h_{1}(\lambda_{j}) = \psi_{1}(\lambda_{j})&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;h_{1}^{&#039;}(\lambda_{j})=\psi_{1}^{&#039;}(\lambda_{j})&amp;lt;/math&amp;gt; (1)&lt;br /&gt;
&lt;br /&gt;
Это означает, что гипербола, являющаяся графиком функции &amp;lt;math&amp;gt;h_{1}(\lambda)&amp;lt;/math&amp;gt;, касается графика функции &amp;lt;math&amp;gt;\psi_{i}(\lambda)&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;\lambda = \lambda_{j}&amp;lt;/math&amp;gt;. Два условия в (1) - это обычные условия метода Ньютона, за исключением того, что вместо прямой в качестве приближения используется гипербола. Легко проверить, что &amp;lt;math&amp;gt;c_{1}=\psi_{1}^{&#039;}(\lambda_{j})(d_{i} - \lambda_{j})^{2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\hat{c_{1}}=\psi_{1}(\lambda_{j}) - \psi_{1}^{&#039;}(\lambda_{j})(d_{i} - \lambda_{j})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Подобным же образом выбираем &amp;lt;math&amp;gt;c_{2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\hat{c_{2}}&amp;lt;/math&amp;gt; так, чтобы функция &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;h_{2}(\lambda) \equiv \hat{c_{2}} + \frac{c_{2}}{d_{i+1}-\lambda}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Удовлетворяла условиям&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;math&amp;gt;h_{2}(\lambda_{j}) = \psi_{2}(\lambda_{j})&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;h_{2}^{&#039;}(\lambda_{j})=\psi_{2}^{&#039;}(\lambda_{j})&amp;lt;/math&amp;gt; (2)&lt;br /&gt;
&lt;br /&gt;
Наконец, полагаем&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;h(\lambda) = 1 + h_{1}(\lambda) + h_{2}(\lambda) = (1 + \hat{c_{1}} + \hat{c_{2}} + \frac{c_{1}}{d_{i}-\lambda} + \frac{c_{2}}{d_{i+1}-\lambda} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;\equiv c_{3} + \frac{c_{1}}{d_{i}-\lambda} + \frac{c_{2}}{d_{i+1}-\lambda}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&#039;&#039;Вычисление собственных значений и собственных векторов симметричной трехдиагональной матрицы посредством стратегии &amp;quot;разделяй и властвуй&amp;quot;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;proc dc_eig&#039;&#039;&amp;lt;math&amp;gt;(T,Q,\Lambda)...&amp;lt;/math&amp;gt; по входной матрице &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; вычисляются выходные матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, такие, что &amp;lt;math&amp;gt;T = Q\Lambda Q^{T}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Если &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; - матрица размера &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; x &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
  1. Присвоить выходным параметрам значения &amp;lt;math&amp;gt; Q = 1, \Lambda = T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Иначе&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
  1. Представить &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; в виде &amp;lt;math&amp;gt; T = \begin{bmatrix} T_{1} &amp;amp; 0 \\ 0 &amp;amp; T_{2}\end{bmatrix} + b_{m}vv^{T} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  2. &#039;&#039;call dc_eig&#039;&#039;&amp;lt;math&amp;gt;(T_{1},Q_{1},\Lambda_{1})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  3. &#039;&#039;call dc_eig&#039;&#039;&amp;lt;math&amp;gt;(T_{2},Q_{2},\Lambda_{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  4. Построить &amp;lt;math&amp;gt;D+\rho uu^{T}&amp;lt;/math&amp;gt; по &amp;lt;math&amp;gt; \Lambda_{1},\Lambda_{2}, Q_{1}, Q_{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  5. Найти матрицу собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  6. Найти матрицу собственных векторов &amp;lt;math&amp;gt;Q^{&#039;}&amp;lt;/math&amp;gt; для матрицы &amp;lt;math&amp;gt;D+\rho uu^{T}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  7. Построить матрицу собственных векторов &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; для матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; : &amp;lt;math&amp;gt; Q = \begin{bmatrix} Q_{1} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}\end{bmatrix}* Q^{&#039;} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  8. Присвоить выходным параметрам значения &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;endif&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Проанализируем сложность алгоритма. Пусть &amp;lt;math&amp;gt;t(n)&amp;lt;/math&amp;gt; - число флопов при обработке матрицы размера &amp;lt;math&amp;gt; n x n&amp;lt;/math&amp;gt; процедурой &#039;&#039;dc_eig&#039;&#039;. Тогда &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; t(n) = 2t(n/2) &amp;lt;/math&amp;gt; два рекурсивных обращения к &#039;&#039;dc_eig&#039;&#039;&amp;lt;math&amp;gt;(T_{i},Q_{i},\Lambda_{i})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; +O(n^{2})&amp;lt;/math&amp;gt; вычисление собственных значений матрицы &amp;lt;math&amp;gt;D+\rho uu^{T}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; +O(n^{2})&amp;lt;/math&amp;gt; вычисление собственных векторов матрицы &amp;lt;math&amp;gt;D+\rho uu^{T}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; +c*n^{3}&amp;lt;/math&amp;gt; вычисление матрицы &amp;lt;math&amp;gt;Q = \begin{bmatrix} Q_{1} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}\end{bmatrix}*Q^{&#039;}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt; Q_{1}, Q_{2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Q^{&#039;}&amp;lt;/math&amp;gt; рассматриваются как плотные матрицы и используется стандартный алгоритм матричного умножения, то константа &amp;lt;math&amp;gt; c &amp;lt;/math&amp;gt; в последней строке равна 1. Таким образом, именно это умножение составляет наиболее трудоёмкую часть алгоритма в целом. Игнорируя члены порядка &amp;lt;math&amp;gt;n^{2}&amp;lt;/math&amp;gt;, получаем &amp;lt;math&amp;gt;t(n) = 2t(n/2) + cn^{3}&amp;lt;/math&amp;gt;. Решая это разностное уравнение, находим &amp;lt;math&amp;gt; t \approx c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На практике константа &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; обычно гораздо меньше 1, потому что матрица &amp;lt;math&amp;gt;Q^{&#039;}&amp;lt;/math&amp;gt; весьма разрежена вследствие явления, называемого дефляцией.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
В данном разделе представлен информационный граф алгоритма: на рисунке 3 изображена часть алгоритма, в которой происходит деление - &amp;quot;Divide&amp;quot;, а на рисунке 4 описана часть &amp;quot;Conquer&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[File:Divide.jpg|thumb|center|left|800px|Рис. 3. Информационный граф алгоритма &amp;quot;Разделяй и властвуй&amp;quot; - шаг &amp;lt;b&amp;gt;Divide&amp;lt;/b&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
[[File:ConquerPart.jpg|thumb|center|1200px|Рис. 4. Информационный граф алгоритма &amp;quot;Разделяй и властвуй&amp;quot; - шаг &amp;lt;b&amp;gt;Conquer&amp;lt;/b&amp;gt;. Qk*k - матрица собственных значений размерности &amp;lt;b&amp;gt;k&amp;lt;/b&amp;gt;. Lk*k - матрица собственных векторов размерности &amp;lt;b&amp;gt;k&amp;lt;/b&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Операции: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; - операция Divide разделения матрицы &amp;lt;math&amp;gt; T &amp;lt;/math&amp;gt; на матрицы &amp;lt;math&amp;gt;T_{1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Индексы - размерность &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;S_{k}&amp;lt;/math&amp;gt; - операция Conquer сбора матрицы &amp;lt;math&amp;gt; D &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; L_{k} &amp;lt;/math&amp;gt; - операция поиска собственных значений &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; S^{&#039;} &amp;lt;/math&amp;gt; - операция поиска собственных векторов матрицы &amp;lt;math&amp;gt; Q^{&#039;} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; S &amp;lt;/math&amp;gt; - операция поиска собственных векторов матрицы &amp;lt;math&amp;gt; Q &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Рассмотрев информационный граф алгоритма, можно заметить, что в структуре имеется два параллельных блока - вызов рекурсивных функций &#039;&#039;dc_eig&#039;&#039; для вычисления собственных значений и векторов матриц &amp;lt;math&amp;gt;T_{1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{2}&amp;lt;/math&amp;gt; - это единственная часть алгоритма, в которой мы прибегаем к параллелизму. В случае реализации без параллелизма, функции &#039;&#039;dc_eig&#039;&#039; отрабатывают последовательно - сначала со входными параметрами &amp;lt;math&amp;gt;T_{1}, Q_{1}, \Lambda_{1}&amp;lt;/math&amp;gt;, затем - &amp;lt;math&amp;gt;T_{2}, Q_{2}, \Lambda_{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
На вход алгоритму подаётся трёхдиагональная матрица, описанная в разделе [[#Математическое описание алгоритма]]&lt;br /&gt;
&lt;br /&gt;
На выходе мы получаем собственные значения и собственные вектора исходной матрицы&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Описанный в данной статье алгоритм является самым быстрым алгоритмом, среди существующих: QR / Бисекция и обратная итерация / Разделяй и властвуй.&lt;br /&gt;
&lt;br /&gt;
Последовательная сложность алгоритма: &amp;lt;math&amp;gt; t = c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параллельная сложность алгоритма (в силу использования дефляции): &amp;lt;math&amp;gt; O(n^{2.3)}&amp;lt;/math&amp;gt;  или в самых редких случаях &amp;lt;math&amp;gt; O(n^{2}) &amp;lt;/math&amp;gt; (см. [3] стр. 8).&lt;br /&gt;
&lt;br /&gt;
Особенности алгоритма:&lt;br /&gt;
&lt;br /&gt;
1. Использование дефляции ([[#Дефляция]])&lt;br /&gt;
&lt;br /&gt;
2. Использование адаптированного метода Ньютона ([[#Макроструктура алгоритма]])&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
Вторая часть описания алгоритмов в рамках AlgoWiki рассматривает все составные части процесса их реализации. Рассматривается как последовательная реализация алгоритма, так и параллельная. Описывается взаимосвязь свойств программ, реализующих алгоритм, и особенностей архитектуры компьютера, на которой они выполняются. Исследуется работа с памятью, локальность данных и вычислений, описывается масштабируемость и эффективность параллельных программ, производительность компьютеров, достигаемая на данной программе. Обсуждаются особенности реализации для разных классов архитектур компьютеров, приводятся ссылки на реализации в существующих библиотеках.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
TBD&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Большого количества реализаций данного алгоритма найдено не было: единственный пример описан на страницах 7, 19 и 20 в [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf этой статье], которая указана в списке литературы.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Дж. Деммель, «Вычислительная линейная алгебра» //С. 230-235&lt;br /&gt;
&lt;br /&gt;
[2] [http://www.netlib.org/utk/people/JackDongarra/PAPERS/104_1999_a-parallel-divide-and-conquer-algorithm.pdf Francoise Tisseury, Jack Dongarra, A Parallel Divide and Conquer Algorithm for the Symmetric Eigenvalue Problem on Distributed Memory Architectures]&lt;br /&gt;
&lt;br /&gt;
[3] [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures]&lt;br /&gt;
&lt;br /&gt;
[4] [https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm Алгоритм &amp;quot;Разделяй и властвуй&amp;quot; - Wikipedia]&lt;br /&gt;
&lt;br /&gt;
[5] [http://www.cscamm.umd.edu/tadmor/pub/linear-stability/Gill_Tadmor_SISC90.pdf Doron Grill and Eitan Tadmor AN &amp;lt;math&amp;gt;O(N2)&amp;lt;/math&amp;gt; METHOD FOR COMPUTING THE EIGENSYSTEM OF &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; SYMMETRIC TRIDIAGONAL MATRICES BY THE DIVIDE AND CONQUER APPROACH]&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Bobru</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%97%D0%B5%D0%BC%D0%BB%D1%8F%D0%BD%D1%81%D0%BA%D0%B8%D0%B9/Zavolskov/Zemlyanskiy&amp;diff=15661</id>
		<title>Участник:Роман Землянский/Zavolskov/Zemlyanskiy</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%97%D0%B5%D0%BC%D0%BB%D1%8F%D0%BD%D1%81%D0%BA%D0%B8%D0%B9/Zavolskov/Zemlyanskiy&amp;diff=15661"/>
		<updated>2016-11-01T20:48:33Z</updated>

		<summary type="html">&lt;p&gt;Bobru: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&#039;&#039;&#039;Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Авторы статьи: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Завольсков Владислав&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
[[#Вычислительное ядро алгоритма]]&lt;br /&gt;
&lt;br /&gt;
[[#Макроструктура алгоритма]]&lt;br /&gt;
&lt;br /&gt;
[[#Схема реализации последовательного алгоритма]]&lt;br /&gt;
&lt;br /&gt;
[[#Информационный граф]]&lt;br /&gt;
&lt;br /&gt;
[[#Существующие реализации алгоритма]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Землянский Роман&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[#Общее описание алгоритма]]&lt;br /&gt;
&lt;br /&gt;
[[#Математическое описание алгоритма]]&lt;br /&gt;
&lt;br /&gt;
[[#Последовательная сложность алгоритма]]&lt;br /&gt;
&lt;br /&gt;
[[#Ресурс параллелизма алгоритма]]&lt;br /&gt;
&lt;br /&gt;
[[#Входные и выходные данные алгоритма]]&lt;br /&gt;
&lt;br /&gt;
[[#Свойства алгоритма]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
614 группа&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Метод разделяй и властвуй вычисления собственных значений и векторов трёхдиагональной матрицы&#039;&#039;&#039; - это наиболее быстрый из существующих методов, если нужны все собственные значения и собственные векторы трехдиагональной матрицы, начиная с порядка n, примерно равного 26. (Точное значение этого порогового порядка зависит от компьютера.) Его численно устойчивая реализация весьма не тривиальна. В самом деле, хотя впервые метод был предложен еще в 1981 г., &amp;quot;правильный&amp;quot; способ его реализации был найден лишь в 1992 г. Этот способ воплощен LAPACK-программами ssyevd (для плотных матриц) и sstevd (для трехдиагональных матриц). В них стратегия &amp;quot;разделяй-и-влавствуй&amp;quot; используется для матриц порядка, большего чем 25. Для матриц меньшего порядка (или если нужны только собственные значения) происходит автоматический переход к QR-итерации.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть &lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
L = \begin{bmatrix}&lt;br /&gt;
 a_{1} &amp;amp; b_{1}&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 b_{1} &amp;amp; \ddots  &amp;amp; \ddots \\&lt;br /&gt;
   &amp;amp; \ddots &amp;amp; a_{m-1} &amp;amp; b_{m-1} \\&lt;br /&gt;
 &amp;amp;&amp;amp; b_{m-1} &amp;amp; a_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp; b_{m} &amp;amp; a_{m+1} &amp;amp; b_{m+1} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp; b_{m+1} &amp;amp; \ddots \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \ddots &amp;amp; b_{n-1} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; b_{n-1} &amp;amp; a_{n} \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
= \begin{bmatrix}&lt;br /&gt;
  a_{1} &amp;amp; b_{1} &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 b_{1} &amp;amp; \ddots  &amp;amp; \ddots \\&lt;br /&gt;
   &amp;amp; \ddots &amp;amp; a_{m-1} &amp;amp; b_{m-1} \\&lt;br /&gt;
 &amp;amp;&amp;amp; b_{m-1} &amp;amp; a_{m} - b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp; a_{m+1} - b_{m} &amp;amp; b_{m+1} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp; b_{m+1} &amp;amp; \ddots \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \ddots &amp;amp; b_{n-1} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; b_{n-1} &amp;amp; a_{n} \\&lt;br /&gt;
\end{bmatrix} +&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
+ \begin{bmatrix}&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&lt;br /&gt;
= \begin{bmatrix} T_{1} &amp;amp; 0 \\ 0 &amp;amp; T_{2}\end{bmatrix} + b_{m} * \begin{bmatrix} 0 \\ \vdots \\ 0 \\ 1 \\ 1 \\ 0 \\ \vdots \\ 0 \end{bmatrix} \begin{bmatrix} 0 , \ldots  ,  0 , 1 , 1 , 0 \ldots , 0 \end{bmatrix} &lt;br /&gt;
&lt;br /&gt;
\equiv \begin{bmatrix} T_{1} &amp;amp; 0 \\ 0 &amp;amp; T_{2}\end{bmatrix} + b_{m}vv^{T}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Предположим, что нам известны спектральные разложения матриц &amp;lt;math&amp;gt;T_{1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; T_{2} &amp;lt;/math&amp;gt;: &lt;br /&gt;
&amp;lt;math&amp;gt; T_{i} = Q_{i} \Lambda_{i} Q_{i}^{T} &amp;lt;/math&amp;gt;. В действительности, они будут рекурсивно вычисляться тем же самым алгоритмом. Установим связь между собственными значениями матрицы Т и собственными значениями матриц&lt;br /&gt;
&amp;lt;math&amp;gt;T_{1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{2}&amp;lt;/math&amp;gt;. Имеем:&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;math&amp;gt; &lt;br /&gt;
T = \begin{bmatrix} T_{1} &amp;amp; 0 \\ 0 &amp;amp; T_{2}\end{bmatrix} + b_{m}vv^{T} &lt;br /&gt;
= \begin{bmatrix} Q_{1} \Lambda_{1} Q_{1}^{T} &amp;amp; 0 \\ 0 &amp;amp; Q_{2} L_{2} Q_{2}^{T}\end{bmatrix} + b_{m}vv^{T} &lt;br /&gt;
= \begin{bmatrix} Q_{1} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}\end{bmatrix}(\begin{bmatrix} \Lambda_{1} &amp;amp; \\  &amp;amp; \Lambda_{2}\end{bmatrix} + b_{m}vv^{T})\begin{bmatrix} Q_{1}^{T} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}^{T}\end{bmatrix}&lt;br /&gt;
  &amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &lt;br /&gt;
&lt;br /&gt;
  &amp;lt;math&amp;gt;&lt;br /&gt;
u = \begin{bmatrix} Q_{1}^{T} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}^{T}\end{bmatrix}v&lt;br /&gt;
  &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
так как &amp;lt;math&amp;gt;v = \begin{bmatrix} 0 , \ldots  ,  0 , 1 , 1 , 0 \ldots , 0 \end{bmatrix}^T&amp;lt;/math&amp;gt;, получим матрицу, состоящую из последнего столбца матрицы &amp;lt;math&amp;gt; Q_{1}^{T}&amp;lt;/math&amp;gt; и первого столбца матрицы &amp;lt;math&amp;gt; Q_{2}^{T}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Следовательно, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; имеет те же собственные значения, что и пдобная ей матрица &amp;lt;math&amp;gt;D + \rho uu^{T}&amp;lt;/math&amp;gt;, &lt;br /&gt;
где &amp;lt;math&amp;gt;D = \begin{bmatrix} L_{1} &amp;amp; 0 \\ 0 &amp;amp; L_{2}\end{bmatrix}&amp;lt;/math&amp;gt; - диагональная матрица, &lt;br /&gt;
&amp;lt;math&amp;gt;\rho = b_{m}&amp;lt;/math&amp;gt; - число, а &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; - вектор. &lt;br /&gt;
&lt;br /&gt;
Будем предполагать, не ограничивая общности, что диагональные элементы &amp;lt;math&amp;gt;d_{1}, \ldots, d_{n}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; упорядочены по убыванию: &amp;lt;math&amp;gt;d_{n} &amp;lt;= \ldots &amp;lt;=d_{1}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Чтобы найти собственные значения матрицы &amp;lt;math&amp;gt;D + \rho uu^{T}&amp;lt;/math&amp;gt;, вычислим её характеристический многочлен, считая пока матрицу &amp;lt;math&amp;gt;D - \lambda I&amp;lt;/math&amp;gt; невырожденной.&lt;br /&gt;
Тогда&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;math&amp;gt;det(D + \rho uu^{T} - \lambda I) = det((D - \lambda I)(I + \rho (D- \lambda I)^{-1} uu^{T}))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Поскольку &amp;lt;math&amp;gt;D - \lambda I&amp;lt;/math&amp;gt; невырожденна, &amp;lt;math&amp;gt;det(I + \rho (D - \lambda I)^{-1}uu^{T}) = 0&amp;lt;/math&amp;gt; тогда и только тогда, когда &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; - собственное значение. Заметим, что матрица &amp;lt;math&amp;gt;I + \rho (D - \lambda I)^{-1}uu^{T}&amp;lt;/math&amp;gt; получается из единичной добавлением матрицы ранга 1. Определитель такой матрицы легко вычислить.&lt;br /&gt;
&lt;br /&gt;
  &#039;&#039;&#039;Лемма 1.&#039;&#039;&#039; Справедливо равенство &amp;lt;math&amp;gt;det(I + xy^{T}) = 1 + y^{T}x&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; - векторы.&lt;br /&gt;
&lt;br /&gt;
Таким образом,&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;math&amp;gt;det(I + \rho (D - \lambda I)^{-1}uu^{T}) = 1 + \rho u^{T}(D - \lambda I)^{-1}u&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt; = 1 + \rho \sum_{i=1, n} \frac{u_{i}^{2}} {d_{i}-\lambda} \equiv f(\lambda)&amp;lt;/math&amp;gt; , &lt;br /&gt;
&lt;br /&gt;
т.е. собственные значения матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; есть корни так называемого векового уравнения &amp;lt;math&amp;gt;f(\lambda) = 0&amp;lt;/math&amp;gt;. Если все числа &amp;lt;math&amp;gt;d_{i}&amp;lt;/math&amp;gt; различны и все &amp;lt;math&amp;gt;u_{i} &amp;lt;&amp;gt; 0&amp;lt;/math&amp;gt; (случай общего положения), то &amp;lt;math&amp;gt;f(\lambda)&amp;lt;/math&amp;gt; имеет график типа показанного на рис.1(где &amp;lt;math&amp;gt;n = 4&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\rho &amp;gt; 0&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
[[File:Graphics.PNG|thumb|center|800px|Рис. 1. График функции &amp;lt;math&amp;gt; f(\lambda) = 1 + \frac{0.5}{1 - \lambda} + \frac{0.5}{2 - \lambda} + \frac{0.5}{3 - \lambda} + \frac{0.5}{4 - \lambda}&amp;lt;/math&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Можно видеть, что прямая &amp;lt;math&amp;gt;y = 1&amp;lt;/math&amp;gt; является горизонтальной асимптотой для этого графика, а прямые &amp;lt;math&amp;gt;\lambda = d_{i}&amp;lt;/math&amp;gt; есть вертикальные асимптоты. Поскольку &amp;lt;math&amp;gt;f^{&#039;}(\lambda) =  \rho \sum_{i=1, n} \frac{u_{i}^{2}} {(d_{i}-\lambda)^{2}}&amp;gt; 0 &amp;lt;/math&amp;gt;, функция возрастает всюду, кроме точек &amp;lt;math&amp;gt;\lambda = d_{i}&amp;lt;/math&amp;gt;. Поэтому корни функции разделяются числами &amp;lt;math&amp;gt;d_{i}&amp;lt;/math&amp;gt; и ещё один корень находится справа от точки &amp;lt;math&amp;gt;d_{1}&amp;lt;/math&amp;gt; (на рис. 1 &amp;lt;math&amp;gt;d_{1} = 4&amp;lt;/math&amp;gt;). (При &amp;lt;math&amp;gt;\rho&amp;lt;0&amp;lt;/math&amp;gt; функция &amp;lt;math&amp;gt;f(\lambda)&amp;lt;/math&amp;gt; всюду убывает и соответствующий корень находится слева от точки &amp;lt;math&amp;gt;d_{n}&amp;lt;/math&amp;gt;). Для функции &amp;lt;math&amp;gt;f(\lambda)&amp;lt;/math&amp;gt;, монотонной и гладкой на каждом из интервалов &amp;lt;math&amp;gt;(d_{i+1},d_{i})&amp;lt;/math&amp;gt;, можно найти вариант метода Ньютона, который быстро и монотонно сходится к каждому из корней, если начальная точка взята в &amp;lt;math&amp;gt;(d_{i+1},d_{i})&amp;lt;/math&amp;gt;. Нам достаточно знать, что на практике метод сходится к каждому собственному значению за ограниченное число шагов. Поскольку вычисление &amp;lt;math&amp;gt;f(\lambda)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;f^{&#039;}(\lambda)&amp;lt;/math&amp;gt; стоит &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; флопов, для вычисления одного собственного значения достаточно &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, а для вычисления всех &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; собственных значений матрицы &amp;lt;math&amp;gt;D + \rho uu^{T}&amp;lt;/math&amp;gt; требуется &amp;lt;math&amp;gt;O(n^{2})&amp;lt;/math&amp;gt; флопов.&lt;br /&gt;
Для собственных векторов матрицы &amp;lt;math&amp;gt;D + \rho uu^{T}&amp;lt;/math&amp;gt; мы легко можем получить явные выражения.&lt;br /&gt;
&lt;br /&gt;
  &#039;&#039;&#039;Лемма 2.&#039;&#039;&#039; Если &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; - собственное значение матрицы &amp;lt;math&amp;gt;D + \rho uu^{T}&amp;lt;/math&amp;gt;, то соответствующий вектор равен &amp;lt;math&amp;gt;(D - \alpha I)^{-1}u&amp;lt;/math&amp;gt;. Поскольку матрица &amp;lt;math&amp;gt;D - \alpha I&amp;lt;/math&amp;gt; диагональная, для вычисления такого вектора достаточно &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; флопов.&lt;br /&gt;
&lt;br /&gt;
Доказательство.&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;math&amp;gt;(D + \rho uu^{T})[(D - \alpha I)^{-1}u] = (D - \alpha I + \alpha I + \rho uu^{T})(D - \alpha I)^{-1}u&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;math&amp;gt;=u + \alpha (D - \alpha I)^{-1}u + u[\rho u^{T}(D - \alpha I)^{-1}u] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;math&amp;gt;=u + \alpha(D - \alpha I)^{-1}u - u&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
                                                       поскольку &amp;lt;math&amp;gt; \rho u^{T}(D - \alpha I)^{-1}u + 1 = f(\alpha) = 0 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;math&amp;gt;=\alpha [(D - \alpha I)^{-1}u]&amp;lt;/math&amp;gt;, что и требовалось.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для вычисления по этой простой формуле всех &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; собственных векторов требуется &amp;lt;math&amp;gt;O(n^{2})&amp;lt;/math&amp;gt; флопов. К сожалению, формула не обеспечивает численной устойчивости, так как для двух очень близких значений &amp;lt;math&amp;gt;\alpha_{i}&amp;lt;/math&amp;gt; может давать неортогональные приближенные собственные векторы &amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt;. Потребовалось целое десятилетие для того, чтобы найти устойчивую альтернативу исходному описанию алгоритма. Снова детали будут обсуждаться позднее в данном разделе. &lt;br /&gt;
&lt;br /&gt;
Алгоритм является рекурсивным.&lt;br /&gt;
&lt;br /&gt;
=== Дефляция ===&lt;br /&gt;
&lt;br /&gt;
До сих пор полагалось, что все &amp;lt;math&amp;gt;d_{i}&amp;lt;/math&amp;gt; различны и все &amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; отличны от нуля. Если это не так, вековое уравнение &amp;lt;math&amp;gt;f(\lambda)=0&amp;lt;/math&amp;gt; имеет &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; вертикальных асимптот, где &amp;lt;math&amp;gt;k&amp;lt;n&amp;lt;/math&amp;gt;, а потому &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; корней. Однако оказывается, что остальные &amp;lt;math&amp;gt;n - k&amp;lt;/math&amp;gt; собственных значений могут быть определены без каких-либо усилий: если &amp;lt;math&amp;gt;d_{i}=d_{i+1}&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;u_{i}=0&amp;lt;/math&amp;gt;, то легко показать, что &amp;lt;math&amp;gt;d_{i}&amp;lt;/math&amp;gt; является собственным значением и для матрицы &amp;lt;math&amp;gt;D + \rho uu^{T}&amp;lt;/math&amp;gt;. В такой ситуации мы говорим о &#039;&#039;дефляции&#039;&#039;. На практике выбирается некоторое пороговое значение и дефляция для числа &amp;lt;math&amp;gt;d_{i}&amp;lt;/math&amp;gt; регистрируется, если в смысле этого порога &amp;lt;math&amp;gt;d_{i}&amp;lt;/math&amp;gt; достаточно близко к &amp;lt;math&amp;gt;d_{i+1}&amp;lt;/math&amp;gt; либо &amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; достаточно мало.&lt;br /&gt;
&lt;br /&gt;
Основной выигрыш от использования дефляции состоит не в том, что убыстряется решение векового уравнения - этот этап в любом случае стоит лишь &amp;lt;math&amp;gt;O(n^{2})&amp;lt;/math&amp;gt; операций. Выигрыш заключается в ускорении матричного умножения на последнем шаге алгоритма. Действительно, если &amp;lt;math&amp;gt;u_{i}=0&amp;lt;/math&amp;gt;, то соответствующий собственный вектор есть i-й столбец &amp;lt;math&amp;gt;e_{i}&amp;lt;/math&amp;gt; единичной матрицы. Это означает, что &amp;lt;math&amp;gt;e_{i}&amp;lt;/math&amp;gt; является i-м столбцом в матрице &amp;lt;math&amp;gt;Q_{&#039;}&amp;lt;/math&amp;gt;, поэтому при формировании матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; посредством левого умножения &amp;lt;math&amp;gt;Q_{1}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;Q_{2}&amp;lt;/math&amp;gt; вычисление i-го столбца не требует никаких затрат. Аналогичное упрощение имеет место в случае &amp;lt;math&amp;gt;d_{i} = d_{i+1}&amp;lt;/math&amp;gt;. При дефляции многих собственных значений устраняется большая часть работы, связанной с матричным умножением.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Вычислительным ядром последовательной схемы решения является вычисление матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; собственных векторов путём умножения матрицы &amp;lt;math&amp;gt;Q = \begin{bmatrix} Q_{1} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}\end{bmatrix}&amp;lt;/math&amp;gt; на матрицу &amp;lt;math&amp;gt;Q^{&#039;}&amp;lt;/math&amp;gt; Данная операция имеет сложность &amp;lt;math&amp;gt;cn^{3}&amp;lt;/math&amp;gt; о чём и говорится в разделе [[#Последовательная сложность алгоритма]] .&lt;br /&gt;
Ей предшествует вычисление собственных значений и векторов матрицы &amp;lt;math&amp;gt; D + \rho uu^{T}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
В разделе [[#Информационный граф]] описана структура алгоритма, в которой есть блок умножения матриц для вычисления собственных векторов, являющийся вычислительным ядром алгоритма. В соответствующем разделе ([[#Вычислительное ядро алгоритма]]) мы упоминали о том, что данному блоку предшествует вычисление собственных значений, которое производится [https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%9D%D1%8C%D1%8E%D1%82%D0%BE%D0%BD%D0%B0 методом Ньютона].&lt;br /&gt;
&lt;br /&gt;
=== Решение векового уравнения ===&lt;br /&gt;
Подробно стоит поговорить о решении векового уравнения, которое является одной из основных частей алгоритма.&lt;br /&gt;
&lt;br /&gt;
Предположим, что некоторое &amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt;, хотя и мало, все же недостаточно мало для того, чтобы была зарегистрирована дефляция. В этом случае применение метода Ньютона к решению векового уравнения встречается с затруднениями. Вспомним, что пересчет приближённого решения &amp;lt;math&amp;gt;u_{j}&amp;lt;/math&amp;gt; уравнения &amp;lt;math&amp;gt;f(\lambda) = 0&amp;lt;/math&amp;gt; в методе Ньютона основан на следующих положениях:&lt;br /&gt;
&lt;br /&gt;
 1. Вблизи точки &amp;lt;math&amp;gt;\lambda = \lambda_{j}&amp;lt;/math&amp;gt; функция &amp;lt;math&amp;gt;f(\lambda)&amp;lt;/math&amp;gt; аппроксимируется линейной функцией &amp;lt;math&amp;gt;l(\lambda)&amp;lt;/math&amp;gt;; график есть прямая линия, касающаяся графика функции &amp;lt;math&amp;gt;f(\lambda)&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;\lambda = \lambda_{j}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 2. В качестве &amp;lt;math&amp;gt;\lambda_{j+1}&amp;lt;/math&amp;gt; берётся нуль этого линейного приближения, т.е. &amp;lt;math&amp;gt;l(\lambda_{j+1})=0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Функция, показанная на рис.1, не доставляет видимых трудностей методу Ньютона, поскольку вблизи каждого своего нуля &amp;lt;math&amp;gt;f(\lambda)&amp;lt;/math&amp;gt; достаточно хорошо аппроксимируется линейными функциями. Однако рассмотрим график функции на рис. 2. Она получена из функции на рис. 1 заменой значения .5 для &amp;lt;math&amp;gt;u_{i}^{2}&amp;lt;/math&amp;gt; на .001. Это новое значение недостаточно мало для того, чтобы вызвать дефляцию. График функции в левой части рис.2 визуально не отличим от её вертикальных и горизонтальных асимптот, поэтому в правой части укрупненно воспроизведён фрагмент графика, прилегающий к вертикальной асимптоте &amp;lt;math&amp;gt;\lambda = 2&amp;lt;/math&amp;gt;. Видно, что график слишком быстро &amp;quot;выполняет поворот&amp;quot; и для большей части значений &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; почти горизонтален. Поэтому, применяя метод Ньютона почти к любому начальному приближению &amp;lt;math&amp;gt;\lambda_{0}&amp;lt;/math&amp;gt;, мы получаем линейное приближение &amp;lt;math&amp;gt;l(\lambda)&amp;lt;/math&amp;gt; с почти горизонтальным графиком и малым положительным угловым коэффициентом. В результате &amp;lt;math&amp;gt;\lambda_{1}&amp;lt;/math&amp;gt; является отрицательным числом, огромным по абсолютной величине, которое совершенно бесполезно в качестве приближения к истинному корню.&lt;br /&gt;
&lt;br /&gt;
[[File:GraphNewton.png|thumb|center|800px|Рис. 2. График функции &amp;lt;math&amp;gt; f(\lambda) = 1 + \frac{10^{-3}}{1 - \lambda} + \frac{10^{-3}}{2 - \lambda} + \frac{10^{-3}}{3 - \lambda} + \frac{10^{-3}}{4 - \lambda}&amp;lt;/math&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Чтобы найти выход из этого положения, можно модифицировать метод Ньютона следующим образом: раз &amp;lt;math&amp;gt;f(\lambda)&amp;lt;/math&amp;gt; нельзя хорошо приблизить линейной функцией &amp;lt;math&amp;gt;l(\lambda)&amp;lt;/math&amp;gt;, попробуем взять в качестве приближения какую-нибудь другую простую функцию &amp;lt;math&amp;gt;h(\lambda)&amp;lt;/math&amp;gt;. Нет ничего особого именно в прямых линиях: для метода Ньютона вместо &amp;lt;math&amp;gt;l(\lambda)&amp;lt;/math&amp;gt; можно взять любое приближение &amp;lt;math&amp;gt;h(\lambda)&amp;lt;/math&amp;gt;, значения и нули которого легко вычисляются. Функция &amp;lt;math&amp;gt;f(\lambda)&amp;lt;/math&amp;gt; имеет полюсы в точках &amp;lt;math&amp;gt;d_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;d_{i+1}&amp;lt;/math&amp;gt;, которые определяют её поведение в соответствующих окрестностях. Поэтому при поиске корня в интервале &amp;lt;math&amp;gt;(d_{i+1}, d_{i})&amp;lt;/math&amp;gt; естественно выбрать функцию &amp;lt;math&amp;gt;h(\lambda)&amp;lt;/math&amp;gt;, также имеющую эти полюсы, т.е. функцию вида&lt;br /&gt;
 &amp;lt;math&amp;gt;h(\lambda)= \frac{c_{1}}{d_{i}-\lambda} + \frac{c_{2}}{d_{i+1}-\lambda} + c_{3}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Константы &amp;lt;math&amp;gt;c_{1},c_{2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c_{3}&amp;lt;/math&amp;gt; обеспечивающие, что &amp;lt;math&amp;gt;h(\lambda)&amp;lt;/math&amp;gt; есть приближение к &amp;lt;math&amp;gt;f(\lambda)&amp;lt;/math&amp;gt;, можно выбрать несколькими способами. Отметим, что если &amp;lt;math&amp;gt;c_{1},c_{2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c_{3}&amp;lt;/math&amp;gt; уже известны, то уравнение &amp;lt;math&amp;gt;h(\lambda)=0&amp;lt;/math&amp;gt; легко решается относительно &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;, поскольку сводится к эквивалентному квадратному уравнению&lt;br /&gt;
 &amp;lt;math&amp;gt;c_{1}(d_{i+1}-\lambda)+c_{2}(d_{i}-\lambda)+c_{3}(d_{i}-\lambda)(d_{i+1}-\lambda)=0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;\lambda_{j}&amp;lt;/math&amp;gt; - приближённое значение корня. определим &amp;lt;math&amp;gt;c_{1},c_{2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c_{3}&amp;lt;/math&amp;gt; так, чтобы&lt;br /&gt;
 &amp;lt;math&amp;gt;\frac{c_{1}}{d_{i}-\lambda} + \frac{c_{2}}{d_{i+1}-\lambda} + c_{3} = h(\lambda) \approx f(\lambda) = 1 + \rho \sum_{k=1, n} \frac{u_{k}^{2}} {d_{k}-\lambda} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
для &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; в окрестности &amp;lt;math&amp;gt;\lambda_{j}&amp;lt;/math&amp;gt;. Заметим, что&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;f(\lambda) = 1 + \rho \sum_{k=1, i} \frac{u_{k}^{2}} {d_{k}-\lambda} + \rho \sum_{k=i+1, n} \frac{u_{k}^{2}} {d_{k}-\lambda} \equiv 1 + \psi_{1}(\lambda) + \psi_{2}(\lambda)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;\lambda \in (d_{i+1},d_{i})&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;\psi_{1}(\lambda)&amp;lt;/math&amp;gt; есть сумма положительных слагаемых, а &amp;lt;math&amp;gt;\psi_{2}(\lambda)&amp;lt;/math&amp;gt; - сумма отрицательных. Поэтому и &amp;lt;math&amp;gt;\psi_{1}(\lambda)&amp;lt;/math&amp;gt;, и &amp;lt;math&amp;gt;\psi_{2}(\lambda)&amp;lt;/math&amp;gt; могут быть вычислены с высокой точностью; однако при их сложении вполне вероятно взаимное уничтожение верных разрядов и потеря относительной точности в сумме. Возьмем числа &amp;lt;math&amp;gt;c_{1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\hat{c_{1}}&amp;lt;/math&amp;gt;, такие, что функция &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;h_{1}(\lambda) \equiv \hat{c_{1}} + \frac{c_{1}}{d_{i}-\lambda}&amp;lt;/math&amp;gt;   удовлетворяет условиям  &amp;lt;math&amp;gt;h_{1}(\lambda_{j}) = \psi_{1}(\lambda_{j})&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;h_{1}^{&#039;}(\lambda_{j})=\psi_{1}^{&#039;}(\lambda_{j})&amp;lt;/math&amp;gt; (1)&lt;br /&gt;
&lt;br /&gt;
Это означает, что гипербола, являющаяся графиком функции &amp;lt;math&amp;gt;h_{1}(\lambda)&amp;lt;/math&amp;gt;, касается графика функции &amp;lt;math&amp;gt;\psi_{i}(\lambda)&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;\lambda = \lambda_{j}&amp;lt;/math&amp;gt;. Два условия в (1) - это обычные условия метода Ньютона, за исключением того, что вместо прямой в качестве приближения используется гипербола. Легко проверить, что &amp;lt;math&amp;gt;c_{1}=\psi_{1}^{&#039;}(\lambda_{j})(d_{i} - \lambda_{j})^{2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\hat{c_{1}}=\psi_{1}(\lambda_{j}) - \psi_{1}^{&#039;}(\lambda_{j})(d_{i} - \lambda_{j})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Подобным же образом выбираем &amp;lt;math&amp;gt;c_{2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\hat{c_{2}}&amp;lt;/math&amp;gt; так, чтобы функция &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;h_{2}(\lambda) \equiv \hat{c_{2}} + \frac{c_{2}}{d_{i+1}-\lambda}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Удовлетворяла условиям&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;math&amp;gt;h_{2}(\lambda_{j}) = \psi_{2}(\lambda_{j})&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;h_{2}^{&#039;}(\lambda_{j})=\psi_{2}^{&#039;}(\lambda_{j})&amp;lt;/math&amp;gt; (2)&lt;br /&gt;
&lt;br /&gt;
Наконец, полагаем&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;h(\lambda) = 1 + h_{1}(\lambda) + h_{2}(\lambda) = (1 + \hat{c_{1}} + \hat{c_{2}} + \frac{c_{1}}{d_{i}-\lambda} + \frac{c_{2}}{d_{i+1}-\lambda} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;\equiv c_{3} + \frac{c_{1}}{d_{i}-\lambda} + \frac{c_{2}}{d_{i+1}-\lambda}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&#039;&#039;Вычисление собственных значений и собственных векторов симметричной трехдиагональной матрицы посредством стратегии &amp;quot;разделяй и властвуй&amp;quot;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;proc dc_eig&#039;&#039;&amp;lt;math&amp;gt;(T,Q,\Lambda)...&amp;lt;/math&amp;gt; по входной матрице &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; вычисляются выходные матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, такие, что &amp;lt;math&amp;gt;T = Q\Lambda Q^{T}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Если &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; - матрица размера &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; x &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
  1. Присвоить выходным параметрам значения &amp;lt;math&amp;gt; Q = 1, \Lambda = T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Иначе&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
  1. Представить &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; в виде &amp;lt;math&amp;gt; T = \begin{bmatrix} T_{1} &amp;amp; 0 \\ 0 &amp;amp; T_{2}\end{bmatrix} + b_{m}vv^{T} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  2. &#039;&#039;call dc_eig&#039;&#039;&amp;lt;math&amp;gt;(T_{1},Q_{1},\Lambda_{1})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  3. &#039;&#039;call dc_eig&#039;&#039;&amp;lt;math&amp;gt;(T_{2},Q_{2},\Lambda_{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  4. Построить &amp;lt;math&amp;gt;D+\rho uu^{T}&amp;lt;/math&amp;gt; по &amp;lt;math&amp;gt; \Lambda_{1},\Lambda_{2}, Q_{1}, Q_{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  5. Найти матрицу собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  6. Найти матрицу собственных векторов &amp;lt;math&amp;gt;Q^{&#039;}&amp;lt;/math&amp;gt; для матрицы &amp;lt;math&amp;gt;D+\rho uu^{T}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  7. Построить матрицу собственных векторов &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; для матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; : &amp;lt;math&amp;gt; Q = \begin{bmatrix} Q_{1} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}\end{bmatrix}* Q^{&#039;} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  8. Присвоить выходным параметрам значения &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;endif&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Проанализируем сложность алгоритма. Пусть &amp;lt;math&amp;gt;t(n)&amp;lt;/math&amp;gt; - число флопов при обработке матрицы размера &amp;lt;math&amp;gt; n x n&amp;lt;/math&amp;gt; процедурой &#039;&#039;dc_eig&#039;&#039;. Тогда &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; t(n) = 2t(n/2) &amp;lt;/math&amp;gt; два рекурсивных обращения к &#039;&#039;dc_eig&#039;&#039;&amp;lt;math&amp;gt;(T_{i},Q_{i},\Lambda_{i})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; +O(n^{2})&amp;lt;/math&amp;gt; вычисление собственных значений матрицы &amp;lt;math&amp;gt;D+\rho uu^{T}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; +O(n^{2})&amp;lt;/math&amp;gt; вычисление собственных векторов матрицы &amp;lt;math&amp;gt;D+\rho uu^{T}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; +c*n^{3}&amp;lt;/math&amp;gt; вычисление матрицы &amp;lt;math&amp;gt;Q = \begin{bmatrix} Q_{1} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}\end{bmatrix}*Q^{&#039;}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt; Q_{1}, Q_{2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Q^{&#039;}&amp;lt;/math&amp;gt; рассматриваются как плотные матрицы и используется стандартный алгоритм матричного умножения, то константа &amp;lt;math&amp;gt; c &amp;lt;/math&amp;gt; в последней строке равна 1. Таким образом, именно это умножение составляет наиболее трудоёмкую часть алгоритма в целом. Игнорируя члены порядка &amp;lt;math&amp;gt;n^{2}&amp;lt;/math&amp;gt;, получаем &amp;lt;math&amp;gt;t(n) = 2t(n/2) + cn^{3}&amp;lt;/math&amp;gt;. Решая это разностное уравнение, находим &amp;lt;math&amp;gt; t \approx c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На практике константа &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; обычно гораздо меньше 1, потому что матрица &amp;lt;math&amp;gt;Q^{&#039;}&amp;lt;/math&amp;gt; весьма разрежена вследствие явления, называемого дефляцией.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
В данном разделе представлен информационный граф алгоритма: на рисунке 3 изображена часть алгоритма, в которой происходит деление - &amp;quot;Divide&amp;quot;, а на рисунке 4 описана часть &amp;quot;Conquer&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[File:Divide.jpg|thumb|center|left|800px|Рис. 3. Информационный граф алгоритма &amp;quot;Разделяй и властвуй&amp;quot; - шаг &amp;lt;b&amp;gt;Divide&amp;lt;/b&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
[[File:ConquerPart.jpg|thumb|center|1200px|Рис. 4. Информационный граф алгоритма &amp;quot;Разделяй и властвуй&amp;quot; - шаг &amp;lt;b&amp;gt;Conquer&amp;lt;/b&amp;gt;. Qk*k - матрица собственных значений размерности &amp;lt;b&amp;gt;k&amp;lt;/b&amp;gt;. Lk*k - матрица собственных векторов размерности &amp;lt;b&amp;gt;k&amp;lt;/b&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Операции: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; - операция Divide разделения матрицы &amp;lt;math&amp;gt; T &amp;lt;/math&amp;gt; на матрицы &amp;lt;math&amp;gt;T_{1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Индексы - размерность &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;S_{k}&amp;lt;/math&amp;gt; - операция Conquer сбора матрицы &amp;lt;math&amp;gt; D &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; L &amp;lt;/math&amp;gt; - операция поиска собственных значений &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; S^{&#039;} &amp;lt;/math&amp;gt; - операция поиска собственных векторов матрицы &amp;lt;math&amp;gt; Q^{&#039;} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; S &amp;lt;/math&amp;gt; - операция поиска собственных векторов матрицы &amp;lt;math&amp;gt; Q &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Рассмотрев информационный граф алгоритма, можно заметить, что в структуре имеется два параллельных блока - вызов рекурсивных функций &#039;&#039;dc_eig&#039;&#039; для вычисления собственных значений и векторов матриц &amp;lt;math&amp;gt;T_{1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{2}&amp;lt;/math&amp;gt; - это единственная часть алгоритма, в которой мы прибегаем к параллелизму. В случае реализации без параллелизма, функции &#039;&#039;dc_eig&#039;&#039; отрабатывают последовательно - сначала со входными параметрами &amp;lt;math&amp;gt;T_{1}, Q_{1}, \Lambda_{1}&amp;lt;/math&amp;gt;, затем - &amp;lt;math&amp;gt;T_{2}, Q_{2}, \Lambda_{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
На вход алгоритму подаётся трёхдиагональная матрица, описанная в разделе [[#Математическое описание алгоритма]]&lt;br /&gt;
&lt;br /&gt;
На выходе мы получаем собственные значения и собственные вектора исходной матрицы&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Описанный в данной статье алгоритм является самым быстрым алгоритмом, среди существующих: QR / Бисекция и обратная итерация / Разделяй и властвуй.&lt;br /&gt;
&lt;br /&gt;
Последовательная сложность алгоритма: &amp;lt;math&amp;gt; t = c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параллельная сложность алгоритма (в силу использования дефляции): &amp;lt;math&amp;gt; O(n^{2.3)}&amp;lt;/math&amp;gt;  или в самых редких случаях &amp;lt;math&amp;gt; O(n^{2}) &amp;lt;/math&amp;gt; (см. [3] стр. 8).&lt;br /&gt;
&lt;br /&gt;
Особенности алгоритма:&lt;br /&gt;
&lt;br /&gt;
1. Использование дефляции ([[#Дефляция]])&lt;br /&gt;
&lt;br /&gt;
2. Использование адаптированного метода Ньютона ([[#Макроструктура алгоритма]])&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
Вторая часть описания алгоритмов в рамках AlgoWiki рассматривает все составные части процесса их реализации. Рассматривается как последовательная реализация алгоритма, так и параллельная. Описывается взаимосвязь свойств программ, реализующих алгоритм, и особенностей архитектуры компьютера, на которой они выполняются. Исследуется работа с памятью, локальность данных и вычислений, описывается масштабируемость и эффективность параллельных программ, производительность компьютеров, достигаемая на данной программе. Обсуждаются особенности реализации для разных классов архитектур компьютеров, приводятся ссылки на реализации в существующих библиотеках.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
TBD&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Большого количества реализаций данного алгоритма найдено не было: единственный пример описан на страницах 7, 19 и 20 в [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf этой статье], которая указана в списке литературы.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Дж. Деммель, «Вычислительная линейная алгебра» //С. 230-235&lt;br /&gt;
&lt;br /&gt;
[2] [http://www.netlib.org/utk/people/JackDongarra/PAPERS/104_1999_a-parallel-divide-and-conquer-algorithm.pdf Francoise Tisseury, Jack Dongarra, A Parallel Divide and Conquer Algorithm for the Symmetric Eigenvalue Problem on Distributed Memory Architectures]&lt;br /&gt;
&lt;br /&gt;
[3] [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures]&lt;br /&gt;
&lt;br /&gt;
[4] [https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm Алгоритм &amp;quot;Разделяй и властвуй&amp;quot; - Wikipedia]&lt;br /&gt;
&lt;br /&gt;
[5] [http://www.cscamm.umd.edu/tadmor/pub/linear-stability/Gill_Tadmor_SISC90.pdf Doron Grill and Eitan Tadmor AN &amp;lt;math&amp;gt;O(N2)&amp;lt;/math&amp;gt; METHOD FOR COMPUTING THE EIGENSYSTEM OF &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; SYMMETRIC TRIDIAGONAL MATRICES BY THE DIVIDE AND CONQUER APPROACH]&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Bobru</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%97%D0%B5%D0%BC%D0%BB%D1%8F%D0%BD%D1%81%D0%BA%D0%B8%D0%B9/Zavolskov/Zemlyanskiy&amp;diff=15659</id>
		<title>Участник:Роман Землянский/Zavolskov/Zemlyanskiy</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%97%D0%B5%D0%BC%D0%BB%D1%8F%D0%BD%D1%81%D0%BA%D0%B8%D0%B9/Zavolskov/Zemlyanskiy&amp;diff=15659"/>
		<updated>2016-11-01T20:44:32Z</updated>

		<summary type="html">&lt;p&gt;Bobru: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&#039;&#039;&#039;Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Авторы статьи: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Завольсков Владислав&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
[[#Вычислительное ядро алгоритма]]&lt;br /&gt;
&lt;br /&gt;
[[#Макроструктура алгоритма]]&lt;br /&gt;
&lt;br /&gt;
[[#Схема реализации последовательного алгоритма]]&lt;br /&gt;
&lt;br /&gt;
[[#Информационный граф]]&lt;br /&gt;
&lt;br /&gt;
[[#Существующие реализации алгоритма]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Землянский Роман&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[#Общее описание алгоритма]]&lt;br /&gt;
&lt;br /&gt;
[[#Математическое описание алгоритма]]&lt;br /&gt;
&lt;br /&gt;
[[#Последовательная сложность алгоритма]]&lt;br /&gt;
&lt;br /&gt;
[[#Ресурс параллелизма алгоритма]]&lt;br /&gt;
&lt;br /&gt;
[[#Входные и выходные данные алгоритма]]&lt;br /&gt;
&lt;br /&gt;
[[#Свойства алгоритма]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
614 группа&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Метод разделяй и властвуй вычисления собственных значений и векторов трёхдиагональной матрицы&#039;&#039;&#039; - это наиболее быстрый из существующих методов, если нужны все собственные значения и собственные векторы трехдиагональной матрицы, начиная с порядка n, примерно равного 26. (Точное значение этого порогового порядка зависит от компьютера.) Его численно устойчивая реализация весьма не тривиальна. В самом деле, хотя впервые метод был предложен еще в 1981 г., &amp;quot;правильный&amp;quot; способ его реализации был найден лишь в 1992 г. Этот способ воплощен LAPACK-программами ssyevd (для плотных матриц) и sstevd (для трехдиагональных матриц). В них стратегия &amp;quot;разделяй-и-влавствуй&amp;quot; используется для матриц порядка, большего чем 25. Для матриц меньшего порядка (или если нужны только собственные значения) происходит автоматический переход к QR-итерации.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть &lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
L = \begin{bmatrix}&lt;br /&gt;
 a_{1} &amp;amp; b_{1}&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 b_{1} &amp;amp; \ddots  &amp;amp; \ddots \\&lt;br /&gt;
   &amp;amp; \ddots &amp;amp; a_{m-1} &amp;amp; b_{m-1} \\&lt;br /&gt;
 &amp;amp;&amp;amp; b_{m-1} &amp;amp; a_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp; b_{m} &amp;amp; a_{m+1} &amp;amp; b_{m+1} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp; b_{m+1} &amp;amp; \ddots \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \ddots &amp;amp; b_{n-1} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; b_{n-1} &amp;amp; a_{n} \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
= \begin{bmatrix}&lt;br /&gt;
  a_{1} &amp;amp; b_{1} &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 b_{1} &amp;amp; \ddots  &amp;amp; \ddots \\&lt;br /&gt;
   &amp;amp; \ddots &amp;amp; a_{m-1} &amp;amp; b_{m-1} \\&lt;br /&gt;
 &amp;amp;&amp;amp; b_{m-1} &amp;amp; a_{m} - b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp; a_{m+1} - b_{m} &amp;amp; b_{m+1} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp; b_{m+1} &amp;amp; \ddots \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \ddots &amp;amp; b_{n-1} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; b_{n-1} &amp;amp; a_{n} \\&lt;br /&gt;
\end{bmatrix} +&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
+ \begin{bmatrix}&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&lt;br /&gt;
= \begin{bmatrix} T_{1} &amp;amp; 0 \\ 0 &amp;amp; T_{2}\end{bmatrix} + b_{m} * \begin{bmatrix} 0 \\ \vdots \\ 0 \\ 1 \\ 1 \\ 0 \\ \vdots \\ 0 \end{bmatrix} \begin{bmatrix} 0 , \ldots  ,  0 , 1 , 1 , 0 \ldots , 0 \end{bmatrix} &lt;br /&gt;
&lt;br /&gt;
\equiv \begin{bmatrix} T_{1} &amp;amp; 0 \\ 0 &amp;amp; T_{2}\end{bmatrix} + b_{m}vv^{T}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Предположим, что нам известны спектральные разложения матриц &amp;lt;math&amp;gt;T_{1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; T_{2} &amp;lt;/math&amp;gt;: &lt;br /&gt;
&amp;lt;math&amp;gt; T_{i} = Q_{i} \Lambda_{i} Q_{i}^{T} &amp;lt;/math&amp;gt;. В действительности, они будут рекурсивно вычисляться тем же самым алгоритмом. Установим связь между собственными значениями матрицы Т и собственными значениями матриц&lt;br /&gt;
&amp;lt;math&amp;gt;T_{1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{2}&amp;lt;/math&amp;gt;. Имеем:&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;math&amp;gt; &lt;br /&gt;
T = \begin{bmatrix} T_{1} &amp;amp; 0 \\ 0 &amp;amp; T_{2}\end{bmatrix} + b_{m}vv^{T} &lt;br /&gt;
= \begin{bmatrix} Q_{1} \Lambda_{1} Q_{1}^{T} &amp;amp; 0 \\ 0 &amp;amp; Q_{2} L_{2} Q_{2}^{T}\end{bmatrix} + b_{m}vv^{T} &lt;br /&gt;
= \begin{bmatrix} Q_{1} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}\end{bmatrix}(\begin{bmatrix} \Lambda_{1} &amp;amp; \\  &amp;amp; \Lambda_{2}\end{bmatrix} + b_{m}vv^{T})\begin{bmatrix} Q_{1}^{T} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}^{T}\end{bmatrix}&lt;br /&gt;
  &amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &lt;br /&gt;
&lt;br /&gt;
  &amp;lt;math&amp;gt;&lt;br /&gt;
u = \begin{bmatrix} Q_{1}^{T} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}^{T}\end{bmatrix}v&lt;br /&gt;
  &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
так как &amp;lt;math&amp;gt;v = \begin{bmatrix} 0 , \ldots  ,  0 , 1 , 1 , 0 \ldots , 0 \end{bmatrix}^T&amp;lt;/math&amp;gt;, получим матрицу, состоящую из последнего столбца матрицы &amp;lt;math&amp;gt; Q_{1}^{T}&amp;lt;/math&amp;gt; и первого столбца матрицы &amp;lt;math&amp;gt; Q_{2}^{T}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Следовательно, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; имеет те же собственные значения, что и пдобная ей матрица &amp;lt;math&amp;gt;D + \rho uu^{T}&amp;lt;/math&amp;gt;, &lt;br /&gt;
где &amp;lt;math&amp;gt;D = \begin{bmatrix} L_{1} &amp;amp; 0 \\ 0 &amp;amp; L_{2}\end{bmatrix}&amp;lt;/math&amp;gt; - диагональная матрица, &lt;br /&gt;
&amp;lt;math&amp;gt;\rho = b_{m}&amp;lt;/math&amp;gt; - число, а &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; - вектор. &lt;br /&gt;
&lt;br /&gt;
Будем предполагать, не ограничивая общности, что диагональные элементы &amp;lt;math&amp;gt;d_{1}, \ldots, d_{n}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; упорядочены по убыванию: &amp;lt;math&amp;gt;d_{n} &amp;lt;= \ldots &amp;lt;=d_{1}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Чтобы найти собственные значения матрицы &amp;lt;math&amp;gt;D + \rho uu^{T}&amp;lt;/math&amp;gt;, вычислим её характеристический многочлен, считая пока матрицу &amp;lt;math&amp;gt;D - \lambda I&amp;lt;/math&amp;gt; невырожденной.&lt;br /&gt;
Тогда&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;math&amp;gt;det(D + \rho uu^{T} - \lambda I) = det((D - \lambda I)(I + \rho (D- \lambda I)^{-1} uu^{T}))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Поскольку &amp;lt;math&amp;gt;D - \lambda I&amp;lt;/math&amp;gt; невырожденна, &amp;lt;math&amp;gt;det(I + \rho (D - \lambda I)^{-1}uu^{T}) = 0&amp;lt;/math&amp;gt; тогда и только тогда, когда &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; - собственное значение. Заметим, что матрица &amp;lt;math&amp;gt;I + \rho (D - \lambda I)^{-1}uu^{T}&amp;lt;/math&amp;gt; получается из единичной добавлением матрицы ранга 1. Определитель такой матрицы легко вычислить.&lt;br /&gt;
&lt;br /&gt;
  &#039;&#039;&#039;Лемма 1.&#039;&#039;&#039; Справедливо равенство &amp;lt;math&amp;gt;det(I + xy^{T}) = 1 + y^{T}x&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; - векторы.&lt;br /&gt;
&lt;br /&gt;
Таким образом,&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;math&amp;gt;det(I + \rho (D - \lambda I)^{-1}uu^{T}) = 1 + \rho u^{T}(D - \lambda I)^{-1}u&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt; = 1 + \rho \sum_{i=1, n} \frac{u_{i}^{2}} {d_{i}-\lambda} \equiv f(\lambda)&amp;lt;/math&amp;gt; , &lt;br /&gt;
&lt;br /&gt;
т.е. собственные значения матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; есть корни так называемого векового уравнения &amp;lt;math&amp;gt;f(\lambda) = 0&amp;lt;/math&amp;gt;. Если все числа &amp;lt;math&amp;gt;d_{i}&amp;lt;/math&amp;gt; различны и все &amp;lt;math&amp;gt;u_{i} &amp;lt;&amp;gt; 0&amp;lt;/math&amp;gt; (случай общего положения), то &amp;lt;math&amp;gt;f(\lambda)&amp;lt;/math&amp;gt; имеет график типа показанного на рис.1(где &amp;lt;math&amp;gt;n = 4&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\rho &amp;gt; 0&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
[[File:Graphics.PNG|thumb|center|800px|Рис. 1. График функции &amp;lt;math&amp;gt; f(\lambda) = 1 + \frac{0.5}{1 - \lambda} + \frac{0.5}{2 - \lambda} + \frac{0.5}{3 - \lambda} + \frac{0.5}{4 - \lambda}&amp;lt;/math&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Можно видеть, что прямая &amp;lt;math&amp;gt;y = 1&amp;lt;/math&amp;gt; является горизонтальной асимптотой для этого графика, а прямые &amp;lt;math&amp;gt;\lambda = d_{i}&amp;lt;/math&amp;gt; есть вертикальные асимптоты. Поскольку &amp;lt;math&amp;gt;f^{&#039;}(\lambda) =  \rho \sum_{i=1, n} \frac{u_{i}^{2}} {(d_{i}-\lambda)^{2}}&amp;gt; 0 &amp;lt;/math&amp;gt;, функция возрастает всюду, кроме точек &amp;lt;math&amp;gt;\lambda = d_{i}&amp;lt;/math&amp;gt;. Поэтому корни функции разделяются числами &amp;lt;math&amp;gt;d_{i}&amp;lt;/math&amp;gt; и ещё один корень находится справа от точки &amp;lt;math&amp;gt;d_{1}&amp;lt;/math&amp;gt; (на рис. 1 &amp;lt;math&amp;gt;d_{1} = 4&amp;lt;/math&amp;gt;). (При &amp;lt;math&amp;gt;\rho&amp;lt;0&amp;lt;/math&amp;gt; функция &amp;lt;math&amp;gt;f(\lambda)&amp;lt;/math&amp;gt; всюду убывает и соответствующий корень находится слева от точки &amp;lt;math&amp;gt;d_{n}&amp;lt;/math&amp;gt;). Для функции &amp;lt;math&amp;gt;f(\lambda)&amp;lt;/math&amp;gt;, монотонной и гладкой на каждом из интервалов &amp;lt;math&amp;gt;(d_{i+1},d_{i})&amp;lt;/math&amp;gt;, можно найти вариант метода Ньютона, который быстро и монотонно сходится к каждому из корней, если начальная точка взята в &amp;lt;math&amp;gt;(d_{i+1},d_{i})&amp;lt;/math&amp;gt;. Нам достаточно знать, что на практике метод сходится к каждому собственному значению за ограниченное число шагов. Поскольку вычисление &amp;lt;math&amp;gt;f(\lambda)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;f^{&#039;}(\lambda)&amp;lt;/math&amp;gt; стоит &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; флопов, для вычисления одного собственного значения достаточно &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, а для вычисления всех &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; собственных значений матрицы &amp;lt;math&amp;gt;D + \rho uu^{T}&amp;lt;/math&amp;gt; требуется &amp;lt;math&amp;gt;O(n^{2})&amp;lt;/math&amp;gt; флопов.&lt;br /&gt;
Для собственных векторов матрицы &amp;lt;math&amp;gt;D + \rho uu^{T}&amp;lt;/math&amp;gt; мы легко можем получить явные выражения.&lt;br /&gt;
&lt;br /&gt;
  &#039;&#039;&#039;Лемма 2.&#039;&#039;&#039; Если &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; - собственное значение матрицы &amp;lt;math&amp;gt;D + \rho uu^{T}&amp;lt;/math&amp;gt;, то соответствующий вектор равен &amp;lt;math&amp;gt;(D - \alpha I)^{-1}u&amp;lt;/math&amp;gt;. Поскольку матрица &amp;lt;math&amp;gt;D - \alpha I&amp;lt;/math&amp;gt; диагональная, для вычисления такого вектора достаточно &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; флопов.&lt;br /&gt;
&lt;br /&gt;
Доказательство.&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;math&amp;gt;(D + \rho uu^{T})[(D - \alpha I)^{-1}u] = (D - \alpha I + \alpha I + \rho uu^{T})(D - \alpha I)^{-1}u&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;math&amp;gt;=u + \alpha (D - \alpha I)^{-1}u + u[\rho u^{T}(D - \alpha I)^{-1}u] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;math&amp;gt;=u + \alpha(D - \alpha I)^{-1}u - u&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
                                                       поскольку &amp;lt;math&amp;gt; \rho u^{T}(D - \alpha I)^{-1}u + 1 = f(\alpha) = 0 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;math&amp;gt;=\alpha [(D - \alpha I)^{-1}u]&amp;lt;/math&amp;gt;, что и требовалось.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для вычисления по этой простой формуле всех &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; собственных векторов требуется &amp;lt;math&amp;gt;O(n^{2})&amp;lt;/math&amp;gt; флопов. К сожалению, формула не обеспечивает численной устойчивости, так как для двух очень близких значений &amp;lt;math&amp;gt;\alpha_{i}&amp;lt;/math&amp;gt; может давать неортогональные приближенные собственные векторы &amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt;. Потребовалось целое десятилетие для того, чтобы найти устойчивую альтернативу исходному описанию алгоритма. Снова детали будут обсуждаться позднее в данном разделе. &lt;br /&gt;
&lt;br /&gt;
Алгоритм является рекурсивным.&lt;br /&gt;
&lt;br /&gt;
=== Дефляция ===&lt;br /&gt;
&lt;br /&gt;
До сих пор полагалось, что все &amp;lt;math&amp;gt;d_{i}&amp;lt;/math&amp;gt; различны и все &amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; отличны от нуля. Если это не так, вековое уравнение &amp;lt;math&amp;gt;f(\lambda)=0&amp;lt;/math&amp;gt; имеет &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; вертикальных асимптот, где &amp;lt;math&amp;gt;k&amp;lt;n&amp;lt;/math&amp;gt;, а потому &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; корней. Однако оказывается, что остальные &amp;lt;math&amp;gt;n - k&amp;lt;/math&amp;gt; собственных значений могут быть определены без каких-либо усилий: если &amp;lt;math&amp;gt;d_{i}=d_{i+1}&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;u_{i}=0&amp;lt;/math&amp;gt;, то легко показать, что &amp;lt;math&amp;gt;d_{i}&amp;lt;/math&amp;gt; является собственным значением и для матрицы &amp;lt;math&amp;gt;D + \rho uu^{T}&amp;lt;/math&amp;gt;. В такой ситуации мы говорим о &#039;&#039;дефляции&#039;&#039;. На практике выбирается некоторое пороговое значение и дефляция для числа &amp;lt;math&amp;gt;d_{i}&amp;lt;/math&amp;gt; регистрируется, если в смысле этого порога &amp;lt;math&amp;gt;d_{i}&amp;lt;/math&amp;gt; достаточно близко к &amp;lt;math&amp;gt;d_{i+1}&amp;lt;/math&amp;gt; либо &amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt; достаточно мало.&lt;br /&gt;
&lt;br /&gt;
Основной выигрыш от использования дефляции состоит не в том, что убыстряется решение векового уравнения - этот этап в любом случае стоит лишь &amp;lt;math&amp;gt;O(n^{2})&amp;lt;/math&amp;gt; операций. Выигрыш заключается в ускорении матричного умножения на последнем шаге алгоритма. Действительно, если &amp;lt;math&amp;gt;u_{i}=0&amp;lt;/math&amp;gt;, то соответствующий собственный вектор есть i-й столбец &amp;lt;math&amp;gt;e_{i}&amp;lt;/math&amp;gt; единичной матрицы. Это означает, что &amp;lt;math&amp;gt;e_{i}&amp;lt;/math&amp;gt; является i-м столбцом в матрице &amp;lt;math&amp;gt;Q_{&#039;}&amp;lt;/math&amp;gt;, поэтому при формировании матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; посредством левого умножения &amp;lt;math&amp;gt;Q_{1}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;Q_{2}&amp;lt;/math&amp;gt; вычисление i-го столбца не требует никаких затрат. Аналогичное упрощение имеет место в случае &amp;lt;math&amp;gt;d_{i} = d_{i+1}&amp;lt;/math&amp;gt;. При дефляции многих собственных значений устраняется большая часть работы, связанной с матричным умножением.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Вычислительным ядром последовательной схемы решения является вычисление матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; собственных векторов путём умножения матрицы &amp;lt;math&amp;gt;Q = \begin{bmatrix} Q_{1} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}\end{bmatrix}&amp;lt;/math&amp;gt; на матрицу &amp;lt;math&amp;gt;Q^{&#039;}&amp;lt;/math&amp;gt; Данная операция имеет сложность &amp;lt;math&amp;gt;cn^{3}&amp;lt;/math&amp;gt; о чём и говорится в разделе [[#Последовательная сложность алгоритма]] .&lt;br /&gt;
Ей предшествует вычисление собственных значений и векторов матрицы &amp;lt;math&amp;gt; D + \rho uu^{T}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
В разделе [[#Информационный граф]] описана структура алгоритма, в которой есть блок умножения матриц для вычисления собственных векторов, являющийся вычислительным ядром алгоритма. В соответствующем разделе ([[#Вычислительное ядро алгоритма]]) мы упоминали о том, что данному блоку предшествует вычисление собственных значений, которое производится [https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%9D%D1%8C%D1%8E%D1%82%D0%BE%D0%BD%D0%B0 методом Ньютона].&lt;br /&gt;
&lt;br /&gt;
=== Решение векового уравнения ===&lt;br /&gt;
Подробно стоит поговорить о решении векового уравнения, которое является одной из основных частей алгоритма.&lt;br /&gt;
&lt;br /&gt;
Предположим, что некоторое &amp;lt;math&amp;gt;u_{i}&amp;lt;/math&amp;gt;, хотя и мало, все же недостаточно мало для того, чтобы была зарегистрирована дефляция. В этом случае применение метода Ньютона к решению векового уравнения встречается с затруднениями. Вспомним, что пересчет приближённого решения &amp;lt;math&amp;gt;u_{j}&amp;lt;/math&amp;gt; уравнения &amp;lt;math&amp;gt;f(\lambda) = 0&amp;lt;/math&amp;gt; в методе Ньютона основан на следующих положениях:&lt;br /&gt;
&lt;br /&gt;
 1. Вблизи точки &amp;lt;math&amp;gt;\lambda = \lambda_{j}&amp;lt;/math&amp;gt; функция &amp;lt;math&amp;gt;f(\lambda)&amp;lt;/math&amp;gt; аппроксимируется линейной функцией &amp;lt;math&amp;gt;l(\lambda)&amp;lt;/math&amp;gt;; график есть прямая линия, касающаяся графика функции &amp;lt;math&amp;gt;f(\lambda)&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;\lambda = \lambda_{j}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 2. В качестве &amp;lt;math&amp;gt;\lambda_{j+1}&amp;lt;/math&amp;gt; берётся нуль этого линейного приближения, т.е. &amp;lt;math&amp;gt;l(\lambda_{j+1})=0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Функция, показанная на рис.1, не доставляет видимых трудностей методу Ньютона, поскольку вблизи каждого своего нуля &amp;lt;math&amp;gt;f(\lambda)&amp;lt;/math&amp;gt; достаточно хорошо аппроксимируется линейными функциями. Однако рассмотрим график функции на рис. 2. Она получена из функции на рис. 1 заменой значения .5 для &amp;lt;math&amp;gt;u_{i}^{2}&amp;lt;/math&amp;gt; на .001. Это новое значение недостаточно мало для того, чтобы вызвать дефляцию. График функции в левой части рис.2 визуально не отличим от её вертикальных и горизонтальных асимптот, поэтому в правой части укрупненно воспроизведён фрагмент графика, прилегающий к вертикальной асимптоте &amp;lt;math&amp;gt;\lambda = 2&amp;lt;/math&amp;gt;. Видно, что график слишком быстро &amp;quot;выполняет поворот&amp;quot; и для большей части значений &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; почти горизонтален. Поэтому, применяя метод Ньютона почти к любому начальному приближению &amp;lt;math&amp;gt;\lambda_{0}&amp;lt;/math&amp;gt;, мы получаем линейное приближение &amp;lt;math&amp;gt;l(\lambda)&amp;lt;/math&amp;gt; с почти горизонтальным графиком и малым положительным угловым коэффициентом. В результате &amp;lt;math&amp;gt;\lambda_{1}&amp;lt;/math&amp;gt; является отрицательным числом, огромным по абсолютной величине, которое совершенно бесполезно в качестве приближения к истинному корню.&lt;br /&gt;
&lt;br /&gt;
[[File:GraphNewton.png|thumb|center|800px|Рис. 2. График функции &amp;lt;math&amp;gt; f(\lambda) = 1 + \frac{10^{-3}}{1 - \lambda} + \frac{10^{-3}}{2 - \lambda} + \frac{10^{-3}}{3 - \lambda} + \frac{10^{-3}}{4 - \lambda}&amp;lt;/math&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Чтобы найти выход из этого положения, можно модифицировать метод Ньютона следующим образом: раз &amp;lt;math&amp;gt;f(\lambda)&amp;lt;/math&amp;gt; нельзя хорошо приблизить линейной функцией &amp;lt;math&amp;gt;l(\lambda)&amp;lt;/math&amp;gt;, попробуем взять в качестве приближения какую-нибудь другую простую функцию &amp;lt;math&amp;gt;h(\lambda)&amp;lt;/math&amp;gt;. Нет ничего особого именно в прямых линиях: для метода Ньютона вместо &amp;lt;math&amp;gt;l(\lambda)&amp;lt;/math&amp;gt; можно взять любое приближение &amp;lt;math&amp;gt;h(\lambda)&amp;lt;/math&amp;gt;, значения и нули которого легко вычисляются. Функция &amp;lt;math&amp;gt;f(\lambda)&amp;lt;/math&amp;gt; имеет полюсы в точках &amp;lt;math&amp;gt;d_{i}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;d_{i+1}&amp;lt;/math&amp;gt;, которые определяют её поведение в соответствующих окрестностях. Поэтому при поиске корня в интервале &amp;lt;math&amp;gt;(d_{i+1}, d_{i})&amp;lt;/math&amp;gt; естественно выбрать функцию &amp;lt;math&amp;gt;h(\lambda)&amp;lt;/math&amp;gt;, также имеющую эти полюсы, т.е. функцию вида&lt;br /&gt;
 &amp;lt;math&amp;gt;h(\lambda)= \frac{c_{1}}{d_{i}-\lambda} + \frac{c_{2}}{d_{i+1}-\lambda} + c_{3}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Константы &amp;lt;math&amp;gt;c_{1},c_{2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c_{3}&amp;lt;/math&amp;gt; обеспечивающие, что &amp;lt;math&amp;gt;h(\lambda)&amp;lt;/math&amp;gt; есть приближение к &amp;lt;math&amp;gt;f(\lambda)&amp;lt;/math&amp;gt;, можно выбрать несколькими способами. Отметим, что если &amp;lt;math&amp;gt;c_{1},c_{2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c_{3}&amp;lt;/math&amp;gt; уже известны, то уравнение &amp;lt;math&amp;gt;h(\lambda)=0&amp;lt;/math&amp;gt; легко решается относительно &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;, поскольку сводится к эквивалентному квадратному уравнению&lt;br /&gt;
 &amp;lt;math&amp;gt;c_{1}(d_{i+1}-\lambda)+c_{2}(d_{i}-\lambda)+c_{3}(d_{i}-\lambda)(d_{i+1}-\lambda)=0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;\lambda_{j}&amp;lt;/math&amp;gt; - приближённое значение корня. определим &amp;lt;math&amp;gt;c_{1},c_{2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c_{3}&amp;lt;/math&amp;gt; так, чтобы&lt;br /&gt;
 &amp;lt;math&amp;gt;\frac{c_{1}}{d_{i}-\lambda} + \frac{c_{2}}{d_{i+1}-\lambda} + c_{3} = h(\lambda) \approx f(\lambda) = 1 + \rho \sum_{k=1, n} \frac{u_{k}^{2}} {d_{k}-\lambda} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
для &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; в окрестности &amp;lt;math&amp;gt;\lambda_{j}&amp;lt;/math&amp;gt;. Заметим, что&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;f(\lambda) = 1 + \rho \sum_{k=1, i} \frac{u_{k}^{2}} {d_{k}-\lambda} + \rho \sum_{k=i+1, n} \frac{u_{k}^{2}} {d_{k}-\lambda} \equiv 1 + \psi_{1}(\lambda) + \psi_{2}(\lambda)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;\lambda \in (d_{i+1},d_{i})&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;\psi_{1}(\lambda)&amp;lt;/math&amp;gt; есть сумма положительных слагаемых, а &amp;lt;math&amp;gt;\psi_{2}(\lambda)&amp;lt;/math&amp;gt; - сумма отрицательных. Поэтому и &amp;lt;math&amp;gt;\psi_{1}(\lambda)&amp;lt;/math&amp;gt;, и &amp;lt;math&amp;gt;\psi_{2}(\lambda)&amp;lt;/math&amp;gt; могут быть вычислены с высокой точностью; однако при их сложении вполне вероятно взаимное уничтожение верных разрядов и потеря относительной точности в сумме. Возьмем числа &amp;lt;math&amp;gt;c_{1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\hat{c_{1}}&amp;lt;/math&amp;gt;, такие, что функция &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;h_{1}(\lambda) \equiv \hat{c_{1}} + \frac{c_{1}}{d_{i}-\lambda}&amp;lt;/math&amp;gt;   удовлетворяет условиям  &amp;lt;math&amp;gt;h_{1}(\lambda_{j}) = \psi_{1}(\lambda_{j})&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;h_{1}^{&#039;}(\lambda_{j})=\psi_{1}^{&#039;}(\lambda_{j})&amp;lt;/math&amp;gt; (1)&lt;br /&gt;
&lt;br /&gt;
Это означает, что гипербола, являющаяся графиком функции &amp;lt;math&amp;gt;h_{1}(\lambda)&amp;lt;/math&amp;gt;, касается графика функции &amp;lt;math&amp;gt;\psi_{i}(\lambda)&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;\lambda = \lambda_{j}&amp;lt;/math&amp;gt;. Два условия в (1) - это обычные условия метода Ньютона, за исключением того, что вместо прямой в качестве приближения используется гипербола. Легко проверить, что &amp;lt;math&amp;gt;c_{1}=\psi_{1}^{&#039;}(\lambda_{j})(d_{i} - \lambda_{j})^{2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\hat{c_{1}}=\psi_{1}(\lambda_{j}) - \psi_{1}^{&#039;}(\lambda_{j})(d_{i} - \lambda_{j})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Подобным же образом выбираем &amp;lt;math&amp;gt;c_{2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\hat{c_{2}}&amp;lt;/math&amp;gt; так, чтобы функция &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;h_{2}(\lambda) \equiv \hat{c_{2}} + \frac{c_{2}}{d_{i+1}-\lambda}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Удовлетворяла условиям&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;math&amp;gt;h_{2}(\lambda_{j}) = \psi_{2}(\lambda_{j})&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;h_{2}^{&#039;}(\lambda_{j})=\psi_{2}^{&#039;}(\lambda_{j})&amp;lt;/math&amp;gt; (2)&lt;br /&gt;
&lt;br /&gt;
Наконец, полагаем&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;h(\lambda) = 1 + h_{1}(\lambda) + h_{2}(\lambda) = (1 + \hat{c_{1}} + \hat{c_{2}} + \frac{c_{1}}{d_{i}-\lambda} + \frac{c_{2}}{d_{i+1}-\lambda} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;\equiv c_{3} + \frac{c_{1}}{d_{i}-\lambda} + \frac{c_{2}}{d_{i+1}-\lambda}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&#039;&#039;Вычисление собственных значений и собственных векторов симметричной трехдиагональной матрицы посредством стратегии &amp;quot;разделяй и властвуй&amp;quot;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;proc dc_eig&#039;&#039;&amp;lt;math&amp;gt;(T,Q,\Lambda)...&amp;lt;/math&amp;gt; по входной матрице &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; вычисляются выходные матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, такие, что &amp;lt;math&amp;gt;T = Q\Lambda Q^{T}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Если &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; - матрица размера &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; x &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
  1. Присвоить выходным параметрам значения &amp;lt;math&amp;gt; Q = 1, \Lambda = T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Иначе&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
  1. Представить &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; в виде &amp;lt;math&amp;gt; T = \begin{bmatrix} T_{1} &amp;amp; 0 \\ 0 &amp;amp; T_{2}\end{bmatrix} + b_{m}vv^{T} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  2. &#039;&#039;call dc_eig&#039;&#039;&amp;lt;math&amp;gt;(T_{1},Q_{1},\Lambda_{1})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  3. &#039;&#039;call dc_eig&#039;&#039;&amp;lt;math&amp;gt;(T_{2},Q_{2},\Lambda_{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  4. Построить &amp;lt;math&amp;gt;D+\rho uu^{T}&amp;lt;/math&amp;gt; по &amp;lt;math&amp;gt; \Lambda_{1},\Lambda_{2}, Q_{1}, Q_{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  5. Найти матрицу собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  6. Найти матрицу собственных векторов &amp;lt;math&amp;gt;Q^{&#039;}&amp;lt;/math&amp;gt; для матрицы &amp;lt;math&amp;gt;D+\rho uu^{T}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  7. Построить матрицу собственных векторов &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; для матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; : &amp;lt;math&amp;gt; Q = \begin{bmatrix} Q_{1} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}\end{bmatrix}* Q^{&#039;} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  8. Присвоить выходным параметрам значения &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;endif&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Проанализируем сложность алгоритма. Пусть &amp;lt;math&amp;gt;t(n)&amp;lt;/math&amp;gt; - число флопов при обработке матрицы размера &amp;lt;math&amp;gt; n x n&amp;lt;/math&amp;gt; процедурой &#039;&#039;dc_eig&#039;&#039;. Тогда &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; t(n) = 2t(n/2) &amp;lt;/math&amp;gt; два рекурсивных обращения к &#039;&#039;dc_eig&#039;&#039;&amp;lt;math&amp;gt;(T_{i},Q_{i},\Lambda_{i})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; +O(n^{2})&amp;lt;/math&amp;gt; вычисление собственных значений матрицы &amp;lt;math&amp;gt;D+\rho uu^{T}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; +O(n^{2})&amp;lt;/math&amp;gt; вычисление собственных векторов матрицы &amp;lt;math&amp;gt;D+\rho uu^{T}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; +c*n^{3}&amp;lt;/math&amp;gt; вычисление матрицы &amp;lt;math&amp;gt;Q = \begin{bmatrix} Q_{1} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}\end{bmatrix}*Q^{&#039;}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt; Q_{1}, Q_{2}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Q^{&#039;}&amp;lt;/math&amp;gt; рассматриваются как плотные матрицы и используется стандартный алгоритм матричного умножения, то константа &amp;lt;math&amp;gt; c &amp;lt;/math&amp;gt; в последней строке равна 1. Таким образом, именно это умножение составляет наиболее трудоёмкую часть алгоритма в целом. Игнорируя члены порядка &amp;lt;math&amp;gt;n^{2}&amp;lt;/math&amp;gt;, получаем &amp;lt;math&amp;gt;t(n) = 2t(n/2) + cn^{3}&amp;lt;/math&amp;gt;. Решая это разностное уравнение, находим &amp;lt;math&amp;gt; t \approx c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На практике константа &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; обычно гораздо меньше 1, потому что матрица &amp;lt;math&amp;gt;Q^{&#039;}&amp;lt;/math&amp;gt; весьма разрежена вследствие явления, называемого дефляцией.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
В данном разделе представлен информационный граф алгоритма: на рисунке 3 изображена часть алгоритма, в которой происходит деление - &amp;quot;Divide&amp;quot;, а на рисунке 4 описана часть &amp;quot;Conquer&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[File:Divide.jpg|thumb|center|left|800px|Рис. 3. Информационный граф алгоритма &amp;quot;Разделяй и властвуй&amp;quot; - шаг &amp;lt;b&amp;gt;Divide&amp;lt;/b&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
[[File:ConquerPart.jpg|thumb|center|1200px|Рис. 4. Информационный граф алгоритма &amp;quot;Разделяй и властвуй&amp;quot; - шаг &amp;lt;b&amp;gt;Conquer&amp;lt;/b&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Операции: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; - операция Divide разделения матрицы &amp;lt;math&amp;gt; T &amp;lt;/math&amp;gt; на матрицы &amp;lt;math&amp;gt;T_{1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Индексы - размерность &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;S_{k}&amp;lt;/math&amp;gt; - операция Conquer сбора матрицы &amp;lt;math&amp;gt; D &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; L &amp;lt;/math&amp;gt; - операция поиска собственных значений &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; S^{&#039;} &amp;lt;/math&amp;gt; - операция поиска собственных векторов матрицы &amp;lt;math&amp;gt; Q^{&#039;} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; S &amp;lt;/math&amp;gt; - операция поиска собственных векторов матрицы &amp;lt;math&amp;gt; Q &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Рассмотрев информационный граф алгоритма, можно заметить, что в структуре имеется два параллельных блока - вызов рекурсивных функций &#039;&#039;dc_eig&#039;&#039; для вычисления собственных значений и векторов матриц &amp;lt;math&amp;gt;T_{1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T_{2}&amp;lt;/math&amp;gt; - это единственная часть алгоритма, в которой мы прибегаем к параллелизму. В случае реализации без параллелизма, функции &#039;&#039;dc_eig&#039;&#039; отрабатывают последовательно - сначала со входными параметрами &amp;lt;math&amp;gt;T_{1}, Q_{1}, \Lambda_{1}&amp;lt;/math&amp;gt;, затем - &amp;lt;math&amp;gt;T_{2}, Q_{2}, \Lambda_{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
На вход алгоритму подаётся трёхдиагональная матрица, описанная в разделе [[#Математическое описание алгоритма]]&lt;br /&gt;
&lt;br /&gt;
На выходе мы получаем собственные значения и собственные вектора исходной матрицы&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Описанный в данной статье алгоритм является самым быстрым алгоритмом, среди существующих: QR / Бисекция и обратная итерация / Разделяй и властвуй.&lt;br /&gt;
&lt;br /&gt;
Последовательная сложность алгоритма: &amp;lt;math&amp;gt; t = c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параллельная сложность алгоритма (в силу использования дефляции): &amp;lt;math&amp;gt; O(n^{2.3)}&amp;lt;/math&amp;gt;  или в самых редких случаях &amp;lt;math&amp;gt; O(n^{2}) &amp;lt;/math&amp;gt; (см. [3] стр. 8).&lt;br /&gt;
&lt;br /&gt;
Особенности алгоритма:&lt;br /&gt;
&lt;br /&gt;
1. Использование дефляции ([[#Дефляция]])&lt;br /&gt;
&lt;br /&gt;
2. Использование адаптированного метода Ньютона ([[#Макроструктура алгоритма]])&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
Вторая часть описания алгоритмов в рамках AlgoWiki рассматривает все составные части процесса их реализации. Рассматривается как последовательная реализация алгоритма, так и параллельная. Описывается взаимосвязь свойств программ, реализующих алгоритм, и особенностей архитектуры компьютера, на которой они выполняются. Исследуется работа с памятью, локальность данных и вычислений, описывается масштабируемость и эффективность параллельных программ, производительность компьютеров, достигаемая на данной программе. Обсуждаются особенности реализации для разных классов архитектур компьютеров, приводятся ссылки на реализации в существующих библиотеках.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
TBD&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Большого количества реализаций данного алгоритма найдено не было: единственный пример описан на страницах 7, 19 и 20 в [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf этой статье], которая указана в списке литературы.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Дж. Деммель, «Вычислительная линейная алгебра» //С. 230-235&lt;br /&gt;
&lt;br /&gt;
[2] [http://www.netlib.org/utk/people/JackDongarra/PAPERS/104_1999_a-parallel-divide-and-conquer-algorithm.pdf Francoise Tisseury, Jack Dongarra, A Parallel Divide and Conquer Algorithm for the Symmetric Eigenvalue Problem on Distributed Memory Architectures]&lt;br /&gt;
&lt;br /&gt;
[3] [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures]&lt;br /&gt;
&lt;br /&gt;
[4] [https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm Алгоритм &amp;quot;Разделяй и властвуй&amp;quot; - Wikipedia]&lt;br /&gt;
&lt;br /&gt;
[5] [http://www.cscamm.umd.edu/tadmor/pub/linear-stability/Gill_Tadmor_SISC90.pdf Doron Grill and Eitan Tadmor AN &amp;lt;math&amp;gt;O(N2)&amp;lt;/math&amp;gt; METHOD FOR COMPUTING THE EIGENSYSTEM OF &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; SYMMETRIC TRIDIAGONAL MATRICES BY THE DIVIDE AND CONQUER APPROACH]&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>Bobru</name></author>
	</entry>
</feed>