<?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=NikoSergAlex</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=NikoSergAlex"/>
	<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/NikoSergAlex"/>
	<updated>2026-10-22T20:10:07Z</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=21521</id>
		<title>Участник:Vika3410/Метод Разделяй и властвуй</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=21521"/>
		<updated>2016-12-31T12:37:54Z</updated>

		<summary type="html">&lt;p&gt;NikoSergAlex: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи: [[Участник:NikoSergAlex|Сергеев Никита]] (группа 614) (1.1, 1.2, 1.5, 1.6, 1.7, 1.8, 1.10, 2.4), [[Участница:Vika3410|Стрельцова Виктория]] (группа 614) (1.2, 1.3, 1.4, 1.6, 1.7, 1.9, 1.10, 2.4)&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод &amp;quot;Разделяй и властвуй&amp;quot; вычисления собственных значений и векторов трёхдиагональной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
| parallel_complexity = &amp;lt;math&amp;gt; O(n^{2.3}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
крайне редко: &amp;lt;math&amp;gt;  O(n^{2}) &amp;lt;/math&amp;gt; &lt;br /&gt;
| pf_width          = &lt;br /&gt;
| input_data        =  &amp;lt;math&amp;gt; 2n + 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       =  &amp;lt;math&amp;gt; n(n + 1) &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;
&#039;&#039;&#039;Метод разделяй и властвуй вычисления собственных значений и векторов трёхдиагональной матрицы&#039;&#039;&#039; - является наиболее быстрым из существующих методов вычисления всех собственных значений и собственных векторов трехдиагональной матрицы, начиная с порядка n, который примерно равен 26. (Точное значение этого порогового порядка в конкретном случае зависит от компьютера.) &lt;br /&gt;
&lt;br /&gt;
Численно устойчивая реализация данного метода весьма не тривиальна, так как не смотря на то, что впервые метод был предложен в 1981 г., &amp;quot;правильный&amp;quot; способ реализации метода был найден лишь в 1992 г. Этот способ был воплощен при помощи LAPACK-программ ssyevd (для плотных матриц) и sstevd (для трехдиагональных матриц). В этих программах стратегия &amp;quot;разделяй-и-влавствуй&amp;quot; используется для матриц порядка выше 25. &lt;br /&gt;
&lt;br /&gt;
Для матриц порядка ниже 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;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&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;
&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;
&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;
где &amp;lt;math&amp;gt; u = \begin{bmatrix} Q_{1}^{T} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}^{T}\end{bmatrix}v &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;, так как &amp;lt;math&amp;gt;v = \begin{bmatrix} 0 , \ldots  ,  0 , 1 , 1 , 0 \ldots , 0 \end{bmatrix}^T&amp;lt;/math&amp;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;
В дальнейшем предполагаем, не ограничивая общности, что диагональные элементы &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;
&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;Лемма 1.&#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;
&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:Сергеев 1.jpg|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;Лемма 2.&#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;
&amp;lt;math&amp;gt;(D + \rho uu^{T})[(D - \alpha I)^{-1}u] = &lt;br /&gt;
&lt;br /&gt;
(D - \alpha I + \alpha I + \rho uu^{T})(D - \alpha I)^{-1}u = &lt;br /&gt;
&lt;br /&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 = \alpha [(D - \alpha I)^{-1}u]&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&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;
Что и требовалось доказать.&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;
До сих пор полагалось, что все &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;&#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;
Далее пойдет речь о решении &#039;&#039;&#039;векового уравнения&#039;&#039;&#039;, которое является одной из основных частей алгоритма.&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:Сергеев 2.jpg|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;
для &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;
&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;
&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; (*)&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;. Два условия в (*) - это обычные условия метода Ньютона, за исключением того, что вместо прямой в качестве приближения используется гипербола. Легко проверить, что &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;
&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;
&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;&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} \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;
Вычислительным ядром последовательной схемы решения будет являться вычисление матрицы &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;
&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;
Рассмотрим каким именно образом происходит вычисление собственных значений и собственных векторов симметричной трехдиагональной матрицы при помощи стратегии &amp;quot;разделяй и властвуй&amp;quot;:&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;если&#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; :&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 * &lt;br /&gt;
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;
         &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;
         &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;
         &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 изображена структура алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[File:Sergeev_5.png|thumb|center|left|1000px|Рис. 3. Дерево алгоритма &amp;quot;Разделяй и властвуй&amp;quot;]]&lt;br /&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; - это единственная часть алгоритма, в которой возможно использовать параллелизм. &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;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;
Таким образом, благодаря параллелизму высота алгоритма параллельного составляет &amp;lt;math&amp;gt;log_{2}(n)&amp;lt;/math&amp;gt;, тогда как при последовательной реализации высота алгоритма равна сумме геометрической прогрессии &amp;lt;math&amp;gt;1+2+4+8+...+2^{n-1} = 2^{n} - 1&amp;lt;/math&amp;gt;, что значительно сокращает число итераций алгоритма.&lt;br /&gt;
&lt;br /&gt;
Поскольку функции являются рекурсивными, их параллельный вызов даст значительный выигрыш во времени.&lt;br /&gt;
&lt;br /&gt;
При размерности матрицы больше 3 параллельная реализация позволяет сократить количество этапов работы алгоритма больше, чем в два раза.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: трёхдиагональная симметрическая матрица, описанная в разделе [[#Математическое описание алгоритма]].&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;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; 2n + 1 &amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/под диагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: Вектор собственных значений длины &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; и  &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; собственных векторов длины &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; , соответствующих собственным значениям исходной матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n(n + 1) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Данный алгоритм является самым быстрым алгоритмом среди существующих: Разделяй и властвуй, QR, Бисекция и обратная итерация.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Последовательная сложность данного алгоритма:&#039;&#039;&#039; &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;t(n) = n^3 +2t(\frac{n}{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параллельная сложность алгоритма (за счет дефляции):&#039;&#039;&#039; &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;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Особенности алгоритма:&#039;&#039;&#039;&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;
Тестирование реализации алгоритма проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; с использованием 1, 2, 4, 8, 16 процессоров на матрицах размера от 4 до 4096. Реализация произведена на библиотеке OpenMP.&lt;br /&gt;
&lt;br /&gt;
Общая эффективность программы увеличивается при увеличении числа процессоров (за счет сокращения времени работы программы) и уменьшается при увеличении размера матрицы (за счет увеличения времени обработки входных данных). При одновременном увеличении числа процессоров и размерности матрицы общая эффективность падает.&lt;br /&gt;
&lt;br /&gt;
Ниже приведена схема зависимости времени работы программы от размера матрицы при разном числе процессоров. При размере матрицы от 4 до 1024 время работы очень мало, поэтому эти данные не указаны на схеме.&lt;br /&gt;
&lt;br /&gt;
[[File:DivAndConq11.png|thumb|center|left|1000px|Рис. 4. Зависимость времени работы от размера матрицы]]&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
&lt;br /&gt;
 ssh compiler &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add openmpi/1.5.5-icc&lt;br /&gt;
 g++ _scratch/DivideAndConquer.c++ -fopenmp -std=c++0x -o DC &lt;br /&gt;
 sbatch -p test -n1 run ./DC&lt;br /&gt;
&lt;br /&gt;
Код реализации: https://drive.google.com/open?id=0B0G2UV7cuLwHQk9xd1lyeDNJOXc&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Единственный найденный пример реализации описан в [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot; ]   ([3] с. 7, 19-20).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[1] Дж. Деммель, «Вычислительная линейная алгебра» //С. 230-235&lt;br /&gt;
&lt;br /&gt;
[2] [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;
[3] [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;
[4] [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;
[5] [https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm Алгоритм &amp;quot;Разделяй и властвуй&amp;quot; - Wikipedia]&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>NikoSergAlex</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=21520</id>
		<title>Участник:Vika3410/Метод Разделяй и властвуй</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=21520"/>
		<updated>2016-12-31T11:59:16Z</updated>

		<summary type="html">&lt;p&gt;NikoSergAlex: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи: [[Участник:NikoSergAlex|Сергеев Никита]] (группа 614) (1.1, 1.2, 1.5, 1.6, 1.7, 1.8, 1.10, 2.4), [[Участница:Vika3410|Стрельцова Виктория]] (группа 614) (1.2, 1.3, 1.4, 1.6, 1.7, 1.9, 1.10, 2.4)&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод &amp;quot;Разделяй и властвуй&amp;quot; вычисления собственных значений и векторов трёхдиагональной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
| parallel_complexity = &amp;lt;math&amp;gt; O(n^{2.3}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
крайне редко: &amp;lt;math&amp;gt;  O(n^{2}) &amp;lt;/math&amp;gt; &lt;br /&gt;
| pf_width          = &lt;br /&gt;
| input_data        =  &amp;lt;math&amp;gt; 2n + 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       =  &amp;lt;math&amp;gt; n(n + 1) &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;
&#039;&#039;&#039;Метод разделяй и властвуй вычисления собственных значений и векторов трёхдиагональной матрицы&#039;&#039;&#039; - является наиболее быстрым из существующих методов вычисления всех собственных значений и собственных векторов трехдиагональной матрицы, начиная с порядка n, который примерно равен 26. (Точное значение этого порогового порядка в конкретном случае зависит от компьютера.) &lt;br /&gt;
&lt;br /&gt;
Численно устойчивая реализация данного метода весьма не тривиальна, так как не смотря на то, что впервые метод был предложен в 1981 г., &amp;quot;правильный&amp;quot; способ реализации метода был найден лишь в 1992 г. Этот способ был воплощен при помощи LAPACK-программ ssyevd (для плотных матриц) и sstevd (для трехдиагональных матриц). В этих программах стратегия &amp;quot;разделяй-и-влавствуй&amp;quot; используется для матриц порядка выше 25. &lt;br /&gt;
&lt;br /&gt;
Для матриц порядка ниже 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;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&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;
&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;
&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;
где &amp;lt;math&amp;gt; u = \begin{bmatrix} Q_{1}^{T} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}^{T}\end{bmatrix}v &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;, так как &amp;lt;math&amp;gt;v = \begin{bmatrix} 0 , \ldots  ,  0 , 1 , 1 , 0 \ldots , 0 \end{bmatrix}^T&amp;lt;/math&amp;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;
В дальнейшем предполагаем, не ограничивая общности, что диагональные элементы &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;
&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;Лемма 1.&#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;
&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:Сергеев 1.jpg|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;Лемма 2.&#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;
&amp;lt;math&amp;gt;(D + \rho uu^{T})[(D - \alpha I)^{-1}u] = &lt;br /&gt;
&lt;br /&gt;
(D - \alpha I + \alpha I + \rho uu^{T})(D - \alpha I)^{-1}u = &lt;br /&gt;
&lt;br /&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 = \alpha [(D - \alpha I)^{-1}u]&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&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;
Что и требовалось доказать.&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;
До сих пор полагалось, что все &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;&#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;
Далее пойдет речь о решении &#039;&#039;&#039;векового уравнения&#039;&#039;&#039;, которое является одной из основных частей алгоритма.&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:Сергеев 2.jpg|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;
для &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;
&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;
&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; (*)&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;. Два условия в (*) - это обычные условия метода Ньютона, за исключением того, что вместо прямой в качестве приближения используется гипербола. Легко проверить, что &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;
&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;
&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;&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} \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;
Вычислительным ядром последовательной схемы решения будет являться вычисление матрицы &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;
&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;
Рассмотрим каким именно образом происходит вычисление собственных значений и собственных векторов симметричной трехдиагональной матрицы при помощи стратегии &amp;quot;разделяй и властвуй&amp;quot;:&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;если&#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; :&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 * &lt;br /&gt;
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;
         &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;
         &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;
         &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 изображена структура алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[File:Сергеев 5.jpg|thumb|center|left|1000px|Рис. 3. Дерево алгоритма &amp;quot;Разделяй и властвуй&amp;quot;]]&lt;br /&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; - это единственная часть алгоритма, в которой возможно использовать параллелизм. &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;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;
Таким образом, благодаря параллелизму высота алгоритма параллельного составляет &amp;lt;math&amp;gt;log_{2}(n)&amp;lt;/math&amp;gt;, тогда как при последовательной реализации высота алгоритма равна сумме геометрической прогрессии &amp;lt;math&amp;gt;1+2+4+8+...+2^{n-1} = 2^{n} - 1&amp;lt;/math&amp;gt;, что значительно сокращает число итераций алгоритма.&lt;br /&gt;
&lt;br /&gt;
Поскольку функции являются рекурсивными, их параллельный вызов даст значительный выигрыш во времени.&lt;br /&gt;
&lt;br /&gt;
При размерности матрицы больше 3 параллельная реализация позволяет сократить количество этапов работы алгоритма больше, чем в два раза.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: трёхдиагональная симметрическая матрица, описанная в разделе [[#Математическое описание алгоритма]].&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;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; 2n + 1 &amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/под диагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: Вектор собственных значений длины &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; и  &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; собственных векторов длины &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; , соответствующих собственным значениям исходной матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n(n + 1) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Данный алгоритм является самым быстрым алгоритмом среди существующих: Разделяй и властвуй, QR, Бисекция и обратная итерация.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Последовательная сложность данного алгоритма:&#039;&#039;&#039; &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;t(n) = n^3 +2t(\frac{n}{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параллельная сложность алгоритма (за счет дефляции):&#039;&#039;&#039; &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;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Особенности алгоритма:&#039;&#039;&#039;&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;
Тестирование реализации алгоритма проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; с использованием 1, 2, 4, 8, 16 процессоров на матрицах размера от 4 до 4096. Реализация произведена на библиотеке OpenMP.&lt;br /&gt;
&lt;br /&gt;
Общая эффективность программы увеличивается при увеличении числа процессоров (за счет сокращения времени работы программы) и уменьшается при увеличении размера матрицы (за счет увеличения времени обработки входных данных). При одновременном увеличении числа процессоров и размерности матрицы общая эффективность падает.&lt;br /&gt;
&lt;br /&gt;
Ниже приведена схема зависимости времени работы программы от размера матрицы при разном числе процессоров. При размере матрицы от 4 до 1024 время работы очень мало, поэтому эти данные не указаны на схеме.&lt;br /&gt;
&lt;br /&gt;
[[File:DivAndConq11.png|thumb|center|left|1000px|Рис. 4. Зависимость времени работы от размера матрицы]]&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
&lt;br /&gt;
 ssh compiler &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add openmpi/1.5.5-icc&lt;br /&gt;
 g++ _scratch/DivideAndConquer.c++ -fopenmp -std=c++0x -o DC &lt;br /&gt;
 sbatch -p test -n1 run ./DC&lt;br /&gt;
&lt;br /&gt;
Код реализации: https://drive.google.com/open?id=0B0G2UV7cuLwHQk9xd1lyeDNJOXc&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Единственный найденный пример реализации описан в [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot; ]   ([3] с. 7, 19-20).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[1] Дж. Деммель, «Вычислительная линейная алгебра» //С. 230-235&lt;br /&gt;
&lt;br /&gt;
[2] [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;
[3] [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;
[4] [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;
[5] [https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm Алгоритм &amp;quot;Разделяй и властвуй&amp;quot; - Wikipedia]&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>NikoSergAlex</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=21519</id>
		<title>Участник:Vika3410/Метод Разделяй и властвуй</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=21519"/>
		<updated>2016-12-31T11:04:34Z</updated>

		<summary type="html">&lt;p&gt;NikoSergAlex: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи: [[Участник:NikoSergAlex|Сергеев Никита]] (группа 614) (1.1, 1.2, 1.5, 1.6, 1.7, 1.8, 1.10, 2.4), [[Участница:Vika3410|Стрельцова Виктория]] (группа 614) (1.2, 1.3, 1.4, 1.6, 1.7, 1.9, 1.10, 2.4)&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод &amp;quot;Разделяй и властвуй&amp;quot; вычисления собственных значений и векторов трёхдиагональной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
| parallel_complexity = &amp;lt;math&amp;gt; O(n^{2.3}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
крайне редко: &amp;lt;math&amp;gt;  O(n^{2}) &amp;lt;/math&amp;gt; &lt;br /&gt;
| pf_width          = &lt;br /&gt;
| input_data        =  &amp;lt;math&amp;gt; 2n + 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       =  &amp;lt;math&amp;gt; n(n + 1) &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;
&#039;&#039;&#039;Метод разделяй и властвуй вычисления собственных значений и векторов трёхдиагональной матрицы&#039;&#039;&#039; - является наиболее быстрым из существующих методов вычисления всех собственных значений и собственных векторов трехдиагональной матрицы, начиная с порядка n, который примерно равен 26. (Точное значение этого порогового порядка в конкретном случае зависит от компьютера.) &lt;br /&gt;
&lt;br /&gt;
Численно устойчивая реализация данного метода весьма не тривиальна, так как не смотря на то, что впервые метод был предложен в 1981 г., &amp;quot;правильный&amp;quot; способ реализации метода был найден лишь в 1992 г. Этот способ был воплощен при помощи LAPACK-программ ssyevd (для плотных матриц) и sstevd (для трехдиагональных матриц). В этих программах стратегия &amp;quot;разделяй-и-влавствуй&amp;quot; используется для матриц порядка выше 25. &lt;br /&gt;
&lt;br /&gt;
Для матриц порядка ниже 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;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&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;
&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;
&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;
где &amp;lt;math&amp;gt; u = \begin{bmatrix} Q_{1}^{T} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}^{T}\end{bmatrix}v &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;, так как &amp;lt;math&amp;gt;v = \begin{bmatrix} 0 , \ldots  ,  0 , 1 , 1 , 0 \ldots , 0 \end{bmatrix}^T&amp;lt;/math&amp;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;
В дальнейшем предполагаем, не ограничивая общности, что диагональные элементы &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;
&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;Лемма 1.&#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;
&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:Сергеев 1.jpg|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;Лемма 2.&#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;
&amp;lt;math&amp;gt;(D + \rho uu^{T})[(D - \alpha I)^{-1}u] = &lt;br /&gt;
&lt;br /&gt;
(D - \alpha I + \alpha I + \rho uu^{T})(D - \alpha I)^{-1}u = &lt;br /&gt;
&lt;br /&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 = \alpha [(D - \alpha I)^{-1}u]&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&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;
Что и требовалось доказать.&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;
До сих пор полагалось, что все &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;&#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;
Далее пойдет речь о решении &#039;&#039;&#039;векового уравнения&#039;&#039;&#039;, которое является одной из основных частей алгоритма.&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:Сергеев 2.jpg|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;
для &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;
&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;
&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; (*)&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;. Два условия в (*) - это обычные условия метода Ньютона, за исключением того, что вместо прямой в качестве приближения используется гипербола. Легко проверить, что &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;
&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;
&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;&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} \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;
Вычислительным ядром последовательной схемы решения будет являться вычисление матрицы &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;
&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;
Рассмотрим каким именно образом происходит вычисление собственных значений и собственных векторов симметричной трехдиагональной матрицы при помощи стратегии &amp;quot;разделяй и властвуй&amp;quot;:&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;если&#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; :&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 * &lt;br /&gt;
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;
         &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;
         &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;
         &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 изображена структура алгоритма.&lt;br /&gt;
[[File:Сергеев 5.jpg|thumb|center|left|1000px|Рис. 3. Дерево алгоритма &amp;quot;Разделяй и властвуй&amp;quot;]]&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; - это единственная часть алгоритма, в которой возможно использовать параллелизм. &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;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;
Таким образом, благодаря параллелизму высота алгоритма параллельного составляет &amp;lt;math&amp;gt;log_{2}(n)&amp;lt;/math&amp;gt;, тогда как при последовательной реализации высота алгоритма равна сумме геометрической прогрессии &amp;lt;math&amp;gt;1+2+4+8+...+2^{n-1} = 2^{n} - 1&amp;lt;/math&amp;gt;, что значительно сокращает число итераций алгоритма.&lt;br /&gt;
&lt;br /&gt;
Поскольку функции являются рекурсивными, их параллельный вызов даст значительный выигрыш во времени.&lt;br /&gt;
&lt;br /&gt;
При размерности матрицы больше 3 параллельная реализация позволяет сократить количество этапов работы алгоритма больше, чем в два раза.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: трёхдиагональная симметрическая матрица, описанная в разделе [[#Математическое описание алгоритма]].&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;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; 2n + 1 &amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/под диагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: Вектор собственных значений длины &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; и  &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; собственных векторов длины &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; , соответствующих собственным значениям исходной матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n(n + 1) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Данный алгоритм является самым быстрым алгоритмом среди существующих: Разделяй и властвуй, QR, Бисекция и обратная итерация.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Последовательная сложность данного алгоритма:&#039;&#039;&#039; &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;t(n) = n^3 +2t(\frac{n}{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параллельная сложность алгоритма (за счет дефляции):&#039;&#039;&#039; &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;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Особенности алгоритма:&#039;&#039;&#039;&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;
Тестирование реализации алгоритма проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; с использованием 1, 2, 4, 8, 16 процессоров на матрицах размера от 4 до 4096. Реализация произведена на библиотеке OpenMP.&lt;br /&gt;
&lt;br /&gt;
Общая эффективность программы увеличивается при увеличении числа процессоров (за счет сокращения времени работы программы) и уменьшается при увеличении размера матрицы (за счет увеличения времени обработки входных данных). При одновременном увеличении числа процессоров и размерности матрицы общая эффективность падает.&lt;br /&gt;
&lt;br /&gt;
Ниже приведена схема зависимости времени работы программы от размера матрицы при разном числе процессоров. При размере матрицы от 4 до 1024 время работы очень мало, поэтому эти данные не указаны на схеме.&lt;br /&gt;
&lt;br /&gt;
[[File:DivAndConq11.png|thumb|center|left|1000px|Рис. 4. Зависимость времени работы от размера матрицы]]&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
&lt;br /&gt;
 ssh compiler &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add openmpi/1.5.5-icc&lt;br /&gt;
 g++ _scratch/DivideAndConquer.c++ -fopenmp -std=c++0x -o DC &lt;br /&gt;
 sbatch -p test -n1 run ./DC&lt;br /&gt;
&lt;br /&gt;
Код реализации: https://drive.google.com/open?id=0B0G2UV7cuLwHQk9xd1lyeDNJOXc&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Единственный найденный пример реализации описан в [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot; ]   ([3] с. 7, 19-20).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[1] Дж. Деммель, «Вычислительная линейная алгебра» //С. 230-235&lt;br /&gt;
&lt;br /&gt;
[2] [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;
[3] [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;
[4] [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;
[5] [https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm Алгоритм &amp;quot;Разделяй и властвуй&amp;quot; - Wikipedia]&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>NikoSergAlex</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=21518</id>
		<title>Участник:Vika3410/Метод Разделяй и властвуй</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=21518"/>
		<updated>2016-12-31T11:04:07Z</updated>

		<summary type="html">&lt;p&gt;NikoSergAlex: /* Макроструктура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи: [[Участник:NikoSergAlex|Сергеев Никита]] (группа 614) (1.1, 1.2, 1.5, 1.6, 1.7, 1.8, 1.10, 2.4), [[Участница:Vika3410|Стрельцова Виктория]] (группа 614) (1.2, 1.3, 1.4, 1.6, 1.7, 1.9, 1.10, 2.4)&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод &amp;quot;Разделяй и властвуй&amp;quot; вычисления собственных значений и векторов трёхдиагональной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
| parallel_complexity = &amp;lt;math&amp;gt; O(n^{2.3}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
крайне редко: &amp;lt;math&amp;gt;  O(n^{2}) &amp;lt;/math&amp;gt; &lt;br /&gt;
| pf_width          = &lt;br /&gt;
| input_data        =  &amp;lt;math&amp;gt; 2n + 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       =  &amp;lt;math&amp;gt; n(n + 1) &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;
&#039;&#039;&#039;Метод разделяй и властвуй вычисления собственных значений и векторов трёхдиагональной матрицы&#039;&#039;&#039; - является наиболее быстрым из существующих методов вычисления всех собственных значений и собственных векторов трехдиагональной матрицы, начиная с порядка n, который примерно равен 26. (Точное значение этого порогового порядка в конкретном случае зависит от компьютера.) &lt;br /&gt;
&lt;br /&gt;
Численно устойчивая реализация данного метода весьма не тривиальна, так как не смотря на то, что впервые метод был предложен в 1981 г., &amp;quot;правильный&amp;quot; способ реализации метода был найден лишь в 1992 г. Этот способ был воплощен при помощи LAPACK-программ ssyevd (для плотных матриц) и sstevd (для трехдиагональных матриц). В этих программах стратегия &amp;quot;разделяй-и-влавствуй&amp;quot; используется для матриц порядка выше 25. &lt;br /&gt;
&lt;br /&gt;
Для матриц порядка ниже 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;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&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;
&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;
&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;
где &amp;lt;math&amp;gt; u = \begin{bmatrix} Q_{1}^{T} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}^{T}\end{bmatrix}v &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;, так как &amp;lt;math&amp;gt;v = \begin{bmatrix} 0 , \ldots  ,  0 , 1 , 1 , 0 \ldots , 0 \end{bmatrix}^T&amp;lt;/math&amp;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;
В дальнейшем предполагаем, не ограничивая общности, что диагональные элементы &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;
&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;Лемма 1.&#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;
&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:Сергеев 1.jpg|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;Лемма 2.&#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;
&amp;lt;math&amp;gt;(D + \rho uu^{T})[(D - \alpha I)^{-1}u] = &lt;br /&gt;
&lt;br /&gt;
(D - \alpha I + \alpha I + \rho uu^{T})(D - \alpha I)^{-1}u = &lt;br /&gt;
&lt;br /&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 = \alpha [(D - \alpha I)^{-1}u]&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&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;
Что и требовалось доказать.&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;
До сих пор полагалось, что все &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;&#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;
&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;
Рассмотрим каким именно образом происходит вычисление собственных значений и собственных векторов симметричной трехдиагональной матрицы при помощи стратегии &amp;quot;разделяй и властвуй&amp;quot;:&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;если&#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; :&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 * &lt;br /&gt;
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;
         &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;
         &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;
         &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 изображена структура алгоритма.&lt;br /&gt;
[[File:Сергеев 5.jpg|thumb|center|left|1000px|Рис. 3. Дерево алгоритма &amp;quot;Разделяй и властвуй&amp;quot;]]&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; - это единственная часть алгоритма, в которой возможно использовать параллелизм. &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;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;
Таким образом, благодаря параллелизму высота алгоритма параллельного составляет &amp;lt;math&amp;gt;log_{2}(n)&amp;lt;/math&amp;gt;, тогда как при последовательной реализации высота алгоритма равна сумме геометрической прогрессии &amp;lt;math&amp;gt;1+2+4+8+...+2^{n-1} = 2^{n} - 1&amp;lt;/math&amp;gt;, что значительно сокращает число итераций алгоритма.&lt;br /&gt;
&lt;br /&gt;
Поскольку функции являются рекурсивными, их параллельный вызов даст значительный выигрыш во времени.&lt;br /&gt;
&lt;br /&gt;
При размерности матрицы больше 3 параллельная реализация позволяет сократить количество этапов работы алгоритма больше, чем в два раза.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: трёхдиагональная симметрическая матрица, описанная в разделе [[#Математическое описание алгоритма]].&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;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; 2n + 1 &amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/под диагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: Вектор собственных значений длины &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; и  &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; собственных векторов длины &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; , соответствующих собственным значениям исходной матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n(n + 1) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Данный алгоритм является самым быстрым алгоритмом среди существующих: Разделяй и властвуй, QR, Бисекция и обратная итерация.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Последовательная сложность данного алгоритма:&#039;&#039;&#039; &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;t(n) = n^3 +2t(\frac{n}{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параллельная сложность алгоритма (за счет дефляции):&#039;&#039;&#039; &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;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Особенности алгоритма:&#039;&#039;&#039;&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;
Тестирование реализации алгоритма проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; с использованием 1, 2, 4, 8, 16 процессоров на матрицах размера от 4 до 4096. Реализация произведена на библиотеке OpenMP.&lt;br /&gt;
&lt;br /&gt;
Общая эффективность программы увеличивается при увеличении числа процессоров (за счет сокращения времени работы программы) и уменьшается при увеличении размера матрицы (за счет увеличения времени обработки входных данных). При одновременном увеличении числа процессоров и размерности матрицы общая эффективность падает.&lt;br /&gt;
&lt;br /&gt;
Ниже приведена схема зависимости времени работы программы от размера матрицы при разном числе процессоров. При размере матрицы от 4 до 1024 время работы очень мало, поэтому эти данные не указаны на схеме.&lt;br /&gt;
&lt;br /&gt;
[[File:DivAndConq11.png|thumb|center|left|1000px|Рис. 4. Зависимость времени работы от размера матрицы]]&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
&lt;br /&gt;
 ssh compiler &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add openmpi/1.5.5-icc&lt;br /&gt;
 g++ _scratch/DivideAndConquer.c++ -fopenmp -std=c++0x -o DC &lt;br /&gt;
 sbatch -p test -n1 run ./DC&lt;br /&gt;
&lt;br /&gt;
Код реализации: https://drive.google.com/open?id=0B0G2UV7cuLwHQk9xd1lyeDNJOXc&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Единственный найденный пример реализации описан в [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot; ]   ([3] с. 7, 19-20).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[1] Дж. Деммель, «Вычислительная линейная алгебра» //С. 230-235&lt;br /&gt;
&lt;br /&gt;
[2] [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;
[3] [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;
[4] [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;
[5] [https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm Алгоритм &amp;quot;Разделяй и властвуй&amp;quot; - Wikipedia]&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>NikoSergAlex</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=21517</id>
		<title>Участник:Vika3410/Метод Разделяй и властвуй</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=21517"/>
		<updated>2016-12-31T10:54:50Z</updated>

		<summary type="html">&lt;p&gt;NikoSergAlex: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи: [[Участник:NikoSergAlex|Сергеев Никита]] (группа 614) (1.1, 1.2, 1.5, 1.6, 1.7, 1.8, 1.10, 2.4), [[Участница:Vika3410|Стрельцова Виктория]] (группа 614) (1.2, 1.3, 1.4, 1.6, 1.7, 1.9, 1.10, 2.4)&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод &amp;quot;Разделяй и властвуй&amp;quot; вычисления собственных значений и векторов трёхдиагональной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
| parallel_complexity = &amp;lt;math&amp;gt; O(n^{2.3}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
крайне редко: &amp;lt;math&amp;gt;  O(n^{2}) &amp;lt;/math&amp;gt; &lt;br /&gt;
| pf_width          = &lt;br /&gt;
| input_data        =  &amp;lt;math&amp;gt; 2n + 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       =  &amp;lt;math&amp;gt; n(n + 1) &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;
&#039;&#039;&#039;Метод разделяй и властвуй вычисления собственных значений и векторов трёхдиагональной матрицы&#039;&#039;&#039; - является наиболее быстрым из существующих методов вычисления всех собственных значений и собственных векторов трехдиагональной матрицы, начиная с порядка n, который примерно равен 26. (Точное значение этого порогового порядка в конкретном случае зависит от компьютера.) &lt;br /&gt;
&lt;br /&gt;
Численно устойчивая реализация данного метода весьма не тривиальна, так как не смотря на то, что впервые метод был предложен в 1981 г., &amp;quot;правильный&amp;quot; способ реализации метода был найден лишь в 1992 г. Этот способ был воплощен при помощи LAPACK-программ ssyevd (для плотных матриц) и sstevd (для трехдиагональных матриц). В этих программах стратегия &amp;quot;разделяй-и-влавствуй&amp;quot; используется для матриц порядка выше 25. &lt;br /&gt;
&lt;br /&gt;
Для матриц порядка ниже 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;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&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;
&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;
&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;
где &amp;lt;math&amp;gt; u = \begin{bmatrix} Q_{1}^{T} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}^{T}\end{bmatrix}v &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;, так как &amp;lt;math&amp;gt;v = \begin{bmatrix} 0 , \ldots  ,  0 , 1 , 1 , 0 \ldots , 0 \end{bmatrix}^T&amp;lt;/math&amp;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;
В дальнейшем предполагаем, не ограничивая общности, что диагональные элементы &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;
&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;Лемма 1.&#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;
&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:Сергеев 1.jpg|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;Лемма 2.&#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;
&amp;lt;math&amp;gt;(D + \rho uu^{T})[(D - \alpha I)^{-1}u] = &lt;br /&gt;
&lt;br /&gt;
(D - \alpha I + \alpha I + \rho uu^{T})(D - \alpha I)^{-1}u = &lt;br /&gt;
&lt;br /&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 = \alpha [(D - \alpha I)^{-1}u]&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&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;
Что и требовалось доказать.&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;
До сих пор полагалось, что все &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;&#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;
&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;
Далее пойдет речь о решении &#039;&#039;&#039;векового уравнения&#039;&#039;&#039;, которое является одной из основных частей алгоритма.&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:Сергеев 2.jpg|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;
для &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;
&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;
&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; (*)&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;. Два условия в (*) - это обычные условия метода Ньютона, за исключением того, что вместо прямой в качестве приближения используется гипербола. Легко проверить, что &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;
&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;
&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;&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} \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;
Рассмотрим каким именно образом происходит вычисление собственных значений и собственных векторов симметричной трехдиагональной матрицы при помощи стратегии &amp;quot;разделяй и властвуй&amp;quot;:&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;если&#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; :&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 * &lt;br /&gt;
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;
         &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;
         &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;
         &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 изображена структура алгоритма.&lt;br /&gt;
[[File:Сергеев 5.jpg|thumb|center|left|1000px|Рис. 3. Дерево алгоритма &amp;quot;Разделяй и властвуй&amp;quot;]]&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; - это единственная часть алгоритма, в которой возможно использовать параллелизм. &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;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;
Таким образом, благодаря параллелизму высота алгоритма параллельного составляет &amp;lt;math&amp;gt;log_{2}(n)&amp;lt;/math&amp;gt;, тогда как при последовательной реализации высота алгоритма равна сумме геометрической прогрессии &amp;lt;math&amp;gt;1+2+4+8+...+2^{n-1} = 2^{n} - 1&amp;lt;/math&amp;gt;, что значительно сокращает число итераций алгоритма.&lt;br /&gt;
&lt;br /&gt;
Поскольку функции являются рекурсивными, их параллельный вызов даст значительный выигрыш во времени.&lt;br /&gt;
&lt;br /&gt;
При размерности матрицы больше 3 параллельная реализация позволяет сократить количество этапов работы алгоритма больше, чем в два раза.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: трёхдиагональная симметрическая матрица, описанная в разделе [[#Математическое описание алгоритма]].&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;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; 2n + 1 &amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/под диагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: Вектор собственных значений длины &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; и  &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; собственных векторов длины &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; , соответствующих собственным значениям исходной матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n(n + 1) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Данный алгоритм является самым быстрым алгоритмом среди существующих: Разделяй и властвуй, QR, Бисекция и обратная итерация.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Последовательная сложность данного алгоритма:&#039;&#039;&#039; &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;t(n) = n^3 +2t(\frac{n}{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параллельная сложность алгоритма (за счет дефляции):&#039;&#039;&#039; &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;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Особенности алгоритма:&#039;&#039;&#039;&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;
Тестирование реализации алгоритма проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; с использованием 1, 2, 4, 8, 16 процессоров на матрицах размера от 4 до 4096. Реализация произведена на библиотеке OpenMP.&lt;br /&gt;
&lt;br /&gt;
Общая эффективность программы увеличивается при увеличении числа процессоров (за счет сокращения времени работы программы) и уменьшается при увеличении размера матрицы (за счет увеличения времени обработки входных данных). При одновременном увеличении числа процессоров и размерности матрицы общая эффективность падает.&lt;br /&gt;
&lt;br /&gt;
Ниже приведена схема зависимости времени работы программы от размера матрицы при разном числе процессоров. При размере матрицы от 4 до 1024 время работы очень мало, поэтому эти данные не указаны на схеме.&lt;br /&gt;
&lt;br /&gt;
[[File:DivAndConq11.png|thumb|center|left|1000px|Рис. 4. Зависимость времени работы от размера матрицы]]&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
&lt;br /&gt;
 ssh compiler &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add openmpi/1.5.5-icc&lt;br /&gt;
 g++ _scratch/DivideAndConquer.c++ -fopenmp -std=c++0x -o DC &lt;br /&gt;
 sbatch -p test -n1 run ./DC&lt;br /&gt;
&lt;br /&gt;
Код реализации: https://drive.google.com/open?id=0B0G2UV7cuLwHQk9xd1lyeDNJOXc&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Единственный найденный пример реализации описан в [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot; ]   ([3] с. 7, 19-20).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[1] Дж. Деммель, «Вычислительная линейная алгебра» //С. 230-235&lt;br /&gt;
&lt;br /&gt;
[2] [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;
[3] [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;
[4] [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;
[5] [https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm Алгоритм &amp;quot;Разделяй и властвуй&amp;quot; - Wikipedia]&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>NikoSergAlex</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=21516</id>
		<title>Участник:Vika3410/Метод Разделяй и властвуй</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=21516"/>
		<updated>2016-12-31T10:51:22Z</updated>

		<summary type="html">&lt;p&gt;NikoSergAlex: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи: [[Участник:NikoSergAlex|Сергеев Никита]] (группа 614) (1.1, 1.2, 1.5, 1.6, 1.7, 1.8, 1.10), [[Участница:Vika3410|Стрельцова Виктория]] (группа 614) (1.2, 1.3, 1.4, 1.6, 1.7, 1.9, 1.10)&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод &amp;quot;Разделяй и властвуй&amp;quot; вычисления собственных значений и векторов трёхдиагональной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
| parallel_complexity = &amp;lt;math&amp;gt; O(n^{2.3}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
крайне редко: &amp;lt;math&amp;gt;  O(n^{2}) &amp;lt;/math&amp;gt; &lt;br /&gt;
| pf_width          = &lt;br /&gt;
| input_data        =  &amp;lt;math&amp;gt; 2n - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       =  &amp;lt;math&amp;gt; n + n^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;
&#039;&#039;&#039;Метод разделяй и властвуй вычисления собственных значений и векторов трёхдиагональной матрицы&#039;&#039;&#039; - является наиболее быстрым из существующих методов вычисления всех собственных значений и собственных векторов трехдиагональной матрицы, начиная с порядка n, который примерно равен 26. (Точное значение этого порогового порядка в конкретном случае зависит от компьютера.) &lt;br /&gt;
&lt;br /&gt;
Численно устойчивая реализация данного метода весьма не тривиальна, так как не смотря на то, что впервые метод был предложен в 1981 г., &amp;quot;правильный&amp;quot; способ реализации метода был найден лишь в 1992 г. Этот способ был воплощен при помощи LAPACK-программ ssyevd (для плотных матриц) и sstevd (для трехдиагональных матриц). В этих программах стратегия &amp;quot;разделяй-и-влавствуй&amp;quot; используется для матриц порядка выше 25. &lt;br /&gt;
&lt;br /&gt;
Для матриц порядка ниже 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;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&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;
&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;
&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;
где &amp;lt;math&amp;gt; u = \begin{bmatrix} Q_{1}^{T} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}^{T}\end{bmatrix}v &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;, так как &amp;lt;math&amp;gt;v = \begin{bmatrix} 0 , \ldots  ,  0 , 1 , 1 , 0 \ldots , 0 \end{bmatrix}^T&amp;lt;/math&amp;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;
В дальнейшем предполагаем, не ограничивая общности, что диагональные элементы &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;
&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;Лемма 1.&#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;
&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:Сергеев 1.jpg|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;Лемма 2.&#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;
&amp;lt;math&amp;gt;(D + \rho uu^{T})[(D - \alpha I)^{-1}u] = &lt;br /&gt;
&lt;br /&gt;
(D - \alpha I + \alpha I + \rho uu^{T})(D - \alpha I)^{-1}u = &lt;br /&gt;
&lt;br /&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 = \alpha [(D - \alpha I)^{-1}u]&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&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;
Что и требовалось доказать.&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;
До сих пор полагалось, что все &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;&#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;
&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;
Далее пойдет речь о решении &#039;&#039;&#039;векового уравнения&#039;&#039;&#039;, которое является одной из основных частей алгоритма.&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:Сергеев 2.jpg|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;
для &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;
&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;
&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; (*)&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;. Два условия в (*) - это обычные условия метода Ньютона, за исключением того, что вместо прямой в качестве приближения используется гипербола. Легко проверить, что &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;
&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;
&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;&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} \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;
Рассмотрим каким именно образом происходит вычисление собственных значений и собственных векторов симметричной трехдиагональной матрицы при помощи стратегии &amp;quot;разделяй и властвуй&amp;quot;:&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;если&#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; :&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 * &lt;br /&gt;
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;
         &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;
         &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;
         &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 изображена структура алгоритма.&lt;br /&gt;
[[File:Сергеев 5.jpg|thumb|center|left|1000px|Рис. 3. Дерево алгоритма &amp;quot;Разделяй и властвуй&amp;quot;]]&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; - это единственная часть алгоритма, в которой возможно использовать параллелизм. &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;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;
Таким образом, благодаря параллелизму высота алгоритма параллельного составляет &amp;lt;math&amp;gt;log_{2}(n)&amp;lt;/math&amp;gt;, тогда как при последовательной реализации высота алгоритма равна сумме геометрической прогрессии &amp;lt;math&amp;gt;1+2+4+8+...+2^{n-1} = 2^{n} - 1&amp;lt;/math&amp;gt;, что значительно сокращает число итераций алгоритма.&lt;br /&gt;
&lt;br /&gt;
Поскольку функции являются рекурсивными, их параллельный вызов даст значительный выигрыш во времени.&lt;br /&gt;
&lt;br /&gt;
При размерности матрицы больше 3 параллельная реализация позволяет сократить количество этапов работы алгоритма больше, чем в два раза.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: трёхдиагональная симметрическая матрица, описанная в разделе [[#Математическое описание алгоритма]].&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;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; 2n + 1 &amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/под диагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: Вектор собственных значений длины &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; и  &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; собственных векторов длины &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; , соответствующих собственным значениям исходной матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n(n + 1) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Данный алгоритм является самым быстрым алгоритмом среди существующих: Разделяй и властвуй, QR, Бисекция и обратная итерация.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Последовательная сложность данного алгоритма:&#039;&#039;&#039; &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;t(n) = n^3 +2t(\frac{n}{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параллельная сложность алгоритма (за счет дефляции):&#039;&#039;&#039; &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;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Особенности алгоритма:&#039;&#039;&#039;&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;
Тестирование реализации алгоритма проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; с использованием 1, 2, 4, 8, 16 процессоров на матрицах размера от 4 до 4096. Реализация произведена на библиотеке OpenMP.&lt;br /&gt;
&lt;br /&gt;
Общая эффективность программы увеличивается при увеличении числа процессоров (за счет сокращения времени работы программы) и уменьшается при увеличении размера матрицы (за счет увеличения времени обработки входных данных). При одновременном увеличении числа процессоров и размерности матрицы общая эффективность падает.&lt;br /&gt;
&lt;br /&gt;
Ниже приведена схема зависимости времени работы программы от размера матрицы при разном числе процессоров. При размере матрицы от 4 до 1024 время работы очень мало, поэтому эти данные не указаны на схеме.&lt;br /&gt;
&lt;br /&gt;
[[File:DivAndConq11.png|thumb|center|left|1000px|Рис. 4. Зависимость времени работы от размера матрицы]]&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
&lt;br /&gt;
 ssh compiler &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add openmpi/1.5.5-icc&lt;br /&gt;
 g++ _scratch/DivideAndConquer.c++ -fopenmp -std=c++0x -o DC &lt;br /&gt;
 sbatch -p test -n1 run ./DC&lt;br /&gt;
&lt;br /&gt;
Код реализации: https://drive.google.com/open?id=0B0G2UV7cuLwHQk9xd1lyeDNJOXc&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Единственный найденный пример реализации описан в [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot; ]   ([3] с. 7, 19-20).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[1] Дж. Деммель, «Вычислительная линейная алгебра» //С. 230-235&lt;br /&gt;
&lt;br /&gt;
[2] [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;
[3] [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;
[4] [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;
[5] [https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm Алгоритм &amp;quot;Разделяй и властвуй&amp;quot; - Wikipedia]&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>NikoSergAlex</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=21515</id>
		<title>Участник:Vika3410/Метод Разделяй и властвуй</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=21515"/>
		<updated>2016-12-31T10:50:50Z</updated>

		<summary type="html">&lt;p&gt;NikoSergAlex: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи: [[Участник:NikoSergAlex|Сергеев Никита]] (группа 614) (1.1, 1.2, 1.5, 1.6, 1.7, 1.8, 1.10), [[Участница:Vika3410|Стрельцова Виктория]] (группа 614) (1.2, 1.3, 1.4, 1.6, 1.7, 1.9, 1.10)&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод &amp;quot;Разделяй и властвуй&amp;quot; вычисления собственных значений и векторов трёхдиагональной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
| parallel_complexity = &amp;lt;math&amp;gt; O(n^{2.3}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
крайне редко: &amp;lt;math&amp;gt;  O(n^{2}) &amp;lt;/math&amp;gt; &lt;br /&gt;
| pf_width          = &lt;br /&gt;
| input_data        =  &amp;lt;math&amp;gt; 2n - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       =  &amp;lt;math&amp;gt; n + n^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;
&#039;&#039;&#039;Метод разделяй и властвуй вычисления собственных значений и векторов трёхдиагональной матрицы&#039;&#039;&#039; - является наиболее быстрым из существующих методов вычисления всех собственных значений и собственных векторов трехдиагональной матрицы, начиная с порядка n, который примерно равен 26. (Точное значение этого порогового порядка в конкретном случае зависит от компьютера.) &lt;br /&gt;
&lt;br /&gt;
Численно устойчивая реализация данного метода весьма не тривиальна, так как не смотря на то, что впервые метод был предложен в 1981 г., &amp;quot;правильный&amp;quot; способ реализации метода был найден лишь в 1992 г. Этот способ был воплощен при помощи LAPACK-программ ssyevd (для плотных матриц) и sstevd (для трехдиагональных матриц). В этих программах стратегия &amp;quot;разделяй-и-влавствуй&amp;quot; используется для матриц порядка выше 25. &lt;br /&gt;
&lt;br /&gt;
Для матриц порядка ниже 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;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&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;
&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;
&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;
где &amp;lt;math&amp;gt; u = \begin{bmatrix} Q_{1}^{T} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}^{T}\end{bmatrix}v &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;, так как &amp;lt;math&amp;gt;v = \begin{bmatrix} 0 , \ldots  ,  0 , 1 , 1 , 0 \ldots , 0 \end{bmatrix}^T&amp;lt;/math&amp;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;
В дальнейшем предполагаем, не ограничивая общности, что диагональные элементы &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;
&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;Лемма 1.&#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;
&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:Сергеев 1.jpg|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;Лемма 2.&#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;
&amp;lt;math&amp;gt;(D + \rho uu^{T})[(D - \alpha I)^{-1}u] = &lt;br /&gt;
&lt;br /&gt;
(D - \alpha I + \alpha I + \rho uu^{T})(D - \alpha I)^{-1}u = &lt;br /&gt;
&lt;br /&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 = \alpha [(D - \alpha I)^{-1}u]&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&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;
Что и требовалось доказать.&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;
До сих пор полагалось, что все &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;&#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;
&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;
Далее пойдет речь о решении &#039;&#039;&#039;векового уравнения&#039;&#039;&#039;, которое является одной из основных частей алгоритма.&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:Сергеев 2.jpg|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;
для &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;
&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;
&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; (*)&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;. Два условия в (*) - это обычные условия метода Ньютона, за исключением того, что вместо прямой в качестве приближения используется гипербола. Легко проверить, что &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;
&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;
&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;&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} \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;
Рассмотрим каким именно образом происходит вычисление собственных значений и собственных векторов симметричной трехдиагональной матрицы при помощи стратегии &amp;quot;разделяй и властвуй&amp;quot;:&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;если&#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; :&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 * &lt;br /&gt;
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;
         &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;
         &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;
         &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 изображена структура алгоритма.&lt;br /&gt;
[[File:Сергеев 5.jpg|thumb|center|left|1000px|Рис. 3. Дерево алгоритма &amp;quot;Разделяй и властвуй&amp;quot;]]&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; - это единственная часть алгоритма, в которой возможно использовать параллелизм. &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;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;
Таким образом, благодаря параллелизму высота алгоритма параллельного составляет &amp;lt;math&amp;gt;log_{2}(n)&amp;lt;/math&amp;gt;, тогда как при последовательной реализации высота алгоритма равна сумме геометрической прогрессии &amp;lt;math&amp;gt;1+2+4+8+...+2^{n-1} = 2^{n} - 1&amp;lt;/math&amp;gt;, что значительно сокращает число итераций алгоритма.&lt;br /&gt;
&lt;br /&gt;
Поскольку функции являются рекурсивными, их параллельный вызов даст значительный выигрыш во времени.&lt;br /&gt;
&lt;br /&gt;
При размерности матрицы больше 3 параллельная реализация позволяет сократить количество этапов работы алгоритма больше, чем в два раза.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: трёхдиагональная симметрическая матрица, описанная в разделе [[#Математическое описание алгоритма]].&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;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; 2n + 1 &amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/под диагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: Вектор собственных значений длины &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; и  &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; собственных векторов длины &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; , соответствующих собственным значениям исходной матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n + n^{2} = n(n + 1) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Данный алгоритм является самым быстрым алгоритмом среди существующих: Разделяй и властвуй, QR, Бисекция и обратная итерация.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Последовательная сложность данного алгоритма:&#039;&#039;&#039; &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;t(n) = n^3 +2t(\frac{n}{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параллельная сложность алгоритма (за счет дефляции):&#039;&#039;&#039; &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;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Особенности алгоритма:&#039;&#039;&#039;&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;
Тестирование реализации алгоритма проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; с использованием 1, 2, 4, 8, 16 процессоров на матрицах размера от 4 до 4096. Реализация произведена на библиотеке OpenMP.&lt;br /&gt;
&lt;br /&gt;
Общая эффективность программы увеличивается при увеличении числа процессоров (за счет сокращения времени работы программы) и уменьшается при увеличении размера матрицы (за счет увеличения времени обработки входных данных). При одновременном увеличении числа процессоров и размерности матрицы общая эффективность падает.&lt;br /&gt;
&lt;br /&gt;
Ниже приведена схема зависимости времени работы программы от размера матрицы при разном числе процессоров. При размере матрицы от 4 до 1024 время работы очень мало, поэтому эти данные не указаны на схеме.&lt;br /&gt;
&lt;br /&gt;
[[File:DivAndConq11.png|thumb|center|left|1000px|Рис. 4. Зависимость времени работы от размера матрицы]]&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
&lt;br /&gt;
 ssh compiler &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add openmpi/1.5.5-icc&lt;br /&gt;
 g++ _scratch/DivideAndConquer.c++ -fopenmp -std=c++0x -o DC &lt;br /&gt;
 sbatch -p test -n1 run ./DC&lt;br /&gt;
&lt;br /&gt;
Код реализации: https://drive.google.com/open?id=0B0G2UV7cuLwHQk9xd1lyeDNJOXc&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Единственный найденный пример реализации описан в [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot; ]   ([3] с. 7, 19-20).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[1] Дж. Деммель, «Вычислительная линейная алгебра» //С. 230-235&lt;br /&gt;
&lt;br /&gt;
[2] [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;
[3] [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;
[4] [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;
[5] [https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm Алгоритм &amp;quot;Разделяй и властвуй&amp;quot; - Wikipedia]&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>NikoSergAlex</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=21514</id>
		<title>Участник:Vika3410/Метод Разделяй и властвуй</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=21514"/>
		<updated>2016-12-31T10:48:24Z</updated>

		<summary type="html">&lt;p&gt;NikoSergAlex: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи: [[Участник:NikoSergAlex|Сергеев Никита]] (группа 614) (1.1, 1.2, 1.5, 1.6, 1.7, 1.8, 1.10), [[Участница:Vika3410|Стрельцова Виктория]] (группа 614) (1.2, 1.3, 1.4, 1.6, 1.7, 1.9, 1.10)&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод &amp;quot;Разделяй и властвуй&amp;quot; вычисления собственных значений и векторов трёхдиагональной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
| parallel_complexity = &amp;lt;math&amp;gt; O(n^{2.3}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
крайне редко: &amp;lt;math&amp;gt;  O(n^{2}) &amp;lt;/math&amp;gt; &lt;br /&gt;
| pf_width          = &lt;br /&gt;
| input_data        =  &amp;lt;math&amp;gt; 2n - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       =  &amp;lt;math&amp;gt; n + n^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;
&#039;&#039;&#039;Метод разделяй и властвуй вычисления собственных значений и векторов трёхдиагональной матрицы&#039;&#039;&#039; - является наиболее быстрым из существующих методов вычисления всех собственных значений и собственных векторов трехдиагональной матрицы, начиная с порядка n, который примерно равен 26. (Точное значение этого порогового порядка в конкретном случае зависит от компьютера.) &lt;br /&gt;
&lt;br /&gt;
Численно устойчивая реализация данного метода весьма не тривиальна, так как не смотря на то, что впервые метод был предложен в 1981 г., &amp;quot;правильный&amp;quot; способ реализации метода был найден лишь в 1992 г. Этот способ был воплощен при помощи LAPACK-программ ssyevd (для плотных матриц) и sstevd (для трехдиагональных матриц). В этих программах стратегия &amp;quot;разделяй-и-влавствуй&amp;quot; используется для матриц порядка выше 25. &lt;br /&gt;
&lt;br /&gt;
Для матриц порядка ниже 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;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&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;
&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;
&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;
где &amp;lt;math&amp;gt; u = \begin{bmatrix} Q_{1}^{T} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}^{T}\end{bmatrix}v &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;, так как &amp;lt;math&amp;gt;v = \begin{bmatrix} 0 , \ldots  ,  0 , 1 , 1 , 0 \ldots , 0 \end{bmatrix}^T&amp;lt;/math&amp;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;
В дальнейшем предполагаем, не ограничивая общности, что диагональные элементы &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;
&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;Лемма 1.&#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;
&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:Сергеев 1.jpg|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;Лемма 2.&#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;
&amp;lt;math&amp;gt;(D + \rho uu^{T})[(D - \alpha I)^{-1}u] = &lt;br /&gt;
&lt;br /&gt;
(D - \alpha I + \alpha I + \rho uu^{T})(D - \alpha I)^{-1}u = &lt;br /&gt;
&lt;br /&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 = \alpha [(D - \alpha I)^{-1}u]&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&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;
Что и требовалось доказать.&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;
До сих пор полагалось, что все &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;&#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;
&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;
Далее пойдет речь о решении &#039;&#039;&#039;векового уравнения&#039;&#039;&#039;, которое является одной из основных частей алгоритма.&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:Сергеев 2.jpg|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;
для &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;
&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;
&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; (*)&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;. Два условия в (*) - это обычные условия метода Ньютона, за исключением того, что вместо прямой в качестве приближения используется гипербола. Легко проверить, что &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;
&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;
&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;&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} \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;
Рассмотрим каким именно образом происходит вычисление собственных значений и собственных векторов симметричной трехдиагональной матрицы при помощи стратегии &amp;quot;разделяй и властвуй&amp;quot;:&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;если&#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; :&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 * &lt;br /&gt;
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;
         &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;
         &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;
         &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 изображена структура алгоритма.&lt;br /&gt;
[[File:Сергеев 5.jpg|thumb|center|left|1000px|Рис. 3. Дерево алгоритма &amp;quot;Разделяй и властвуй&amp;quot;]]&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; - это единственная часть алгоритма, в которой возможно использовать параллелизм. &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;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;
Таким образом, благодаря параллелизму высота алгоритма параллельного составляет &amp;lt;math&amp;gt;log_{2}(n)&amp;lt;/math&amp;gt;, тогда как при последовательной реализации высота алгоритма равна сумме геометрической прогрессии &amp;lt;math&amp;gt;1+2+4+8+...+2^{n-1} = 2^{n} - 1&amp;lt;/math&amp;gt;, что значительно сокращает число итераций алгоритма.&lt;br /&gt;
&lt;br /&gt;
Поскольку функции являются рекурсивными, их параллельный вызов даст значительный выигрыш во времени.&lt;br /&gt;
&lt;br /&gt;
При размерности матрицы больше 3 параллельная реализация позволяет сократить количество этапов работы алгоритма больше, чем в два раза.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: трёхдиагональная симметрическая матрица, описанная в разделе [[#Математическое описание алгоритма]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; 2n - 1 &amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица собственных значений размера &amp;lt;math&amp;gt; 1 * n &amp;lt;/math&amp;gt; и матрица собственных векторов размера &amp;lt;math&amp;gt; n * n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n + n^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Данный алгоритм является самым быстрым алгоритмом среди существующих: Разделяй и властвуй, QR, Бисекция и обратная итерация.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Последовательная сложность данного алгоритма:&#039;&#039;&#039; &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;t(n) = n^3 +2t(\frac{n}{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параллельная сложность алгоритма (за счет дефляции):&#039;&#039;&#039; &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;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Особенности алгоритма:&#039;&#039;&#039;&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;
Тестирование реализации алгоритма проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; с использованием 1, 2, 4, 8, 16 процессоров на матрицах размера от 4 до 4096. Реализация произведена на библиотеке OpenMP.&lt;br /&gt;
&lt;br /&gt;
Общая эффективность программы увеличивается при увеличении числа процессоров (за счет сокращения времени работы программы) и уменьшается при увеличении размера матрицы (за счет увеличения времени обработки входных данных). При одновременном увеличении числа процессоров и размерности матрицы общая эффективность падает.&lt;br /&gt;
&lt;br /&gt;
Ниже приведена схема зависимости времени работы программы от размера матрицы при разном числе процессоров. При размере матрицы от 4 до 1024 время работы очень мало, поэтому эти данные не указаны на схеме.&lt;br /&gt;
&lt;br /&gt;
[[File:DivAndConq11.png|thumb|center|left|1000px|Рис. 4. Зависимость времени работы от размера матрицы]]&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
&lt;br /&gt;
 ssh compiler &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add openmpi/1.5.5-icc&lt;br /&gt;
 g++ _scratch/DivideAndConquer.c++ -fopenmp -std=c++0x -o DC &lt;br /&gt;
 sbatch -p test -n1 run ./DC&lt;br /&gt;
&lt;br /&gt;
Код реализации: https://drive.google.com/open?id=0B0G2UV7cuLwHQk9xd1lyeDNJOXc&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Единственный найденный пример реализации описан в [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot; ]   ([3] с. 7, 19-20).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[1] Дж. Деммель, «Вычислительная линейная алгебра» //С. 230-235&lt;br /&gt;
&lt;br /&gt;
[2] [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;
[3] [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;
[4] [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;
[5] [https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm Алгоритм &amp;quot;Разделяй и властвуй&amp;quot; - Wikipedia]&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>NikoSergAlex</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=21513</id>
		<title>Участник:Vika3410/Метод Разделяй и властвуй</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=21513"/>
		<updated>2016-12-31T10:48:04Z</updated>

		<summary type="html">&lt;p&gt;NikoSergAlex: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи: [[Участник:NikoSergAlex|Сергеев Никита]] (группа 614) (1.1, 1.2, 1.5, 1.6, 1.7, 1.8, 1.10), [[Участница:Vika3410|Стрельцова Виктория]] (группа 614) (1.2, 1.3, 1.4, 1.6, 1.7, 1.9, 1.10)&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод &amp;quot;Разделяй и властвуй&amp;quot; вычисления собственных значений и векторов трёхдиагональной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
| parallel_complexity = &amp;lt;math&amp;gt; O(n^{2.3}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
крайне редко: &amp;lt;math&amp;gt;  O(n^{2}) &amp;lt;/math&amp;gt; &lt;br /&gt;
| pf_width          = &lt;br /&gt;
| input_data        =  &amp;lt;math&amp;gt; 2n - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       =  &amp;lt;math&amp;gt; n + n^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;
&#039;&#039;&#039;Метод разделяй и властвуй вычисления собственных значений и векторов трёхдиагональной матрицы&#039;&#039;&#039; - является наиболее быстрым из существующих методов вычисления всех собственных значений и собственных векторов трехдиагональной матрицы, начиная с порядка n, который примерно равен 26. (Точное значение этого порогового порядка в конкретном случае зависит от компьютера.) &lt;br /&gt;
&lt;br /&gt;
Численно устойчивая реализация данного метода весьма не тривиальна, так как не смотря на то, что впервые метод был предложен в 1981 г., &amp;quot;правильный&amp;quot; способ реализации метода был найден лишь в 1992 г. Этот способ был воплощен при помощи LAPACK-программ ssyevd (для плотных матриц) и sstevd (для трехдиагональных матриц). В этих программах стратегия &amp;quot;разделяй-и-влавствуй&amp;quot; используется для матриц порядка выше 25. &lt;br /&gt;
&lt;br /&gt;
Для матриц порядка ниже 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;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&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;
&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;
&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;
где &amp;lt;math&amp;gt; u = \begin{bmatrix} Q_{1}^{T} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}^{T}\end{bmatrix}v &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;, так как &amp;lt;math&amp;gt;v = \begin{bmatrix} 0 , \ldots  ,  0 , 1 , 1 , 0 \ldots , 0 \end{bmatrix}^T&amp;lt;/math&amp;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;
В дальнейшем предполагаем, не ограничивая общности, что диагональные элементы &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;
&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;Лемма 1.&#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;
&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:Сергеев 1.jpg|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;Лемма 2.&#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;
&amp;lt;math&amp;gt;(D + \rho uu^{T})[(D - \alpha I)^{-1}u] = &lt;br /&gt;
&lt;br /&gt;
(D - \alpha I + \alpha I + \rho uu^{T})(D - \alpha I)^{-1}u = &lt;br /&gt;
&lt;br /&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 = \alpha [(D - \alpha I)^{-1}u]&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&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;
Что и требовалось доказать.&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;
До сих пор полагалось, что все &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;&#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;
&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;
Далее пойдет речь о решении &#039;&#039;&#039;векового уравнения&#039;&#039;&#039;, которое является одной из основных частей алгоритма.&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:Сергеев 2.jpg|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;
для &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;
&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;
&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; (*)&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;. Два условия в (*) - это обычные условия метода Ньютона, за исключением того, что вместо прямой в качестве приближения используется гипербола. Легко проверить, что &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;
&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;
&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;&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} \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;
Рассмотрим каким именно образом происходит вычисление собственных значений и собственных векторов симметричной трехдиагональной матрицы при помощи стратегии &amp;quot;разделяй и властвуй&amp;quot;:&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;если&#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; :&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 * &lt;br /&gt;
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;
         &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;
         &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;
         &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 изображена структура алгоритма.&lt;br /&gt;
[[File:Сергеев 5.jpg|thumb|center|left|1000px|Рис. 3. Дерево алгоритма &amp;quot;Разделяй и властвуй&amp;quot;]]&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; - это единственная часть алгоритма, в которой возможно использовать параллелизм. &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;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;
Таким образом, благодаря параллелизму высота алгоритма параллельного составляет &amp;lt;math&amp;gt;log_{2}(n)&amp;lt;/math&amp;gt;, тогда как при последовательной реализации высота алгоритма равна сумме геометрической прогрессии &amp;lt;math&amp;gt;1+2+4+8+...+2^{n-1} = 2^{n} - 1&amp;lt;/math&amp;gt;, что значительно сокращает число итераций алгоритма.&lt;br /&gt;
&lt;br /&gt;
Поскольку функции являются рекурсивными, их параллельный вызов даст значительный выигрыш во времени.&lt;br /&gt;
&lt;br /&gt;
При размерности матрицы больше 3 параллельная реализация позволяет сократить количество этапов работы алгоритма больше, чем в два раза.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: трёхдиагональная симметрическая матрица, описанная в разделе [[#Математическое описание алгоритма]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; 2n - 1 &amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица собственных значений размера &amp;lt;math&amp;gt; 1 * n &amp;lt;/math&amp;gt; и матрица собственных векторов размера &amp;lt;math&amp;gt; n * n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n + n^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Данный алгоритм является самым быстрым алгоритмом среди существующих: Разделяй и властвуй, QR, Бисекция и обратная итерация.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Последовательная сложность данного алгоритма:&#039;&#039;&#039; &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;t(n) = n^3 +2t(\frac{n}{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параллельная сложность алгоритма (за счет дефляции):&#039;&#039;&#039; &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;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Особенности алгоритма:&#039;&#039;&#039;&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;
Тестирование реализации алгоритма проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; с использованием 1, 2, 4, 8, 16 процессоров на матрицах размера от 4 до 4096. Реализация произведена на библиотеке OpenMP.&lt;br /&gt;
&lt;br /&gt;
Общая эффективность программы увеличивается при увеличении числа процессоров (за счет сокращения времени работы программы) и уменьшается при увеличении размера матрицы (за счет увеличения времени обработки входных данных). При одновременном увеличении числа процессоров и размерности матрицы общая эффективность падает.&lt;br /&gt;
&lt;br /&gt;
Ниже приведена схема зависимости времени работы программы от размера матрицы при разном числе процессоров. При размере матрицы от 4 до 1024 время работы очень мало, поэтому эти данные не указаны на схеме.&lt;br /&gt;
&lt;br /&gt;
[[File:DivAndConq11.png|thumb|center|left|1000px|Рис. 4. Зависимость времени работы от размера матрицы]]&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
&lt;br /&gt;
 ssh compiler &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add openmpi/1.5.5-icc&lt;br /&gt;
 g++ _scratch/DivideAndConquer.c++ -fopenmp -std=c++0x -o DC &lt;br /&gt;
 sbatch -p test -n1 run ./DC&lt;br /&gt;
&lt;br /&gt;
Код реализации: https://drive.google.com/open?id=0B0G2UV7cuLwHQk9xd1lyeDNJOXc&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Единственный найденный пример реализации описан в [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot; ]   ([3] с. 7, 19-20).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[1] Дж. Деммель, «Вычислительная линейная алгебра» //С. 230-235&lt;br /&gt;
&lt;br /&gt;
[2] [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;
[3] [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;
[4] [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;
[5] [https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm Алгоритм &amp;quot;Разделяй и властвуй&amp;quot; - Wikipedia]&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>NikoSergAlex</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=21512</id>
		<title>Участник:Vika3410/Метод Разделяй и властвуй</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=21512"/>
		<updated>2016-12-28T21:02:18Z</updated>

		<summary type="html">&lt;p&gt;NikoSergAlex: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи: [[Участник:NikoSergAlex|Сергеев Никита]] (группа 614) (1.1, 1.2, 1.5, 1.6, 1.7, 1.8, 1.10), [[Участница:Vika3410|Стрельцова Виктория]] (группа 614) (1.2, 1.3, 1.4, 1.6, 1.7, 1.9, 1.10)&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод &amp;quot;Разделяй и властвуй&amp;quot; вычисления собственных значений и векторов трёхдиагональной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
| parallel_complexity = &amp;lt;math&amp;gt; O(n^{2.3}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
крайне редко: &amp;lt;math&amp;gt;  O(n^{2}) &amp;lt;/math&amp;gt; &lt;br /&gt;
| pf_width          = &lt;br /&gt;
| input_data        =  &amp;lt;math&amp;gt; 2n - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       =  &amp;lt;math&amp;gt; n + n^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;
&#039;&#039;&#039;Метод разделяй и властвуй вычисления собственных значений и векторов трёхдиагональной матрицы&#039;&#039;&#039; - является наиболее быстрым из существующих методов вычисления всех собственных значений и собственных векторов трехдиагональной матрицы, начиная с порядка n, который примерно равен 26. (Точное значение этого порогового порядка в конкретном случае зависит от компьютера.) &lt;br /&gt;
&lt;br /&gt;
Численно устойчивая реализация данного метода весьма не тривиальна, так как не смотря на то, что впервые метод был предложен в 1981 г., &amp;quot;правильный&amp;quot; способ реализации метода был найден лишь в 1992 г. Этот способ был воплощен при помощи LAPACK-программ ssyevd (для плотных матриц) и sstevd (для трехдиагональных матриц). В этих программах стратегия &amp;quot;разделяй-и-влавствуй&amp;quot; используется для матриц порядка выше 25. &lt;br /&gt;
&lt;br /&gt;
Для матриц порядка ниже 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;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&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;
&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;
&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;
где &amp;lt;math&amp;gt; u = \begin{bmatrix} Q_{1}^{T} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}^{T}\end{bmatrix}v &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;, так как &amp;lt;math&amp;gt;v = \begin{bmatrix} 0 , \ldots  ,  0 , 1 , 1 , 0 \ldots , 0 \end{bmatrix}^T&amp;lt;/math&amp;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;
В дальнейшем предполагаем, не ограничивая общности, что диагональные элементы &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;
&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;Лемма 1.&#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;
&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:Сергеев 1.jpg|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;Лемма 2.&#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;
&amp;lt;math&amp;gt;(D + \rho uu^{T})[(D - \alpha I)^{-1}u] = &lt;br /&gt;
&lt;br /&gt;
(D - \alpha I + \alpha I + \rho uu^{T})(D - \alpha I)^{-1}u = &lt;br /&gt;
&lt;br /&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 = \alpha [(D - \alpha I)^{-1}u]&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&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;
Что и требовалось доказать.&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;
До сих пор полагалось, что все &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;&#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;
&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;
Далее пойдет речь о решении &#039;&#039;&#039;векового уравнения&#039;&#039;&#039;, которое является одной из основных частей алгоритма.&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:Сергеев 2.jpg|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;
для &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;
&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;
&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; (*)&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;. Два условия в (*) - это обычные условия метода Ньютона, за исключением того, что вместо прямой в качестве приближения используется гипербола. Легко проверить, что &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;
&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;
&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;&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} \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;
Рассмотрим каким именно образом происходит вычисление собственных значений и собственных векторов симметричной трехдиагональной матрицы при помощи стратегии &amp;quot;разделяй и властвуй&amp;quot;:&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;если&#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; :&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 * &lt;br /&gt;
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;
         &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;
         &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;
         &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 изображена структура алгоритма.&lt;br /&gt;
[[File:Сергеев 5.jpg|thumb|center|left|1000px|Рис. 3. Дерево алгоритма &amp;quot;Разделяй и властвуй&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Данная структура алгоритма позволяет выполнять рекурсивный вызов функций для двух подматриц исходной матрицы как последовательно, так и параллельно. &lt;br /&gt;
При последовательной реализации алгоритма вызов функций производится по очереди - сначала для одной подматрицы, затем для другой. При параллельной реализации алгоритма данные функции могут отрабатывать одновременно.&lt;br /&gt;
Поскольку функции являются рекурсивными, их параллельный вызов даст значительный выигрыш во времени.&lt;br /&gt;
При размерности матрицы больше 3 параллельная реализация позволяет сократить количество этапов работы алгоритма больше, чем в два раза.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: трёхдиагональная симметрическая матрица, описанная в разделе [[#Математическое описание алгоритма]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; 2n - 1 &amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица собственных значений размера &amp;lt;math&amp;gt; 1 * n &amp;lt;/math&amp;gt; и матрица собственных векторов размера &amp;lt;math&amp;gt; n * n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n + n^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Данный алгоритм является самым быстрым алгоритмом среди существующих: Разделяй и властвуй, QR, Бисекция и обратная итерация.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Последовательная сложность данного алгоритма:&#039;&#039;&#039; &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;t(n) = n^3 +2t(\frac{n}{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параллельная сложность алгоритма (за счет дефляции):&#039;&#039;&#039; &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;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Особенности алгоритма:&#039;&#039;&#039;&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;
Тестирование реализации алгоритма проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; с использованием 1, 2, 4, 8, 16 процессоров на матрицах размера от 4 до 4096. Реализация произведена на библиотеке OpenMP.&lt;br /&gt;
&lt;br /&gt;
Общая эффективность программы увеличивается при увеличении числа процессоров (за счет сокращения времени работы программы) и уменьшается при увеличении размера матрицы (за счет увеличения времени обработки входных данных). При одновременном увеличении числа процессоров и размерности матрицы общая эффективность падает.&lt;br /&gt;
&lt;br /&gt;
Ниже приведена схема зависимости времени работы программы от размера матрицы при разном числе процессоров. При размере матрицы от 4 до 1024 время работы очень мало, поэтому эти данные не указаны на схеме.&lt;br /&gt;
&lt;br /&gt;
[[File:DivAndConq11.png|thumb|center|left|1000px|Рис. 4. Зависимость времени работы от размера матрицы]]&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
&lt;br /&gt;
 ssh compiler &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add openmpi/1.5.5-icc&lt;br /&gt;
 g++ _scratch/DivideAndConquer.c++ -fopenmp -std=c++0x -o DC &lt;br /&gt;
 sbatch -p test -n1 run ./DC&lt;br /&gt;
&lt;br /&gt;
Код реализации: https://drive.google.com/open?id=0B0G2UV7cuLwHQk9xd1lyeDNJOXc&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Единственный найденный пример реализации описан в [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot; ]   ([3] с. 7, 19-20).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[1] Дж. Деммель, «Вычислительная линейная алгебра» //С. 230-235&lt;br /&gt;
&lt;br /&gt;
[2] [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;
[3] [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;
[4] [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;
[5] [https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm Алгоритм &amp;quot;Разделяй и властвуй&amp;quot; - Wikipedia]&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>NikoSergAlex</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=21511</id>
		<title>Участник:Vika3410/Метод Разделяй и властвуй</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=21511"/>
		<updated>2016-12-28T20:57:22Z</updated>

		<summary type="html">&lt;p&gt;NikoSergAlex: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Авторы статьи: [[Участник:NikoSergAlex|Сергеев Никита]] (группа 614) (1.1, 1.2, 1.5, 1.6, 1.7, 1.8, 1.10), [[Участница:Vika3410|Стрельцова Виктория]] (группа 614) (1.2, 1.3, 1.4, 1.6, 1.7, 1.9, 1.10)&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод &amp;quot;Разделяй и властвуй&amp;quot; вычисления собственных значений и векторов трёхдиагональной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
| parallel_complexity = &amp;lt;math&amp;gt; O(n^{2.3}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
крайне редко: &amp;lt;math&amp;gt;  O(n^{2}) &amp;lt;/math&amp;gt; &lt;br /&gt;
| pf_width          = &lt;br /&gt;
| input_data        =  &amp;lt;math&amp;gt; 2n - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       =  &amp;lt;math&amp;gt; n + n^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;
&#039;&#039;&#039;Метод разделяй и властвуй вычисления собственных значений и векторов трёхдиагональной матрицы&#039;&#039;&#039; - является наиболее быстрым из существующих методов вычисления всех собственных значений и собственных векторов трехдиагональной матрицы, начиная с порядка n, который примерно равен 26. (Точное значение этого порогового порядка в конкретном случае зависит от компьютера.) &lt;br /&gt;
&lt;br /&gt;
Численно устойчивая реализация данного метода весьма не тривиальна, так как не смотря на то, что впервые метод был предложен в 1981 г., &amp;quot;правильный&amp;quot; способ реализации метода был найден лишь в 1992 г. Этот способ был воплощен при помощи LAPACK-программ ssyevd (для плотных матриц) и sstevd (для трехдиагональных матриц). В этих программах стратегия &amp;quot;разделяй-и-влавствуй&amp;quot; используется для матриц порядка выше 25. &lt;br /&gt;
&lt;br /&gt;
Для матриц порядка ниже 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;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&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;
&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;
&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;
где &amp;lt;math&amp;gt; u = \begin{bmatrix} Q_{1}^{T} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}^{T}\end{bmatrix}v &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;, так как &amp;lt;math&amp;gt;v = \begin{bmatrix} 0 , \ldots  ,  0 , 1 , 1 , 0 \ldots , 0 \end{bmatrix}^T&amp;lt;/math&amp;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;
В дальнейшем предполагаем, не ограничивая общности, что диагональные элементы &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;
&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;Лемма 1.&#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;
&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:Сергеев 1.jpg|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;Лемма 2.&#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;
&amp;lt;math&amp;gt;(D + \rho uu^{T})[(D - \alpha I)^{-1}u] = &lt;br /&gt;
&lt;br /&gt;
(D - \alpha I + \alpha I + \rho uu^{T})(D - \alpha I)^{-1}u = &lt;br /&gt;
&lt;br /&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 = \alpha [(D - \alpha I)^{-1}u]&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&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;
Что и требовалось доказать.&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;
До сих пор полагалось, что все &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;&#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;
&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;
Далее пойдет речь о решении &#039;&#039;&#039;векового уравнения&#039;&#039;&#039;, которое является одной из основных частей алгоритма.&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:Сергеев 2.jpg|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;
для &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;
&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;
&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; (*)&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;. Два условия в (*) - это обычные условия метода Ньютона, за исключением того, что вместо прямой в качестве приближения используется гипербола. Легко проверить, что &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;
&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;
&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;&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} \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;
Рассмотрим каким именно образом происходит вычисление собственных значений и собственных векторов симметричной трехдиагональной матрицы при помощи стратегии &amp;quot;разделяй и властвуй&amp;quot;:&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;если&#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; :&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 * &lt;br /&gt;
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;
         &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;
         &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;
         &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 изображена структура алгоритма.&lt;br /&gt;
[[File:Сергеев 5.jpg|thumb|center|left|1000px|Рис. 3. Дерево алгоритма &amp;quot;Разделяй и властвуй&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Данная структура алгоритма позволяет выполнять рекурсивный вызов функций для двух подматриц исходной матрицы как последовательно, так и параллельно. &lt;br /&gt;
При последовательной реализации алгоритма вызов функций производится по очереди - сначала для одной подматрицы, затем для другой. При параллельной реализации алгоритма данные функции могут отрабатывать одновременно.&lt;br /&gt;
Поскольку функции являются рекурсивными, их параллельный вызов даст значительный выигрыш во времени.&lt;br /&gt;
При размерности матрицы больше 3 параллельная реализация позволяет сократить количество этапов работы алгоритма больше, чем в два раза.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: трёхдиагональная симметрическая матрица, описанная в разделе [[#Математическое описание алгоритма]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; 2n - 1 &amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица собственных значений размера &amp;lt;math&amp;gt; 1 * n &amp;lt;/math&amp;gt; и матрица собственных векторов размера &amp;lt;math&amp;gt; n * n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n + n^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Данный алгоритм является самым быстрым алгоритмом среди существующих: Разделяй и властвуй, QR, Бисекция и обратная итерация.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Последовательная сложность данного алгоритма:&#039;&#039;&#039; &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;t(n) = n^3 +2t(\frac{n}{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параллельная сложность алгоритма (за счет дефляции):&#039;&#039;&#039; &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;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Особенности алгоритма:&#039;&#039;&#039;&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;
Тестирование реализации алгоритма проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; с использованием 1, 2, 4, 8, 16 процессоров на матрицах размера от 4 до 4096. Реализация произведена на библиотеке OpenMP.&lt;br /&gt;
&lt;br /&gt;
Общая эффективность программы увеличивается при увеличении числа процессоров (за счет сокращения времени работы программы) и уменьшается при увеличении размера матрицы (за счет увеличения времени обработки входных данных). При одновременном увеличении числа процессоров и размерности матрицы общая эффективность падает.&lt;br /&gt;
&lt;br /&gt;
Ниже приведена схема зависимости времени работы программы от размера матрицы при разном числе процессоров. При размере матрицы от 4 до 1024 время работы очень мало, поэтому эти данные не указаны на схеме.&lt;br /&gt;
&lt;br /&gt;
[[File:DivAndConq11.png|thumb|center|left|1000px|Рис. 4. Зависимость времени работы от размера матрицы]]&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
&lt;br /&gt;
 ssh compiler &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add openmpi/1.5.5-icc&lt;br /&gt;
 g++ _scratch/DivideAndConquer.c++ -fopenmp -std=c++0x -o DC &lt;br /&gt;
 sbatch -p test -n1 run ./DC&lt;br /&gt;
&lt;br /&gt;
Код реализации: https://drive.google.com/open?id=0B0G2UV7cuLwHQk9xd1lyeDNJOXc&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Единственный найденный пример реализации описан в [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot; ]   ([3] с. 7, 19-20).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[1] Дж. Деммель, «Вычислительная линейная алгебра» //С. 230-235&lt;br /&gt;
&lt;br /&gt;
[2] [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;
[3] [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;
[4] [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;
[5] [https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm Алгоритм &amp;quot;Разделяй и властвуй&amp;quot; - Wikipedia]&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>NikoSergAlex</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=21510</id>
		<title>Участник:Vika3410/Метод Разделяй и властвуй</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=21510"/>
		<updated>2016-12-28T20:56:28Z</updated>

		<summary type="html">&lt;p&gt;NikoSergAlex: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Авторы статьи: [[Участник:NikoSergAlex|Сергеев Никита]] (группа 614) (1.1, 1.2, 1.5, 1.6, 1.7, 1.8, 1.10), [[Участница:Vika3410|Стрельцова Виктория]] (группа 614) (1.2, 1.3, 1.4, 1.6, 1.7, 1.9, 1.10)&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод &amp;quot;Разделяй и властвуй&amp;quot; вычисления собственных значений и векторов трёхдиагональной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
| parallel_complexity = &amp;lt;math&amp;gt; O(n^{2.3}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
крайне редко: &amp;lt;math&amp;gt;  O(n^{2}) &amp;lt;/math&amp;gt; &lt;br /&gt;
| pf_width          = &lt;br /&gt;
| input_data        =  &amp;lt;math&amp;gt; 2n - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       =  &amp;lt;math&amp;gt; n + n^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;
&#039;&#039;&#039;Метод разделяй и властвуй вычисления собственных значений и векторов трёхдиагональной матрицы&#039;&#039;&#039; - является наиболее быстрым из существующих методов вычисления всех собственных значений и собственных векторов трехдиагональной матрицы, начиная с порядка n, который примерно равен 26. (Точное значение этого порогового порядка в конкретном случае зависит от компьютера.) &lt;br /&gt;
&lt;br /&gt;
Численно устойчивая реализация данного метода весьма не тривиальна, так как не смотря на то, что впервые метод был предложен в 1981 г., &amp;quot;правильный&amp;quot; способ реализации метода был найден лишь в 1992 г. Этот способ был воплощен при помощи LAPACK-программ ssyevd (для плотных матриц) и sstevd (для трехдиагональных матриц). В этих программах стратегия &amp;quot;разделяй-и-влавствуй&amp;quot; используется для матриц порядка выше 25. &lt;br /&gt;
&lt;br /&gt;
Для матриц порядка ниже 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;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&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;
&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;
&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;
где &amp;lt;math&amp;gt; u = \begin{bmatrix} Q_{1}^{T} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}^{T}\end{bmatrix}v &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;, так как &amp;lt;math&amp;gt;v = \begin{bmatrix} 0 , \ldots  ,  0 , 1 , 1 , 0 \ldots , 0 \end{bmatrix}^T&amp;lt;/math&amp;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;
В дальнейшем предполагаем, не ограничивая общности, что диагональные элементы &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;
&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;Лемма 1.&#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;
&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:Сергеев 1.jpg|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;Лемма 2.&#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;
&amp;lt;math&amp;gt;(D + \rho uu^{T})[(D - \alpha I)^{-1}u] = &lt;br /&gt;
&lt;br /&gt;
(D - \alpha I + \alpha I + \rho uu^{T})(D - \alpha I)^{-1}u = &lt;br /&gt;
&lt;br /&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 = \alpha [(D - \alpha I)^{-1}u]&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&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;
Что и требовалось доказать.&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;
До сих пор полагалось, что все &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;&#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;
&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;
Далее пойдет речь о решении &#039;&#039;&#039;векового уравнения&#039;&#039;&#039;, которое является одной из основных частей алгоритма.&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:Сергеев 2.jpg|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;
для &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;
&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;
&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; (*)&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;. Два условия в (*) - это обычные условия метода Ньютона, за исключением того, что вместо прямой в качестве приближения используется гипербола. Легко проверить, что &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;
&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;
&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;&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} \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;
Рассмотрим каким именно образом происходит вычисление собственных значений и собственных векторов симметричной трехдиагональной матрицы при помощи стратегии &amp;quot;разделяй и властвуй&amp;quot;:&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;если&#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; :&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 * &lt;br /&gt;
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;
         &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;
         &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;
         &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 изображена структура алгоритма.&lt;br /&gt;
[[File:Сергеев 5.jpg|thumb|center|left|1000px|Рис. 3. Дерево алгоритма &amp;quot;Разделяй и властвуй&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Данная структура алгоритма позволяет выполнять рекурсивный вызов функций для двух подматриц исходной матрицы как последовательно, так и параллельно. &lt;br /&gt;
При последовательной реализации алгоритма вызов функций производится по очереди - сначала для одной подматрицы, затем для другой. При параллельной реализации алгоритма данные функции могут отрабатывать одновременно.&lt;br /&gt;
Поскольку функции являются рекурсивными, их параллельный вызов даст значительный выигрыш во времени.&lt;br /&gt;
При размерности матрицы больше 3 параллельная реализация позволяет сократить количество этапов работы алгоритма больше, чем в два раза.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: трёхдиагональная симметрическая матрица, описанная в разделе [[#Математическое описание алгоритма]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; 2n - 1 &amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица собственных значений размера &amp;lt;math&amp;gt; 1 * n &amp;lt;/math&amp;gt; и матрица собственных векторов размера &amp;lt;math&amp;gt; n * n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n + n^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Данный алгоритм является самым быстрым алгоритмом среди существующих: Разделяй и властвуй, QR, Бисекция и обратная итерация.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Последовательная сложность данного алгоритма:&#039;&#039;&#039; &amp;lt;math&amp;gt; t = c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
Она удовлетворяет соотношению  &amp;lt;math&amp;gt;t(n) = n^3 +2t(\frac{n}{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параллельная сложность алгоритма (за счет дефляции):&#039;&#039;&#039; &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;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Особенности алгоритма:&#039;&#039;&#039;&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;
Тестирование реализации алгоритма проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; с использованием 1, 2, 4, 8, 16 процессоров на матрицах размера от 4 до 4096. Реализация произведена на библиотеке OpenMP.&lt;br /&gt;
&lt;br /&gt;
Общая эффективность программы увеличивается при увеличении числа процессоров (за счет сокращения времени работы программы) и уменьшается при увеличении размера матрицы (за счет увеличения времени обработки входных данных). При одновременном увеличении числа процессоров и размерности матрицы общая эффективность падает.&lt;br /&gt;
&lt;br /&gt;
Ниже приведена схема зависимости времени работы программы от размера матрицы при разном числе процессоров. При размере матрицы от 4 до 1024 время работы очень мало, поэтому эти данные не указаны на схеме.&lt;br /&gt;
&lt;br /&gt;
[[File:DivAndConq11.png|thumb|center|left|1000px|Рис. 4. Зависимость времени работы от размера матрицы]]&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
&lt;br /&gt;
 ssh compiler &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add openmpi/1.5.5-icc&lt;br /&gt;
 g++ _scratch/DivideAndConquer.c++ -fopenmp -std=c++0x -o DC &lt;br /&gt;
 sbatch -p test -n1 run ./DC&lt;br /&gt;
&lt;br /&gt;
Код реализации: https://drive.google.com/open?id=0B0G2UV7cuLwHQk9xd1lyeDNJOXc&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Единственный найденный пример реализации описан в [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot; ]   ([3] с. 7, 19-20).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[1] Дж. Деммель, «Вычислительная линейная алгебра» //С. 230-235&lt;br /&gt;
&lt;br /&gt;
[2] [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;
[3] [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;
[4] [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;
[5] [https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm Алгоритм &amp;quot;Разделяй и властвуй&amp;quot; - Wikipedia]&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>NikoSergAlex</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=21509</id>
		<title>Участник:Vika3410/Метод Разделяй и властвуй</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=21509"/>
		<updated>2016-12-28T20:50:29Z</updated>

		<summary type="html">&lt;p&gt;NikoSergAlex: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Авторы статьи: [[Участник:NikoSergAlex|Сергеев Никита]] (группа 614) (1.1, 1.2, 1.5, 1.6, 1.7, 1.8, 1.10), [[Участница:Vika3410|Стрельцова Виктория]] (группа 614) (1.2, 1.3, 1.4, 1.6, 1.7, 1.9, 1.10)&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод &amp;quot;Разделяй и властвуй&amp;quot; вычисления собственных значений и векторов трёхдиагональной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
| parallel_complexity = &amp;lt;math&amp;gt; O(n^{2.3}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
крайне редко: &amp;lt;math&amp;gt;  O(n^{2}) &amp;lt;/math&amp;gt; &lt;br /&gt;
| pf_width          = &lt;br /&gt;
| input_data        =  &amp;lt;math&amp;gt; 2n - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       =  &amp;lt;math&amp;gt; n + n^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;
&#039;&#039;&#039;Метод разделяй и властвуй вычисления собственных значений и векторов трёхдиагональной матрицы&#039;&#039;&#039; - является наиболее быстрым из существующих методов вычисления всех собственных значений и собственных векторов трехдиагональной матрицы, начиная с порядка n, который примерно равен 26. (Точное значение этого порогового порядка в конкретном случае зависит от компьютера.) &lt;br /&gt;
&lt;br /&gt;
Численно устойчивая реализация данного метода весьма не тривиальна, так как не смотря на то, что впервые метод был предложен в 1981 г., &amp;quot;правильный&amp;quot; способ реализации метода был найден лишь в 1992 г. Этот способ был воплощен при помощи LAPACK-программ ssyevd (для плотных матриц) и sstevd (для трехдиагональных матриц). В этих программах стратегия &amp;quot;разделяй-и-влавствуй&amp;quot; используется для матриц порядка выше 25. &lt;br /&gt;
&lt;br /&gt;
Для матриц порядка ниже 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;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&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;
&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;
&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;
где &amp;lt;math&amp;gt; u = \begin{bmatrix} Q_{1}^{T} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}^{T}\end{bmatrix}v &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;, так как &amp;lt;math&amp;gt;v = \begin{bmatrix} 0 , \ldots  ,  0 , 1 , 1 , 0 \ldots , 0 \end{bmatrix}^T&amp;lt;/math&amp;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;
В дальнейшем предполагаем, не ограничивая общности, что диагональные элементы &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;
&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;Лемма 1.&#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;
&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:Сергеев 1.jpg|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;Лемма 2.&#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;
&amp;lt;math&amp;gt;(D + \rho uu^{T})[(D - \alpha I)^{-1}u] = &lt;br /&gt;
&lt;br /&gt;
(D - \alpha I + \alpha I + \rho uu^{T})(D - \alpha I)^{-1}u = &lt;br /&gt;
&lt;br /&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 = \alpha [(D - \alpha I)^{-1}u]&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&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;
Что и требовалось доказать.&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;
До сих пор полагалось, что все &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;&#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;
&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;
Далее пойдет речь о решении &#039;&#039;&#039;векового уравнения&#039;&#039;&#039;, которое является одной из основных частей алгоритма.&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:Сергеев 2.jpg|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;
для &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;
&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;
&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; (*)&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;. Два условия в (*) - это обычные условия метода Ньютона, за исключением того, что вместо прямой в качестве приближения используется гипербола. Легко проверить, что &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;
&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;
&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;&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} \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;
Рассмотрим каким именно образом происходит вычисление собственных значений и собственных векторов симметричной трехдиагональной матрицы при помощи стратегии &amp;quot;разделяй и властвуй&amp;quot;:&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;если&#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; :&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 * &lt;br /&gt;
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;
         &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;
         &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;
         &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 изображена структура алгоритма.&lt;br /&gt;
[[File:Сергеев 5.jpg|thumb|center|left|1000px|Рис. 3. Дерево алгоритма &amp;quot;Разделяй и властвуй&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Данная структура алгоритма позволяет выполнять рекурсивный вызов функций для двух подматриц исходной матрицы как последовательно, так и параллельно. &lt;br /&gt;
При последовательной реализации алгоритма вызов функций производится по очереди - сначала для одной подматрицы, затем для другой. При параллельной реализации алгоритма данные функции могут отрабатывать одновременно.&lt;br /&gt;
Поскольку функции являются рекурсивными, их параллельный вызов даст значительный выигрыш во времени.&lt;br /&gt;
При размерности матрицы больше 3 параллельная реализация позволяет сократить количество этапов работы алгоритма больше, чем в два раза.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: трёхдиагональная симметрическая матрица, описанная в разделе [[#Математическое описание алгоритма]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; 2n - 1 &amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица собственных значений размера &amp;lt;math&amp;gt; 1 * n &amp;lt;/math&amp;gt; и матрица собственных векторов размера &amp;lt;math&amp;gt; n * n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n + n^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Данный алгоритм является самым быстрым алгоритмом среди существующих: Разделяй и властвуй, QR, Бисекция и обратная итерация.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Последовательная сложность данного алгоритма:&#039;&#039;&#039; &amp;lt;math&amp;gt; t = c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
Она удовлетворяет соотношению  &amp;lt;math&amp;gt;t(n) = n^3 +2t(\frac{n}{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параллельная сложность алгоритма (за счет дефляции):&#039;&#039;&#039; &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;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Особенности алгоритма:&#039;&#039;&#039;&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;
Тестирование реализации алгоритма проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; с использованием 1, 2, 4, 8, 16 процессоров на матрицах размера от 4 до 4096. Реализация произведена на библиотеке OpenMP.&lt;br /&gt;
&lt;br /&gt;
Общая эффективность программы увеличивается при увеличении числа процессоров (за счет сокращения времени работы программы) и уменьшается при увеличении размера матрицы (за счет увеличения времени обработки входных данных). При одновременном увеличении числа процессоров и размерности матрицы общая эффективность падает.&lt;br /&gt;
&lt;br /&gt;
Ниже приведена схема зависимости времени работы программы от размера матрицы при разном числе процессоров. При размере матрицы от 4 до 1024 время работы очень мало, поэтому эти данные не указаны на схеме.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
&lt;br /&gt;
 ssh compiler &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add openmpi/1.5.5-icc&lt;br /&gt;
 g++ _scratch/DivideAndConquer.c++ -fopenmp -std=c++0x -o DC &lt;br /&gt;
 sbatch -p test -n1 run ./DC&lt;br /&gt;
&lt;br /&gt;
Код реализации: https://drive.google.com/open?id=0B0G2UV7cuLwHQk9xd1lyeDNJOXc&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Единственный найденный пример реализации описан в [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot; ]   ([3] с. 7, 19-20).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[1] Дж. Деммель, «Вычислительная линейная алгебра» //С. 230-235&lt;br /&gt;
&lt;br /&gt;
[2] [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;
[3] [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;
[4] [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;
[5] [https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm Алгоритм &amp;quot;Разделяй и властвуй&amp;quot; - Wikipedia]&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>NikoSergAlex</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=21508</id>
		<title>Участник:Vika3410/Метод Разделяй и властвуй</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=21508"/>
		<updated>2016-12-28T20:49:20Z</updated>

		<summary type="html">&lt;p&gt;NikoSergAlex: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Авторы статьи: [[Участник:NikoSergAlex|Сергеев Никита]] (группа 614) (1.1, 1.2, 1.5, 1.6, 1.7, 1.8, 1.10), [[Участница:Vika3410|Стрельцова Виктория]] (группа 614) (1.2, 1.3, 1.4, 1.6, 1.7, 1.9, 1.10)&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод &amp;quot;Разделяй и властвуй&amp;quot; вычисления собственных значений и векторов трёхдиагональной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
| parallel_complexity = &amp;lt;math&amp;gt; O(n^{2.3}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
крайне редко: &amp;lt;math&amp;gt;  O(n^{2}) &amp;lt;/math&amp;gt; &lt;br /&gt;
| pf_width          = &lt;br /&gt;
| input_data        =  &amp;lt;math&amp;gt; 2n - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       =  &amp;lt;math&amp;gt; n + n^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;
&#039;&#039;&#039;Метод разделяй и властвуй вычисления собственных значений и векторов трёхдиагональной матрицы&#039;&#039;&#039; - является наиболее быстрым из существующих методов вычисления всех собственных значений и собственных векторов трехдиагональной матрицы, начиная с порядка n, который примерно равен 26. (Точное значение этого порогового порядка в конкретном случае зависит от компьютера.) &lt;br /&gt;
&lt;br /&gt;
Численно устойчивая реализация данного метода весьма не тривиальна, так как не смотря на то, что впервые метод был предложен в 1981 г., &amp;quot;правильный&amp;quot; способ реализации метода был найден лишь в 1992 г. Этот способ был воплощен при помощи LAPACK-программ ssyevd (для плотных матриц) и sstevd (для трехдиагональных матриц). В этих программах стратегия &amp;quot;разделяй-и-влавствуй&amp;quot; используется для матриц порядка выше 25. &lt;br /&gt;
&lt;br /&gt;
Для матриц порядка ниже 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;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&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;
&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;
&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;
где &amp;lt;math&amp;gt; u = \begin{bmatrix} Q_{1}^{T} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}^{T}\end{bmatrix}v &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;, так как &amp;lt;math&amp;gt;v = \begin{bmatrix} 0 , \ldots  ,  0 , 1 , 1 , 0 \ldots , 0 \end{bmatrix}^T&amp;lt;/math&amp;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;
В дальнейшем предполагаем, не ограничивая общности, что диагональные элементы &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;
&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;Лемма 1.&#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;
&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:Сергеев 1.jpg|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;Лемма 2.&#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;
&amp;lt;math&amp;gt;(D + \rho uu^{T})[(D - \alpha I)^{-1}u] = &lt;br /&gt;
&lt;br /&gt;
(D - \alpha I + \alpha I + \rho uu^{T})(D - \alpha I)^{-1}u = &lt;br /&gt;
&lt;br /&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 = \alpha [(D - \alpha I)^{-1}u]&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&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;
Что и требовалось доказать.&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;
До сих пор полагалось, что все &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;&#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;
&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;
Далее пойдет речь о решении &#039;&#039;&#039;векового уравнения&#039;&#039;&#039;, которое является одной из основных частей алгоритма.&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:Сергеев 2.jpg|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;
для &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;
&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;
&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; (*)&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;. Два условия в (*) - это обычные условия метода Ньютона, за исключением того, что вместо прямой в качестве приближения используется гипербола. Легко проверить, что &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;
&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;
&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;&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} \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;
Рассмотрим каким именно образом происходит вычисление собственных значений и собственных векторов симметричной трехдиагональной матрицы при помощи стратегии &amp;quot;разделяй и властвуй&amp;quot;:&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;если&#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; :&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 * &lt;br /&gt;
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;
         &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;
         &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;
         &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 изображена структура алгоритма.&lt;br /&gt;
[[File:Сергеев 5.jpg|thumb|center|left|1000px|Рис. 3. Дерево алгоритма &amp;quot;Разделяй и властвуй&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Данная структура алгоритма позволяет выполнять рекурсивный вызов функций для двух подматриц исходной матрицы как последовательно, так и параллельно. &lt;br /&gt;
При последовательной реализации алгоритма вызов функций производится по очереди - сначала для одной подматрицы, затем для другой. При параллельной реализации алгоритма данные функции могут отрабатывать одновременно.&lt;br /&gt;
Поскольку функции являются рекурсивными, их параллельный вызов даст значительный выигрыш во времени.&lt;br /&gt;
При размерности матрицы больше 3 параллельная реализация позволяет сократить количество этапов работы алгоритма больше, чем в два раза.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: трёхдиагональная симметрическая матрица, описанная в разделе [[#Математическое описание алгоритма]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; 2n - 1 &amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица собственных значений размера &amp;lt;math&amp;gt; 1 * n &amp;lt;/math&amp;gt; и матрица собственных векторов размера &amp;lt;math&amp;gt; n * n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n + n^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Данный алгоритм является самым быстрым алгоритмом среди существующих: Разделяй и властвуй, QR, Бисекция и обратная итерация.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Последовательная сложность данного алгоритма:&#039;&#039;&#039; &amp;lt;math&amp;gt; t = c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параллельная сложность алгоритма (за счет дефляции):&#039;&#039;&#039; &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;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Особенности алгоритма:&#039;&#039;&#039;&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;
Тестирование реализации алгоритма проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; с использованием 1, 2, 4, 8, 16 процессоров на матрицах размера от 4 до 4096. Реализация произведена на библиотеке OpenMP.&lt;br /&gt;
&lt;br /&gt;
Общая эффективность программы увеличивается при увеличении числа процессоров (за счет сокращения времени работы программы) и уменьшается при увеличении размера матрицы (за счет увеличения времени обработки входных данных). При одновременном увеличении числа процессоров и размерности матрицы общая эффективность падает.&lt;br /&gt;
&lt;br /&gt;
Ниже приведена схема зависимости времени работы программы от размера матрицы при разном числе процессоров. При размере матрицы от 4 до 1024 время работы очень мало, поэтому эти данные не указаны на схеме.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
&lt;br /&gt;
 ssh compiler &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add openmpi/1.5.5-icc&lt;br /&gt;
 g++ _scratch/DivideAndConquer.c++ -fopenmp -std=c++0x -o DC &lt;br /&gt;
 sbatch -p test -n1 run ./DC&lt;br /&gt;
&lt;br /&gt;
Код реализации: https://drive.google.com/open?id=0B0G2UV7cuLwHQk9xd1lyeDNJOXc&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Единственный найденный пример реализации описан в [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot; ]   ([3] с. 7, 19-20).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[1] Дж. Деммель, «Вычислительная линейная алгебра» //С. 230-235&lt;br /&gt;
&lt;br /&gt;
[2] [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;
[3] [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;
[4] [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;
[5] [https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm Алгоритм &amp;quot;Разделяй и властвуй&amp;quot; - Wikipedia]&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>NikoSergAlex</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=21507</id>
		<title>Участник:Vika3410/Метод Разделяй и властвуй</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=21507"/>
		<updated>2016-12-28T20:47:06Z</updated>

		<summary type="html">&lt;p&gt;NikoSergAlex: /* Литература */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Авторы статьи: [[Участник:NikoSergAlex|Сергеев Никита]] (группа 614) (1.1, 1.2, 1.5, 1.6, 1.7, 1.8, 1.10), [[Участница:Vika3410|Стрельцова Виктория]] (группа 614) (1.2, 1.3, 1.4, 1.6, 1.7, 1.9, 1.10)&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод &amp;quot;Разделяй и властвуй&amp;quot; вычисления собственных значений и векторов трёхдиагональной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
| parallel_complexity = &amp;lt;math&amp;gt; O(n^{2.3}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
крайне редко: &amp;lt;math&amp;gt;  O(n^{2}) &amp;lt;/math&amp;gt; &lt;br /&gt;
| pf_width          = &lt;br /&gt;
| input_data        =  &amp;lt;math&amp;gt; 2n - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       =  &amp;lt;math&amp;gt; n + n^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;
&#039;&#039;&#039;Метод разделяй и властвуй вычисления собственных значений и векторов трёхдиагональной матрицы&#039;&#039;&#039; - является наиболее быстрым из существующих методов вычисления всех собственных значений и собственных векторов трехдиагональной матрицы, начиная с порядка n, который примерно равен 26. (Точное значение этого порогового порядка в конкретном случае зависит от компьютера.) &lt;br /&gt;
&lt;br /&gt;
Численно устойчивая реализация данного метода весьма не тривиальна, так как не смотря на то, что впервые метод был предложен в 1981 г., &amp;quot;правильный&amp;quot; способ реализации метода был найден лишь в 1992 г. Этот способ был воплощен при помощи LAPACK-программ ssyevd (для плотных матриц) и sstevd (для трехдиагональных матриц). В этих программах стратегия &amp;quot;разделяй-и-влавствуй&amp;quot; используется для матриц порядка выше 25. &lt;br /&gt;
&lt;br /&gt;
Для матриц порядка ниже 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;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&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;
&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;
&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;
где &amp;lt;math&amp;gt; u = \begin{bmatrix} Q_{1}^{T} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}^{T}\end{bmatrix}v &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;, так как &amp;lt;math&amp;gt;v = \begin{bmatrix} 0 , \ldots  ,  0 , 1 , 1 , 0 \ldots , 0 \end{bmatrix}^T&amp;lt;/math&amp;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;
В дальнейшем предполагаем, не ограничивая общности, что диагональные элементы &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;
&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;Лемма 1.&#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;
&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:Сергеев 1.jpg|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;Лемма 2.&#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;
&amp;lt;math&amp;gt;(D + \rho uu^{T})[(D - \alpha I)^{-1}u] = &lt;br /&gt;
&lt;br /&gt;
(D - \alpha I + \alpha I + \rho uu^{T})(D - \alpha I)^{-1}u = &lt;br /&gt;
&lt;br /&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 = \alpha [(D - \alpha I)^{-1}u]&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&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;
Что и требовалось доказать.&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;
До сих пор полагалось, что все &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;&#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;
&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;
Далее пойдет речь о решении &#039;&#039;&#039;векового уравнения&#039;&#039;&#039;, которое является одной из основных частей алгоритма.&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:Сергеев 2.jpg|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;
для &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;
&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;
&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; (*)&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;. Два условия в (*) - это обычные условия метода Ньютона, за исключением того, что вместо прямой в качестве приближения используется гипербола. Легко проверить, что &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;
&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;
&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;&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} \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;
Рассмотрим каким именно образом происходит вычисление собственных значений и собственных векторов симметричной трехдиагональной матрицы при помощи стратегии &amp;quot;разделяй и властвуй&amp;quot;:&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;если&#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; :&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 * &lt;br /&gt;
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;
         &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;
         &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;
         &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 изображена структура алгоритма.&lt;br /&gt;
[[File:Сергеев 5.jpg|thumb|center|left|1000px|Рис. 3. Дерево алгоритма &amp;quot;Разделяй и властвуй&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Данная структура алгоритма позволяет выполнять рекурсивный вызов функций для двух подматриц исходной матрицы как последовательно, так и параллельно. &lt;br /&gt;
При последовательной реализации алгоритма вызов функций производится по очереди - сначала для одной подматрицы, затем для другой. При параллельной реализации алгоритма данные функции могут отрабатывать одновременно.&lt;br /&gt;
Поскольку функции являются рекурсивными, их параллельный вызов даст значительный выигрыш во времени.&lt;br /&gt;
При размерности матрицы больше 3 параллельная реализация позволяет сократить количество этапов работы алгоритма больше, чем в два раза.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: трёхдиагональная симметрическая матрица, описанная в разделе [[#Математическое описание алгоритма]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; 2n - 1 &amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица собственных значений размера &amp;lt;math&amp;gt; 1 * n &amp;lt;/math&amp;gt; и матрица собственных векторов размера &amp;lt;math&amp;gt; n * n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n + n^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Данный алгоритм является самым быстрым алгоритмом среди существующих: Разделяй и властвуй, QR, Бисекция и обратная итерация.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Последовательная сложность данного алгоритма:&#039;&#039;&#039; &amp;lt;math&amp;gt; t = c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параллельная сложность алгоритма (за счет дефляции):&#039;&#039;&#039; &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;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Особенности алгоритма:&#039;&#039;&#039;&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;
Тестирование реализации алгоритма проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; с использованием 1, 2, 4 и 8 процессоров на матрицах размера от 4 до 4096. Реализация произведена на библиотеке OpenMP.&lt;br /&gt;
&lt;br /&gt;
Общая эффективность программы увеличивается при увеличении числа процессоров (за счет сокращения времени работы программы) и уменьшается при увеличении размера матрицы (за счет увеличения времени обработки входных данных). При одновременном увеличении числа процессоров и размерности матрицы общая эффективность падает.&lt;br /&gt;
&lt;br /&gt;
Ниже приведена схема зависимости времени работы программы от размера матрицы при разном числе процессоров. При размере матрицы от 4 до 1024 время работы очень мало, поэтому эти данные не указаны на схеме.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
&lt;br /&gt;
 ssh compiler &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add openmpi/1.5.5-icc&lt;br /&gt;
 g++ _scratch/DivideAndConquer.c++ -fopenmp -std=c++0x -o DC &lt;br /&gt;
 sbatch -p test -n1 run ./DC&lt;br /&gt;
&lt;br /&gt;
Код реализации: https://drive.google.com/open?id=0B0G2UV7cuLwHQk9xd1lyeDNJOXc&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Единственный найденный пример реализации описан в [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot; ]   ([3] с. 7, 19-20).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[1] Дж. Деммель, «Вычислительная линейная алгебра» //С. 230-235&lt;br /&gt;
&lt;br /&gt;
[2] [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;
[3] [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;
[4] [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;
[5] [https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm Алгоритм &amp;quot;Разделяй и властвуй&amp;quot; - Wikipedia]&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>NikoSergAlex</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=21506</id>
		<title>Участник:Vika3410/Метод Разделяй и властвуй</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=21506"/>
		<updated>2016-12-28T20:43:55Z</updated>

		<summary type="html">&lt;p&gt;NikoSergAlex: /* Литература */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Авторы статьи: [[Участник:NikoSergAlex|Сергеев Никита]] (группа 614) (1.1, 1.2, 1.5, 1.6, 1.7, 1.8, 1.10), [[Участница:Vika3410|Стрельцова Виктория]] (группа 614) (1.2, 1.3, 1.4, 1.6, 1.7, 1.9, 1.10)&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод &amp;quot;Разделяй и властвуй&amp;quot; вычисления собственных значений и векторов трёхдиагональной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
| parallel_complexity = &amp;lt;math&amp;gt; O(n^{2.3}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
крайне редко: &amp;lt;math&amp;gt;  O(n^{2}) &amp;lt;/math&amp;gt; &lt;br /&gt;
| pf_width          = &lt;br /&gt;
| input_data        =  &amp;lt;math&amp;gt; 2n - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       =  &amp;lt;math&amp;gt; n + n^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;
&#039;&#039;&#039;Метод разделяй и властвуй вычисления собственных значений и векторов трёхдиагональной матрицы&#039;&#039;&#039; - является наиболее быстрым из существующих методов вычисления всех собственных значений и собственных векторов трехдиагональной матрицы, начиная с порядка n, который примерно равен 26. (Точное значение этого порогового порядка в конкретном случае зависит от компьютера.) &lt;br /&gt;
&lt;br /&gt;
Численно устойчивая реализация данного метода весьма не тривиальна, так как не смотря на то, что впервые метод был предложен в 1981 г., &amp;quot;правильный&amp;quot; способ реализации метода был найден лишь в 1992 г. Этот способ был воплощен при помощи LAPACK-программ ssyevd (для плотных матриц) и sstevd (для трехдиагональных матриц). В этих программах стратегия &amp;quot;разделяй-и-влавствуй&amp;quot; используется для матриц порядка выше 25. &lt;br /&gt;
&lt;br /&gt;
Для матриц порядка ниже 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;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&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;
&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;
&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;
где &amp;lt;math&amp;gt; u = \begin{bmatrix} Q_{1}^{T} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}^{T}\end{bmatrix}v &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;, так как &amp;lt;math&amp;gt;v = \begin{bmatrix} 0 , \ldots  ,  0 , 1 , 1 , 0 \ldots , 0 \end{bmatrix}^T&amp;lt;/math&amp;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;
В дальнейшем предполагаем, не ограничивая общности, что диагональные элементы &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;
&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;Лемма 1.&#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;
&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:Сергеев 1.jpg|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;Лемма 2.&#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;
&amp;lt;math&amp;gt;(D + \rho uu^{T})[(D - \alpha I)^{-1}u] = &lt;br /&gt;
&lt;br /&gt;
(D - \alpha I + \alpha I + \rho uu^{T})(D - \alpha I)^{-1}u = &lt;br /&gt;
&lt;br /&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 = \alpha [(D - \alpha I)^{-1}u]&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&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;
Что и требовалось доказать.&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;
До сих пор полагалось, что все &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;&#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;
&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;
Далее пойдет речь о решении &#039;&#039;&#039;векового уравнения&#039;&#039;&#039;, которое является одной из основных частей алгоритма.&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:Сергеев 2.jpg|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;
для &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;
&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;
&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; (*)&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;. Два условия в (*) - это обычные условия метода Ньютона, за исключением того, что вместо прямой в качестве приближения используется гипербола. Легко проверить, что &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;
&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;
&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;&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} \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;
Рассмотрим каким именно образом происходит вычисление собственных значений и собственных векторов симметричной трехдиагональной матрицы при помощи стратегии &amp;quot;разделяй и властвуй&amp;quot;:&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;если&#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; :&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 * &lt;br /&gt;
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;
         &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;
         &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;
         &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 изображена структура алгоритма.&lt;br /&gt;
[[File:Сергеев 5.jpg|thumb|center|left|1000px|Рис. 3. Дерево алгоритма &amp;quot;Разделяй и властвуй&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Данная структура алгоритма позволяет выполнять рекурсивный вызов функций для двух подматриц исходной матрицы как последовательно, так и параллельно. &lt;br /&gt;
При последовательной реализации алгоритма вызов функций производится по очереди - сначала для одной подматрицы, затем для другой. При параллельной реализации алгоритма данные функции могут отрабатывать одновременно.&lt;br /&gt;
Поскольку функции являются рекурсивными, их параллельный вызов даст значительный выигрыш во времени.&lt;br /&gt;
При размерности матрицы больше 3 параллельная реализация позволяет сократить количество этапов работы алгоритма больше, чем в два раза.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: трёхдиагональная симметрическая матрица, описанная в разделе [[#Математическое описание алгоритма]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; 2n - 1 &amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица собственных значений размера &amp;lt;math&amp;gt; 1 * n &amp;lt;/math&amp;gt; и матрица собственных векторов размера &amp;lt;math&amp;gt; n * n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n + n^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Данный алгоритм является самым быстрым алгоритмом среди существующих: Разделяй и властвуй, QR, Бисекция и обратная итерация.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Последовательная сложность данного алгоритма:&#039;&#039;&#039; &amp;lt;math&amp;gt; t = c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параллельная сложность алгоритма (за счет дефляции):&#039;&#039;&#039; &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;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Особенности алгоритма:&#039;&#039;&#039;&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;
Тестирование реализации алгоритма проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; с использованием 1, 2, 4 и 8 процессоров на матрицах размера от 4 до 4096. Реализация произведена на библиотеке OpenMP.&lt;br /&gt;
&lt;br /&gt;
Общая эффективность программы увеличивается при увеличении числа процессоров (за счет сокращения времени работы программы) и уменьшается при увеличении размера матрицы (за счет увеличения времени обработки входных данных). При одновременном увеличении числа процессоров и размерности матрицы общая эффективность падает.&lt;br /&gt;
&lt;br /&gt;
Ниже приведена схема зависимости времени работы программы от размера матрицы при разном числе процессоров. При размере матрицы от 4 до 1024 время работы очень мало, поэтому эти данные не указаны на схеме.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
&lt;br /&gt;
 ssh compiler &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add openmpi/1.5.5-icc&lt;br /&gt;
 g++ _scratch/DivideAndConquer.c++ -fopenmp -std=c++0x -o DC &lt;br /&gt;
 sbatch -p test -n1 run ./DC&lt;br /&gt;
&lt;br /&gt;
Код реализации: https://drive.google.com/open?id=0B0G2UV7cuLwHQk9xd1lyeDNJOXc&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Единственный найденный пример реализации описан в [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot; ]   ([3] с. 7, 19-20).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Дж. Деммель, &amp;quot;Вычислительная линейная алгебра&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[2] Doron Grill and Eitan Tadmor AN O(N2) {\displaystyle O(N2)} METHOD FOR COMPUTING THE EIGENSYSTEM OF N {\displaystyle N}xN {\displaystyle N} SYMMETRIC TRIDIAGONAL MATRICES BY THE DIVIDE AND CONQUER APPROACH&lt;br /&gt;
&lt;br /&gt;
[3] [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
[4] 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;
[5] [https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm Алгоритм &amp;quot;Разделяй и властвуй&amp;quot; - Wikipedia]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>NikoSergAlex</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=21505</id>
		<title>Участник:Vika3410/Метод Разделяй и властвуй</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=21505"/>
		<updated>2016-12-28T20:41:03Z</updated>

		<summary type="html">&lt;p&gt;NikoSergAlex: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Авторы статьи: [[Участник:NikoSergAlex|Сергеев Никита]] (группа 614) (1.1, 1.2, 1.5, 1.6, 1.7, 1.8, 1.10), [[Участница:Vika3410|Стрельцова Виктория]] (группа 614) (1.2, 1.3, 1.4, 1.6, 1.7, 1.9, 1.10)&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод &amp;quot;Разделяй и властвуй&amp;quot; вычисления собственных значений и векторов трёхдиагональной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
| parallel_complexity = &amp;lt;math&amp;gt; O(n^{2.3}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
крайне редко: &amp;lt;math&amp;gt;  O(n^{2}) &amp;lt;/math&amp;gt; &lt;br /&gt;
| pf_width          = &lt;br /&gt;
| input_data        =  &amp;lt;math&amp;gt; 2n - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       =  &amp;lt;math&amp;gt; n + n^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;
&#039;&#039;&#039;Метод разделяй и властвуй вычисления собственных значений и векторов трёхдиагональной матрицы&#039;&#039;&#039; - является наиболее быстрым из существующих методов вычисления всех собственных значений и собственных векторов трехдиагональной матрицы, начиная с порядка n, который примерно равен 26. (Точное значение этого порогового порядка в конкретном случае зависит от компьютера.) &lt;br /&gt;
&lt;br /&gt;
Численно устойчивая реализация данного метода весьма не тривиальна, так как не смотря на то, что впервые метод был предложен в 1981 г., &amp;quot;правильный&amp;quot; способ реализации метода был найден лишь в 1992 г. Этот способ был воплощен при помощи LAPACK-программ ssyevd (для плотных матриц) и sstevd (для трехдиагональных матриц). В этих программах стратегия &amp;quot;разделяй-и-влавствуй&amp;quot; используется для матриц порядка выше 25. &lt;br /&gt;
&lt;br /&gt;
Для матриц порядка ниже 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;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&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;
&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;
&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;
где &amp;lt;math&amp;gt; u = \begin{bmatrix} Q_{1}^{T} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}^{T}\end{bmatrix}v &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;, так как &amp;lt;math&amp;gt;v = \begin{bmatrix} 0 , \ldots  ,  0 , 1 , 1 , 0 \ldots , 0 \end{bmatrix}^T&amp;lt;/math&amp;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;
В дальнейшем предполагаем, не ограничивая общности, что диагональные элементы &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;
&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;Лемма 1.&#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;
&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:Сергеев 1.jpg|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;Лемма 2.&#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;
&amp;lt;math&amp;gt;(D + \rho uu^{T})[(D - \alpha I)^{-1}u] = &lt;br /&gt;
&lt;br /&gt;
(D - \alpha I + \alpha I + \rho uu^{T})(D - \alpha I)^{-1}u = &lt;br /&gt;
&lt;br /&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 = \alpha [(D - \alpha I)^{-1}u]&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&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;
Что и требовалось доказать.&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;
До сих пор полагалось, что все &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;&#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;
&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;
Далее пойдет речь о решении &#039;&#039;&#039;векового уравнения&#039;&#039;&#039;, которое является одной из основных частей алгоритма.&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:Сергеев 2.jpg|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;
для &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;
&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;
&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; (*)&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;. Два условия в (*) - это обычные условия метода Ньютона, за исключением того, что вместо прямой в качестве приближения используется гипербола. Легко проверить, что &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;
&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;
&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;&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} \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;
Рассмотрим каким именно образом происходит вычисление собственных значений и собственных векторов симметричной трехдиагональной матрицы при помощи стратегии &amp;quot;разделяй и властвуй&amp;quot;:&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;если&#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; :&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 * &lt;br /&gt;
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;
         &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;
         &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;
         &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 изображена структура алгоритма.&lt;br /&gt;
[[File:Сергеев 5.jpg|thumb|center|left|1000px|Рис. 3. Дерево алгоритма &amp;quot;Разделяй и властвуй&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Данная структура алгоритма позволяет выполнять рекурсивный вызов функций для двух подматриц исходной матрицы как последовательно, так и параллельно. &lt;br /&gt;
При последовательной реализации алгоритма вызов функций производится по очереди - сначала для одной подматрицы, затем для другой. При параллельной реализации алгоритма данные функции могут отрабатывать одновременно.&lt;br /&gt;
Поскольку функции являются рекурсивными, их параллельный вызов даст значительный выигрыш во времени.&lt;br /&gt;
При размерности матрицы больше 3 параллельная реализация позволяет сократить количество этапов работы алгоритма больше, чем в два раза.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: трёхдиагональная симметрическая матрица, описанная в разделе [[#Математическое описание алгоритма]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; 2n - 1 &amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица собственных значений размера &amp;lt;math&amp;gt; 1 * n &amp;lt;/math&amp;gt; и матрица собственных векторов размера &amp;lt;math&amp;gt; n * n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n + n^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Данный алгоритм является самым быстрым алгоритмом среди существующих: Разделяй и властвуй, QR, Бисекция и обратная итерация.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Последовательная сложность данного алгоритма:&#039;&#039;&#039; &amp;lt;math&amp;gt; t = c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параллельная сложность алгоритма (за счет дефляции):&#039;&#039;&#039; &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;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Особенности алгоритма:&#039;&#039;&#039;&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;
Тестирование реализации алгоритма проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; с использованием 1, 2, 4 и 8 процессоров на матрицах размера от 4 до 4096. Реализация произведена на библиотеке OpenMP.&lt;br /&gt;
&lt;br /&gt;
Общая эффективность программы увеличивается при увеличении числа процессоров (за счет сокращения времени работы программы) и уменьшается при увеличении размера матрицы (за счет увеличения времени обработки входных данных). При одновременном увеличении числа процессоров и размерности матрицы общая эффективность падает.&lt;br /&gt;
&lt;br /&gt;
Ниже приведена схема зависимости времени работы программы от размера матрицы при разном числе процессоров. При размере матрицы от 4 до 1024 время работы очень мало, поэтому эти данные не указаны на схеме.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
&lt;br /&gt;
 ssh compiler &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add openmpi/1.5.5-icc&lt;br /&gt;
 g++ _scratch/DivideAndConquer.c++ -fopenmp -std=c++0x -o DC &lt;br /&gt;
 sbatch -p test -n1 run ./DC&lt;br /&gt;
&lt;br /&gt;
Код реализации: https://drive.google.com/open?id=0B0G2UV7cuLwHQk9xd1lyeDNJOXc&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Единственный найденный пример реализации описан в [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot; ]   ([3] с. 7, 19-20).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Дж. Деммель, &amp;quot;Вычислительная линейная алгебра&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[2] [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
[3] [https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm Алгоритм &amp;quot;Разделяй и властвуй&amp;quot; - Wikipedia]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>NikoSergAlex</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=21502</id>
		<title>Участник:Vika3410/Метод Разделяй и властвуй</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=21502"/>
		<updated>2016-12-28T20:13:11Z</updated>

		<summary type="html">&lt;p&gt;NikoSergAlex: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Авторы статьи: [[Участник:NikoSergAlex|Сергеев Никита]] (группа 614) (1.1, 1.2, 1.5, 1.6, 1.7, 1.8, 1.10), [[Участница:Vika3410|Стрельцова Виктория]] (группа 614) (1.2, 1.3, 1.4, 1.6, 1.7, 1.9, 1.10)&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод &amp;quot;Разделяй и властвуй&amp;quot; вычисления собственных значений и векторов трёхдиагональной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
| parallel_complexity = &amp;lt;math&amp;gt; O(n^{2.3}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
крайне редко: &amp;lt;math&amp;gt;  O(n^{2}) &amp;lt;/math&amp;gt; &lt;br /&gt;
| pf_width          = &lt;br /&gt;
| input_data        =  &amp;lt;math&amp;gt; 2n - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       =  &amp;lt;math&amp;gt; n + n^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;
&#039;&#039;&#039;Метод разделяй и властвуй вычисления собственных значений и векторов трёхдиагональной матрицы&#039;&#039;&#039; - является наиболее быстрым из существующих методов вычисления всех собственных значений и собственных векторов трехдиагональной матрицы, начиная с порядка n, который примерно равен 26. (Точное значение этого порогового порядка в конкретном случае зависит от компьютера.) &lt;br /&gt;
&lt;br /&gt;
Численно устойчивая реализация данного метода весьма не тривиальна, так как не смотря на то, что впервые метод был предложен в 1981 г., &amp;quot;правильный&amp;quot; способ реализации метода был найден лишь в 1992 г. Этот способ был воплощен при помощи LAPACK-программ ssyevd (для плотных матриц) и sstevd (для трехдиагональных матриц). В этих программах стратегия &amp;quot;разделяй-и-влавствуй&amp;quot; используется для матриц порядка выше 25. &lt;br /&gt;
&lt;br /&gt;
Для матриц порядка ниже 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;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&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;
&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;
&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;
где &amp;lt;math&amp;gt; u = \begin{bmatrix} Q_{1}^{T} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}^{T}\end{bmatrix}v &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;, так как &amp;lt;math&amp;gt;v = \begin{bmatrix} 0 , \ldots  ,  0 , 1 , 1 , 0 \ldots , 0 \end{bmatrix}^T&amp;lt;/math&amp;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;
В дальнейшем предполагаем, не ограничивая общности, что диагональные элементы &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;
&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;Лемма 1.&#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;
&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:Сергеев 1.jpg|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;Лемма 2.&#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;
&amp;lt;math&amp;gt;(D + \rho uu^{T})[(D - \alpha I)^{-1}u] = &lt;br /&gt;
&lt;br /&gt;
(D - \alpha I + \alpha I + \rho uu^{T})(D - \alpha I)^{-1}u = &lt;br /&gt;
&lt;br /&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 = \alpha [(D - \alpha I)^{-1}u]&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&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;
Что и требовалось доказать.&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;
До сих пор полагалось, что все &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;&#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;
&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;
Далее пойдет речь о решении &#039;&#039;&#039;векового уравнения&#039;&#039;&#039;, которое является одной из основных частей алгоритма.&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:Сергеев 2.jpg|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;
для &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;
&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;
&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; (*)&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;. Два условия в (*) - это обычные условия метода Ньютона, за исключением того, что вместо прямой в качестве приближения используется гипербола. Легко проверить, что &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;
&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;
&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;&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} \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;
Рассмотрим каким именно образом происходит вычисление собственных значений и собственных векторов симметричной трехдиагональной матрицы при помощи стратегии &amp;quot;разделяй и властвуй&amp;quot;:&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;если&#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; :&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 * &lt;br /&gt;
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;
         &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;
         &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;
         &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 изображена структура алгоритма.&lt;br /&gt;
[[File:Сергеев 5.jpg|thumb|center|left|1000px|Рис. 3. Дерево алгоритма &amp;quot;Разделяй и властвуй&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Данная структура алгоритма позволяет выполнять рекурсивный вызов функций для двух подматриц исходной матрицы как последовательно, так и параллельно. &lt;br /&gt;
При последовательной реализации алгоритма вызов функций производится по очереди - сначала для одной подматрицы, затем для другой. При параллельной реализации алгоритма данные функции могут отрабатывать одновременно.&lt;br /&gt;
Поскольку функции являются рекурсивными, их параллельный вызов даст значительный выигрыш во времени.&lt;br /&gt;
При размерности матрицы больше 3 параллельная реализация позволяет сократить количество этапов работы алгоритма больше, чем в два раза.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: трёхдиагональная симметрическая матрица, описанная в разделе [[#Математическое описание алгоритма]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; 2n - 1 &amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица собственных значений размера &amp;lt;math&amp;gt; 1 * n &amp;lt;/math&amp;gt; и матрица собственных векторов размера &amp;lt;math&amp;gt; n * n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n + n^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Данный алгоритм является самым быстрым алгоритмом среди существующих: Разделяй и властвуй, QR, Бисекция и обратная итерация.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Последовательная сложность данного алгоритма:&#039;&#039;&#039; &amp;lt;math&amp;gt; t = c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параллельная сложность алгоритма (за счет дефляции):&#039;&#039;&#039; &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;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Особенности алгоритма:&#039;&#039;&#039;&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;
Параметры компиляции и запуска: &lt;br /&gt;
&lt;br /&gt;
 ssh compiler &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add openmpi/1.5.5-icc&lt;br /&gt;
 g++ _scratch/test.c++ -fopenmp -std=c++0x -o test &lt;br /&gt;
 sbatch -p test -n1 run ./test&lt;br /&gt;
&lt;br /&gt;
Код реализации: https://drive.google.com/open?id=0B0G2UV7cuLwHQk9xd1lyeDNJOXc&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Единственный найденный пример реализации описан в [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot; ]   ([3] с. 7, 19-20).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Дж. Деммель, &amp;quot;Вычислительная линейная алгебра&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[2] [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
[3] [https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm Алгоритм &amp;quot;Разделяй и властвуй&amp;quot; - Wikipedia]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>NikoSergAlex</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=21501</id>
		<title>Участник:Vika3410/Метод Разделяй и властвуй</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=21501"/>
		<updated>2016-12-28T20:12:14Z</updated>

		<summary type="html">&lt;p&gt;NikoSergAlex: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Авторы статьи: [[Участник:NikoSergAlex|Сергеев Никита]] (группа 614) (1.1, 1.2, 1.5, 1.6, 1.7, 1.8, 1.10), [[Участница:Vika3410|Стрельцова Виктория]] (группа 614) (1.2, 1.3, 1.4, 1.6, 1.7, 1.9, 1.10)&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод &amp;quot;Разделяй и властвуй&amp;quot; вычисления собственных значений и векторов трёхдиагональной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
| parallel_complexity = &amp;lt;math&amp;gt; O(n^{2.3}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
крайне редко: &amp;lt;math&amp;gt;  O(n^{2}) &amp;lt;/math&amp;gt; &lt;br /&gt;
| pf_width          = &lt;br /&gt;
| input_data        =  &amp;lt;math&amp;gt; 2n - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       =  &amp;lt;math&amp;gt; n + n^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;
&#039;&#039;&#039;Метод разделяй и властвуй вычисления собственных значений и векторов трёхдиагональной матрицы&#039;&#039;&#039; - является наиболее быстрым из существующих методов вычисления всех собственных значений и собственных векторов трехдиагональной матрицы, начиная с порядка n, который примерно равен 26. (Точное значение этого порогового порядка в конкретном случае зависит от компьютера.) &lt;br /&gt;
&lt;br /&gt;
Численно устойчивая реализация данного метода весьма не тривиальна, так как не смотря на то, что впервые метод был предложен в 1981 г., &amp;quot;правильный&amp;quot; способ реализации метода был найден лишь в 1992 г. Этот способ был воплощен при помощи LAPACK-программ ssyevd (для плотных матриц) и sstevd (для трехдиагональных матриц). В этих программах стратегия &amp;quot;разделяй-и-влавствуй&amp;quot; используется для матриц порядка выше 25. &lt;br /&gt;
&lt;br /&gt;
Для матриц порядка ниже 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;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&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;
&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;
&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;
где &amp;lt;math&amp;gt; u = \begin{bmatrix} Q_{1}^{T} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}^{T}\end{bmatrix}v &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;, так как &amp;lt;math&amp;gt;v = \begin{bmatrix} 0 , \ldots  ,  0 , 1 , 1 , 0 \ldots , 0 \end{bmatrix}^T&amp;lt;/math&amp;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;
В дальнейшем предполагаем, не ограничивая общности, что диагональные элементы &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;
&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;Лемма 1.&#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;
&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:Сергеев 1.jpg|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;Лемма 2.&#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;
&amp;lt;math&amp;gt;(D + \rho uu^{T})[(D - \alpha I)^{-1}u] = &lt;br /&gt;
&lt;br /&gt;
(D - \alpha I + \alpha I + \rho uu^{T})(D - \alpha I)^{-1}u = &lt;br /&gt;
&lt;br /&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 = \alpha [(D - \alpha I)^{-1}u]&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&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;
Что и требовалось доказать.&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;
До сих пор полагалось, что все &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;&#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;
&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;
Далее пойдет речь о решении &#039;&#039;&#039;векового уравнения&#039;&#039;&#039;, которое является одной из основных частей алгоритма.&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:Сергеев 2.jpg|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;
для &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;
&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;
&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; (*)&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;. Два условия в (*) - это обычные условия метода Ньютона, за исключением того, что вместо прямой в качестве приближения используется гипербола. Легко проверить, что &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;
&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;
&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;&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} \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;
Рассмотрим каким именно образом происходит вычисление собственных значений и собственных векторов симметричной трехдиагональной матрицы при помощи стратегии &amp;quot;разделяй и властвуй&amp;quot;:&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;если&#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; :&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 * &lt;br /&gt;
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;
         &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;
         &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;
         &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 изображена структура алгоритма.&lt;br /&gt;
[[File:Сергеев 5.jpg|thumb|center|left|1000px|Рис. 3. Дерево алгоритма &amp;quot;Разделяй и властвуй&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Данная структура алгоритма позволяет выполнять рекурсивный вызов функций для двух подматриц исходной матрицы как последовательно, так и параллельно. &lt;br /&gt;
При последовательной реализации алгоритма вызов функций производится по очереди - сначала для одной подматрицы, затем для другой. При параллельной реализации алгоритма данные функции могут отрабатывать одновременно.&lt;br /&gt;
Поскольку функции являются рекурсивными, их параллельный вызов даст значительный выигрыш во времени.&lt;br /&gt;
При размерности матрицы больше 3 параллельная реализация позволяет сократить количество этапов работы алгоритма больше, чем в два раза.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: трёхдиагональная симметрическая матрица, описанная в разделе [[#Математическое описание алгоритма]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; 2n - 1 &amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица собственных значений размера &amp;lt;math&amp;gt; 1 * n &amp;lt;/math&amp;gt; и матрица собственных векторов размера &amp;lt;math&amp;gt; n * n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n + n^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Данный алгоритм является самым быстрым алгоритмом среди существующих: Разделяй и властвуй, QR, Бисекция и обратная итерация.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Последовательная сложность данного алгоритма:&#039;&#039;&#039; &amp;lt;math&amp;gt; t = c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параллельная сложность алгоритма (за счет дефляции):&#039;&#039;&#039; &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;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Особенности алгоритма:&#039;&#039;&#039;&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;
Параметры компиляции и запуска: &lt;br /&gt;
&lt;br /&gt;
 ssh compiler &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add openmpi/1.5.5-icc&lt;br /&gt;
 g++ _scratch/test.c++ -fopenmp -std=c++0x -o test &lt;br /&gt;
 sbatch -p test -n1 run ./test&lt;br /&gt;
&lt;br /&gt;
Код реализации: https://drive.google.com/openid=0B0G2UV7cuLwHQk9xd1lyeDNJOXc&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Единственный найденный пример реализации описан в [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot; ]   ([3] с. 7, 19-20).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Дж. Деммель, &amp;quot;Вычислительная линейная алгебра&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[2] [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
[3] [https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm Алгоритм &amp;quot;Разделяй и властвуй&amp;quot; - Wikipedia]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>NikoSergAlex</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=21493</id>
		<title>Участник:Vika3410/Метод Разделяй и властвуй</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=21493"/>
		<updated>2016-12-26T12:58:32Z</updated>

		<summary type="html">&lt;p&gt;NikoSergAlex: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Авторы статьи: [[Участник:NikoSergAlex|Сергеев Никита]] (группа 614) (1.1, 1.2, 1.5, 1.6, 1.7, 1.8, 1.10), [[Участница:Vika3410|Стрельцова Виктория]] (группа 614) (1.2, 1.3, 1.4, 1.6, 1.7, 1.9, 1.10)&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод &amp;quot;Разделяй и властвуй&amp;quot; вычисления собственных значений и векторов трёхдиагональной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
| parallel_complexity = &amp;lt;math&amp;gt; O(n^{2.3}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
крайне редко: &amp;lt;math&amp;gt;  O(n^{2}) &amp;lt;/math&amp;gt; &lt;br /&gt;
| pf_width          = &lt;br /&gt;
| input_data        =  &amp;lt;math&amp;gt; 2n - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       =  &amp;lt;math&amp;gt; n + n^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;
&#039;&#039;&#039;Метод разделяй и властвуй вычисления собственных значений и векторов трёхдиагональной матрицы&#039;&#039;&#039; - является наиболее быстрым из существующих методов вычисления всех собственных значений и собственных векторов трехдиагональной матрицы, начиная с порядка n, который примерно равен 26. (Точное значение этого порогового порядка в конкретном случае зависит от компьютера.) &lt;br /&gt;
&lt;br /&gt;
Численно устойчивая реализация данного метода весьма не тривиальна, так как не смотря на то, что впервые метод был предложен в 1981 г., &amp;quot;правильный&amp;quot; способ реализации метода был найден лишь в 1992 г. Этот способ был воплощен при помощи LAPACK-программ ssyevd (для плотных матриц) и sstevd (для трехдиагональных матриц). В этих программах стратегия &amp;quot;разделяй-и-влавствуй&amp;quot; используется для матриц порядка выше 25. &lt;br /&gt;
&lt;br /&gt;
Для матриц порядка ниже 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;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&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;
&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;
&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;
где &amp;lt;math&amp;gt; u = \begin{bmatrix} Q_{1}^{T} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}^{T}\end{bmatrix}v &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;, так как &amp;lt;math&amp;gt;v = \begin{bmatrix} 0 , \ldots  ,  0 , 1 , 1 , 0 \ldots , 0 \end{bmatrix}^T&amp;lt;/math&amp;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;
В дальнейшем предполагаем, не ограничивая общности, что диагональные элементы &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;
&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;Лемма 1.&#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;
&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:Сергеев 1.jpg|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;Лемма 2.&#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;
&amp;lt;math&amp;gt;(D + \rho uu^{T})[(D - \alpha I)^{-1}u] = &lt;br /&gt;
&lt;br /&gt;
(D - \alpha I + \alpha I + \rho uu^{T})(D - \alpha I)^{-1}u = &lt;br /&gt;
&lt;br /&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 = \alpha [(D - \alpha I)^{-1}u]&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&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;
Что и требовалось доказать.&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;
До сих пор полагалось, что все &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;&#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;
&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;
Далее пойдет речь о решении &#039;&#039;&#039;векового уравнения&#039;&#039;&#039;, которое является одной из основных частей алгоритма.&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:Сергеев 2.jpg|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;
для &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;
&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;
&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; (*)&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;. Два условия в (*) - это обычные условия метода Ньютона, за исключением того, что вместо прямой в качестве приближения используется гипербола. Легко проверить, что &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;
&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;
&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;&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} \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;
Рассмотрим каким именно образом происходит вычисление собственных значений и собственных векторов симметричной трехдиагональной матрицы при помощи стратегии &amp;quot;разделяй и властвуй&amp;quot;:&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;если&#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; :&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 * &lt;br /&gt;
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;
         &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;
         &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;
         &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 изображена структура алгоритма.&lt;br /&gt;
[[File:Сергеев 5.jpg|thumb|center|left|1000px|Рис. 3. Дерево алгоритма &amp;quot;Разделяй и властвуй&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Данная структура алгоритма позволяет выполнять рекурсивный вызов функций для двух подматриц исходной матрицы как последовательно, так и параллельно. &lt;br /&gt;
При последовательной реализации алгоритма вызов функций производится по очереди - сначала для одной подматрицы, затем для другой. При параллельной реализации алгоритма данные функции могут отрабатывать одновременно.&lt;br /&gt;
Поскольку функции являются рекурсивными, их параллельный вызов даст значительный выигрыш во времени.&lt;br /&gt;
При размерности матрицы больше 3 параллельная реализация позволяет сократить количество этапов работы алгоритма больше, чем в два раза.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: трёхдиагональная симметрическая матрица, описанная в разделе [[#Математическое описание алгоритма]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; 2n - 1 &amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица собственных значений размера &amp;lt;math&amp;gt; 1 * n &amp;lt;/math&amp;gt; и матрица собственных векторов размера &amp;lt;math&amp;gt; n * n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n + n^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Данный алгоритм является самым быстрым алгоритмом среди существующих: Разделяй и властвуй, QR, Бисекция и обратная итерация.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Последовательная сложность данного алгоритма:&#039;&#039;&#039; &amp;lt;math&amp;gt; t = c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параллельная сложность алгоритма (за счет дефляции):&#039;&#039;&#039; &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;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Особенности алгоритма:&#039;&#039;&#039;&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;
Параметры компиляции и запуска: &lt;br /&gt;
&lt;br /&gt;
 ssh compiler &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add openmpi/1.5.5-icc&lt;br /&gt;
 g++ _scratch/test.c++ -fopenmp -std=c++0x -o test &lt;br /&gt;
 sbatch -p test -n1 run ./test&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;
Единственный найденный пример реализации описан в [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot; ]   ([3] с. 7, 19-20).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Дж. Деммель, &amp;quot;Вычислительная линейная алгебра&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[2] [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
[3] [https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm Алгоритм &amp;quot;Разделяй и властвуй&amp;quot; - Wikipedia]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>NikoSergAlex</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=15854</id>
		<title>Участник:Vika3410/Метод Разделяй и властвуй</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=15854"/>
		<updated>2016-11-02T21:14:05Z</updated>

		<summary type="html">&lt;p&gt;NikoSergAlex: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
Авторы статьи: [[Участник:NikoSergAlex|Сергеев Никита]] (группа 614) (1.1, 1.2, 1.5, 1.6, 1.7, 1.8, 1.10), [[Участница:Vika3410|Стрельцова Виктория]] (группа 614) (1.2, 1.3, 1.4, 1.6, 1.7, 1.9, 1.10)&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод &amp;quot;Разделяй и властвуй&amp;quot; вычисления собственных значений и векторов трёхдиагональной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
| parallel_complexity = &amp;lt;math&amp;gt; O(n^{2.3}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
крайне редко: &amp;lt;math&amp;gt;  O(n^{2}) &amp;lt;/math&amp;gt; &lt;br /&gt;
| pf_width          = &lt;br /&gt;
| input_data        =  &amp;lt;math&amp;gt; 2n - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       =  &amp;lt;math&amp;gt; n + n^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;
&#039;&#039;&#039;Метод разделяй и властвуй вычисления собственных значений и векторов трёхдиагональной матрицы&#039;&#039;&#039; - является наиболее быстрым из существующих методов вычисления всех собственных значений и собственных векторов трехдиагональной матрицы, начиная с порядка n, который примерно равен 26. (Точное значение этого порогового порядка в конкретном случае зависит от компьютера.) &lt;br /&gt;
&lt;br /&gt;
Численно устойчивая реализация данного метода весьма не тривиальна, так как не смотря на то, что впервые метод был предложен в 1981 г., &amp;quot;правильный&amp;quot; способ реализации метода был найден лишь в 1992 г. Этот способ был воплощен при помощи LAPACK-программ ssyevd (для плотных матриц) и sstevd (для трехдиагональных матриц). В этих программах стратегия &amp;quot;разделяй-и-влавствуй&amp;quot; используется для матриц порядка выше 25. &lt;br /&gt;
&lt;br /&gt;
Для матриц порядка ниже 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;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&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;
&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;
&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;
где &amp;lt;math&amp;gt; u = \begin{bmatrix} Q_{1}^{T} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}^{T}\end{bmatrix}v &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;, так как &amp;lt;math&amp;gt;v = \begin{bmatrix} 0 , \ldots  ,  0 , 1 , 1 , 0 \ldots , 0 \end{bmatrix}^T&amp;lt;/math&amp;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;
В дальнейшем предполагаем, не ограничивая общности, что диагональные элементы &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;
&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;Лемма 1.&#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;
&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:Сергеев 1.jpg|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;Лемма 2.&#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;
&amp;lt;math&amp;gt;(D + \rho uu^{T})[(D - \alpha I)^{-1}u] = &lt;br /&gt;
&lt;br /&gt;
(D - \alpha I + \alpha I + \rho uu^{T})(D - \alpha I)^{-1}u = &lt;br /&gt;
&lt;br /&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 = \alpha [(D - \alpha I)^{-1}u]&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&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;
Что и требовалось доказать.&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;
До сих пор полагалось, что все &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;&#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;
&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;
Далее пойдет речь о решении &#039;&#039;&#039;векового уравнения&#039;&#039;&#039;, которое является одной из основных частей алгоритма.&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:Сергеев 2.jpg|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;
для &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;
&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;
&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; (*)&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;. Два условия в (*) - это обычные условия метода Ньютона, за исключением того, что вместо прямой в качестве приближения используется гипербола. Легко проверить, что &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;
&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;
&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;&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} \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;
Рассмотрим каким именно образом происходит вычисление собственных значений и собственных векторов симметричной трехдиагональной матрицы при помощи стратегии &amp;quot;разделяй и властвуй&amp;quot;:&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;если&#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; :&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 * &lt;br /&gt;
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;
         &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;
         &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;
         &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 изображена структура алгоритма.&lt;br /&gt;
[[File:Сергеев 5.jpg|thumb|center|left|1000px|Рис. 3. Дерево алгоритма &amp;quot;Разделяй и властвуй&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Данная структура алгоритма позволяет выполнять рекурсивный вызов функций для двух подматриц исходной матрицы как последовательно, так и параллельно. &lt;br /&gt;
При последовательной реализации алгоритма вызов функций производится по очереди - сначала для одной подматрицы, затем для другой. При параллельной реализации алгоритма данные функции могут отрабатывать одновременно.&lt;br /&gt;
Поскольку функции являются рекурсивными, их параллельный вызов даст значительный выигрыш во времени.&lt;br /&gt;
При размерности матрицы больше 3 параллельная реализация позволяет сократить количество этапов работы алгоритма больше, чем в два раза.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: трёхдиагональная симметрическая матрица, описанная в разделе [[#Математическое описание алгоритма]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; 2n - 1 &amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица собственных значений размера &amp;lt;math&amp;gt; 1 * n &amp;lt;/math&amp;gt; и матрица собственных векторов размера &amp;lt;math&amp;gt; n * n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n + n^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Данный алгоритм является самым быстрым алгоритмом среди существующих: Разделяй и властвуй, QR, Бисекция и обратная итерация.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Последовательная сложность данного алгоритма:&#039;&#039;&#039; &amp;lt;math&amp;gt; t = c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параллельная сложность алгоритма (за счет дефляции):&#039;&#039;&#039; &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;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Особенности алгоритма:&#039;&#039;&#039;&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;
Единственный найденный пример реализации описан в [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot; ]   ([3] с. 7, 19-20).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Дж. Деммель, &amp;quot;Вычислительная линейная алгебра&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[2] [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
[3] [https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm Алгоритм &amp;quot;Разделяй и властвуй&amp;quot; - Wikipedia]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>NikoSergAlex</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=15852</id>
		<title>Участник:Vika3410/Метод Разделяй и властвуй</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=15852"/>
		<updated>2016-11-02T21:07:13Z</updated>

		<summary type="html">&lt;p&gt;NikoSergAlex: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Авторы статьи: [[Участник:NikoSergAlex|Сергеев Никита]] (группа 614) (1.1, 1.2, 1.5, 1.6, 1.7, 1.9, 1.10), [[Участница:Vika3410|Стрельцова Виктория]] (группа 614) (1.2, 1.3, 1.4, 1.6, 1.7, 1.8, 1.10)&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод &amp;quot;Разделяй и властвуй&amp;quot; вычисления собственных значений и векторов трёхдиагональной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
| parallel_complexity = &amp;lt;math&amp;gt; O(n^{2.3}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
крайне редко: &amp;lt;math&amp;gt;  O(n^{2}) &amp;lt;/math&amp;gt; &lt;br /&gt;
| pf_width          = &lt;br /&gt;
| input_data        =  &amp;lt;math&amp;gt; 2n - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       =  &amp;lt;math&amp;gt; n + n^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;
&#039;&#039;&#039;Метод разделяй и властвуй вычисления собственных значений и векторов трёхдиагональной матрицы&#039;&#039;&#039; - является наиболее быстрым из существующих методов вычисления всех собственных значений и собственных векторов трехдиагональной матрицы, начиная с порядка n, который примерно равен 26. (Точное значение этого порогового порядка в конкретном случае зависит от компьютера.) &lt;br /&gt;
&lt;br /&gt;
Численно устойчивая реализация данного метода весьма не тривиальна, так как не смотря на то, что впервые метод был предложен в 1981 г., &amp;quot;правильный&amp;quot; способ реализации метода был найден лишь в 1992 г. Этот способ был воплощен при помощи LAPACK-программ ssyevd (для плотных матриц) и sstevd (для трехдиагональных матриц). В этих программах стратегия &amp;quot;разделяй-и-влавствуй&amp;quot; используется для матриц порядка выше 25. &lt;br /&gt;
&lt;br /&gt;
Для матриц порядка ниже 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;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&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;
&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;
&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;
где &amp;lt;math&amp;gt; u = \begin{bmatrix} Q_{1}^{T} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}^{T}\end{bmatrix}v &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;, так как &amp;lt;math&amp;gt;v = \begin{bmatrix} 0 , \ldots  ,  0 , 1 , 1 , 0 \ldots , 0 \end{bmatrix}^T&amp;lt;/math&amp;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;
В дальнейшем предполагаем, не ограничивая общности, что диагональные элементы &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;
&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;Лемма 1.&#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;
&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:Сергеев 1.jpg|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;Лемма 2.&#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;
&amp;lt;math&amp;gt;(D + \rho uu^{T})[(D - \alpha I)^{-1}u] = &lt;br /&gt;
&lt;br /&gt;
(D - \alpha I + \alpha I + \rho uu^{T})(D - \alpha I)^{-1}u = &lt;br /&gt;
&lt;br /&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 = \alpha [(D - \alpha I)^{-1}u]&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&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;
Что и требовалось доказать.&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;
До сих пор полагалось, что все &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;&#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;
&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;
Далее пойдет речь о решении &#039;&#039;&#039;векового уравнения&#039;&#039;&#039;, которое является одной из основных частей алгоритма.&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:Сергеев 2.jpg|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;
для &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;
&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;
&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; (*)&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;. Два условия в (*) - это обычные условия метода Ньютона, за исключением того, что вместо прямой в качестве приближения используется гипербола. Легко проверить, что &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;
&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;
&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;&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} \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;
Рассмотрим каким именно образом происходит вычисление собственных значений и собственных векторов симметричной трехдиагональной матрицы при помощи стратегии &amp;quot;разделяй и властвуй&amp;quot;:&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;если&#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; :&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 * &lt;br /&gt;
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;
         &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;
         &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;
         &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 изображена структура алгоритма.&lt;br /&gt;
[[File:Сергеев 5.jpg|thumb|center|left|1000px|Рис. 3. Дерево алгоритма &amp;quot;Разделяй и властвуй&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Данная структура алгоритма позволяет выполнять рекурсивный вызов функций для двух подматриц исходной матрицы как последовательно, так и параллельно. &lt;br /&gt;
При последовательной реализации алгоритма вызов функций производится по очереди - сначала для одной подматрицы, затем для другой. При параллельной реализации алгоритма данные функции могут отрабатывать одновременно.&lt;br /&gt;
Поскольку функции являются рекурсивными, их параллельный вызов даст значительный выигрыш во времени.&lt;br /&gt;
При размерности матрицы больше 3 параллельная реализация позволяет сократить количество этапов работы алгоритма больше, чем в два раза.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: трёхдиагональная симметрическая матрица, описанная в разделе [[#Математическое описание алгоритма]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; 2n - 1 &amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица собственных значений размера &amp;lt;math&amp;gt; 1 * n &amp;lt;/math&amp;gt; и матрица собственных векторов размера &amp;lt;math&amp;gt; n * n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n + n^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Данный алгоритм является самым быстрым алгоритмом среди существующих: Разделяй и властвуй, QR, Бисекция и обратная итерация.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Последовательная сложность данного алгоритма:&#039;&#039;&#039; &amp;lt;math&amp;gt; t = c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параллельная сложность алгоритма (за счет дефляции):&#039;&#039;&#039; &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;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Особенности алгоритма:&#039;&#039;&#039;&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;
Единственный найденный пример реализации описан в [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot; ]   ([3] с. 7, 19-20).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Дж. Деммель, &amp;quot;Вычислительная линейная алгебра&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[2] [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
[3] [https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm Алгоритм &amp;quot;Разделяй и властвуй&amp;quot; - Wikipedia]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>NikoSergAlex</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2_5.jpg&amp;diff=15850</id>
		<title>Файл:Сергеев 5.jpg</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B5%D0%B2_5.jpg&amp;diff=15850"/>
		<updated>2016-11-02T21:01:38Z</updated>

		<summary type="html">&lt;p&gt;NikoSergAlex: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>NikoSergAlex</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=15848</id>
		<title>Участник:Vika3410/Метод Разделяй и властвуй</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=15848"/>
		<updated>2016-11-02T20:22:47Z</updated>

		<summary type="html">&lt;p&gt;NikoSergAlex: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Авторы статьи: [[Участник:NikoSergAlex|Сергеев Никита]] (группа 614) (1.1, 1.2, 1.5, 1.6, 1.7, 1.9, 1.10), [[Участница:Vika3410|Стрельцова Виктория]] (группа 614) (1.2, 1.3, 1.4, 1.6, 1.7, 1.8, 1.10)&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод &amp;quot;Разделяй и властвуй&amp;quot; вычисления собственных значений и векторов трёхдиагональной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
| parallel_complexity = &amp;lt;math&amp;gt; O(n^{2.3}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
крайне редко: &amp;lt;math&amp;gt;  O(n^{2}) &amp;lt;/math&amp;gt; &lt;br /&gt;
| pf_width          = &lt;br /&gt;
| input_data        =  &amp;lt;math&amp;gt; 2n - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       =  &amp;lt;math&amp;gt; n + n^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;
&#039;&#039;&#039;Метод разделяй и властвуй вычисления собственных значений и векторов трёхдиагональной матрицы&#039;&#039;&#039; - является наиболее быстрым из существующих методов вычисления всех собственных значений и собственных векторов трехдиагональной матрицы, начиная с порядка n, который примерно равен 26. (Точное значение этого порогового порядка в конкретном случае зависит от компьютера.) &lt;br /&gt;
&lt;br /&gt;
Численно устойчивая реализация данного метода весьма не тривиальна, так как не смотря на то, что впервые метод был предложен в 1981 г., &amp;quot;правильный&amp;quot; способ реализации метода был найден лишь в 1992 г. Этот способ был воплощен при помощи LAPACK-программ ssyevd (для плотных матриц) и sstevd (для трехдиагональных матриц). В этих программах стратегия &amp;quot;разделяй-и-влавствуй&amp;quot; используется для матриц порядка выше 25. &lt;br /&gt;
&lt;br /&gt;
Для матриц порядка ниже 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;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&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;
&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;
&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;
где &amp;lt;math&amp;gt; u = \begin{bmatrix} Q_{1}^{T} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}^{T}\end{bmatrix}v &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;, так как &amp;lt;math&amp;gt;v = \begin{bmatrix} 0 , \ldots  ,  0 , 1 , 1 , 0 \ldots , 0 \end{bmatrix}^T&amp;lt;/math&amp;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;
В дальнейшем предполагаем, не ограничивая общности, что диагональные элементы &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;
&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;Лемма 1.&#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;
&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:Сергеев 1.jpg|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;Лемма 2.&#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;
&amp;lt;math&amp;gt;(D + \rho uu^{T})[(D - \alpha I)^{-1}u] = &lt;br /&gt;
&lt;br /&gt;
(D - \alpha I + \alpha I + \rho uu^{T})(D - \alpha I)^{-1}u = &lt;br /&gt;
&lt;br /&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 = \alpha [(D - \alpha I)^{-1}u]&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&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;
Что и требовалось доказать.&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;
До сих пор полагалось, что все &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;&#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;
&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;
Далее пойдет речь о решении &#039;&#039;&#039;векового уравнения&#039;&#039;&#039;, которое является одной из основных частей алгоритма.&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:Сергеев 2.jpg|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;
для &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;
&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;
&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; (*)&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;. Два условия в (*) - это обычные условия метода Ньютона, за исключением того, что вместо прямой в качестве приближения используется гипербола. Легко проверить, что &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;
&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;
&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;&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} \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;
Рассмотрим каким именно образом происходит вычисление собственных значений и собственных векторов симметричной трехдиагональной матрицы при помощи стратегии &amp;quot;разделяй и властвуй&amp;quot;:&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;если&#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; :&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 * &lt;br /&gt;
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;
         &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;
         &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;
         &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 изображена структура всего алгоритма, на рисунке 4 подробно описана одна из ячеек структуры.&lt;br /&gt;
[[File:Сергеев 5.jpg|thumb|center|left|1500px|Рис. 3. Дерево алгоритма &amp;quot;Разделяй и властвуй&amp;quot;]]&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;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: трёхдиагональная симметрическая матрица, описанная в разделе [[#Математическое описание алгоритма]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; 2n - 1 &amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица собственных значений размера &amp;lt;math&amp;gt; 1 * n &amp;lt;/math&amp;gt; и матрица собственных векторов размера &amp;lt;math&amp;gt; n * n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n + n^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Данный алгоритм является самым быстрым алгоритмом среди существующих: Разделяй и властвуй, QR, Бисекция и обратная итерация.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Последовательная сложность данного алгоритма:&#039;&#039;&#039; &amp;lt;math&amp;gt; t = c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параллельная сложность алгоритма (за счет дефляции):&#039;&#039;&#039; &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;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Особенности алгоритма:&#039;&#039;&#039;&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;
Единственный найденный пример реализации описан в [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot; ]   ([3] с. 7, 19-20).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Дж. Деммель, &amp;quot;Вычислительная линейная алгебра&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[2] [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
[3] [https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm Алгоритм &amp;quot;Разделяй и властвуй&amp;quot; - Wikipedia]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>NikoSergAlex</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=15847</id>
		<title>Участник:Vika3410/Метод Разделяй и властвуй</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=15847"/>
		<updated>2016-11-02T20:21:52Z</updated>

		<summary type="html">&lt;p&gt;NikoSergAlex: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Авторы статьи: [[Участник:NikoSergAlex|Сергеев Никита]] (группа 614) (1.1, 1.2, 1.5, 1.6, 1.7, 1.9, 1.10), [[Участница:Vika3410|Стрельцова Виктория]] (группа 614) (1.2, 1.3, 1.4, 1.6, 1.7, 1.8, 1.10)&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод &amp;quot;Разделяй и властвуй&amp;quot; вычисления собственных значений и векторов трёхдиагональной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
| parallel_complexity = &amp;lt;math&amp;gt; O(n^{2.3}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
крайне редко: &amp;lt;math&amp;gt;  O(n^{2}) &amp;lt;/math&amp;gt; &lt;br /&gt;
| pf_width          = &lt;br /&gt;
| input_data        =  &amp;lt;math&amp;gt; 2n - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       =  &amp;lt;math&amp;gt; n + n^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;
&#039;&#039;&#039;Метод разделяй и властвуй вычисления собственных значений и векторов трёхдиагональной матрицы&#039;&#039;&#039; - является наиболее быстрым из существующих методов вычисления всех собственных значений и собственных векторов трехдиагональной матрицы, начиная с порядка n, который примерно равен 26. (Точное значение этого порогового порядка в конкретном случае зависит от компьютера.) &lt;br /&gt;
&lt;br /&gt;
Численно устойчивая реализация данного метода весьма не тривиальна, так как не смотря на то, что впервые метод был предложен в 1981 г., &amp;quot;правильный&amp;quot; способ реализации метода был найден лишь в 1992 г. Этот способ был воплощен при помощи LAPACK-программ ssyevd (для плотных матриц) и sstevd (для трехдиагональных матриц). В этих программах стратегия &amp;quot;разделяй-и-влавствуй&amp;quot; используется для матриц порядка выше 25. &lt;br /&gt;
&lt;br /&gt;
Для матриц порядка ниже 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;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&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;
&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;
&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;
где &amp;lt;math&amp;gt; u = \begin{bmatrix} Q_{1}^{T} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}^{T}\end{bmatrix}v &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;, так как &amp;lt;math&amp;gt;v = \begin{bmatrix} 0 , \ldots  ,  0 , 1 , 1 , 0 \ldots , 0 \end{bmatrix}^T&amp;lt;/math&amp;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;
В дальнейшем предполагаем, не ограничивая общности, что диагональные элементы &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;
&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;Лемма 1.&#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;
&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:Сергеев 1.jpg|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;Лемма 2.&#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;
&amp;lt;math&amp;gt;(D + \rho uu^{T})[(D - \alpha I)^{-1}u] = &lt;br /&gt;
&lt;br /&gt;
(D - \alpha I + \alpha I + \rho uu^{T})(D - \alpha I)^{-1}u = &lt;br /&gt;
&lt;br /&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 = \alpha [(D - \alpha I)^{-1}u]&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&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;
Что и требовалось доказать.&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;
До сих пор полагалось, что все &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;&#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;
&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;
Далее пойдет речь о решении &#039;&#039;&#039;векового уравнения&#039;&#039;&#039;, которое является одной из основных частей алгоритма.&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:Сергеев 2.jpg|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;
для &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;
&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;
&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; (*)&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;. Два условия в (*) - это обычные условия метода Ньютона, за исключением того, что вместо прямой в качестве приближения используется гипербола. Легко проверить, что &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;
&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;
&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;&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} \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;
Рассмотрим каким именно образом происходит вычисление собственных значений и собственных векторов симметричной трехдиагональной матрицы при помощи стратегии &amp;quot;разделяй и властвуй&amp;quot;:&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;если&#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; :&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 * &lt;br /&gt;
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;
         &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;
         &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;
         &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 изображена структура всего алгоритма, на рисунке 4 подробно описана одна из ячеек структуры.&lt;br /&gt;
[[File:Сергеев 5.jpg|thumb|center|left|800px|Рис. 3. Дерево алгоритма &amp;quot;Разделяй и властвуй&amp;quot;]]&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;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: трёхдиагональная симметрическая матрица, описанная в разделе [[#Математическое описание алгоритма]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; 2n - 1 &amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица собственных значений размера &amp;lt;math&amp;gt; 1 * n &amp;lt;/math&amp;gt; и матрица собственных векторов размера &amp;lt;math&amp;gt; n * n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n + n^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Данный алгоритм является самым быстрым алгоритмом среди существующих: Разделяй и властвуй, QR, Бисекция и обратная итерация.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Последовательная сложность данного алгоритма:&#039;&#039;&#039; &amp;lt;math&amp;gt; t = c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Параллельная сложность алгоритма (за счет дефляции):&#039;&#039;&#039; &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;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Особенности алгоритма:&#039;&#039;&#039;&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;
Единственный найденный пример реализации описан в [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot; ]   ([3] с. 7, 19-20).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Дж. Деммель, &amp;quot;Вычислительная линейная алгебра&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[2] [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
[3] [https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm Алгоритм &amp;quot;Разделяй и властвуй&amp;quot; - Wikipedia]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>NikoSergAlex</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=15750</id>
		<title>Участник:Vika3410/Метод Разделяй и властвуй</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=15750"/>
		<updated>2016-11-02T10:44:08Z</updated>

		<summary type="html">&lt;p&gt;NikoSergAlex: /* Макроструктура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
Авторы статьи: [[Участник:NikoSergAlex|Сергеев Никита]] (группа 614) (1.1, 1.2, 1.5, 1.6, 1.7, 1.9, 1.10), [[Участница:Vika3410|Стрельцова Виктория]] (группа 614) (1.2, 1.3, 1.4, 1.6, 1.7, 1.8, 1.10)&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод &amp;quot;Разделяй и властвуй&amp;quot; вычисления собственных значений и векторов трёхдиагональной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
| parallel_complexity = &amp;lt;math&amp;gt; O(n^{2.3}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
крайне редко: &amp;lt;math&amp;gt;  O(n^{2}) &amp;lt;/math&amp;gt; &lt;br /&gt;
| pf_width          = &lt;br /&gt;
| input_data        = трёхдиагональная матрица&lt;br /&gt;
| output_data       = матрица собственных значений и матрица собственных векторов исходной матрицы&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; - является наиболее быстрым из существующих методов вычисления всех собственных значений и собственных векторов трехдиагональной матрицы, начиная с порядка n, который примерно равен 26. (Точное значение этого порогового порядка в конкретном случае зависит от компьютера.) &lt;br /&gt;
&lt;br /&gt;
Численно устойчивая реализация данного метода весьма не тривиальна, так как не смотря на то, что впервые метод был предложен в 1981 г., &amp;quot;правильный&amp;quot; способ реализации метода был найден лишь в 1992 г. Этот способ был воплощен при помощи LAPACK-программ ssyevd (для плотных матриц) и sstevd (для трехдиагональных матриц). В этих программах стратегия &amp;quot;разделяй-и-влавствуй&amp;quot; используется для матриц порядка выше 25. &lt;br /&gt;
&lt;br /&gt;
Для матриц порядка ниже 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;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&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;
&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;
&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;
где &amp;lt;math&amp;gt; u = \begin{bmatrix} Q_{1}^{T} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}^{T}\end{bmatrix}v &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;, так как &amp;lt;math&amp;gt;v = \begin{bmatrix} 0 , \ldots  ,  0 , 1 , 1 , 0 \ldots , 0 \end{bmatrix}^T&amp;lt;/math&amp;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;
В дальнейшем предполагаем, не ограничивая общности, что диагональные элементы &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;
&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;Лемма 1.&#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;
&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:Сергеев 1.jpg|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;Лемма 2.&#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;
&amp;lt;math&amp;gt;(D + \rho uu^{T})[(D - \alpha I)^{-1}u] = &lt;br /&gt;
&lt;br /&gt;
(D - \alpha I + \alpha I + \rho uu^{T})(D - \alpha I)^{-1}u = &lt;br /&gt;
&lt;br /&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 = \alpha [(D - \alpha I)^{-1}u]&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&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;
Что и требовалось доказать.&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;
До сих пор полагалось, что все &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;&#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;
&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;
Далее пойдет речь о решении &#039;&#039;&#039;векового уравнения&#039;&#039;&#039;, которое является одной из основных частей алгоритма.&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:Сергеев 2.jpg|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;
для &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;
&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;
&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; (*)&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;. Два условия в (*) - это обычные условия метода Ньютона, за исключением того, что вместо прямой в качестве приближения используется гипербола. Легко проверить, что &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;
&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;
&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;&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} \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;
Рассмотрим каким именно образом происходит вычисление собственных значений и собственных векторов симметричной трехдиагональной матрицы при помощи стратегии &amp;quot;разделяй и властвуй&amp;quot;:&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;если&#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; :&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 * &lt;br /&gt;
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;
         &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;
         &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;
         &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 изображена структура всего алгоритма, на рисунке 4 подробно описана одна из ячеек структуры.&lt;br /&gt;
[[File:Сергеев 3.jpg|thumb|center|left|800px|Рис. 3. Дерево алгоритма &amp;quot;Разделяй и властвуй&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
[[File:Сергеев 4.jpg|thumb|center|1200px|Рис. 4. Детальное описание одного блока алгоритма]]&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;
Единственный найденный пример реализации описан в [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot; ]   ([3] с. 7, 19-20).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Дж. Деммель, &amp;quot;Вычислительная линейная алгебра&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[2] [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
[3] [https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm Алгоритм &amp;quot;Разделяй и властвуй&amp;quot; - Wikipedia]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>NikoSergAlex</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=15747</id>
		<title>Участник:Vika3410/Метод Разделяй и властвуй</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=15747"/>
		<updated>2016-11-02T10:25:18Z</updated>

		<summary type="html">&lt;p&gt;NikoSergAlex: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
Авторы статьи: [[Участник:NikoSergAlex|Сергеев Никита]] (группа 614) (1.1, 1.2, 1.5, 1.6, 1.7, 1.9, 1.10), [[Участница:Vika3410|Стрельцова Виктория]] (группа 614) (1.2, 1.3, 1.4, 1.6, 1.7, 1.8, 1.10)&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод &amp;quot;Разделяй и властвуй&amp;quot; вычисления собственных значений и векторов трёхдиагональной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
| parallel_complexity = &amp;lt;math&amp;gt; O(n^{2.3}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
крайне редко: &amp;lt;math&amp;gt;  O(n^{2}) &amp;lt;/math&amp;gt; &lt;br /&gt;
| pf_width          = &lt;br /&gt;
| input_data        = трёхдиагональная матрица&lt;br /&gt;
| output_data       = матрица собственных значений и матрица собственных векторов исходной матрицы&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; - является наиболее быстрым из существующих методов вычисления всех собственных значений и собственных векторов трехдиагональной матрицы, начиная с порядка n, который примерно равен 26. (Точное значение этого порогового порядка в конкретном случае зависит от компьютера.) &lt;br /&gt;
&lt;br /&gt;
Численно устойчивая реализация данного метода весьма не тривиальна, так как не смотря на то, что впервые метод был предложен в 1981 г., &amp;quot;правильный&amp;quot; способ реализации метода был найден лишь в 1992 г. Этот способ был воплощен при помощи LAPACK-программ ssyevd (для плотных матриц) и sstevd (для трехдиагональных матриц). В этих программах стратегия &amp;quot;разделяй-и-влавствуй&amp;quot; используется для матриц порядка выше 25. &lt;br /&gt;
&lt;br /&gt;
Для матриц порядка ниже 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;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&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;
&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;
&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;
где &amp;lt;math&amp;gt; u = \begin{bmatrix} Q_{1}^{T} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}^{T}\end{bmatrix}v &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;, так как &amp;lt;math&amp;gt;v = \begin{bmatrix} 0 , \ldots  ,  0 , 1 , 1 , 0 \ldots , 0 \end{bmatrix}^T&amp;lt;/math&amp;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;
В дальнейшем предполагаем, не ограничивая общности, что диагональные элементы &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;
&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;Лемма 1.&#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;
&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:Сергеев 1.jpg|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;Лемма 2.&#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;
&amp;lt;math&amp;gt;(D + \rho uu^{T})[(D - \alpha I)^{-1}u] = &lt;br /&gt;
&lt;br /&gt;
(D - \alpha I + \alpha I + \rho uu^{T})(D - \alpha I)^{-1}u = &lt;br /&gt;
&lt;br /&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 = \alpha [(D - \alpha I)^{-1}u]&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&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;
Что и требовалось доказать.&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;
До сих пор полагалось, что все &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;&#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;
&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;
=== &#039;&#039;Решение векового уравнения&#039;&#039; ===&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:Сергеев 2.jpg|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;
для &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;
&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;
&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; (*)&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;. Два условия в (*) - это обычные условия метода Ньютона, за исключением того, что вместо прямой в качестве приближения используется гипербола. Легко проверить, что &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;
&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;
&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;&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} \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;
Рассмотрим каким именно образом происходит вычисление собственных значений и собственных векторов симметричной трехдиагональной матрицы при помощи стратегии &amp;quot;разделяй и властвуй&amp;quot;:&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;если&#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; :&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 * &lt;br /&gt;
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;
         &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;
         &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;
         &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 изображена структура всего алгоритма, на рисунке 4 подробно описана одна из ячеек структуры.&lt;br /&gt;
[[File:Сергеев 3.jpg|thumb|center|left|800px|Рис. 3. Дерево алгоритма &amp;quot;Разделяй и властвуй&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
[[File:Сергеев 4.jpg|thumb|center|1200px|Рис. 4. Детальное описание одного блока алгоритма]]&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;
Единственный найденный пример реализации описан в [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot; ]   ([3] с. 7, 19-20).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Дж. Деммель, &amp;quot;Вычислительная линейная алгебра&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[2] [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
[3] [https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm Алгоритм &amp;quot;Разделяй и властвуй&amp;quot; - Wikipedia]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>NikoSergAlex</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=15746</id>
		<title>Участник:Vika3410/Метод Разделяй и властвуй</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=15746"/>
		<updated>2016-11-02T10:24:51Z</updated>

		<summary type="html">&lt;p&gt;NikoSergAlex: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
Авторы статьи: [[Участник:NikoSergAlex|Сергеев Никита]] (группа 614) (1.1, 1.2, 1.5, 1.6, 1.7, 1.9, 1.10), [[Участница:Vika3410|Стрельцова Виктория]] (группа 614) (1.2, 1.3, 1.4, 1.6, 1.7, 1.8, 1.10)&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод &amp;quot;Разделяй и властвуй&amp;quot; вычисления собственных значений и векторов трёхдиагональной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
| parallel_complexity = &amp;lt;math&amp;gt; O(n^{2.3}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
крайне редко: &amp;lt;math&amp;gt;  O(n^{2}) &amp;lt;/math&amp;gt; &lt;br /&gt;
| pf_width          = &lt;br /&gt;
| input_data        = трёхдиагональная матрица&lt;br /&gt;
| output_data       = матрица собственных значений и матрица собственных векторов исходной матрицы&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; - является наиболее быстрым из существующих методов вычисления всех собственных значений и собственных векторов трехдиагональной матрицы, начиная с порядка n, который примерно равен 26. (Точное значение этого порогового порядка в конкретном случае зависит от компьютера.) &lt;br /&gt;
&lt;br /&gt;
Численно устойчивая реализация данного метода весьма не тривиальна, так как не смотря на то, что впервые метод был предложен в 1981 г., &amp;quot;правильный&amp;quot; способ реализации метода был найден лишь в 1992 г. Этот способ был воплощен при помощи LAPACK-программ ssyevd (для плотных матриц) и sstevd (для трехдиагональных матриц). В этих программах стратегия &amp;quot;разделяй-и-влавствуй&amp;quot; используется для матриц порядка выше 25. &lt;br /&gt;
&lt;br /&gt;
Для матриц порядка ниже 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;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&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;
&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;
&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;
где &amp;lt;math&amp;gt; u = \begin{bmatrix} Q_{1}^{T} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}^{T}\end{bmatrix}v &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;, так как &amp;lt;math&amp;gt;v = \begin{bmatrix} 0 , \ldots  ,  0 , 1 , 1 , 0 \ldots , 0 \end{bmatrix}^T&amp;lt;/math&amp;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;
В дальнейшем предполагаем, не ограничивая общности, что диагональные элементы &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;
&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;Лемма 1.&#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;
&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:Сергеев 1.jpg|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;Лемма 2.&#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;
  &amp;lt;math&amp;gt;(D + \rho uu^{T})[(D - \alpha I)^{-1}u] = &lt;br /&gt;
&lt;br /&gt;
(D - \alpha I + \alpha I + \rho uu^{T})(D - \alpha I)^{-1}u = &lt;br /&gt;
&lt;br /&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 = \alpha [(D - \alpha I)^{-1}u]&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&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;
Что и требовалось доказать.&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;
До сих пор полагалось, что все &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;&#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;
&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;
=== &#039;&#039;Решение векового уравнения&#039;&#039; ===&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:Сергеев 2.jpg|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;
для &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;
&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;
&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; (*)&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;. Два условия в (*) - это обычные условия метода Ньютона, за исключением того, что вместо прямой в качестве приближения используется гипербола. Легко проверить, что &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;
&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;
&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;&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} \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;
Рассмотрим каким именно образом происходит вычисление собственных значений и собственных векторов симметричной трехдиагональной матрицы при помощи стратегии &amp;quot;разделяй и властвуй&amp;quot;:&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;если&#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; :&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 * &lt;br /&gt;
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;
         &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;
         &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;
         &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 изображена структура всего алгоритма, на рисунке 4 подробно описана одна из ячеек структуры.&lt;br /&gt;
[[File:Сергеев 3.jpg|thumb|center|left|800px|Рис. 3. Дерево алгоритма &amp;quot;Разделяй и властвуй&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
[[File:Сергеев 4.jpg|thumb|center|1200px|Рис. 4. Детальное описание одного блока алгоритма]]&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;
Единственный найденный пример реализации описан в [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot; ]   ([3] с. 7, 19-20).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Дж. Деммель, &amp;quot;Вычислительная линейная алгебра&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[2] [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
[3] [https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm Алгоритм &amp;quot;Разделяй и властвуй&amp;quot; - Wikipedia]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>NikoSergAlex</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=15745</id>
		<title>Участник:Vika3410/Метод Разделяй и властвуй</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=15745"/>
		<updated>2016-11-02T10:23:46Z</updated>

		<summary type="html">&lt;p&gt;NikoSergAlex: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
Авторы статьи: [[Участник:NikoSergAlex|Сергеев Никита]] (группа 614) (1.1, 1.2, 1.5, 1.6, 1.7, 1.9, 1.10), [[Участница:Vika3410|Стрельцова Виктория]] (группа 614) (1.2, 1.3, 1.4, 1.6, 1.7, 1.8, 1.10)&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод &amp;quot;Разделяй и властвуй&amp;quot; вычисления собственных значений и векторов трёхдиагональной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
| parallel_complexity = &amp;lt;math&amp;gt; O(n^{2.3}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
крайне редко: &amp;lt;math&amp;gt;  O(n^{2}) &amp;lt;/math&amp;gt; &lt;br /&gt;
| pf_width          = &lt;br /&gt;
| input_data        = трёхдиагональная матрица&lt;br /&gt;
| output_data       = матрица собственных значений и матрица собственных векторов исходной матрицы&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; - является наиболее быстрым из существующих методов вычисления всех собственных значений и собственных векторов трехдиагональной матрицы, начиная с порядка n, который примерно равен 26. (Точное значение этого порогового порядка в конкретном случае зависит от компьютера.) &lt;br /&gt;
&lt;br /&gt;
Численно устойчивая реализация данного метода весьма не тривиальна, так как не смотря на то, что впервые метод был предложен в 1981 г., &amp;quot;правильный&amp;quot; способ реализации метода был найден лишь в 1992 г. Этот способ был воплощен при помощи LAPACK-программ ssyevd (для плотных матриц) и sstevd (для трехдиагональных матриц). В этих программах стратегия &amp;quot;разделяй-и-влавствуй&amp;quot; используется для матриц порядка выше 25. &lt;br /&gt;
&lt;br /&gt;
Для матриц порядка ниже 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;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&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;
&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;
&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;
где &amp;lt;math&amp;gt; u = \begin{bmatrix} Q_{1}^{T} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}^{T}\end{bmatrix}v &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;, так как &amp;lt;math&amp;gt;v = \begin{bmatrix} 0 , \ldots  ,  0 , 1 , 1 , 0 \ldots , 0 \end{bmatrix}^T&amp;lt;/math&amp;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;
В дальнейшем предполагаем, не ограничивая общности, что диагональные элементы &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;
&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;Лемма 1.&#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;
&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:Сергеев 1.jpg|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;Лемма 2.&#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;
  &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 = &lt;br /&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;
&amp;lt;math&amp;gt; = u + \alpha(D - \alpha I)^{-1}u - u = \alpha [(D - \alpha I)^{-1}u]&amp;lt;/math&amp;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;
&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;
До сих пор полагалось, что все &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;&#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;
&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;
=== &#039;&#039;Решение векового уравнения&#039;&#039; ===&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:Сергеев 2.jpg|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;
для &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;
&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;
&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; (*)&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;. Два условия в (*) - это обычные условия метода Ньютона, за исключением того, что вместо прямой в качестве приближения используется гипербола. Легко проверить, что &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;
&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;
&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;&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} \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;
Рассмотрим каким именно образом происходит вычисление собственных значений и собственных векторов симметричной трехдиагональной матрицы при помощи стратегии &amp;quot;разделяй и властвуй&amp;quot;:&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;если&#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; :&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 * &lt;br /&gt;
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;
         &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;
         &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;
         &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 изображена структура всего алгоритма, на рисунке 4 подробно описана одна из ячеек структуры.&lt;br /&gt;
[[File:Сергеев 3.jpg|thumb|center|left|800px|Рис. 3. Дерево алгоритма &amp;quot;Разделяй и властвуй&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
[[File:Сергеев 4.jpg|thumb|center|1200px|Рис. 4. Детальное описание одного блока алгоритма]]&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;
Единственный найденный пример реализации описан в [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot; ]   ([3] с. 7, 19-20).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Дж. Деммель, &amp;quot;Вычислительная линейная алгебра&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[2] [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
[3] [https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm Алгоритм &amp;quot;Разделяй и властвуй&amp;quot; - Wikipedia]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>NikoSergAlex</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=15744</id>
		<title>Участник:Vika3410/Метод Разделяй и властвуй</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=15744"/>
		<updated>2016-11-02T10:20:52Z</updated>

		<summary type="html">&lt;p&gt;NikoSergAlex: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
Авторы статьи: [[Участник:NikoSergAlex|Сергеев Никита]] (группа 614) (1.1, 1.2, 1.5, 1.6, 1.7, 1.9, 1.10), [[Участница:Vika3410|Стрельцова Виктория]] (группа 614) (1.2, 1.3, 1.4, 1.6, 1.7, 1.8, 1.10)&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод &amp;quot;Разделяй и властвуй&amp;quot; вычисления собственных значений и векторов трёхдиагональной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
| parallel_complexity = &amp;lt;math&amp;gt; O(n^{2.3}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
крайне редко: &amp;lt;math&amp;gt;  O(n^{2}) &amp;lt;/math&amp;gt; &lt;br /&gt;
| pf_width          = &lt;br /&gt;
| input_data        = трёхдиагональная матрица&lt;br /&gt;
| output_data       = матрица собственных значений и матрица собственных векторов исходной матрицы&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; - является наиболее быстрым из существующих методов вычисления всех собственных значений и собственных векторов трехдиагональной матрицы, начиная с порядка n, который примерно равен 26. (Точное значение этого порогового порядка в конкретном случае зависит от компьютера.) &lt;br /&gt;
&lt;br /&gt;
Численно устойчивая реализация данного метода весьма не тривиальна, так как не смотря на то, что впервые метод был предложен в 1981 г., &amp;quot;правильный&amp;quot; способ реализации метода был найден лишь в 1992 г. Этот способ был воплощен при помощи LAPACK-программ ssyevd (для плотных матриц) и sstevd (для трехдиагональных матриц). В этих программах стратегия &amp;quot;разделяй-и-влавствуй&amp;quot; используется для матриц порядка выше 25. &lt;br /&gt;
&lt;br /&gt;
Для матриц порядка ниже 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;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&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;
&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;
&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;
где &amp;lt;math&amp;gt; u = \begin{bmatrix} Q_{1}^{T} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}^{T}\end{bmatrix}v &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;, так как &amp;lt;math&amp;gt;v = \begin{bmatrix} 0 , \ldots  ,  0 , 1 , 1 , 0 \ldots , 0 \end{bmatrix}^T&amp;lt;/math&amp;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;
В дальнейшем предполагаем, не ограничивая общности, что диагональные элементы &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;
&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;Лемма 1.&#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;
&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:Сергеев 1.jpg|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;Лемма 2.&#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 = u + \alpha (D - \alpha I)^{-1}u + u[\rho u^{T}(D - \alpha I)^{-1}u]= &amp;lt;/math&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt; = u + \alpha(D - \alpha I)^{-1}u - u = \alpha [(D - \alpha I)^{-1}u]&amp;lt;/math&amp;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;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;
До сих пор полагалось, что все &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;&#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;
&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;
=== &#039;&#039;Решение векового уравнения&#039;&#039; ===&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:Сергеев 2.jpg|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;
для &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;
&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;
&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; (*)&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;. Два условия в (*) - это обычные условия метода Ньютона, за исключением того, что вместо прямой в качестве приближения используется гипербола. Легко проверить, что &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;
&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;
&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;&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} \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;
Рассмотрим каким именно образом происходит вычисление собственных значений и собственных векторов симметричной трехдиагональной матрицы при помощи стратегии &amp;quot;разделяй и властвуй&amp;quot;:&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;если&#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; :&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 * &lt;br /&gt;
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;
         &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;
         &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;
         &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 изображена структура всего алгоритма, на рисунке 4 подробно описана одна из ячеек структуры.&lt;br /&gt;
[[File:Сергеев 3.jpg|thumb|center|left|800px|Рис. 3. Дерево алгоритма &amp;quot;Разделяй и властвуй&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
[[File:Сергеев 4.jpg|thumb|center|1200px|Рис. 4. Детальное описание одного блока алгоритма]]&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;
Единственный найденный пример реализации описан в [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot; ]   ([3] с. 7, 19-20).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Дж. Деммель, &amp;quot;Вычислительная линейная алгебра&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[2] [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
[3] [https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm Алгоритм &amp;quot;Разделяй и властвуй&amp;quot; - Wikipedia]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>NikoSergAlex</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=15742</id>
		<title>Участник:Vika3410/Метод Разделяй и властвуй</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=15742"/>
		<updated>2016-11-02T10:16:26Z</updated>

		<summary type="html">&lt;p&gt;NikoSergAlex: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
Авторы статьи: [[Участник:NikoSergAlex|Сергеев Никита]] (группа 614) (1.1, 1.2, 1.5, 1.6, 1.7, 1.9, 1.10), [[Участница:Vika3410|Стрельцова Виктория]] (группа 614) (1.2, 1.3, 1.4, 1.6, 1.7, 1.8, 1.10)&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод &amp;quot;Разделяй и властвуй&amp;quot; вычисления собственных значений и векторов трёхдиагональной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
| parallel_complexity = &amp;lt;math&amp;gt; O(n^{2.3}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
крайне редко: &amp;lt;math&amp;gt;  O(n^{2}) &amp;lt;/math&amp;gt; &lt;br /&gt;
| pf_width          = &lt;br /&gt;
| input_data        = трёхдиагональная матрица&lt;br /&gt;
| output_data       = матрица собственных значений и матрица собственных векторов исходной матрицы&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; - является наиболее быстрым из существующих методов вычисления всех собственных значений и собственных векторов трехдиагональной матрицы, начиная с порядка n, который примерно равен 26. (Точное значение этого порогового порядка в конкретном случае зависит от компьютера.) &lt;br /&gt;
&lt;br /&gt;
Численно устойчивая реализация данного метода весьма не тривиальна, так как не смотря на то, что впервые метод был предложен в 1981 г., &amp;quot;правильный&amp;quot; способ реализации метода был найден лишь в 1992 г. Этот способ был воплощен при помощи LAPACK-программ ssyevd (для плотных матриц) и sstevd (для трехдиагональных матриц). В этих программах стратегия &amp;quot;разделяй-и-влавствуй&amp;quot; используется для матриц порядка выше 25. &lt;br /&gt;
&lt;br /&gt;
Для матриц порядка ниже 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;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&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;
&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;
&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;
где &amp;lt;math&amp;gt; u = \begin{bmatrix} Q_{1}^{T} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}^{T}\end{bmatrix}v &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;, так как &amp;lt;math&amp;gt;v = \begin{bmatrix} 0 , \ldots  ,  0 , 1 , 1 , 0 \ldots , 0 \end{bmatrix}^T&amp;lt;/math&amp;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;
В дальнейшем предполагаем, не ограничивая общности, что диагональные элементы &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;
&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;Лемма 1.&#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;
&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:Сергеев 1.jpg|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;Лемма 2.&#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 = u + \alpha (D - \alpha I)^{-1}u + u[\rho u^{T}(D - \alpha I)^{-1}u]= &amp;lt;/math&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt; = u + \alpha(D - \alpha I)^{-1}u - u = \alpha [(D - \alpha I)^{-1}u]&amp;lt;/math&amp;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;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;
До сих пор полагалось, что все &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;&#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;
&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;
=== &#039;&#039;Решение векового уравнения&#039;&#039; ===&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:Сергеев 2.jpg|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;
для &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;
&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;
&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; (*)&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;. Два условия в (*) - это обычные условия метода Ньютона, за исключением того, что вместо прямой в качестве приближения используется гипербола. Легко проверить, что &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;
&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;
&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;&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} \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;
Рассмотрим каким именно образом происходит вычисление собственных значений и собственных векторов симметричной трехдиагональной матрицы при помощи стратегии &amp;quot;разделяй и властвуй&amp;quot;:&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;если&#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; :&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 * &lt;br /&gt;
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;
         &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;
         &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;
         &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 изображена структура всего алгоритма, на рисунке 4 подробно описана одна из ячеек структуры.&lt;br /&gt;
[[File:Сергеев 3.jpg|thumb|center|left|800px|Рис. 3. Дерево алгоритма &amp;quot;Разделяй и властвуй&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
[[File:Сергеев 4.jpg|thumb|center|1200px|Рис. 4. Детальное описание одного блока алгоритма]]&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;
Единственный найденный пример реализации описан в [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot; ]   ([3] с. 7, 19-20).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Дж. Деммель, &amp;quot;Вычислительная линейная алгебра&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[2] [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
[3] [https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm Алгоритм &amp;quot;Разделяй и властвуй&amp;quot; - Wikipedia]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>NikoSergAlex</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=15741</id>
		<title>Участник:Vika3410/Метод Разделяй и властвуй</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=15741"/>
		<updated>2016-11-02T10:15:19Z</updated>

		<summary type="html">&lt;p&gt;NikoSergAlex: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
Авторы статьи: [[Участник:NikoSergAlex|Сергеев Никита]] (группа 614) (1.1, 1.2, 1.5, 1.6, 1.7, 1.9, 1.10), [[Участница:Vika3410|Стрельцова Виктория]] (группа 614) (1.2, 1.3, 1.4, 1.6, 1.7, 1.8, 1.10)&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод &amp;quot;Разделяй и властвуй&amp;quot; вычисления собственных значений и векторов трёхдиагональной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
| parallel_complexity = &amp;lt;math&amp;gt; O(n^{2.3}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
крайне редко: &amp;lt;math&amp;gt;  O(n^{2}) &amp;lt;/math&amp;gt; &lt;br /&gt;
| pf_width          = &lt;br /&gt;
| input_data        = трёхдиагональная матрица&lt;br /&gt;
| output_data       = матрица собственных значений и матрица собственных векторов исходной матрицы&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; - является наиболее быстрым из существующих методов вычисления всех собственных значений и собственных векторов трехдиагональной матрицы, начиная с порядка n, который примерно равен 26. (Точное значение этого порогового порядка в конкретном случае зависит от компьютера.) &lt;br /&gt;
&lt;br /&gt;
Численно устойчивая реализация данного метода весьма не тривиальна, так как не смотря на то, что впервые метод был предложен в 1981 г., &amp;quot;правильный&amp;quot; способ реализации метода был найден лишь в 1992 г. Этот способ был воплощен при помощи LAPACK-программ ssyevd (для плотных матриц) и sstevd (для трехдиагональных матриц). В этих программах стратегия &amp;quot;разделяй-и-влавствуй&amp;quot; используется для матриц порядка выше 25. &lt;br /&gt;
&lt;br /&gt;
Для матриц порядка ниже 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;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&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;
&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;
&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;
где &amp;lt;math&amp;gt; u = \begin{bmatrix} Q_{1}^{T} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}^{T}\end{bmatrix}v &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;, так как &amp;lt;math&amp;gt;v = \begin{bmatrix} 0 , \ldots  ,  0 , 1 , 1 , 0 \ldots , 0 \end{bmatrix}^T&amp;lt;/math&amp;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;
В дальнейшем предполагаем, не ограничивая общности, что диагональные элементы &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;
&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;Лемма 1.&#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;
&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:Сергеев 1.jpg|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;Лемма 2.&#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 = u + \alpha (D - \alpha I)^{-1}u + u[\rho u^{T}(D - \alpha I)^{-1}u]= &amp;lt;/math&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt; = u + \alpha(D - \alpha I)^{-1}u - u = \alpha [(D - \alpha I)^{-1}u]&amp;lt;/math&amp;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;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;
До сих пор полагалось, что все &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;&#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;
&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;
=== &#039;&#039;Решение векового уравнения&#039;&#039; ===&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:Сергеев 2.jpg|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;
для &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;
&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;
&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; (*)&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;. Два условия в (*) - это обычные условия метода Ньютона, за исключением того, что вместо прямой в качестве приближения используется гипербола. Легко проверить, что &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;
&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;
&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;&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} \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;
Рассмотрим каким именно образом происходит вычисление собственных значений и собственных векторов симметричной трехдиагональной матрицы при помощи стратегии &amp;quot;разделяй и властвуй&amp;quot;:&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;если&#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; :&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 * &lt;br /&gt;
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;
         &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;
         &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;
         &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 изображена структура всего алгоритма, на рисунке 4 подробно описана одна из ячеек структуры.&lt;br /&gt;
[[File:Сергеев 3.jpg|thumb|center|left|800px|Рис. 3. Дерево алгоритма &amp;quot;Разделяй и властвуй&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
[[File:Сергеев 4.jpg|thumb|center|1200px|Рис. 4. Детальное описание одного блока алгоритма]]&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;
Единственный найденный пример реализации описан в [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot; ]   ([3] с. 7, 19-20).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Дж. Деммель, &amp;quot;Вычислительная линейная алгебра&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[2] [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
[3] [https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm Алгоритм &amp;quot;Разделяй и властвуй&amp;quot; - Wikipedia]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>NikoSergAlex</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=15740</id>
		<title>Участник:Vika3410/Метод Разделяй и властвуй</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=15740"/>
		<updated>2016-11-02T10:08:21Z</updated>

		<summary type="html">&lt;p&gt;NikoSergAlex: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
Авторы статьи: [[Участник:NikoSergAlex|Сергеев Никита]] (группа 614) (1.1, 1.2, 1.5, 1.6, 1.7, 1.9, 1.10), [[Участница:Vika3410|Стрельцова Виктория]] (группа 614) (1.2, 1.3, 1.4, 1.6, 1.7, 1.8, 1.10)&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод &amp;quot;Разделяй и властвуй&amp;quot; вычисления собственных значений и векторов трёхдиагональной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
| parallel_complexity = &amp;lt;math&amp;gt; O(n^{2.3}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
крайне редко: &amp;lt;math&amp;gt;  O(n^{2}) &amp;lt;/math&amp;gt; &lt;br /&gt;
| pf_width          = &lt;br /&gt;
| input_data        = трёхдиагональная матрица&lt;br /&gt;
| output_data       = матрица собственных значений и матрица собственных векторов исходной матрицы&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; - является наиболее быстрым из существующих методов вычисления всех собственных значений и собственных векторов трехдиагональной матрицы, начиная с порядка n, который примерно равен 26. (Точное значение этого порогового порядка в конкретном случае зависит от компьютера.) &lt;br /&gt;
&lt;br /&gt;
Численно устойчивая реализация данного метода весьма не тривиальна, так как не смотря на то, что впервые метод был предложен в 1981 г., &amp;quot;правильный&amp;quot; способ реализации метода был найден лишь в 1992 г. Этот способ был воплощен при помощи LAPACK-программ ssyevd (для плотных матриц) и sstevd (для трехдиагональных матриц). В этих программах стратегия &amp;quot;разделяй-и-влавствуй&amp;quot; используется для матриц порядка выше 25. &lt;br /&gt;
&lt;br /&gt;
Для матриц порядка ниже 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;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&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;
&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;
&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;
где &amp;lt;math&amp;gt; u = \begin{bmatrix} Q_{1}^{T} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}^{T}\end{bmatrix}v &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;, так как &amp;lt;math&amp;gt;v = \begin{bmatrix} 0 , \ldots  ,  0 , 1 , 1 , 0 \ldots , 0 \end{bmatrix}^T&amp;lt;/math&amp;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;
В дальнейшем предполагаем, не ограничивая общности, что диагональные элементы &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;
&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;Лемма 1.&#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;
&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:Сергеев 1.jpg|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;Лемма 2.&#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 = u + \alpha (D - \alpha I)^{-1}u + u[\rho u^{T}(D - \alpha I)^{-1}u]= &amp;lt;/math&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt; = u + \alpha(D - \alpha I)^{-1}u - u = \alpha [(D - \alpha I)^{-1}u]&amp;lt;/math&amp;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;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;
До сих пор полагалось, что все &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;&#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;
&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;
=== &#039;&#039;Решение векового уравнения&#039;&#039; ===&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:Сергеев 2.jpg|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;
для &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;
&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;
&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; (*)&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;. Два условия в (*) - это обычные условия метода Ньютона, за исключением того, что вместо прямой в качестве приближения используется гипербола. Легко проверить, что &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;
&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;
&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;&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} \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;
Рассмотрим каким именно образом происходит вычисление собственных значений и собственных векторов симметричной трехдиагональной матрицы при помощи стратегии &amp;quot;разделяй и властвуй&amp;quot;:&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;если&#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; :&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 * &lt;br /&gt;
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;
         &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;
         &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;
         &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 изображена структура всего алгоритма, на рисунке 4 подробно описана одна из ячеек структуры.&lt;br /&gt;
[[File:Сергеев 3.jpg|thumb|center|left|800px|Рис. 3. Дерево алгоритма &amp;quot;Разделяй и властвуй&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
[[File:Сергеев 4.jpg|thumb|center|1200px|Рис. 4. Детальное описание одного блока алгоритма]]&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;
Последовательная сложность алгоритма: &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;
Единственный найденный пример реализации описан в [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot; ]   ([3] с. 7, 19-20).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Дж. Деммель, &amp;quot;Вычислительная линейная алгебра&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[2] [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
[3] [https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm Алгоритм &amp;quot;Разделяй и властвуй&amp;quot; - Wikipedia]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>NikoSergAlex</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=15739</id>
		<title>Участник:Vika3410/Метод Разделяй и властвуй</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=15739"/>
		<updated>2016-11-02T10:01:59Z</updated>

		<summary type="html">&lt;p&gt;NikoSergAlex: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
Авторы статьи: [[Участник:NikoSergAlex|Сергеев Никита]] (группа 614) (1.1, 1.2, 1.5, 1.6, 1.7, 1.9, 1.10), [[Участница:Vika3410|Стрельцова Виктория]] (группа 614) (1.2, 1.3, 1.4, 1.6, 1.7, 1.8, 1.10)&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод &amp;quot;Разделяй и властвуй&amp;quot; вычисления собственных значений и векторов трёхдиагональной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
| parallel_complexity = &amp;lt;math&amp;gt; O(n^{2.3}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
крайне редко: &amp;lt;math&amp;gt;  O(n^{2}) &amp;lt;/math&amp;gt; &lt;br /&gt;
| pf_width          = &lt;br /&gt;
| input_data        = трёхдиагональная матрица&lt;br /&gt;
| output_data       = матрица собственных значений и матрица собственных векторов исходной матрицы&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; - является наиболее быстрым из существующих методов вычисления всех собственных значений и собственных векторов трехдиагональной матрицы, начиная с порядка n, который примерно равен 26. (Точное значение этого порогового порядка в конкретном случае зависит от компьютера.) &lt;br /&gt;
&lt;br /&gt;
Численно устойчивая реализация данного метода весьма не тривиальна, так как не смотря на то, что впервые метод был предложен в 1981 г., &amp;quot;правильный&amp;quot; способ реализации метода был найден лишь в 1992 г. Этот способ был воплощен при помощи LAPACK-программ ssyevd (для плотных матриц) и sstevd (для трехдиагональных матриц). В этих программах стратегия &amp;quot;разделяй-и-влавствуй&amp;quot; используется для матриц порядка выше 25. &lt;br /&gt;
&lt;br /&gt;
Для матриц порядка ниже 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;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&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;
&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;
&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;
где &amp;lt;math&amp;gt; u = \begin{bmatrix} Q_{1}^{T} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}^{T}\end{bmatrix}v &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;, так как &amp;lt;math&amp;gt;v = \begin{bmatrix} 0 , \ldots  ,  0 , 1 , 1 , 0 \ldots , 0 \end{bmatrix}^T&amp;lt;/math&amp;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;
В дальнейшем предполагаем, не ограничивая общности, что диагональные элементы &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;
&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;Лемма 1.&#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;
&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:Сергеев 1.jpg|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;Лемма 2.&#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 = u + \alpha (D - \alpha I)^{-1}u + u[\rho u^{T}(D - \alpha I)^{-1}u]= &amp;lt;/math&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt; = u + \alpha(D - \alpha I)^{-1}u - u = \alpha [(D - \alpha I)^{-1}u]&amp;lt;/math&amp;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;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;
До сих пор полагалось, что все &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;&#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;
&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;
=== &#039;&#039;Решение векового уравнения&#039;&#039; ===&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:Сергеев 2.jpg|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;
для &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;
&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;
&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; (*)&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;. Два условия в (*) - это обычные условия метода Ньютона, за исключением того, что вместо прямой в качестве приближения используется гипербола. Легко проверить, что &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;
&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;
&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;&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} \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;
Рассмотрим каким именно образом происходит вычисление собственных значений и собственных векторов симметричной трехдиагональной матрицы при помощи стратегии &amp;quot;разделяй и властвуй&amp;quot;:&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;если&#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; :&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 &lt;br /&gt;
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;
         &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;
         &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;
         &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 изображена структура всего алгоритма, на рисунке 4 подробно описана одна из ячеек структуры.&lt;br /&gt;
[[File:Сергеев 3.jpg|thumb|center|left|800px|Рис. 3. Дерево алгоритма &amp;quot;Разделяй и властвуй&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
[[File:Сергеев 4.jpg|thumb|center|1200px|Рис. 4. Детальное описание одного блока алгоритма]]&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;
Последовательная сложность алгоритма: &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;
Единственный найденный пример реализации описан в [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot; ]   ([3] с. 7, 19-20).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Дж. Деммель, &amp;quot;Вычислительная линейная алгебра&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[2] [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
[3] [https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm Алгоритм &amp;quot;Разделяй и властвуй&amp;quot; - Wikipedia]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>NikoSergAlex</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=15738</id>
		<title>Участник:Vika3410/Метод Разделяй и властвуй</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=15738"/>
		<updated>2016-11-02T10:01:38Z</updated>

		<summary type="html">&lt;p&gt;NikoSergAlex: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
Авторы статьи: [[Участник:NikoSergAlex|Сергеев Никита]] (группа 614) (1.1, 1.2, 1.5, 1.6, 1.7, 1.9, 1.10), [[Участница:Vika3410|Стрельцова Виктория]] (группа 614) (1.2, 1.3, 1.4, 1.6, 1.7, 1.8, 1.10)&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод &amp;quot;Разделяй и властвуй&amp;quot; вычисления собственных значений и векторов трёхдиагональной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
| parallel_complexity = &amp;lt;math&amp;gt; O(n^{2.3}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
крайне редко: &amp;lt;math&amp;gt;  O(n^{2}) &amp;lt;/math&amp;gt; &lt;br /&gt;
| pf_width          = &lt;br /&gt;
| input_data        = трёхдиагональная матрица&lt;br /&gt;
| output_data       = матрица собственных значений и матрица собственных векторов исходной матрицы&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; - является наиболее быстрым из существующих методов вычисления всех собственных значений и собственных векторов трехдиагональной матрицы, начиная с порядка n, который примерно равен 26. (Точное значение этого порогового порядка в конкретном случае зависит от компьютера.) &lt;br /&gt;
&lt;br /&gt;
Численно устойчивая реализация данного метода весьма не тривиальна, так как не смотря на то, что впервые метод был предложен в 1981 г., &amp;quot;правильный&amp;quot; способ реализации метода был найден лишь в 1992 г. Этот способ был воплощен при помощи LAPACK-программ ssyevd (для плотных матриц) и sstevd (для трехдиагональных матриц). В этих программах стратегия &amp;quot;разделяй-и-влавствуй&amp;quot; используется для матриц порядка выше 25. &lt;br /&gt;
&lt;br /&gt;
Для матриц порядка ниже 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;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&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;
&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;
&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;
где &amp;lt;math&amp;gt; u = \begin{bmatrix} Q_{1}^{T} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}^{T}\end{bmatrix}v &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;, так как &amp;lt;math&amp;gt;v = \begin{bmatrix} 0 , \ldots  ,  0 , 1 , 1 , 0 \ldots , 0 \end{bmatrix}^T&amp;lt;/math&amp;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;
В дальнейшем предполагаем, не ограничивая общности, что диагональные элементы &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;
&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;Лемма 1.&#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;
&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:Сергеев 1.jpg|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;Лемма 2.&#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 = u + \alpha (D - \alpha I)^{-1}u + u[\rho u^{T}(D - \alpha I)^{-1}u]= &amp;lt;/math&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt; = u + \alpha(D - \alpha I)^{-1}u - u = \alpha [(D - \alpha I)^{-1}u]&amp;lt;/math&amp;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;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;
До сих пор полагалось, что все &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;&#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;
&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;
=== &#039;&#039;Решение векового уравнения&#039;&#039; ===&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:Сергеев 2.jpg|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;
для &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;
&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;
&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; (*)&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;. Два условия в (*) - это обычные условия метода Ньютона, за исключением того, что вместо прямой в качестве приближения используется гипербола. Легко проверить, что &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;
&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;
&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;&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} \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;
Рассмотрим каким именно образом происходит вычисление собственных значений и собственных векторов симметричной трехдиагональной матрицы при помощи стратегии &amp;quot;разделяй и властвуй&amp;quot;:&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;если&#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; :&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;endif&#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 &lt;br /&gt;
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;
         &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;
         &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;
         &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 изображена структура всего алгоритма, на рисунке 4 подробно описана одна из ячеек структуры.&lt;br /&gt;
[[File:Сергеев 3.jpg|thumb|center|left|800px|Рис. 3. Дерево алгоритма &amp;quot;Разделяй и властвуй&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
[[File:Сергеев 4.jpg|thumb|center|1200px|Рис. 4. Детальное описание одного блока алгоритма]]&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;
Последовательная сложность алгоритма: &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;
Единственный найденный пример реализации описан в [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot; ]   ([3] с. 7, 19-20).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Дж. Деммель, &amp;quot;Вычислительная линейная алгебра&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[2] [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
[3] [https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm Алгоритм &amp;quot;Разделяй и властвуй&amp;quot; - Wikipedia]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>NikoSergAlex</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=15734</id>
		<title>Участник:Vika3410/Метод Разделяй и властвуй</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=15734"/>
		<updated>2016-11-02T09:24:54Z</updated>

		<summary type="html">&lt;p&gt;NikoSergAlex: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
Авторы статьи: [[Участник:NikoSergAlex|Сергеев Никита]] (группа 614) (1.1, 1.2, 1.5, 1.6, 1.7, 1.9, 1.10), [[Участница:Vika3410|Стрельцова Виктория]] (группа 614) (1.2, 1.3, 1.4, 1.6, 1.7, 1.8, 1.10)&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод &amp;quot;Разделяй и властвуй&amp;quot; вычисления собственных значений и векторов трёхдиагональной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
| parallel_complexity = &amp;lt;math&amp;gt; O(n^{2.3}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
крайне редко: &amp;lt;math&amp;gt;  O(n^{2}) &amp;lt;/math&amp;gt; &lt;br /&gt;
| pf_width          = &lt;br /&gt;
| input_data        = трёхдиагональная матрица&lt;br /&gt;
| output_data       = матрица собственных значений и матрица собственных векторов исходной матрицы&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; - является наиболее быстрым из существующих методов вычисления всех собственных значений и собственных векторов трехдиагональной матрицы, начиная с порядка n, который примерно равен 26. (Точное значение этого порогового порядка в конкретном случае зависит от компьютера.) &lt;br /&gt;
&lt;br /&gt;
Численно устойчивая реализация данного метода весьма не тривиальна, так как не смотря на то, что впервые метод был предложен в 1981 г., &amp;quot;правильный&amp;quot; способ реализации метода был найден лишь в 1992 г. Этот способ был воплощен при помощи LAPACK-программ ssyevd (для плотных матриц) и sstevd (для трехдиагональных матриц). В этих программах стратегия &amp;quot;разделяй-и-влавствуй&amp;quot; используется для матриц порядка выше 25. &lt;br /&gt;
&lt;br /&gt;
Для матриц порядка ниже 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;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&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;
&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;
&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;
где &amp;lt;math&amp;gt; u = \begin{bmatrix} Q_{1}^{T} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}^{T}\end{bmatrix}v &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;, так как &amp;lt;math&amp;gt;v = \begin{bmatrix} 0 , \ldots  ,  0 , 1 , 1 , 0 \ldots , 0 \end{bmatrix}^T&amp;lt;/math&amp;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;
В дальнейшем предполагаем, не ограничивая общности, что диагональные элементы &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;
&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;Лемма 1.&#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;
&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:Сергеев 1.jpg|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;Лемма 2.&#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 = u + \alpha (D - \alpha I)^{-1}u + u[\rho u^{T}(D - \alpha I)^{-1}u]= &amp;lt;/math&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt; = u + \alpha(D - \alpha I)^{-1}u - u = \alpha [(D - \alpha I)^{-1}u]&amp;lt;/math&amp;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;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;
До сих пор полагалось, что все &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;&#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;
&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;
=== &#039;&#039;Решение векового уравнения&#039;&#039; ===&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:Сергеев 2.jpg|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;
для &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;
&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;
&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; (*)&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;. Два условия в (*) - это обычные условия метода Ньютона, за исключением того, что вместо прямой в качестве приближения используется гипербола. Легко проверить, что &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;
&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;
&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;&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} \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;
Вычисление собственных значений и собственных векторов симметричной трехдиагональной матрицы посредством стратегии &amp;quot;разделяй и властвуй&amp;quot;:&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;
Если &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; :&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;
Иначе:&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;endif&#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 &lt;br /&gt;
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;
         &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;
         &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;
         &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 изображена структура всего алгоритма, на рисунке 4 подробно описана одна из ячеек структуры.&lt;br /&gt;
[[File:Сергеев 3.jpg|thumb|center|left|800px|Рис. 3. Дерево алгоритма &amp;quot;Разделяй и властвуй&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
[[File:Сергеев 4.jpg|thumb|center|1200px|Рис. 4. Детальное описание одного блока алгоритма]]&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;
Последовательная сложность алгоритма: &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;
Единственный найденный пример реализации описан в [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot; ]   ([3] с. 7, 19-20).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Дж. Деммель, &amp;quot;Вычислительная линейная алгебра&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[2] [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
[3] [https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm Алгоритм &amp;quot;Разделяй и властвуй&amp;quot; - Wikipedia]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>NikoSergAlex</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=15733</id>
		<title>Участник:Vika3410/Метод Разделяй и властвуй</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=15733"/>
		<updated>2016-11-02T09:24:34Z</updated>

		<summary type="html">&lt;p&gt;NikoSergAlex: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
Авторы статьи: [[Участник:NikoSergAlex|Сергеев Никита]] (группа 614) (1.1, 1.2, 1.5, 1.6, 1.7, 1.9, 1.10), [[Участница:Vika3410|Стрельцова Виктория]] (группа 614) (1.2, 1.3, 1.4, 1.6, 1.7, 1.8, 1.10)&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод &amp;quot;Разделяй и властвуй&amp;quot; вычисления собственных значений и векторов трёхдиагональной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
| parallel_complexity = &amp;lt;math&amp;gt; O(n^{2.3}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
крайне редко: &amp;lt;math&amp;gt;  O(n^{2}) &amp;lt;/math&amp;gt; &lt;br /&gt;
| pf_width          = &lt;br /&gt;
| input_data        = трёхдиагональная матрица&lt;br /&gt;
| output_data       = матрица собственных значений и матрица собственных векторов исходной матрицы&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; - является наиболее быстрым из существующих методов вычисления всех собственных значений и собственных векторов трехдиагональной матрицы, начиная с порядка n, который примерно равен 26. (Точное значение этого порогового порядка в конкретном случае зависит от компьютера.) &lt;br /&gt;
&lt;br /&gt;
Численно устойчивая реализация данного метода весьма не тривиальна, так как не смотря на то, что впервые метод был предложен в 1981 г., &amp;quot;правильный&amp;quot; способ реализации метода был найден лишь в 1992 г. Этот способ был воплощен при помощи LAPACK-программ ssyevd (для плотных матриц) и sstevd (для трехдиагональных матриц). В этих программах стратегия &amp;quot;разделяй-и-влавствуй&amp;quot; используется для матриц порядка выше 25. &lt;br /&gt;
&lt;br /&gt;
Для матриц порядка ниже 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;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&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;
&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;
&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;
где &amp;lt;math&amp;gt; u = \begin{bmatrix} Q_{1}^{T} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}^{T}\end{bmatrix}v &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;, так как &amp;lt;math&amp;gt;v = \begin{bmatrix} 0 , \ldots  ,  0 , 1 , 1 , 0 \ldots , 0 \end{bmatrix}^T&amp;lt;/math&amp;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;
В дальнейшем предполагаем, не ограничивая общности, что диагональные элементы &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;
&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;Лемма 1.&#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;
&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:Сергеев 1.jpg|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;Лемма 2.&#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 = u + \alpha (D - \alpha I)^{-1}u + u[\rho u^{T}(D - \alpha I)^{-1}u]= &amp;lt;/math&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt; = u + \alpha(D - \alpha I)^{-1}u - u = \alpha [(D - \alpha I)^{-1}u]&amp;lt;/math&amp;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;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;
До сих пор полагалось, что все &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;&#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;
&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;
=== &#039;&#039;Решение векового уравнения&#039;&#039; ===&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:Сергеев 2.jpg|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;
для &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;
&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;
&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; (*)&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;. Два условия в (*) - это обычные условия метода Ньютона, за исключением того, что вместо прямой в качестве приближения используется гипербола. Легко проверить, что &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;
&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;
&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;&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} \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;
Вычисление собственных значений и собственных векторов симметричной трехдиагональной матрицы посредством стратегии &amp;quot;разделяй и властвуй&amp;quot;:&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;
Если &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; :&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;
Иначе:&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;endif&#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 &lt;br /&gt;
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;
         &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;
         &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;
         &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 изображена структура всего алгоритма, на рисунке 4 подробно описана одна из ячеек структуры.&lt;br /&gt;
[[File:Сергеев 3.jpg|thumb|center|left|800px|Рис. 3. Дерево алгоритма &amp;quot;Разделяй и властвуй&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
[[File:Сергеев 4.jpg|thumb|center|1200px|Рис. 4. Детальное описание одного блока алгоритма]]&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;
Последовательная сложность алгоритма: &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;
Единственный найденный пример реализации описан в [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot; ]   ([3] с. 7, 19-20).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Дж. Деммель, &amp;quot;Вычислительная линейная алгебра&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[2] [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
[3] [https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm Алгоритм &amp;quot;Разделяй и властвуй&amp;quot; - Wikipedia]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>NikoSergAlex</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=15732</id>
		<title>Участник:Vika3410/Метод Разделяй и властвуй</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=15732"/>
		<updated>2016-11-02T09:24:07Z</updated>

		<summary type="html">&lt;p&gt;NikoSergAlex: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
Авторы статьи: [[Участник:NikoSergAlex|Сергеев Никита]] (группа 614) (1.1, 1.2, 1.5, 1.6, 1.7, 1.9, 1.10), [[Участница:Vika3410|Стрельцова Виктория]] (группа 614) (1.2, 1.3, 1.4, 1.6, 1.7, 1.8, 1.10)&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод &amp;quot;Разделяй и властвуй&amp;quot; вычисления собственных значений и векторов трёхдиагональной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
| parallel_complexity = &amp;lt;math&amp;gt; O(n^{2.3}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
крайне редко: &amp;lt;math&amp;gt;  O(n^{2}) &amp;lt;/math&amp;gt; &lt;br /&gt;
| pf_width          = &lt;br /&gt;
| input_data        = трёхдиагональная матрица&lt;br /&gt;
| output_data       = матрица собственных значений и матрица собственных векторов исходной матрицы&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; - является наиболее быстрым из существующих методов вычисления всех собственных значений и собственных векторов трехдиагональной матрицы, начиная с порядка n, который примерно равен 26. (Точное значение этого порогового порядка в конкретном случае зависит от компьютера.) &lt;br /&gt;
&lt;br /&gt;
Численно устойчивая реализация данного метода весьма не тривиальна, так как не смотря на то, что впервые метод был предложен в 1981 г., &amp;quot;правильный&amp;quot; способ реализации метода был найден лишь в 1992 г. Этот способ был воплощен при помощи LAPACK-программ ssyevd (для плотных матриц) и sstevd (для трехдиагональных матриц). В этих программах стратегия &amp;quot;разделяй-и-влавствуй&amp;quot; используется для матриц порядка выше 25. &lt;br /&gt;
&lt;br /&gt;
Для матриц порядка ниже 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;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&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;
&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;
&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;
где &amp;lt;math&amp;gt; u = \begin{bmatrix} Q_{1}^{T} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}^{T}\end{bmatrix}v &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;, так как &amp;lt;math&amp;gt;v = \begin{bmatrix} 0 , \ldots  ,  0 , 1 , 1 , 0 \ldots , 0 \end{bmatrix}^T&amp;lt;/math&amp;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;
В дальнейшем предполагаем, не ограничивая общности, что диагональные элементы &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;
&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;Лемма 1.&#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;
&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:Сергеев 1.jpg|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;Лемма 2.&#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 = u + \alpha (D - \alpha I)^{-1}u + u[\rho u^{T}(D - \alpha I)^{-1}u]= &amp;lt;/math&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt; = u + \alpha(D - \alpha I)^{-1}u - u = \alpha [(D - \alpha I)^{-1}u]&amp;lt;/math&amp;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;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;
До сих пор полагалось, что все &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;&#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;
&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;
=== &#039;&#039;Решение векового уравнения&#039;&#039; ===&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:Сергеев 2.jpg|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;
для &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;
&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;
&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; (*)&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;. Два условия в (*) - это обычные условия метода Ньютона, за исключением того, что вместо прямой в качестве приближения используется гипербола. Легко проверить, что &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;
&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;
&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;&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} \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;
Вычисление собственных значений и собственных векторов симметричной трехдиагональной матрицы посредством стратегии &amp;quot;разделяй и властвуй&amp;quot;:&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;
Если &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; :&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;
Иначе:&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;endif&#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 &lt;br /&gt;
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;
         &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;
         &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;
         &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 изображена структура всего алгоритма, на рисунке 4 подробно описана одна из ячеек структуры.&lt;br /&gt;
[[File:Сергеев 3.jpg|thumb|center|left|800px|Рис. 3. Дерево алгоритма &amp;quot;Разделяй и властвуй&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
[[File:Сергеев 4.jpg|thumb|center|1200px|Рис. 4. Детальное описание одного блока алгоритма]]&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;
Последовательная сложность алгоритма: &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;
Единственный найденный пример реализации описан в [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot; ]   ([3] с. 7, 19-20).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Дж. Деммель, &amp;quot;Вычислительная линейная алгебра&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[2] [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
[3] [https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm Алгоритм &amp;quot;Разделяй и властвуй&amp;quot; - Wikipedia]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>NikoSergAlex</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=15731</id>
		<title>Участник:Vika3410/Метод Разделяй и властвуй</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=15731"/>
		<updated>2016-11-02T09:15:43Z</updated>

		<summary type="html">&lt;p&gt;NikoSergAlex: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
Авторы статьи: [[Участник:NikoSergAlex|Сергеев Никита]] (группа 614) (1.1, 1.2, 1.5, 1.6, 1.7, 1.9, 1.10), [[Участница:Vika3410|Стрельцова Виктория]] (группа 614) (1.2, 1.3, 1.4, 1.6, 1.7, 1.8, 1.10)&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод &amp;quot;Разделяй и властвуй&amp;quot; вычисления собственных значений и векторов трёхдиагональной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
| parallel_complexity = &amp;lt;math&amp;gt; O(n^{2.3}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
крайне редко: &amp;lt;math&amp;gt;  O(n^{2}) &amp;lt;/math&amp;gt; &lt;br /&gt;
| pf_width          = &lt;br /&gt;
| input_data        = трёхдиагональная матрица&lt;br /&gt;
| output_data       = матрица собственных значений и матрица собственных векторов исходной матрицы&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; - является наиболее быстрым из существующих методов вычисления всех собственных значений и собственных векторов трехдиагональной матрицы, начиная с порядка n, который примерно равен 26. (Точное значение этого порогового порядка в конкретном случае зависит от компьютера.) &lt;br /&gt;
&lt;br /&gt;
Численно устойчивая реализация данного метода весьма не тривиальна, так как не смотря на то, что впервые метод был предложен в 1981 г., &amp;quot;правильный&amp;quot; способ реализации метода был найден лишь в 1992 г. Этот способ был воплощен при помощи LAPACK-программ ssyevd (для плотных матриц) и sstevd (для трехдиагональных матриц). В этих программах стратегия &amp;quot;разделяй-и-влавствуй&amp;quot; используется для матриц порядка выше 25. &lt;br /&gt;
&lt;br /&gt;
Для матриц порядка ниже 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;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&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;
&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;
&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;
где &amp;lt;math&amp;gt; u = \begin{bmatrix} Q_{1}^{T} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}^{T}\end{bmatrix}v &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;, так как &amp;lt;math&amp;gt;v = \begin{bmatrix} 0 , \ldots  ,  0 , 1 , 1 , 0 \ldots , 0 \end{bmatrix}^T&amp;lt;/math&amp;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;
В дальнейшем предполагаем, не ограничивая общности, что диагональные элементы &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;
&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;Лемма 1.&#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;
&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:Сергеев 1.jpg|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;Лемма 2.&#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 = u + \alpha (D - \alpha I)^{-1}u + u[\rho u^{T}(D - \alpha I)^{-1}u]= &amp;lt;/math&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt; = u + \alpha(D - \alpha I)^{-1}u - u = \alpha [(D - \alpha I)^{-1}u]&amp;lt;/math&amp;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;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;
До сих пор полагалось, что все &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;&#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;
=== &#039;&#039;Решение векового уравнения&#039;&#039; ===&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:Сергеев 2.jpg|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;
для &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;
&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;
&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; (*)&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;. Два условия в (*) - это обычные условия метода Ньютона, за исключением того, что вместо прямой в качестве приближения используется гипербола. Легко проверить, что &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;
&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;
&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;&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} \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;
Вычисление собственных значений и собственных векторов симметричной трехдиагональной матрицы посредством стратегии &amp;quot;разделяй и властвуй&amp;quot;:&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;
Если &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; :&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;
Иначе:&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;endif&#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 &lt;br /&gt;
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;
         &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;
         &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;
         &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 изображена структура всего алгоритма, на рисунке 4 подробно описана одна из ячеек структуры.&lt;br /&gt;
[[File:Сергеев 3.jpg|thumb|center|left|800px|Рис. 3. Дерево алгоритма &amp;quot;Разделяй и властвуй&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
[[File:Сергеев 4.jpg|thumb|center|1200px|Рис. 4. Детальное описание одного блока алгоритма]]&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;
Последовательная сложность алгоритма: &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;
Единственный найденный пример реализации описан в [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot; ]   ([3] с. 7, 19-20).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Дж. Деммель, &amp;quot;Вычислительная линейная алгебра&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[2] [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
[3] [https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm Алгоритм &amp;quot;Разделяй и властвуй&amp;quot; - Wikipedia]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>NikoSergAlex</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=15730</id>
		<title>Участник:Vika3410/Метод Разделяй и властвуй</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=15730"/>
		<updated>2016-11-02T09:14:15Z</updated>

		<summary type="html">&lt;p&gt;NikoSergAlex: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
Авторы статьи: [[Участник:NikoSergAlex|Сергеев Никита]] (группа 614) (1.1, 1.2, 1.5, 1.6, 1.7, 1.9, 1.10), [[Участница:Vika3410|Стрельцова Виктория]] (группа 614) (1.2, 1.3, 1.4, 1.6, 1.7, 1.8, 1.10)&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод &amp;quot;Разделяй и властвуй&amp;quot; вычисления собственных значений и векторов трёхдиагональной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
| parallel_complexity = &amp;lt;math&amp;gt; O(n^{2.3}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
крайне редко: &amp;lt;math&amp;gt;  O(n^{2}) &amp;lt;/math&amp;gt; &lt;br /&gt;
| pf_width          = &lt;br /&gt;
| input_data        = трёхдиагональная матрица&lt;br /&gt;
| output_data       = матрица собственных значений и матрица собственных векторов исходной матрицы&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; - является наиболее быстрым из существующих методов вычисления всех собственных значений и собственных векторов трехдиагональной матрицы, начиная с порядка n, который примерно равен 26. (Точное значение этого порогового порядка в конкретном случае зависит от компьютера.) &lt;br /&gt;
&lt;br /&gt;
Численно устойчивая реализация данного метода весьма не тривиальна, так как не смотря на то, что впервые метод был предложен в 1981 г., &amp;quot;правильный&amp;quot; способ реализации метода был найден лишь в 1992 г. Этот способ был воплощен при помощи LAPACK-программ ssyevd (для плотных матриц) и sstevd (для трехдиагональных матриц). В этих программах стратегия &amp;quot;разделяй-и-влавствуй&amp;quot; используется для матриц порядка выше 25. &lt;br /&gt;
&lt;br /&gt;
Для матриц порядка ниже 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;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&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;
&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;
&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;
где &amp;lt;math&amp;gt; u = \begin{bmatrix} Q_{1}^{T} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}^{T}\end{bmatrix}v &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;, так как &amp;lt;math&amp;gt;v = \begin{bmatrix} 0 , \ldots  ,  0 , 1 , 1 , 0 \ldots , 0 \end{bmatrix}^T&amp;lt;/math&amp;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;
В дальнейшем предполагаем, не ограничивая общности, что диагональные элементы &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;
&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;Лемма 1.&#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;
&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:Сергеев 1.jpg|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;Лемма 2.&#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 = u + \alpha (D - \alpha I)^{-1}u + u[\rho u^{T}(D - \alpha I)^{-1}u]= &amp;lt;/math&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt; = u + \alpha(D - \alpha I)^{-1}u - u = \alpha [(D - \alpha I)^{-1}u]&amp;lt;/math&amp;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;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;
До сих пор полагалось, что все &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;
=== &#039;&#039;Решение векового уравнения&#039;&#039; ===&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:Сергеев 2.jpg|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;
для &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;
&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;
&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; (*)&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;. Два условия в (*) - это обычные условия метода Ньютона, за исключением того, что вместо прямой в качестве приближения используется гипербола. Легко проверить, что &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;
&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;
&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;&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} \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;
Вычисление собственных значений и собственных векторов симметричной трехдиагональной матрицы посредством стратегии &amp;quot;разделяй и властвуй&amp;quot;:&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;
Если &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; :&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;
Иначе:&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;endif&#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 &lt;br /&gt;
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;
         &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;
         &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;
         &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 изображена структура всего алгоритма, на рисунке 4 подробно описана одна из ячеек структуры.&lt;br /&gt;
[[File:Сергеев 3.jpg|thumb|center|left|800px|Рис. 3. Дерево алгоритма &amp;quot;Разделяй и властвуй&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
[[File:Сергеев 4.jpg|thumb|center|1200px|Рис. 4. Детальное описание одного блока алгоритма]]&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;
Последовательная сложность алгоритма: &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;
Единственный найденный пример реализации описан в [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot; ]   ([3] с. 7, 19-20).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Дж. Деммель, &amp;quot;Вычислительная линейная алгебра&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[2] [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
[3] [https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm Алгоритм &amp;quot;Разделяй и властвуй&amp;quot; - Wikipedia]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>NikoSergAlex</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=15719</id>
		<title>Участник:Vika3410/Метод Разделяй и властвуй</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=15719"/>
		<updated>2016-11-02T08:27:27Z</updated>

		<summary type="html">&lt;p&gt;NikoSergAlex: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
Авторы статьи: [[Участник:NikoSergAlex|Сергеев Никита]] (группа 614) (1.1, 1.2, 1.5, 1.6, 1.7, 1.9, 1.10), [[Участница:Vika3410|Стрельцова Виктория]] (группа 614) (1.2, 1.3, 1.4, 1.6, 1.7, 1.8, 1.10)&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод &amp;quot;Разделяй и властвуй&amp;quot; вычисления собственных значений и векторов трёхдиагональной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
| parallel_complexity = &amp;lt;math&amp;gt; O(n^{2.3}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
крайне редко: &amp;lt;math&amp;gt;  O(n^{2}) &amp;lt;/math&amp;gt; &lt;br /&gt;
| pf_width          = &lt;br /&gt;
| input_data        = трёхдиагональная матрица&lt;br /&gt;
| output_data       = матрица собственных значений и матрица собственных векторов исходной матрицы&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; - является наиболее быстрым из существующих методов вычисления всех собственных значений и собственных векторов трехдиагональной матрицы, начиная с порядка n, который примерно равен 26. (Точное значение этого порогового порядка в конкретном случае зависит от компьютера.) &lt;br /&gt;
&lt;br /&gt;
Численно устойчивая реализация данного метода весьма не тривиальна, так как не смотря на то, что впервые метод был предложен в 1981 г., &amp;quot;правильный&amp;quot; способ реализации метода был найден лишь в 1992 г. Этот способ был воплощен при помощи LAPACK-программ ssyevd (для плотных матриц) и sstevd (для трехдиагональных матриц). В этих программах стратегия &amp;quot;разделяй-и-влавствуй&amp;quot; используется для матриц порядка выше 25. &lt;br /&gt;
&lt;br /&gt;
Для матриц порядка ниже 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;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&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;
&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;
&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;
где &amp;lt;math&amp;gt; u = \begin{bmatrix} Q_{1}^{T} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}^{T}\end{bmatrix}v &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;, так как &amp;lt;math&amp;gt;v = \begin{bmatrix} 0 , \ldots  ,  0 , 1 , 1 , 0 \ldots , 0 \end{bmatrix}^T&amp;lt;/math&amp;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;
Будем предполагать, не ограничивая общности, что диагональные элементы &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;
&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;Лемма 1.&#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;
&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:Сергеев 1.jpg|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;Лемма 2.&#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 = u + \alpha (D - \alpha I)^{-1}u + u[\rho u^{T}(D - \alpha I)^{-1}u]= &amp;lt;/math&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt; = u + \alpha(D - \alpha I)^{-1}u - u = \alpha [(D - \alpha I)^{-1}u]&amp;lt;/math&amp;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;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;
=== &#039;&#039;Дефляция&#039;&#039; ===&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;
=== &#039;&#039;Решение векового уравнения&#039;&#039; ===&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:Сергеев 2.jpg|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;
для &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;
&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;
&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; (*)&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;. Два условия в (*) - это обычные условия метода Ньютона, за исключением того, что вместо прямой в качестве приближения используется гипербола. Легко проверить, что &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;
&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;
&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;&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} \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;
Вычисление собственных значений и собственных векторов симметричной трехдиагональной матрицы посредством стратегии &amp;quot;разделяй и властвуй&amp;quot;:&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;
Если &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; :&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;
Иначе:&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;endif&#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 &lt;br /&gt;
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;
         &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;
         &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;
         &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 изображена структура всего алгоритма, на рисунке 4 подробно описана одна из ячеек структуры.&lt;br /&gt;
[[File:Сергеев 3.jpg|thumb|center|left|800px|Рис. 3. Дерево алгоритма &amp;quot;Разделяй и властвуй&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
[[File:Сергеев 4.jpg|thumb|center|1200px|Рис. 4. Детальное описание одного блока алгоритма]]&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;
Последовательная сложность алгоритма: &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;
Единственный найденный пример реализации описан в [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot; ]   ([3] с. 7, 19-20).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Дж. Деммель, &amp;quot;Вычислительная линейная алгебра&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[2] [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
[3] [https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm Алгоритм &amp;quot;Разделяй и властвуй&amp;quot; - Wikipedia]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>NikoSergAlex</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=15718</id>
		<title>Участник:Vika3410/Метод Разделяй и властвуй</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=15718"/>
		<updated>2016-11-02T08:26:37Z</updated>

		<summary type="html">&lt;p&gt;NikoSergAlex: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
Авторы статьи: [[Участник:NikoSergAlex|Сергеев Никита]] (группа 614) (1.1, 1.2, 1.5, 1.6, 1.7, 1.9, 1.10), [[Участница:Vika3410|Стрельцова Виктория]] (группа 614) (1.2, 1.3, 1.4, 1.6, 1.7, 1.8, 1.10)&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод &amp;quot;Разделяй и властвуй&amp;quot; вычисления собственных значений и векторов трёхдиагональной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
| parallel_complexity = &amp;lt;math&amp;gt; O(n^{2.3}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
крайне редко: &amp;lt;math&amp;gt;  O(n^{2}) &amp;lt;/math&amp;gt; &lt;br /&gt;
| pf_width          = &lt;br /&gt;
| input_data        = трёхдиагональная матрица&lt;br /&gt;
| output_data       = матрица собственных значений и матрица собственных векторов исходной матрицы&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; - является наиболее быстрым из существующих методов вычисления всех собственных значений и собственных векторов трехдиагональной матрицы, начиная с порядка n, который примерно равен 26. (Точное значение этого порогового порядка в конкретном случае зависит от компьютера.) &lt;br /&gt;
Численно устойчивая реализация данного метода весьма не тривиальна, так как не смотря на то, что впервые метод был предложен в 1981 г., &amp;quot;правильный&amp;quot; способ реализации метода был найден лишь в 1992 г. Этот способ был воплощен при помощи LAPACK-программ ssyevd (для плотных матриц) и sstevd (для трехдиагональных матриц). В этих программах стратегия &amp;quot;разделяй-и-влавствуй&amp;quot; используется для матриц порядка выше 25. &lt;br /&gt;
Для матриц порядка ниже 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;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&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;
&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;
&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;
где &amp;lt;math&amp;gt; u = \begin{bmatrix} Q_{1}^{T} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}^{T}\end{bmatrix}v &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;, так как &amp;lt;math&amp;gt;v = \begin{bmatrix} 0 , \ldots  ,  0 , 1 , 1 , 0 \ldots , 0 \end{bmatrix}^T&amp;lt;/math&amp;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;
Будем предполагать, не ограничивая общности, что диагональные элементы &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;
&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;Лемма 1.&#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;
&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:Сергеев 1.jpg|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;Лемма 2.&#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 = u + \alpha (D - \alpha I)^{-1}u + u[\rho u^{T}(D - \alpha I)^{-1}u]= &amp;lt;/math&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt; = u + \alpha(D - \alpha I)^{-1}u - u = \alpha [(D - \alpha I)^{-1}u]&amp;lt;/math&amp;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;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;
=== &#039;&#039;Дефляция&#039;&#039; ===&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;
=== &#039;&#039;Решение векового уравнения&#039;&#039; ===&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:Сергеев 2.jpg|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;
для &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;
&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;
&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; (*)&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;. Два условия в (*) - это обычные условия метода Ньютона, за исключением того, что вместо прямой в качестве приближения используется гипербола. Легко проверить, что &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;
&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;
&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;&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} \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;
Вычисление собственных значений и собственных векторов симметричной трехдиагональной матрицы посредством стратегии &amp;quot;разделяй и властвуй&amp;quot;:&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;
Если &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; :&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;
Иначе:&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;endif&#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 &lt;br /&gt;
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;
         &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;
         &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;
         &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 изображена структура всего алгоритма, на рисунке 4 подробно описана одна из ячеек структуры.&lt;br /&gt;
[[File:Сергеев 3.jpg|thumb|center|left|800px|Рис. 3. Дерево алгоритма &amp;quot;Разделяй и властвуй&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
[[File:Сергеев 4.jpg|thumb|center|1200px|Рис. 4. Детальное описание одного блока алгоритма]]&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;
Последовательная сложность алгоритма: &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;
Единственный найденный пример реализации описан в [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot; ]   ([3] с. 7, 19-20).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Дж. Деммель, &amp;quot;Вычислительная линейная алгебра&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[2] [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
[3] [https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm Алгоритм &amp;quot;Разделяй и властвуй&amp;quot; - Wikipedia]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>NikoSergAlex</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=15717</id>
		<title>Участник:Vika3410/Метод Разделяй и властвуй</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=15717"/>
		<updated>2016-11-02T08:25:17Z</updated>

		<summary type="html">&lt;p&gt;NikoSergAlex: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
Авторы статьи: [[Участник:NikoSergAlex|Сергеев Никита]] (группа 614) (1.1, 1.2, 1.5, 1.6, 1.7, 1.9, 1.10), [[Участница:Vika3410|Стрельцова Виктория]] (группа 614) (1.2, 1.3, 1.4, 1.6, 1.7, 1.8, 1.10)&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод &amp;quot;Разделяй и властвуй&amp;quot; вычисления собственных значений и векторов трёхдиагональной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
| parallel_complexity = &amp;lt;math&amp;gt; O(n^{2.3}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
крайне редко: &amp;lt;math&amp;gt;  O(n^{2}) &amp;lt;/math&amp;gt; &lt;br /&gt;
| pf_width          = &lt;br /&gt;
| input_data        = трёхдиагональная матрица&lt;br /&gt;
| output_data       = матрица собственных значений и матрица собственных векторов исходной матрицы&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; - является наиболее быстрым из существующих методов вычисления всех собственных значений и собственных векторов трехдиагональной матрицы, начиная с порядка n, который примерно равен 26. (Точное значение этого порогового порядка в конкретном случае зависит от компьютера.) Численно устойчивая реализация данного метода весьма не тривиальна, так как не смотря на то, что впервые метод был предложен в 1981 г., &amp;quot;правильный&amp;quot; способ реализации метода был найден лишь в 1992 г. Этот способ был воплощен при помощи LAPACK-программ ssyevd (для плотных матриц) и sstevd (для трехдиагональных матриц). В этих программах стратегия &amp;quot;разделяй-и-влавствуй&amp;quot; используется для матриц порядка выше 25. Для матриц порядка ниже 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;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&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;
&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;
&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;
где &amp;lt;math&amp;gt; u = \begin{bmatrix} Q_{1}^{T} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}^{T}\end{bmatrix}v &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;, так как &amp;lt;math&amp;gt;v = \begin{bmatrix} 0 , \ldots  ,  0 , 1 , 1 , 0 \ldots , 0 \end{bmatrix}^T&amp;lt;/math&amp;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;
Будем предполагать, не ограничивая общности, что диагональные элементы &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;
&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;Лемма 1.&#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;
&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:Сергеев 1.jpg|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;Лемма 2.&#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 = u + \alpha (D - \alpha I)^{-1}u + u[\rho u^{T}(D - \alpha I)^{-1}u]= &amp;lt;/math&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt; = u + \alpha(D - \alpha I)^{-1}u - u = \alpha [(D - \alpha I)^{-1}u]&amp;lt;/math&amp;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;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;
=== &#039;&#039;Дефляция&#039;&#039; ===&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;
=== &#039;&#039;Решение векового уравнения&#039;&#039; ===&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:Сергеев 2.jpg|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;
для &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;
&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;
&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; (*)&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;. Два условия в (*) - это обычные условия метода Ньютона, за исключением того, что вместо прямой в качестве приближения используется гипербола. Легко проверить, что &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;
&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;
&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;&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} \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;
Вычисление собственных значений и собственных векторов симметричной трехдиагональной матрицы посредством стратегии &amp;quot;разделяй и властвуй&amp;quot;:&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;
Если &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; :&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;
Иначе:&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;endif&#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 &lt;br /&gt;
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;
         &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;
         &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;
         &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 изображена структура всего алгоритма, на рисунке 4 подробно описана одна из ячеек структуры.&lt;br /&gt;
[[File:Сергеев 3.jpg|thumb|center|left|800px|Рис. 3. Дерево алгоритма &amp;quot;Разделяй и властвуй&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
[[File:Сергеев 4.jpg|thumb|center|1200px|Рис. 4. Детальное описание одного блока алгоритма]]&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;
Последовательная сложность алгоритма: &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;
Единственный найденный пример реализации описан в [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot; ]   ([3] с. 7, 19-20).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Дж. Деммель, &amp;quot;Вычислительная линейная алгебра&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[2] [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
[3] [https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm Алгоритм &amp;quot;Разделяй и властвуй&amp;quot; - Wikipedia]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>NikoSergAlex</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=15650</id>
		<title>Участник:Vika3410/Метод Разделяй и властвуй</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=15650"/>
		<updated>2016-11-01T20:30:49Z</updated>

		<summary type="html">&lt;p&gt;NikoSergAlex: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
Авторы статьи: [[Участник:NikoSergAlex|Сергеев Никита]] (группа 614) (1.1, 1.2, 1.5, 1.6, 1.7, 1.9, 1.10), [[Участница:Vika3410|Стрельцова Виктория]] (группа 614) (1.2, 1.3, 1.4, 1.6, 1.7, 1.8, 1.10)&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод &amp;quot;Разделяй и властвуй&amp;quot; вычисления собственных значений и векторов трёхдиагональной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
| parallel_complexity = &amp;lt;math&amp;gt; O(n^{2.3}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
крайне редко: &amp;lt;math&amp;gt;  O(n^{2}) &amp;lt;/math&amp;gt; &lt;br /&gt;
| pf_width          = &lt;br /&gt;
| input_data        = трёхдиагональная матрица&lt;br /&gt;
| output_data       = матрица собственных значений и матрица собственных векторов исходной матрицы&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; - это наиболее быстрый из существующих методов вычисления всех собственных значений и собственных векторов трехдиагональной матрицы, начиная с порядка 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;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&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;
&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;
&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;
где &amp;lt;math&amp;gt; u = \begin{bmatrix} Q_{1}^{T} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}^{T}\end{bmatrix}v &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;, так как &amp;lt;math&amp;gt;v = \begin{bmatrix} 0 , \ldots  ,  0 , 1 , 1 , 0 \ldots , 0 \end{bmatrix}^T&amp;lt;/math&amp;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;
Будем предполагать, не ограничивая общности, что диагональные элементы &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;
&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;Лемма 1.&#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;
&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:Сергеев 1.jpg|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;Лемма 2.&#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 = u + \alpha (D - \alpha I)^{-1}u + u[\rho u^{T}(D - \alpha I)^{-1}u]= &amp;lt;/math&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt; = u + \alpha(D - \alpha I)^{-1}u - u = \alpha [(D - \alpha I)^{-1}u]&amp;lt;/math&amp;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;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;
=== &#039;&#039;Дефляция&#039;&#039; ===&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;
=== &#039;&#039;Решение векового уравнения&#039;&#039; ===&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:Сергеев 2.jpg|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;
для &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;
&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;
&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; (*)&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;. Два условия в (*) - это обычные условия метода Ньютона, за исключением того, что вместо прямой в качестве приближения используется гипербола. Легко проверить, что &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;
&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;
&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;&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} \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;
Вычисление собственных значений и собственных векторов симметричной трехдиагональной матрицы посредством стратегии &amp;quot;разделяй и властвуй&amp;quot;:&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;
Если &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; :&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;
Иначе:&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;endif&#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 &lt;br /&gt;
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;
         &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;
         &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;
         &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 изображена структура всего алгоритма, на рисунке 4 подробно описана одна из ячеек структуры.&lt;br /&gt;
[[File:Сергеев 3.jpg|thumb|center|left|800px|Рис. 3. Дерево алгоритма &amp;quot;Разделяй и властвуй&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
[[File:Сергеев 4.jpg|thumb|center|1200px|Рис. 4. Детальное описание одного блока алгоритма]]&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;
Последовательная сложность алгоритма: &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;
Единственный найденный пример реализации описан в [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot; ]   ([3] с. 7, 19-20).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Дж. Деммель, &amp;quot;Вычислительная линейная алгебра&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[2] [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
[3] [https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm Алгоритм &amp;quot;Разделяй и властвуй&amp;quot; - Wikipedia]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>NikoSergAlex</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=15508</id>
		<title>Участник:Vika3410/Метод Разделяй и властвуй</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=15508"/>
		<updated>2016-11-01T11:07:22Z</updated>

		<summary type="html">&lt;p&gt;NikoSergAlex: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Авторы статьи: [[Участник:NikoSergAlex|Сергеев Никита]] (группа 614) (1.1, 1.2, 1.5, 1.6, 1.9, 1.10), [[Участница:Vika3410|Стрельцова Виктория]] (группа 614) (1.3, 1.4, 1.6, 1.7, 1.8, 1.10)&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод &amp;quot;Разделяй и властвуй&amp;quot; вычисления собственных значений и векторов трёхдиагональной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
| parallel_complexity = &amp;lt;math&amp;gt; O(n^{2.3}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
крайне редко: &amp;lt;math&amp;gt;  O(n^{2}) &amp;lt;/math&amp;gt; &lt;br /&gt;
| pf_width          = &lt;br /&gt;
| input_data        = трёхдиагональная матрица&lt;br /&gt;
| output_data       = собственные значения и собственные вектора исходной матрицы&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; - это наиболее быстрый из существующих методов вычисления всех собственных значений и собственных векторов трехдиагональной матрицы, начиная с порядка 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;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&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;
&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;
&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;
где &amp;lt;math&amp;gt; u = \begin{bmatrix} Q_{1}^{T} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}^{T}\end{bmatrix}v &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;, так как &amp;lt;math&amp;gt;v = \begin{bmatrix} 0 , \ldots  ,  0 , 1 , 1 , 0 \ldots , 0 \end{bmatrix}^T&amp;lt;/math&amp;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;
Будем предполагать, не ограничивая общности, что диагональные элементы &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;
&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;Лемма 1.&#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;
&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:Сергеев 1.jpg|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;Лемма 2.&#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 = u + \alpha (D - \alpha I)^{-1}u + u[\rho u^{T}(D - \alpha I)^{-1}u]= &amp;lt;/math&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt; = u + \alpha(D - \alpha I)^{-1}u - u = \alpha [(D - \alpha I)^{-1}u]&amp;lt;/math&amp;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;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;
=== &#039;&#039;Дефляция&#039;&#039; ===&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;
=== &#039;&#039;Решение векового уравнения&#039;&#039; ===&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:Сергеев 2.jpg|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;
для &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;
&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;
&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; (*)&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;. Два условия в (*) - это обычные условия метода Ньютона, за исключением того, что вместо прямой в качестве приближения используется гипербола. Легко проверить, что &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;
&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;
&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;&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} \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;
Вычисление собственных значений и собственных векторов симметричной трехдиагональной матрицы посредством стратегии &amp;quot;разделяй и властвуй&amp;quot;:&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;
Если &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; :&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;
Иначе:&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;endif&#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 &lt;br /&gt;
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;
         &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;
         &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;
         &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 изображена структура всего алгоритма, на рисунке 4 подробно описана одна из ячеек структуры.&lt;br /&gt;
[[File:Сергеев 3.jpg|thumb|center|left|800px|Рис. 3. Дерево алгоритма &amp;quot;Разделяй и властвуй&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
[[File:Сергеев 4.jpg|thumb|center|1200px|Рис. 4. Детальное описание одного блока алгоритма]]&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;
Последовательная сложность алгоритма: &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;
Единственный найденный пример реализации описан в [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot; ]   ([3] с. 7, 19-20).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Дж. Деммель, &amp;quot;Вычислительная линейная алгебра&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[2] [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
[3] [https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm Алгоритм &amp;quot;Разделяй и властвуй&amp;quot; - Wikipedia]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>NikoSergAlex</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=15507</id>
		<title>Участник:Vika3410/Метод Разделяй и властвуй</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=15507"/>
		<updated>2016-11-01T11:04:49Z</updated>

		<summary type="html">&lt;p&gt;NikoSergAlex: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Авторы статьи: [[Участник:NikoSergAlex|Сергеев Никита]] (группа 614) (1.1, 1.2, 1.4, 1.5, 1.6, 1.7, 1.9, 1.10), [[Участница:Vika3410|Стрельцова Виктория]] (группа 614) (1.2, 1.3, 1.6, 1.7, 1.8, 1.9, 1.10, 2.7)&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод &amp;quot;Разделяй и властвуй&amp;quot; вычисления собственных значений и векторов трёхдиагональной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
| parallel_complexity = &amp;lt;math&amp;gt; O(n^{2.3}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
крайне редко: &amp;lt;math&amp;gt;  O(n^{2}) &amp;lt;/math&amp;gt; &lt;br /&gt;
| pf_width          = &lt;br /&gt;
| input_data        = трёхдиагональная матрица&lt;br /&gt;
| output_data       = собственные значения и собственные вектора исходной матрицы&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; - это наиболее быстрый из существующих методов вычисления всех собственных значений и собственных векторов трехдиагональной матрицы, начиная с порядка 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;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&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;
&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;
&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;
где &amp;lt;math&amp;gt; u = \begin{bmatrix} Q_{1}^{T} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}^{T}\end{bmatrix}v &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;, так как &amp;lt;math&amp;gt;v = \begin{bmatrix} 0 , \ldots  ,  0 , 1 , 1 , 0 \ldots , 0 \end{bmatrix}^T&amp;lt;/math&amp;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;
Будем предполагать, не ограничивая общности, что диагональные элементы &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;
&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;Лемма 1.&#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;
&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:Сергеев 1.jpg|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;Лемма 2.&#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 = u + \alpha (D - \alpha I)^{-1}u + u[\rho u^{T}(D - \alpha I)^{-1}u]= &amp;lt;/math&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt; = u + \alpha(D - \alpha I)^{-1}u - u = \alpha [(D - \alpha I)^{-1}u]&amp;lt;/math&amp;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;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;
=== &#039;&#039;Дефляция&#039;&#039; ===&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;
=== &#039;&#039;Решение векового уравнения&#039;&#039; ===&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:Сергеев 2.jpg|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;
для &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;
&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;
&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; (*)&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;. Два условия в (*) - это обычные условия метода Ньютона, за исключением того, что вместо прямой в качестве приближения используется гипербола. Легко проверить, что &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;
&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;
&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;&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} \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;
Вычисление собственных значений и собственных векторов симметричной трехдиагональной матрицы посредством стратегии &amp;quot;разделяй и властвуй&amp;quot;:&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;
Если &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; :&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;
Иначе:&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;endif&#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 &lt;br /&gt;
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;
         &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;
         &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;
         &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 изображена структура всего алгоритма, на рисунке 4 подробно описана одна из ячеек структуры.&lt;br /&gt;
[[File:Сергеев 3.jpg|thumb|center|left|800px|Рис. 3. Дерево алгоритма &amp;quot;Разделяй и властвуй&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
[[File:Сергеев 4.jpg|thumb|center|1200px|Рис. 4. Детальное описание одного блока алгоритма]]&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;
Последовательная сложность алгоритма: &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;
Единственный найденный пример реализации описан в [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot; ]   ([3] с. 7, 19-20).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Дж. Деммель, &amp;quot;Вычислительная линейная алгебра&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[2] [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
[3] [https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm Алгоритм &amp;quot;Разделяй и властвуй&amp;quot; - Wikipedia]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>NikoSergAlex</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=15498</id>
		<title>Участник:Vika3410/Метод Разделяй и властвуй</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=15498"/>
		<updated>2016-11-01T10:56:17Z</updated>

		<summary type="html">&lt;p&gt;NikoSergAlex: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Авторы статьи: [[Участник:NikoSergAlex|Сергеев Никита]] (группа 614), [[Участница:Vika3410|Стрельцова Виктория]] (группа 614)&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод &amp;quot;Разделяй и властвуй&amp;quot; вычисления собственных значений и векторов трёхдиагональной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
| parallel_complexity = &amp;lt;math&amp;gt; O(n^{2.3}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
крайне редко: &amp;lt;math&amp;gt;  O(n^{2}) &amp;lt;/math&amp;gt; &lt;br /&gt;
| pf_width          = &lt;br /&gt;
| input_data        = трёхдиагональная матрица&lt;br /&gt;
| output_data       = собственные значения и собственные вектора исходной матрицы&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; - это наиболее быстрый из существующих методов вычисления всех собственных значений и собственных векторов трехдиагональной матрицы, начиная с порядка 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;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&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;
&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;
&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;
где &amp;lt;math&amp;gt; u = \begin{bmatrix} Q_{1}^{T} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}^{T}\end{bmatrix}v &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;, так как &amp;lt;math&amp;gt;v = \begin{bmatrix} 0 , \ldots  ,  0 , 1 , 1 , 0 \ldots , 0 \end{bmatrix}^T&amp;lt;/math&amp;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;
Будем предполагать, не ограничивая общности, что диагональные элементы &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;
&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;Лемма 1.&#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;
&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:Сергеев 1.jpg|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;Лемма 2.&#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 = u + \alpha (D - \alpha I)^{-1}u + u[\rho u^{T}(D - \alpha I)^{-1}u]= &amp;lt;/math&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt; = u + \alpha(D - \alpha I)^{-1}u - u = \alpha [(D - \alpha I)^{-1}u]&amp;lt;/math&amp;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;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;
=== &#039;&#039;Дефляция&#039;&#039; ===&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;
=== &#039;&#039;Решение векового уравнения&#039;&#039; ===&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:Сергеев 2.jpg|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;
для &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;
&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;
&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; (*)&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;. Два условия в (*) - это обычные условия метода Ньютона, за исключением того, что вместо прямой в качестве приближения используется гипербола. Легко проверить, что &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;
&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;
&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;&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} \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;
Вычисление собственных значений и собственных векторов симметричной трехдиагональной матрицы посредством стратегии &amp;quot;разделяй и властвуй&amp;quot;:&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;
Если &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; :&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;
Иначе:&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;endif&#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 &lt;br /&gt;
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;
         &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;
         &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;
         &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 изображена структура всего алгоритма, на рисунке 4 подробно описана одна из ячеек структуры.&lt;br /&gt;
[[File:Сергеев 3.jpg|thumb|center|left|800px|Рис. 3. Дерево алгоритма &amp;quot;Разделяй и властвуй&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
[[File:Сергеев 4.jpg|thumb|center|1200px|Рис. 4. Детальное описание одного блока алгоритма]]&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;
Последовательная сложность алгоритма: &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;
Единственный найденный пример реализации описан в [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot; ]   ([3] с. 7, 19-20).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Дж. Деммель, &amp;quot;Вычислительная линейная алгебра&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[2] [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
[3] [https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm Алгоритм &amp;quot;Разделяй и властвуй&amp;quot; - Wikipedia]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>NikoSergAlex</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=13155</id>
		<title>Участник:Vika3410/Метод Разделяй и властвуй</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=13155"/>
		<updated>2016-10-18T20:49:45Z</updated>

		<summary type="html">&lt;p&gt;NikoSergAlex: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи: [[Участник:NikoSergAlex|Сергеев Никита]] (группа 614), [[Участница:Vika3410|Стрельцова Виктория]] (группа 614)&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод &amp;quot;Разделяй и властвуй&amp;quot; вычисления собственных значений и векторов трёхдиагональной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
| parallel_complexity = &amp;lt;math&amp;gt; O(n^{2.3}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
крайне редко: &amp;lt;math&amp;gt;  O(n^{2}) &amp;lt;/math&amp;gt; &lt;br /&gt;
| pf_width          = &lt;br /&gt;
| input_data        = трёхдиагональная матрица&lt;br /&gt;
| output_data       = собственные значения и собственные вектора исходной матрицы&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; - это наиболее быстрый из существующих методов вычисления всех собственных значений и собственных векторов трехдиагональной матрицы, начиная с порядка 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;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&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;
&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;
&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;
где &amp;lt;math&amp;gt; u = \begin{bmatrix} Q_{1}^{T} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}^{T}\end{bmatrix}v &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;, так как &amp;lt;math&amp;gt;v = \begin{bmatrix} 0 , \ldots  ,  0 , 1 , 1 , 0 \ldots , 0 \end{bmatrix}^T&amp;lt;/math&amp;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;
Будем предполагать, не ограничивая общности, что диагональные элементы &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;
&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;Лемма 1.&#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;
&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:Сергеев 1.jpg|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;Лемма 2.&#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 = u + \alpha (D - \alpha I)^{-1}u + u[\rho u^{T}(D - \alpha I)^{-1}u]= &amp;lt;/math&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt; = u + \alpha(D - \alpha I)^{-1}u - u = \alpha [(D - \alpha I)^{-1}u]&amp;lt;/math&amp;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;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;
=== &#039;&#039;Дефляция&#039;&#039; ===&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;
=== &#039;&#039;Решение векового уравнения&#039;&#039; ===&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:Сергеев 2.jpg|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;
для &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;
&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;
&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; (*)&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;. Два условия в (*) - это обычные условия метода Ньютона, за исключением того, что вместо прямой в качестве приближения используется гипербола. Легко проверить, что &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;
&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;
&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;&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} \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;
Вычисление собственных значений и собственных векторов симметричной трехдиагональной матрицы посредством стратегии &amp;quot;разделяй и властвуй&amp;quot;:&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;
Если &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; :&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;
Иначе:&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;endif&#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 &lt;br /&gt;
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;
         &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;
         &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;
         &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;
На рисунке 2 изображена структура всего алгоритма, на рисунке 3 подробно описана одна из ячеек структуры.&lt;br /&gt;
[[File:Сергеев 3.jpg|thumb|center|left|800px|Рис. 3. Дерево алгоритма &amp;quot;Разделяй и властвуй&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
[[File:Сергеев 4.jpg|thumb|center|1200px|Рис. 4. Детальное описание одного блока алгоритма]]&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;
Последовательная сложность алгоритма: &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;
Единственный найденный пример реализации описан в [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot; ]   ([3] с. 7, 19-20).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Дж. Деммель, &amp;quot;Вычислительная линейная алгебра&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[2] [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
[3] [https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm Алгоритм &amp;quot;Разделяй и властвуй&amp;quot; - Wikipedia]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>NikoSergAlex</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=13153</id>
		<title>Участник:Vika3410/Метод Разделяй и властвуй</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=13153"/>
		<updated>2016-10-18T20:47:46Z</updated>

		<summary type="html">&lt;p&gt;NikoSergAlex: NikoSergAlex переименовал страницу Участник:Участники: tesssssst в [[Участник:Участники: Сергеев Никита, Стрельцова Виктория/ Метод Разделяй и вл…&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы статьи: [[Участник:NikoSergAlex|Сергеев Никита]] (группа 614), [[Участница:Vika3410|Стрельцова Виктория]] (группа 614)&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод &amp;quot;Разделяй и властвуй&amp;quot; вычисления собственных значений и векторов трёхдиагональной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
| parallel_complexity = &amp;lt;math&amp;gt; O(n^{2.3}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
крайне редко: &amp;lt;math&amp;gt;  O(n^{2}) &amp;lt;/math&amp;gt; &lt;br /&gt;
| pf_width          = &lt;br /&gt;
| input_data        = трёхдиагональная матрица&lt;br /&gt;
| output_data       = собственные значения и собственные вектора исходной матрицы&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; - это наиболее быстрый из существующих методов вычисления всех собственных значений и собственных векторов трехдиагональной матрицы, начиная с порядка 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;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&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;
&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;
&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;
где &amp;lt;math&amp;gt; u = \begin{bmatrix} Q_{1}^{T} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}^{T}\end{bmatrix}v &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;, так как &amp;lt;math&amp;gt;v = \begin{bmatrix} 0 , \ldots  ,  0 , 1 , 1 , 0 \ldots , 0 \end{bmatrix}^T&amp;lt;/math&amp;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;
Будем предполагать, не ограничивая общности, что диагональные элементы &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;
&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;Лемма 1.&#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;
&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:Сергеев 1.jpg|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;Лемма 2.&#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 = u + \alpha (D - \alpha I)^{-1}u + u[\rho u^{T}(D - \alpha I)^{-1}u]= &amp;lt;/math&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt; = u + \alpha(D - \alpha I)^{-1}u - u = \alpha [(D - \alpha I)^{-1}u]&amp;lt;/math&amp;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;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;
=== &#039;&#039;Дефляция&#039;&#039; ===&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;
=== &#039;&#039;Решение векового уравнения&#039;&#039; ===&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:Сергеев 2.jpg|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;
для &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;
&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;
&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; (*)&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;. Два условия в (*) - это обычные условия метода Ньютона, за исключением того, что вместо прямой в качестве приближения используется гипербола. Легко проверить, что &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;
&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;
&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;&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} \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;
Вычисление собственных значений и собственных векторов симметричной трехдиагональной матрицы посредством стратегии &amp;quot;разделяй и властвуй&amp;quot;:&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;
Если &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; :&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;
Иначе:&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;endif&#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 &lt;br /&gt;
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;
         &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;
         &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;
         &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;
На рисунке 2 изображена структура всего алгоритма, на рисунке 3 подробно описана одна из ячеек структуры.&lt;br /&gt;
[[File:Сергеев 3.jpg|thumb|center|left|800px|Рис. 3. Дерево алгоритма &amp;quot;Разделяй и властвуй&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
[[File:Сергеев 4.jpg|thumb|center|1200px|Рис. 4. Детальное описание одного блока алгоритма]]&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;
Последовательная сложность алгоритма: &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;
Единственный найденный пример реализации описан в [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot; ]   ([3] с. 7, 19-20).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Дж. Деммель, &amp;quot;Вычислительная линейная алгебра&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[2] [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
[3] [https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm Алгоритм &amp;quot;Разделяй и властвуй&amp;quot; - Wikipedia]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>NikoSergAlex</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=13146</id>
		<title>Участник:Vika3410/Метод Разделяй и властвуй</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:Vika3410/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9&amp;diff=13146"/>
		<updated>2016-10-18T20:41:57Z</updated>

		<summary type="html">&lt;p&gt;NikoSergAlex: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы статьи: [[Участник:NikoSergAlex|Сергеев Никита]] (группа 614), [[Участница:Vika3410|Стрельцова Виктория]] (группа 614)&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод разделяй и властвуй вычисления собственных значений и векторов трёхдиагональной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; c\frac{4}{3}n^{3} &amp;lt;/math&amp;gt;&lt;br /&gt;
| parallel_complexity = &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; &lt;br /&gt;
| pf_width          = &lt;br /&gt;
| input_data        = трёхдиагональная матрица&lt;br /&gt;
| output_data       = собственные значения и собственные вектора исходной матрицы&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; - это наиболее быстрый из существующих методов вычисления всех собственных значений и собственных векторов трехдиагональной матрицы, начиная с порядка 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;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;b_{m} &amp;amp; b_{m} \\&lt;br /&gt;
 &amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp; \\&lt;br /&gt;
 &amp;amp;&amp;amp;&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;
&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;
&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;
где &amp;lt;math&amp;gt; u = \begin{bmatrix} Q_{1}^{T} &amp;amp; 0 \\ 0 &amp;amp; Q_{2}^{T}\end{bmatrix}v &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;, так как &amp;lt;math&amp;gt;v = \begin{bmatrix} 0 , \ldots  ,  0 , 1 , 1 , 0 \ldots , 0 \end{bmatrix}^T&amp;lt;/math&amp;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;
Будем предполагать, не ограничивая общности, что диагональные элементы &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;
&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;Лемма 1.&#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;
&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:Сергеев 1.jpg|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;Лемма 2.&#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 = u + \alpha (D - \alpha I)^{-1}u + u[\rho u^{T}(D - \alpha I)^{-1}u]= &amp;lt;/math&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt; = u + \alpha(D - \alpha I)^{-1}u - u = \alpha [(D - \alpha I)^{-1}u]&amp;lt;/math&amp;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;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;
=== &#039;&#039;Дефляция&#039;&#039; ===&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;
=== &#039;&#039;Решение векового уравнения&#039;&#039; ===&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:Сергеев 2.jpg|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;
для &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;
&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;
&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; (*)&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;. Два условия в (*) - это обычные условия метода Ньютона, за исключением того, что вместо прямой в качестве приближения используется гипербола. Легко проверить, что &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;
&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;
&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;&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} \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;
Вычисление собственных значений и собственных векторов симметричной трехдиагональной матрицы посредством стратегии &amp;quot;разделяй и властвуй&amp;quot;:&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;
Если &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; :&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;
Иначе:&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;endif&#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 &lt;br /&gt;
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;
         &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;
         &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;
         &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;
На рисунке 2 изображена структура всего алгоритма, на рисунке 3 подробно описана одна из ячеек структуры.&lt;br /&gt;
[[File:Сергеев 3.jpg|thumb|center|left|800px|Рис. 3. Дерево алгоритма &amp;quot;Разделяй и властвуй&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
[[File:Сергеев 4.jpg|thumb|center|1200px|Рис. 4. Детальное описание одного блока алгоритма]]&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;
Последовательная сложность алгоритма: &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;
Единственный найденный пример реализации описан в [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot; ]   ([3] с. 7, 19-20).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Дж. Деммель, &amp;quot;Вычислительная линейная алгебра&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[2] [http://www.netlib.org/lapack/lawnspdf/lawn132.pdf Francoise Tisseury, Jack Dongarra, &amp;quot;Parallelizing the Divide and Conquer Algorithm for the Symmetric Tridiagonal Eigenvalue Problem on Distributed Memory Architectures&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
[3] [https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm Алгоритм &amp;quot;Разделяй и властвуй&amp;quot; - Wikipedia]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Description of algorithm properties and structure]]&lt;/div&gt;</summary>
		<author><name>NikoSergAlex</name></author>
	</entry>
</feed>