<?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=A.Freeman</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=A.Freeman"/>
	<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/A.Freeman"/>
	<updated>2026-10-22T18:03:01Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:KAKTUZ&amp;diff=20259</id>
		<title>Обсуждение участника:KAKTUZ</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:KAKTUZ&amp;diff=20259"/>
		<updated>2016-12-07T16:21:17Z</updated>

		<summary type="html">&lt;p&gt;A.Freeman: /* Замечания */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Участник:A.Freeman/Алгоритм Ланцоша для точной арифметики (без переортогонализации)]] ==&lt;br /&gt;
&lt;br /&gt;
=== Замечания по тексту ===&lt;br /&gt;
* В разделе 1.4 кроме выделения макроопераций требуется показать и их взаимосвязь. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:29, 25 октября 2016 (MSK)&lt;br /&gt;
** Нужно не перечислить макрооперации, а показать структуру алгоритма на макроуровне. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 10:17, 1 ноября 2016 (MSK)&lt;br /&gt;
* В разделе 1.7 нужно дать словесные пояснения о том, как соотносятся графы на рис.1-3. На рис.1-2 осталась не пояснена вершина, обозначенная жёлтым треугольником. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 16:39, 31 октября 2016 (MSK)&lt;br /&gt;
* В разделе 1.10 должна быть оценка вычислительной мощности алгоритма. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 16:39, 31 октября 2016 (MSK)&lt;br /&gt;
* Не заполнен раздел 2.4 описания. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:07, 16 ноября 2016 (MSK)&lt;br /&gt;
* В разделе 2.4 не приведены все параметры запуска теста - какой компилятор, с какими опциями использовался, какие версии библиотек, на каких узлах проводился запуск и т.д. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 14:00, 18 ноября 2016 (MSK) &lt;br /&gt;
* В разделе 2.4 не приведена использованная в экспериментах реализация алгоритма. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 14:00, 18 ноября 2016 (MSK) &lt;br /&gt;
* &amp;quot;Для всех последующих размеров минимальная производительность составила 8.39% с попаданием большинства значений в интервал 10.5%-11%&amp;quot; - имеется в виду, наверно, эффективность? [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 14:00, 18 ноября 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
=== Замечания ===&lt;br /&gt;
* странно упоминание Фролова А.А. в качестве одного из авторов&lt;br /&gt;
** я, Фролов А.А., являюсь одним из авторов описания.&lt;br /&gt;
** я, Заспа А.Ю., подтверждаю, что выполнял задание вместе с Фроловым А.А.&lt;br /&gt;
* 1.10 &amp;quot;первыми появляются с.з. с максимальной величиной по модулю. метод особенно хорошо подходит для вычисления с.з. находящихся на краях спектра.&amp;quot; Верно, но допишите как можно получить минимальные с.з.&lt;br /&gt;
** Если имеется ввиду обращение матрицы, то оно не имеет смысла в случае данного алгоритма, так как имеет большую сложность.&lt;br /&gt;
* 2.1-2.3,2.6 отсутствуют...&lt;br /&gt;
** в соответствии с заданием, требуется оформить пункты 1.1-10, 2.4, 2.7.&lt;br /&gt;
* 2.4.1 - зачем пункт без оптимизации ??? лучше *брать его чем жалеть полученные данные.&lt;br /&gt;
** исправлено&lt;br /&gt;
* 2.4.3 переместить перед 2.4.2&lt;br /&gt;
** исправлено&lt;br /&gt;
* Рис.6 - что отложено по оси Х? по крайней мере не то что написано&lt;br /&gt;
** исправлено ошибочное описание&lt;br /&gt;
* одно из наиболее качественных описаний, если бы не отсутствие некоторых пунктов&lt;/div&gt;</summary>
		<author><name>A.Freeman</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=20062</id>
		<title>Участник:A.Freeman/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=20062"/>
		<updated>2016-12-05T09:44:52Z</updated>

		<summary type="html">&lt;p&gt;A.Freeman: /* Масштабируемость реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|ASA}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша без переортогонализации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}+1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n+1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Основные авторы описания: [[Участник:KAKTUZ|Заспа А.Ю.]] ([[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]]),  [[Участник:A.Freeman|Фролов А.А.]] ([[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Входные и выходные данные алгоритма|1.9]], [[#Свойства алгоритма|1.10]], [[#Масштабируемость алгоритма и его реализации|2.4]], [[#Существующие реализации|2.7]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; был опубликовн физиком и математиком Корнелием Ланцощем в 1950 году&amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот метод является частным случаем алгоритма Арнольда в случае, если исходная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - симметрична, и был представлен как итерационный метод вычисления собственных значений симметричной матрицы. Этот метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов исходной матрицы. Хотя алгоритм и был эффективным в вычислительном смысле, но он на некоторое время был предан забвению из-за численной неустойчивости. Только в 1970 Ojalvo и Newman модифицировали алгоритм для использования в арифметике с плавающей точкой&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;. Новый метод получил название [[Алгоритм Ланцоша с полной переортогонализацией | алгоритма Ланцоша с полной переортогонализацией]]. Но эта статья про его исходную версию.&lt;br /&gt;
На вход алгоритма подается вещественная симметричная матрица  &amp;lt;math&amp;gt;A = A^{T}&amp;lt;/math&amp;gt;,&lt;br /&gt;
{{Шаблон:ASymmetric}}&lt;br /&gt;
Поэтому достаточно хранить только чуть больше половины элементов исходной матрицы.&lt;br /&gt;
&lt;br /&gt;
Сам алгоритм соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца. На каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, состоящая из ортонормированных векторов Ланцоша. А в качестве приближенных собственных значений берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k \times k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 \\&lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 \\&lt;br /&gt;
&amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных значений и собственных векторов такой матрицы значительно проще чем их вычисление для исходной матрицы. Например, они могут быть вычислены с помощью [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы| метода «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]]. В этом методе эта процедура занимает &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций, где константа оказывается на практике довольно мала.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, начальный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: собственные вектора матрицы  &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; являющиеся столбцами матрицы &amp;lt;math&amp;gt;Q_k V&amp;lt;/math&amp;gt;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
До начала первой итерации нормируется вектор начального приближения &amp;lt;math&amp;gt;q_1 = \frac{b}{\|b\|_2}&amp;lt;/math&amp;gt;. Затем задаются константы &amp;lt;math&amp;gt;\beta_0 = 0,\; q_0 = 0 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
После выполнения данных действий начинаются итерации алгоритма. Которых будет не больше чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. В ходе итераций постепенно формируется матрица &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;\alpha_i&amp;lt;/math&amp;gt;-x и &amp;lt;math&amp;gt;\beta_i&amp;lt;/math&amp;gt;-х.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации происходят следующие вычисления. Вначале вычисляется произведение матрицы на вектор &amp;lt;math&amp;gt;z = Aq_i&amp;lt;/math&amp;gt;. Затем считается скалярное произведение &amp;lt;math&amp;gt;\alpha_i = q^T_i z&amp;lt;/math&amp;gt; и значение сохраняется как элемент формируемой матрицы. После этого необходимо произвести вычисление линейной комбинации векторов &amp;lt;math&amp;gt;z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}&amp;lt;/math&amp;gt;. Норму полученного вектора запишем как элемент матрицы &amp;lt;math&amp;gt;\beta_i = \|z\|_2&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;\beta_i&amp;lt;/math&amp;gt; оказалась равной нулю, то больше никаких итераций в алгоритме не производят, сразу переходят к вычислению собственных значений и собственных векторов. Иначе, в конце итерации считают &amp;lt;math&amp;gt;q_{i+1} = \frac{z}{\beta_i}&amp;lt;/math&amp;gt; и переходят к следующей итерации.&lt;br /&gt;
&lt;br /&gt;
После всех итераций необходимо вычислить собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром на каждой итерации является вычисление произведения матрицы на вектор:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&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;
&lt;br /&gt;
На каждой итерации будет вычисляться умножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на  вектор &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt;. Эта операция и будет самой ресурсозатратной на каждой итерации. Результаты этой макрооперации будут использованы затем в скалярном произведении векторов и в линейной комбинации из 3 векторов. После этого результат линейной комбинации векторов необходимо нормировать. Для этого можно разбить эту процедуру на вычисление нормы вектора и деление вектора на получившееся число. Кроме того, после завершения итераций необходимо вычислить собственные вектора и собственные значения полученной матрицы. Данная операция не конкретизируется алгоритмом, и может быть выполнена любым способом. Поэтому удобнее её представить в виде макрооперации. В разделе [[#Информационный граф|1.7]] можно наглядно увидеть как передаются данные между этими макрооперациями.&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;lt;math&amp;gt;1.\, \beta_0 = 0,\; q_0 = 0&amp;lt;/math&amp;gt; #Инициализируются константы&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;2.\, \|b\|_2 = \sqrt{\sum\limits_{j=1}^{n} b_j^2}&amp;lt;/math&amp;gt; #Вычисляем норму вектора начального приближения.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;3.\, q_{1_{j}} = \frac{b_{j}}{\|b\|_2}, \; j = 1,\, \dots\,, n&amp;lt;/math&amp;gt; #Нормализуем вектор начального приближения.&lt;br /&gt;
&lt;br /&gt;
Начинаются итерации цикла, которых не больше чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. На &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации производятся следующие вычисления:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.1\, z_j = \sum\limits_{m=1}^{n} a_{jm} q_{i_m}, \; j = 1,\,\dots\,, n&amp;lt;/math&amp;gt; #Считаем результат применения линейного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.2\, \alpha_i = \sum\limits_{j=1}^{n}q_{i_j} z_j&amp;lt;/math&amp;gt; #Получаем результат скалярного произведения векторов &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.3\, z_j = z_j - \alpha_i q_{i_j} - \beta_{i-1}q_{i-1_j}, \, j = 1,\,\dots\,, n&amp;lt;/math&amp;gt; #Вычисляем линейную комбинацию векторов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.4\, \beta_i = \|z\|_2 = \sqrt{\sum\limits_{j=1}^{n} z_j^2}&amp;lt;/math&amp;gt; #Считаем норму вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.5&amp;lt;/math&amp;gt; Проверка равенства &amp;lt;math&amp;gt;\beta_i == 0&amp;lt;/math&amp;gt; # Если норма оказалась равной нулю, то завершаем итерации и переходим к вычислению собственных векторов и собственных значений полученной матрицы. В обратном случае, продолжаем выполнения итераций.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.6\, q_{i+1_j} = \frac{z_j}{\beta_i}, \; j = 1,\, \dots \,, n&amp;lt;/math&amp;gt; #Нормируем вектор &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.7\,&amp;lt;/math&amp;gt; Если выполнили &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций, то завершаем выполнение итераций, переходим к следующему шагу. Иначе начинаем последующую итерацию цикла.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;4.&amp;lt;/math&amp;gt; Вычисляем собственные значения и собственные вектора полученной матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычисления &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и соответствующих им собственных векторов алгоритмом Ланцоша без переортогонализации состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и нахождения собственных значений и векторов трехдиагональной симметричной матрицы порядка &amp;lt;math&amp;gt;k&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; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; операций сложений&lt;br /&gt;
** извлечение квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций делений (нормирование)&lt;br /&gt;
Каждая из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций состоит из:&lt;br /&gt;
* умножение матрицы на вектор:&lt;br /&gt;
** &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* скалярное произведение двух векторов&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сложение&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; вычитаний&lt;br /&gt;
* норма вектора:&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&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; операций деления&lt;br /&gt;
&lt;br /&gt;
Итого (без учета решения задачи собственных значений трехдиагональной матрицы):&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2 + 4n) + n &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2+3n-2) +  n-1&amp;lt;/math&amp;gt; сложений/вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt; kn + n &amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; вычислений квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Для нахождение собственных значений и векторов трехдиагональной симметричной матрицы эффективней всего использовать [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы | метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]], который требует &amp;lt;math&amp;gt; O(k^3) &amp;lt;/math&amp;gt; операций.&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метод Ланцоша без переортогонализации относится к алгоритмам &#039;&#039;с квадратичной сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[Файл:Ланцош без переортогонализации 1.png|600px|thumb|center|Рисунок 1. Граф алгоритма без отображения входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt;  — операция деления, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\cdot &amp;lt;/math&amp;gt;  — операция скалярного умножения векторов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов, &amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;  — линейный оператор, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\nabla&amp;lt;/math&amp;gt; — условие преждевременного выхода.]]&lt;br /&gt;
 |[[Файл:Ланцош без переортогонализации 2.png|600px|thumb|center|Рисунок 2. Граф алгоритма с отображением входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt;  — операция деления,  &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\cdot &amp;lt;/math&amp;gt;  — операция скалярного умножения векторов,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов,  &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;  — линейный оператор, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\nabla&amp;lt;/math&amp;gt; — условие преждевременного выхода,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{In}&amp;lt;/math&amp;gt; — входные данные, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Out}&amp;lt;/math&amp;gt; — выходные результат.]]&lt;br /&gt;
|}&lt;br /&gt;
[[Файл:Линейный_оператор.png|600px|thumb|center|Рисунок 3. Граф макрооперации &amp;quot;умножение матрицы на вектор&amp;quot; без отображения входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt;  — операция умножения двух коэффициентов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;  — операция сложения.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша в параллельной форме состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и вычисления собственных значений матрицы &amp;lt;math&amp;gt;T_k&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;\log n&amp;lt;/math&amp;gt; и линейную ширину ярусов &amp;lt;math&amp;gt;\frac{n}{2}, \frac{n}{4}, ... , 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Инициализации состоит из следующих операций:&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** вычисление скалярного произведения вектора самого на себя:&lt;br /&gt;
*** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итерационная часть алгоритма состоит из следующих операций:&lt;br /&gt;
* умножение матрицы на число:&lt;br /&gt;
** ярус умножений с шириной &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log n&amp;lt;/math&amp;gt; ярусов с наибольшей шириной &amp;lt;math&amp;gt;\frac{n^2}{2}&amp;lt;/math&amp;gt; (блок вычисления n сумм n элементов)&lt;br /&gt;
* вычисление скалярного произведения двух векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt;&lt;br /&gt;
** два яруса сложений шириной &amp;lt;math&amp;gt;n&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;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с максимальной шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, в параллельном варианте основную долю времени будут занимать операции сложения при умножении матрицы на вектор.&lt;br /&gt;
При классификации по высоте ЯПФ Алгоритм Ланцоша относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;. При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}, i \geq j&amp;lt;/math&amp;gt;), число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n + 1)}{2} + 1&amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/поддиагональные элементы, единица относится к параметру &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
по &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;k+kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является субквадратичным: &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма нахождения коэффициентов &amp;lt;math&amp;gt;\alpha_i,\beta_i&amp;lt;/math&amp;gt; без экономии памяти состовляет &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+2k}&amp;lt;/math&amp;gt;, при &amp;lt;math&amp;gt;k \ll n&amp;lt;/math&amp;gt;, вычислительная мощность приблизительно равна &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В случае хранения половины исходной матрицы получаем соотношношение &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n(n+1)/2+2k}&amp;lt;/math&amp;gt;, что приблизительно равно &amp;lt;math&amp;gt;4k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша без переортогонализации не является детерминированным (возможно выполнение меньшего числа итераций алгоритма), в случае если все собственные значения уже вычислены.&lt;br /&gt;
&lt;br /&gt;
Важное свойство метода Ланцоша состоит в том, что первыми в матрице &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; появляются собственные значения с максимальной величиной по модулю. Таким образом, метод особенно хорошо подходит для вычисления собственных значений матрицы &amp;lt;math&amp;gt;A&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;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
Проведём исследование масштабируемости параллельной реализации алгоритма Ланцоша без переортогонализации согласно [[Scalability methodology|методике]]. Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета].&lt;br /&gt;
&lt;br /&gt;
==== Реализация на языке C ====&lt;br /&gt;
[https://github.com/xrstalker/lanczos Исследованная параллельная реализация на языке C]&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Сборка осуществлялась со следующими параметрами:&lt;br /&gt;
&lt;br /&gt;
* gcc-5.2.0&lt;br /&gt;
* openmpi-1.8.4&lt;br /&gt;
* аргументы компилятора: -std=c11 -Ofast&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых параметров реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [32 : 256] с шагом 16;&lt;br /&gt;
*	размер матрицы [5000 : 200000] с шагом 5000.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон эффективности реализации алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 1.92%;&lt;br /&gt;
*	максимальная эффективность реализации 59.47%.&lt;br /&gt;
&lt;br /&gt;
График полученного распределения эффективности:&lt;br /&gt;
&lt;br /&gt;
[[file:Lanczos Without Orthogonalization Eff2Dist.png|thumb|center|600px|Рисунок 4. Параллельная реализация алгоритма Ланцоша. Распределение производительности.]]&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики производительности и эффективности данной реализации в зависимости от изменяемых параметров запуска.&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[file:Lanczos Without Orthogonalization Perf2.png|thumb|center|600px|Рисунок 5. Параллельная реализация алгоритма Ланцоша. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
 |[[file:Lanczos Without Orthogonalization Eff2.png|thumb|center|600px|Рисунок 6. Параллельная реализация алгоритма Ланцоша. Изменение эффективности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Средняя эффективность для матриц с размером больше 25000 составила 52.7%.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации ===&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте IETL&amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/lanczos.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;/div&gt;</summary>
		<author><name>A.Freeman</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=20060</id>
		<title>Участник:A.Freeman/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=20060"/>
		<updated>2016-12-05T09:44:23Z</updated>

		<summary type="html">&lt;p&gt;A.Freeman: /* Масштабируемость реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|ASA}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша без переортогонализации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}+1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n+1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Основные авторы описания: [[Участник:KAKTUZ|Заспа А.Ю.]] ([[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]]),  [[Участник:A.Freeman|Фролов А.А.]] ([[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Входные и выходные данные алгоритма|1.9]], [[#Свойства алгоритма|1.10]], [[#Масштабируемость алгоритма и его реализации|2.4]], [[#Существующие реализации|2.7]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; был опубликовн физиком и математиком Корнелием Ланцощем в 1950 году&amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот метод является частным случаем алгоритма Арнольда в случае, если исходная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - симметрична, и был представлен как итерационный метод вычисления собственных значений симметричной матрицы. Этот метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов исходной матрицы. Хотя алгоритм и был эффективным в вычислительном смысле, но он на некоторое время был предан забвению из-за численной неустойчивости. Только в 1970 Ojalvo и Newman модифицировали алгоритм для использования в арифметике с плавающей точкой&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;. Новый метод получил название [[Алгоритм Ланцоша с полной переортогонализацией | алгоритма Ланцоша с полной переортогонализацией]]. Но эта статья про его исходную версию.&lt;br /&gt;
На вход алгоритма подается вещественная симметричная матрица  &amp;lt;math&amp;gt;A = A^{T}&amp;lt;/math&amp;gt;,&lt;br /&gt;
{{Шаблон:ASymmetric}}&lt;br /&gt;
Поэтому достаточно хранить только чуть больше половины элементов исходной матрицы.&lt;br /&gt;
&lt;br /&gt;
Сам алгоритм соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца. На каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, состоящая из ортонормированных векторов Ланцоша. А в качестве приближенных собственных значений берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k \times k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 \\&lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 \\&lt;br /&gt;
&amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных значений и собственных векторов такой матрицы значительно проще чем их вычисление для исходной матрицы. Например, они могут быть вычислены с помощью [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы| метода «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]]. В этом методе эта процедура занимает &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций, где константа оказывается на практике довольно мала.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, начальный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: собственные вектора матрицы  &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; являющиеся столбцами матрицы &amp;lt;math&amp;gt;Q_k V&amp;lt;/math&amp;gt;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
До начала первой итерации нормируется вектор начального приближения &amp;lt;math&amp;gt;q_1 = \frac{b}{\|b\|_2}&amp;lt;/math&amp;gt;. Затем задаются константы &amp;lt;math&amp;gt;\beta_0 = 0,\; q_0 = 0 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
После выполнения данных действий начинаются итерации алгоритма. Которых будет не больше чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. В ходе итераций постепенно формируется матрица &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;\alpha_i&amp;lt;/math&amp;gt;-x и &amp;lt;math&amp;gt;\beta_i&amp;lt;/math&amp;gt;-х.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации происходят следующие вычисления. Вначале вычисляется произведение матрицы на вектор &amp;lt;math&amp;gt;z = Aq_i&amp;lt;/math&amp;gt;. Затем считается скалярное произведение &amp;lt;math&amp;gt;\alpha_i = q^T_i z&amp;lt;/math&amp;gt; и значение сохраняется как элемент формируемой матрицы. После этого необходимо произвести вычисление линейной комбинации векторов &amp;lt;math&amp;gt;z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}&amp;lt;/math&amp;gt;. Норму полученного вектора запишем как элемент матрицы &amp;lt;math&amp;gt;\beta_i = \|z\|_2&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;\beta_i&amp;lt;/math&amp;gt; оказалась равной нулю, то больше никаких итераций в алгоритме не производят, сразу переходят к вычислению собственных значений и собственных векторов. Иначе, в конце итерации считают &amp;lt;math&amp;gt;q_{i+1} = \frac{z}{\beta_i}&amp;lt;/math&amp;gt; и переходят к следующей итерации.&lt;br /&gt;
&lt;br /&gt;
После всех итераций необходимо вычислить собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром на каждой итерации является вычисление произведения матрицы на вектор:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&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;
&lt;br /&gt;
На каждой итерации будет вычисляться умножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на  вектор &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt;. Эта операция и будет самой ресурсозатратной на каждой итерации. Результаты этой макрооперации будут использованы затем в скалярном произведении векторов и в линейной комбинации из 3 векторов. После этого результат линейной комбинации векторов необходимо нормировать. Для этого можно разбить эту процедуру на вычисление нормы вектора и деление вектора на получившееся число. Кроме того, после завершения итераций необходимо вычислить собственные вектора и собственные значения полученной матрицы. Данная операция не конкретизируется алгоритмом, и может быть выполнена любым способом. Поэтому удобнее её представить в виде макрооперации. В разделе [[#Информационный граф|1.7]] можно наглядно увидеть как передаются данные между этими макрооперациями.&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;lt;math&amp;gt;1.\, \beta_0 = 0,\; q_0 = 0&amp;lt;/math&amp;gt; #Инициализируются константы&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;2.\, \|b\|_2 = \sqrt{\sum\limits_{j=1}^{n} b_j^2}&amp;lt;/math&amp;gt; #Вычисляем норму вектора начального приближения.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;3.\, q_{1_{j}} = \frac{b_{j}}{\|b\|_2}, \; j = 1,\, \dots\,, n&amp;lt;/math&amp;gt; #Нормализуем вектор начального приближения.&lt;br /&gt;
&lt;br /&gt;
Начинаются итерации цикла, которых не больше чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. На &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации производятся следующие вычисления:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.1\, z_j = \sum\limits_{m=1}^{n} a_{jm} q_{i_m}, \; j = 1,\,\dots\,, n&amp;lt;/math&amp;gt; #Считаем результат применения линейного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.2\, \alpha_i = \sum\limits_{j=1}^{n}q_{i_j} z_j&amp;lt;/math&amp;gt; #Получаем результат скалярного произведения векторов &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.3\, z_j = z_j - \alpha_i q_{i_j} - \beta_{i-1}q_{i-1_j}, \, j = 1,\,\dots\,, n&amp;lt;/math&amp;gt; #Вычисляем линейную комбинацию векторов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.4\, \beta_i = \|z\|_2 = \sqrt{\sum\limits_{j=1}^{n} z_j^2}&amp;lt;/math&amp;gt; #Считаем норму вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.5&amp;lt;/math&amp;gt; Проверка равенства &amp;lt;math&amp;gt;\beta_i == 0&amp;lt;/math&amp;gt; # Если норма оказалась равной нулю, то завершаем итерации и переходим к вычислению собственных векторов и собственных значений полученной матрицы. В обратном случае, продолжаем выполнения итераций.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.6\, q_{i+1_j} = \frac{z_j}{\beta_i}, \; j = 1,\, \dots \,, n&amp;lt;/math&amp;gt; #Нормируем вектор &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.7\,&amp;lt;/math&amp;gt; Если выполнили &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций, то завершаем выполнение итераций, переходим к следующему шагу. Иначе начинаем последующую итерацию цикла.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;4.&amp;lt;/math&amp;gt; Вычисляем собственные значения и собственные вектора полученной матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычисления &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и соответствующих им собственных векторов алгоритмом Ланцоша без переортогонализации состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и нахождения собственных значений и векторов трехдиагональной симметричной матрицы порядка &amp;lt;math&amp;gt;k&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; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; операций сложений&lt;br /&gt;
** извлечение квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций делений (нормирование)&lt;br /&gt;
Каждая из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций состоит из:&lt;br /&gt;
* умножение матрицы на вектор:&lt;br /&gt;
** &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* скалярное произведение двух векторов&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сложение&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; вычитаний&lt;br /&gt;
* норма вектора:&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&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; операций деления&lt;br /&gt;
&lt;br /&gt;
Итого (без учета решения задачи собственных значений трехдиагональной матрицы):&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2 + 4n) + n &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2+3n-2) +  n-1&amp;lt;/math&amp;gt; сложений/вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt; kn + n &amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; вычислений квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Для нахождение собственных значений и векторов трехдиагональной симметричной матрицы эффективней всего использовать [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы | метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]], который требует &amp;lt;math&amp;gt; O(k^3) &amp;lt;/math&amp;gt; операций.&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метод Ланцоша без переортогонализации относится к алгоритмам &#039;&#039;с квадратичной сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[Файл:Ланцош без переортогонализации 1.png|600px|thumb|center|Рисунок 1. Граф алгоритма без отображения входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt;  — операция деления, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\cdot &amp;lt;/math&amp;gt;  — операция скалярного умножения векторов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов, &amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;  — линейный оператор, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\nabla&amp;lt;/math&amp;gt; — условие преждевременного выхода.]]&lt;br /&gt;
 |[[Файл:Ланцош без переортогонализации 2.png|600px|thumb|center|Рисунок 2. Граф алгоритма с отображением входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt;  — операция деления,  &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\cdot &amp;lt;/math&amp;gt;  — операция скалярного умножения векторов,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов,  &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;  — линейный оператор, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\nabla&amp;lt;/math&amp;gt; — условие преждевременного выхода,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{In}&amp;lt;/math&amp;gt; — входные данные, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Out}&amp;lt;/math&amp;gt; — выходные результат.]]&lt;br /&gt;
|}&lt;br /&gt;
[[Файл:Линейный_оператор.png|600px|thumb|center|Рисунок 3. Граф макрооперации &amp;quot;умножение матрицы на вектор&amp;quot; без отображения входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt;  — операция умножения двух коэффициентов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;  — операция сложения.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша в параллельной форме состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и вычисления собственных значений матрицы &amp;lt;math&amp;gt;T_k&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;\log n&amp;lt;/math&amp;gt; и линейную ширину ярусов &amp;lt;math&amp;gt;\frac{n}{2}, \frac{n}{4}, ... , 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Инициализации состоит из следующих операций:&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** вычисление скалярного произведения вектора самого на себя:&lt;br /&gt;
*** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итерационная часть алгоритма состоит из следующих операций:&lt;br /&gt;
* умножение матрицы на число:&lt;br /&gt;
** ярус умножений с шириной &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log n&amp;lt;/math&amp;gt; ярусов с наибольшей шириной &amp;lt;math&amp;gt;\frac{n^2}{2}&amp;lt;/math&amp;gt; (блок вычисления n сумм n элементов)&lt;br /&gt;
* вычисление скалярного произведения двух векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt;&lt;br /&gt;
** два яруса сложений шириной &amp;lt;math&amp;gt;n&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;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с максимальной шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, в параллельном варианте основную долю времени будут занимать операции сложения при умножении матрицы на вектор.&lt;br /&gt;
При классификации по высоте ЯПФ Алгоритм Ланцоша относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;. При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}, i \geq j&amp;lt;/math&amp;gt;), число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n + 1)}{2} + 1&amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/поддиагональные элементы, единица относится к параметру &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
по &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;k+kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является субквадратичным: &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма нахождения коэффициентов &amp;lt;math&amp;gt;\alpha_i,\beta_i&amp;lt;/math&amp;gt; без экономии памяти состовляет &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+2k}&amp;lt;/math&amp;gt;, при &amp;lt;math&amp;gt;k \ll n&amp;lt;/math&amp;gt;, вычислительная мощность приблизительно равна &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В случае хранения половины исходной матрицы получаем соотношношение &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n(n+1)/2+2k}&amp;lt;/math&amp;gt;, что приблизительно равно &amp;lt;math&amp;gt;4k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша без переортогонализации не является детерминированным (возможно выполнение меньшего числа итераций алгоритма), в случае если все собственные значения уже вычислены.&lt;br /&gt;
&lt;br /&gt;
Важное свойство метода Ланцоша состоит в том, что первыми в матрице &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; появляются собственные значения с максимальной величиной по модулю. Таким образом, метод особенно хорошо подходит для вычисления собственных значений матрицы &amp;lt;math&amp;gt;A&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;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
Проведём исследование масштабируемости параллельной реализации алгоритма Ланцоша без переортогонализации согласно [[Scalability methodology|методике]]. Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета].&lt;br /&gt;
&lt;br /&gt;
==== Реализация на языке C ====&lt;br /&gt;
[https://github.com/xrstalker/lanczos Исследованная параллельная реализация на языке C]&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Сборка осуществлялась со следующими параметрами:&lt;br /&gt;
&lt;br /&gt;
* gcc-5.2.0&lt;br /&gt;
* openmpi-1.8.4&lt;br /&gt;
* аргументы компилятора: -std=c11 -Ofast&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых параметров реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [32 : 256] с шагом 16;&lt;br /&gt;
*	размер матрицы [5000 : 200000] с шагом 5000.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон эффективности реализации алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 1.92%;&lt;br /&gt;
*	максимальная эффективность реализации 59.47%.&lt;br /&gt;
&lt;br /&gt;
График полученного распределения эффективности:&lt;br /&gt;
&lt;br /&gt;
[[file:Lanczos Without Orthogonalization Eff2Dist.png|thumb|center|600px|Рисунок 4. Параллельная реализация алгоритма Ланцоша. Распределение производительности.]]&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики производительности и эффективности данной реализации в зависимости от изменяемых параметров запуска.&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[file:Lanczos Without Orthogonalization Perf2.png|thumb|center|600px|Рисунок 5. Параллельная реализация алгоритма Ланцоша. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
 |[[file:Lanczos Without Orthogonalization Eff2.png|thumb|center|600px|Рисунок 6. Параллельная реализация алгоритма Ланцоша. Изменение эффективности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Средняя эффективность для матриц, размером больше 25000, составила 52.7%.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации ===&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте IETL&amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/lanczos.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;/div&gt;</summary>
		<author><name>A.Freeman</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:KAKTUZ&amp;diff=19862</id>
		<title>Обсуждение участника:KAKTUZ</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:KAKTUZ&amp;diff=19862"/>
		<updated>2016-12-01T19:51:32Z</updated>

		<summary type="html">&lt;p&gt;A.Freeman: /* Статья Участник:A.Freeman/Алгоритм Ланцоша для точной арифметики (без переортогонализации) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Участник:A.Freeman/Алгоритм Ланцоша для точной арифметики (без переортогонализации)]] ==&lt;br /&gt;
&lt;br /&gt;
=== Замечания по тексту ===&lt;br /&gt;
* В разделе 1.4 кроме выделения макроопераций требуется показать и их взаимосвязь. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:29, 25 октября 2016 (MSK)&lt;br /&gt;
** Нужно не перечислить макрооперации, а показать структуру алгоритма на макроуровне. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 10:17, 1 ноября 2016 (MSK)&lt;br /&gt;
* В разделе 1.7 нужно дать словесные пояснения о том, как соотносятся графы на рис.1-3. На рис.1-2 осталась не пояснена вершина, обозначенная жёлтым треугольником. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 16:39, 31 октября 2016 (MSK)&lt;br /&gt;
* В разделе 1.10 должна быть оценка вычислительной мощности алгоритма. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 16:39, 31 октября 2016 (MSK)&lt;br /&gt;
* Не заполнен раздел 2.4 описания. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:07, 16 ноября 2016 (MSK)&lt;br /&gt;
* В разделе 2.4 не приведены все параметры запуска теста - какой компилятор, с какими опциями использовался, какие версии библиотек, на каких узлах проводился запуск и т.д. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 14:00, 18 ноября 2016 (MSK) &lt;br /&gt;
* В разделе 2.4 не приведена использованная в экспериментах реализация алгоритма. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 14:00, 18 ноября 2016 (MSK) &lt;br /&gt;
* &amp;quot;Для всех последующих размеров минимальная производительность составила 8.39% с попаданием большинства значений в интервал 10.5%-11%&amp;quot; - имеется в виду, наверно, эффективность? [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 14:00, 18 ноября 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
=== Замечания ===&lt;br /&gt;
* странно упоминание Фролова А.А. в качестве одного из авторов&lt;br /&gt;
** я, Фролов А.А., являюсь одним из авторов описания.&lt;br /&gt;
** я, Заспа А.Ю., подтверждаю, что выполнял задание вместе с Фроловым А.А.&lt;br /&gt;
* 1.10 &amp;quot;первыми появляются с.з. с максимальной величиной по модулю. метод особенно хорошо подходит для вычисления с.з. находящихся на краях спектра.&amp;quot; Верно, но допишите как можно получить минимальные с.з.&lt;br /&gt;
* 2.1-2.3,2.6 отсутствуют...&lt;br /&gt;
** в соответствии с заданием, требуется оформить пункты 1.1-10, 2.4, 2.7.&lt;br /&gt;
* 2.4.1 - зачем пункт без оптимизации ??? лучше *брать его чем жалеть полученные данные.&lt;br /&gt;
** исправлено&lt;br /&gt;
* 2.4.3 переместить перед 2.4.2&lt;br /&gt;
** исправлено&lt;br /&gt;
* Рис.6 - что отложено по оси Х? по крайней мере не то что написано&lt;br /&gt;
** исправлено ошибочное описание&lt;br /&gt;
* одно из наиболее качественных описаний, если бы не отсутствие некоторых пунктов&lt;/div&gt;</summary>
		<author><name>A.Freeman</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:A.Freeman&amp;diff=19465</id>
		<title>Участник:A.Freeman</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:A.Freeman&amp;diff=19465"/>
		<updated>2016-11-29T12:54:54Z</updated>

		<summary type="html">&lt;p&gt;A.Freeman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Фролов Александр Алексеевич, кафедра информационной безопасности, МГУ им. М.В. Ломоносова.&lt;/div&gt;</summary>
		<author><name>A.Freeman</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:KAKTUZ&amp;diff=19464</id>
		<title>Обсуждение участника:KAKTUZ</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:KAKTUZ&amp;diff=19464"/>
		<updated>2016-11-29T12:52:38Z</updated>

		<summary type="html">&lt;p&gt;A.Freeman: /* Замечания */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Участник:A.Freeman/Алгоритм Ланцоша для точной арифметики (без переортогонализации)]] ==&lt;br /&gt;
&lt;br /&gt;
=== Замечания по тексту ===&lt;br /&gt;
* В разделе 1.4 кроме выделения макроопераций требуется показать и их взаимосвязь. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:29, 25 октября 2016 (MSK)&lt;br /&gt;
** Нужно не перечислить макрооперации, а показать структуру алгоритма на макроуровне. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 10:17, 1 ноября 2016 (MSK)&lt;br /&gt;
* В разделе 1.7 нужно дать словесные пояснения о том, как соотносятся графы на рис.1-3. На рис.1-2 осталась не пояснена вершина, обозначенная жёлтым треугольником. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 16:39, 31 октября 2016 (MSK)&lt;br /&gt;
* В разделе 1.10 должна быть оценка вычислительной мощности алгоритма. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 16:39, 31 октября 2016 (MSK)&lt;br /&gt;
* Не заполнен раздел 2.4 описания. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:07, 16 ноября 2016 (MSK)&lt;br /&gt;
* В разделе 2.4 не приведены все параметры запуска теста - какой компилятор, с какими опциями использовался, какие версии библиотек, на каких узлах проводился запуск и т.д. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 14:00, 18 ноября 2016 (MSK) &lt;br /&gt;
* В разделе 2.4 не приведена использованная в экспериментах реализация алгоритма. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 14:00, 18 ноября 2016 (MSK) &lt;br /&gt;
* &amp;quot;Для всех последующих размеров минимальная производительность составила 8.39% с попаданием большинства значений в интервал 10.5%-11%&amp;quot; - имеется в виду, наверно, эффективность? [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 14:00, 18 ноября 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
=== Замечания ===&lt;br /&gt;
* странно упоминание Фролова А.А. в качестве одного из авторов&lt;br /&gt;
** я, Фролов А.А., являюсь одним из авторов описания. Ваш К.О.&lt;br /&gt;
* 1.10 &amp;quot;первыми появляются с.з. с максимальной величиной по модулю. метод особенно хорошо подходит для вычисления с.з. находящихся на краях спектра.&amp;quot; Верно, но допишите как можно получить минимальные с.з.&lt;br /&gt;
* 2.1-2.3,2.6 отсутствуют...&lt;br /&gt;
** в соответствии с заданием, требуется оформить пункты 1.1-10, 2.4, 2.7.&lt;br /&gt;
* 2.4.1 - зачем пункт без оптимизации ??? лучше *брать его чем жалеть полученные данные.&lt;br /&gt;
** исправлено&lt;br /&gt;
* 2.4.3 переместить перед 2.4.2&lt;br /&gt;
** исправлено&lt;br /&gt;
* Рис.6 - что отложено по оси Х? по крайней мере не то что написано&lt;br /&gt;
** исправлено ошибочное описание&lt;br /&gt;
* одно из наиболее качественных описаний, если бы не отсутствие некоторых пунктов&lt;/div&gt;</summary>
		<author><name>A.Freeman</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:KAKTUZ&amp;diff=19463</id>
		<title>Обсуждение участника:KAKTUZ</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:KAKTUZ&amp;diff=19463"/>
		<updated>2016-11-29T12:48:44Z</updated>

		<summary type="html">&lt;p&gt;A.Freeman: /* Замечания */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Участник:A.Freeman/Алгоритм Ланцоша для точной арифметики (без переортогонализации)]] ==&lt;br /&gt;
&lt;br /&gt;
=== Замечания по тексту ===&lt;br /&gt;
* В разделе 1.4 кроме выделения макроопераций требуется показать и их взаимосвязь. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:29, 25 октября 2016 (MSK)&lt;br /&gt;
** Нужно не перечислить макрооперации, а показать структуру алгоритма на макроуровне. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 10:17, 1 ноября 2016 (MSK)&lt;br /&gt;
* В разделе 1.7 нужно дать словесные пояснения о том, как соотносятся графы на рис.1-3. На рис.1-2 осталась не пояснена вершина, обозначенная жёлтым треугольником. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 16:39, 31 октября 2016 (MSK)&lt;br /&gt;
* В разделе 1.10 должна быть оценка вычислительной мощности алгоритма. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 16:39, 31 октября 2016 (MSK)&lt;br /&gt;
* Не заполнен раздел 2.4 описания. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:07, 16 ноября 2016 (MSK)&lt;br /&gt;
* В разделе 2.4 не приведены все параметры запуска теста - какой компилятор, с какими опциями использовался, какие версии библиотек, на каких узлах проводился запуск и т.д. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 14:00, 18 ноября 2016 (MSK) &lt;br /&gt;
* В разделе 2.4 не приведена использованная в экспериментах реализация алгоритма. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 14:00, 18 ноября 2016 (MSK) &lt;br /&gt;
* &amp;quot;Для всех последующих размеров минимальная производительность составила 8.39% с попаданием большинства значений в интервал 10.5%-11%&amp;quot; - имеется в виду, наверно, эффективность? [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 14:00, 18 ноября 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
=== Замечания ===&lt;br /&gt;
* странно упоминание Фролова А.А. в качестве одного из авторов&lt;br /&gt;
** я, Фролов А.А., являюсь одним из авторов описания. Ваш К.О.&lt;br /&gt;
* 1.10 &amp;quot;первыми появляются с.з. с максимальной величиной по модулю. метод особенно хорошо подходит для вычисления с.з. находящихся на краях спектра.&amp;quot; Верно, но допишите как можно получить минимальные с.з.&lt;br /&gt;
* 2.1-2.3,2.6 отсутствуют...&lt;br /&gt;
* 2.4.1 - зачем пункт без оптимизации ??? лучше *брать его чем жалеть полученные данные.&lt;br /&gt;
* 2.4.3 переместить перед 2.4.2&lt;br /&gt;
* Рис.6 - что отложено по оси Х? по крайней мере не то что написано&lt;br /&gt;
* одно из наиболее качественных описаний, если бы не отсутствие некоторых пунктов&lt;/div&gt;</summary>
		<author><name>A.Freeman</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=19452</id>
		<title>Участник:A.Freeman/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=19452"/>
		<updated>2016-11-29T09:55:22Z</updated>

		<summary type="html">&lt;p&gt;A.Freeman: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|ASA}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша без переортогонализации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}+1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n+1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Основные авторы описания: [[Участник:KAKTUZ|Заспа А.Ю.]] ([[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]]),  [[Участник:A.Freeman|Фролов А.А.]] ([[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Входные и выходные данные алгоритма|1.9]], [[#Свойства алгоритма|1.10]], [[#Масштабируемость алгоритма и его реализации|2.4]], [[#Существующие реализации|2.7]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; был опубликовн физиком и математиком Корнелием Ланцощем в 1950 году&amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот метод является частным случаем алгоритма Арнольда в случае, если исходная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - симметрична, и был представлен как итерационный метод вычисления собственных значений симметричной матрицы. Этот метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов исходной матрицы. Хотя алгоритм и был эффективным в вычислительном смысле, но он на некоторое время был предан забвению из-за численной неустойчивости. Только в 1970 Ojalvo и Newman модифицировали алгоритм для использования в арифметике с плавающей точкой&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;. Новый метод получил название [[Алгоритм Ланцоша с полной переортогонализацией | алгоритма Ланцоша с полной переортогонализацией]]. Но эта статья про его исходную версию.&lt;br /&gt;
На вход алгоритма подается вещественная симметричная матрица  &amp;lt;math&amp;gt;A = A^{T}&amp;lt;/math&amp;gt;,&lt;br /&gt;
{{Шаблон:ASymmetric}}&lt;br /&gt;
Поэтому достаточно хранить только чуть больше половины элементов исходной матрицы.&lt;br /&gt;
&lt;br /&gt;
Сам алгоритм соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца. На каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, состоящая из ортонормированных векторов Ланцоша. А в качестве приближенных собственных значений берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k \times k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 \\&lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 \\&lt;br /&gt;
&amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных значений и собственных векторов такой матрицы значительно проще чем их вычисление для исходной матрицы. Например, они могут быть вычислены с помощью [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы| метода «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]]. В этом методе эта процедура занимает &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций, где константа оказывается на практике довольно мала.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, начальный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: собственные вектора матрицы  &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; являющиеся столбцами матрицы &amp;lt;math&amp;gt;Q_k V&amp;lt;/math&amp;gt;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
До начала первой итерации нормируется вектор начального приближения &amp;lt;math&amp;gt;q_1 = \frac{b}{\|b\|_2}&amp;lt;/math&amp;gt;. Затем задаются константы &amp;lt;math&amp;gt;\beta_0 = 0,\; q_0 = 0 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
После выполнения данных действий начинаются итерации алгоритма. Которых будет не больше чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. В ходе итераций постепенно формируется матрица &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;\alpha_i&amp;lt;/math&amp;gt;-x и &amp;lt;math&amp;gt;\beta_i&amp;lt;/math&amp;gt;-х.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации происходят следующие вычисления. Вначале вычисляется произведение матрицы на вектор &amp;lt;math&amp;gt;z = Aq_i&amp;lt;/math&amp;gt;. Затем считается скалярное произведение &amp;lt;math&amp;gt;\alpha_i = q^T_i z&amp;lt;/math&amp;gt; и значение сохраняется как элемент формируемой матрицы. После этого необходимо произвести вычисление линейной комбинации векторов &amp;lt;math&amp;gt;z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}&amp;lt;/math&amp;gt;. Норму полученного вектора запишем как элемент матрицы &amp;lt;math&amp;gt;\beta_i = \|z\|_2&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;\beta_i&amp;lt;/math&amp;gt; оказалась равной нулю, то больше никаких итераций в алгоритме не производят, сразу переходят к вычислению собственных значений и собственных векторов. Иначе, в конце итерации считают &amp;lt;math&amp;gt;q_{i+1} = \frac{z}{\beta_i}&amp;lt;/math&amp;gt; и переходят к следующей итерации.&lt;br /&gt;
&lt;br /&gt;
После всех итераций необходимо вычислить собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром на каждой итерации является вычисление произведения матрицы на вектор:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&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;
&lt;br /&gt;
На каждой итерации будет вычисляться умножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на  вектор &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt;. Эта операция и будет самой ресурсозатратной на каждой итерации. Результаты этой макрооперации будут использованы затем в скалярном произведении векторов и в линейной комбинации из 3 векторов. После этого результат линейной комбинации векторов необходимо нормировать. Для этого можно разбить эту процедуру на вычисление нормы вектора и деление вектора на получившееся число. Кроме того, после завершения итераций необходимо вычислить собственные вектора и собственные значения полученной матрицы. Данная операция не конкретизируется алгоритмом, и может быть выполнена любым способом. Поэтому удобнее её представить в виде макрооперации. В разделе [[#Информационный граф|1.7]] можно наглядно увидеть как передаются данные между этими макрооперациями.&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;lt;math&amp;gt;1.\, \beta_0 = 0,\; q_0 = 0&amp;lt;/math&amp;gt; #Инициализируются константы&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;2.\, \|b\|_2 = \sqrt{\sum\limits_{j=1}^{n} b_j^2}&amp;lt;/math&amp;gt; #Вычисляем норму вектора начального приближения.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;3.\, q_{1_{j}} = \frac{b_{j}}{\|b\|_2}, \; j = 1,\, \dots\,, n&amp;lt;/math&amp;gt; #Нормализуем вектор начального приближения.&lt;br /&gt;
&lt;br /&gt;
Начинаются итерации цикла, которых не больше чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. На &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации производятся следующие вычисления:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.1\, z_j = \sum\limits_{m=1}^{n} a_{jm} q_{i_m}, \; j = 1,\,\dots\,, n&amp;lt;/math&amp;gt; #Считаем результат применения линейного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.2\, \alpha_i = \sum\limits_{j=1}^{n}q_{i_j} z_j&amp;lt;/math&amp;gt; #Получаем результат скалярного произведения векторов &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.3\, z_j = z_j - \alpha_i q_{i_j} - \beta_{i-1}q_{i-1_j}, \, j = 1,\,\dots\,, n&amp;lt;/math&amp;gt; #Вычисляем линейную комбинацию векторов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.4\, \beta_i = \|z\|_2 = \sqrt{\sum\limits_{j=1}^{n} z_j^2}&amp;lt;/math&amp;gt; #Считаем норму вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.5&amp;lt;/math&amp;gt; Проверка равенства &amp;lt;math&amp;gt;\beta_i == 0&amp;lt;/math&amp;gt; # Если норма оказалась равной нулю, то завершаем итерации и переходим к вычислению собственных векторов и собственных значений полученной матрицы. В обратном случае, продолжаем выполнения итераций.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.6\, q_{i+1_j} = \frac{z_j}{\beta_i}, \; j = 1,\, \dots \,, n&amp;lt;/math&amp;gt; #Нормируем вектор &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.7\,&amp;lt;/math&amp;gt; Если выполнили &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций, то завершаем выполнение итераций, переходим к следующему шагу. Иначе начинаем последующую итерацию цикла.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;4.&amp;lt;/math&amp;gt; Вычисляем собственные значения и собственные вектора полученной матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычисления &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и соответствующих им собственных векторов алгоритмом Ланцоша без переортогонализации состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и нахождения собственных значений и векторов трехдиагональной симметричной матрицы порядка &amp;lt;math&amp;gt;k&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; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; операций сложений&lt;br /&gt;
** извлечение квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций делений (нормирование)&lt;br /&gt;
Каждая из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций состоит из:&lt;br /&gt;
* умножение матрицы на вектор:&lt;br /&gt;
** &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* скалярное произведение двух векторов&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сложение&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; вычитаний&lt;br /&gt;
* норма вектора:&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&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; операций деления&lt;br /&gt;
&lt;br /&gt;
Итого (без учета решения задачи собственных значений трехдиагональной матрицы):&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2 + 4n) + n &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2+3n-2) +  n-1&amp;lt;/math&amp;gt; сложений/вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt; kn + n &amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; вычислений квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Для нахождение собственных значений и векторов трехдиагональной симметричной матрицы эффективней всего использовать [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы | метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]], который требует &amp;lt;math&amp;gt; O(k^3) &amp;lt;/math&amp;gt; операций.&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метод Ланцоша без переортогонализации относится к алгоритмам &#039;&#039;с квадратичной сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[Файл:Ланцош без переортогонализации 1.png|600px|thumb|center|Рисунок 1. Граф алгоритма без отображения входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt;  — операция деления, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\cdot &amp;lt;/math&amp;gt;  — операция скалярного умножения векторов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов, &amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;  — линейный оператор, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\nabla&amp;lt;/math&amp;gt; — условие преждевременного выхода.]]&lt;br /&gt;
 |[[Файл:Ланцош без переортогонализации 2.png|600px|thumb|center|Рисунок 2. Граф алгоритма с отображением входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt;  — операция деления,  &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\cdot &amp;lt;/math&amp;gt;  — операция скалярного умножения векторов,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов,  &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;  — линейный оператор, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\nabla&amp;lt;/math&amp;gt; — условие преждевременного выхода,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{In}&amp;lt;/math&amp;gt; — входные данные, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Out}&amp;lt;/math&amp;gt; — выходные результат.]]&lt;br /&gt;
|}&lt;br /&gt;
[[Файл:Линейный_оператор.png|600px|thumb|center|Рисунок 3. Граф макрооперации &amp;quot;умножение матрицы на вектор&amp;quot; без отображения входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt;  — операция умножения двух коэффициентов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;  — операция сложения.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша в параллельной форме состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и вычисления собственных значений матрицы &amp;lt;math&amp;gt;T_k&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;\log n&amp;lt;/math&amp;gt; и линейную ширину ярусов &amp;lt;math&amp;gt;\frac{n}{2}, \frac{n}{4}, ... , 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Инициализации состоит из следующих операций:&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** вычисление скалярного произведения вектора самого на себя:&lt;br /&gt;
*** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итерационная часть алгоритма состоит из следующих операций:&lt;br /&gt;
* умножение матрицы на число:&lt;br /&gt;
** ярус умножений с шириной &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log n&amp;lt;/math&amp;gt; ярусов с наибольшей шириной &amp;lt;math&amp;gt;\frac{n^2}{2}&amp;lt;/math&amp;gt; (блок вычисления n сумм n элементов)&lt;br /&gt;
* вычисление скалярного произведения двух векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt;&lt;br /&gt;
** два яруса сложений шириной &amp;lt;math&amp;gt;n&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;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с максимальной шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, в параллельном варианте основную долю времени будут занимать операции сложения при умножении матрицы на вектор.&lt;br /&gt;
При классификации по высоте ЯПФ Алгоритм Ланцоша относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;. При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}, i \geq j&amp;lt;/math&amp;gt;), число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n + 1)}{2} + 1&amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/поддиагональные элементы, единица относится к параметру &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
по &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;k+kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является субквадратичным: &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма нахождения коэффициентов &amp;lt;math&amp;gt;\alpha_i,\beta_i&amp;lt;/math&amp;gt; без экономии памяти состовляет &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+2k}&amp;lt;/math&amp;gt;, при &amp;lt;math&amp;gt;k \ll n&amp;lt;/math&amp;gt;, вычислительная мощность приблизительно равна &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В случае хранения половины исходной матрицы получаем соотношношение &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n(n+1)/2+2k}&amp;lt;/math&amp;gt;, что приблизительно равно &amp;lt;math&amp;gt;4k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша без переортогонализации не является детерминированным (возможно выполнение меньшего числа итераций алгоритма), в случае если все собственные значения уже вычислены.&lt;br /&gt;
&lt;br /&gt;
Важное свойство метода Ланцоша состоит в том, что первыми в матрице &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; появляются собственные значения с максимальной величиной по модулю. Таким образом, метод особенно хорошо подходит для вычисления собственных значений матрицы &amp;lt;math&amp;gt;A&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;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
Проведём исследование масштабируемости параллельной реализации алгоритма Ланцоша без переортогонализации согласно [[Scalability methodology|методике]]. Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета].&lt;br /&gt;
&lt;br /&gt;
==== Реализация на языке C ====&lt;br /&gt;
[https://github.com/xrstalker/lanczos Исследованная параллельная реализация на языке C]&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Сборка осуществлялась со следующими параметрами:&lt;br /&gt;
&lt;br /&gt;
* gcc-5.2.0&lt;br /&gt;
* openmpi-1.8.4&lt;br /&gt;
* аргументы компилятора: -std=c11 -Ofast&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых параметров реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [32 : 256] с шагом 16;&lt;br /&gt;
*	размер матрицы [5000 : 200000] с шагом 5000.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон эффективности реализации алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 1.92%;&lt;br /&gt;
*	максимальная эффективность реализации 59.47%.&lt;br /&gt;
&lt;br /&gt;
График полученного распределения эффективности:&lt;br /&gt;
&lt;br /&gt;
[[file:Lanczos Without Orthogonalization Eff2Dist.png|thumb|center|600px|Рисунок 4. Параллельная реализация алгоритма Ланцоша. Распределение производительности.]]&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики производительности и эффективности данной реализации в зависимости от изменяемых параметров запуска.&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[file:Lanczos Without Orthogonalization Perf2.png|thumb|center|600px|Рисунок 5. Параллельная реализация алгоритма Ланцоша. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
 |[[file:Lanczos Without Orthogonalization Eff2.png|thumb|center|600px|Рисунок 6. Параллельная реализация алгоритма Ланцоша. Изменение эффективности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Средняя эффективность для значений размеров матриц больше 25000 составила 52.7%.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации ===&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте IETL&amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/lanczos.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;/div&gt;</summary>
		<author><name>A.Freeman</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=18455</id>
		<title>Участник:A.Freeman/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=18455"/>
		<updated>2016-11-19T10:57:13Z</updated>

		<summary type="html">&lt;p&gt;A.Freeman: /* Масштабируемость реализации алгоритма с включенной оптимизацией */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша без переортогонализации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}+1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n+1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Основные авторы описания: [[Участник:KAKTUZ|Заспа А.Ю.]] ([[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]]),  [[Участник:A.Freeman|Фролов А.А.]] ([[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Входные и выходные данные алгоритма|1.9]], [[#Свойства алгоритма|1.10]], [[#Масштабируемость алгоритма и его реализации|2.4]], [[#Существующие реализации|2.7]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; был опубликовн физиком и математиком Корнелием Ланцощем в 1950 году&amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот метод является частным случаем алгоритма Арнольда в случае, если исходная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - симметрична, и был представлен как итерационный метод вычисления собственных значений симметричной матрицы. Этот метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов исходной матрицы. Хотя алгоритм и был эффективным в вычислительном смысле, но он на некоторое время был предан забвению из-за численной неустойчивости. Только в 1970 Ojalvo и Newman модифицировали алгоритм для использования в арифметике с плавающей точкой&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;. Новый метод получил название [[Алгоритм Ланцоша с полной переортогонализацией | алгоритма Ланцоша с полной переортогонализацией]]. Но эта статья про его исходную версию.&lt;br /&gt;
На вход алгоритма подается вещественная симметричная матрица  &amp;lt;math&amp;gt;A = A^{T}&amp;lt;/math&amp;gt;,&lt;br /&gt;
{{Шаблон:ASymmetric}}&lt;br /&gt;
Поэтому достаточно хранить только чуть больше половины элементов исходной матрицы.&lt;br /&gt;
&lt;br /&gt;
Сам алгоритм соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца. На каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, состоящая из ортонормированных векторов Ланцоша. А в качестве приближенных собственных значений берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k \times k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 \\&lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 \\&lt;br /&gt;
&amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных значений и собственных векторов такой матрицы значительно проще чем их вычисление для исходной матрицы. Например, они могут быть вычислены с помощью [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы| метода «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]]. В этом методе эта процедура занимает &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций, где константа оказывается на практике довольно мала.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, начальный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: собственные вектора матрицы  &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; являющиеся столбцами матрицы &amp;lt;math&amp;gt;Q_k V&amp;lt;/math&amp;gt;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
До начала первой итерации нормируется вектор начального приближения &amp;lt;math&amp;gt;q_1 = \frac{b}{\|b\|_2}&amp;lt;/math&amp;gt;. Затем задаются константы &amp;lt;math&amp;gt;\beta_0 = 0,\; q_0 = 0 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
После выполнения данных действий начинаются итерации алгоритма. Которых будет не больше чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. В ходе итераций постепенно формируется матрица &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;\alpha_i&amp;lt;/math&amp;gt;-x и &amp;lt;math&amp;gt;\beta_i&amp;lt;/math&amp;gt;-х.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации происходят следующие вычисления. Вначале вычисляется произведение матрицы на вектор &amp;lt;math&amp;gt;z = Aq_i&amp;lt;/math&amp;gt;. Затем считается скалярное произведение &amp;lt;math&amp;gt;\alpha_i = q^T_i z&amp;lt;/math&amp;gt; и значение сохраняется как элемент формируемой матрицы. После этого необходимо произвести вычисление линейной комбинации векторов &amp;lt;math&amp;gt;z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}&amp;lt;/math&amp;gt;. Норму полученного вектора запишем как элемент матрицы &amp;lt;math&amp;gt;\beta_i = \|z\|_2&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;\beta_i&amp;lt;/math&amp;gt; оказалась равной нулю, то больше никаких итераций в алгоритме не производят, сразу переходят к вычислению собственных значений и собственных векторов. Иначе, в конце итерации считают &amp;lt;math&amp;gt;q_{i+1} = \frac{z}{\beta_i}&amp;lt;/math&amp;gt; и переходят к следующей итерации.&lt;br /&gt;
&lt;br /&gt;
После всех итераций необходимо вычислить собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром на каждой итерации является вычисление произведения матрицы на вектор:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&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;
&lt;br /&gt;
На каждой итерации будет вычисляться умножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на  вектор &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt;. Эта операция и будет самой ресурсозатратной на каждой итерации. Результаты этой макрооперации будут использованы затем в скалярном произведении векторов и в линейной комбинации из 3 векторов. После этого результат линейной комбинации векторов необходимо нормировать. Для этого можно разбить эту процедуру на вычисление нормы вектора и деление вектора на получившееся число. Кроме того, после завершения итераций необходимо вычислить собственные вектора и собственные значения полученной матрицы. Данная операция не конкретизируется алгоритмом, и может быть выполнена любым способом. Поэтому удобнее её представить в виде макрооперации. В разделе [[#Информационный граф|1.7]] можно наглядно увидеть как передаются данные между этими макрооперациями.&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;lt;math&amp;gt;1.\, \beta_0 = 0,\; q_0 = 0&amp;lt;/math&amp;gt; #Инициализируются константы&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;2.\, \|b\|_2 = \sqrt{\sum\limits_{j=1}^{n} b_j^2}&amp;lt;/math&amp;gt; #Вычисляем норму вектора начального приближения.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;3.\, q_{1_{j}} = \frac{b_{j}}{\|b\|_2}, \; j = 1,\, \dots\,, n&amp;lt;/math&amp;gt; #Нормализуем вектор начального приближения.&lt;br /&gt;
&lt;br /&gt;
Начинаются итерации цикла, которых не больше чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. На &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации производятся следующие вычисления:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.1\, z_j = \sum\limits_{m=1}^{n} a_{jm} q_{i_m}, \; j = 1,\,\dots\,, n&amp;lt;/math&amp;gt; #Считаем результат применения линейного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.2\, \alpha_i = \sum\limits_{j=1}^{n}q_{i_j} z_j&amp;lt;/math&amp;gt; #Получаем результат скалярного произведения векторов &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.3\, z_j = z_j - \alpha_i q_{i_j} - \beta_{i-1}q_{i-1_j}, \, j = 1,\,\dots\,, n&amp;lt;/math&amp;gt; #Вычисляем линейную комбинацию векторов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.4\, \beta_i = \|z\|_2 = \sqrt{\sum\limits_{j=1}^{n} z_j^2}&amp;lt;/math&amp;gt; #Считаем норму вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.5&amp;lt;/math&amp;gt; Проверка равенства &amp;lt;math&amp;gt;\beta_i == 0&amp;lt;/math&amp;gt; # Если норма оказалась равной нулю, то завершаем итерации и переходим к вычислению собственных векторов и собственных значений полученной матрицы. В обратном случае, продолжаем выполнения итераций.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.6\, q_{i+1_j} = \frac{z_j}{\beta_i}, \; j = 1,\, \dots \,, n&amp;lt;/math&amp;gt; #Нормируем вектор &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.7\,&amp;lt;/math&amp;gt; Если выполнили &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций, то завершаем выполнение итераций, переходим к следующему шагу. Иначе начинаем последующую итерацию цикла.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;4.&amp;lt;/math&amp;gt; Вычисляем собственные значения и собственные вектора полученной матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычисления &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и соответствующих им собственных векторов алгоритмом Ланцоша без переортогонализации состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и нахождения собственных значений и векторов трехдиагональной симметричной матрицы порядка &amp;lt;math&amp;gt;k&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; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; операций сложений&lt;br /&gt;
** извлечение квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций делений (нормирование)&lt;br /&gt;
Каждая из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций состоит из:&lt;br /&gt;
* умножение матрицы на вектор:&lt;br /&gt;
** &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* скалярное произведение двух векторов&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сложение&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; вычитаний&lt;br /&gt;
* норма вектора:&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&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; операций деления&lt;br /&gt;
&lt;br /&gt;
Итого (без учета решения задачи собственных значений трехдиагональной матрицы):&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2 + 4n) + n &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2+3n-2) +  n-1&amp;lt;/math&amp;gt; сложений/вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt; kn + n &amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; вычислений квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Для нахождение собственных значений и векторов трехдиагональной симметричной матрицы эффективней всего использовать [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы | метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]], который требует &amp;lt;math&amp;gt; O(k^3) &amp;lt;/math&amp;gt; операций.&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метод Ланцоша без переортогонализации относится к алгоритмам &#039;&#039;с квадратичной сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[Файл:Ланцош без переортогонализации 1.png|600px|thumb|center|Рисунок 1. Граф алгоритма без отображения входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt;  — операция деления, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\cdot &amp;lt;/math&amp;gt;  — операция скалярного умножения векторов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов, &amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;  — линейный оператор, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\nabla&amp;lt;/math&amp;gt; — условие преждевременного выхода.]]&lt;br /&gt;
 |[[Файл:Ланцош без переортогонализации 2.png|600px|thumb|center|Рисунок 2. Граф алгоритма с отображением входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt;  — операция деления,  &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\cdot &amp;lt;/math&amp;gt;  — операция скалярного умножения векторов,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов,  &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;  — линейный оператор, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\nabla&amp;lt;/math&amp;gt; — условие преждевременного выхода,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{In}&amp;lt;/math&amp;gt; — входные данные, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Out}&amp;lt;/math&amp;gt; — выходные результат.]]&lt;br /&gt;
|}&lt;br /&gt;
[[Файл:Линейный_оператор.png|600px|thumb|center|Рисунок 3. Граф макрооперации &amp;quot;умножение матрицы на вектор&amp;quot; без отображения входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt;  — операция умножения двух коэффициентов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;  — операция сложения.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша в параллельной форме состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и вычисления собственных значений матрицы &amp;lt;math&amp;gt;T_k&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;\log n&amp;lt;/math&amp;gt; и линейную ширину ярусов &amp;lt;math&amp;gt;\frac{n}{2}, \frac{n}{4}, ... , 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Инициализации состоит из следующих операций:&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** вычисление скалярного произведения вектора самого на себя:&lt;br /&gt;
*** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итерационная часть алгоритма состоит из следующих операций:&lt;br /&gt;
* умножение матрицы на число:&lt;br /&gt;
** ярус умножений с шириной &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log n&amp;lt;/math&amp;gt; ярусов с наибольшей шириной &amp;lt;math&amp;gt;\frac{n^2}{2}&amp;lt;/math&amp;gt; (блок вычисления n сумм n элементов)&lt;br /&gt;
* вычисление скалярного произведения двух векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt;&lt;br /&gt;
** два яруса сложений шириной &amp;lt;math&amp;gt;n&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;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с максимальной шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, в параллельном варианте основную долю времени будут занимать операции сложения при умножении матрицы на вектор.&lt;br /&gt;
При классификации по высоте ЯПФ Алгоритм Ланцоша относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;. При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}, i \geq j&amp;lt;/math&amp;gt;), число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n + 1)}{2} + 1&amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/поддиагональные элементы, единица относится к параметру &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
по &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;k+kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является субквадратичным: &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма нахождения коэффициентов &amp;lt;math&amp;gt;\alpha_i,\beta_i&amp;lt;/math&amp;gt; без экономии памяти состовляет &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+2k}&amp;lt;/math&amp;gt;, при &amp;lt;math&amp;gt;k \ll n&amp;lt;/math&amp;gt;, вычислительная мощность приблизительно равна &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В случае хранения половины исходной матрицы получаем соотношношение &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n(n+1)/2+2k}&amp;lt;/math&amp;gt;, что приблизительно равно &amp;lt;math&amp;gt;4k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша без переортогонализации не является детерминированным (возможно выполнение меньшего числа итераций алгоритма), в случае если все собственные значения уже вычислены.&lt;br /&gt;
&lt;br /&gt;
Важное свойство метода Ланцоша состоит в том, что первыми в матрице &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; появляются собственные значения с максимальной величиной по модулю. Таким образом, метод особенно хорошо подходит для вычисления собственных значений матрицы &amp;lt;math&amp;gt;A&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;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
Проведём исследование масштабируемости параллельной реализации алгоритма Ланцоша без переортогонализации согласно [[Scalability methodology|методике]]. Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета] с оптимизацией компилятора и без.&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма без оптимизаций ====&lt;br /&gt;
&lt;br /&gt;
Сборка осуществлялась со следующими параметрами:&lt;br /&gt;
&lt;br /&gt;
* gcc-5.2.0&lt;br /&gt;
* openmpi-1.8.4&lt;br /&gt;
* аргументы компилятора: -std=c11&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [64 : 224] с шагом 16 / 32;&lt;br /&gt;
*	размер матрицы [25000 : 150000] с шагом 5000.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон [[Глоссарий#Эффективность реализации|эффективности реализации]] алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 4,55%;&lt;br /&gt;
*	максимальная эффективность реализации 11,17%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики [[Глоссарий#Производительность|производительности]] и эффективности данной реализации в зависимости от изменяемых параметров запуска.&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[file:Lanczos Without Orthogonalization Perf.png|thumb|center|700px|Рисунок 4. Параллельная реализация алгоритма Ланцоша. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
 |[[file:Lanczos Without Orthogonalization Eff.png|thumb|center|700px|Рисунок 5. Параллельная реализация алгоритма Ланцоша. Изменение эффективности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Как видно из графиков, производительность линейно зависит от количества процессоров, при этом минимальная эффективность наблюдается на матрицах размером 25000. Для всех последующих размеров минимальная эффективность составила 8.39% с попаданием большинства значений в интервал 10.5%-11%.&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма с включенной оптимизацией ====&lt;br /&gt;
&lt;br /&gt;
Сборка осуществлялась со следующими параметрами:&lt;br /&gt;
&lt;br /&gt;
* gcc-5.2.0&lt;br /&gt;
* openmpi-1.8.4&lt;br /&gt;
* аргументы компилятора: -std=c11 -Ofast&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых параметров реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [32 : 256] с шагом 16;&lt;br /&gt;
*	размер матрицы [5000 : 200000] с шагом 5000.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон эффективности реализации алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 1.92%;&lt;br /&gt;
*	максимальная эффективность реализации 59.47%.&lt;br /&gt;
&lt;br /&gt;
График полученного распределения эффективности:&lt;br /&gt;
&lt;br /&gt;
[[file:Lanczos Without Orthogonalization Eff2Dist.png|thumb|center|600px|Рисунок 6. Параллельная реализация алгоритма Ланцоша. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики производительности и эффективности данной реализации в зависимости от изменяемых параметров запуска.&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[file:Lanczos Without Orthogonalization Perf2.png|thumb|center|600px|Рисунок 7. Параллельная реализация алгоритма Ланцоша. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
 |[[file:Lanczos Without Orthogonalization Eff2.png|thumb|center|600px|Рисунок 8. Параллельная реализация алгоритма Ланцоша. Изменение эффективности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
При включении оптимизации эффективность и производительность значительно возросли, при этом средняя эффективность для значений размеров матриц больше 25000 составила 52.7%.&lt;br /&gt;
&lt;br /&gt;
==== Реализация на языке C ====&lt;br /&gt;
[https://github.com/xrstalker/lanczos Исследованная параллельная реализация на языке C]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации ===&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте IETL&amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/lanczos.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;/div&gt;</summary>
		<author><name>A.Freeman</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=18454</id>
		<title>Участник:A.Freeman/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=18454"/>
		<updated>2016-11-19T10:52:10Z</updated>

		<summary type="html">&lt;p&gt;A.Freeman: /* Масштабируемость реализации алгоритма с оптимизацией */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша без переортогонализации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}+1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n+1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Основные авторы описания: [[Участник:KAKTUZ|Заспа А.Ю.]] ([[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]]),  [[Участник:A.Freeman|Фролов А.А.]] ([[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Входные и выходные данные алгоритма|1.9]], [[#Свойства алгоритма|1.10]], [[#Масштабируемость алгоритма и его реализации|2.4]], [[#Существующие реализации|2.7]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; был опубликовн физиком и математиком Корнелием Ланцощем в 1950 году&amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот метод является частным случаем алгоритма Арнольда в случае, если исходная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - симметрична, и был представлен как итерационный метод вычисления собственных значений симметричной матрицы. Этот метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов исходной матрицы. Хотя алгоритм и был эффективным в вычислительном смысле, но он на некоторое время был предан забвению из-за численной неустойчивости. Только в 1970 Ojalvo и Newman модифицировали алгоритм для использования в арифметике с плавающей точкой&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;. Новый метод получил название [[Алгоритм Ланцоша с полной переортогонализацией | алгоритма Ланцоша с полной переортогонализацией]]. Но эта статья про его исходную версию.&lt;br /&gt;
На вход алгоритма подается вещественная симметричная матрица  &amp;lt;math&amp;gt;A = A^{T}&amp;lt;/math&amp;gt;,&lt;br /&gt;
{{Шаблон:ASymmetric}}&lt;br /&gt;
Поэтому достаточно хранить только чуть больше половины элементов исходной матрицы.&lt;br /&gt;
&lt;br /&gt;
Сам алгоритм соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца. На каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, состоящая из ортонормированных векторов Ланцоша. А в качестве приближенных собственных значений берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k \times k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 \\&lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 \\&lt;br /&gt;
&amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных значений и собственных векторов такой матрицы значительно проще чем их вычисление для исходной матрицы. Например, они могут быть вычислены с помощью [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы| метода «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]]. В этом методе эта процедура занимает &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций, где константа оказывается на практике довольно мала.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, начальный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: собственные вектора матрицы  &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; являющиеся столбцами матрицы &amp;lt;math&amp;gt;Q_k V&amp;lt;/math&amp;gt;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
До начала первой итерации нормируется вектор начального приближения &amp;lt;math&amp;gt;q_1 = \frac{b}{\|b\|_2}&amp;lt;/math&amp;gt;. Затем задаются константы &amp;lt;math&amp;gt;\beta_0 = 0,\; q_0 = 0 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
После выполнения данных действий начинаются итерации алгоритма. Которых будет не больше чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. В ходе итераций постепенно формируется матрица &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;\alpha_i&amp;lt;/math&amp;gt;-x и &amp;lt;math&amp;gt;\beta_i&amp;lt;/math&amp;gt;-х.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации происходят следующие вычисления. Вначале вычисляется произведение матрицы на вектор &amp;lt;math&amp;gt;z = Aq_i&amp;lt;/math&amp;gt;. Затем считается скалярное произведение &amp;lt;math&amp;gt;\alpha_i = q^T_i z&amp;lt;/math&amp;gt; и значение сохраняется как элемент формируемой матрицы. После этого необходимо произвести вычисление линейной комбинации векторов &amp;lt;math&amp;gt;z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}&amp;lt;/math&amp;gt;. Норму полученного вектора запишем как элемент матрицы &amp;lt;math&amp;gt;\beta_i = \|z\|_2&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;\beta_i&amp;lt;/math&amp;gt; оказалась равной нулю, то больше никаких итераций в алгоритме не производят, сразу переходят к вычислению собственных значений и собственных векторов. Иначе, в конце итерации считают &amp;lt;math&amp;gt;q_{i+1} = \frac{z}{\beta_i}&amp;lt;/math&amp;gt; и переходят к следующей итерации.&lt;br /&gt;
&lt;br /&gt;
После всех итераций необходимо вычислить собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром на каждой итерации является вычисление произведения матрицы на вектор:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&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;
&lt;br /&gt;
На каждой итерации будет вычисляться умножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на  вектор &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt;. Эта операция и будет самой ресурсозатратной на каждой итерации. Результаты этой макрооперации будут использованы затем в скалярном произведении векторов и в линейной комбинации из 3 векторов. После этого результат линейной комбинации векторов необходимо нормировать. Для этого можно разбить эту процедуру на вычисление нормы вектора и деление вектора на получившееся число. Кроме того, после завершения итераций необходимо вычислить собственные вектора и собственные значения полученной матрицы. Данная операция не конкретизируется алгоритмом, и может быть выполнена любым способом. Поэтому удобнее её представить в виде макрооперации. В разделе [[#Информационный граф|1.7]] можно наглядно увидеть как передаются данные между этими макрооперациями.&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;lt;math&amp;gt;1.\, \beta_0 = 0,\; q_0 = 0&amp;lt;/math&amp;gt; #Инициализируются константы&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;2.\, \|b\|_2 = \sqrt{\sum\limits_{j=1}^{n} b_j^2}&amp;lt;/math&amp;gt; #Вычисляем норму вектора начального приближения.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;3.\, q_{1_{j}} = \frac{b_{j}}{\|b\|_2}, \; j = 1,\, \dots\,, n&amp;lt;/math&amp;gt; #Нормализуем вектор начального приближения.&lt;br /&gt;
&lt;br /&gt;
Начинаются итерации цикла, которых не больше чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. На &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации производятся следующие вычисления:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.1\, z_j = \sum\limits_{m=1}^{n} a_{jm} q_{i_m}, \; j = 1,\,\dots\,, n&amp;lt;/math&amp;gt; #Считаем результат применения линейного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.2\, \alpha_i = \sum\limits_{j=1}^{n}q_{i_j} z_j&amp;lt;/math&amp;gt; #Получаем результат скалярного произведения векторов &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.3\, z_j = z_j - \alpha_i q_{i_j} - \beta_{i-1}q_{i-1_j}, \, j = 1,\,\dots\,, n&amp;lt;/math&amp;gt; #Вычисляем линейную комбинацию векторов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.4\, \beta_i = \|z\|_2 = \sqrt{\sum\limits_{j=1}^{n} z_j^2}&amp;lt;/math&amp;gt; #Считаем норму вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.5&amp;lt;/math&amp;gt; Проверка равенства &amp;lt;math&amp;gt;\beta_i == 0&amp;lt;/math&amp;gt; # Если норма оказалась равной нулю, то завершаем итерации и переходим к вычислению собственных векторов и собственных значений полученной матрицы. В обратном случае, продолжаем выполнения итераций.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.6\, q_{i+1_j} = \frac{z_j}{\beta_i}, \; j = 1,\, \dots \,, n&amp;lt;/math&amp;gt; #Нормируем вектор &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.7\,&amp;lt;/math&amp;gt; Если выполнили &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций, то завершаем выполнение итераций, переходим к следующему шагу. Иначе начинаем последующую итерацию цикла.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;4.&amp;lt;/math&amp;gt; Вычисляем собственные значения и собственные вектора полученной матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычисления &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и соответствующих им собственных векторов алгоритмом Ланцоша без переортогонализации состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и нахождения собственных значений и векторов трехдиагональной симметричной матрицы порядка &amp;lt;math&amp;gt;k&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; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; операций сложений&lt;br /&gt;
** извлечение квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций делений (нормирование)&lt;br /&gt;
Каждая из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций состоит из:&lt;br /&gt;
* умножение матрицы на вектор:&lt;br /&gt;
** &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* скалярное произведение двух векторов&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сложение&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; вычитаний&lt;br /&gt;
* норма вектора:&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&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; операций деления&lt;br /&gt;
&lt;br /&gt;
Итого (без учета решения задачи собственных значений трехдиагональной матрицы):&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2 + 4n) + n &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2+3n-2) +  n-1&amp;lt;/math&amp;gt; сложений/вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt; kn + n &amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; вычислений квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Для нахождение собственных значений и векторов трехдиагональной симметричной матрицы эффективней всего использовать [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы | метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]], который требует &amp;lt;math&amp;gt; O(k^3) &amp;lt;/math&amp;gt; операций.&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метод Ланцоша без переортогонализации относится к алгоритмам &#039;&#039;с квадратичной сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[Файл:Ланцош без переортогонализации 1.png|600px|thumb|center|Рисунок 1. Граф алгоритма без отображения входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt;  — операция деления, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\cdot &amp;lt;/math&amp;gt;  — операция скалярного умножения векторов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов, &amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;  — линейный оператор, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\nabla&amp;lt;/math&amp;gt; — условие преждевременного выхода.]]&lt;br /&gt;
 |[[Файл:Ланцош без переортогонализации 2.png|600px|thumb|center|Рисунок 2. Граф алгоритма с отображением входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt;  — операция деления,  &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\cdot &amp;lt;/math&amp;gt;  — операция скалярного умножения векторов,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов,  &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;  — линейный оператор, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\nabla&amp;lt;/math&amp;gt; — условие преждевременного выхода,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{In}&amp;lt;/math&amp;gt; — входные данные, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Out}&amp;lt;/math&amp;gt; — выходные результат.]]&lt;br /&gt;
|}&lt;br /&gt;
[[Файл:Линейный_оператор.png|600px|thumb|center|Рисунок 3. Граф макрооперации &amp;quot;умножение матрицы на вектор&amp;quot; без отображения входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt;  — операция умножения двух коэффициентов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;  — операция сложения.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша в параллельной форме состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и вычисления собственных значений матрицы &amp;lt;math&amp;gt;T_k&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;\log n&amp;lt;/math&amp;gt; и линейную ширину ярусов &amp;lt;math&amp;gt;\frac{n}{2}, \frac{n}{4}, ... , 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Инициализации состоит из следующих операций:&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** вычисление скалярного произведения вектора самого на себя:&lt;br /&gt;
*** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итерационная часть алгоритма состоит из следующих операций:&lt;br /&gt;
* умножение матрицы на число:&lt;br /&gt;
** ярус умножений с шириной &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log n&amp;lt;/math&amp;gt; ярусов с наибольшей шириной &amp;lt;math&amp;gt;\frac{n^2}{2}&amp;lt;/math&amp;gt; (блок вычисления n сумм n элементов)&lt;br /&gt;
* вычисление скалярного произведения двух векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt;&lt;br /&gt;
** два яруса сложений шириной &amp;lt;math&amp;gt;n&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;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с максимальной шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, в параллельном варианте основную долю времени будут занимать операции сложения при умножении матрицы на вектор.&lt;br /&gt;
При классификации по высоте ЯПФ Алгоритм Ланцоша относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;. При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}, i \geq j&amp;lt;/math&amp;gt;), число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n + 1)}{2} + 1&amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/поддиагональные элементы, единица относится к параметру &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
по &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;k+kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является субквадратичным: &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма нахождения коэффициентов &amp;lt;math&amp;gt;\alpha_i,\beta_i&amp;lt;/math&amp;gt; без экономии памяти состовляет &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+2k}&amp;lt;/math&amp;gt;, при &amp;lt;math&amp;gt;k \ll n&amp;lt;/math&amp;gt;, вычислительная мощность приблизительно равна &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В случае хранения половины исходной матрицы получаем соотношношение &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n(n+1)/2+2k}&amp;lt;/math&amp;gt;, что приблизительно равно &amp;lt;math&amp;gt;4k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша без переортогонализации не является детерминированным (возможно выполнение меньшего числа итераций алгоритма), в случае если все собственные значения уже вычислены.&lt;br /&gt;
&lt;br /&gt;
Важное свойство метода Ланцоша состоит в том, что первыми в матрице &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; появляются собственные значения с максимальной величиной по модулю. Таким образом, метод особенно хорошо подходит для вычисления собственных значений матрицы &amp;lt;math&amp;gt;A&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;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
Проведём исследование масштабируемости параллельной реализации алгоритма Ланцоша без переортогонализации согласно [[Scalability methodology|методике]]. Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета] с оптимизацией компилятора и без.&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма без оптимизаций ====&lt;br /&gt;
&lt;br /&gt;
Сборка осуществлялась со следующими параметрами:&lt;br /&gt;
&lt;br /&gt;
* gcc-5.2.0&lt;br /&gt;
* openmpi-1.8.4&lt;br /&gt;
* аргументы компилятора: -std=c11&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [64 : 224] с шагом 16 / 32;&lt;br /&gt;
*	размер матрицы [25000 : 150000] с шагом 5000.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон [[Глоссарий#Эффективность реализации|эффективности реализации]] алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 4,55%;&lt;br /&gt;
*	максимальная эффективность реализации 11,17%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики [[Глоссарий#Производительность|производительности]] и эффективности данной реализации в зависимости от изменяемых параметров запуска.&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[file:Lanczos Without Orthogonalization Perf.png|thumb|center|700px|Рисунок 4. Параллельная реализация алгоритма Ланцоша. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
 |[[file:Lanczos Without Orthogonalization Eff.png|thumb|center|700px|Рисунок 5. Параллельная реализация алгоритма Ланцоша. Изменение эффективности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Как видно из графиков, производительность линейно зависит от количества процессоров, при этом минимальная эффективность наблюдается на матрицах размером 25000. Для всех последующих размеров минимальная эффективность составила 8.39% с попаданием большинства значений в интервал 10.5%-11%.&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма с включенной оптимизацией ====&lt;br /&gt;
&lt;br /&gt;
Сборка осуществлялась со следующими параметрами:&lt;br /&gt;
&lt;br /&gt;
* gcc-5.2.0&lt;br /&gt;
* openmpi-1.8.4&lt;br /&gt;
* аргументы компилятора: -std=c11 -Ofast&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых параметров реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [32 : 256] с шагом 16;&lt;br /&gt;
*	размер матрицы [5000 : 200000] с шагом 5000.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон эффективности реализации алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 1.92%;&lt;br /&gt;
*	максимальная эффективность реализации 59.47%.&lt;br /&gt;
&lt;br /&gt;
График полученного распределения эффективности:&lt;br /&gt;
&lt;br /&gt;
[[file:Lanczos Without Orthogonalization Eff2Dist.png|thumb|center|700px|Рисунок 6. Параллельная реализация алгоритма Ланцоша. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики производительности и эффективности данной реализации в зависимости от изменяемых параметров запуска.&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[file:Lanczos Without Orthogonalization Perf2.png|thumb|center|700px|Рисунок 7. Параллельная реализация алгоритма Ланцоша. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
 |[[file:Lanczos Without Orthogonalization Eff2.png|thumb|center|700px|Рисунок 8. Параллельная реализация алгоритма Ланцоша. Изменение эффективности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
При включении оптимизации эффективность и производительность значительно возросли, при этом средняя эффективность для значений размеров матриц больше 25000 составила 52.7%.&lt;br /&gt;
&lt;br /&gt;
==== Реализация на языке C ====&lt;br /&gt;
[https://github.com/xrstalker/lanczos Исследованная параллельная реализация на языке C]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации ===&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте IETL&amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/lanczos.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;/div&gt;</summary>
		<author><name>A.Freeman</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=18453</id>
		<title>Участник:A.Freeman/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=18453"/>
		<updated>2016-11-19T10:51:40Z</updated>

		<summary type="html">&lt;p&gt;A.Freeman: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша без переортогонализации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}+1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n+1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Основные авторы описания: [[Участник:KAKTUZ|Заспа А.Ю.]] ([[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]]),  [[Участник:A.Freeman|Фролов А.А.]] ([[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Входные и выходные данные алгоритма|1.9]], [[#Свойства алгоритма|1.10]], [[#Масштабируемость алгоритма и его реализации|2.4]], [[#Существующие реализации|2.7]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; был опубликовн физиком и математиком Корнелием Ланцощем в 1950 году&amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот метод является частным случаем алгоритма Арнольда в случае, если исходная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - симметрична, и был представлен как итерационный метод вычисления собственных значений симметричной матрицы. Этот метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов исходной матрицы. Хотя алгоритм и был эффективным в вычислительном смысле, но он на некоторое время был предан забвению из-за численной неустойчивости. Только в 1970 Ojalvo и Newman модифицировали алгоритм для использования в арифметике с плавающей точкой&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;. Новый метод получил название [[Алгоритм Ланцоша с полной переортогонализацией | алгоритма Ланцоша с полной переортогонализацией]]. Но эта статья про его исходную версию.&lt;br /&gt;
На вход алгоритма подается вещественная симметричная матрица  &amp;lt;math&amp;gt;A = A^{T}&amp;lt;/math&amp;gt;,&lt;br /&gt;
{{Шаблон:ASymmetric}}&lt;br /&gt;
Поэтому достаточно хранить только чуть больше половины элементов исходной матрицы.&lt;br /&gt;
&lt;br /&gt;
Сам алгоритм соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца. На каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, состоящая из ортонормированных векторов Ланцоша. А в качестве приближенных собственных значений берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k \times k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 \\&lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 \\&lt;br /&gt;
&amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных значений и собственных векторов такой матрицы значительно проще чем их вычисление для исходной матрицы. Например, они могут быть вычислены с помощью [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы| метода «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]]. В этом методе эта процедура занимает &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций, где константа оказывается на практике довольно мала.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, начальный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: собственные вектора матрицы  &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; являющиеся столбцами матрицы &amp;lt;math&amp;gt;Q_k V&amp;lt;/math&amp;gt;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
До начала первой итерации нормируется вектор начального приближения &amp;lt;math&amp;gt;q_1 = \frac{b}{\|b\|_2}&amp;lt;/math&amp;gt;. Затем задаются константы &amp;lt;math&amp;gt;\beta_0 = 0,\; q_0 = 0 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
После выполнения данных действий начинаются итерации алгоритма. Которых будет не больше чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. В ходе итераций постепенно формируется матрица &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;\alpha_i&amp;lt;/math&amp;gt;-x и &amp;lt;math&amp;gt;\beta_i&amp;lt;/math&amp;gt;-х.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации происходят следующие вычисления. Вначале вычисляется произведение матрицы на вектор &amp;lt;math&amp;gt;z = Aq_i&amp;lt;/math&amp;gt;. Затем считается скалярное произведение &amp;lt;math&amp;gt;\alpha_i = q^T_i z&amp;lt;/math&amp;gt; и значение сохраняется как элемент формируемой матрицы. После этого необходимо произвести вычисление линейной комбинации векторов &amp;lt;math&amp;gt;z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}&amp;lt;/math&amp;gt;. Норму полученного вектора запишем как элемент матрицы &amp;lt;math&amp;gt;\beta_i = \|z\|_2&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;\beta_i&amp;lt;/math&amp;gt; оказалась равной нулю, то больше никаких итераций в алгоритме не производят, сразу переходят к вычислению собственных значений и собственных векторов. Иначе, в конце итерации считают &amp;lt;math&amp;gt;q_{i+1} = \frac{z}{\beta_i}&amp;lt;/math&amp;gt; и переходят к следующей итерации.&lt;br /&gt;
&lt;br /&gt;
После всех итераций необходимо вычислить собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром на каждой итерации является вычисление произведения матрицы на вектор:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&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;
&lt;br /&gt;
На каждой итерации будет вычисляться умножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на  вектор &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt;. Эта операция и будет самой ресурсозатратной на каждой итерации. Результаты этой макрооперации будут использованы затем в скалярном произведении векторов и в линейной комбинации из 3 векторов. После этого результат линейной комбинации векторов необходимо нормировать. Для этого можно разбить эту процедуру на вычисление нормы вектора и деление вектора на получившееся число. Кроме того, после завершения итераций необходимо вычислить собственные вектора и собственные значения полученной матрицы. Данная операция не конкретизируется алгоритмом, и может быть выполнена любым способом. Поэтому удобнее её представить в виде макрооперации. В разделе [[#Информационный граф|1.7]] можно наглядно увидеть как передаются данные между этими макрооперациями.&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;lt;math&amp;gt;1.\, \beta_0 = 0,\; q_0 = 0&amp;lt;/math&amp;gt; #Инициализируются константы&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;2.\, \|b\|_2 = \sqrt{\sum\limits_{j=1}^{n} b_j^2}&amp;lt;/math&amp;gt; #Вычисляем норму вектора начального приближения.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;3.\, q_{1_{j}} = \frac{b_{j}}{\|b\|_2}, \; j = 1,\, \dots\,, n&amp;lt;/math&amp;gt; #Нормализуем вектор начального приближения.&lt;br /&gt;
&lt;br /&gt;
Начинаются итерации цикла, которых не больше чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. На &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации производятся следующие вычисления:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.1\, z_j = \sum\limits_{m=1}^{n} a_{jm} q_{i_m}, \; j = 1,\,\dots\,, n&amp;lt;/math&amp;gt; #Считаем результат применения линейного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.2\, \alpha_i = \sum\limits_{j=1}^{n}q_{i_j} z_j&amp;lt;/math&amp;gt; #Получаем результат скалярного произведения векторов &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.3\, z_j = z_j - \alpha_i q_{i_j} - \beta_{i-1}q_{i-1_j}, \, j = 1,\,\dots\,, n&amp;lt;/math&amp;gt; #Вычисляем линейную комбинацию векторов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.4\, \beta_i = \|z\|_2 = \sqrt{\sum\limits_{j=1}^{n} z_j^2}&amp;lt;/math&amp;gt; #Считаем норму вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.5&amp;lt;/math&amp;gt; Проверка равенства &amp;lt;math&amp;gt;\beta_i == 0&amp;lt;/math&amp;gt; # Если норма оказалась равной нулю, то завершаем итерации и переходим к вычислению собственных векторов и собственных значений полученной матрицы. В обратном случае, продолжаем выполнения итераций.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.6\, q_{i+1_j} = \frac{z_j}{\beta_i}, \; j = 1,\, \dots \,, n&amp;lt;/math&amp;gt; #Нормируем вектор &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.7\,&amp;lt;/math&amp;gt; Если выполнили &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций, то завершаем выполнение итераций, переходим к следующему шагу. Иначе начинаем последующую итерацию цикла.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;4.&amp;lt;/math&amp;gt; Вычисляем собственные значения и собственные вектора полученной матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычисления &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и соответствующих им собственных векторов алгоритмом Ланцоша без переортогонализации состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и нахождения собственных значений и векторов трехдиагональной симметричной матрицы порядка &amp;lt;math&amp;gt;k&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; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; операций сложений&lt;br /&gt;
** извлечение квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций делений (нормирование)&lt;br /&gt;
Каждая из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций состоит из:&lt;br /&gt;
* умножение матрицы на вектор:&lt;br /&gt;
** &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* скалярное произведение двух векторов&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сложение&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; вычитаний&lt;br /&gt;
* норма вектора:&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&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; операций деления&lt;br /&gt;
&lt;br /&gt;
Итого (без учета решения задачи собственных значений трехдиагональной матрицы):&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2 + 4n) + n &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2+3n-2) +  n-1&amp;lt;/math&amp;gt; сложений/вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt; kn + n &amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; вычислений квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Для нахождение собственных значений и векторов трехдиагональной симметричной матрицы эффективней всего использовать [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы | метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]], который требует &amp;lt;math&amp;gt; O(k^3) &amp;lt;/math&amp;gt; операций.&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метод Ланцоша без переортогонализации относится к алгоритмам &#039;&#039;с квадратичной сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[Файл:Ланцош без переортогонализации 1.png|600px|thumb|center|Рисунок 1. Граф алгоритма без отображения входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt;  — операция деления, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\cdot &amp;lt;/math&amp;gt;  — операция скалярного умножения векторов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов, &amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;  — линейный оператор, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\nabla&amp;lt;/math&amp;gt; — условие преждевременного выхода.]]&lt;br /&gt;
 |[[Файл:Ланцош без переортогонализации 2.png|600px|thumb|center|Рисунок 2. Граф алгоритма с отображением входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt;  — операция деления,  &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\cdot &amp;lt;/math&amp;gt;  — операция скалярного умножения векторов,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов,  &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;  — линейный оператор, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\nabla&amp;lt;/math&amp;gt; — условие преждевременного выхода,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{In}&amp;lt;/math&amp;gt; — входные данные, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Out}&amp;lt;/math&amp;gt; — выходные результат.]]&lt;br /&gt;
|}&lt;br /&gt;
[[Файл:Линейный_оператор.png|600px|thumb|center|Рисунок 3. Граф макрооперации &amp;quot;умножение матрицы на вектор&amp;quot; без отображения входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt;  — операция умножения двух коэффициентов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;  — операция сложения.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша в параллельной форме состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и вычисления собственных значений матрицы &amp;lt;math&amp;gt;T_k&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;\log n&amp;lt;/math&amp;gt; и линейную ширину ярусов &amp;lt;math&amp;gt;\frac{n}{2}, \frac{n}{4}, ... , 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Инициализации состоит из следующих операций:&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** вычисление скалярного произведения вектора самого на себя:&lt;br /&gt;
*** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итерационная часть алгоритма состоит из следующих операций:&lt;br /&gt;
* умножение матрицы на число:&lt;br /&gt;
** ярус умножений с шириной &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log n&amp;lt;/math&amp;gt; ярусов с наибольшей шириной &amp;lt;math&amp;gt;\frac{n^2}{2}&amp;lt;/math&amp;gt; (блок вычисления n сумм n элементов)&lt;br /&gt;
* вычисление скалярного произведения двух векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt;&lt;br /&gt;
** два яруса сложений шириной &amp;lt;math&amp;gt;n&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;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с максимальной шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, в параллельном варианте основную долю времени будут занимать операции сложения при умножении матрицы на вектор.&lt;br /&gt;
При классификации по высоте ЯПФ Алгоритм Ланцоша относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;. При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}, i \geq j&amp;lt;/math&amp;gt;), число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n + 1)}{2} + 1&amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/поддиагональные элементы, единица относится к параметру &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
по &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;k+kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является субквадратичным: &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма нахождения коэффициентов &amp;lt;math&amp;gt;\alpha_i,\beta_i&amp;lt;/math&amp;gt; без экономии памяти состовляет &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+2k}&amp;lt;/math&amp;gt;, при &amp;lt;math&amp;gt;k \ll n&amp;lt;/math&amp;gt;, вычислительная мощность приблизительно равна &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В случае хранения половины исходной матрицы получаем соотношношение &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n(n+1)/2+2k}&amp;lt;/math&amp;gt;, что приблизительно равно &amp;lt;math&amp;gt;4k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша без переортогонализации не является детерминированным (возможно выполнение меньшего числа итераций алгоритма), в случае если все собственные значения уже вычислены.&lt;br /&gt;
&lt;br /&gt;
Важное свойство метода Ланцоша состоит в том, что первыми в матрице &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; появляются собственные значения с максимальной величиной по модулю. Таким образом, метод особенно хорошо подходит для вычисления собственных значений матрицы &amp;lt;math&amp;gt;A&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;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
Проведём исследование масштабируемости параллельной реализации алгоритма Ланцоша без переортогонализации согласно [[Scalability methodology|методике]]. Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета] с оптимизацией компилятора и без.&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма без оптимизаций ====&lt;br /&gt;
&lt;br /&gt;
Сборка осуществлялась со следующими параметрами:&lt;br /&gt;
&lt;br /&gt;
* gcc-5.2.0&lt;br /&gt;
* openmpi-1.8.4&lt;br /&gt;
* аргументы компилятора: -std=c11&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [64 : 224] с шагом 16 / 32;&lt;br /&gt;
*	размер матрицы [25000 : 150000] с шагом 5000.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон [[Глоссарий#Эффективность реализации|эффективности реализации]] алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 4,55%;&lt;br /&gt;
*	максимальная эффективность реализации 11,17%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики [[Глоссарий#Производительность|производительности]] и эффективности данной реализации в зависимости от изменяемых параметров запуска.&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[file:Lanczos Without Orthogonalization Perf.png|thumb|center|700px|Рисунок 4. Параллельная реализация алгоритма Ланцоша. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
 |[[file:Lanczos Without Orthogonalization Eff.png|thumb|center|700px|Рисунок 5. Параллельная реализация алгоритма Ланцоша. Изменение эффективности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Как видно из графиков, производительность линейно зависит от количества процессоров, при этом минимальная эффективность наблюдается на матрицах размером 25000. Для всех последующих размеров минимальная эффективность составила 8.39% с попаданием большинства значений в интервал 10.5%-11%.&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма с оптимизацией ====&lt;br /&gt;
&lt;br /&gt;
Сборка осуществлялась со следующими параметрами:&lt;br /&gt;
&lt;br /&gt;
* gcc-5.2.0&lt;br /&gt;
* openmpi-1.8.4&lt;br /&gt;
* аргументы компилятора: -std=c11 -Ofast&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых параметров реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [32 : 256] с шагом 16;&lt;br /&gt;
*	размер матрицы [5000 : 200000] с шагом 5000.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон эффективности реализации алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 1.92%;&lt;br /&gt;
*	максимальная эффективность реализации 59.47%.&lt;br /&gt;
&lt;br /&gt;
График полученного распределения эффективности:&lt;br /&gt;
&lt;br /&gt;
[[file:Lanczos Without Orthogonalization Eff2Dist.png|thumb|center|700px|Рисунок 6. Параллельная реализация алгоритма Ланцоша. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики производительности и эффективности данной реализации в зависимости от изменяемых параметров запуска.&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[file:Lanczos Without Orthogonalization Perf2.png|thumb|center|700px|Рисунок 7. Параллельная реализация алгоритма Ланцоша. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
 |[[file:Lanczos Without Orthogonalization Eff2.png|thumb|center|700px|Рисунок 8. Параллельная реализация алгоритма Ланцоша. Изменение эффективности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
При включении оптимизации эффективность и производительность значительно возросли, при этом средняя эффективность для значений размеров матриц больше 25000 составила 52.7%. &lt;br /&gt;
&lt;br /&gt;
==== Реализация на языке C ====&lt;br /&gt;
[https://github.com/xrstalker/lanczos Исследованная параллельная реализация на языке C]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации ===&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте IETL&amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/lanczos.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;/div&gt;</summary>
		<author><name>A.Freeman</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=18384</id>
		<title>Участник:A.Freeman/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=18384"/>
		<updated>2016-11-18T21:11:19Z</updated>

		<summary type="html">&lt;p&gt;A.Freeman: /* Масштабируемость реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша без переортогонализации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}+1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n+1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Основные авторы описания: [[Участник:KAKTUZ|Заспа А.Ю.]] ([[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]]),  [[Участник:A.Freeman|Фролов А.А.]] ([[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Входные и выходные данные алгоритма|1.9]], [[#Свойства алгоритма|1.10]], [[#Масштабируемость алгоритма и его реализации|2.4]], [[#Существующие реализации|2.7]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; был опубликовн физиком и математиком Корнелием Ланцощем в 1950 году&amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот метод является частным случаем алгоритма Арнольда в случае, если исходная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - симметрична, и был представлен как итерационный метод вычисления собственных значений симметричной матрицы. Этот метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов исходной матрицы. Хотя алгоритм и был эффективным в вычислительном смысле, но он на некоторое время был предан забвению из-за численной неустойчивости. Только в 1970 Ojalvo и Newman модифицировали алгоритм для использования в арифметике с плавающей точкой&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;. Новый метод получил название [[Алгоритм Ланцоша с полной переортогонализацией | алгоритма Ланцоша с полной переортогонализацией]]. Но эта статья про его исходную версию.&lt;br /&gt;
На вход алгоритма подается вещественная симметричная матрица  &amp;lt;math&amp;gt;A = A^{T}&amp;lt;/math&amp;gt;,&lt;br /&gt;
{{Шаблон:ASymmetric}}&lt;br /&gt;
Поэтому достаточно хранить только чуть больше половины элементов исходной матрицы.&lt;br /&gt;
&lt;br /&gt;
Сам алгоритм соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца. На каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, состоящая из ортонормированных векторов Ланцоша. А в качестве приближенных собственных значений берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k \times k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 \\&lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 \\&lt;br /&gt;
&amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных значений и собственных векторов такой матрицы значительно проще чем их вычисление для исходной матрицы. Например, они могут быть вычислены с помощью [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы| метода «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]]. В этом методе эта процедура занимает &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций, где константа оказывается на практике довольно мала.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, начальный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: собственные вектора матрицы  &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; являющиеся столбцами матрицы &amp;lt;math&amp;gt;Q_k V&amp;lt;/math&amp;gt;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
До начала первой итерации нормируется вектор начального приближения &amp;lt;math&amp;gt;q_1 = \frac{b}{\|b\|_2}&amp;lt;/math&amp;gt;. Затем задаются константы &amp;lt;math&amp;gt;\beta_0 = 0,\; q_0 = 0 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
После выполнения данных действий начинаются итерации алгоритма. Которых будет не больше чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. В ходе итераций постепенно формируется матрица &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;\alpha_i&amp;lt;/math&amp;gt;-x и &amp;lt;math&amp;gt;\beta_i&amp;lt;/math&amp;gt;-х.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации происходят следующие вычисления. Вначале вычисляется произведение матрицы на вектор &amp;lt;math&amp;gt;z = Aq_i&amp;lt;/math&amp;gt;. Затем считается скалярное произведение &amp;lt;math&amp;gt;\alpha_i = q^T_i z&amp;lt;/math&amp;gt; и значение сохраняется как элемент формируемой матрицы. После этого необходимо произвести вычисление линейной комбинации векторов &amp;lt;math&amp;gt;z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}&amp;lt;/math&amp;gt;. Норму полученного вектора запишем как элемент матрицы &amp;lt;math&amp;gt;\beta_i = \|z\|_2&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;\beta_i&amp;lt;/math&amp;gt; оказалась равной нулю, то больше никаких итераций в алгоритме не производят, сразу переходят к вычислению собственных значений и собственных векторов. Иначе, в конце итерации считают &amp;lt;math&amp;gt;q_{i+1} = \frac{z}{\beta_i}&amp;lt;/math&amp;gt; и переходят к следующей итерации.&lt;br /&gt;
&lt;br /&gt;
После всех итераций необходимо вычислить собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром на каждой итерации является вычисление произведения матрицы на вектор:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&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;
&lt;br /&gt;
На каждой итерации будет вычисляться умножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на  вектор &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt;. Эта операция и будет самой ресурсозатратной на каждой итерации. Результаты этой макрооперации будут использованы затем в скалярном произведении векторов и в линейной комбинации из 3 векторов. После этого результат линейной комбинации векторов необходимо нормировать. Для этого можно разбить эту процедуру на вычисление нормы вектора и деление вектора на получившееся число. Кроме того, после завершения итераций необходимо вычислить собственные вектора и собственные значения полученной матрицы. Данная операция не конкретизируется алгоритмом, и может быть выполнена любым способом. Поэтому удобнее её представить в виде макрооперации. В разделе [[#Информационный граф|1.7]] можно наглядно увидеть как передаются данные между этими макрооперациями.&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;lt;math&amp;gt;1.\, \beta_0 = 0,\; q_0 = 0&amp;lt;/math&amp;gt; #Инициализируются константы&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;2.\, \|b\|_2 = \sqrt{\sum\limits_{j=1}^{n} b_j^2}&amp;lt;/math&amp;gt; #Вычисляем норму вектора начального приближения.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;3.\, q_{1_{j}} = \frac{b_{j}}{\|b\|_2}, \; j = 1,\, \dots\,, n&amp;lt;/math&amp;gt; #Нормализуем вектор начального приближения.&lt;br /&gt;
&lt;br /&gt;
Начинаются итерации цикла, которых не больше чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. На &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации производятся следующие вычисления:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.1\, z_j = \sum\limits_{m=1}^{n} a_{jm} q_{i_m}, \; j = 1,\,\dots\,, n&amp;lt;/math&amp;gt; #Считаем результат применения линейного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.2\, \alpha_i = \sum\limits_{j=1}^{n}q_{i_j} z_j&amp;lt;/math&amp;gt; #Получаем результат скалярного произведения векторов &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.3\, z_j = z_j - \alpha_i q_{i_j} - \beta_{i-1}q_{i-1_j}, \, j = 1,\,\dots\,, n&amp;lt;/math&amp;gt; #Вычисляем линейную комбинацию векторов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.4\, \beta_i = \|z\|_2 = \sqrt{\sum\limits_{j=1}^{n} z_j^2}&amp;lt;/math&amp;gt; #Считаем норму вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.5&amp;lt;/math&amp;gt; Проверка равенства &amp;lt;math&amp;gt;\beta_i == 0&amp;lt;/math&amp;gt; # Если норма оказалась равной нулю, то завершаем итерации и переходим к вычислению собственных векторов и собственных значений полученной матрицы. В обратном случае, продолжаем выполнения итераций.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.6\, q_{i+1_j} = \frac{z_j}{\beta_i}, \; j = 1,\, \dots \,, n&amp;lt;/math&amp;gt; #Нормируем вектор &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.7\,&amp;lt;/math&amp;gt; Если выполнили &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций, то завершаем выполнение итераций, переходим к следующему шагу. Иначе начинаем последующую итерацию цикла.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;4.&amp;lt;/math&amp;gt; Вычисляем собственные значения и собственные вектора полученной матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычисления &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и соответствующих им собственных векторов алгоритмом Ланцоша без переортогонализации состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и нахождения собственных значений и векторов трехдиагональной симметричной матрицы порядка &amp;lt;math&amp;gt;k&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; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; операций сложений&lt;br /&gt;
** извлечение квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций делений (нормирование)&lt;br /&gt;
Каждая из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций состоит из:&lt;br /&gt;
* умножение матрицы на вектор:&lt;br /&gt;
** &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* скалярное произведение двух векторов&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сложение&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; вычитаний&lt;br /&gt;
* норма вектора:&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&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; операций деления&lt;br /&gt;
&lt;br /&gt;
Итого (без учета решения задачи собственных значений трехдиагональной матрицы):&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2 + 4n) + n &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2+3n-2) +  n-1&amp;lt;/math&amp;gt; сложений/вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt; kn + n &amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; вычислений квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Для нахождение собственных значений и векторов трехдиагональной симметричной матрицы эффективней всего использовать [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы | метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]], который требует &amp;lt;math&amp;gt; O(k^3) &amp;lt;/math&amp;gt; операций.&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метод Ланцоша без переортогонализации относится к алгоритмам &#039;&#039;с квадратичной сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[Файл:Ланцош без переортогонализации 1.png|600px|thumb|center|Рисунок 1. Граф алгоритма без отображения входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt;  — операция деления, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\cdot &amp;lt;/math&amp;gt;  — операция скалярного умножения векторов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов, &amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;  — линейный оператор, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\nabla&amp;lt;/math&amp;gt; — условие преждевременного выхода.]]&lt;br /&gt;
 |[[Файл:Ланцош без переортогонализации 2.png|600px|thumb|center|Рисунок 2. Граф алгоритма с отображением входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt;  — операция деления,  &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\cdot &amp;lt;/math&amp;gt;  — операция скалярного умножения векторов,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов,  &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;  — линейный оператор, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\nabla&amp;lt;/math&amp;gt; — условие преждевременного выхода,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{In}&amp;lt;/math&amp;gt; — входные данные, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Out}&amp;lt;/math&amp;gt; — выходные результат.]]&lt;br /&gt;
|}&lt;br /&gt;
[[Файл:Линейный_оператор.png|600px|thumb|center|Рисунок 3. Граф макрооперации &amp;quot;умножение матрицы на вектор&amp;quot; без отображения входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt;  — операция умножения двух коэффициентов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;  — операция сложения.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша в параллельной форме состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и вычисления собственных значений матрицы &amp;lt;math&amp;gt;T_k&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;\log n&amp;lt;/math&amp;gt; и линейную ширину ярусов &amp;lt;math&amp;gt;\frac{n}{2}, \frac{n}{4}, ... , 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Инициализации состоит из следующих операций:&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** вычисление скалярного произведения вектора самого на себя:&lt;br /&gt;
*** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итерационная часть алгоритма состоит из следующих операций:&lt;br /&gt;
* умножение матрицы на число:&lt;br /&gt;
** ярус умножений с шириной &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log n&amp;lt;/math&amp;gt; ярусов с наибольшей шириной &amp;lt;math&amp;gt;\frac{n^2}{2}&amp;lt;/math&amp;gt; (блок вычисления n сумм n элементов)&lt;br /&gt;
* вычисление скалярного произведения двух векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt;&lt;br /&gt;
** два яруса сложений шириной &amp;lt;math&amp;gt;n&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;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с максимальной шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, в параллельном варианте основную долю времени будут занимать операции сложения при умножении матрицы на вектор.&lt;br /&gt;
При классификации по высоте ЯПФ Алгоритм Ланцоша относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;. При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}, i \geq j&amp;lt;/math&amp;gt;), число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n + 1)}{2} + 1&amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/поддиагональные элементы, единица относится к параметру &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
по &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;k+kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является субквадратичным: &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма нахождения коэффициентов &amp;lt;math&amp;gt;\alpha_i,\beta_i&amp;lt;/math&amp;gt; без экономии памяти состовляет &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+2k}&amp;lt;/math&amp;gt;, при &amp;lt;math&amp;gt;k \ll n&amp;lt;/math&amp;gt;, вычислительная мощность приблизительно равна &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В случае хранения половины исходной матрицы получаем соотношношение &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n(n+1)/2+2k}&amp;lt;/math&amp;gt;, что приблизительно равно &amp;lt;math&amp;gt;4k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша без переортогонализации не является детерминированным (возможно выполнение меньшего числа итераций алгоритма), в случае если все собственные значения уже вычислены.&lt;br /&gt;
&lt;br /&gt;
Важное свойство метода Ланцоша состоит в том, что первыми в матрице &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; появляются собственные значения с максимальной величиной по модулю. Таким образом, метод особенно хорошо подходит для вычисления собственных значений матрицы &amp;lt;math&amp;gt;A&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;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
Проведём исследование масштабируемости параллельной реализации алгоритма Ланцоша без переортогонализации согласно [[Scalability methodology|методике]]. Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета].&lt;br /&gt;
&lt;br /&gt;
Сборка осуществлялась со следующими параметрами:&lt;br /&gt;
&lt;br /&gt;
* gcc-5.2.0&lt;br /&gt;
* openmpi-1.8.4&lt;br /&gt;
* mpicc main.c -o out&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [64 : 224] с шагом 16 / 32;&lt;br /&gt;
*	размер матрицы [25000 : 150000] с шагом 5000.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон [[Глоссарий#Эффективность реализации|эффективности реализации]] алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 4,55%;&lt;br /&gt;
*	максимальная эффективность реализации 11,17%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики [[Глоссарий#Производительность|производительности]] и эффективности данной реализации в зависимости от изменяемых параметров запуска.&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[file:Lanczos Without Orthogonalization Perf.png|thumb|center|700px|Рисунок 4. Параллельная реализация алгоритма Ланцоша. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
 |[[file:Lanczos Without Orthogonalization Eff.png|thumb|center|700px|Рисунок 5. Параллельная реализация алгоритма Ланцоша. Изменение эффективности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Как видно из графиков, производительность линейно зависит от количества процессоров, при этом минимальная эффективность наблюдается на матрицах размером 25000. Для всех последующих размеров минимальная эффективность составила 8.39% с попаданием большинства значений в интервал 10.5%-11%.&lt;br /&gt;
&lt;br /&gt;
==== Реализация на языке C ====&lt;br /&gt;
[https://github.com/xrstalker/lanczos Исследованная параллельная реализация на языке C]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации ===&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте IETL&amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/lanczos.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;/div&gt;</summary>
		<author><name>A.Freeman</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=18232</id>
		<title>Участник:A.Freeman/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=18232"/>
		<updated>2016-11-18T18:14:10Z</updated>

		<summary type="html">&lt;p&gt;A.Freeman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша без переортогонализации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}+1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n+1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Основные авторы описания: [[Участник:KAKTUZ|Заспа А.Ю.]] ([[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]]),  [[Участник:A.Freeman|Фролов А.А.]] ([[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Входные и выходные данные алгоритма|1.9]], [[#Свойства алгоритма|1.10]], [[#Масштабируемость алгоритма и его реализации|2.4]], [[#Существующие реализации|2.7]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; был опубликовн физиком и математиком Корнелием Ланцощем в 1950 году&amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот метод является частным случаем алгоритма Арнольда в случае, если исходная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - симметрична, и был представлен как итерационный метод вычисления собственных значений симметричной матрицы. Этот метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов исходной матрицы. Хотя алгоритм и был эффективным в вычислительном смысле, но он на некоторое время был предан забвению из-за численной неустойчивости. Только в 1970 Ojalvo и Newman модифицировали алгоритм для использования в арифметике с плавающей точкой&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;. Новый метод получил название [[Алгоритм Ланцоша с полной переортогонализацией | алгоритма Ланцоша с полной переортогонализацией]]. Но эта статья про его исходную версию.&lt;br /&gt;
На вход алгоритма подается вещественная симметричная матрица  &amp;lt;math&amp;gt;A = A^{T}&amp;lt;/math&amp;gt;,&lt;br /&gt;
{{Шаблон:ASymmetric}}&lt;br /&gt;
Поэтому достаточно хранить только чуть больше половины элементов исходной матрицы.&lt;br /&gt;
&lt;br /&gt;
Сам алгоритм соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца. На каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, состоящая из ортонормированных векторов Ланцоша. А в качестве приближенных собственных значений берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k \times k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 \\&lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 \\&lt;br /&gt;
&amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных значений и собственных векторов такой матрицы значительно проще чем их вычисление для исходной матрицы. Например, они могут быть вычислены с помощью [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы| метода «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]]. В этом методе эта процедура занимает &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций, где константа оказывается на практике довольно мала.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, начальный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: собственные вектора матрицы  &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; являющиеся столбцами матрицы &amp;lt;math&amp;gt;Q_k V&amp;lt;/math&amp;gt;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
До начала первой итерации нормируется вектор начального приближения &amp;lt;math&amp;gt;q_1 = \frac{b}{\|b\|_2}&amp;lt;/math&amp;gt;. Затем задаются константы &amp;lt;math&amp;gt;\beta_0 = 0,\; q_0 = 0 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
После выполнения данных действий начинаются итерации алгоритма. Которых будет не больше чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. В ходе итераций постепенно формируется матрица &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;\alpha_i&amp;lt;/math&amp;gt;-x и &amp;lt;math&amp;gt;\beta_i&amp;lt;/math&amp;gt;-х.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации происходят следующие вычисления. Вначале вычисляется произведение матрицы на вектор &amp;lt;math&amp;gt;z = Aq_i&amp;lt;/math&amp;gt;. Затем считается скалярное произведение &amp;lt;math&amp;gt;\alpha_i = q^T_i z&amp;lt;/math&amp;gt; и значение сохраняется как элемент формируемой матрицы. После этого необходимо произвести вычисление линейной комбинации векторов &amp;lt;math&amp;gt;z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}&amp;lt;/math&amp;gt;. Норму полученного вектора запишем как элемент матрицы &amp;lt;math&amp;gt;\beta_i = \|z\|_2&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;\beta_i&amp;lt;/math&amp;gt; оказалась равной нулю, то больше никаких итераций в алгоритме не производят, сразу переходят к вычислению собственных значений и собственных векторов. Иначе, в конце итерации считают &amp;lt;math&amp;gt;q_{i+1} = \frac{z}{\beta_i}&amp;lt;/math&amp;gt; и переходят к следующей итерации.&lt;br /&gt;
&lt;br /&gt;
После всех итераций необходимо вычислить собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром на каждой итерации является вычисление произведения матрицы на вектор:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&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;
&lt;br /&gt;
На каждой итерации будет вычисляться умножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на  вектор &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt;. Эта операция и будет самой ресурсозатратной на каждой итерации. Результаты этой макрооперации будут использованы затем в скалярном произведении векторов и в линейной комбинации из 3 векторов. После этого результат линейной комбинации векторов необходимо нормировать. Для этого можно разбить эту процедуру на вычисление нормы вектора и деление вектора на получившееся число. Кроме того, после завершения итераций необходимо вычислить собственные вектора и собственные значения полученной матрицы. Данная операция не конкретизируется алгоритмом, и может быть выполнена любым способом. Поэтому удобнее её представить в виде макрооперации. В разделе [[#Информационный граф|1.7]] можно наглядно увидеть как передаются данные между этими макрооперациями.&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;lt;math&amp;gt;1.\, \beta_0 = 0,\; q_0 = 0&amp;lt;/math&amp;gt; #Инициализируются константы&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;2.\, \|b\|_2 = \sqrt{\sum\limits_{j=1}^{n} b_j^2}&amp;lt;/math&amp;gt; #Вычисляем норму вектора начального приближения.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;3.\, q_{1_{j}} = \frac{b_{j}}{\|b\|_2}, \; j = 1,\, \dots\,, n&amp;lt;/math&amp;gt; #Нормализуем вектор начального приближения.&lt;br /&gt;
&lt;br /&gt;
Начинаются итерации цикла, которых не больше чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. На &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации производятся следующие вычисления:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.1\, z_j = \sum\limits_{m=1}^{n} a_{jm} q_{i_m}, \; j = 1,\,\dots\,, n&amp;lt;/math&amp;gt; #Считаем результат применения линейного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.2\, \alpha_i = \sum\limits_{j=1}^{n}q_{i_j} z_j&amp;lt;/math&amp;gt; #Получаем результат скалярного произведения векторов &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.3\, z_j = z_j - \alpha_i q_{i_j} - \beta_{i-1}q_{i-1_j}, \, j = 1,\,\dots\,, n&amp;lt;/math&amp;gt; #Вычисляем линейную комбинацию векторов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.4\, \beta_i = \|z\|_2 = \sqrt{\sum\limits_{j=1}^{n} z_j^2}&amp;lt;/math&amp;gt; #Считаем норму вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.5&amp;lt;/math&amp;gt; Проверка равенства &amp;lt;math&amp;gt;\beta_i == 0&amp;lt;/math&amp;gt; # Если норма оказалась равной нулю, то завершаем итерации и переходим к вычислению собственных векторов и собственных значений полученной матрицы. В обратном случае, продолжаем выполнения итераций.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.6\, q_{i+1_j} = \frac{z_j}{\beta_i}, \; j = 1,\, \dots \,, n&amp;lt;/math&amp;gt; #Нормируем вектор &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.7\,&amp;lt;/math&amp;gt; Если выполнили &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций, то завершаем выполнение итераций, переходим к следующему шагу. Иначе начинаем последующую итерацию цикла.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;4.&amp;lt;/math&amp;gt; Вычисляем собственные значения и собственные вектора полученной матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычисления &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и соответствующих им собственных векторов алгоритмом Ланцоша без переортогонализации состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и нахождения собственных значений и векторов трехдиагональной симметричной матрицы порядка &amp;lt;math&amp;gt;k&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; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; операций сложений&lt;br /&gt;
** извлечение квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций делений (нормирование)&lt;br /&gt;
Каждая из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций состоит из:&lt;br /&gt;
* умножение матрицы на вектор:&lt;br /&gt;
** &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* скалярное произведение двух векторов&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сложение&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; вычитаний&lt;br /&gt;
* норма вектора:&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&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; операций деления&lt;br /&gt;
&lt;br /&gt;
Итого (без учета решения задачи собственных значений трехдиагональной матрицы):&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2 + 4n) + n &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2+3n-2) +  n-1&amp;lt;/math&amp;gt; сложений/вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt; kn + n &amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; вычислений квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Для нахождение собственных значений и векторов трехдиагональной симметричной матрицы эффективней всего использовать [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы | метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]], который требует &amp;lt;math&amp;gt; O(k^3) &amp;lt;/math&amp;gt; операций.&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метод Ланцоша без переортогонализации относится к алгоритмам &#039;&#039;с квадратичной сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[Файл:Ланцош без переортогонализации 1.png|600px|thumb|center|Рисунок 1. Граф алгоритма без отображения входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt;  — операция деления, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\cdot &amp;lt;/math&amp;gt;  — операция скалярного умножения векторов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов, &amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;  — линейный оператор, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\nabla&amp;lt;/math&amp;gt; — условие преждевременного выхода.]]&lt;br /&gt;
 |[[Файл:Ланцош без переортогонализации 2.png|600px|thumb|center|Рисунок 2. Граф алгоритма с отображением входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt;  — операция деления,  &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\cdot &amp;lt;/math&amp;gt;  — операция скалярного умножения векторов,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов,  &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;  — линейный оператор, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\nabla&amp;lt;/math&amp;gt; — условие преждевременного выхода,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{In}&amp;lt;/math&amp;gt; — входные данные, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Out}&amp;lt;/math&amp;gt; — выходные результат.]]&lt;br /&gt;
|}&lt;br /&gt;
[[Файл:Линейный_оператор.png|600px|thumb|center|Рисунок 3. Граф макрооперации &amp;quot;умножение матрицы на вектор&amp;quot; без отображения входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt;  — операция умножения двух коэффициентов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;  — операция сложения.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша в параллельной форме состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и вычисления собственных значений матрицы &amp;lt;math&amp;gt;T_k&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;\log n&amp;lt;/math&amp;gt; и линейную ширину ярусов &amp;lt;math&amp;gt;\frac{n}{2}, \frac{n}{4}, ... , 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Инициализации состоит из следующих операций:&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** вычисление скалярного произведения вектора самого на себя:&lt;br /&gt;
*** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итерационная часть алгоритма состоит из следующих операций:&lt;br /&gt;
* умножение матрицы на число:&lt;br /&gt;
** ярус умножений с шириной &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log n&amp;lt;/math&amp;gt; ярусов с наибольшей шириной &amp;lt;math&amp;gt;\frac{n^2}{2}&amp;lt;/math&amp;gt; (блок вычисления n сумм n элементов)&lt;br /&gt;
* вычисление скалярного произведения двух векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt;&lt;br /&gt;
** два яруса сложений шириной &amp;lt;math&amp;gt;n&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;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с максимальной шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, в параллельном варианте основную долю времени будут занимать операции сложения при умножении матрицы на вектор.&lt;br /&gt;
При классификации по высоте ЯПФ Алгоритм Ланцоша относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;. При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}, i \geq j&amp;lt;/math&amp;gt;), число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n + 1)}{2} + 1&amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/поддиагональные элементы, единица относится к параметру &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
по &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;k+kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является субквадратичным: &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма нахождения коэффициентов &amp;lt;math&amp;gt;\alpha_i,\beta_i&amp;lt;/math&amp;gt; без экономии памяти состовляет &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+2k}&amp;lt;/math&amp;gt;, при &amp;lt;math&amp;gt;k \ll n&amp;lt;/math&amp;gt;, вычислительная мощность приблизительно равна &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В случае хранения половины исходной матрицы получаем соотношношение &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n(n+1)/2+2k}&amp;lt;/math&amp;gt;, что приблизительно равно &amp;lt;math&amp;gt;4k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша без переортогонализации не является детерминированным (возможно выполнение меньшего числа итераций алгоритма), в случае если все собственные значения уже вычислены.&lt;br /&gt;
&lt;br /&gt;
Важное свойство метода Ланцоша состоит в том, что первыми в матрице &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; появляются собственные значения с максимальной величиной по модулю. Таким образом, метод особенно хорошо подходит для вычисления собственных значений матрицы &amp;lt;math&amp;gt;A&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;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
Проведём исследование масштабируемости параллельной реализации алгоритма Ланцоша без переортогонализации согласно [[Scalability methodology|методике]]. Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета].&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [64 : 224] с шагом 16 / 32;&lt;br /&gt;
*	размер матрицы [25000 : 150000] с шагом 5000.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон [[Глоссарий#Эффективность реализации|эффективности реализации]] алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 4,55%;&lt;br /&gt;
*	максимальная эффективность реализации 11,17%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики [[Глоссарий#Производительность|производительности]] и эффективности данной реализации в зависимости от изменяемых параметров запуска.&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[file:Lanczos Without Orthogonalization Perf.png|thumb|center|700px|Рисунок 4. Параллельная реализация алгоритма Ланцоша. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
 |[[file:Lanczos Without Orthogonalization Eff.png|thumb|center|700px|Рисунок 5. Параллельная реализация алгоритма Ланцоша. Изменение эффективности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Как видно из графиков, производительность линейно зависит от количества процессоров, при этом минимальная эффективность наблюдается на матрицах размером 25000. Для всех последующих размеров минимальная эффективность составила 8.39% с попаданием большинства значений в интервал 10.5%-11%.&lt;br /&gt;
==== Реализация на языке C ====&lt;br /&gt;
[https://github.com/xrstalker/lanczos Исследованная параллельная реализация на языке C]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации ===&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте IETL&amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/lanczos.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;/div&gt;</summary>
		<author><name>A.Freeman</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=18231</id>
		<title>Участник:A.Freeman/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=18231"/>
		<updated>2016-11-18T18:12:43Z</updated>

		<summary type="html">&lt;p&gt;A.Freeman: Отмена правки 18102, сделанной участником ASA (обс.)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша без переортогонализации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}+1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n+1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Основные авторы описания: [[Участник:KAKTUZ|Заспа А.Ю.]] ([[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]]),  [[Участник:A.Freeman|Фролов А.А.]] ([[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Входные и выходные данные алгоритма|1.9]], [[#Свойства алгоритма|1.10]], [[#Существующие реализации|2.7]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; был опубликовн физиком и математиком Корнелием Ланцощем в 1950 году&amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот метод является частным случаем алгоритма Арнольда в случае, если исходная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - симметрична, и был представлен как итерационный метод вычисления собственных значений симметричной матрицы. Этот метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов исходной матрицы. Хотя алгоритм и был эффективным в вычислительном смысле, но он на некоторое время был предан забвению из-за численной неустойчивости. Только в 1970 Ojalvo и Newman модифицировали алгоритм для использования в арифметике с плавающей точкой&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;. Новый метод получил название [[Алгоритм Ланцоша с полной переортогонализацией | алгоритма Ланцоша с полной переортогонализацией]]. Но эта статья про его исходную версию.&lt;br /&gt;
На вход алгоритма подается вещественная симметричная матрица  &amp;lt;math&amp;gt;A = A^{T}&amp;lt;/math&amp;gt;,&lt;br /&gt;
{{Шаблон:ASymmetric}}&lt;br /&gt;
Поэтому достаточно хранить только чуть больше половины элементов исходной матрицы.&lt;br /&gt;
&lt;br /&gt;
Сам алгоритм соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца. На каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, состоящая из ортонормированных векторов Ланцоша. А в качестве приближенных собственных значений берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k \times k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 \\&lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 \\&lt;br /&gt;
&amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных значений и собственных векторов такой матрицы значительно проще чем их вычисление для исходной матрицы. Например, они могут быть вычислены с помощью [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы| метода «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]]. В этом методе эта процедура занимает &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций, где константа оказывается на практике довольно мала.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, начальный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: собственные вектора матрицы  &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; являющиеся столбцами матрицы &amp;lt;math&amp;gt;Q_k V&amp;lt;/math&amp;gt;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
До начала первой итерации нормируется вектор начального приближения &amp;lt;math&amp;gt;q_1 = \frac{b}{\|b\|_2}&amp;lt;/math&amp;gt;. Затем задаются константы &amp;lt;math&amp;gt;\beta_0 = 0,\; q_0 = 0 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
После выполнения данных действий начинаются итерации алгоритма. Которых будет не больше чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. В ходе итераций постепенно формируется матрица &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;\alpha_i&amp;lt;/math&amp;gt;-x и &amp;lt;math&amp;gt;\beta_i&amp;lt;/math&amp;gt;-х.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации происходят следующие вычисления. Вначале вычисляется произведение матрицы на вектор &amp;lt;math&amp;gt;z = Aq_i&amp;lt;/math&amp;gt;. Затем считается скалярное произведение &amp;lt;math&amp;gt;\alpha_i = q^T_i z&amp;lt;/math&amp;gt; и значение сохраняется как элемент формируемой матрицы. После этого необходимо произвести вычисление линейной комбинации векторов &amp;lt;math&amp;gt;z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}&amp;lt;/math&amp;gt;. Норму полученного вектора запишем как элемент матрицы &amp;lt;math&amp;gt;\beta_i = \|z\|_2&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;\beta_i&amp;lt;/math&amp;gt; оказалась равной нулю, то больше никаких итераций в алгоритме не производят, сразу переходят к вычислению собственных значений и собственных векторов. Иначе, в конце итерации считают &amp;lt;math&amp;gt;q_{i+1} = \frac{z}{\beta_i}&amp;lt;/math&amp;gt; и переходят к следующей итерации.&lt;br /&gt;
&lt;br /&gt;
После всех итераций необходимо вычислить собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром на каждой итерации является вычисление произведения матрицы на вектор:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&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;
&lt;br /&gt;
На каждой итерации будет вычисляться умножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на  вектор &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt;. Эта операция и будет самой ресурсозатратной на каждой итерации. Результаты этой макрооперации будут использованы затем в скалярном произведении векторов и в линейной комбинации из 3 векторов. После этого результат линейной комбинации векторов необходимо нормировать. Для этого можно разбить эту процедуру на вычисление нормы вектора и деление вектора на получившееся число. Кроме того, после завершения итераций необходимо вычислить собственные вектора и собственные значения полученной матрицы. Данная операция не конкретизируется алгоритмом, и может быть выполнена любым способом. Поэтому удобнее её представить в виде макрооперации. В разделе [[#Информационный граф|1.7]] можно наглядно увидеть как передаются данные между этими макрооперациями.&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;lt;math&amp;gt;1.\, \beta_0 = 0,\; q_0 = 0&amp;lt;/math&amp;gt; #Инициализируются константы&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;2.\, \|b\|_2 = \sqrt{\sum\limits_{j=1}^{n} b_j^2}&amp;lt;/math&amp;gt; #Вычисляем норму вектора начального приближения.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;3.\, q_{1_{j}} = \frac{b_{j}}{\|b\|_2}, \; j = 1,\, \dots\,, n&amp;lt;/math&amp;gt; #Нормализуем вектор начального приближения.&lt;br /&gt;
&lt;br /&gt;
Начинаются итерации цикла, которых не больше чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. На &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации производятся следующие вычисления:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.1\, z_j = \sum\limits_{m=1}^{n} a_{jm} q_{i_m}, \; j = 1,\,\dots\,, n&amp;lt;/math&amp;gt; #Считаем результат применения линейного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.2\, \alpha_i = \sum\limits_{j=1}^{n}q_{i_j} z_j&amp;lt;/math&amp;gt; #Получаем результат скалярного произведения векторов &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.3\, z_j = z_j - \alpha_i q_{i_j} - \beta_{i-1}q_{i-1_j}, \, j = 1,\,\dots\,, n&amp;lt;/math&amp;gt; #Вычисляем линейную комбинацию векторов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.4\, \beta_i = \|z\|_2 = \sqrt{\sum\limits_{j=1}^{n} z_j^2}&amp;lt;/math&amp;gt; #Считаем норму вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.5&amp;lt;/math&amp;gt; Проверка равенства &amp;lt;math&amp;gt;\beta_i == 0&amp;lt;/math&amp;gt; # Если норма оказалась равной нулю, то завершаем итерации и переходим к вычислению собственных векторов и собственных значений полученной матрицы. В обратном случае, продолжаем выполнения итераций.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.6\, q_{i+1_j} = \frac{z_j}{\beta_i}, \; j = 1,\, \dots \,, n&amp;lt;/math&amp;gt; #Нормируем вектор &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.7\,&amp;lt;/math&amp;gt; Если выполнили &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций, то завершаем выполнение итераций, переходим к следующему шагу. Иначе начинаем последующую итерацию цикла.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;4.&amp;lt;/math&amp;gt; Вычисляем собственные значения и собственные вектора полученной матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычисления &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и соответствующих им собственных векторов алгоритмом Ланцоша без переортогонализации состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и нахождения собственных значений и векторов трехдиагональной симметричной матрицы порядка &amp;lt;math&amp;gt;k&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; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; операций сложений&lt;br /&gt;
** извлечение квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций делений (нормирование)&lt;br /&gt;
Каждая из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций состоит из:&lt;br /&gt;
* умножение матрицы на вектор:&lt;br /&gt;
** &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* скалярное произведение двух векторов&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сложение&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; вычитаний&lt;br /&gt;
* норма вектора:&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&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; операций деления&lt;br /&gt;
&lt;br /&gt;
Итого (без учета решения задачи собственных значений трехдиагональной матрицы):&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2 + 4n) + n &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2+3n-2) +  n-1&amp;lt;/math&amp;gt; сложений/вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt; kn + n &amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; вычислений квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Для нахождение собственных значений и векторов трехдиагональной симметричной матрицы эффективней всего использовать [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы | метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]], который требует &amp;lt;math&amp;gt; O(k^3) &amp;lt;/math&amp;gt; операций.&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метод Ланцоша без переортогонализации относится к алгоритмам &#039;&#039;с квадратичной сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[Файл:Ланцош без переортогонализации 1.png|600px|thumb|center|Рисунок 1. Граф алгоритма без отображения входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt;  — операция деления, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\cdot &amp;lt;/math&amp;gt;  — операция скалярного умножения векторов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов, &amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;  — линейный оператор, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\nabla&amp;lt;/math&amp;gt; — условие преждевременного выхода.]]&lt;br /&gt;
 |[[Файл:Ланцош без переортогонализации 2.png|600px|thumb|center|Рисунок 2. Граф алгоритма с отображением входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt;  — операция деления,  &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\cdot &amp;lt;/math&amp;gt;  — операция скалярного умножения векторов,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов,  &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;  — линейный оператор, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\nabla&amp;lt;/math&amp;gt; — условие преждевременного выхода,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{In}&amp;lt;/math&amp;gt; — входные данные, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Out}&amp;lt;/math&amp;gt; — выходные результат.]]&lt;br /&gt;
|}&lt;br /&gt;
[[Файл:Линейный_оператор.png|600px|thumb|center|Рисунок 3. Граф макрооперации &amp;quot;умножение матрицы на вектор&amp;quot; без отображения входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt;  — операция умножения двух коэффициентов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;  — операция сложения.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша в параллельной форме состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и вычисления собственных значений матрицы &amp;lt;math&amp;gt;T_k&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;\log n&amp;lt;/math&amp;gt; и линейную ширину ярусов &amp;lt;math&amp;gt;\frac{n}{2}, \frac{n}{4}, ... , 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Инициализации состоит из следующих операций:&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** вычисление скалярного произведения вектора самого на себя:&lt;br /&gt;
*** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итерационная часть алгоритма состоит из следующих операций:&lt;br /&gt;
* умножение матрицы на число:&lt;br /&gt;
** ярус умножений с шириной &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log n&amp;lt;/math&amp;gt; ярусов с наибольшей шириной &amp;lt;math&amp;gt;\frac{n^2}{2}&amp;lt;/math&amp;gt; (блок вычисления n сумм n элементов)&lt;br /&gt;
* вычисление скалярного произведения двух векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt;&lt;br /&gt;
** два яруса сложений шириной &amp;lt;math&amp;gt;n&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;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с максимальной шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, в параллельном варианте основную долю времени будут занимать операции сложения при умножении матрицы на вектор.&lt;br /&gt;
При классификации по высоте ЯПФ Алгоритм Ланцоша относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;. При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}, i \geq j&amp;lt;/math&amp;gt;), число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n + 1)}{2} + 1&amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/поддиагональные элементы, единица относится к параметру &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
по &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;k+kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является субквадратичным: &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма нахождения коэффициентов &amp;lt;math&amp;gt;\alpha_i,\beta_i&amp;lt;/math&amp;gt; без экономии памяти состовляет &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+2k}&amp;lt;/math&amp;gt;, при &amp;lt;math&amp;gt;k \ll n&amp;lt;/math&amp;gt;, вычислительная мощность приблизительно равна &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В случае хранения половины исходной матрицы получаем соотношношение &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n(n+1)/2+2k}&amp;lt;/math&amp;gt;, что приблизительно равно &amp;lt;math&amp;gt;4k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша без переортогонализации не является детерминированным (возможно выполнение меньшего числа итераций алгоритма), в случае если все собственные значения уже вычислены.&lt;br /&gt;
&lt;br /&gt;
Важное свойство метода Ланцоша состоит в том, что первыми в матрице &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; появляются собственные значения с максимальной величиной по модулю. Таким образом, метод особенно хорошо подходит для вычисления собственных значений матрицы &amp;lt;math&amp;gt;A&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;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
Проведём исследование масштабируемости параллельной реализации алгоритма Ланцоша без переортогонализации согласно [[Scalability methodology|методике]]. Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета].&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [64 : 224] с шагом 16 / 32;&lt;br /&gt;
*	размер матрицы [25000 : 150000] с шагом 5000.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон [[Глоссарий#Эффективность реализации|эффективности реализации]] алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 4,55%;&lt;br /&gt;
*	максимальная эффективность реализации 11,17%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики [[Глоссарий#Производительность|производительности]] и эффективности данной реализации в зависимости от изменяемых параметров запуска.&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[file:Lanczos Without Orthogonalization Perf.png|thumb|center|700px|Рисунок 4. Параллельная реализация алгоритма Ланцоша. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
 |[[file:Lanczos Without Orthogonalization Eff.png|thumb|center|700px|Рисунок 5. Параллельная реализация алгоритма Ланцоша. Изменение эффективности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Как видно из графиков, производительность линейно зависит от количества процессоров, при этом минимальная эффективность наблюдается на матрицах размером 25000. Для всех последующих размеров минимальная эффективность составила 8.39% с попаданием большинства значений в интервал 10.5%-11%.&lt;br /&gt;
==== Реализация на языке C ====&lt;br /&gt;
[https://github.com/xrstalker/lanczos Исследованная параллельная реализация на языке C]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации ===&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте IETL&amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/lanczos.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;/div&gt;</summary>
		<author><name>A.Freeman</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=18229</id>
		<title>Участник:A.Freeman/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=18229"/>
		<updated>2016-11-18T18:10:24Z</updated>

		<summary type="html">&lt;p&gt;A.Freeman: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша без переортогонализации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}+1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n+1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Основные авторы описания: [[Участник:KAKTUZ|Заспа А.Ю.]] ([[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]]),  [[Участник:A.Freeman|Фролов А.А.]] ([[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Входные и выходные данные алгоритма|1.9]], [[#Свойства алгоритма|1.10]], [[#Существующие реализации|2.7]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; был опубликовн физиком и математиком Корнелием Ланцощем в 1950 году&amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот метод является частным случаем алгоритма Арнольда в случае, если исходная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - симметрична, и был представлен как итерационный метод вычисления собственных значений симметричной матрицы. Этот метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов исходной матрицы. Хотя алгоритм и был эффективным в вычислительном смысле, но он на некоторое время был предан забвению из-за численной неустойчивости. Только в 1970 Ojalvo и Newman модифицировали алгоритм для использования в арифметике с плавающей точкой&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;. Новый метод получил название [[Алгоритм Ланцоша с полной переортогонализацией | алгоритма Ланцоша с полной переортогонализацией]]. Но эта статья про его исходную версию.&lt;br /&gt;
На вход алгоритма подается вещественная симметричная матрица  &amp;lt;math&amp;gt;A = A^{T}&amp;lt;/math&amp;gt;,&lt;br /&gt;
{{Шаблон:ASymmetric}}&lt;br /&gt;
Поэтому достаточно хранить только чуть больше половины элементов исходной матрицы.&lt;br /&gt;
&lt;br /&gt;
Сам алгоритм соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца. На каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, состоящая из ортонормированных векторов Ланцоша. А в качестве приближенных собственных значений берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k \times k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 \\&lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 \\&lt;br /&gt;
&amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных значений и собственных векторов такой матрицы значительно проще чем их вычисление для исходной матрицы. Например, они могут быть вычислены с помощью [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы| метода «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]]. В этом методе эта процедура занимает &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций, где константа оказывается на практике довольно мала.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, начальный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: собственные вектора матрицы  &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; являющиеся столбцами матрицы &amp;lt;math&amp;gt;Q_k V&amp;lt;/math&amp;gt;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
До начала первой итерации нормируется вектор начального приближения &amp;lt;math&amp;gt;q_1 = \frac{b}{\|b\|_2}&amp;lt;/math&amp;gt;. Затем задаются константы &amp;lt;math&amp;gt;\beta_0 = 0,\; q_0 = 0 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
После выполнения данных действий начинаются итерации алгоритма. Которых будет не больше чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. В ходе итераций постепенно формируется матрица &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;\alpha_i&amp;lt;/math&amp;gt;-x и &amp;lt;math&amp;gt;\beta_i&amp;lt;/math&amp;gt;-х.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации происходят следующие вычисления. Вначале вычисляется произведение матрицы на вектор &amp;lt;math&amp;gt;z = Aq_i&amp;lt;/math&amp;gt;. Затем считается скалярное произведение &amp;lt;math&amp;gt;\alpha_i = q^T_i z&amp;lt;/math&amp;gt; и значение сохраняется как элемент формируемой матрицы. После этого необходимо произвести вычисление линейной комбинации векторов &amp;lt;math&amp;gt;z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}&amp;lt;/math&amp;gt;. Норму полученного вектора запишем как элемент матрицы &amp;lt;math&amp;gt;\beta_i = \|z\|_2&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;\beta_i&amp;lt;/math&amp;gt; оказалась равной нулю, то больше никаких итераций в алгоритме не производят, сразу переходят к вычислению собственных значений и собственных векторов. Иначе, в конце итерации считают &amp;lt;math&amp;gt;q_{i+1} = \frac{z}{\beta_i}&amp;lt;/math&amp;gt; и переходят к следующей итерации.&lt;br /&gt;
&lt;br /&gt;
После всех итераций необходимо вычислить собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром на каждой итерации является вычисление произведения матрицы на вектор:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&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;
&lt;br /&gt;
На каждой итерации будет вычисляться умножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на  вектор &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt;. Эта операция и будет самой ресурсозатратной на каждой итерации. Результаты этой макрооперации будут использованы затем в скалярном произведении векторов и в линейной комбинации из 3 векторов. После этого результат линейной комбинации векторов необходимо нормировать. Для этого можно разбить эту процедуру на вычисление нормы вектора и деление вектора на получившееся число. Кроме того, после завершения итераций необходимо вычислить собственные вектора и собственные значения полученной матрицы. Данная операция не конкретизируется алгоритмом, и может быть выполнена любым способом. Поэтому удобнее её представить в виде макрооперации. В разделе [[#Информационный граф|1.7]] можно наглядно увидеть как передаются данные между этими макрооперациями.&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;lt;math&amp;gt;1.\, \beta_0 = 0,\; q_0 = 0&amp;lt;/math&amp;gt; #Инициализируются константы&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;2.\, \|b\|_2 = \sqrt{\sum\limits_{j=1}^{n} b_j^2}&amp;lt;/math&amp;gt; #Вычисляем норму вектора начального приближения.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;3.\, q_{1_{j}} = \frac{b_{j}}{\|b\|_2}, \; j = 1,\, \dots\,, n&amp;lt;/math&amp;gt; #Нормализуем вектор начального приближения.&lt;br /&gt;
&lt;br /&gt;
Начинаются итерации цикла, которых не больше чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. На &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации производятся следующие вычисления:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.1\, z_j = \sum\limits_{m=1}^{n} a_{jm} q_{i_m}, \; j = 1,\,\dots\,, n&amp;lt;/math&amp;gt; #Считаем результат применения линейного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.2\, \alpha_i = \sum\limits_{j=1}^{n}q_{i_j} z_j&amp;lt;/math&amp;gt; #Получаем результат скалярного произведения векторов &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.3\, z_j = z_j - \alpha_i q_{i_j} - \beta_{i-1}q_{i-1_j}, \, j = 1,\,\dots\,, n&amp;lt;/math&amp;gt; #Вычисляем линейную комбинацию векторов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.4\, \beta_i = \|z\|_2 = \sqrt{\sum\limits_{j=1}^{n} z_j^2}&amp;lt;/math&amp;gt; #Считаем норму вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.5&amp;lt;/math&amp;gt; Проверка равенства &amp;lt;math&amp;gt;\beta_i == 0&amp;lt;/math&amp;gt; # Если норма оказалась равной нулю, то завершаем итерации и переходим к вычислению собственных векторов и собственных значений полученной матрицы. В обратном случае, продолжаем выполнения итераций.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.6\, q_{i+1_j} = \frac{z_j}{\beta_i}, \; j = 1,\, \dots \,, n&amp;lt;/math&amp;gt; #Нормируем вектор &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.7\,&amp;lt;/math&amp;gt; Если выполнили &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций, то завершаем выполнение итераций, переходим к следующему шагу. Иначе начинаем последующую итерацию цикла.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;4.&amp;lt;/math&amp;gt; Вычисляем собственные значения и собственные вектора полученной матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычисления &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и соответствующих им собственных векторов алгоритмом Ланцоша без переортогонализации состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и нахождения собственных значений и векторов трехдиагональной симметричной матрицы порядка &amp;lt;math&amp;gt;k&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; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; операций сложений&lt;br /&gt;
** извлечение квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций делений (нормирование)&lt;br /&gt;
Каждая из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций состоит из:&lt;br /&gt;
* умножение матрицы на вектор:&lt;br /&gt;
** &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* скалярное произведение двух векторов&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сложение&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; вычитаний&lt;br /&gt;
* норма вектора:&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&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; операций деления&lt;br /&gt;
&lt;br /&gt;
Итого (без учета решения задачи собственных значений трехдиагональной матрицы):&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2 + 4n) + n &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2+3n-2) +  n-1&amp;lt;/math&amp;gt; сложений/вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt; kn + n &amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; вычислений квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Для нахождение собственных значений и векторов трехдиагональной симметричной матрицы эффективней всего использовать [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы | метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]], который требует &amp;lt;math&amp;gt; O(k^3) &amp;lt;/math&amp;gt; операций.&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метод Ланцоша без переортогонализации относится к алгоритмам &#039;&#039;с квадратичной сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[Файл:Ланцош без переортогонализации 1.png|600px|thumb|center|Рисунок 1. Граф алгоритма без отображения входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt;  — операция деления, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\cdot &amp;lt;/math&amp;gt;  — операция скалярного умножения векторов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов, &amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;  — линейный оператор, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\nabla&amp;lt;/math&amp;gt; — условие преждевременного выхода.]]&lt;br /&gt;
 |[[Файл:Ланцош без переортогонализации 2.png|600px|thumb|center|Рисунок 2. Граф алгоритма с отображением входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt;  — операция деления,  &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\cdot &amp;lt;/math&amp;gt;  — операция скалярного умножения векторов,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов,  &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;  — линейный оператор, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\nabla&amp;lt;/math&amp;gt; — условие преждевременного выхода,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{In}&amp;lt;/math&amp;gt; — входные данные, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Out}&amp;lt;/math&amp;gt; — выходные результат.]]&lt;br /&gt;
|}&lt;br /&gt;
[[Файл:Линейный_оператор.png|600px|thumb|center|Рисунок 3. Граф макрооперации &amp;quot;умножение матрицы на вектор&amp;quot; без отображения входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt;  — операция умножения двух коэффициентов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;  — операция сложения.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша в параллельной форме состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и вычисления собственных значений матрицы &amp;lt;math&amp;gt;T_k&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;\log n&amp;lt;/math&amp;gt; и линейную ширину ярусов &amp;lt;math&amp;gt;\frac{n}{2}, \frac{n}{4}, ... , 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Инициализации состоит из следующих операций:&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** вычисление скалярного произведения вектора самого на себя:&lt;br /&gt;
*** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итерационная часть алгоритма состоит из следующих операций:&lt;br /&gt;
* умножение матрицы на число:&lt;br /&gt;
** ярус умножений с шириной &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log n&amp;lt;/math&amp;gt; ярусов с наибольшей шириной &amp;lt;math&amp;gt;\frac{n^2}{2}&amp;lt;/math&amp;gt; (блок вычисления n сумм n элементов)&lt;br /&gt;
* вычисление скалярного произведения двух векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt;&lt;br /&gt;
** два яруса сложений шириной &amp;lt;math&amp;gt;n&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;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с максимальной шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, в параллельном варианте основную долю времени будут занимать операции сложения при умножении матрицы на вектор.&lt;br /&gt;
При классификации по высоте ЯПФ Алгоритм Ланцоша относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;. При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}, i \geq j&amp;lt;/math&amp;gt;), число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n + 1)}{2} + 1&amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/поддиагональные элементы, единица относится к параметру &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
по &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;k+kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является субквадратичным: &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма нахождения коэффициентов &amp;lt;math&amp;gt;\alpha_i,\beta_i&amp;lt;/math&amp;gt; без экономии памяти состовляет &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+2k}&amp;lt;/math&amp;gt;, при &amp;lt;math&amp;gt;k \ll n&amp;lt;/math&amp;gt;, вычислительная мощность приблизительно равна &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В случае хранения половины исходной матрицы получаем соотношношение &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n(n+1)/2+2k}&amp;lt;/math&amp;gt;, что приблизительно равно &amp;lt;math&amp;gt;4k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша без переортогонализации не является детерминированным (возможно выполнение меньшего числа итераций алгоритма), в случае если все собственные значения уже вычислены.&lt;br /&gt;
&lt;br /&gt;
Важное свойство метода Ланцоша состоит в том, что первыми в матрице &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; появляются собственные значения с максимальной величиной по модулю. Таким образом, метод особенно хорошо подходит для вычисления собственных значений матрицы &amp;lt;math&amp;gt;A&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;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
Проведём исследование масштабируемости параллельной реализации алгоритма Ланцоша без переортогонализации согласно [[Scalability methodology|методике]]. Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета].&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [64 : 224] с шагом 16 / 32;&lt;br /&gt;
*	размер матрицы [25000 : 150000] с шагом 5000.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон [[Глоссарий#Эффективность реализации|эффективности реализации]] алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 4,55%;&lt;br /&gt;
*	максимальная эффективность реализации 11,17%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики [[Глоссарий#Производительность|производительности]] и эффективности данной реализации в зависимости от изменяемых параметров запуска.&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[file:Lanczos Without Orthogonalization Perf.png|thumb|center|700px|Рисунок 4. Параллельная реализация алгоритма Ланцоша. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
 |[[file:Lanczos Without Orthogonalization Eff.png|thumb|center|700px|Рисунок 5. Параллельная реализация алгоритма Ланцоша. Изменение эффективности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Как видно из графиков, производительность линейно зависит от количества процессоров, при этом минимальная эффективность наблюдается на матрицах размером 25000. Для всех последующих размеров минимальная эффективность составила 8.39% с попаданием большинства значений в интервал 10.5%-11%.&lt;br /&gt;
==== Реализация на языке C ====&lt;br /&gt;
[https://github.com/xrstalker/lanczos Исследованная параллельная реализация на языке C]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации ===&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте IETL&amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/lanczos.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;/div&gt;</summary>
		<author><name>A.Freeman</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=18228</id>
		<title>Участник:A.Freeman/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=18228"/>
		<updated>2016-11-18T18:07:59Z</updated>

		<summary type="html">&lt;p&gt;A.Freeman: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша без переортогонализации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}+1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n+1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Основные авторы описания: [[Участник:KAKTUZ|Заспа А.Ю.]] ([[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]]),  [[Участник:A.Freeman|Фролов А.А.]] ([[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Входные и выходные данные алгоритма|1.9]], [[#Свойства алгоритма|1.10]], [[#Существующие реализации|2.7]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; был опубликовн физиком и математиком Корнелием Ланцощем в 1950 году&amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот метод является частным случаем алгоритма Арнольда в случае, если исходная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - симметрична, и был представлен как итерационный метод вычисления собственных значений симметричной матрицы. Этот метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов исходной матрицы. Хотя алгоритм и был эффективным в вычислительном смысле, но он на некоторое время был предан забвению из-за численной неустойчивости. Только в 1970 Ojalvo и Newman модифицировали алгоритм для использования в арифметике с плавающей точкой&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;. Новый метод получил название [[Алгоритм Ланцоша с полной переортогонализацией | алгоритма Ланцоша с полной переортогонализацией]]. Но эта статья про его исходную версию.&lt;br /&gt;
На вход алгоритма подается вещественная симметричная матрица  &amp;lt;math&amp;gt;A = A^{T}&amp;lt;/math&amp;gt;,&lt;br /&gt;
{{Шаблон:ASymmetric}}&lt;br /&gt;
Поэтому достаточно хранить только чуть больше половины элементов исходной матрицы.&lt;br /&gt;
&lt;br /&gt;
Сам алгоритм соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца. На каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, состоящая из ортонормированных векторов Ланцоша. А в качестве приближенных собственных значений берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k \times k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 \\&lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 \\&lt;br /&gt;
&amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных значений и собственных векторов такой матрицы значительно проще чем их вычисление для исходной матрицы. Например, они могут быть вычислены с помощью [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы| метода «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]]. В этом методе эта процедура занимает &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций, где константа оказывается на практике довольно мала.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, начальный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: собственные вектора матрицы  &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; являющиеся столбцами матрицы &amp;lt;math&amp;gt;Q_k V&amp;lt;/math&amp;gt;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
До начала первой итерации нормируется вектор начального приближения &amp;lt;math&amp;gt;q_1 = \frac{b}{\|b\|_2}&amp;lt;/math&amp;gt;. Затем задаются константы &amp;lt;math&amp;gt;\beta_0 = 0,\; q_0 = 0 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
После выполнения данных действий начинаются итерации алгоритма. Которых будет не больше чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. В ходе итераций постепенно формируется матрица &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;\alpha_i&amp;lt;/math&amp;gt;-x и &amp;lt;math&amp;gt;\beta_i&amp;lt;/math&amp;gt;-х.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации происходят следующие вычисления. Вначале вычисляется произведение матрицы на вектор &amp;lt;math&amp;gt;z = Aq_i&amp;lt;/math&amp;gt;. Затем считается скалярное произведение &amp;lt;math&amp;gt;\alpha_i = q^T_i z&amp;lt;/math&amp;gt; и значение сохраняется как элемент формируемой матрицы. После этого необходимо произвести вычисление линейной комбинации векторов &amp;lt;math&amp;gt;z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}&amp;lt;/math&amp;gt;. Норму полученного вектора запишем как элемент матрицы &amp;lt;math&amp;gt;\beta_i = \|z\|_2&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;\beta_i&amp;lt;/math&amp;gt; оказалась равной нулю, то больше никаких итераций в алгоритме не производят, сразу переходят к вычислению собственных значений и собственных векторов. Иначе, в конце итерации считают &amp;lt;math&amp;gt;q_{i+1} = \frac{z}{\beta_i}&amp;lt;/math&amp;gt; и переходят к следующей итерации.&lt;br /&gt;
&lt;br /&gt;
После всех итераций необходимо вычислить собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром на каждой итерации является вычисление произведения матрицы на вектор:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&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;
&lt;br /&gt;
На каждой итерации будет вычисляться умножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на  вектор &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt;. Эта операция и будет самой ресурсозатратной на каждой итерации. Результаты этой макрооперации будут использованы затем в скалярном произведении векторов и в линейной комбинации из 3 векторов. После этого результат линейной комбинации векторов необходимо нормировать. Для этого можно разбить эту процедуру на вычисление нормы вектора и деление вектора на получившееся число. Кроме того, после завершения итераций необходимо вычислить собственные вектора и собственные значения полученной матрицы. Данная операция не конкретизируется алгоритмом, и может быть выполнена любым способом. Поэтому удобнее её представить в виде макрооперации. В разделе [[#Информационный граф|1.7]] можно наглядно увидеть как передаются данные между этими макрооперациями.&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;lt;math&amp;gt;1.\, \beta_0 = 0,\; q_0 = 0&amp;lt;/math&amp;gt; #Инициализируются константы&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;2.\, \|b\|_2 = \sqrt{\sum\limits_{j=1}^{n} b_j^2}&amp;lt;/math&amp;gt; #Вычисляем норму вектора начального приближения.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;3.\, q_{1_{j}} = \frac{b_{j}}{\|b\|_2}, \; j = 1,\, \dots\,, n&amp;lt;/math&amp;gt; #Нормализуем вектор начального приближения.&lt;br /&gt;
&lt;br /&gt;
Начинаются итерации цикла, которых не больше чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. На &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации производятся следующие вычисления:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.1\, z_j = \sum\limits_{m=1}^{n} a_{jm} q_{i_m}, \; j = 1,\,\dots\,, n&amp;lt;/math&amp;gt; #Считаем результат применения линейного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.2\, \alpha_i = \sum\limits_{j=1}^{n}q_{i_j} z_j&amp;lt;/math&amp;gt; #Получаем результат скалярного произведения векторов &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.3\, z_j = z_j - \alpha_i q_{i_j} - \beta_{i-1}q_{i-1_j}, \, j = 1,\,\dots\,, n&amp;lt;/math&amp;gt; #Вычисляем линейную комбинацию векторов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.4\, \beta_i = \|z\|_2 = \sqrt{\sum\limits_{j=1}^{n} z_j^2}&amp;lt;/math&amp;gt; #Считаем норму вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.5&amp;lt;/math&amp;gt; Проверка равенства &amp;lt;math&amp;gt;\beta_i == 0&amp;lt;/math&amp;gt; # Если норма оказалась равной нулю, то завершаем итерации и переходим к вычислению собственных векторов и собственных значений полученной матрицы. В обратном случае, продолжаем выполнения итераций.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.6\, q_{i+1_j} = \frac{z_j}{\beta_i}, \; j = 1,\, \dots \,, n&amp;lt;/math&amp;gt; #Нормируем вектор &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.7\,&amp;lt;/math&amp;gt; Если выполнили &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций, то завершаем выполнение итераций, переходим к следующему шагу. Иначе начинаем последующую итерацию цикла.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;4.&amp;lt;/math&amp;gt; Вычисляем собственные значения и собственные вектора полученной матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычисления &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и соответствующих им собственных векторов алгоритмом Ланцоша без переортогонализации состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и нахождения собственных значений и векторов трехдиагональной симметричной матрицы порядка &amp;lt;math&amp;gt;k&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; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; операций сложений&lt;br /&gt;
** извлечение квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций делений (нормирование)&lt;br /&gt;
Каждая из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций состоит из:&lt;br /&gt;
* умножение матрицы на вектор:&lt;br /&gt;
** &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* скалярное произведение двух векторов&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сложение&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; вычитаний&lt;br /&gt;
* норма вектора:&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&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; операций деления&lt;br /&gt;
&lt;br /&gt;
Итого (без учета решения задачи собственных значений трехдиагональной матрицы):&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2 + 4n) + n &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2+3n-2) +  n-1&amp;lt;/math&amp;gt; сложений/вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt; kn + n &amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; вычислений квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Для нахождение собственных значений и векторов трехдиагональной симметричной матрицы эффективней всего использовать [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы | метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]], который требует &amp;lt;math&amp;gt; O(k^3) &amp;lt;/math&amp;gt; операций.&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метод Ланцоша без переортогонализации относится к алгоритмам &#039;&#039;с квадратичной сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[Файл:Ланцош без переортогонализации 1.png|600px|thumb|center|Рисунок 1. Граф алгоритма без отображения входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt;  — операция деления, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\cdot &amp;lt;/math&amp;gt;  — операция скалярного умножения векторов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов, &amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;  — линейный оператор, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\nabla&amp;lt;/math&amp;gt; — условие преждевременного выхода.]]&lt;br /&gt;
 |[[Файл:Ланцош без переортогонализации 2.png|600px|thumb|center|Рисунок 2. Граф алгоритма с отображением входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt;  — операция деления,  &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\cdot &amp;lt;/math&amp;gt;  — операция скалярного умножения векторов,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов,  &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;  — линейный оператор, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\nabla&amp;lt;/math&amp;gt; — условие преждевременного выхода,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{In}&amp;lt;/math&amp;gt; — входные данные, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Out}&amp;lt;/math&amp;gt; — выходные результат.]]&lt;br /&gt;
|}&lt;br /&gt;
[[Файл:Линейный_оператор.png|600px|thumb|center|Рисунок 3. Граф макрооперации &amp;quot;умножение матрицы на вектор&amp;quot; без отображения входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt;  — операция умножения двух коэффициентов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;  — операция сложения.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша в параллельной форме состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и вычисления собственных значений матрицы &amp;lt;math&amp;gt;T_k&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;\log n&amp;lt;/math&amp;gt; и линейную ширину ярусов &amp;lt;math&amp;gt;\frac{n}{2}, \frac{n}{4}, ... , 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Инициализации состоит из следующих операций:&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** вычисление скалярного произведения вектора самого на себя:&lt;br /&gt;
*** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итерационная часть алгоритма состоит из следующих операций:&lt;br /&gt;
* умножение матрицы на число:&lt;br /&gt;
** ярус умножений с шириной &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log n&amp;lt;/math&amp;gt; ярусов с наибольшей шириной &amp;lt;math&amp;gt;\frac{n^2}{2}&amp;lt;/math&amp;gt; (блок вычисления n сумм n элементов)&lt;br /&gt;
* вычисление скалярного произведения двух векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt;&lt;br /&gt;
** два яруса сложений шириной &amp;lt;math&amp;gt;n&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;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с максимальной шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, в параллельном варианте основную долю времени будут занимать операции сложения при умножении матрицы на вектор.&lt;br /&gt;
При классификации по высоте ЯПФ Алгоритм Ланцоша относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;. При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}, i \geq j&amp;lt;/math&amp;gt;), число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n + 1)}{2} + 1&amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/поддиагональные элементы, единица относится к параметру &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
по &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;k+kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является субквадратичным: &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма нахождения коэффициентов &amp;lt;math&amp;gt;\alpha_i,\beta_i&amp;lt;/math&amp;gt; без экономии памяти состовляет &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+2k}&amp;lt;/math&amp;gt;, при &amp;lt;math&amp;gt;k \ll n&amp;lt;/math&amp;gt;, вычислительная мощность приблизительно равна &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В случае хранения половины исходной матрицы получаем соотношношение &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n(n+1)/2+2k}&amp;lt;/math&amp;gt;, что приблизительно равно &amp;lt;math&amp;gt;4k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша без переортогонализации не является детерминированным (возможно выполнение меньшего числа итераций алгоритма), в случае если все собственные значения уже вычислены.&lt;br /&gt;
&lt;br /&gt;
Важное свойство метода Ланцоша состоит в том, что первыми в матрице &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; появляются собственные значения с максимальной величиной по модулю. Таким образом, метод особенно хорошо подходит для вычисления собственных значений матрицы &amp;lt;math&amp;gt;A&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;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
Проведём исследование масштабируемости параллельной реализации алгоритма Ланцоша без переортогонализации согласно [[Scalability methodology|методике]]. Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета].&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [64 : 224] с шагом 16 / 32;&lt;br /&gt;
*	размер матрицы [25000 : 150000] с шагом 5000.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон [[Глоссарий#Эффективность реализации|эффективности реализации]] алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 4,55%;&lt;br /&gt;
*	максимальная эффективность реализации 11,17%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики [[Глоссарий#Производительность|производительности]] и эффективности данной реализации в зависимости от изменяемых параметров запуска.&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[file:Lanczos Without Orthogonalization Perf.png|thumb|center|700px|Рисунок 4. Параллельная реализация алгоритма Ланцоша. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
 |[[file:Lanczos Without Orthogonalization Eff.png|thumb|center|700px|Рисунок 5. Параллельная реализация алгоритма Ланцоша. Изменение эффективности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Как видно из графиков, производительность линейно зависит от количества процессоров, при этом минимальная производительность наблюдается на матрицах размером 25000. Для всех последующих размеров минимальная производительность составила 8.39% с попаданием большинства значений в интервал 10.5%-11%.&lt;br /&gt;
==== Реализация на языке C ====&lt;br /&gt;
[https://github.com/xrstalker/lanczos Исследованная параллельная реализация на языке C]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации ===&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте IETL&amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/lanczos.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;/div&gt;</summary>
		<author><name>A.Freeman</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=17971</id>
		<title>Участник:A.Freeman/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=17971"/>
		<updated>2016-11-17T17:55:40Z</updated>

		<summary type="html">&lt;p&gt;A.Freeman: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша без переортогонализации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}+1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n+1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Основные авторы описания: [[Участник:KAKTUZ|Заспа А.Ю.]] ([[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]]),  [[Участник:A.Freeman|Фролов А.А.]] ([[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Входные и выходные данные алгоритма|1.9]], [[#Свойства алгоритма|1.10]], [[#Существующие реализации|2.7]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; был опубликовн физиком и математиком Корнелием Ланцощем в 1950 году&amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот метод является частным случаем алгоритма Арнольда в случае, если исходная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - симметрична, и был представлен как итерационный метод вычисления собственных значений симметричной матрицы. Этот метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов исходной матрицы. Хотя алгоритм и был эффективным в вычислительном смысле, но он на некоторое время был предан забвению из-за численной неустойчивости. Только в 1970 Ojalvo и Newman модифицировали алгоритм для использования в арифметике с плавающей точкой&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;. Новый метод получил название [[Алгоритм Ланцоша с полной переортогонализацией | алгоритма Ланцоша с полной переортогонализацией]]. Но эта статья про его исходную версию.&lt;br /&gt;
На вход алгоритма подается вещественная симметричная матрица  &amp;lt;math&amp;gt;A = A^{T}&amp;lt;/math&amp;gt;,&lt;br /&gt;
{{Шаблон:ASymmetric}}&lt;br /&gt;
Поэтому достаточно хранить только чуть больше половины элементов исходной матрицы.&lt;br /&gt;
&lt;br /&gt;
Сам алгоритм соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца. На каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, состоящая из ортонормированных векторов Ланцоша. А в качестве приближенных собственных значений берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k \times k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 \\&lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 \\&lt;br /&gt;
&amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных значений и собственных векторов такой матрицы значительно проще чем их вычисление для исходной матрицы. Например, они могут быть вычислены с помощью [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы| метода «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]]. В этом методе эта процедура занимает &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций, где константа оказывается на практике довольно мала.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, начальный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: собственные вектора матрицы  &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; являющиеся столбцами матрицы &amp;lt;math&amp;gt;Q_k V&amp;lt;/math&amp;gt;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
До начала первой итерации нормируется вектор начального приближения &amp;lt;math&amp;gt;q_1 = \frac{b}{\|b\|_2}&amp;lt;/math&amp;gt;. Затем задаются константы &amp;lt;math&amp;gt;\beta_0 = 0,\; q_0 = 0 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
После выполнения данных действий начинаются итерации алгоритма. Которых будет не больше чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. В ходе итераций постепенно формируется матрица &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;\alpha_i&amp;lt;/math&amp;gt;-x и &amp;lt;math&amp;gt;\beta_i&amp;lt;/math&amp;gt;-х.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации происходят следующие вычисления. Вначале вычисляется произведение матрицы на вектор &amp;lt;math&amp;gt;z = Aq_i&amp;lt;/math&amp;gt;. Затем считается скалярное произведение &amp;lt;math&amp;gt;\alpha_i = q^T_i z&amp;lt;/math&amp;gt; и значение сохраняется как элемент формируемой матрицы. После этого необходимо произвести вычисление линейной комбинации векторов &amp;lt;math&amp;gt;z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}&amp;lt;/math&amp;gt;. Норму полученного вектора запишем как элемент матрицы &amp;lt;math&amp;gt;\beta_i = \|z\|_2&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;\beta_i&amp;lt;/math&amp;gt; оказалась равной нулю, то больше никаких итераций в алгоритме не производят, сразу переходят к вычислению собственных значений и собственных векторов. Иначе, в конце итерации считают &amp;lt;math&amp;gt;q_{i+1} = \frac{z}{\beta_i}&amp;lt;/math&amp;gt; и переходят к следующей итерации.&lt;br /&gt;
&lt;br /&gt;
После всех итераций необходимо вычислить собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром на каждой итерации является вычисление произведения матрицы на вектор:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&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;
&lt;br /&gt;
На каждой итерации будет вычисляться умножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на  вектор &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt;. Эта операция и будет самой ресурсозатратной на каждой итерации. Результаты этой макрооперации будут использованы затем в скалярном произведении векторов и в линейной комбинации из 3 векторов. После этого результат линейной комбинации векторов необходимо нормировать. Для этого можно разбить эту процедуру на вычисление нормы вектора и деление вектора на получившееся число. Кроме того, после завершения итераций необходимо вычислить собственные вектора и собственные значения полученной матрицы. Данная операция не конкретизируется алгоритмом, и может быть выполнена любым способом. Поэтому удобнее её представить в виде макрооперации. В разделе [[#Информационный граф|1.7]] можно наглядно увидеть как передаются данные между этими макрооперациями.&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;lt;math&amp;gt;1.\, \beta_0 = 0,\; q_0 = 0&amp;lt;/math&amp;gt; #Инициализируются константы&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;2.\, \|b\|_2 = \sqrt{\sum\limits_{j=1}^{n} b_j^2}&amp;lt;/math&amp;gt; #Вычисляем норму вектора начального приближения.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;3.\, q_{1_{j}} = \frac{b_{j}}{\|b\|_2}, \; j = 1,\, \dots\,, n&amp;lt;/math&amp;gt; #Нормализуем вектор начального приближения.&lt;br /&gt;
&lt;br /&gt;
Начинаются итерации цикла, которых не больше чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. На &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации производятся следующие вычисления:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.1\, z_j = \sum\limits_{m=1}^{n} a_{jm} q_{i_m}, \; j = 1,\,\dots\,, n&amp;lt;/math&amp;gt; #Считаем результат применения линейного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.2\, \alpha_i = \sum\limits_{j=1}^{n}q_{i_j} z_j&amp;lt;/math&amp;gt; #Получаем результат скалярного произведения векторов &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.3\, z_j = z_j - \alpha_i q_{i_j} - \beta_{i-1}q_{i-1_j}, \, j = 1,\,\dots\,, n&amp;lt;/math&amp;gt; #Вычисляем линейную комбинацию векторов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.4\, \beta_i = \|z\|_2 = \sqrt{\sum\limits_{j=1}^{n} z_j^2}&amp;lt;/math&amp;gt; #Считаем норму вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.5&amp;lt;/math&amp;gt; Проверка равенства &amp;lt;math&amp;gt;\beta_i == 0&amp;lt;/math&amp;gt; # Если норма оказалась равной нулю, то завершаем итерации и переходим к вычислению собственных векторов и собственных значений полученной матрицы. В обратном случае, продолжаем выполнения итераций.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.6\, q_{i+1_j} = \frac{z_j}{\beta_i}, \; j = 1,\, \dots \,, n&amp;lt;/math&amp;gt; #Нормируем вектор &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.7\,&amp;lt;/math&amp;gt; Если выполнили &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций, то завершаем выполнение итераций, переходим к следующему шагу. Иначе начинаем последующую итерацию цикла.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;4.&amp;lt;/math&amp;gt; Вычисляем собственные значения и собственные вектора полученной матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычисления &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и соответствующих им собственных векторов алгоритмом Ланцоша без переортогонализации состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и нахождения собственных значений и векторов трехдиагональной симметричной матрицы порядка &amp;lt;math&amp;gt;k&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; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; операций сложений&lt;br /&gt;
** извлечение квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций делений (нормирование)&lt;br /&gt;
Каждая из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций состоит из:&lt;br /&gt;
* умножение матрицы на вектор:&lt;br /&gt;
** &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* скалярное произведение двух векторов&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сложение&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; вычитаний&lt;br /&gt;
* норма вектора:&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&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; операций деления&lt;br /&gt;
&lt;br /&gt;
Итого (без учета решения задачи собственных значений трехдиагональной матрицы):&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2 + 4n) + n &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2+3n-2) +  n-1&amp;lt;/math&amp;gt; сложений/вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt; kn + n &amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; вычислений квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Для нахождение собственных значений и векторов трехдиагональной симметричной матрицы эффективней всего использовать [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы | метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]], который требует &amp;lt;math&amp;gt; O(k^3) &amp;lt;/math&amp;gt; операций.&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метод Ланцоша без переортогонализации относится к алгоритмам &#039;&#039;с квадратичной сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[Файл:Ланцош без переортогонализации 1.png|600px|thumb|center|Рисунок 1. Граф алгоритма без отображения входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt;  — операция деления, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\cdot &amp;lt;/math&amp;gt;  — операция скалярного умножения векторов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов, &amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;  — линейный оператор, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\nabla&amp;lt;/math&amp;gt; — условие преждевременного выхода.]]&lt;br /&gt;
 |[[Файл:Ланцош без переортогонализации 2.png|600px|thumb|center|Рисунок 2. Граф алгоритма с отображением входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt;  — операция деления,  &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\cdot &amp;lt;/math&amp;gt;  — операция скалярного умножения векторов,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов,  &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;  — линейный оператор, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\nabla&amp;lt;/math&amp;gt; — условие преждевременного выхода,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{In}&amp;lt;/math&amp;gt; — входные данные, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Out}&amp;lt;/math&amp;gt; — выходные результат.]]&lt;br /&gt;
|}&lt;br /&gt;
[[Файл:Линейный_оператор.png|600px|thumb|center|Рисунок 3. Граф макрооперации &amp;quot;умножение матрицы на вектор&amp;quot; без отображения входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt;  — операция умножения двух коэффициентов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;  — операция сложения.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша в параллельной форме состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и вычисления собственных значений матрицы &amp;lt;math&amp;gt;T_k&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;\log n&amp;lt;/math&amp;gt; и линейную ширину ярусов &amp;lt;math&amp;gt;\frac{n}{2}, \frac{n}{4}, ... , 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Инициализации состоит из следующих операций:&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** вычисление скалярного произведения вектора самого на себя:&lt;br /&gt;
*** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итерационная часть алгоритма состоит из следующих операций:&lt;br /&gt;
* умножение матрицы на число:&lt;br /&gt;
** ярус умножений с шириной &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log n&amp;lt;/math&amp;gt; ярусов с наибольшей шириной &amp;lt;math&amp;gt;\frac{n^2}{2}&amp;lt;/math&amp;gt; (блок вычисления n сумм n элементов)&lt;br /&gt;
* вычисление скалярного произведения двух векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt;&lt;br /&gt;
** два яруса сложений шириной &amp;lt;math&amp;gt;n&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;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с максимальной шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, в параллельном варианте основную долю времени будут занимать операции сложения при умножении матрицы на вектор.&lt;br /&gt;
При классификации по высоте ЯПФ Алгоритм Ланцоша относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;. При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}, i \geq j&amp;lt;/math&amp;gt;), число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n + 1)}{2} + 1&amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/поддиагональные элементы, единица относится к параметру &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
по &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;k+kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является субквадратичным: &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма нахождения коэффициентов &amp;lt;math&amp;gt;\alpha_i,\beta_i&amp;lt;/math&amp;gt; без экономии памяти состовляет &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+2k}&amp;lt;/math&amp;gt;, при &amp;lt;math&amp;gt;k \ll n&amp;lt;/math&amp;gt;, вычислительная мощность приблизительно равна &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В случае хранения половины исходной матрицы получаем соотношношение &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n(n+1)/2+2k}&amp;lt;/math&amp;gt;, что приблизительно равно &amp;lt;math&amp;gt;4k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша без переортогонализации не является детерминированным (возможно выполнение меньшего числа итераций алгоритма), в случае если все собственные значения уже вычислены.&lt;br /&gt;
&lt;br /&gt;
Важное свойство метода Ланцоша состоит в том, что первыми в матрице &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; появляются собственные значения с максимальной величиной по модулю. Таким образом, метод особенно хорошо подходит для вычисления собственных значений матрицы &amp;lt;math&amp;gt;A&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;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
Проведём исследование масштабируемости параллельной реализации алгоритма Ланцоша без переортогонализации согласно [[Scalability methodology|методике]]. Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета].&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [64 : 224] с шагом 16 / 32;&lt;br /&gt;
*	размер матрицы [25000 : 150000] с шагом 5000.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон [[Глоссарий#Эффективность реализации|эффективности реализации]] алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 4,55%;&lt;br /&gt;
*	максимальная эффективность реализации 11,17%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики [[Глоссарий#Производительность|производительности]] и эффективности данной реализации в зависимости от изменяемых параметров запуска.&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[file:Lanczos Without Orthogonalization Perf.png|thumb|center|700px|Рисунок 4. Параллельная реализация алгоритма Ланцоша. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
 |[[file:Lanczos Without Orthogonalization Eff.png|thumb|center|700px|Рисунок 5. Параллельная реализация алгоритма Ланцоша. Изменение эффективности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Как видно из графиков, производительность линейно зависит от количества процессоров, при этом минимальная производительность наблюдается на матрицах размером 25000. Для всех последующих размеров минимальная производительность составила 8.39% с попаданием большинства значений в интервал 10.5%-11%.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации ===&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте IETL&amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/lanczos.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;/div&gt;</summary>
		<author><name>A.Freeman</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:Lanczos_Without_Orthogonalization_Perf.png&amp;diff=17966</id>
		<title>Файл:Lanczos Without Orthogonalization Perf.png</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:Lanczos_Without_Orthogonalization_Perf.png&amp;diff=17966"/>
		<updated>2016-11-17T17:32:43Z</updated>

		<summary type="html">&lt;p&gt;A.Freeman: Производительность реализации Алгоритма Ланцоша без переортагонализации.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Производительность реализации Алгоритма Ланцоша без переортагонализации.&lt;/div&gt;</summary>
		<author><name>A.Freeman</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:Lanczos_Without_Orthogonalization_Eff.png&amp;diff=17965</id>
		<title>Файл:Lanczos Without Orthogonalization Eff.png</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:Lanczos_Without_Orthogonalization_Eff.png&amp;diff=17965"/>
		<updated>2016-11-17T17:31:35Z</updated>

		<summary type="html">&lt;p&gt;A.Freeman: Эффективность реализации Алгоритма Ланцоша без переортагонализации.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Эффективность реализации Алгоритма Ланцоша без переортагонализации.&lt;/div&gt;</summary>
		<author><name>A.Freeman</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=15527</id>
		<title>Участник:A.Freeman/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=15527"/>
		<updated>2016-11-01T11:47:01Z</updated>

		<summary type="html">&lt;p&gt;A.Freeman: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша без переортогонализации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}+1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n+1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Основные авторы описания: [[Участник:KAKTUZ|Заспа А.Ю.]] ([[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]]),  [[Участник:A.Freeman|Фролов А.А.]] ([[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Входные и выходные данные алгоритма|1.9]], [[#Свойства алгоритма|1.10]], [[#Существующие реализации|2.7]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; был опубликовн физиком и математиком Корнелием Ланцощем в 1950 году&amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот метод является частным случаем алгоритма Арнольда в случае, если исходная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - симметрична, и был представлен как итерационный метод вычисления собственных значений симметричной матрицы. Этот метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов исходной матрицы. Хотя алгоритм и был эффективным в вычислительном смысле, но он на некоторое время был предан забвению из-за численной неустойчивости. Только в 1970 Ojalvo и Newman модифицировали алгоритм для использования в арифметике с плавающей точкой&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;. Новый метод получил название [[Алгоритм Ланцоша с полной переортогонализацией | алгоритма Ланцоша с полной переортогонализацией]]. Но эта статья про его исходную версию.&lt;br /&gt;
На вход алгоритма подается вещественная симметричная матрица  &amp;lt;math&amp;gt;A = A^{T}&amp;lt;/math&amp;gt;,&lt;br /&gt;
{{Шаблон:ASymmetric}}&lt;br /&gt;
Поэтому достаточно хранить только чуть больше половины элементов исходной матрицы.&lt;br /&gt;
&lt;br /&gt;
Сам алгоритм соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца. На каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, состоящая из ортонормированных векторов Ланцоша. А в качестве приближенных собственных значений берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k \times k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 \\&lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 \\&lt;br /&gt;
&amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных значений и собственных векторов такой матрицы значительно проще чем их вычисление для исходной матрицы. Например, они могут быть вычислены с помощью [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы| метода «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]]. В этом методе эта процедура занимает &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций, где константа оказывается на практике довольно мала.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, начальный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: собственные вектора матрицы  &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; являющиеся столбцами матрицы &amp;lt;math&amp;gt;Q_k V&amp;lt;/math&amp;gt;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
До начала первой итерации нормируется вектор начального приближения &amp;lt;math&amp;gt;q_1 = \frac{b}{\|b\|_2}&amp;lt;/math&amp;gt;. Затем задаются константы &amp;lt;math&amp;gt;\beta_0 = 0,\; q_0 = 0 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
После выполнения данных действий начинаются итерации алгоритма. Которых будет не больше чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. В ходе итераций постепенно формируется матрица &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;\alpha_i&amp;lt;/math&amp;gt;-x и &amp;lt;math&amp;gt;\beta_i&amp;lt;/math&amp;gt;-х.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации происходят следующие вычисления. Вначале вычисляется произведение матрицы на вектор &amp;lt;math&amp;gt;z = Aq_i&amp;lt;/math&amp;gt;. Затем считается скалярное произведение &amp;lt;math&amp;gt;\alpha_i = q^T_i z&amp;lt;/math&amp;gt; и значение сохраняется как элемент формируемой матрицы. После этого необходимо произвести вычисление линейной комбинации векторов &amp;lt;math&amp;gt;z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}&amp;lt;/math&amp;gt;. Норму полученного вектора запишем как элемент матрицы &amp;lt;math&amp;gt;\beta_i = \|z\|_2&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;\beta_i&amp;lt;/math&amp;gt; оказалась равной нулю, то больше никаких итераций в алгоритме не производят, сразу переходят к вычислению собственных значений и собственных векторов. Иначе, в конце итерации считают &amp;lt;math&amp;gt;q_{i+1} = \frac{z}{\beta_i}&amp;lt;/math&amp;gt; и переходят к следующей итерации.&lt;br /&gt;
&lt;br /&gt;
После всех итераций необходимо вычислить собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром на каждой итерации является вычисление произведения матрицы на вектор:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&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;
&lt;br /&gt;
На каждой итерации будет вычисляться умножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на  вектор &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt;. Эта операция и будет самой ресурсозатратной на каждой итерации. Результаты этой макрооперации будут использованы затем в скалярном произведении векторов и в линейной комбинации из 3 векторов. После этого результат линейной комбинации векторов необходимо нормировать. Для этого можно разбить эту процедуру на вычисление нормы вектора и деление вектора на получившееся число. Кроме того, после завершения итераций необходимо вычислить собственные вектора и собственные значения полученной матрицы. Данная операция не конкретизируется алгоритмом, и может быть выполнена любым способом. Поэтому удобнее её представить в виде макрооперации.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;1.\, \beta_0 = 0,\; q_0 = 0&amp;lt;/math&amp;gt; #Инициализируются константы&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;2.\, \|b\|_2 = \sqrt{\sum\limits_{j=1}^{n} b_j^2}&amp;lt;/math&amp;gt; #Вычисляем норму вектора начального приближения.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;3.\, q_{1_{j}} = \frac{b_{j}}{\|b\|_2}, \; j = 1,\, \dots\,, n&amp;lt;/math&amp;gt; #Нормализуем вектор начального приближения.&lt;br /&gt;
&lt;br /&gt;
Начинаются итерации цикла, которых не больше чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. На &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации производятся следующие вычисления:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.1\, z_j = \sum\limits_{m=1}^{n} a_{jm} q_{i_m}, \; j = 1,\,\dots\,, n&amp;lt;/math&amp;gt; #Считаем результат применения линейного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.2\, \alpha_i = \sum\limits_{j=1}^{n}q_{i_j} z_j&amp;lt;/math&amp;gt; #Получаем результат скалярного произведения векторов &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.3\, z_j = z_j - \alpha_i q_{i_j} - \beta_{i-1}q_{i-1_j}, \, j = 1,\,\dots\,, n&amp;lt;/math&amp;gt; #Вычисляем линейную комбинацию векторов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.4\, \beta_i = \|z\|_2 = \sqrt{\sum\limits_{j=1}^{n} z_j^2}&amp;lt;/math&amp;gt; #Считаем норму вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.5&amp;lt;/math&amp;gt; Проверка равенства &amp;lt;math&amp;gt;\beta_i == 0&amp;lt;/math&amp;gt; # Если норма оказалась равной нулю, то завершаем итерации и переходим к вычислению собственных векторов и собственных значений полученной матрицы. В обратном случае, продолжаем выполнения итераций.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.6\, q_{i+1_j} = \frac{z_j}{\beta_i}, \; j = 1,\, \dots \,, n&amp;lt;/math&amp;gt; #Нормируем вектор &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.7\,&amp;lt;/math&amp;gt; Если выполнили &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций, то завершаем выполнение итераций, переходим к следующему шагу. Иначе начинаем последующую итерацию цикла.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;4.&amp;lt;/math&amp;gt; Вычисляем собственные значения и собственные вектора полученной матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычисления &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и соответствующих им собственных векторов алгоритмом Ланцоша без переортогонализации состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и нахождения собственных значений и векторов трехдиагональной симметричной матрицы порядка &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Инициализация состоит из следующих операций:&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; операций сложений&lt;br /&gt;
** извлечение квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций делений (нормирование)&lt;br /&gt;
Каждая из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций состоит из:&lt;br /&gt;
* умножение матрицы на вектор:&lt;br /&gt;
** &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* скалярное произведение двух векторов&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сложение&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; вычитаний&lt;br /&gt;
* норма вектора:&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&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; операций деления&lt;br /&gt;
&lt;br /&gt;
Итого (без учета решения трехдиагональной матрицы):&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2 + 4n) + n &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2+3n-2) +  n-1&amp;lt;/math&amp;gt; сложений/вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt; kn + n &amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; вычислений квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Для нахождение собственных значений и векторов трехдиагональной симметричной матрицы эффективней всего использовать [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы | метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]], который требует &amp;lt;math&amp;gt; O(k^3) &amp;lt;/math&amp;gt; операций.&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метод Ланцоша без переортогонализации относится к алгоритмам &#039;&#039;с квадратичной сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[Файл:Ланцош без переортогонализации 1.png|600px|thumb|center|Рисунок 1. Граф алгоритма без отображения входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt;  — операция деления, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\cdot &amp;lt;/math&amp;gt;  — операция скалярного умножения векторов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов, &amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;  — линейный оператор, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\nabla&amp;lt;/math&amp;gt; — условие преждевременного выхода.]]&lt;br /&gt;
 |[[Файл:Ланцош без переортогонализации 2.png|600px|thumb|center|Рисунок 2. Граф алгоритма с отображением входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt;  — операция деления,  &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\cdot &amp;lt;/math&amp;gt;  — операция скалярного умножения векторов,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов,  &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;  — линейный оператор, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\nabla&amp;lt;/math&amp;gt; — условие преждевременного выхода,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{In}&amp;lt;/math&amp;gt; — входные данные, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Out}&amp;lt;/math&amp;gt; — выходные результат.]]&lt;br /&gt;
|}&lt;br /&gt;
[[Файл:Линейный_оператор.png|600px|thumb|center|Рисунок 3. Граф макрооперации &amp;quot;умножение матрицы на вектор&amp;quot; без отображения входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt;  — операция умножения двух коэффициентов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;  — операция сложения.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша в параллельной форме состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и вычисления собственных значений матрицы &amp;lt;math&amp;gt;T_k&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;\log n&amp;lt;/math&amp;gt; и линейную ширину ярусов &amp;lt;math&amp;gt;\frac{n}{2}, \frac{n}{4}, ... , 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Инициализации состоит из следующих операций:&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** вычисление скалярного произведения вектора самого на себя:&lt;br /&gt;
*** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итерационная часть алгоритма состоит из следующих операций:&lt;br /&gt;
* умножение матрицы на число:&lt;br /&gt;
** ярус умножений с шириной &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log n&amp;lt;/math&amp;gt; ярусов с наибольшей шириной &amp;lt;math&amp;gt;\frac{n^2}{2}&amp;lt;/math&amp;gt; (блок вычисления n сумм n элементов)&lt;br /&gt;
* вычисление скалярного произведения двух векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt;&lt;br /&gt;
** два яруса сложений шириной &amp;lt;math&amp;gt;n&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;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с максимальной шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, в параллельном варианте основную долю времени будут занимать операции сложения при умножении матрицы на вектор.&lt;br /&gt;
При классификации по высоте ЯПФ Алгоритм Ланцоша относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;. При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}, i \geq j&amp;lt;/math&amp;gt;), число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n + 1)}{2} + 1&amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/поддиагональные элементы, единица относится к параметру &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
по &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;k+kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является субквадратичным: &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма нахождения коэффициентов &amp;lt;math&amp;gt;\alpha_i,\beta_i&amp;lt;/math&amp;gt; без экономии памяти состовляет &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+2k}&amp;lt;/math&amp;gt;, при &amp;lt;math&amp;gt;k \ll n&amp;lt;/math&amp;gt;, вычислительная мощность приблизительно равна &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В случае хранения половины исходной матрицы получаем соотношношение &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n(n+1)/2+2k}&amp;lt;/math&amp;gt;, что приблизительно равно &amp;lt;math&amp;gt;4k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша без переортогонализации не является детерминированным (возможно выполнение меньшего числа итераций алгоритма), в случае если все собственные значения уже вычислены.&lt;br /&gt;
&lt;br /&gt;
Важное свойство метода Ланцоша состоит в том, что первыми в матрице &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; появляются собственные значения с максимальной величиной по модулю. Таким образом, метод особенно хорошо подходит для вычисления собственных значений матрицы &amp;lt;math&amp;gt;A&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;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации ===&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте IETL&amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/lanczos.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;/div&gt;</summary>
		<author><name>A.Freeman</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=15526</id>
		<title>Участник:A.Freeman/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=15526"/>
		<updated>2016-11-01T11:40:13Z</updated>

		<summary type="html">&lt;p&gt;A.Freeman: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша без переортогонализации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}+1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n+1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Основные авторы описания: [[Участник:KAKTUZ|Заспа А.Ю.]] ([[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]]),  [[Участник:A.Freeman|Фролов А.А.]] ([[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Входные и выходные данные алгоритма|1.9]], [[#Свойства алгоритма|1.10]], [[#Существующие реализации|2.7]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; был опубликовн физиком и математиком Корнелием Ланцощем в 1950 году&amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот метод является частным случаем алгоритма Арнольда в случае, если исходная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - симметрична, и был представлен как итерационный метод вычисления собственных значений симметричной матрицы. Этот метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов исходной матрицы. Хотя алгоритм и был эффективным в вычислительном смысле, но он на некоторое время был предан забвению из-за численной неустойчивости. Только в 1970 Ojalvo и Newman модифицировали алгоритм для использования в арифметике с плавающей точкой&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;. Новый метод получил название [[Алгоритм Ланцоша с полной переортогонализацией | алгоритма Ланцоша с полной переортогонализацией]]. Но эта статья про его исходную версию.&lt;br /&gt;
На вход алгоритма подается вещественная симметричная матрица  &amp;lt;math&amp;gt;A = A^{T}&amp;lt;/math&amp;gt;,&lt;br /&gt;
{{Шаблон:ASymmetric}}&lt;br /&gt;
Поэтому достаточно хранить только чуть больше половины элементов исходной матрицы.&lt;br /&gt;
&lt;br /&gt;
Сам алгоритм соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца. На каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, состоящая из ортонормированных векторов Ланцоша. А в качестве приближенных собственных значений берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k \times k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 \\&lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 \\&lt;br /&gt;
&amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных значений и собственных векторов такой матрицы значительно проще чем их вычисление для исходной матрицы. Например, они могут быть вычислены с помощью [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы| метода «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]]. В этом методе эта процедура занимает &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций, где константа оказывается на практике довольно мала.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, начальный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: собственные вектора матрицы  &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; являющиеся столбцами матрицы &amp;lt;math&amp;gt;Q_k V&amp;lt;/math&amp;gt;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
До начала первой итерации нормируется вектор начального приближения &amp;lt;math&amp;gt;q_1 = \frac{b}{\|b\|_2}&amp;lt;/math&amp;gt;. Затем задаются константы &amp;lt;math&amp;gt;\beta_0 = 0,\; q_0 = 0 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
После выполнения данных действий начинаются итерации алгоритма. Которых будет не больше чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. В ходе итераций постепенно формируется матрица &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;\alpha_i&amp;lt;/math&amp;gt;-x и &amp;lt;math&amp;gt;\beta_i&amp;lt;/math&amp;gt;-х.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации происходят следующие вычисления. Вначале вычисляется произведение матрицы на вектор &amp;lt;math&amp;gt;z = Aq_i&amp;lt;/math&amp;gt;. Затем считается скалярное произведение &amp;lt;math&amp;gt;\alpha_i = q^T_i z&amp;lt;/math&amp;gt; и значение сохраняется как элемент формируемой матрицы. После этого необходимо произвести вычисление линейной комбинации векторов &amp;lt;math&amp;gt;z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}&amp;lt;/math&amp;gt;. Норму полученного вектора запишем как элемент матрицы &amp;lt;math&amp;gt;\beta_i = \|z\|_2&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;\beta_i&amp;lt;/math&amp;gt; оказалась равной нулю, то больше никаких итераций в алгоритме не производят, сразу переходят к вычислению собственных значений и собственных векторов. Иначе, в конце итерации считают &amp;lt;math&amp;gt;q_{i+1} = \frac{z}{\beta_i}&amp;lt;/math&amp;gt; и переходят к следующей итерации.&lt;br /&gt;
&lt;br /&gt;
После всех итераций необходимо вычислить собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром на каждой итерации является вычисление произведения матрицы на вектор:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&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;
&lt;br /&gt;
На каждой итерации будет вычисляться умножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на  вектор &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt;. Эта операция и будет самой ресурсозатратной на каждой итерации. Результаты этой макрооперации будут использованы затем в скалярном произведении векторов и в линейной комбинации из 3 векторов. После этого результат линейной комбинации векторов необходимо нормировать. Для этого можно разбить эту процедуру на вычисление нормы вектора и деление вектора на получившееся число. Кроме того, после завершения итераций необходимо вычислить собственные вектора и собственные значения полученной матрицы. Данная операция не конкретизируется алгоритмом, и может быть выполнена любым способом. Поэтому удобнее её представить в виде макрооперации.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;1.\, \beta_0 = 0,\; q_0 = 0&amp;lt;/math&amp;gt; #Инициализируются константы&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;2.\, \|b\|_2 = \sqrt{\sum\limits_{j=1}^{n} b_j^2}&amp;lt;/math&amp;gt; #Вычисляем норму вектора начального приближения.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;3.\, q_{1_{j}} = \frac{b_{j}}{\|b\|_2}, \; j = 1,\, \dots\,, n&amp;lt;/math&amp;gt; #Нормализуем вектор начального приближения.&lt;br /&gt;
&lt;br /&gt;
Начинаются итерации цикла, которых не больше чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. На &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации производятся следующие вычисления:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.1\, z_j = \sum\limits_{m=1}^{n} a_{jm} q_{i_m}, \; j = 1,\,\dots\,, n&amp;lt;/math&amp;gt; #Считаем результат применения линейного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.2\, \alpha_i = \sum\limits_{j=1}^{n}q_{i_j} z_j&amp;lt;/math&amp;gt; #Получаем результат скалярного произведения векторов &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.3\, z_j = z_j - \alpha_i q_{i_j} - \beta_{i-1}q_{i-1_j}, \, j = 1,\,\dots\,, n&amp;lt;/math&amp;gt; #Вычисляем линейную комбинацию векторов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.4\, \beta_i = \|z\|_2 = \sqrt{\sum\limits_{j=1}^{n} z_j^2}&amp;lt;/math&amp;gt; #Считаем норму вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.5&amp;lt;/math&amp;gt; Проверка равенства &amp;lt;math&amp;gt;\beta_i == 0&amp;lt;/math&amp;gt; # Если норма оказалась равной нулю, то завершаем итерации и переходим к вычислению собственных векторов и собственных значений полученной матрицы. В обратном случае, продолжаем выполнения итераций.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.6\, q_{i+1_j} = \frac{z_j}{\beta_i}, \; j = 1,\, \dots \,, n&amp;lt;/math&amp;gt; #Нормируем вектор &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.7\,&amp;lt;/math&amp;gt; Если выполнили &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций, то завершаем выполнение итераций, переходим к следующему шагу. Иначе начинаем последующую итерацию цикла.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;4.&amp;lt;/math&amp;gt; Вычисляем собственные значения и собственные вектора полученной матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычисления &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и соответствующих им собственных векторов алгоритмом Ланцоша без переортогонализации состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и нахождения собственных значений и векторов трехдиагональной симметричной матрицы порядка &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Инициализация состоит из следующих операций:&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; операций сложений&lt;br /&gt;
** извлечение квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций делений (нормирование)&lt;br /&gt;
Каждая из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций состоит из:&lt;br /&gt;
* умножение матрицы на вектор:&lt;br /&gt;
** &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* скалярное произведение двух векторов&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сложение&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; вычитаний&lt;br /&gt;
* норма вектора:&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&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; операций деления&lt;br /&gt;
&lt;br /&gt;
Итого (без учета решения трехдиагональной матрицы):&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2 + 4n) + n &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2+3n-2) +  n-1&amp;lt;/math&amp;gt; сложений/вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt; kn + n &amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; вычислений квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Для нахождение собственных значений и векторов трехдиагональной симметричной матрицы эффективней всего использовать [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы | метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]], который требует &amp;lt;math&amp;gt; O(k^3) &amp;lt;/math&amp;gt; операций.&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метод Ланцоша без переортогонализации относится к алгоритмам &#039;&#039;с квадратичной сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[Файл:Ланцош без переортогонализации 1.png|600px|thumb|center|Рисунок 1. Граф алгоритма без отображения входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt;  — операция деления, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\cdot &amp;lt;/math&amp;gt;  — операция скалярного умножения векторов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов, &amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;  — линейный оператор, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\nabla&amp;lt;/math&amp;gt; — условие преждевременного выхода.]]&lt;br /&gt;
 |[[Файл:Ланцош без переортогонализации 2.png|600px|thumb|center|Рисунок 2. Граф алгоритма с отображением входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt;  — операция деления,  &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\cdot &amp;lt;/math&amp;gt;  — операция скалярного умножения векторов,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов,  &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;  — линейный оператор, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\nabla&amp;lt;/math&amp;gt; — условие преждевременного выхода,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{In}&amp;lt;/math&amp;gt; — входные данные, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Out}&amp;lt;/math&amp;gt; — выходные результат.]]&lt;br /&gt;
|}&lt;br /&gt;
[[Файл:Линейный_оператор.png|600px|thumb|center|Рисунок 3. Граф макрооперации &amp;quot;умножение матрицы на вектор&amp;quot; без отображения входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt;  — операция умножения двух коэффициентов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;  — операция сложения.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша в параллельной форме состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и вычисления собственных значений матрицы &amp;lt;math&amp;gt;T_k&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;\log n&amp;lt;/math&amp;gt; и линейную ширину ярусов &amp;lt;math&amp;gt;\frac{n}{2}, \frac{n}{4}, ... , 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Инициализации состоит из следующих операций:&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** вычисление скалярного произведения вектора самого на себя:&lt;br /&gt;
*** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итерационная часть алгоритма состоит из следующих операций:&lt;br /&gt;
* умножение матрицы на число:&lt;br /&gt;
** ярус умножений с шириной &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log n&amp;lt;/math&amp;gt; ярусов с наибольшей шириной &amp;lt;math&amp;gt;\frac{n^2}{2}&amp;lt;/math&amp;gt; (блок вычисления n сумм n элементов)&lt;br /&gt;
* вычисление скалярного произведения двух векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt;&lt;br /&gt;
** два яруса сложений шириной &amp;lt;math&amp;gt;n&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;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с максимальной шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, в параллельном варианте основную долю времени будут занимать операции сложения при умножении матрицы на вектор.&lt;br /&gt;
При классификации по высоте ЯПФ Алгоритм Ланцоша относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;. При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}, i \geq j&amp;lt;/math&amp;gt;), число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n + 1)}{2} + 1&amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/поддиагональные элементы, единица относится к параметру &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
по &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;k+kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является субквадратичным: &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма нахождения коэффициентов &amp;lt;math&amp;gt;\alpha_i,\beta_i&amp;lt;/math&amp;gt; без экономии памяти состовляет &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+2k}&amp;lt;/math&amp;gt;, при &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, вычислительная мощность примерно равна &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В случае хранения половины исходной матрицы матрица мощность равна &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n(n+1)/2+2k}&amp;lt;/math&amp;gt;, что приблизительно равно &amp;lt;math&amp;gt;4k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша без переортогонализации не является детерминированным (возможно выполнение меньшего числа итераций алгоритма), в случае если все собственные значения уже вычислены.&lt;br /&gt;
&lt;br /&gt;
Важное свойство метода Ланцоша состоит в том, что первыми в матрице &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; появляются собственные значения с максимальной величиной по модулю. Таким образом, метод особенно хорошо подходит для вычисления собственных значений матрицы &amp;lt;math&amp;gt;A&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;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации ===&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте IETL&amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/lanczos.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;/div&gt;</summary>
		<author><name>A.Freeman</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=15524</id>
		<title>Участник:A.Freeman/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=15524"/>
		<updated>2016-11-01T11:38:13Z</updated>

		<summary type="html">&lt;p&gt;A.Freeman: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша без переортогонализации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}+1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n+1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Основные авторы описания: [[Участник:KAKTUZ|Заспа А.Ю.]] ([[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]]),  [[Участник:A.Freeman|Фролов А.А.]] ([[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Входные и выходные данные алгоритма|1.9]], [[#Свойства алгоритма|1.10]], [[#Существующие реализации|2.7]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; был опубликовн физиком и математиком Корнелием Ланцощем в 1950 году&amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот метод является частным случаем алгоритма Арнольда в случае, если исходная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - симметрична, и был представлен как итерационный метод вычисления собственных значений симметричной матрицы. Этот метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов исходной матрицы. Хотя алгоритм и был эффективным в вычислительном смысле, но он на некоторое время был предан забвению из-за численной неустойчивости. Только в 1970 Ojalvo и Newman модифицировали алгоритм для использования в арифметике с плавающей точкой&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;. Новый метод получил название [[Алгоритм Ланцоша с полной переортогонализацией | алгоритма Ланцоша с полной переортогонализацией]]. Но эта статья про его исходную версию.&lt;br /&gt;
На вход алгоритма подается вещественная симметричная матрица  &amp;lt;math&amp;gt;A = A^{T}&amp;lt;/math&amp;gt;,&lt;br /&gt;
{{Шаблон:ASymmetric}}&lt;br /&gt;
Поэтому достаточно хранить только чуть больше половины элементов исходной матрицы.&lt;br /&gt;
&lt;br /&gt;
Сам алгоритм соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца. На каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, состоящая из ортонормированных векторов Ланцоша. А в качестве приближенных собственных значений берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k \times k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 \\&lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 \\&lt;br /&gt;
&amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных значений и собственных векторов такой матрицы значительно проще чем их вычисление для исходной матрицы. Например, они могут быть вычислены с помощью [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы| метода «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]]. В этом методе эта процедура занимает &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций, где константа оказывается на практике довольно мала.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, начальный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: собственные вектора матрицы  &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; являющиеся столбцами матрицы &amp;lt;math&amp;gt;Q_k V&amp;lt;/math&amp;gt;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
До начала первой итерации нормируется вектор начального приближения &amp;lt;math&amp;gt;q_1 = \frac{b}{\|b\|_2}&amp;lt;/math&amp;gt;. Затем задаются константы &amp;lt;math&amp;gt;\beta_0 = 0,\; q_0 = 0 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
После выполнения данных действий начинаются итерации алгоритма. Которых будет не больше чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. В ходе итераций постепенно формируется матрица &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;\alpha_i&amp;lt;/math&amp;gt;-x и &amp;lt;math&amp;gt;\beta_i&amp;lt;/math&amp;gt;-х.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации происходят следующие вычисления. Вначале вычисляется произведение матрицы на вектор &amp;lt;math&amp;gt;z = Aq_i&amp;lt;/math&amp;gt;. Затем считается скалярное произведение &amp;lt;math&amp;gt;\alpha_i = q^T_i z&amp;lt;/math&amp;gt; и значение сохраняется как элемент формируемой матрицы. После этого необходимо произвести вычисление линейной комбинации векторов &amp;lt;math&amp;gt;z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}&amp;lt;/math&amp;gt;. Норму полученного вектора запишем как элемент матрицы &amp;lt;math&amp;gt;\beta_i = \|z\|_2&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;\beta_i&amp;lt;/math&amp;gt; оказалась равной нулю, то больше никаких итераций в алгоритме не производят, сразу переходят к вычислению собственных значений и собственных векторов. Иначе, в конце итерации считают &amp;lt;math&amp;gt;q_{i+1} = \frac{z}{\beta_i}&amp;lt;/math&amp;gt; и переходят к следующей итерации.&lt;br /&gt;
&lt;br /&gt;
После всех итераций необходимо вычислить собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром на каждой итерации является вычисление произведения матрицы на вектор:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&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;
&lt;br /&gt;
На каждой итерации будет вычисляться умножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на  вектор &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt;. Эта операция и будет самой ресурсозатратной на каждой итерации. Результаты этой макрооперации будут использованы затем в скалярном произведении векторов и в линейной комбинации из 3 векторов. После этого результат линейной комбинации векторов необходимо нормировать. Для этого можно разбить эту процедуру на вычисление нормы вектора и деление вектора на получившееся число. Кроме того, после завершения итераций необходимо вычислить собственные вектора и собственные значения полученной матрицы. Данная операция не конкретизируется алгоритмом, и может быть выполнена любым способом. Поэтому удобнее её представить в виде макрооперации.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;1.\, \beta_0 = 0,\; q_0 = 0&amp;lt;/math&amp;gt; #Инициализируются константы&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;2.\, \|b\|_2 = \sqrt{\sum\limits_{j=1}^{n} b_j^2}&amp;lt;/math&amp;gt; #Вычисляем норму вектора начального приближения.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;3.\, q_{1_{j}} = \frac{b_{j}}{\|b\|_2}, \; j = 1,\, \dots\,, n&amp;lt;/math&amp;gt; #Нормализуем вектор начального приближения.&lt;br /&gt;
&lt;br /&gt;
Начинаются итерации цикла, которых не больше чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. На &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации производятся следующие вычисления:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.1\, z_j = \sum\limits_{m=1}^{n} a_{jm} q_{i_m}, \; j = 1,\,\dots\,, n&amp;lt;/math&amp;gt; #Считаем результат применения линейного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.2\, \alpha_i = \sum\limits_{j=1}^{n}q_{i_j} z_j&amp;lt;/math&amp;gt; #Получаем результат скалярного произведения векторов &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.3\, z_j = z_j - \alpha_i q_{i_j} - \beta_{i-1}q_{i-1_j}, \, j = 1,\,\dots\,, n&amp;lt;/math&amp;gt; #Вычисляем линейную комбинацию векторов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.4\, \beta_i = \|z\|_2 = \sqrt{\sum\limits_{j=1}^{n} z_j^2}&amp;lt;/math&amp;gt; #Считаем норму вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.5&amp;lt;/math&amp;gt; Проверка равенства &amp;lt;math&amp;gt;\beta_i == 0&amp;lt;/math&amp;gt; # Если норма оказалась равной нулю, то завершаем итерации и переходим к вычислению собственных векторов и собственных значений полученной матрицы. В обратном случае, продолжаем выполнения итераций.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.6\, q_{i+1_j} = \frac{z_j}{\beta_i}, \; j = 1,\, \dots \,, n&amp;lt;/math&amp;gt; #Нормируем вектор &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.7\,&amp;lt;/math&amp;gt; Если выполнили &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций, то завершаем выполнение итераций, переходим к следующему шагу. Иначе начинаем последующую итерацию цикла.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;4.&amp;lt;/math&amp;gt; Вычисляем собственные значения и собственные вектора полученной матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычисления &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и соответствующих им собственных векторов алгоритмом Ланцоша без переортогонализации состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и нахождения собственных значений и векторов трехдиагональной симметричной матрицы порядка &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Инициализация состоит из следующих операций:&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; операций сложений&lt;br /&gt;
** извлечение квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций делений (нормирование)&lt;br /&gt;
Каждая из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций состоит из:&lt;br /&gt;
* умножение матрицы на вектор:&lt;br /&gt;
** &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* скалярное произведение двух векторов&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сложение&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; вычитаний&lt;br /&gt;
* норма вектора:&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&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; операций деления&lt;br /&gt;
&lt;br /&gt;
Итого (без учета решения трехдиагональной матрицы):&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2 + 4n) + n &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2+3n-2) +  n-1&amp;lt;/math&amp;gt; сложений/вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt; kn + n &amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; вычислений квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Для нахождение собственных значений и векторов трехдиагональной симметричной матрицы эффективней всего использовать [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы | метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]], который требует &amp;lt;math&amp;gt; O(k^3) &amp;lt;/math&amp;gt; операций.&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метод Ланцоша без переортогонализации относится к алгоритмам &#039;&#039;с квадратичной сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[Файл:Ланцош без переортогонализации 1.png|600px|thumb|center|Рисунок 1. Граф алгоритма без отображения входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt;  — операция деления, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\cdot &amp;lt;/math&amp;gt;  — операция скалярного умножения векторов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов, &amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;  — линейный оператор, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\nabla&amp;lt;/math&amp;gt; — условие преждевременного выхода.]]&lt;br /&gt;
 |[[Файл:Ланцош без переортогонализации 2.png|600px|thumb|center|Рисунок 2. Граф алгоритма с отображением входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt;  — операция деления,  &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\cdot &amp;lt;/math&amp;gt;  — операция скалярного умножения векторов,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов,  &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;  — линейный оператор, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\nabla&amp;lt;/math&amp;gt; — условие преждевременного выхода,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{In}&amp;lt;/math&amp;gt; — входные данные, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Out}&amp;lt;/math&amp;gt; — выходные результат.]]&lt;br /&gt;
|}&lt;br /&gt;
[[Файл:Линейный_оператор.png|600px|thumb|center|Рисунок 3. Граф макрооперации &amp;quot;умножение матрицы на вектор&amp;quot; без отображения входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt;  — операция умножения двух коэффициентов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;  — операция сложения.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша в параллельной форме состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и вычисления собственных значений матрицы &amp;lt;math&amp;gt;T_k&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;\log n&amp;lt;/math&amp;gt; и линейную ширину ярусов &amp;lt;math&amp;gt;\frac{n}{2}, \frac{n}{4}, ... , 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Инициализации состоит из следующих операций:&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** вычисление скалярного произведения вектора самого на себя:&lt;br /&gt;
*** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итерационная часть алгоритма состоит из следующих операций:&lt;br /&gt;
* умножение матрицы на число:&lt;br /&gt;
** ярус умножений с шириной &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log n&amp;lt;/math&amp;gt; ярусов с наибольшей шириной &amp;lt;math&amp;gt;\frac{n^2}{2}&amp;lt;/math&amp;gt; (блок вычисления n сумм n элементов)&lt;br /&gt;
* вычисление скалярного произведения двух векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt;&lt;br /&gt;
** два яруса сложений шириной &amp;lt;math&amp;gt;n&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;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с максимальной шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, в параллельном варианте основную долю времени будут занимать операции сложения при умножении матрицы на вектор.&lt;br /&gt;
При классификации по высоте ЯПФ Алгоритм Ланцоша относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;. При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}, i \geq j&amp;lt;/math&amp;gt;), число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n + 1)}{2} + 1&amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/поддиагональные элементы, единица относится к параметру &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
по &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;k+kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является субквадратичным: &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма вычисления коэффициентов &amp;lt;math&amp;gt;\alpha_i,\beta_i&amp;lt;/math&amp;gt; без экономии памяти состовляет &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+2k}&amp;lt;/math&amp;gt;, при &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, вычислительная мощность примерно равна &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В случае хранения половины исходной матрицы матрица мощность равна &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n(n+1)/2+2k}&amp;lt;/math&amp;gt;, что приблизительно равно &amp;lt;math&amp;gt;4k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша без переортогонализации не является детерминированным (возможно выполнение меньшего числа итераций алгоритма), в случае если все собственные значения уже вычислены.&lt;br /&gt;
&lt;br /&gt;
Важное свойство метода Ланцоша состоит в том, что первыми в матрице &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; появляются собственные значения с максимальной величиной по модулю. Таким образом, метод особенно хорошо подходит для вычисления собственных значений матрицы &amp;lt;math&amp;gt;A&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;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации ===&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте IETL&amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/lanczos.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;/div&gt;</summary>
		<author><name>A.Freeman</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=15522</id>
		<title>Участник:A.Freeman/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=15522"/>
		<updated>2016-11-01T11:35:14Z</updated>

		<summary type="html">&lt;p&gt;A.Freeman: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша без переортогонализации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}+1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n+1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Основные авторы описания: [[Участник:KAKTUZ|Заспа А.Ю.]] ([[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]]),  [[Участник:A.Freeman|Фролов А.А.]] ([[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Входные и выходные данные алгоритма|1.9]], [[#Свойства алгоритма|1.10]], [[#Существующие реализации|2.7]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; был опубликовн физиком и математиком Корнелием Ланцощем в 1950 году&amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот метод является частным случаем алгоритма Арнольда в случае, если исходная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - симметрична, и был представлен как итерационный метод вычисления собственных значений симметричной матрицы. Этот метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов исходной матрицы. Хотя алгоритм и был эффективным в вычислительном смысле, но он на некоторое время был предан забвению из-за численной неустойчивости. Только в 1970 Ojalvo и Newman модифицировали алгоритм для использования в арифметике с плавающей точкой&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;. Новый метод получил название [[Алгоритм Ланцоша с полной переортогонализацией | алгоритма Ланцоша с полной переортогонализацией]]. Но эта статья про его исходную версию.&lt;br /&gt;
На вход алгоритма подается вещественная симметричная матрица  &amp;lt;math&amp;gt;A = A^{T}&amp;lt;/math&amp;gt;,&lt;br /&gt;
{{Шаблон:ASymmetric}}&lt;br /&gt;
Поэтому достаточно хранить только чуть больше половины элементов исходной матрицы.&lt;br /&gt;
&lt;br /&gt;
Сам алгоритм соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца. На каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, состоящая из ортонормированных векторов Ланцоша. А в качестве приближенных собственных значений берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k \times k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 \\&lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 \\&lt;br /&gt;
&amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных значений и собственных векторов такой матрицы значительно проще чем их вычисление для исходной матрицы. Например, они могут быть вычислены с помощью [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы| метода «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]]. В этом методе эта процедура занимает &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций, где константа оказывается на практике довольно мала.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, начальный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: собственные вектора матрицы  &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; являющиеся столбцами матрицы &amp;lt;math&amp;gt;Q_k V&amp;lt;/math&amp;gt;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
До начала первой итерации нормируется вектор начального приближения &amp;lt;math&amp;gt;q_1 = \frac{b}{\|b\|_2}&amp;lt;/math&amp;gt;. Затем задаются константы &amp;lt;math&amp;gt;\beta_0 = 0,\; q_0 = 0 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
После выполнения данных действий начинаются итерации алгоритма. Которых будет не больше чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. В ходе итераций постепенно формируется матрица &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;\alpha_i&amp;lt;/math&amp;gt;-x и &amp;lt;math&amp;gt;\beta_i&amp;lt;/math&amp;gt;-х.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации происходят следующие вычисления. Вначале вычисляется произведение матрицы на вектор &amp;lt;math&amp;gt;z = Aq_i&amp;lt;/math&amp;gt;. Затем считается скалярное произведение &amp;lt;math&amp;gt;\alpha_i = q^T_i z&amp;lt;/math&amp;gt; и значение сохраняется как элемент формируемой матрицы. После этого необходимо произвести вычисление линейной комбинации векторов &amp;lt;math&amp;gt;z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}&amp;lt;/math&amp;gt;. Норму полученного вектора запишем как элемент матрицы &amp;lt;math&amp;gt;\beta_i = \|z\|_2&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;\beta_i&amp;lt;/math&amp;gt; оказалась равной нулю, то больше никаких итераций в алгоритме не производят, сразу переходят к вычислению собственных значений и собственных векторов. Иначе, в конце итерации считают &amp;lt;math&amp;gt;q_{i+1} = \frac{z}{\beta_i}&amp;lt;/math&amp;gt; и переходят к следующей итерации.&lt;br /&gt;
&lt;br /&gt;
После всех итераций необходимо вычислить собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром на каждой итерации является вычисление произведения матрицы на вектор:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&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;
&lt;br /&gt;
На каждой итерации будет вычисляться умножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на  вектор &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt;. Эта операция и будет самой ресурсозатратной на каждой итерации. Результаты этой макрооперации будут использованы затем в скалярном произведении векторов и в линейной комбинации из 3 векторов. После этого результат линейной комбинации векторов необходимо нормировать. Для этого можно разбить эту процедуру на вычисление нормы вектора и деление вектора на получившееся число. Кроме того, после завершения итераций необходимо вычислить собственные вектора и собственные значения полученной матрицы. Данная операция не конкретизируется алгоритмом, и может быть выполнена любым способом. Поэтому удобнее её представить в виде макрооперации.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;1.\, \beta_0 = 0,\; q_0 = 0&amp;lt;/math&amp;gt; #Инициализируются константы&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;2.\, \|b\|_2 = \sqrt{\sum\limits_{j=1}^{n} b_j^2}&amp;lt;/math&amp;gt; #Вычисляем норму вектора начального приближения.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;3.\, q_{1_{j}} = \frac{b_{j}}{\|b\|_2}, \; j = 1,\, \dots\,, n&amp;lt;/math&amp;gt; #Нормализуем вектор начального приближения.&lt;br /&gt;
&lt;br /&gt;
Начинаются итерации цикла, которых не больше чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. На &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации производятся следующие вычисления:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.1\, z_j = \sum\limits_{m=1}^{n} a_{jm} q_{i_m}, \; j = 1,\,\dots\,, n&amp;lt;/math&amp;gt; #Считаем результат применения линейного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.2\, \alpha_i = \sum\limits_{j=1}^{n}q_{i_j} z_j&amp;lt;/math&amp;gt; #Получаем результат скалярного произведения векторов &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.3\, z_j = z_j - \alpha_i q_{i_j} - \beta_{i-1}q_{i-1_j}, \, j = 1,\,\dots\,, n&amp;lt;/math&amp;gt; #Вычисляем линейную комбинацию векторов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.4\, \beta_i = \|z\|_2 = \sqrt{\sum\limits_{j=1}^{n} z_j^2}&amp;lt;/math&amp;gt; #Считаем норму вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.5&amp;lt;/math&amp;gt; Проверка равенства &amp;lt;math&amp;gt;\beta_i == 0&amp;lt;/math&amp;gt; # Если норма оказалась равной нулю, то завершаем итерации и переходим к вычислению собственных векторов и собственных значений полученной матрицы. В обратном случае, продолжаем выполнения итераций.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.6\, q_{i+1_j} = \frac{z_j}{\beta_i}, \; j = 1,\, \dots \,, n&amp;lt;/math&amp;gt; #Нормируем вектор &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.7\,&amp;lt;/math&amp;gt; Если выполнили &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций, то завершаем выполнение итераций, переходим к следующему шагу. Иначе начинаем последующую итерацию цикла.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;4.&amp;lt;/math&amp;gt; Вычисляем собственные значения и собственные вектора полученной матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычисления &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и соответствующих им собственных векторов алгоритмом Ланцоша без переортогонализации состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и нахождения собственных значений и векторов трехдиагональной симметричной матрицы порядка &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Инициализация состоит из следующих операций:&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; операций сложений&lt;br /&gt;
** извлечение квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций делений (нормирование)&lt;br /&gt;
Каждая из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций состоит из:&lt;br /&gt;
* умножение матрицы на вектор:&lt;br /&gt;
** &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* скалярное произведение двух векторов&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сложение&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; вычитаний&lt;br /&gt;
* норма вектора:&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&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; операций деления&lt;br /&gt;
&lt;br /&gt;
Итого (без учета решения трехдиагональной матрицы):&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2 + 4n) + n &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2+3n-2) +  n-1&amp;lt;/math&amp;gt; сложений/вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt; kn + n &amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; вычислений квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Для нахождение собственных значений и векторов трехдиагональной симметричной матрицы эффективней всего использовать [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы | метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]], который требует &amp;lt;math&amp;gt; O(k^3) &amp;lt;/math&amp;gt; операций.&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метод Ланцоша без переортогонализации относится к алгоритмам &#039;&#039;с квадратичной сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[Файл:Ланцош без переортогонализации 1.png|600px|thumb|center|Рисунок 1. Граф алгоритма без отображения входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt;  — операция деления, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\cdot &amp;lt;/math&amp;gt;  — операция скалярного умножения векторов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов, &amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;  — линейный оператор, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\nabla&amp;lt;/math&amp;gt; — условие преждевременного выхода.]]&lt;br /&gt;
 |[[Файл:Ланцош без переортогонализации 2.png|600px|thumb|center|Рисунок 2. Граф алгоритма с отображением входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt;  — операция деления,  &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\cdot &amp;lt;/math&amp;gt;  — операция скалярного умножения векторов,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов,  &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;  — линейный оператор, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\nabla&amp;lt;/math&amp;gt; — условие преждевременного выхода,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{In}&amp;lt;/math&amp;gt; — входные данные, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Out}&amp;lt;/math&amp;gt; — выходные результат.]]&lt;br /&gt;
|}&lt;br /&gt;
[[Файл:Линейный_оператор.png|600px|thumb|center|Рисунок 3. Граф макрооперации &amp;quot;умножение матрицы на вектор&amp;quot; без отображения входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt;  — операция умножения двух коэффициентов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;  — операция сложения.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша в параллельной форме состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и вычисления собственных значений матрицы &amp;lt;math&amp;gt;T_k&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;\log n&amp;lt;/math&amp;gt; и линейную ширину ярусов &amp;lt;math&amp;gt;\frac{n}{2}, \frac{n}{4}, ... , 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Инициализации состоит из следующих операций:&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** вычисление скалярного произведения вектора самого на себя:&lt;br /&gt;
*** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итерационная часть алгоритма состоит из следующих операций:&lt;br /&gt;
* умножение матрицы на число:&lt;br /&gt;
** ярус умножений с шириной &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log n&amp;lt;/math&amp;gt; ярусов с наибольшей шириной &amp;lt;math&amp;gt;\frac{n^2}{2}&amp;lt;/math&amp;gt; (блок вычисления n сумм n элементов)&lt;br /&gt;
* вычисление скалярного произведения двух векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt;&lt;br /&gt;
** два яруса сложений шириной &amp;lt;math&amp;gt;n&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;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с максимальной шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, в параллельном варианте основную долю времени будут занимать операции сложения при умножении матрицы на вектор.&lt;br /&gt;
При классификации по высоте ЯПФ Алгоритм Ланцоша относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;. При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}, i \geq j&amp;lt;/math&amp;gt;), число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n + 1)}{2} + 1&amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/поддиагональные элементы, единица относится к параметру &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
по &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;k+kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является субквадратичным: &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма без экономии памяти состовляет &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+kn+k+1}&amp;lt;/math&amp;gt;, при &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, вычислительная мощность примерно равна &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В случае хранения половины исходной матрицы матрица мощность равна &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n(n+1)/2+kn+k+1}&amp;lt;/math&amp;gt;, что приблизительно равно &amp;lt;math&amp;gt;4k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша без переортогонализации не является детерминированным (возможно выполнение меньшего числа итераций алгоритма), в случае если все собственные значения уже вычислены.&lt;br /&gt;
&lt;br /&gt;
Важное свойство метода Ланцоша состоит в том, что первыми в матрице &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; появляются собственные значения с максимальной величиной по модулю. Таким образом, метод особенно хорошо подходит для вычисления собственных значений матрицы &amp;lt;math&amp;gt;A&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;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации ===&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте IETL&amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/lanczos.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;/div&gt;</summary>
		<author><name>A.Freeman</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=15123</id>
		<title>Участник:A.Freeman/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=15123"/>
		<updated>2016-10-31T14:47:14Z</updated>

		<summary type="html">&lt;p&gt;A.Freeman: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша без переортогонализации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}+1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n+1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Основные авторы описания: [[Участник:KAKTUZ|Заспа А.Ю.]] ([[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]]),  [[Участник:A.Freeman|Фролов А.А.]] ([[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Входные и выходные данные алгоритма|1.9]], [[#Свойства алгоритма|1.10]], [[#Существующие реализации|2.7]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; был опубликовн физиком и математиком Корнелием Ланцощем в 1950 году&amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот метод является частным случаем алгоритма Арнольда в случае, если исходная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - симметрична, и был представлен как итерационный метод вычисления собственных значений симметричной матрицы. Этот метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов исходной матрицы. Хотя алгоритм и был эффективным в вычислительном смысле, но он на некоторое время был предан забвению из-за численной неустойчивости. Только в 1970 Ojalvo и Newman модифицировали алгоритм для использования в арифметике с плавающей точкой&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;. Новый метод получил название [[Алгоритм Ланцоша с полной переортогонализацией | алгоритма Ланцоша с полной переортогонализацией]]. Но эта статья про его исходную версию.&lt;br /&gt;
На вход алгоритма подается вещественная симметричная матрица  &amp;lt;math&amp;gt;A = A^{T}&amp;lt;/math&amp;gt;,&lt;br /&gt;
{{Шаблон:ASymmetric}}&lt;br /&gt;
Поэтому достаточно хранить только чуть больше половины элементов исходной матрицы.&lt;br /&gt;
&lt;br /&gt;
Сам алгоритм соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца. На каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, состоящая из ортонормированных векторов Ланцоша. А в качестве приближенных собственных значений берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k \times k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 \\&lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 \\&lt;br /&gt;
&amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных значений и собственных векторов такой матрицы значительно проще чем их вычисление для исходной матрицы. Например, они могут быть вычислены с помощью [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы| метода «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]]. В этом методе эта процедура занимает &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций, где константа оказывается на практике довольно мала.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, начальный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: собственные вектора матрицы  &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; являющиеся столбцами матрицы &amp;lt;math&amp;gt;Q_k V&amp;lt;/math&amp;gt;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
До начала первой итерации нормируется вектор начального приближения &amp;lt;math&amp;gt;q_1 = \frac{b}{\|b\|_2}&amp;lt;/math&amp;gt;. Затем задаются константы &amp;lt;math&amp;gt;\beta_0 = 0,\; q_0 = 0 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
После выполнения данных действий начинаются итерации алгоритма. Которых будет не больше чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. В ходе итераций постепенно формируется матрица &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;\alpha_i&amp;lt;/math&amp;gt;-x и &amp;lt;math&amp;gt;\beta_i&amp;lt;/math&amp;gt;-х.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации происходят следующие вычисления. Вначале вычисляется произведение матрицы на вектор &amp;lt;math&amp;gt;z = Aq_i&amp;lt;/math&amp;gt;. Затем считается скалярное произведение &amp;lt;math&amp;gt;\alpha_i = q^T_i z&amp;lt;/math&amp;gt; и значение сохраняется как элемент формируемой матрицы. После этого необходимо произвести вычисление линейной комбинации векторов &amp;lt;math&amp;gt;z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}&amp;lt;/math&amp;gt;. Норму полученного вектора запишем как элемент матрицы &amp;lt;math&amp;gt;\beta_i = \|z\|_2&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;\beta_i&amp;lt;/math&amp;gt; оказалась равной нулю, то больше никаких итераций в алгоритме не производят, сразу переходят к вычислению собственных значений и собственных векторов. Иначе, в конце итерации считают &amp;lt;math&amp;gt;q_{i+1} = \frac{z}{\beta_i}&amp;lt;/math&amp;gt; и переходят к следующей итерации.&lt;br /&gt;
&lt;br /&gt;
После всех итераций необходимо вычислить собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром на каждой итерации является вычисление произведения матрицы на вектор:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&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;
* вычисление собственных векторов и собственных значений трехдиагональной симметричной матрицы.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;1.\, \beta_0 = 0,\; q_0 = 0&amp;lt;/math&amp;gt; #Инициализируются константы&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;2.\, \|b\|_2 = \sqrt{\sum\limits_{j=1}^{n} b_j^2}&amp;lt;/math&amp;gt; #Вычисляем норму вектора начального приближения.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;3.\, q_{1_{j}} = \frac{b_{j}}{\|b\|_2}, \; j = 1,\, \dots\,, n&amp;lt;/math&amp;gt; #Нормализуем вектор начального приближения.&lt;br /&gt;
&lt;br /&gt;
Начинаются итерации цикла, которых не больше чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. На &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации производятся следующие вычисления:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.1\, z_j = \sum\limits_{m=1}^{n} a_{jm} q_{i_m}, \; j = 1,\,\dots\,, n&amp;lt;/math&amp;gt; #Считаем результат применения линейного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.2\, \alpha_i = \sum\limits_{j=1}^{n}q_{i_j} z_j&amp;lt;/math&amp;gt; #Получаем результат скалярного произведения векторов &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.3\, z_j = z_j - \alpha_i q_{i_j} - \beta_{i-1}q_{i-1_j}, \, j = 1,\,\dots\,, n&amp;lt;/math&amp;gt; #Вычисляем линейную комбинацию векторов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.4\, \beta_i = \|z\|_2 = \sqrt{\sum\limits_{j=1}^{n} z_j^2}&amp;lt;/math&amp;gt; #Считаем норму вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.5&amp;lt;/math&amp;gt; Проверка равенства &amp;lt;math&amp;gt;\beta_i == 0&amp;lt;/math&amp;gt; # Если норма оказалась равной нулю, то завершаем итерации и переходим к вычислению собственных векторов и собственных значений полученной матрицы. В обратном случае, продолжаем выполнения итераций.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.6\, q_{i+1_j} = \frac{z_j}{\beta_i}, \; j = 1,\, \dots \,, n&amp;lt;/math&amp;gt; #Нормируем вектор &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.7\,&amp;lt;/math&amp;gt; Если выполнили &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций, то завершаем выполнение итераций, переходим к следующему шагу. Иначе начинаем последующую итерацию цикла.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;4.&amp;lt;/math&amp;gt; Вычисляем собственные значения и собственные вектора полученной матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычисления &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и соответствующих им собственных векторов алгоритмом Ланцоша без переортогонализации состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и нахождения собственных значений и векторов трехдиагональной симметричной матрицы порядка &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Инициализация состоит из следующих операций:&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; операций сложений&lt;br /&gt;
** извлечение квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций делений (нормирование)&lt;br /&gt;
Каждая из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций состоит из:&lt;br /&gt;
* умножение матрицы на вектор:&lt;br /&gt;
** &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* скалярное произведение двух векторов&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сложение&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; вычитаний&lt;br /&gt;
* норма вектора:&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&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; операций деления&lt;br /&gt;
&lt;br /&gt;
Итого (без учета решения трехдиагональной матрицы):&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2 + 4n) + n &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2+3n-2) +  n-1&amp;lt;/math&amp;gt; сложений/вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt; kn + n &amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; вычислений квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Для нахождение собственных значений и векторов трехдиагональной симметричной матрицы эффективней всего использовать [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы | метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]], который требует &amp;lt;math&amp;gt; O(k^3) &amp;lt;/math&amp;gt; операций.&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метод Ланцоша без переортогонализации относится к алгоритмам &#039;&#039;с квадратичной сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[Файл:Ланцош без переортогонализации 1.png|600px|thumb|center|Рисунок 1. Граф алгоритма без отображения входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt;  — операция деления, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\cdot &amp;lt;/math&amp;gt;  — операция умножения, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов, &amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;  — линейный оператор, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\nabla&amp;lt;/math&amp;gt; — условие преждевременного выхода.]]&lt;br /&gt;
 |[[Файл:Ланцош без переортогонализации 2.png|600px|thumb|center|Рисунок 2. Граф алгоритма с отображением входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt;  — операция деления,  &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\cdot &amp;lt;/math&amp;gt;  — операция умножения,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов,  &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;  — линейный оператор, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\nabla&amp;lt;/math&amp;gt; — условие преждевременного выхода,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{In}&amp;lt;/math&amp;gt; — входные данные, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Out}&amp;lt;/math&amp;gt; — выходные результат.]]&lt;br /&gt;
|}&lt;br /&gt;
[[Файл:Линейный_оператор.png|600px|thumb|center|Рисунок 3. Граф линейного оператора без отображения входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt;  — операция умножения двух коэффициентов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;  — операция сложения.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша в параллельной форме состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и вычисления собственных значений матрицы &amp;lt;math&amp;gt;T_k&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;\log n&amp;lt;/math&amp;gt; и линейную ширину ярусов &amp;lt;math&amp;gt;\frac{n}{2}, \frac{n}{4}, ... , 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Инициализации состоит из следующих операций:&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** вычисление скалярного произведения вектора самого на себя:&lt;br /&gt;
*** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итерационная часть алгоритма состоит из следующих операций:&lt;br /&gt;
* умножение матрицы на число:&lt;br /&gt;
** ярус умножений с шириной &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log n&amp;lt;/math&amp;gt; ярусов с наибольшей шириной &amp;lt;math&amp;gt;\frac{n^2}{2}&amp;lt;/math&amp;gt; (блок вычисления n сумм n элементов)&lt;br /&gt;
* вычисление скалярного произведения двух векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt;&lt;br /&gt;
** два яруса сложений шириной &amp;lt;math&amp;gt;n&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;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с максимальной шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, в параллельном варианте основную долю времени будут занимать операции сложения при умножении матрицы на вектор.&lt;br /&gt;
При классификации по высоте ЯПФ Алгоритм Ланцоша относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;. При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}, i \geq j&amp;lt;/math&amp;gt;), число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n + 1)}{2} + 1&amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/поддиагональные элементы, единица относится к параметру &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
по &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;k+kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является субквадратичным: &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша без переортогонализации не является детерминированным (возможно выполнение меньшего числа итераций алгоритма), в случае если все собственные значения уже вычислены.&lt;br /&gt;
&lt;br /&gt;
Важное свойство метода Ланцоша состоит в том, что первыми в матрице &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; появляются собственные значения с максимальной величиной по модулю. Таким образом, метод особенно хорошо подходит для вычисления собственных значений матрицы &amp;lt;math&amp;gt;A&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;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации ===&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте IETL&amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/lanczos.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;/div&gt;</summary>
		<author><name>A.Freeman</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=15122</id>
		<title>Участник:A.Freeman/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=15122"/>
		<updated>2016-10-31T14:42:08Z</updated>

		<summary type="html">&lt;p&gt;A.Freeman: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша без переортогонализации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}+1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n+1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Основные авторы описания: [[Участник:KAKTUZ|Заспа А.Ю.]] ([[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]]),  [[Участник:A.Freeman|Фролов А.А.]] ([[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Входные и выходные данные алгоритма|1.9]], [[#Свойства алгоритма|1.10]], [[#Существующие реализации|2.7]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; был опубликовн физиком и математиком Корнелием Ланцощем в 1950 году&amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот метод является частным случаем алгоритма Арнольда в случае, если исходная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - симметрична, и был представлен как итерационный метод вычисления собственных значений симметричной матрицы. Этот метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов исходной матрицы. Хотя алгоритм и был эффективным в вычислительном смысле, но он на некоторое время был предан забвению из-за численной неустойчивости. Только в 1970 Ojalvo и Newman модифицировали алгоритм для использования в арифметике с плавающей точкой&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;. Новый метод получил название [[Алгоритм Ланцоша с полной переортогонализацией | алгоритма Ланцоша с полной переортогонализацией]]. Но эта статья про его исходную версию.&lt;br /&gt;
На вход алгоритма подается вещественная симметричная матрица  &amp;lt;math&amp;gt;A = A^{T}&amp;lt;/math&amp;gt;,&lt;br /&gt;
{{Шаблон:ASymmetric}}&lt;br /&gt;
Поэтому достаточно хранить только чуть больше половины элементов исходной матрицы.&lt;br /&gt;
&lt;br /&gt;
Сам алгоритм соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца. На каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, состоящая из ортонормированных векторов Ланцоша. А в качестве приближенных собственных значений берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k \times k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 \\&lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 \\&lt;br /&gt;
&amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных значений и собственных векторов такой матрицы значительно проще чем их вычисление для исходной матрицы. Например, они могут быть вычислены с помощью [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы| метода «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]]. В этом методе эта процедура занимает &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций, где константа оказывается на практике довольно мала.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, начальный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: собственные вектора матрицы  &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; являющиеся столбцами матрицы &amp;lt;math&amp;gt;Q_k V&amp;lt;/math&amp;gt;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
До начала первой итерации нормируется вектор начального приближения &amp;lt;math&amp;gt;q_1 = \frac{b}{\|b\|_2}&amp;lt;/math&amp;gt;. Затем задаются константы &amp;lt;math&amp;gt;\beta_0 = 0,\; q_0 = 0 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
После выполнения данных действий начинаются итерации алгоритма. Которых будет не больше чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. В ходе итераций постепенно формируется матрица &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;\alpha_i&amp;lt;/math&amp;gt;-x и &amp;lt;math&amp;gt;\beta_i&amp;lt;/math&amp;gt;-х.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации происходят следующие вычисления. Вначале вычисляется произведение матрицы на вектор &amp;lt;math&amp;gt;z = Aq_i&amp;lt;/math&amp;gt;. Затем считается скалярное произведение &amp;lt;math&amp;gt;\alpha_i = q^T_i z&amp;lt;/math&amp;gt; и значение сохраняется как элемент формируемой матрицы. После этого необходимо произвести вычисление линейной комбинации векторов &amp;lt;math&amp;gt;z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}&amp;lt;/math&amp;gt;. Норму полученного вектора запишем как элемент матрицы &amp;lt;math&amp;gt;\beta_i = \|z\|_2&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;\beta_i&amp;lt;/math&amp;gt; оказалась равной нулю, то больше никаких итераций в алгоритме не производят, сразу переходят к вычислению собственных значений и собственных векторов. Иначе, в конце итерации считают &amp;lt;math&amp;gt;q_{i+1} = \frac{z}{\beta_i}&amp;lt;/math&amp;gt; и переходят к следующей итерации.&lt;br /&gt;
&lt;br /&gt;
После всех итераций необходимо вычислить собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром на каждой итерации является вычисление произведения матрицы на вектор:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&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;
* вычисление собственных векторов и собственных значений трехдиагональной симметричной матрицы.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;1.\, \beta_0 = 0,\; q_0 = 0&amp;lt;/math&amp;gt; #Инициализируются константы&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;2.\, \|b\|_2 = \sqrt{\sum\limits_{j=1}^{n} b_j^2}&amp;lt;/math&amp;gt; #Вычисляем норму вектора начального приближения.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;3.\, q_{1_{j}} = \frac{b_{j}}{\|b\|_2}, \; j = 1,\, \dots\,, n&amp;lt;/math&amp;gt; #Нормализуем вектор начального приближения.&lt;br /&gt;
&lt;br /&gt;
Начинаются итерации цикла, которых не больше чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. На &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации производятся следующие вычисления:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.1\, z_j = \sum\limits_{m=1}^{n} a_{jm} q_{i_m}, \; j = 1,\,\dots\,, n&amp;lt;/math&amp;gt; #Считаем результат применения линейного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.2\, \alpha_i = \sum\limits_{j=1}^{n}q_{i_j} z_j&amp;lt;/math&amp;gt; #Получаем результат скалярного произведения векторов &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.3\, z_j = z_j - \alpha_i q_{i_j} - \beta_{i-1}q_{i-1_j}, \, j = 1,\,\dots\,, n&amp;lt;/math&amp;gt; #Вычисляем линейную комбинацию векторов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.4\, \beta_i = \|z\|_2 = \sqrt{\sum\limits_{j=1}^{n} z_j^2}&amp;lt;/math&amp;gt; #Считаем норму вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.5&amp;lt;/math&amp;gt; Проверка равенства &amp;lt;math&amp;gt;\beta_i == 0&amp;lt;/math&amp;gt; # Если норма оказалась равной нулю, то завершаем итерации и переходим к вычислению собственных векторов и собственных значений полученной матрицы. В обратном случае, продолжаем выполнения итераций.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.6\, q_{i+1_j} = \frac{z_j}{\beta_i}, \; j = 1,\, \dots \,, n&amp;lt;/math&amp;gt; #Нормируем вектор &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.7\,&amp;lt;/math&amp;gt; Если выполнили &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций, то завершаем выполнение итераций, переходим к следующему шагу. Иначе начинаем последующую итерацию цикла.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;4.&amp;lt;/math&amp;gt; Вычисляем собственные значения и собственные вектора полученной матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычисления &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и соответствующих им собственных векторов алгоритмом Ланцоша без переортогонализации состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и нахождения собственных значений и векторов трехдиагональной симметричной матрицы порядка &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Инициализация состоит из следующих операций:&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; операций сложений&lt;br /&gt;
** извлечение квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций делений (нормирование)&lt;br /&gt;
Каждая из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций состоит из:&lt;br /&gt;
* умножение матрицы на вектор:&lt;br /&gt;
** &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* скалярное произведение двух векторов&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сложение&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; вычитаний&lt;br /&gt;
* норма вектора:&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&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; операций деления&lt;br /&gt;
&lt;br /&gt;
Итого (без учета решения трехдиагональной матрицы):&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2 + 4n) + n &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2+3n-2) +  n-1&amp;lt;/math&amp;gt; сложений/вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt; kn + n &amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; вычислений квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Для нахождение собственных значений и векторов трехдиагональной симметричной матрицы эффективней всего использовать [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы | метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]], который требует &amp;lt;math&amp;gt; O(k^3) &amp;lt;/math&amp;gt; операций.&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метод Ланцоша без переортогонализации относится к алгоритмам &#039;&#039;с квадратичной сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[Файл:Ланцош без переортогонализации 1.png|600px|thumb|center|Рисунок 1. Граф алгоритма без отображения входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt;  — операция деления, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\cdot &amp;lt;/math&amp;gt;  — операция умножения, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов, &amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;  — линейный оператор.]]&lt;br /&gt;
 |[[Файл:Ланцош без переортогонализации 2.png|600px|thumb|center|Рисунок 2. Граф алгоритма с отображением входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt;  — операция деления,  &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\cdot &amp;lt;/math&amp;gt;  — операция умножения,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов,  &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;  — линейный оператор,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{In}&amp;lt;/math&amp;gt; — входные данные, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Out}&amp;lt;/math&amp;gt; — выходные результат.]]&lt;br /&gt;
|}&lt;br /&gt;
[[Файл:Линейный_оператор.png|600px|thumb|center|Рисунок 3. Граф линейного оператора без отображения входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt;  — операция умножения двух коэффициентов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;  — операция сложения.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша в параллельной форме состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и вычисления собственных значений матрицы &amp;lt;math&amp;gt;T_k&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;\log n&amp;lt;/math&amp;gt; и линейную ширину ярусов &amp;lt;math&amp;gt;\frac{n}{2}, \frac{n}{4}, ... , 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Инициализации состоит из следующих операций:&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** вычисление скалярного произведения вектора самого на себя:&lt;br /&gt;
*** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итерационная часть алгоритма состоит из следующих операций:&lt;br /&gt;
* умножение матрицы на число:&lt;br /&gt;
** ярус умножений с шириной &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log n&amp;lt;/math&amp;gt; ярусов с наибольшей шириной &amp;lt;math&amp;gt;\frac{n^2}{2}&amp;lt;/math&amp;gt; (блок вычисления n сумм n элементов)&lt;br /&gt;
* вычисление скалярного произведения двух векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt;&lt;br /&gt;
** два яруса сложений шириной &amp;lt;math&amp;gt;n&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;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с максимальной шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, в параллельном варианте основную долю времени будут занимать операции сложения при умножении матрицы на вектор.&lt;br /&gt;
При классификации по высоте ЯПФ Алгоритм Ланцоша относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;. При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}, i \geq j&amp;lt;/math&amp;gt;), число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n + 1)}{2} + 1&amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/поддиагональные элементы, единица относится к параметру &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
по &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;k+kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является субквадратичным: &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша без переортогонализации не является детерминированным (возможно выполнение меньшего числа итераций алгоритма), в случае если все собственные значения уже вычислены.&lt;br /&gt;
&lt;br /&gt;
Важное свойство метода Ланцоша состоит в том, что первыми в матрице &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; появляются собственные значения с максимальной величиной по модулю. Таким образом, метод особенно хорошо подходит для вычисления собственных значений матрицы &amp;lt;math&amp;gt;A&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;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации ===&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте IETL&amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/lanczos.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;/div&gt;</summary>
		<author><name>A.Freeman</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=15050</id>
		<title>Участник:A.Freeman/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=15050"/>
		<updated>2016-10-31T11:53:13Z</updated>

		<summary type="html">&lt;p&gt;A.Freeman: Отмена правки 13960, сделанной участником ASA (обс.)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша без переортогонализации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}+1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n+1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Основные авторы описания: [[Участник:KAKTUZ|Заспа А.Ю.]] ([[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]]),  [[Участник:A.Freeman|Фролов А.А.]] ([[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Входные и выходные данные алгоритма|1.9]], [[#Свойства алгоритма|1.10]], [[#Существующие реализации|2.7]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; был опубликовн физиком и математиком Корнелием Ланцощем в 1950 году&amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот метод является частным случаем алгоритма Арнольда в случае, если исходная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - симметрична, и был представлен как итерационный метод вычисления собственных значений симметричной матрицы. Этот метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов исходной матрицы. Хотя алгоритм и был эффективным в вычислительном смысле, но он на некоторое время был предан забвению из-за численной неустойчивости. Только в 1970 Ojalvo и Newman модифицировали алгоритм для использования в арифметике с плавающей точкой&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;. Новый метод получил название [[Алгоритм Ланцоша с полной переортогонализацией | алгоритма Ланцоша с полной переортогонализацией]]. Но эта статья про его исходную версию.&lt;br /&gt;
На вход алгоритма подается вещественная симметричная матрица  &amp;lt;math&amp;gt;A = A^{T}&amp;lt;/math&amp;gt;,&lt;br /&gt;
{{Шаблон:ASymmetric}}&lt;br /&gt;
Поэтому достаточно хранить только чуть больше половины элементов исходной матрицы.&lt;br /&gt;
&lt;br /&gt;
Сам алгоритм соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца. На каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, состоящая из ортонормированных векторов Ланцоша. А в качестве приближенных собственных значений берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k \times k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 \\&lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 \\&lt;br /&gt;
&amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных значений и собственных векторов такой матрицы значительно проще чем их вычисление для исходной матрицы. Например, они могут быть вычислены с помощью [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы| метода «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]]. В этом методе эта процедура занимает &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций, где константа оказывается на практике довольно мала.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, начальный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: собственные вектора матрицы  &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; являющиеся столбцами матрицы &amp;lt;math&amp;gt;Q_k V&amp;lt;/math&amp;gt;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
До начала первой итерации нормируется вектор начального приближения &amp;lt;math&amp;gt;q_1 = \frac{b}{\|b\|_2}&amp;lt;/math&amp;gt;. Затем задаются константы &amp;lt;math&amp;gt;\beta_0 = 0,\; q_0 = 0 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
После выполнения данных действий начинаются итерации алгоритма. Которых будет не больше чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. В ходе итераций постепенно формируется матрица &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;\alpha_i&amp;lt;/math&amp;gt;-x и &amp;lt;math&amp;gt;\beta_i&amp;lt;/math&amp;gt;-х.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации происходят следующие вычисления. Вначале вычисляется произведение матрицы на вектор &amp;lt;math&amp;gt;z = Aq_i&amp;lt;/math&amp;gt;. Затем считается скалярное произведение &amp;lt;math&amp;gt;\alpha_i = q^T_i z&amp;lt;/math&amp;gt; и значение сохраняется как элемент формируемой матрицы. После этого необходимо произвести вычисление линейной комбинации векторов &amp;lt;math&amp;gt;z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}&amp;lt;/math&amp;gt;. Норму полученного вектора запишем как элемент матрицы &amp;lt;math&amp;gt;\beta_i = \|z\|_2&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;\beta_i&amp;lt;/math&amp;gt; оказалась равной нулю, то больше никаких итераций в алгоритме не производят, сразу переходят к вычислению собственных значений и собственных векторов. Иначе, в конце итерации считают &amp;lt;math&amp;gt;q_{i+1} = \frac{z}{\beta_i}&amp;lt;/math&amp;gt; и переходят к следующей итерации.&lt;br /&gt;
&lt;br /&gt;
После всех итераций необходимо вычислить собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром на каждой итерации является вычисление произведения матрицы на вектор:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&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;
* вычисление собственных векторов и собственных значений трехдиагональной симметричной матрицы.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;1.\, \beta_0 = 0,\; q_0 = 0&amp;lt;/math&amp;gt; #Инициализируются константы&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;2.\, \|b\|_2 = \sqrt{\sum\limits_{j=1}^{n} b_j^2}&amp;lt;/math&amp;gt; #Вычисляем норму вектора начального приближения.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;3.\, q_{1_{j}} = \frac{b_{j}}{\|b\|_2}, \; j = 1,\, \dots\,, n&amp;lt;/math&amp;gt; #Нормализуем вектор начального приближения.&lt;br /&gt;
&lt;br /&gt;
Начинаются итерации цикла, которых не больше чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. На &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации производятся следующие вычисления:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.1\, z_j = \sum\limits_{m=1}^{n} a_{jm} q_{i_m}, \; j = 1,\,\dots\,, n&amp;lt;/math&amp;gt; #Считаем результат применения линейного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.2\, \alpha_i = \sum\limits_{j=1}^{n}q_{i_j} z_j&amp;lt;/math&amp;gt; #Получаем результат скалярного произведения векторов &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.3\, z_j = z_j - \alpha_i q_{i_j} - \beta_{i-1}q_{i-1_j}, \, j = 1,\,\dots\,, n&amp;lt;/math&amp;gt; #Вычисляем линейную комбинацию векторов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.4\, \beta_i = \|z\|_2 = \sqrt{\sum\limits_{j=1}^{n} z_j^2}&amp;lt;/math&amp;gt; #Считаем норму вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.5&amp;lt;/math&amp;gt; Проверка равенства &amp;lt;math&amp;gt;\beta_i == 0&amp;lt;/math&amp;gt; # Если норма оказалась равной нулю, то завершаем итерации и переходим к вычислению собственных векторов и собственных значений полученной матрицы. В обратном случае, продолжаем выполнения итераций.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.6\, q_{i+1_j} = \frac{z_j}{\beta_i}, \; j = 1,\, \dots \,, n&amp;lt;/math&amp;gt; #Нормируем вектор &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.7\,&amp;lt;/math&amp;gt; Если выполнили &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций, то завершаем выполнение итераций, переходим к следующему шагу. Иначе начинаем последующую итерацию цикла.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;4.&amp;lt;/math&amp;gt; Вычисляем собственные значения и собственные вектора полученной матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычисления &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и соответствующих им собственных векторов алгоритмом Ланцоша без переортогонализации состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и нахождения собственных значений и векторов трехдиагональной симметричной матрицы порядка &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Инициализация состоит из следующих операций:&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; операций сложений&lt;br /&gt;
** извлечение квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций делений (нормирование)&lt;br /&gt;
Каждая из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций состоит из:&lt;br /&gt;
* умножение матрицы на вектор:&lt;br /&gt;
** &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* скалярное произведение двух векторов&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сложение&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; вычитаний&lt;br /&gt;
* норма вектора:&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&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; операций деления&lt;br /&gt;
&lt;br /&gt;
Итого (без учета решения трехдиагональной матрицы):&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2 + 4n) + n &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2+3n-2) +  n-1&amp;lt;/math&amp;gt; сложений/вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt; kn + n &amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; вычислений квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Для нахождение собственных значений и векторов трехдиагональной симметричной матрицы эффективней всего использовать [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы | метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]], который требует &amp;lt;math&amp;gt; O(k^3) &amp;lt;/math&amp;gt; операций.&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метод Ланцоша без переортогонализации относится к алгоритмам &#039;&#039;с квадратичной сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[Файл:Ланцош без переортогонализации 1.png|600px|thumb|center|Рисунок 1. Граф алгоритма без отображения входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt;  — операция деления, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\cdot &amp;lt;/math&amp;gt;  — операция умножения, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов, &amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;  — линейный оператор.]]&lt;br /&gt;
 |[[Файл:Ланцош без переортогонализации 2.png|600px|thumb|center|Рисунок 2. Граф алгоритма с отображением входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt;  — операция деления,  &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\cdot &amp;lt;/math&amp;gt;  — операция умножения,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов,  &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;  — линейный операторя,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{In}&amp;lt;/math&amp;gt; — входные данные, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Out}&amp;lt;/math&amp;gt; — выходные результат.]]&lt;br /&gt;
|}&lt;br /&gt;
[[Файл:Линейный_оператор.png|600px|thumb|center|Рисунок 3. Граф линейного оператора без отображения входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt;  — операция умножения двух коэффициентов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;  — операция сложения.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша в параллельной форме состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и вычисления собственных значений матрицы &amp;lt;math&amp;gt;T_k&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;\log n&amp;lt;/math&amp;gt; и линейную ширину ярусов &amp;lt;math&amp;gt;\frac{n}{2}, \frac{n}{4}, ... , 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Инициализации состоит из следующих операций:&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** вычисление скалярного произведения вектора самого на себя:&lt;br /&gt;
*** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итерационная часть алгоритма состоит из следующих операций:&lt;br /&gt;
* умножение матрицы на число:&lt;br /&gt;
** ярус умножений с шириной &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log n&amp;lt;/math&amp;gt; ярусов с наибольшей шириной &amp;lt;math&amp;gt;\frac{n^2}{2}&amp;lt;/math&amp;gt; (блок вычисления n сумм n элементов)&lt;br /&gt;
* вычисление скалярного произведения двух векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt;&lt;br /&gt;
** два яруса сложений шириной &amp;lt;math&amp;gt;n&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;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с максимальной шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, в параллельном варианте основную долю времени будут занимать операции сложения при умножении матрицы на вектор.&lt;br /&gt;
При классификации по высоте ЯПФ Алгоритм Ланцоша относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;. При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}, i \geq j&amp;lt;/math&amp;gt;), число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n + 1)}{2} + 1&amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/поддиагональные элементы, единица относится к параметру &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
по &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;k+kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является субквадратичным: &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша без переортогонализации не является детерминированным (возможно выполнение меньшего числа итераций алгоритма), в случае если все собственные значения уже вычислены.&lt;br /&gt;
&lt;br /&gt;
Важное свойство метода Ланцоша состоит в том, что первыми в матрице &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; появляются собственные значения с максимальной величиной по модулю. Таким образом, метод особенно хорошо подходит для вычисления собственных значений матрицы &amp;lt;math&amp;gt;A&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;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации ===&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте IETL&amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/lanczos.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;/div&gt;</summary>
		<author><name>A.Freeman</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=15035</id>
		<title>Участник:A.Freeman/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=15035"/>
		<updated>2016-10-31T11:34:22Z</updated>

		<summary type="html">&lt;p&gt;A.Freeman: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша без переортогонализации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}+1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n+1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Основные авторы описания: [[Участник:KAKTUZ|Заспа А.Ю.]] ([[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]]),  [[Участник:A.Freeman|Фролов А.А.]] ([[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Входные и выходные данные алгоритма|1.9]], [[#Свойства алгоритма|1.10]], [[#Существующие реализации|2.7]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; был опубликовн физиком и математиком Корнелием Ланцощем в 1950 году&amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот метод является частным случаем алгоритма Арнольда в случае, если исходная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - симметрична, и был представлен как итерационный метод вычисления собственных значений симметричной матрицы. Этот метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов исходной матрицы. Хотя алгоритм и был эффективным в вычислительном смысле, но он на некоторое время был предан забвению из-за численной неустойчивости. Только в 1970 Ojalvo и Newman модифицировали алгоритм для использования в арифметике с плавающей точкой&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;. Новый метод получил название [[Алгоритм Ланцоша с полной переортогонализацией | алгоритма Ланцоша с полной переортогонализацией]]. Но эта статья про его исходную версию.&lt;br /&gt;
На вход алгоритма подается вещественная симметричная матрица  &amp;lt;math&amp;gt;A = A^{T}&amp;lt;/math&amp;gt;,&lt;br /&gt;
{{Шаблон:ASymmetric}}&lt;br /&gt;
Поэтому достаточно хранить только чуть больше половины элементов исходной матрицы.&lt;br /&gt;
&lt;br /&gt;
Сам алгоритм соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца. На каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, состоящая из ортонормированных векторов Ланцоша. А в качестве приближенных собственных значений берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k \times k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 \\&lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 \\&lt;br /&gt;
&amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных значений и собственных векторов такой матрицы значительно проще чем их вычисление для исходной матрицы. Например, они могут быть вычислены с помощью [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы| метода «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]]. В этом методе эта процедура занимает &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций, где константа оказывается на практике довольно мала.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, начальный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: собственные вектора матрицы  &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; являющиеся столбцами матрицы &amp;lt;math&amp;gt;Q_k V&amp;lt;/math&amp;gt;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
До начала первой итерации нормируется вектор начального приближения &amp;lt;math&amp;gt;q_1 = \frac{b}{\|b\|_2}&amp;lt;/math&amp;gt;. Затем задаются константы &amp;lt;math&amp;gt;\beta_0 = 0,\; q_0 = 0 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
После выполнения данных действий начинаются итерации алгоритма. Которых будет не больше чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. В ходе итераций постепенно формируется матрица &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;\alpha_i&amp;lt;/math&amp;gt;-x и &amp;lt;math&amp;gt;\beta_i&amp;lt;/math&amp;gt;-х.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации происходят следующие вычисления. Вначале вычисляется произведение матрицы на вектор &amp;lt;math&amp;gt;z = Aq_i&amp;lt;/math&amp;gt;. Затем считается скалярное произведение &amp;lt;math&amp;gt;\alpha_i = q^T_i z&amp;lt;/math&amp;gt; и значение сохраняется как элемент формируемой матрицы. После этого необходимо произвести вычисление линейной комбинации векторов &amp;lt;math&amp;gt;z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}&amp;lt;/math&amp;gt;. Норму полученного вектора запишем как элемент матрицы &amp;lt;math&amp;gt;\beta_i = \|z\|_2&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;\beta_i&amp;lt;/math&amp;gt; оказалась равной нулю, то больше никаких итераций в алгоритме не производят, сразу переходят к вычислению собственных значений и собственных векторов. Иначе, в конце итерации считают &amp;lt;math&amp;gt;q_{i+1} = \frac{z}{\beta_i}&amp;lt;/math&amp;gt; и переходят к следующей итерации.&lt;br /&gt;
&lt;br /&gt;
После всех итераций необходимо вычислить собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром на каждой итерации является вычисление произведения матрицы на вектор:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&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;
* вычисление собственных векторов и собственных значений трехдиагональной симметричной матрицы.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;1.\, \beta_0 = 0,\; q_0 = 0&amp;lt;/math&amp;gt; #Инициализируются константы&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;2.\, \|b\|_2 = \sqrt{\sum\limits_{j=1}^{n} b_j^2}&amp;lt;/math&amp;gt; #Вычисляем норму вектора начального приближения.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;3.\, q_{1_{j}} = \frac{b_{j}}{\|b\|_2}, \; j = 1,\, \dots\,, n&amp;lt;/math&amp;gt; #Нормализуем вектор начального приближения.&lt;br /&gt;
&lt;br /&gt;
Начинаются итерации цикла, которых не больше чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. На &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации производятся следующие вычисления:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.1\, z_j = \sum\limits_{m=1}^{n} a_{jm} q_{i_m}, \; j = 1,\,\dots\,, n&amp;lt;/math&amp;gt; #Считаем результат применения линейного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.2\, \alpha_i = \sum\limits_{j=1}^{n}q_{i_j} z_j&amp;lt;/math&amp;gt; #Получаем результат скалярного произведения векторов &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.3\, z_j = z_j - \alpha_i q_{i_j} - \beta_{i-1}q_{i-1_j}, \, j = 1,\,\dots\,, n&amp;lt;/math&amp;gt; #Вычисляем линейную комбинацию векторов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.4\, \beta_i = \|z\|_2 = \sqrt{\sum\limits_{j=1}^{n} z_j^2}&amp;lt;/math&amp;gt; #Считаем норму вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.5&amp;lt;/math&amp;gt; Проверка равенства &amp;lt;math&amp;gt;\beta_i == 0&amp;lt;/math&amp;gt; # Если норма оказалась равной нулю, то завершаем итерации и переходим к вычислению собственных векторов и собственных значений полученной матрицы. В обратном случае, продолжаем выполнения итераций.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.6\, q_{i+1_j} = \frac{z_j}{\beta_i}, \; j = 1,\, \dots \,, n&amp;lt;/math&amp;gt; #Нормируем вектор &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.7\,&amp;lt;/math&amp;gt; Если выполнили &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций, то завершаем выполнение итераций, переходим к следующему шагу. Иначе начинаем последующую итерацию цикла.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;4.&amp;lt;/math&amp;gt; Вычисляем собственные значения и собственные вектора полученной матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычисления &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и соответствующих им собственных векторов алгоритмом Ланцоша без переортогонализации состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и нахождения собственных значений и векторов трехдиагональной симметричной матрицы порядка &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Инициализация состоит из следующих операций:&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; операций сложений&lt;br /&gt;
** извлечение квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций делений (нормирование)&lt;br /&gt;
Каждая из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций состоит из:&lt;br /&gt;
* умножение матрицы на вектор:&lt;br /&gt;
** &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* скалярное произведение двух векторов&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сложение&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; вычитаний&lt;br /&gt;
* норма вектора:&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&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; операций деления&lt;br /&gt;
&lt;br /&gt;
Итого (без учета решения трехдиагональной матрицы):&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2 + 4n) + n &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2+3n-2) +  n-1&amp;lt;/math&amp;gt; сложений/вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt; kn + n &amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; вычислений квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Для нахождение собственных значений и векторов трехдиагональной симметричной матрицы эффективней всего использовать [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы | метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]], который требует &amp;lt;math&amp;gt; O(k^3) &amp;lt;/math&amp;gt; операций.&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метод Ланцоша без переортогонализации относится к алгоритмам &#039;&#039;с квадратичной сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[Файл:Ланцош без переортогонализации 1.png|600px|thumb|center|Рисунок 1. Граф алгоритма без отображения входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt;  — операция деления, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\cdot &amp;lt;/math&amp;gt;  — операция умножения, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов, &amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;  — линейный оператор.]]&lt;br /&gt;
 |[[Файл:Ланцош без переортогонализации 2.png|600px|thumb|center|Рисунок 2. Граф алгоритма с отображением входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt;  — операция деления,  &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\cdot &amp;lt;/math&amp;gt;  — операция умножения,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов,  &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;  — линейный операторя,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{In}&amp;lt;/math&amp;gt; — входные данные, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Out}&amp;lt;/math&amp;gt; — выходные результат.]]&lt;br /&gt;
|}&lt;br /&gt;
[[Файл:Линейный_оператор.png|600px|thumb|center|Рисунок 3. Граф линейного оператора без отображения входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt;  — операция умножения двух коэффициентов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;  — операция сложения.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша в параллельной форме состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и вычисления собственных значений матрицы &amp;lt;math&amp;gt;T_k&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;\log n&amp;lt;/math&amp;gt; и линейную ширину ярусов &amp;lt;math&amp;gt;\frac{n}{2}, \frac{n}{4}, ... , 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Инициализации состоит из следующих операций:&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** вычисление скалярного произведения вектора самого на себя:&lt;br /&gt;
*** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итерационная часть алгоритма состоит из следующих операций:&lt;br /&gt;
* умножение матрицы на число:&lt;br /&gt;
** ярус умножений с шириной &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log n&amp;lt;/math&amp;gt; ярусов с наибольшей шириной &amp;lt;math&amp;gt;\frac{n^2}{2}&amp;lt;/math&amp;gt; (блок вычисления n сумм n элементов)&lt;br /&gt;
* вычисление скалярного произведения двух векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt;&lt;br /&gt;
** два яруса сложений шириной &amp;lt;math&amp;gt;n&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;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с максимальной шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, в параллельном варианте основную долю времени будут занимать операции сложения при умножении матрицы на вектор.&lt;br /&gt;
При классификации по высоте ЯПФ Алгоритм Ланцоша относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;. При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}, i \geq j&amp;lt;/math&amp;gt;), число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n + 1)}{2} + 1&amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/поддиагональные элементы, единица относится к параметру &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
по &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;k+kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является субквадратичным: &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша без переортогонализации не является детерминированным (возможно выполнение меньшего числа итераций алгоритма), в случае если все собственные значения уже вычислены.&lt;br /&gt;
&lt;br /&gt;
Важное свойство метода Ланцоша состоит в том, что первыми в матрице &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; появляются собственные значения с максимальной величиной по модулю. Таким образом, метод особенно хорошо подходит для вычисления собственных значений матрицы &amp;lt;math&amp;gt;A&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;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации ===&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте IETL&amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/lanczos.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;/div&gt;</summary>
		<author><name>A.Freeman</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=15034</id>
		<title>Участник:A.Freeman/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=15034"/>
		<updated>2016-10-31T11:33:47Z</updated>

		<summary type="html">&lt;p&gt;A.Freeman: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша без переортогонализации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}+1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n+1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Основные авторы описания: [[Участник:KAKTUZ|Заспа А.Ю.]] ([[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]]),  [[Участник:A.Freeman|Фролов А.А.]] ([[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Входные и выходные данные алгоритма|1.9]], [[#Свойства алгоритма|1.10]], [[#Существующие реализации|2.7]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; был опубликовн физиком и математиком Корнелием Ланцощем в 1950 году&amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот метод является частным случаем алгоритма Арнольда в случае, если исходная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - симметрична, и был представлен как итерационный метод вычисления собственных значений симметричной матрицы. Этот метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов исходной матрицы. Хотя алгоритм и был эффективным в вычислительном смысле, но он на некоторое время был предан забвению из-за численной неустойчивости. Только в 1970 Ojalvo и Newman модифицировали алгоритм для использования в арифметике с плавающей точкой&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;. Новый метод получил название [[Алгоритм Ланцоша с полной переортогонализацией | алгоритма Ланцоша с полной переортогонализацией]]. Но эта статья про его исходную версию.&lt;br /&gt;
На вход алгоритма подается вещественная симметричная матрица  &amp;lt;math&amp;gt;A = A^{T}&amp;lt;/math&amp;gt;,&lt;br /&gt;
{{Шаблон:ASymmetric}}&lt;br /&gt;
Поэтому достаточно хранить только чуть больше половины элементов исходной матрицы.&lt;br /&gt;
&lt;br /&gt;
Сам алгоритм соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца. На каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, состоящая из ортонормированных векторов Ланцоша. А в качестве приближенных собственных значений берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k \times k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 \\&lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 \\&lt;br /&gt;
&amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных значений и собственных векторов такой матрицы значительно проще чем их вычисление для исходной матрицы. Например, они могут быть вычислены с помощью [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы| метода «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]]. В этом методе эта процедура занимает &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций, где константа оказывается на практике довольно мала.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, начальный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: собственные вектора матрицы  &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; являющиеся столбцами матрицы &amp;lt;math&amp;gt;Q_k V&amp;lt;/math&amp;gt;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
До начала первой итерации нормируется вектор начального приближения &amp;lt;math&amp;gt;q_1 = \frac{b}{\|b\|_2}&amp;lt;/math&amp;gt;. Затем задаются константы &amp;lt;math&amp;gt;\beta_0 = 0,\; q_0 = 0 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
После выполнения данных действий начинаются итерации алгоритма. Которых будет не больше чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. В ходе итераций постепенно формируется матрица &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;\alpha_i&amp;lt;/math&amp;gt;-x и &amp;lt;math&amp;gt;\beta_i&amp;lt;/math&amp;gt;-х.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации происходят следующие вычисления. Вначале вычисляется произведение матрицы на вектор &amp;lt;math&amp;gt;z = Aq_i&amp;lt;/math&amp;gt;. Затем считается скалярное произведение &amp;lt;math&amp;gt;\alpha_i = q^T_i z&amp;lt;/math&amp;gt; и значение сохраняется как элемент формируемой матрицы. После этого необходимо произвести вычисление линейной комбинации векторов &amp;lt;math&amp;gt;z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}&amp;lt;/math&amp;gt;. Норму полученного вектора запишем как элемент матрицы &amp;lt;math&amp;gt;\beta_i = \|z\|_2&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;\beta_i&amp;lt;/math&amp;gt; оказалась равной нулю, то больше никаких итераций в алгоритме не производят, сразу переходят к вычислению собственных значений и собственных векторов. Иначе, в конце итерации считают &amp;lt;math&amp;gt;q_{i+1} = \frac{z}{\beta_i}&amp;lt;/math&amp;gt; и переходят к следующей итерации.&lt;br /&gt;
&lt;br /&gt;
После всех итераций необходимо вычислить собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром на каждой итерации является вычисление произведения матрицы на вектор:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&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;
* вычисление собственных векторов и собственных значений трехдиагональной симметричной матрицы.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;1.\, \beta_0 = 0,\; q_0 = 0&amp;lt;/math&amp;gt; #Инициализируются константы&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;2.\, \|b\|_2 = \sqrt{\sum\limits_{j=1}^{n} b_j^2}&amp;lt;/math&amp;gt; #Вычисляем норму вектора начального приближения.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;3.\, q_{1_{j}} = \frac{b_{j}}{\|b\|_2}, \; j = 1,\, \dots\,, n&amp;lt;/math&amp;gt; #Нормализуем вектор начального приближения.&lt;br /&gt;
&lt;br /&gt;
Начинаются итерации цикла, которых не больше чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. На &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации производятся следующие вычисления:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.1\, z_j = \sum\limits_{m=1}^{n} a_{jm} q_{i_m}, \; j = 1,\,\dots\,, n&amp;lt;/math&amp;gt; #Считаем результат применения линейного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.2\, \alpha_i = \sum\limits_{j=1}^{n}q_{i_j} z_j&amp;lt;/math&amp;gt; #Получаем результат скалярного произведения векторов &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.3\, z_j = z_j - \alpha_i q_{i_j} - \beta_{i-1}q_{i-1_j}, \, j = 1,\,\dots\,, n&amp;lt;/math&amp;gt; #Вычисляем линейную комбинацию векторов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.4\, \beta_i = \|z\|_2 = \sqrt{\sum\limits_{j=1}^{n} z_j^2}&amp;lt;/math&amp;gt; #Считаем норму вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.5&amp;lt;/math&amp;gt; Проверка равенства &amp;lt;math&amp;gt;\beta_i == 0&amp;lt;/math&amp;gt; # Если норма оказалась равной нулю, то завершаем итерации и переходим к вычислению собственных векторов и собственных значений полученной матрицы. В обратном случае, продолжаем выполнения итераций.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.6\, q_{i+1_j} = \frac{z_j}{\beta_i}, \; j = 1,\, \dots \,, n&amp;lt;/math&amp;gt; #Нормируем вектор &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.7\,&amp;lt;/math&amp;gt; Если выполнили &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций, то завершаем выполнение итераций, переходим к следующему шагу. Иначе начинаем последующую итерацию цикла.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;4.&amp;lt;/math&amp;gt; Вычисляем собственные значения и собственные вектора полученной матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычисления &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и соответствующих им собственных векторов алгоритмом Ланцоша без переортогонализации состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и нахождения собственных значений и векторов трехдиагональной симметричной матрицы порядка &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Инициализация состоит из следующих операций:&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; операций сложений&lt;br /&gt;
** извлечение квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций делений (нормирование)&lt;br /&gt;
Каждая из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций состоит из:&lt;br /&gt;
* умножение матрицы на вектор:&lt;br /&gt;
** &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* скалярное произведение двух векторов&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сложение&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; вычитаний&lt;br /&gt;
* норма вектора:&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&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; операций деления&lt;br /&gt;
&lt;br /&gt;
Итого (без учета решения трехдиагональной матрицы):&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2 + 4n) + n &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2+3n-2) +  n-1&amp;lt;/math&amp;gt; сложений/вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt; kn + n &amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; вычислений квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Для нахождение собственных значений и векторов трехдиагональной симметричной матрицы эффективней всего использовать [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы | метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]], который требует &amp;lt;math&amp;gt; O(k^3) &amp;lt;/math&amp;gt; операций.&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метод Ланцоша без переортогонализации относится к алгоритмам &#039;&#039;с квадратичной сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
{|align=&amp;quot;left&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[Файл:Ланцош без переортогонализации 1.png|600px|thumb|center|Рисунок 1. Граф алгоритма без отображения входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt;  — операция деления, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\cdot &amp;lt;/math&amp;gt;  — операция умножения, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов, &amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;  — линейный оператор.]]&lt;br /&gt;
 |[[Файл:Ланцош без переортогонализации 2.png|600px|thumb|center|Рисунок 2. Граф алгоритма с отображением входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt;  — операция деления,  &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\cdot &amp;lt;/math&amp;gt;  — операция умножения,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов,  &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;  — линейный операторя,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{In}&amp;lt;/math&amp;gt; — входные данные, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Out}&amp;lt;/math&amp;gt; — выходные результат.]]&lt;br /&gt;
|}&lt;br /&gt;
[[Файл:Линейный_оператор.png|600px|thumb|left|Рисунок 3. Граф линейного оператора без отображения входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt;  — операция умножения двух коэффициентов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;  — операция сложения.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша в параллельной форме состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и вычисления собственных значений матрицы &amp;lt;math&amp;gt;T_k&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;\log n&amp;lt;/math&amp;gt; и линейную ширину ярусов &amp;lt;math&amp;gt;\frac{n}{2}, \frac{n}{4}, ... , 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Инициализации состоит из следующих операций:&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** вычисление скалярного произведения вектора самого на себя:&lt;br /&gt;
*** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итерационная часть алгоритма состоит из следующих операций:&lt;br /&gt;
* умножение матрицы на число:&lt;br /&gt;
** ярус умножений с шириной &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log n&amp;lt;/math&amp;gt; ярусов с наибольшей шириной &amp;lt;math&amp;gt;\frac{n^2}{2}&amp;lt;/math&amp;gt; (блок вычисления n сумм n элементов)&lt;br /&gt;
* вычисление скалярного произведения двух векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt;&lt;br /&gt;
** два яруса сложений шириной &amp;lt;math&amp;gt;n&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;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с максимальной шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, в параллельном варианте основную долю времени будут занимать операции сложения при умножении матрицы на вектор.&lt;br /&gt;
При классификации по высоте ЯПФ Алгоритм Ланцоша относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;. При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}, i \geq j&amp;lt;/math&amp;gt;), число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n + 1)}{2} + 1&amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/поддиагональные элементы, единица относится к параметру &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
по &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;k+kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является субквадратичным: &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша без переортогонализации не является детерминированным (возможно выполнение меньшего числа итераций алгоритма), в случае если все собственные значения уже вычислены.&lt;br /&gt;
&lt;br /&gt;
Важное свойство метода Ланцоша состоит в том, что первыми в матрице &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; появляются собственные значения с максимальной величиной по модулю. Таким образом, метод особенно хорошо подходит для вычисления собственных значений матрицы &amp;lt;math&amp;gt;A&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;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации ===&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте IETL&amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/lanczos.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;/div&gt;</summary>
		<author><name>A.Freeman</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=15024</id>
		<title>Участник:A.Freeman/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=15024"/>
		<updated>2016-10-31T11:07:57Z</updated>

		<summary type="html">&lt;p&gt;A.Freeman: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша без переортогонализации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}+1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n+1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Основные авторы описания: [[Участник:KAKTUZ|Заспа А.Ю.]] ([[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]]),  [[Участник:A.Freeman|Фролов А.А.]] ([[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Входные и выходные данные алгоритма|1.9]], [[#Свойства алгоритма|1.10]], [[#Существующие реализации|2.7]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; был опубликовн физиком и математиком Корнелием Ланцощем в 1950 году&amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот метод является частным случаем алгоритма Арнольда в случае, если исходная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - симметрична, и был представлен как итерационный метод вычисления собственных значений симметричной матрицы. Этот метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов исходной матрицы. Хотя алгоритм и был эффективным в вычислительном смысле, но он на некоторое время был предан забвению из-за численной неустойчивости. Только в 1970 Ojalvo и Newman модифицировали алгоритм для использования в арифметике с плавающей точкой&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;. Новый метод получил название [[Алгоритм Ланцоша с полной переортогонализацией | алгоритма Ланцоша с полной переортогонализацией]]. Но эта статья про его исходную версию.&lt;br /&gt;
На вход алгоритма подается вещественная симметричная матрица  &amp;lt;math&amp;gt;A = A^{T}&amp;lt;/math&amp;gt;,&lt;br /&gt;
{{Шаблон:ASymmetric}}&lt;br /&gt;
Поэтому достаточно хранить только чуть больше половины элементов исходной матрицы.&lt;br /&gt;
&lt;br /&gt;
Сам алгоритм соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца. На каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, состоящая из ортонормированных векторов Ланцоша. А в качестве приближенных собственных значений берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k \times k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 \\&lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 \\&lt;br /&gt;
&amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных значений и собственных векторов такой матрицы значительно проще чем их вычисление для исходной матрицы. Например, они могут быть вычислены с помощью [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы| метода «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]]. В этом методе эта процедура занимает &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций, где константа оказывается на практике довольно мала.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, начальный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: собственные вектора матрицы  &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; являющиеся столбцами матрицы &amp;lt;math&amp;gt;Q_k V&amp;lt;/math&amp;gt;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
До начала первой итерации нормируется вектор начального приближения &amp;lt;math&amp;gt;q_1 = \frac{b}{\|b\|_2}&amp;lt;/math&amp;gt;. Затем задаются константы &amp;lt;math&amp;gt;\beta_0 = 0,\; q_0 = 0 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
После выполнения данных действий начинаются итерации алгоритма. Которых будет не больше чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. В ходе итераций постепенно формируется матрица &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;\alpha_i&amp;lt;/math&amp;gt;-x и &amp;lt;math&amp;gt;\beta_i&amp;lt;/math&amp;gt;-х.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации происходят следующие вычисления. Вначале вычисляется произведение матрицы на вектор &amp;lt;math&amp;gt;z = Aq_i&amp;lt;/math&amp;gt;. Затем считается скалярное произведение &amp;lt;math&amp;gt;\alpha_i = q^T_i z&amp;lt;/math&amp;gt; и значение сохраняется как элемент формируемой матрицы. После этого необходимо произвести вычисление линейной комбинации векторов &amp;lt;math&amp;gt;z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}&amp;lt;/math&amp;gt;. Норму полученного вектора запишем как элемент матрицы &amp;lt;math&amp;gt;\beta_i = \|z\|_2&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;\beta_i&amp;lt;/math&amp;gt; оказалась равной нулю, то больше никаких итераций в алгоритме не производят, сразу переходят к вычислению собственных значений и собственных векторов. Иначе, в конце итерации считают &amp;lt;math&amp;gt;q_{i+1} = \frac{z}{\beta_i}&amp;lt;/math&amp;gt; и переходят к следующей итерации.&lt;br /&gt;
&lt;br /&gt;
После всех итераций необходимо вычислить собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром на каждой итерации является вычисление произведения матрицы на вектор:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&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;
* вычисление собственных векторов и собственных значений трехдиагональной симметричной матрицы.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;1.\, \beta_0 = 0,\; q_0 = 0&amp;lt;/math&amp;gt; #Инициализируются константы&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;2.\, \|b\|_2 = \sqrt{\sum\limits_{j=1}^{n} b_j^2}&amp;lt;/math&amp;gt; #Вычисляем норму вектора начального приближения.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;3.\, q_{1_{j}} = \frac{b_{j}}{\|b\|_2}, \; j = 1,\, \dots\,, n&amp;lt;/math&amp;gt; #Нормализуем вектор начального приближения.&lt;br /&gt;
&lt;br /&gt;
Начинаются итерации цикла, которых не больше чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. На &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации производятся следующие вычисления:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.1\, z_j = \sum\limits_{m=1}^{n} a_{jm} q_{i_m}, \; j = 1,\,\dots\,, n&amp;lt;/math&amp;gt; #Считаем результат применения линейного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.2\, \alpha_i = \sum\limits_{j=1}^{n}q_{i_j} z_j&amp;lt;/math&amp;gt; #Получаем результат скалярного произведения векторов &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.3\, z_j = z_j - \alpha_i q_{i_j} - \beta_{i-1}q_{i-1_j}, \, j = 1,\,\dots\,, n&amp;lt;/math&amp;gt; #Вычисляем линейную комбинацию векторов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.4\, \beta_i = \|z\|_2 = \sqrt{\sum\limits_{j=1}^{n} z_j^2}&amp;lt;/math&amp;gt; #Считаем норму вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.5&amp;lt;/math&amp;gt; Проверка равенства &amp;lt;math&amp;gt;\beta_i == 0&amp;lt;/math&amp;gt; # Если норма оказалась равной нулю, то завершаем итерации и переходим к вычислению собственных векторов и собственных значений полученной матрицы. В обратном случае, продолжаем выполнения итераций.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.6\, q_{i+1_j} = \frac{z_j}{\beta_i}, \; j = 1,\, \dots \,, n&amp;lt;/math&amp;gt; #Нормируем вектор &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i.7\,&amp;lt;/math&amp;gt; Если выполнили &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций, то завершаем выполнение итераций, переходим к следующему шагу. Иначе начинаем последующую итерацию цикла.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;4.&amp;lt;/math&amp;gt; Вычисляем собственные значения и собственные вектора полученной матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычисления &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и соответствующих им собственных векторов алгоритмом Ланцоша без переортогонализации состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и нахождения собственных значений и векторов трехдиагональной симметричной матрицы порядка &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Инициализация состоит из следующих операций:&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; операций сложений&lt;br /&gt;
** извлечение квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций делений (нормирование)&lt;br /&gt;
Каждая из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций состоит из:&lt;br /&gt;
* умножение матрицы на вектор:&lt;br /&gt;
** &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* скалярное произведение двух векторов&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сложение&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; вычитаний&lt;br /&gt;
* норма вектора:&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&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; операций деления&lt;br /&gt;
&lt;br /&gt;
Итого (без учета решения трехдиагональной матрицы):&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2 + 4n) + n &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2+3n-2) +  n-1&amp;lt;/math&amp;gt; сложений/вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt; kn + n &amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; вычислений квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Для нахождение собственных значений и векторов трехдиагональной симметричной матрицы эффективней всего использовать [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы | метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]], который требует &amp;lt;math&amp;gt; O(k^3) &amp;lt;/math&amp;gt; операций.&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метод Ланцоша без переортогонализации относится к алгоритмам &#039;&#039;с квадратичной сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[Файл:Ланцош без переортогонализации 1.png|600px|thumb|center|Рисунок 1. Граф алгоритма без отображения входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt;  — операция деления, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\cdot &amp;lt;/math&amp;gt;  — операция умножения, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов, &amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;  — линейный оператор.]]&lt;br /&gt;
 |[[Файл:Ланцош без переортогонализации 2.png|600px|thumb|center|Рисунок 2. Граф алгоритма с отображением входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt;  — операция деления,  &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\cdot &amp;lt;/math&amp;gt;  — операция умножения,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов,  &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;  — линейный операторя,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{In}&amp;lt;/math&amp;gt; — входные данные, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Out}&amp;lt;/math&amp;gt; — выходные результат.]]&lt;br /&gt;
|}&lt;br /&gt;
[[Файл:Линейный_оператор.png|720px|thumb|center|Рисунок 3. Граф линейного оператора без отображения входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt;  — операция умножения двух коэффициентов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;  — операция сложения.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша в параллельной форме состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и вычисления собственных значений матрицы &amp;lt;math&amp;gt;T_k&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;\log n&amp;lt;/math&amp;gt; и линейную ширину ярусов &amp;lt;math&amp;gt;\frac{n}{2}, \frac{n}{4}, ... , 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Инициализации состоит из следующих операций:&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** вычисление скалярного произведения вектора самого на себя:&lt;br /&gt;
*** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итерационная часть алгоритма состоит из следующих операций:&lt;br /&gt;
* умножение матрицы на число:&lt;br /&gt;
** ярус умножений с шириной &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log n&amp;lt;/math&amp;gt; ярусов с наибольшей шириной &amp;lt;math&amp;gt;\frac{n^2}{2}&amp;lt;/math&amp;gt; (блок вычисления n сумм n элементов)&lt;br /&gt;
* вычисление скалярного произведения двух векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt;&lt;br /&gt;
** два яруса сложений шириной &amp;lt;math&amp;gt;n&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;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с максимальной шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, в параллельном варианте основную долю времени будут занимать операции сложения при умножении матрицы на вектор.&lt;br /&gt;
При классификации по высоте ЯПФ Алгоритм Ланцоша относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;. При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}, i \geq j&amp;lt;/math&amp;gt;), число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n + 1)}{2} + 1&amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/поддиагональные элементы, единица относится к параметру &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
по &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;k+kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является субквадратичным: &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша без переортогонализации не является детерминированным (возможно выполнение меньшего числа итераций алгоритма), в случае если все собственные значения уже вычислены.&lt;br /&gt;
&lt;br /&gt;
Важное свойство метода Ланцоша состоит в том, что первыми в матрице &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; появляются собственные значения с максимальной величиной по модулю. Таким образом, метод особенно хорошо подходит для вычисления собственных значений матрицы &amp;lt;math&amp;gt;A&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;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации ===&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте IETL&amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/lanczos.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;/div&gt;</summary>
		<author><name>A.Freeman</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=14639</id>
		<title>Участник:A.Freeman/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=14639"/>
		<updated>2016-10-29T03:57:32Z</updated>

		<summary type="html">&lt;p&gt;A.Freeman: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша без переортогонализации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}+1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n+1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Основные авторы описания: [[Участник:KAKTUZ|Заспа А.Ю.]] ([[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]]),  [[Участник:A.Freeman|Фролов А.А.]] ([[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Входные и выходные данные алгоритма|1.9]], [[#Свойства алгоритма|1.10]], [[#Существующие реализации|2.7]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; был опубликовн физиком и математиком Корнелием Ланцощем в 1950 году&amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот метод является частным случаем алгоритма Арнольда в случае, если исходная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - симметрична, и был представлен как итерационный метод вычисления собственных значений симметричной матрицы. Этот метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов исходной матрицы. Хотя алгоритм и был эффективным в вычислительном смысле, но он на некоторое время был предан забвению из-за численной неустойчивости. Только в 1970 Ojalvo и Newman модифицировали алгоритм для использования в арифметике с плавающей точкой&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;. Новый метод получил название [[Алгоритм Ланцоша с полной переортогонализацией | алгоритма Ланцоша с полной переортогонализацией]]. Но эта статья про его исходную версию.&lt;br /&gt;
На вход алгоритма подается вещественная симметричная матрица  &amp;lt;math&amp;gt;A = A^{T}&amp;lt;/math&amp;gt;,&lt;br /&gt;
{{Шаблон:ASymmetric}}&lt;br /&gt;
Поэтому достаточно хранить только чуть больше половины элементов исходной матрицы.&lt;br /&gt;
&lt;br /&gt;
Сам алгоритм соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца. На каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, состоящая из ортонормированных векторов Ланцоша. А в качестве приближенных собственных значений берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k \times k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 \\&lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 \\&lt;br /&gt;
&amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных значений и собственных векторов такой матрицы значительно проще чем их вычисление для исходной матрицы. Например, они могут быть вычислены с помощью [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы| метода «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]]. В этом методе эта процедура занимает &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций, где константа оказывается на практике довольно мала.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, начальный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: собственные вектора матрицы  &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; являющиеся столбцами матрицы &amp;lt;math&amp;gt;Q_k V&amp;lt;/math&amp;gt;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
До начала первой итерации нормируется вектор начального приближения &amp;lt;math&amp;gt;q_1 = \frac{b}{\|b\|_2}&amp;lt;/math&amp;gt;. Затем задаются константы &amp;lt;math&amp;gt;\beta_0 = 0,\; q_0 = 0 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
После выполнения данных действий начинаются итерации алгоритма. Которых будет не больше чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. В ходе итераций постепенно формируется матрица &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;\alpha_i&amp;lt;/math&amp;gt;-x и &amp;lt;math&amp;gt;\beta_i&amp;lt;/math&amp;gt;-х.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации происходят следующие вычисления. Вначале вычисляется произведение матрицы на вектор &amp;lt;math&amp;gt;z = Aq_i&amp;lt;/math&amp;gt;. Затем считается скалярное произведение &amp;lt;math&amp;gt;\alpha_i = q^T_i z&amp;lt;/math&amp;gt; и значение сохраняется как элемент формируемой матрицы. После этого необходимо произвести вычисление линейной комбинации векторов &amp;lt;math&amp;gt;z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}&amp;lt;/math&amp;gt;. Норму полученного вектора запишем как элемент матрицы &amp;lt;math&amp;gt;\beta_i = \|z\|_2&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;\beta_i&amp;lt;/math&amp;gt; оказалась равной нулю, то больше никаких итераций в алгоритме не производят, сразу переходят к вычислению собственных значений и собственных векторов. Иначе, в конце итерации считают &amp;lt;math&amp;gt;q_{i+1} = \frac{z}{\beta_i}&amp;lt;/math&amp;gt; и переходят к следующей итерации.&lt;br /&gt;
&lt;br /&gt;
После всех итераций необходимо вычислить собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром на каждой итерации является вычисление произведения матрицы на вектор:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&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;
* вычисление собственных векторов и собственных значений трехдиагональной симметричной матрицы.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
1. \, \beta_0 = &amp;amp; 0,\; q_0 = 0,\\&lt;br /&gt;
\|b\|_2 = &amp;amp;\sqrt{\sum\limits_{j=1}^{n} b_j^2},\\&lt;br /&gt;
2. \, q_{1_{j}} = &amp;amp;\frac{b_{j}}{\|b\|_2}, \; j = 1,\, \dots \,, n\\&lt;br /&gt;
for \; i = &amp;amp; 1 \; to \; k \\&lt;br /&gt;
3. \, z_j &amp;amp; = \sum\limits_{m=1}^{n} a_{jm} q_{i_m}, \; j = 1,\, \dots \,, n\\&lt;br /&gt;
4. \, \alpha_i &amp;amp; = \sum\limits_{j=1}^{n}q_j z_j\\&lt;br /&gt;
5. \, z_j &amp;amp; = z_j - \alpha_i q_{i_j} - \beta_{i-1}q_{i-1_j}, \, j = 1,\, \dots \,, n\\&lt;br /&gt;
6. \, \beta_i &amp;amp; = \|z\|_2 = \sqrt{\sum\limits_{j=1}^{n} z_m^2}\\&lt;br /&gt;
if \; \beta_i &amp;amp; == 0 \; then \; break\\&lt;br /&gt;
7. \, q_{i+1_j} &amp;amp; = \frac{z_j}{\beta_i}, \; j = 1,\, \dots \,, n\\&lt;br /&gt;
end \; &amp;amp; for&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычисления &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и соответствующих им собственных векторов алгоритмом Ланцоша без переортогонализации состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и нахождения собственных значений и векторов трехдиагональной симметричной матрицы порядка &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Инициализация состоит из следующих операций:&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; операций сложений&lt;br /&gt;
** извлечение квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций делений (нормирование)&lt;br /&gt;
Каждая из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций состоит из:&lt;br /&gt;
* умножение матрицы на вектор:&lt;br /&gt;
** &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* скалярное произведение двух векторов&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сложение&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; вычитаний&lt;br /&gt;
* норма вектора:&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&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; операций деления&lt;br /&gt;
&lt;br /&gt;
Итого (без учета решения трехдиагональной матрицы):&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2 + 4n) + n &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2+3n-2) +  n-1&amp;lt;/math&amp;gt; сложений/вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt; kn + n &amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; вычислений квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Для нахождение собственных значений и векторов трехдиагональной симметричной матрицы эффективней всего использовать [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы | метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]], который требует &amp;lt;math&amp;gt; O(k^3) &amp;lt;/math&amp;gt; операций.&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метод Ланцоша без переортогонализации относится к алгоритмам &#039;&#039;с квадратичной сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[Файл:Ланцош без переортогонализации 1.png|500px|thumb|center|Рисунок 1. Граф алгоритма без отображения входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt;  — операция деления, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\cdot &amp;lt;/math&amp;gt;  — операция умножения, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов, &amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;  — линейный оператор.]]&lt;br /&gt;
 |[[Файл:Ланцош без переортогонализации 2.png|500px|thumb|center|Рисунок 2. Граф алгоритма с отображением входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt;  — операция деления,  &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\cdot &amp;lt;/math&amp;gt;  — операция умножения,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов,  &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;  — линейный операторя,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{In}&amp;lt;/math&amp;gt; — входные данные, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Out}&amp;lt;/math&amp;gt; — выходные результат.]]&lt;br /&gt;
 |[[Файл:Линейный_оператор.png|620px|thumb|center|Рисунок 3. Граф линейного оператора без отображения входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt;  — операция умножения двух коэффициентов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;  — операция сложения.]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша в параллельной форме состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и вычисления собственных значений матрицы &amp;lt;math&amp;gt;T_k&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;\log n&amp;lt;/math&amp;gt; и линейную ширину ярусов &amp;lt;math&amp;gt;\frac{n}{2}, \frac{n}{4}, ... , 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Инициализации состоит из следующих операций:&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** вычисление скалярного произведения вектора самого на себя:&lt;br /&gt;
*** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итерационная часть алгоритма состоит из следующих операций:&lt;br /&gt;
* умножение матрицы на число:&lt;br /&gt;
** ярус умножений с шириной &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log n&amp;lt;/math&amp;gt; ярусов с наибольшей шириной &amp;lt;math&amp;gt;\frac{n^2}{2}&amp;lt;/math&amp;gt; (блок вычисления n сумм n элементов)&lt;br /&gt;
* вычисление скалярного произведения двух векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt;&lt;br /&gt;
** два яруса сложений шириной &amp;lt;math&amp;gt;n&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;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с максимальной шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, в параллельном варианте основную долю времени будут занимать операции сложения при умножении матрицы на вектор.&lt;br /&gt;
При классификации по высоте ЯПФ Алгоритм Ланцоша относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;. При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}, i \geq j&amp;lt;/math&amp;gt;), число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n + 1)}{2} + 1&amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/поддиагональные элементы, единица относится к параметру &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
по &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;k+kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является субквадратичным: &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша без переортогонализации не является детерминированным (возможно выполнение меньшего числа итераций алгоритма), в случае если все собственные значения уже вычислены.&lt;br /&gt;
&lt;br /&gt;
Важное свойство метода Ланцоша состоит в том, что первыми в матрице &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; появляются собственные значения с максимальной величиной по модулю. Таким образом, метод особенно хорошо подходит для вычисления собственных значений матрицы &amp;lt;math&amp;gt;A&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;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации ===&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте IETL&amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/lanczos.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;/div&gt;</summary>
		<author><name>A.Freeman</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:A.Freeman&amp;diff=13270</id>
		<title>Участник:A.Freeman</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:A.Freeman&amp;diff=13270"/>
		<updated>2016-10-20T16:26:02Z</updated>

		<summary type="html">&lt;p&gt;A.Freeman: Создана пустая страница&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>A.Freeman</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=13104</id>
		<title>Участник:A.Freeman/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=13104"/>
		<updated>2016-10-18T10:06:02Z</updated>

		<summary type="html">&lt;p&gt;A.Freeman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша без переортогонализации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}+1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n+1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Основные авторы описания: [[Участник:KAKTUZ|Заспа А.Ю.]] ([[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]]),  [[Участник:A.Freeman|Фролов А.А.]] ([[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Входные и выходные данные алгоритма|1.9]], [[#Свойства алгоритма|1.10]], [[#Существующие реализации|2.7]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; был опубликовн физиком и математиком Корнелием Ланцощем в 1950 году&amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот метод является частным случаем алгоритма Арнольда в случае, если исходная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - симметрична, и был представлен как итерационный метод вычисления собственных значений симметричной матрицы. Этот метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов исходной матрицы. Хотя алгоритм и был эффективным в вычислительном смысле, но он на некоторое время был предан забвению из-за численной неустойчивости. Только в 1970 Ojalvo и Newman модифицировали алгоритм для использования в арифметике с плавающей точкой&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;. Новый метод получил название [[Алгоритм Ланцоша с полной переортогонализацией | алгоритма Ланцоша с полной переортогонализацией]]. Но эта статья про его исходную версию.&lt;br /&gt;
На вход алгоритма подается вещественная симметричная матрица  &amp;lt;math&amp;gt;A = A^{T}&amp;lt;/math&amp;gt;,&lt;br /&gt;
{{Шаблон:ASymmetric}}&lt;br /&gt;
Поэтому достаточно хранить только чуть больше половины элементов исходной матрицы.&lt;br /&gt;
&lt;br /&gt;
Сам алгоритм соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца. На каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, состоящая из ортонормированных векторов Ланцоша. А в качестве приближенных собственных значений берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k \times k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 \\&lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 \\&lt;br /&gt;
&amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных значений и собственных векторов такой матрицы значительно проще чем их вычисление для исходной матрицы. Например, они могут быть вычислены с помощью [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы| метода «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]]. В этом методе эта процедура занимает &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций, где константа оказывается на практике довольно мала.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, начальный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: собственные вектора матрицы  &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; являющиеся столбцами матрицы &amp;lt;math&amp;gt;Q_k V&amp;lt;/math&amp;gt;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм на псевдокоде:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
q_1 = &amp;amp; \frac{b}{\|b\|_2},\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; if \; \beta_i == 0 \; then \; break\\&lt;br /&gt;
&amp;amp; q_{i+1} = \frac{z}{\beta_i}\\&lt;br /&gt;
end \; &amp;amp; for&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Затем вычислить собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром на каждой итерации является вычисление произведения матрицы на вектор:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&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;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
1. \, \beta_0 = &amp;amp; 0,\; q_0 = 0,\\&lt;br /&gt;
\|b\|_2 = &amp;amp;\sqrt{\sum\limits_{j=1}^{n} b_j^2},\\&lt;br /&gt;
2. \, q_{1_{j}} = &amp;amp;\frac{b_{j}}{\|b\|_2}, \; j = 1,\, \dots \,, n\\&lt;br /&gt;
for \; i = &amp;amp; 1 \; to \; k \\&lt;br /&gt;
3. \, z_j &amp;amp; = \sum\limits_{m=1}^{n} a_{jm} q_{i_m}, \; j = 1,\, \dots \,, n\\&lt;br /&gt;
4. \, \alpha_i &amp;amp; = \sum\limits_{j=1}^{n}q_j z_j\\&lt;br /&gt;
5. \, z_j &amp;amp; = z_j - \alpha_i q_{i_j} - \beta_{i-1}q_{i-1_j}, \, j = 1,\, \dots \,, n\\&lt;br /&gt;
6. \, \beta_i &amp;amp; = \|z\|_2 = \sqrt{\sum\limits_{j=1}^{n} z_m^2}\\&lt;br /&gt;
if \; \beta_i &amp;amp; == 0 \; then \; break\\&lt;br /&gt;
7. \, q_{i+1_j} &amp;amp; = \frac{z_j}{\beta_i}, \; j = 1,\, \dots \,, n\\&lt;br /&gt;
end \; &amp;amp; for&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычисления &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и соответствующих им собственных векторов алгоритмом Ланцоша без переортогонализации состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и нахождения собственных значений и векторов трехдиагональной симметричной матрицы порядка &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Инициализация состоит из следующих операций:&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; операций сложений&lt;br /&gt;
** извлечение квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций делений (нормирование)&lt;br /&gt;
Каждая из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций состоит из:&lt;br /&gt;
* умножение матрицы на вектор:&lt;br /&gt;
** &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* скалярное произведение двух векторов&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сложение&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; вычитаний&lt;br /&gt;
* норма вектора:&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&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; операций деления&lt;br /&gt;
&lt;br /&gt;
Итого (без учета решения трехдиагональной матрицы):&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2 + 4n) + n &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2+3n-2) +  n-1&amp;lt;/math&amp;gt; сложений/вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt; kn + n &amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; вычислений квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Для нахождение собственных значений и векторов трехдиагональной симметричной матрицы эффективней всего использовать [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы | метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]], который требует &amp;lt;math&amp;gt; O(k^3) &amp;lt;/math&amp;gt; операций.&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метод Ланцоша без переортогонализации относится к алгоритмам &#039;&#039;с квадратичной сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[Файл:Ланцош без переортогонализации 1.png|600px|thumb|center|Рисунок 1. Граф алгоритма без отображения входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы, &amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt;  — операция деления,  &amp;lt;math&amp;gt;\cdot &amp;lt;/math&amp;gt;  — операция умножения,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов,  &amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;  — линейный оператор.]]&lt;br /&gt;
 |[[Файл:Ланцош без переортогонализации 2.png|600px|thumb|center|Рисунок 2. Граф алгоритма с отображением входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы, &amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt;  — операция деления,  &amp;lt;math&amp;gt;\cdot &amp;lt;/math&amp;gt;  — операция умножения,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов,  &amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;  — линейный операторя,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{In}&amp;lt;/math&amp;gt; — входные данные, &amp;lt;math&amp;gt;\mathsf{Out}&amp;lt;/math&amp;gt; — выходные результат.]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша в параллельной форме состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и вычисления собственных значений матрицы &amp;lt;math&amp;gt;T_k&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;\log n&amp;lt;/math&amp;gt; и линейную ширину ярусов &amp;lt;math&amp;gt;\frac{n}{2}, \frac{n}{4}, ... , 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Инициализации состоит из следующих операций:&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** вычисление скалярного произведения вектора самого на себя:&lt;br /&gt;
*** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итерационная часть алгоритма состоит из следующих операций:&lt;br /&gt;
* умножение матрицы на число:&lt;br /&gt;
** ярус умножений с шириной &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log n&amp;lt;/math&amp;gt; ярусов с наибольшей шириной &amp;lt;math&amp;gt;\frac{n^2}{2}&amp;lt;/math&amp;gt; (блок вычисления n сумм n элементов)&lt;br /&gt;
* вычисление скалярного произведения двух векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt;&lt;br /&gt;
** два яруса сложений шириной &amp;lt;math&amp;gt;n&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;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с максимальной шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, в параллельном варианте основную долю времени будут занимать операции сложения при умножении матрицы на вектор.&lt;br /&gt;
При классификации по высоте ЯПФ Алгоритм Ланцоша относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;. При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}, i \geq j&amp;lt;/math&amp;gt;), число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n + 1)}{2} + 1&amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/поддиагональные элементы, единица относится к параметру &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
по &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;k+kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является субквадратичным: &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша без переортогонализации не является детерминированным (возможно выполнение меньшего числа итераций алгоритма), в случае если все собственные значения уже вычислены.&lt;br /&gt;
&lt;br /&gt;
Важное свойство метода Ланцоша состоит в том, что первыми в матрице &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; появляются собственные значения с максимальной величиной по модулю. Таким образом, метод особенно хорошо подходит для вычисления собственных значений матрицы &amp;lt;math&amp;gt;A&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;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации ===&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте IETL&amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/lanczos.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;/div&gt;</summary>
		<author><name>A.Freeman</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=12905</id>
		<title>Участник:A.Freeman/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=12905"/>
		<updated>2016-10-16T23:05:15Z</updated>

		<summary type="html">&lt;p&gt;A.Freeman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша без переортогонализации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}+1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n+1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Основные авторы описания: [[Участник:KAKTUZ|Заспа А.Ю.]] ([[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]]),  [[Участник:A.Freeman|Фролов А.А.]] ([[#Последовательная сложность алгоритма|1.6]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Входные и выходные данные алгоритма|1.9]], [[#Свойства алгоритма|1.10]], [[#Существующие реализации|2.7]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; был опубликовн физиком и математиком Корнелием Ланцощем в 1950 году&amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот метод является частным случаем алгоритма Арнольда в случае, если исходная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - симметрична, и был представлен как итерационный метод вычисления собственных значений симметричной матрицы. Этот метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов исходной матрицы. Хотя алгоритм и был эффективным в вычислительном смысле, но он на некоторое время был предан забвению из-за численной неустойчивости. Только в 1970 Ojalvo и Newman модифицировали алгоритм для использования в арифметике с плавающей точкой&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;. Новый метод получил название [[Алгоритм Ланцоша с полной переортогонализацией | алгоритма Ланцоша с полной переортогонализацией]]. Но эта статья про его исходную версию.&lt;br /&gt;
На вход алгоритма подается вещественная симметричная матрица  &amp;lt;math&amp;gt;A = A^{T}&amp;lt;/math&amp;gt;,&lt;br /&gt;
{{Шаблон:ASymmetric}}&lt;br /&gt;
Поэтому достаточно хранить только чуть больше половины элементов исходной матрицы.&lt;br /&gt;
&lt;br /&gt;
Сам алгоритм соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца. На каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, состоящая из ортонормированных векторов Ланцоша. А в качестве приближенных собственных значений берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k \times k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 \\&lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 \\&lt;br /&gt;
&amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных значений и собственных векторов такой матрицы значительно проще чем их вычисление для исходной матрицы. Например, они могут быть вычислены с помощью [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы| метода «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]]. В этом методе эта процедура занимает &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций, где константа оказывается на практике довольно мала.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, начальный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: собственные вектора матрицы  &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; являющиеся столбцами матрицы &amp;lt;math&amp;gt;Q_k V&amp;lt;/math&amp;gt;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм на псевдокоде:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
q_1 = &amp;amp; \frac{b}{\|b\|_2},\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; if \; \beta_i == 0 \; then \; break\\&lt;br /&gt;
&amp;amp; q_{i+1} = \frac{z}{\beta_i}\\&lt;br /&gt;
end \; &amp;amp; for&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Затем вычислить собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром на каждой итерации является вычисление произведения матрицы на вектор:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&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;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
1. \, \beta_0 = &amp;amp; 0,\; q_0 = 0,\\&lt;br /&gt;
\|b\|_2 = &amp;amp;\sqrt{\sum\limits_{j=1}^{n} b_j^2},\\&lt;br /&gt;
2. \, q_{1_{j}} = &amp;amp;\frac{b_{j}}{\|b\|_2}, \; j = 1,\, \dots \,, n\\&lt;br /&gt;
for \; i = &amp;amp; 1 \; to \; k \\&lt;br /&gt;
3. \, z_j &amp;amp; = \sum\limits_{m=1}^{n} a_{jm} q_{i_m}, \; j = 1,\, \dots \,, n\\&lt;br /&gt;
4. \, \alpha_i &amp;amp; = \sum\limits_{j=1}^{n}q_j z_j\\&lt;br /&gt;
5. \, z_j &amp;amp; = z_j - \alpha_i q_{i_j} - \beta_{i-1}q_{i-1_j}, \, j = 1,\, \dots \,, n\\&lt;br /&gt;
6. \, \beta_i &amp;amp; = \|z\|_2 = \sqrt{\sum\limits_{j=1}^{n} z_m^2}\\&lt;br /&gt;
if \; \beta_i &amp;amp; == 0 \; then \; break\\&lt;br /&gt;
7. \, q_{i+1_j} &amp;amp; = \frac{z_j}{\beta_i}, \; j = 1,\, \dots \,, n\\&lt;br /&gt;
end \; &amp;amp; for&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычисления &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и соответствующих им собственных векторов алгоритмом Ланцоша без переортогонализации состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и нахождения собственных значений и векторов трехдиагональной симметричной матрицы порядка &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Инициализация состоит из следующих операций:&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; операций сложений&lt;br /&gt;
** извлечение квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций делений (нормирование)&lt;br /&gt;
Каждая из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций состоит из:&lt;br /&gt;
* умножение матрицы на вектор:&lt;br /&gt;
** &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* скалярное произведение двух векторов&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сложение&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; вычитаний&lt;br /&gt;
* норма вектора:&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&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; операций деления&lt;br /&gt;
&lt;br /&gt;
Итого (без учета решения трехдиагональной матрицы):&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2 + 4n) + n &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2+3n-2) +  n-1&amp;lt;/math&amp;gt; сложений/вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt; kn + n &amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; вычислений квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Для нахождение собственных значений и векторов трехдиагональной симметричной матрицы эффективней всего использовать [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы | метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]], который требует &amp;lt;math&amp;gt; O(k^3) &amp;lt;/math&amp;gt; операций.&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метод Ланцоша без переортогонализации относится к алгоритмам &#039;&#039;с квадратичной сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[Файл:Ланцош без переортогонализации 1.png|600px|thumb|center|Рисунок 1. Граф алгоритма без отображения входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы, &amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt;  — операция деления,  &amp;lt;math&amp;gt;\cdot &amp;lt;/math&amp;gt;  — операция умножения,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов,  &amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;  — линейный оператор.]]&lt;br /&gt;
 |[[Файл:Ланцош без переортогонализации 2.png|600px|thumb|center|Рисунок 2. Граф алгоритма с отображением входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы, &amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt;  — операция деления,  &amp;lt;math&amp;gt;\cdot &amp;lt;/math&amp;gt;  — операция умножения,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов,  &amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;  — линейный операторя,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{In}&amp;lt;/math&amp;gt; — входные данные, &amp;lt;math&amp;gt;\mathsf{Out}&amp;lt;/math&amp;gt; — выходные результат.]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша в параллельной форме состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и вычисления собственных значений матрицы &amp;lt;math&amp;gt;T_k&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;\log n&amp;lt;/math&amp;gt; и линейную ширину ярусов &amp;lt;math&amp;gt;\frac{n}{2}, \frac{n}{4}, ... , 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Инициализации состоит из следующих операций:&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** вычисление скалярного произведения вектора самого на себя:&lt;br /&gt;
*** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итерационная часть алгоритма состоит из следующих операций:&lt;br /&gt;
* умножение матрицы на число:&lt;br /&gt;
** ярус умножений с шириной &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log n&amp;lt;/math&amp;gt; ярусов с наибольшей шириной &amp;lt;math&amp;gt;\frac{n^2}{2}&amp;lt;/math&amp;gt; (блок вычисления n сумм n элементов)&lt;br /&gt;
* вычисление скалярного произведения двух векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt;&lt;br /&gt;
** два яруса сложений шириной &amp;lt;math&amp;gt;n&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;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с максимальной шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, в параллельном варианте основную долю времени будут занимать операции сложения при умножении матрицы на вектор.&lt;br /&gt;
При классификации по высоте ЯПФ Алгоритм Ланцоша относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;. При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}, i \geq j&amp;lt;/math&amp;gt;), число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n + 1)}{2} + 1&amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/поддиагональные элементы, единица относится к параметру &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
по &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;k+kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является субквадратичным: &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша без переортогонализации не является детерминированным (возможно выполнение меньшего числа итераций алгоритма), в случае если все собственные значения уже вычислены.&lt;br /&gt;
&lt;br /&gt;
Важное свойство метода Ланцоша состоит в том, что первыми в матрице &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; появляются собственные значения с максимальной величиной по модулю. Таким образом, метод особенно хорошо подходит для вычисления собственных значений матрицы &amp;lt;math&amp;gt;A&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;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации ===&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте IETL&amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/lanczos.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;/div&gt;</summary>
		<author><name>A.Freeman</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=12888</id>
		<title>Участник:A.Freeman/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=12888"/>
		<updated>2016-10-16T22:02:12Z</updated>

		<summary type="html">&lt;p&gt;A.Freeman: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша без переортогонализации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}+1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n+1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:KAKTUZ|Заспа А.Ю.]] ([[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]]),  [[Участник:A.Freeman|Фролов А.А.]] ([[#Последовательная сложность алгоритма|1.6]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Входные и выходные данные алгоритма|1.9]], [[#Свойства алгоритма|1.10]], [[#Существующие реализации|2.7]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; был опубликовн физиком и математиком Корнелием Ланцощем в 1950 году&amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот метод является частным случаем алгоритма Арнольда в случае, если исходная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - симметрична, и был представлен как итерационный метод вычисления собственных значений симметричной матрицы. Этот метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов исходной матрицы. Хотя алгоритм и был эффективным в вычислительном смысле, но он на некоторое время был предан забвению из-за численной неустойчивости. Только в 1970 Ojalvo и Newman модифицировали алгоритм для использования в арифметике с плавающей точкой&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;. Новый метод получил название [[Алгоритм Ланцоша с полной переортогонализацией | алгоритма Ланцоша с полной переортогонализацией]]. Но эта статья про его исходную версию.&lt;br /&gt;
На вход алгоритма подается вещественная симметричная матрица  &amp;lt;math&amp;gt;A = A^{T}&amp;lt;/math&amp;gt;,&lt;br /&gt;
{{Шаблон:ASymmetric}}&lt;br /&gt;
Поэтому достаточно хранить только чуть больше половины элементов исходной матрицы.&lt;br /&gt;
&lt;br /&gt;
Сам алгоритм соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца. На каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, состоящая из ортонормированных векторов Ланцоша. А в качестве приближенных собственных значений берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k \times k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 \\&lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 \\&lt;br /&gt;
&amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных значений и собственных векторов такой матрицы значительно проще чем их вычисление для исходной матрицы. Например, они могут быть вычислены с помощью [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы| метода «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]]. В этом методе эта процедура занимает &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций, где константа оказывается на практике довольно мала.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, начальный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: собственные вектора матрицы  &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; являющиеся столбцами матрицы &amp;lt;math&amp;gt;Q_k V&amp;lt;/math&amp;gt;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм на псевдокоде:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
q_1 = &amp;amp; \frac{b}{\|b\|_2},\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; if \; \beta_i == 0 \; then \; break\\&lt;br /&gt;
&amp;amp; q_{i+1} = \frac{z}{\beta_i}\\&lt;br /&gt;
end \; &amp;amp; for&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Затем вычислить собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром на каждой итерации является вычисление произведения матрицы на вектор:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&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;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
1. \, \beta_0 = &amp;amp; 0,\; q_0 = 0,\\&lt;br /&gt;
\|b\|_2 = &amp;amp;\sqrt{\sum\limits_{j=1}^{n} b_j^2},\\&lt;br /&gt;
2. \, q_{1_{j}} = &amp;amp;\frac{b_{j}}{\|b\|_2}, \; j = 1,\, \dots \,, n\\&lt;br /&gt;
for \; i = &amp;amp; 1 \; to \; k \\&lt;br /&gt;
3. \, z_j &amp;amp; = \sum\limits_{m=1}^{n} a_{jm} q_{i_m}, \; j = 1,\, \dots \,, n\\&lt;br /&gt;
4. \, \alpha_i &amp;amp; = \sum\limits_{j=1}^{n}q_j z_j\\&lt;br /&gt;
5. \, z_j &amp;amp; = z_j - \alpha_i q_{i_j} - \beta_{i-1}q_{i-1_j}, \, j = 1,\, \dots \,, n\\&lt;br /&gt;
6. \, \beta_i &amp;amp; = \|z\|_2 = \sqrt{\sum\limits_{j=1}^{n} z_m^2}\\&lt;br /&gt;
if \; \beta_i &amp;amp; == 0 \; then \; break\\&lt;br /&gt;
7. \, q_{i+1_j} &amp;amp; = \frac{z_j}{\beta_i}, \; j = 1,\, \dots \,, n\\&lt;br /&gt;
end \; &amp;amp; for&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычисления &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и соответствующих им собственных векторов алгоритмом Ланцоша без переортогонализации состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и нахождения собственных значений и векторов трехдиагональной симметричной матрицы порядка &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Инициализация состоит из следующих операций:&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; операций сложений&lt;br /&gt;
** извлечение квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций делений (нормирование)&lt;br /&gt;
Каждая из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций состоит из:&lt;br /&gt;
* умножение матрицы на вектор:&lt;br /&gt;
** &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* скалярное произведение двух векторов&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сложение&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; вычитаний&lt;br /&gt;
* норма вектора:&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&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; операций деления&lt;br /&gt;
&lt;br /&gt;
Итого (без учета решения трехдиагональной матрицы):&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2 + 4n) + n &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2+3n-2) +  n-1&amp;lt;/math&amp;gt; сложений/вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt; kn + n &amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; вычислений квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Для нахождение собственных значений и векторов трехдиагональной симметричной матрицы эффективней всего использовать [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы | метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]], который требует &amp;lt;math&amp;gt; O(k^3) &amp;lt;/math&amp;gt; операций.&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метод Ланцоша без переортогонализации относится к алгоритмам &#039;&#039;с квадратичной сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[Файл:Ланцош без переортогонализации 1.png|600px|thumb|center|Рисунок 1. Граф алгоритма без отображения входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы, &amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt;  — операция деления,  &amp;lt;math&amp;gt;\cdot &amp;lt;/math&amp;gt;  — операция умножения,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов,  &amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;  — линейный оператор.]]&lt;br /&gt;
 |[[Файл:Ланцош без переортогонализации 2.png|600px|thumb|center|Рисунок 2. Граф алгоритма с отображением входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы, &amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt;  — операция деления,  &amp;lt;math&amp;gt;\cdot &amp;lt;/math&amp;gt;  — операция умножения,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов,  &amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;  — линейный операторя,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{In}&amp;lt;/math&amp;gt; — входные данные, &amp;lt;math&amp;gt;\mathsf{Out}&amp;lt;/math&amp;gt; — выходные результат.]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша в параллельной форме состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и вычисления собственных значений матрицы &amp;lt;math&amp;gt;T_k&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;\log n&amp;lt;/math&amp;gt; и линейную ширину ярусов &amp;lt;math&amp;gt;\frac{n}{2}, \frac{n}{4}, ... , 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Инициализации состоит из следующих операций:&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** вычисление скалярного произведения вектора самого на себя:&lt;br /&gt;
*** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итерационная часть алгоритма состоит из следующих операций:&lt;br /&gt;
* умножение матрицы на число:&lt;br /&gt;
** ярус умножений с шириной &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log n&amp;lt;/math&amp;gt; ярусов с наибольшей шириной &amp;lt;math&amp;gt;\frac{n^2}{2}&amp;lt;/math&amp;gt; (блок вычисления n сумм n элементов)&lt;br /&gt;
* вычисление скалярного произведения двух векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt;&lt;br /&gt;
** два яруса сложений шириной &amp;lt;math&amp;gt;n&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;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с максимальной шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, в параллельном варианте основную долю времени будут занимать операции сложения при умножении матрицы на вектор.&lt;br /&gt;
При классификации по высоте ЯПФ Алгоритм Ланцоша относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;. При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}, i \geq j&amp;lt;/math&amp;gt;), число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n + 1)}{2} + 1&amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/поддиагональные элементы, единица относится к параметру &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
по &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;k+kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является субквадратичным: &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша без переортогонализации не является детерминированным (возможно выполнение меньшего числа итераций алгоритма), в случае если все собственные значения уже вычислены.&lt;br /&gt;
&lt;br /&gt;
Важное свойство метода Ланцоша состоит в том, что первыми в матрице &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; появляются собственные значения с максимальной величиной по модулю. Таким образом, метод особенно хорошо подходит для вычисления собственных значений матрицы &amp;lt;math&amp;gt;A&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;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации ===&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте IETL&amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/lanczos.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;/div&gt;</summary>
		<author><name>A.Freeman</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=12887</id>
		<title>Участник:A.Freeman/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=12887"/>
		<updated>2016-10-16T21:59:23Z</updated>

		<summary type="html">&lt;p&gt;A.Freeman: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша без переортогонализации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}+1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n+1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:KAKTUZ|Заспа А.Ю.]] ([[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]]),  [[Участник:A.Freeman|Фролов А.А.]] ([[#Последовательная сложность алгоритма|1.6]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Входные и выходные данные алгоритма|1.9]], [[#Свойства алгоритма|1.10]], [[#Существующие реализации|2.7]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; был опубликовн физиком и математиком Корнелием Ланцощем в 1950 году&amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот метод является частным случаем алгоритма Арнольда в случае, если исходная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - симметрична, и был представлен как итерационный метод вычисления собственных значений симметричной матрицы. Этот метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов исходной матрицы. Хотя алгоритм и был эффективным в вычислительном смысле, но он на некоторое время был предан забвению из-за численной неустойчивости. Только в 1970 Ojalvo и Newman модифицировали алгоритм для использования в арифметике с плавающей точкой&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;. Новый метод получил название [[Алгоритм Ланцоша с полной переортогонализацией | алгоритма Ланцоша с полной переортогонализацией]]. Но эта статья про его исходную версию.&lt;br /&gt;
На вход алгоритма подается вещественная симметричная матрица  &amp;lt;math&amp;gt;A = A^{T}&amp;lt;/math&amp;gt;,&lt;br /&gt;
{{Шаблон:ASymmetric}}&lt;br /&gt;
Поэтому достаточно хранить только чуть больше половины элементов исходной матрицы.&lt;br /&gt;
&lt;br /&gt;
Сам алгоритм соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца. На каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, состоящая из ортонормированных векторов Ланцоша. А в качестве приближенных собственных значений берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k \times k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 \\&lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 \\&lt;br /&gt;
&amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных значений и собственных векторов такой матрицы значительно проще чем их вычисление для исходной матрицы. Например, они могут быть вычислены с помощью [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы| метода «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]]. В этом методе эта процедура занимает &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций, где константа оказывается на практике довольно мала.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, начальный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: собственные вектора матрицы  &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; являющиеся столбцами матрицы &amp;lt;math&amp;gt;Q_k V&amp;lt;/math&amp;gt;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм на псевдокоде:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
q_1 = &amp;amp; \frac{b}{\|b\|_2},\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; if \; \beta_i == 0 \; then \; break\\&lt;br /&gt;
&amp;amp; q_{i+1} = \frac{z}{\beta_i}\\&lt;br /&gt;
end \; &amp;amp; for&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Затем вычислить собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром на каждой итерации является вычисление произведения матрицы на вектор:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&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;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
1. \, \beta_0 = &amp;amp; 0,\; q_0 = 0,\\&lt;br /&gt;
\|b\|_2 = &amp;amp;\sqrt{\sum\limits_{j=1}^{n} b_j^2},\\&lt;br /&gt;
2. \, q_{1_{j}} = &amp;amp;\frac{b_{j}}{\|b\|_2}, \; j = 1,\, \dots \,, n\\&lt;br /&gt;
for \; i = &amp;amp; 1 \; to \; k \\&lt;br /&gt;
3. \, z_j &amp;amp; = \sum\limits_{m=1}^{n} a_{jm} q_{i_m}, \; j = 1,\, \dots \,, n\\&lt;br /&gt;
4. \, \alpha_i &amp;amp; = \sum\limits_{j=1}^{n}q_j z_j\\&lt;br /&gt;
5. \, z_j &amp;amp; = z_j - \alpha_i q_{i_j} - \beta_{i-1}q_{i-1_j}, \, j = 1,\, \dots \,, n\\&lt;br /&gt;
6. \, \beta_i &amp;amp; = \|z\|_2 = \sqrt{\sum\limits_{j=1}^{n} z_m^2}\\&lt;br /&gt;
if \; \beta_i &amp;amp; == 0 \; then \; break\\&lt;br /&gt;
7. \, q_{i+1_j} &amp;amp; = \frac{z_j}{\beta_i}, \; j = 1,\, \dots \,, n\\&lt;br /&gt;
end \; &amp;amp; for&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычисления &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и соответствующих им собственных векторов алгоритмом Ланцоша без переортогонализации состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и нахождения собственных значений и векторов трехдиагональной симметричной матрицы порядка &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Инициализация состоит из следующих операций:&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; операций сложений&lt;br /&gt;
** извлечение квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций делений (нормирование)&lt;br /&gt;
Каждая из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций состоит из:&lt;br /&gt;
* умножение матрицы на вектор:&lt;br /&gt;
** &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* скалярное произведение двух векторов&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сложение&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; вычитаний&lt;br /&gt;
* норма вектора:&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&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; операций деления&lt;br /&gt;
&lt;br /&gt;
Итого (без учета решения трехдиагональной матрицы):&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2 + 4n) + n &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2+3n-2) +  n-1&amp;lt;/math&amp;gt; сложений/вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt; kn + n &amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; вычислений квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Для нахождение собственных значений и векторов трехдиагональной симметричной матрицы эффективней всего использовать [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы | метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]], который требует &amp;lt;math&amp;gt; O(k^3) &amp;lt;/math&amp;gt; операций.&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метод Ланцоша без переортогонализации относится к алгоритмам &#039;&#039;с квадратичной сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:Ланцош без переортогонализации 1.png|600px|thumb|center|Рисунок 1. Граф алгоритма без отображения входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы, &amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt;  — операция деления,  &amp;lt;math&amp;gt;\cdot &amp;lt;/math&amp;gt;  — операция умножения,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов,  &amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;  — линейный оператор.]]&lt;br /&gt;
[[Файл:Ланцош без переортогонализации 2.png|600px|thumb|center|Рисунок 2. Граф алгоритма с отображением входных и выходных данных.&amp;lt;br/&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы, &amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt;  — операция деления,  &amp;lt;math&amp;gt;\cdot &amp;lt;/math&amp;gt;  — операция умножения,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов,  &amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;  — линейный операторя,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{In}&amp;lt;/math&amp;gt; — входные данные, &amp;lt;math&amp;gt;\mathsf{Out}&amp;lt;/math&amp;gt; — выходные результат.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша в параллельной форме состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и вычисления собственных значений матрицы &amp;lt;math&amp;gt;T_k&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;\log n&amp;lt;/math&amp;gt; и линейную ширину ярусов &amp;lt;math&amp;gt;\frac{n}{2}, \frac{n}{4}, ... , 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Инициализации состоит из следующих операций:&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** вычисление скалярного произведения вектора самого на себя:&lt;br /&gt;
*** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итерационная часть алгоритма состоит из следующих операций:&lt;br /&gt;
* умножение матрицы на число:&lt;br /&gt;
** ярус умножений с шириной &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log n&amp;lt;/math&amp;gt; ярусов с наибольшей шириной &amp;lt;math&amp;gt;\frac{n^2}{2}&amp;lt;/math&amp;gt; (блок вычисления n сумм n элементов)&lt;br /&gt;
* вычисление скалярного произведения двух векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt;&lt;br /&gt;
** два яруса сложений шириной &amp;lt;math&amp;gt;n&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;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с максимальной шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, в параллельном варианте основную долю времени будут занимать операции сложения при умножении матрицы на вектор.&lt;br /&gt;
При классификации по высоте ЯПФ Алгоритм Ланцоша относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;. При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}, i \geq j&amp;lt;/math&amp;gt;), число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n + 1)}{2} + 1&amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/поддиагональные элементы, единица относится к параметру &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
по &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;k+kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является субквадратичным: &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша без переортогонализации не является детерминированным (возможно выполнение меньшего числа итераций алгоритма), в случае если все собственные значения уже вычислены.&lt;br /&gt;
&lt;br /&gt;
Важное свойство метода Ланцоша состоит в том, что первыми в матрице &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; появляются собственные значения с максимальной величиной по модулю. Таким образом, метод особенно хорошо подходит для вычисления собственных значений матрицы &amp;lt;math&amp;gt;A&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;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации ===&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте IETL&amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/lanczos.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;/div&gt;</summary>
		<author><name>A.Freeman</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=12883</id>
		<title>Участник:A.Freeman/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=12883"/>
		<updated>2016-10-16T21:45:10Z</updated>

		<summary type="html">&lt;p&gt;A.Freeman: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша без переортогонализации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}+1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n+1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:KAKTUZ|Заспа А.Ю.]] ([[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]]),  [[Участник:A.Freeman|Фролов А.А.]] ([[#Последовательная сложность алгоритма|1.6]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Входные и выходные данные алгоритма|1.9]], [[#Свойства алгоритма|1.10]], [[#Существующие реализации|2.7]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; был опубликовн физиком и математиком Корнелием Ланцощем в 1950 году&amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот метод является частным случаем алгоритма Арнольда в случае, если исходная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - симметрична, и был представлен как итерационный метод вычисления собственных значений симметричной матрицы. Этот метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов исходной матрицы. Хотя алгоритм и был эффективным в вычислительном смысле, но он на некоторое время был предан забвению из-за численной неустойчивости. Только в 1970 Ojalvo и Newman модифицировали алгоритм для использования в арифметике с плавающей точкой&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;. Новый метод получил название [[Алгоритм Ланцоша с полной переортогонализацией | алгоритма Ланцоша с полной переортогонализацией]]. Но эта статья про его исходную версию.&lt;br /&gt;
На вход алгоритма подается вещественная симметричная матрица  &amp;lt;math&amp;gt;A = A^{T}&amp;lt;/math&amp;gt;,&lt;br /&gt;
{{Шаблон:ASymmetric}}&lt;br /&gt;
Поэтому достаточно хранить только чуть больше половины элементов исходной матрицы.&lt;br /&gt;
&lt;br /&gt;
Сам алгоритм соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца. На каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, состоящая из ортонормированных векторов Ланцоша. А в качестве приближенных собственных значений берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k \times k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 \\&lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 \\&lt;br /&gt;
&amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных значений и собственных векторов такой матрицы значительно проще чем их вычисление для исходной матрицы. Например, они могут быть вычислены с помощью [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы| метода «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]]. В этом методе эта процедура занимает &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций, где константа оказывается на практике довольно мала.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, начальный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: собственные вектора матрицы  &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; являющиеся столбцами матрицы &amp;lt;math&amp;gt;Q_k V&amp;lt;/math&amp;gt;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм на псевдокоде:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
q_1 = &amp;amp; \frac{b}{\|b\|_2},\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; if \; \beta_i == 0 \; then \; break\\&lt;br /&gt;
&amp;amp; q_{i+1} = \frac{z}{\beta_i}\\&lt;br /&gt;
end \; &amp;amp; for&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Затем вычислить собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром на каждой итерации является вычисление произведения матрицы на вектор:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&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;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
1. \, \beta_0 = &amp;amp; 0,\; q_0 = 0,\\&lt;br /&gt;
\|b\|_2 = &amp;amp;\sqrt{\sum\limits_{j=1}^{n} b_j^2},\\&lt;br /&gt;
2. \, q_{1_{j}} = &amp;amp;\frac{b_{j}}{\|b\|_2}, \; j = 1,\, \dots \,, n\\&lt;br /&gt;
for \; i = &amp;amp; 1 \; to \; k \\&lt;br /&gt;
3. \, z_j &amp;amp; = \sum\limits_{m=1}^{n} a_{jm} q_{i_m}, \; j = 1,\, \dots \,, n\\&lt;br /&gt;
4. \, \alpha_i &amp;amp; = \sum\limits_{j=1}^{n}q_j z_j\\&lt;br /&gt;
5. \, z_j &amp;amp; = z_j - \alpha_i q_{i_j} - \beta_{i-1}q_{i-1_j}, \, j = 1,\, \dots \,, n\\&lt;br /&gt;
6. \, \beta_i &amp;amp; = \|z\|_2 = \sqrt{\sum\limits_{j=1}^{n} z_m^2}\\&lt;br /&gt;
if \; \beta_i &amp;amp; == 0 \; then \; break\\&lt;br /&gt;
7. \, q_{i+1_j} &amp;amp; = \frac{z_j}{\beta_i}, \; j = 1,\, \dots \,, n\\&lt;br /&gt;
end \; &amp;amp; for&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычисления &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и соответствующих им собственных векторов алгоритмом Ланцоша без переортогонализации состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и нахождения собственных значений и векторов трехдиагональной симметричной матрицы порядка &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Инициализация состоит из следующих операций:&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; операций сложений&lt;br /&gt;
** извлечение квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций делений (нормирование)&lt;br /&gt;
Каждая из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций состоит из:&lt;br /&gt;
* умножение матрицы на вектор:&lt;br /&gt;
** &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* скалярное произведение двух векторов&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сложение&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; вычитаний&lt;br /&gt;
* норма вектора:&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&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; операций деления&lt;br /&gt;
&lt;br /&gt;
Итого (без учета решения трехдиагональной матрицы):&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2 + 4n) + n &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2+3n-2) +  n-1&amp;lt;/math&amp;gt; сложений/вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt; kn + n &amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; вычислений квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Для нахождение собственных значений и векторов трехдиагональной симметричной матрицы эффективней всего использовать [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы | метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]], который требует &amp;lt;math&amp;gt; O(k^3) &amp;lt;/math&amp;gt; операций.&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метод Ланцоша без переортогонализации относится к алгоритмам &#039;&#039;с квадратичной сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;tleft&amp;quot; style=&amp;quot;clear:none&amp;quot;&amp;gt;[[Файл:Ланцош без переортогонализации 1.png|450px|thumb|center|Рисунок 1. Граф алгоритма без отображения входных и выходных данных. &amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы, &amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt;  — операция деления,  &amp;lt;math&amp;gt;Ax&amp;lt;/math&amp;gt;  — линейный оператор,  &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов,  &amp;lt;math&amp;gt;\cdot &amp;lt;/math&amp;gt;  — операция умножения.]] &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;tleft&amp;quot; style=&amp;quot;clear:none&amp;quot;&amp;gt;[[Файл:Ланцош без переортогонализации 2.png|450px|thumb|center|Рисунок 2. Граф алгоритма с отображением входных и выходных данных. &amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы, &amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt;  — операция деления,  &amp;lt;math&amp;gt;Ax&amp;lt;/math&amp;gt;  — линейный оператор,  &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов,  &amp;lt;math&amp;gt;\cdot &amp;lt;/math&amp;gt;  — операция умножения, In — входные данные, Out — выходные результат.]] &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша в параллельной форме состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и вычисления собственных значений матрицы &amp;lt;math&amp;gt;T_k&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;\log n&amp;lt;/math&amp;gt; и линейную ширину ярусов &amp;lt;math&amp;gt;\frac{n}{2}, \frac{n}{4}, ... , 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Инициализации состоит из следующих операций:&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** вычисление скалярного произведения вектора самого на себя:&lt;br /&gt;
*** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итерационная часть алгоритма состоит из следующих операций:&lt;br /&gt;
* умножение матрицы на число:&lt;br /&gt;
** ярус умножений с шириной &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log n&amp;lt;/math&amp;gt; ярусов с наибольшей шириной &amp;lt;math&amp;gt;\frac{n^2}{2}&amp;lt;/math&amp;gt; (блок вычисления n сумм n элементов)&lt;br /&gt;
* вычисление скалярного произведения двух векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt;&lt;br /&gt;
** два яруса сложений шириной &amp;lt;math&amp;gt;n&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;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с максимальной шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, в параллельном варианте основную долю времени будут занимать операции сложения при умножении матрицы на вектор.&lt;br /&gt;
При классификации по высоте ЯПФ Алгоритм Ланцоша относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;. При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}, i \geq j&amp;lt;/math&amp;gt;), число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n + 1)}{2} + 1&amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/поддиагональные элементы, единица относится к параметру &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
по &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;k+kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является субквадратичным: &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша без переортогонализации не является детерминированным (возможно выполнение меньшего числа итераций алгоритма), в случае если все собственные значения уже вычислены.&lt;br /&gt;
&lt;br /&gt;
Важное свойство метода Ланцоша состоит в том, что первыми в матрице &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; появляются собственные значения с максимальной величиной по модулю. Таким образом, метод особенно хорошо подходит для вычисления собственных значений матрицы &amp;lt;math&amp;gt;A&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;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации ===&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте IETL&amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/lanczos.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;/div&gt;</summary>
		<author><name>A.Freeman</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=12733</id>
		<title>Участник:A.Freeman/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=12733"/>
		<updated>2016-10-16T18:50:15Z</updated>

		<summary type="html">&lt;p&gt;A.Freeman: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша без переортогонализации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}+1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n+1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:KAKTUZ|Заспа А.Ю.]] ([[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]]),  [[Участник:A.Freeman|Фролов А.А.]] ([[#Последовательная сложность алгоритма|1.6]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Входные и выходные данные алгоритма|1.9]], [[#Свойства алгоритма|1.10]], [[#Существующие реализации|2.7]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; был опубликовн физиком и математиком Корнелием Ланцощем в 1950 году&amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот метод является частным случаем алгоритма Арнольда в случае, если исходная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - симметрична, и был представлен как итерационный метод вычисления собственных значений симметричной матрицы. Этот метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов исходной матрицы. Хотя алгоритм и был эффективным в вычислительном смысле, но он на некоторое время был предан забвению из-за численной неустойчивости. Только в 1970 Ojalvo и Newman модифицировали алгоритм для использования в арифметике с плавающей точкой&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;. Новый метод получил название [[Алгоритм Ланцоша с полной переортогонализацией | алгоритма Ланцоша с полной переортогонализацией]]. Но эта статья про его исходную версию.&lt;br /&gt;
На вход алгоритма подается вещественная симметричная матрица  &amp;lt;math&amp;gt;A = A^{T}&amp;lt;/math&amp;gt;,&lt;br /&gt;
{{Шаблон:ASymmetric}}&lt;br /&gt;
Поэтому достаточно хранить только чуть больше половины элементов исходной матрицы.&lt;br /&gt;
&lt;br /&gt;
Сам алгоритм соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца. На каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, состоящая из ортонормированных векторов Ланцоша. А в качестве приближенных собственных значений берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k \times k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 \\&lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 \\&lt;br /&gt;
&amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных значений и собственных векторов такой матрицы значительно проще чем их вычисление для исходной матрицы. Например, они могут быть вычислены с помощью [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы| метода «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]]. В этом методе эта процедура занимает &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций, где константа оказывается на практике довольно мала.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, начальный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: собственные вектора матрицы  &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; являющиеся столбцами матрицы &amp;lt;math&amp;gt;Q_k V&amp;lt;/math&amp;gt;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм на псевдокоде:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
q_1 = &amp;amp; \frac{b}{\|b\|_2},\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; if \; \beta_i == 0 \; then \; break\\&lt;br /&gt;
&amp;amp; q_{i+1} = \frac{z}{\beta_i}\\&lt;br /&gt;
end \; &amp;amp; for&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Затем вычислить собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром на каждой итерации является вычисление произведения матрицы на вектор:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&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;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
1. \, \beta_0 = &amp;amp; 0,\; q_0 = 0,\\&lt;br /&gt;
\|b\|_2 = &amp;amp;\sqrt{\sum\limits_{j=1}^{n} b_j^2},\\&lt;br /&gt;
2. \, q_{1_{j}} = &amp;amp;\frac{b_{j}}{\|b\|_2}, \; j = 1,\, \dots \,, n\\&lt;br /&gt;
for \; i = &amp;amp; 1 \; to \; k \\&lt;br /&gt;
3. \, z_j &amp;amp; = \sum\limits_{m=1}^{n} a_{jm} q_{i_m}, \; j = 1,\, \dots \,, n\\&lt;br /&gt;
4. \, \alpha_i &amp;amp; = \sum\limits_{j=1}^{n}q_j z_j\\&lt;br /&gt;
5. \, z_j &amp;amp; = z_j - \alpha_i q_{i_j} - \beta_{i-1}q_{i-1_j}, \, j = 1,\, \dots \,, n\\&lt;br /&gt;
6. \, \beta_i &amp;amp; = \|z\|_2 = \sqrt{\sum\limits_{j=1}^{n} z_m^2}\\&lt;br /&gt;
if \; \beta_i &amp;amp; == 0 \; then \; break\\&lt;br /&gt;
7. \, q_{i+1_j} &amp;amp; = \frac{z_j}{\beta_i}, \; j = 1,\, \dots \,, n\\&lt;br /&gt;
end \; &amp;amp; for&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычисления &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и соответствующих им собственных векторов алгоритмом Ланцоша без переортогонализации состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и нахождения собственных значений и векторов трехдиагональной симметричной матрицы порядка &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Инициализация состоит из следующих операций:&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; операций сложений&lt;br /&gt;
** извлечение квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций делений (нормирование)&lt;br /&gt;
Каждая из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций состоит из:&lt;br /&gt;
* умножение матрицы на вектор:&lt;br /&gt;
** &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* скалярное произведение двух векторов&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сложение&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; вычитаний&lt;br /&gt;
* норма вектора:&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&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; операций деления&lt;br /&gt;
&lt;br /&gt;
Итого (без учета решения трехдиагональной матрицы):&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2 + 4n) + n &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2+3n-2) +  n-1&amp;lt;/math&amp;gt; сложений/вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt; kn + n &amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; вычислений квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Для нахождение собственных значений и векторов трехдиагональной симметричной матрицы эффективней всего использовать [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы | метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]], который требует &amp;lt;math&amp;gt; O(k^3) &amp;lt;/math&amp;gt; операций.&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метод Ланцоша без переортогонализации относится к алгоритмам &#039;&#039;с квадратичной сложностью&#039;&#039;.&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;
Алгоритм Ланцоша в параллельной форме состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и вычисления собственных значений матрицы &amp;lt;math&amp;gt;T_k&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;\log n&amp;lt;/math&amp;gt; и линейную ширину ярусов &amp;lt;math&amp;gt;\frac{n}{2}, \frac{n}{4}, ... , 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Инициализации состоит из следующих операций:&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** вычисление скалярного произведения вектора самого на себя:&lt;br /&gt;
*** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итерационная часть алгоритма состоит из следующих операций:&lt;br /&gt;
* умножение матрицы на число:&lt;br /&gt;
** ярус умножений с шириной &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log n&amp;lt;/math&amp;gt; ярусов с наибольшей шириной &amp;lt;math&amp;gt;\frac{n^2}{2}&amp;lt;/math&amp;gt; (блок вычисления n сумм n элементов)&lt;br /&gt;
* вычисление скалярного произведения двух векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt;&lt;br /&gt;
** два яруса сложений шириной &amp;lt;math&amp;gt;n&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;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с максимальной шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, в параллельном варианте основную долю времени будут занимать операции сложения при умножении матрицы на вектор.&lt;br /&gt;
При классификации по высоте ЯПФ Алгоритм Ланцоша относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;. При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}, i \geq j&amp;lt;/math&amp;gt;), число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n + 1)}{2} + 1&amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/поддиагональные элементы, единица относится к параметру &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
по &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;k+kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является субквадратичным: &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша без переортогонализации не является детерминированным (возможно выполнение меньшего числа итераций алгоритма), в случае если все собственные значения уже вычислены.&lt;br /&gt;
&lt;br /&gt;
Важное свойство метода Ланцоша состоит в том, что первыми в матрице &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; появляются собственные значения с максимальной величиной по модулю. Таким образом, метод особенно хорошо подходит для вычисления собственных значений матрицы &amp;lt;math&amp;gt;A&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;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации ===&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте IETL&amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/lanczos.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;/div&gt;</summary>
		<author><name>A.Freeman</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=12730</id>
		<title>Участник:A.Freeman/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=12730"/>
		<updated>2016-10-16T18:49:20Z</updated>

		<summary type="html">&lt;p&gt;A.Freeman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша без переортогонализации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}+1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n+1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:KAKTUZ|Заспа А.Ю.]] ([[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]]),  [[Участник:A.Freeman|Фролов А.А.]] ([[#Последовательная сложность алгоритма|1.6]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Входные и выходные данные алгоритма|1.9]], [[#Свойства алгоритма|1.10]], [[#Существующие реализации|2.7]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; был опубликовн физиком и математиком Корнелием Ланцощем в 1950 году&amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот метод является частным случаем алгоритма Арнольда в случае, если исходная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - симметрична, и был представлен как итерационный метод вычисления собственных значений симметричной матрицы. Этот метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов исходной матрицы. Хотя алгоритм и был эффективным в вычислительном смысле, но он на некоторое время был предан забвению из-за численной неустойчивости. Только в 1970 Ojalvo и Newman модифицировали алгоритм для использования в арифметике с плавающей точкой&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;. Новый метод получил название [[Алгоритм Ланцоша с полной переортогонализацией | алгоритма Ланцоша с полной переортогонализацией]]. Но эта статья про его исходную версию.&lt;br /&gt;
На вход алгоритма подается вещественная симметричная матрица  &amp;lt;math&amp;gt;A = A^{T}&amp;lt;/math&amp;gt;,&lt;br /&gt;
{{Шаблон:ASymmetric}}&lt;br /&gt;
Поэтому достаточно хранить только чуть больше половины элементов исходной матрицы.&lt;br /&gt;
&lt;br /&gt;
Сам алгоритм соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца. На каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, состоящая из ортонормированных векторов Ланцоша. А в качестве приближенных собственных значений берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k \times k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 \\&lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 \\&lt;br /&gt;
&amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных значений и собственных векторов такой матрицы значительно проще чем их вычисление для исходной матрицы. Например, они могут быть вычислены с помощью [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы| метода «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]]. В этом методе эта процедура занимает &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций, где константа оказывается на практике довольно мала.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, начальный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: собственные вектора матрицы  &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; являющиеся столбцами матрицы &amp;lt;math&amp;gt;Q_k V&amp;lt;/math&amp;gt;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм на псевдокоде:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
q_1 = &amp;amp; \frac{b}{\|b\|_2},\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; if \; \beta_i == 0 \; then \; break\\&lt;br /&gt;
&amp;amp; q_{i+1} = \frac{z}{\beta_i}\\&lt;br /&gt;
end \; &amp;amp; for&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Затем вычислить собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром на каждой итерации является вычисление произведения матрицы на вектор:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&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;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
1. \, \beta_0 = &amp;amp; 0,\; q_0 = 0,\\&lt;br /&gt;
\|b\|_2 = &amp;amp;\sqrt{\sum\limits_{j=1}^{n} b_j^2},\\&lt;br /&gt;
2. \, q_{1_{j}} = &amp;amp;\frac{b_{j}}{\|b\|_2}, \; j = 1,\, \dots \,, n\\&lt;br /&gt;
for \; i = &amp;amp; 1 \; to \; k \\&lt;br /&gt;
3. \, z_j &amp;amp; = \sum\limits_{m=1}^{n} a_{jm} q_{i_m}, \; j = 1,\, \dots \,, n\\&lt;br /&gt;
4. \, \alpha_i &amp;amp; = \sum\limits_{j=1}^{n}q_j z_j\\&lt;br /&gt;
5. \, z_j &amp;amp; = z_j - \alpha_i q_{i_j} - \beta_{i-1}q_{i-1_j}, \, j = 1,\, \dots \,, n\\&lt;br /&gt;
6. \, \beta_i &amp;amp; = \|z\|_2 = \sqrt{\sum\limits_{j=1}^{n} z_m^2}\\&lt;br /&gt;
if \; \beta_i &amp;amp; == 0 \; then \; break\\&lt;br /&gt;
7. \, q_{i+1_j} &amp;amp; = \frac{z_j}{\beta_i}, \; j = 1,\, \dots \,, n\\&lt;br /&gt;
end \; &amp;amp; for&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычисления &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и соответствующих им собственных векторов алгоритмом Ланцоша без переортогонализации состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и нахождения собственных значений и векторов трехдиагональной симметричной матрицы порядка &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Инициализация состоит из следующих операций:&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; операций сложений&lt;br /&gt;
** извлечение квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций делений (нормирование)&lt;br /&gt;
Каждая из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций состоит из:&lt;br /&gt;
* умножение матрицы на вектор:&lt;br /&gt;
** &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* скалярное произведение двух векторов&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сложение&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; вычитаний&lt;br /&gt;
* норма вектора:&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&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; операций деления&lt;br /&gt;
&lt;br /&gt;
Итого (без учета решения трехдиагональной матрицы):&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2 + 4n) + n &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2+3n-2) +  n-1&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt; kn + n &amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; вычислений квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Для нахождение собственных значений и векторов трехдиагональной симметричной матрицы эффективней всего использовать [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы | метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]], который требует &amp;lt;math&amp;gt; O(k^3) &amp;lt;/math&amp;gt; операций.&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метод Ланцоша без переортогонализации относится к алгоритмам &#039;&#039;с квадратичной сложностью&#039;&#039;.&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;
Алгоритм Ланцоша в параллельной форме состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и вычисления собственных значений матрицы &amp;lt;math&amp;gt;T_k&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;\log n&amp;lt;/math&amp;gt; и линейную ширину ярусов &amp;lt;math&amp;gt;\frac{n}{2}, \frac{n}{4}, ... , 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Инициализации состоит из следующих операций:&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** вычисление скалярного произведения вектора самого на себя:&lt;br /&gt;
*** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итерационная часть алгоритма состоит из следующих операций:&lt;br /&gt;
* умножение матрицы на число:&lt;br /&gt;
** ярус умножений с шириной &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log n&amp;lt;/math&amp;gt; ярусов с наибольшей шириной &amp;lt;math&amp;gt;\frac{n^2}{2}&amp;lt;/math&amp;gt; (блок вычисления n сумм n элементов)&lt;br /&gt;
* вычисление скалярного произведения двух векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt;&lt;br /&gt;
** два яруса сложений шириной &amp;lt;math&amp;gt;n&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;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с максимальной шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, в параллельном варианте основную долю времени будут занимать операции сложения при умножении матрицы на вектор.&lt;br /&gt;
При классификации по высоте ЯПФ Алгоритм Ланцоша относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;. При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}, i \geq j&amp;lt;/math&amp;gt;), число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n + 1)}{2} + 1&amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/поддиагональные элементы, единица относится к параметру &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
по &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;k+kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является субквадратичным: &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша без переортогонализации не является детерминированным (возможно выполнение меньшего числа итераций алгоритма), в случае если все собственные значения уже вычислены.&lt;br /&gt;
&lt;br /&gt;
Важное свойство метода Ланцоша состоит в том, что первыми в матрице &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; появляются собственные значения с максимальной величиной по модулю. Таким образом, метод особенно хорошо подходит для вычисления собственных значений матрицы &amp;lt;math&amp;gt;A&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;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации ===&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте IETL&amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/lanczos.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;/div&gt;</summary>
		<author><name>A.Freeman</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=12721</id>
		<title>Участник:A.Freeman/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=12721"/>
		<updated>2016-10-16T18:32:31Z</updated>

		<summary type="html">&lt;p&gt;A.Freeman: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша без переортогонализации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}+1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n+1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:KAKTUZ|Заспа А.Ю.]],  [[Участник:A.Freeman|Фролов А.А.]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; был опубликовн физиком и математиком Корнелием Ланцощем в 1950 году&amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот метод является частным случаем алгоритма Арнольда в случае, если исходная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - симметрична, и был представлен как итерационный метод вычисления собственных значений симметричной матрицы. Этот метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов исходной матрицы. Хотя алгоритм и был эффективным в вычислительном смысле, но он на некоторое время был предан забвению из-за численной неустойчивости. Только в 1970 Ojalvo и Newman модифицировали алгоритм для использования в арифметике с плавающей точкой&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;. Новый метод получил название [[Алгоритм Ланцоша с полной переортогонализацией | алгоритма Ланцоша с полной переортогонализацией]]. Но эта статья про его исходную версию.&lt;br /&gt;
На вход алгоритма подается вещественная симметричная матрица  &amp;lt;math&amp;gt;A = A^{T}&amp;lt;/math&amp;gt;,&lt;br /&gt;
{{Шаблон:ASymmetric}}&lt;br /&gt;
Поэтому достаточно хранить только чуть больше половины элементов исходной матрицы.&lt;br /&gt;
&lt;br /&gt;
Сам алгоритм соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца. На каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, состоящая из ортонормированных векторов Ланцоша. А в качестве приближенных собственных значений берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k \times k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 \\&lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 \\&lt;br /&gt;
&amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных значений и собственных векторов такой матрицы значительно проще чем их вычисление для исходной матрицы. Например, они могут быть вычислены с помощью [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы| метода «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]]. В этом методе эта процедура занимает &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций, где константа оказывается на практике довольно мала.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, начальный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: собственные вектора матрицы  &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; являющиеся столбцами матрицы &amp;lt;math&amp;gt;Q_k V&amp;lt;/math&amp;gt;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм на псевдокоде:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
q_1 = &amp;amp; \frac{b}{\|b\|_2},\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; if \; \beta_i == 0 \; then \; break\\&lt;br /&gt;
&amp;amp; q_{i+1} = \frac{z}{\beta_i}\\&lt;br /&gt;
end \; &amp;amp; for&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Затем вычислить собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром на каждой итерации является вычисление произведения матрицы на вектор:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&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;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
1. \, \beta_0 = &amp;amp; 0,\; q_0 = 0,\\&lt;br /&gt;
\|b\|_2 = &amp;amp;\sqrt{\sum\limits_{j=1}^{n} b_j^2},\\&lt;br /&gt;
2. \, q_{1_{j}} = &amp;amp;\frac{b_{j}}{\|b\|_2}, \; j = 1,\, \dots \,, n\\&lt;br /&gt;
for \; i = &amp;amp; 1 \; to \; k \\&lt;br /&gt;
3. \, z_j &amp;amp; = \sum\limits_{m=1}^{n} a_{jm} q_{i_m}, \; j = 1,\, \dots \,, n\\&lt;br /&gt;
4. \, \alpha_i &amp;amp; = \sum\limits_{j=1}^{n}q_j z_j\\&lt;br /&gt;
5. \, z_j &amp;amp; = z_j - \alpha_i q_{i_j} - \beta_{i-1}q_{i-1_j}, \, j = 1,\, \dots \,, n\\&lt;br /&gt;
6. \, \beta_i &amp;amp; = \|z\|_2 = \sqrt{\sum\limits_{j=1}^{n} z_m^2}\\&lt;br /&gt;
if \; \beta_i &amp;amp; == 0 \; then \; break\\&lt;br /&gt;
7. \, q_{i+1_j} &amp;amp; = \frac{z_j}{\beta_i}, \; j = 1,\, \dots \,, n\\&lt;br /&gt;
end \; &amp;amp; for&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычисления &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и соответствующих им собственных векторов алгоритмом Ланцоша без переортогонализации состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и нахождения собственных значений и векторов трехдиагональной симметричной матрицы порядка &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Инициализация состоит из следующих операций:&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; операций сложений&lt;br /&gt;
** извлечение квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций делений (нормирование)&lt;br /&gt;
Каждая из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций состоит из:&lt;br /&gt;
* умножение матрицы на вектор:&lt;br /&gt;
** &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* скалярное произведение двух векторов&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сложение&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; вычитаний&lt;br /&gt;
* норма вектора:&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&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; операций деления&lt;br /&gt;
&lt;br /&gt;
Итого (без учета решения трехдиагональной матрицы):&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2 + 4n) + n &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2+3n-2) +  n-1&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt; kn + n &amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; вычислений квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Для нахождение собственных значений и векторов трехдиагональной симметричной матрицы эффективней всего использовать [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы | метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]], который требует &amp;lt;math&amp;gt; O(k^3) &amp;lt;/math&amp;gt; операций.&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метод Ланцоша без переортогонализации относится к алгоритмам &#039;&#039;с квадратичной сложностью&#039;&#039;.&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;
Алгоритм Ланцоша в параллельной форме состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и вычисления собственных значений матрицы &amp;lt;math&amp;gt;T_k&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;\log n&amp;lt;/math&amp;gt; и линейную ширину ярусов &amp;lt;math&amp;gt;\frac{n}{2}, \frac{n}{4}, ... , 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Инициализации состоит из следующих операций:&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** вычисление скалярного произведения вектора самого на себя:&lt;br /&gt;
*** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итерационная часть алгоритма состоит из следующих операций:&lt;br /&gt;
* умножение матрицы на число:&lt;br /&gt;
** ярус умножений с шириной &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log n&amp;lt;/math&amp;gt; ярусов с наибольшей шириной &amp;lt;math&amp;gt;\frac{n^2}{2}&amp;lt;/math&amp;gt; (блок вычисления n сумм n элементов)&lt;br /&gt;
* вычисление скалярного произведения двух векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt;&lt;br /&gt;
** два яруса сложений шириной &amp;lt;math&amp;gt;n&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;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с максимальной шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, в параллельном варианте основную долю времени будут занимать операции сложения при умножении матрицы на вектор.&lt;br /&gt;
При классификации по высоте ЯПФ Алгоритм Ланцоша относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;. При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}, i \geq j&amp;lt;/math&amp;gt;), число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n + 1)}{2} + 1&amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/поддиагональные элементы, единица относится к параметру &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
по &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;k+kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является субквадратичным: &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша без переортогонализации не является детерминированным (возможно выполнение меньшего числа итераций алгоритма), в случае если все собственные значения уже вычислены.&lt;br /&gt;
&lt;br /&gt;
Важное свойство метода Ланцоша состоит в том, что первыми в матрице &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; появляются собственные значения с максимальной величиной по модулю. Таким образом, метод особенно хорошо подходит для вычисления собственных значений матрицы &amp;lt;math&amp;gt;A&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;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации ===&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте IETL&amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/lanczos.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;/div&gt;</summary>
		<author><name>A.Freeman</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=12338</id>
		<title>Участник:A.Freeman/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=12338"/>
		<updated>2016-10-15T23:34:48Z</updated>

		<summary type="html">&lt;p&gt;A.Freeman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша без переортогонализации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}+1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n+1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:KAKTUZ|Заспа А.Ю.]],  [[Участник:A.Freeman|Фролов А.А.]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; был опубликовн физиком и математиком Корнелием Ланцощем в 1950 году&amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот метод является частным случаем алгоритма Арнольда в случае, если исходная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - симметрична, и был представлен как итерационный метод вычисления собственных значений симметричной матрицы. Этот метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов исходной матрицы. Хотя алгоритм и был эффективным в вычислительном смысле, но он на некоторое время был предан забвению из-за численной неустойчивости. Только в 1970 Ojalvo и Newman модифицировали алгоритм для использования в арифметике с плавающей точкой&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;. Новый метод получил название [[Алгоритм Ланцоша с полной переортогонализацией | алгоритма Ланцоша с полной переортогонализацией]]. Но эта статья про его исходную версию.&lt;br /&gt;
На вход алгоритма подается вещественная симметричная матрица  &amp;lt;math&amp;gt;A = A^{T}&amp;lt;/math&amp;gt;,&lt;br /&gt;
{{Шаблон:ASymmetric}}&lt;br /&gt;
Поэтому достаточно хранить только чуть больше половины элементов исходной матрицы.&lt;br /&gt;
&lt;br /&gt;
Сам алгоритм соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца. На каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, состоящая из ортонормированных векторов Ланцоша. А в качестве приближенных собственных значений берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k \times k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 \\&lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 \\&lt;br /&gt;
&amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных значений и собственных векторов такой матрицы значительно проще чем их вычисление для исходной матрицы. Например, они могут быть вычислены с помощью [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы| метода «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]]. В этом методе эта процедура занимает &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций, где константа оказывается на практике довольно мала.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, начальный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: собственные вектора матрицы  &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; являющиеся столбцами матрицы &amp;lt;math&amp;gt;Q_k V&amp;lt;/math&amp;gt;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм на псевдокоде:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
q_1 = &amp;amp; \frac{b}{\|b\|_2},\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; if \; \beta_i == 0 \; then \; break\\&lt;br /&gt;
&amp;amp; q_{i+1} = \frac{z}{\beta_i}\\&lt;br /&gt;
end \; &amp;amp; for&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Затем вычислить собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром на каждой итерации является вычисление произведения матрицы на вектор:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&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;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
1. \, \beta_0 = &amp;amp; 0,\; q_0 = 0,\\&lt;br /&gt;
\|b\|_2 = &amp;amp;\sqrt{\sum\limits_{j=1}^{n} b_j^2},\\&lt;br /&gt;
2. \, q_{1_{j}} = &amp;amp;\frac{b_{j}}{\|b\|_2}, \; j = 1,\, \dots \,, n\\&lt;br /&gt;
for \; i = &amp;amp; 1 \; to \; k \\&lt;br /&gt;
3. \, z_j &amp;amp; = \sum\limits_{m=1}^{n} a_{jm} q_{i_m}, \; j = 1,\, \dots \,, n\\&lt;br /&gt;
4. \, \alpha_i &amp;amp; = \sum\limits_{j=1}^{n}q_j z_j\\&lt;br /&gt;
5. \, z_j &amp;amp; = z_j - \alpha_i q_{i_j} - \beta_{i-1}q_{i-1_j}, \, j = 1,\, \dots \,, n\\&lt;br /&gt;
6. \, \beta_i &amp;amp; = \|z\|_2 = \sqrt{\sum\limits_{j=1}^{n} z_m^2}\\&lt;br /&gt;
if \; \beta_i &amp;amp; == 0 \; then \; break\\&lt;br /&gt;
7. \, q_{i+1_j} &amp;amp; = \frac{z_j}{\beta_i}, \; j = 1,\, \dots \,, n\\&lt;br /&gt;
end \; &amp;amp; for&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычисления &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и соответствующих им собственных векторов алгоритмом Ланцоша без переортогонализации состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и нахождения собственных значений и векторов трехдиагональной симметричной матрицы порядка &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Инициализация состоит из следующих операций:&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; операций сложений&lt;br /&gt;
** извлечение квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций делений (нормирование)&lt;br /&gt;
Каждая из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций состоит из:&lt;br /&gt;
* умножение матрицы на вектор:&lt;br /&gt;
** &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* скалярное произведение двух векторов&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сложение&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; вычитаний&lt;br /&gt;
* норма вектора:&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&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; операций деления&lt;br /&gt;
&lt;br /&gt;
Итого (без учета решения трехдиагональной матрицы):&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2 + 4n) + n &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2+3n-2) +  n-1&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt; kn + n &amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; вычислений квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Для нахождение собственных значений и векторов трехдиагональной симметричной матрицы эффективней всего использовать [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы | метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]], который требует &amp;lt;math&amp;gt; O(k^3) &amp;lt;/math&amp;gt; операций.&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метод Ланцоша без переортогонализации относится к алгоритмам &#039;&#039;с квадратичной сложностью&#039;&#039;.&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;
Алгоритм Ланцоша в параллельной форме состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и вычисления собственных значений матрицы &amp;lt;math&amp;gt;T_k&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;\log n&amp;lt;/math&amp;gt; и линейную ширину ярусов &amp;lt;math&amp;gt;\frac{n}{2}, \frac{n}{4}, ... , 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Инициализации состоит из следующих операций:&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** вычисление скалярного произведения вектора самого на себя:&lt;br /&gt;
*** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итерационная часть алгоритма состоит из следующих операций:&lt;br /&gt;
* умножение матрицы на число:&lt;br /&gt;
** ярус умножений с шириной &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log n&amp;lt;/math&amp;gt; ярусов с наибольшей шириной &amp;lt;math&amp;gt;\frac{n^2}{2}&amp;lt;/math&amp;gt; (блок вычисления n сумм n элементов)&lt;br /&gt;
* вычисление скалярного произведения двух векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt;&lt;br /&gt;
** два яруса сложений шириной &amp;lt;math&amp;gt;n&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;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с максимальной шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, в параллельном варианте основную долю времени будут занимать операции сложения при умножении матрицы на вектор.&lt;br /&gt;
При классификации по высоте ЯПФ Алгоритм Ланцоша относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;. При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}, i \geq j&amp;lt;/math&amp;gt;), число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n + 1)}{2} + 1&amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/поддиагональные элементы, единица относится к параметру &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
по &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;k+kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является субквадратичным: &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&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;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации ===&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте IETL&amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/lanczos.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;/div&gt;</summary>
		<author><name>A.Freeman</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=12333</id>
		<title>Алгоритм Ланцоша для точной арифметики (без переортогонализации)</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=12333"/>
		<updated>2016-10-15T23:33:16Z</updated>

		<summary type="html">&lt;p&gt;A.Freeman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша без переортогонализации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:KAKTUZ|А.Ю.Заспа]] ([[#Описание локальности данных и вычислений|раздел 2.2]]), [[Участник:A.Freeman| А.А.Фролов]] &lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; был опубликовн физиком и математиком Корнелием Ланцощем в 1950 году. Этот метод является частным случаем алгоритма Арнольда в случае, если исходная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - симметрична, и был представлен как итерационный метод вычисления собственных значений симметричной матрицы. Этот метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов исходной матрицы. Хотя алгоритм и был эффективным в вычислительном смысле, но он на некоторое время был предан забвению из-за численной неустойчивости. Только в 1970 Ojalvo и Newman модифицировали алгоритм для использования в арифметике с плавающей точкой. Новый метод получил название [[Алгоритм Ланцоша с полной переортогонализацией | алгоритма Ланцоша с полной переортогонализацией]]. Но эта статья про его исходную версию.&lt;br /&gt;
На вход алгоритма подается вещественная симметричная матрица  &amp;lt;math&amp;gt;A = A^{T}&amp;lt;/math&amp;gt;,&lt;br /&gt;
{{Шаблон:ASymmetric}}&lt;br /&gt;
Поэтому достаточно хранить только чуть больше половины элементов исходной матрицы.&lt;br /&gt;
&lt;br /&gt;
Сам алгоритм соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца. На каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, состоящая из ортонормированных векторов Ланцоша. А в качестве приближенных собственных значений берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k \times k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 \\&lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 \\&lt;br /&gt;
&amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных значений и собственных векторов такой матрицы значительно проще чем их вычисление для исходной матрицы. Например, они могут быть вычислены с помощью [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы| метода «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]]. В этом методе эта процедура занимает &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций, где константа оказывается на практике довольно мала.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, начальный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: собственные вектора матрицы  &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; являющиеся столбцами матрицы &amp;lt;math&amp;gt;Q_k V&amp;lt;/math&amp;gt;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм на псевдокоде:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
q_1 = &amp;amp; \frac{b}{\|b\|_2},\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; if \; \beta_i == 0 \; then \; break\\&lt;br /&gt;
&amp;amp; q_{i+1} = \frac{z}{\beta_i}\\&lt;br /&gt;
end \; &amp;amp; for&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Затем вычислить собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром на каждой итерации является вычисление произведения матрицы на вектор:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&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;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
1. \, \beta_0 = &amp;amp; 0,\; q_0 = 0,\\&lt;br /&gt;
\|b\|_2 = &amp;amp;\sqrt{\sum\limits_{j=1}^{n} b_j^2},\\&lt;br /&gt;
2. \, q_{1_{j}} = &amp;amp;\frac{b_{j}}{\|b\|_2}, \; j = 1,\, \dots \,, n\\&lt;br /&gt;
for \; i = &amp;amp; 1 \; to \; k \\&lt;br /&gt;
3. \, z_j &amp;amp; = \sum\limits_{m=1}^{n} a_{jm} q_{i_m}, \; j = 1,\, \dots \,, n\\&lt;br /&gt;
4. \, \alpha_i &amp;amp; = \sum\limits_{j=1}^{n}q_j z_j\\&lt;br /&gt;
5. \, z_j &amp;amp; = z_j - \alpha_i q_{i_j} - \beta_{i-1}q_{i-1_j}, \, j = 1,\, \dots \,, n\\&lt;br /&gt;
6. \, \beta_i &amp;amp; = \|z\|_2 = \sqrt{\sum\limits_{j=1}^{n} z_m^2}\\&lt;br /&gt;
if \; \beta_i &amp;amp; == 0 \; then \; break\\&lt;br /&gt;
7. \, q_{i+1_j} &amp;amp; = \frac{z_j}{\beta_i}, \; j = 1,\, \dots \,, n\\&lt;br /&gt;
end \; &amp;amp; for&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для вычисления &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и соответствующих им собственных векторов алгоритмом Ланцоша без переортогонализации в худшем случае требуется:&lt;br /&gt;
* &amp;lt;math&amp;gt; kn^2 + 4 kn + n &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; вычислений квадратного корня,&lt;br /&gt;
* &amp;lt;math&amp;gt; n(k + 1) &amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt; n + k(n^2+3n-1)&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* нахождение собственных значений и векторов трехдиагональной симметричной матрицы размера &amp;lt;math&amp;gt; k \times k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Для нахождение собственных значений и векторов трехдиагональной симметричной матрицы эффективней всего использовать [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы | метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]], который требует &amp;lt;math&amp;gt; O(k^3) &amp;lt;/math&amp;gt; операций.&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метод Ланцоша без переортогонализации относится к алгоритмам &#039;&#039;с квадратичной сложностью&#039;&#039;.&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;
Алгоритм Ланцоша в параллельной форме состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и вычисления собственных значений матрицы &amp;lt;math&amp;gt;T_k&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;\log n&amp;lt;/math&amp;gt; и линейную ширину ярусов &amp;lt;math&amp;gt;\frac{n}{2}, \frac{n}{4}, ... , 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Инициализации состоит из следующих операций:&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** вычисление скалярного произведения вектора самого на себя:&lt;br /&gt;
*** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итерационная часть алгоритма состоит из следующих операций:&lt;br /&gt;
* умножение матрицы на число:&lt;br /&gt;
** ярус умножений с шириной &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log n&amp;lt;/math&amp;gt; ярусов с наибольшей шириной &amp;lt;math&amp;gt;\frac{n^2}{2}&amp;lt;/math&amp;gt; (блок вычисления n сумм n элементов)&lt;br /&gt;
* вычисление скалярного произведения двух векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt;&lt;br /&gt;
** два яруса сложений шириной &amp;lt;math&amp;gt;n&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;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с максимальной шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, в параллельном варианте основную долю времени будут занимать операции сложения при умножении матрицы на вектор.&lt;br /&gt;
При классификации по высоте ЯПФ Алгоритм Ланцоша относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;. При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;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;
TBD&lt;br /&gt;
&lt;br /&gt;
== Программная реализация ==&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации ===&lt;/div&gt;</summary>
		<author><name>A.Freeman</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=12329</id>
		<title>Участник:A.Freeman/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=12329"/>
		<updated>2016-10-15T23:30:38Z</updated>

		<summary type="html">&lt;p&gt;A.Freeman: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша без переортогонализации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}+1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k + kn&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:KAKTUZ|Заспа А.Ю.]],  [[Участник:A.Freeman|Фролов А.А.]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; был опубликовн физиком и математиком Корнелием Ланцощем в 1950 году&amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот метод является частным случаем алгоритма Арнольда в случае, если исходная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - симметрична, и был представлен как итерационный метод вычисления собственных значений симметричной матрицы. Этот метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов исходной матрицы. Хотя алгоритм и был эффективным в вычислительном смысле, но он на некоторое время был предан забвению из-за численной неустойчивости. Только в 1970 Ojalvo и Newman модифицировали алгоритм для использования в арифметике с плавающей точкой&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;. Новый метод получил название [[Алгоритм Ланцоша с полной переортогонализацией | алгоритма Ланцоша с полной переортогонализацией]]. Но эта статья про его исходную версию.&lt;br /&gt;
На вход алгоритма подается вещественная симметричная матрица  &amp;lt;math&amp;gt;A = A^{T}&amp;lt;/math&amp;gt;,&lt;br /&gt;
{{Шаблон:ASymmetric}}&lt;br /&gt;
Поэтому достаточно хранить только чуть больше половины элементов исходной матрицы.&lt;br /&gt;
&lt;br /&gt;
Сам алгоритм соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца. На каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, состоящая из ортонормированных векторов Ланцоша. А в качестве приближенных собственных значений берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k \times k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 \\&lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 \\&lt;br /&gt;
&amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных значений и собственных векторов такой матрицы значительно проще чем их вычисление для исходной матрицы. Например, они могут быть вычислены с помощью [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы| метода «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]]. В этом методе эта процедура занимает &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций, где константа оказывается на практике довольно мала.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, начальный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: собственные вектора матрицы  &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; являющиеся столбцами матрицы &amp;lt;math&amp;gt;Q_k V&amp;lt;/math&amp;gt;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм на псевдокоде:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
q_1 = &amp;amp; \frac{b}{\|b\|_2},\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; if \; \beta_i == 0 \; then \; break\\&lt;br /&gt;
&amp;amp; q_{i+1} = \frac{z}{\beta_i}\\&lt;br /&gt;
end \; &amp;amp; for&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Затем вычислить собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром на каждой итерации является вычисление произведения матрицы на вектор:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&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;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
1. \, \beta_0 = &amp;amp; 0,\; q_0 = 0,\\&lt;br /&gt;
\|b\|_2 = &amp;amp;\sqrt{\sum\limits_{j=1}^{n} b_j^2},\\&lt;br /&gt;
2. \, q_{1_{j}} = &amp;amp;\frac{b_{j}}{\|b\|_2}, \; j = 1,\, \dots \,, n\\&lt;br /&gt;
for \; i = &amp;amp; 1 \; to \; k \\&lt;br /&gt;
3. \, z_j &amp;amp; = \sum\limits_{m=1}^{n} a_{jm} q_{i_m}, \; j = 1,\, \dots \,, n\\&lt;br /&gt;
4. \, \alpha_i &amp;amp; = \sum\limits_{j=1}^{n}q_j z_j\\&lt;br /&gt;
5. \, z_j &amp;amp; = z_j - \alpha_i q_{i_j} - \beta_{i-1}q_{i-1_j}, \, j = 1,\, \dots \,, n\\&lt;br /&gt;
6. \, \beta_i &amp;amp; = \|z\|_2 = \sqrt{\sum\limits_{j=1}^{n} z_m^2}\\&lt;br /&gt;
if \; \beta_i &amp;amp; == 0 \; then \; break\\&lt;br /&gt;
7. \, q_{i+1_j} &amp;amp; = \frac{z_j}{\beta_i}, \; j = 1,\, \dots \,, n\\&lt;br /&gt;
end \; &amp;amp; for&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычисления &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и соответствующих им собственных векторов алгоритмом Ланцоша без переортогонализации состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и нахождения собственных значений и векторов трехдиагональной симметричной матрицы порядка &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Инициализация состоит из следующих операций:&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; операций сложений&lt;br /&gt;
** извлечение квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций делений (нормирование)&lt;br /&gt;
Каждая из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций состоит из:&lt;br /&gt;
* умножение матрицы на вектор:&lt;br /&gt;
** &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* скалярное произведение двух векторов&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сложение&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; вычитаний&lt;br /&gt;
* норма вектора:&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&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; операций деления&lt;br /&gt;
&lt;br /&gt;
Итого (без учета решения трехдиагональной матрицы):&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2 + 4n) + n &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2+3n-2) +  n-1&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt; kn + n &amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; вычислений квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Для нахождение собственных значений и векторов трехдиагональной симметричной матрицы эффективней всего использовать [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы | метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]], который требует &amp;lt;math&amp;gt; O(k^3) &amp;lt;/math&amp;gt; операций.&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метод Ланцоша без переортогонализации относится к алгоритмам &#039;&#039;с квадратичной сложностью&#039;&#039;.&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;
Алгоритм Ланцоша в параллельной форме состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и вычисления собственных значений матрицы &amp;lt;math&amp;gt;T_k&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;\log n&amp;lt;/math&amp;gt; и линейную ширину ярусов &amp;lt;math&amp;gt;\frac{n}{2}, \frac{n}{4}, ... , 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Инициализации состоит из следующих операций:&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** вычисление скалярного произведения вектора самого на себя:&lt;br /&gt;
*** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итерационная часть алгоритма состоит из следующих операций:&lt;br /&gt;
* умножение матрицы на число:&lt;br /&gt;
** ярус умножений с шириной &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log n&amp;lt;/math&amp;gt; ярусов с наибольшей шириной &amp;lt;math&amp;gt;\frac{n^2}{2}&amp;lt;/math&amp;gt; (блок вычисления n сумм n элементов)&lt;br /&gt;
* вычисление скалярного произведения двух векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt;&lt;br /&gt;
** два яруса сложений шириной &amp;lt;math&amp;gt;n&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;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с максимальной шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, в параллельном варианте основную долю времени будут занимать операции сложения при умножении матрицы на вектор.&lt;br /&gt;
При классификации по высоте ЯПФ Алгоритм Ланцоша относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;. При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}, i \geq j&amp;lt;/math&amp;gt;), число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n + 1)}{2} + 1&amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/поддиагональные элементы, единица относится к параметру &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
по &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;k+kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является субквадратичным: &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&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;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации ===&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте IETL&amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/lanczos.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;/div&gt;</summary>
		<author><name>A.Freeman</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=12328</id>
		<title>Участник:A.Freeman/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=12328"/>
		<updated>2016-10-15T23:29:31Z</updated>

		<summary type="html">&lt;p&gt;A.Freeman: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша без переортогонализации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}+1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k + kn&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:KAKTUZ|Заспа А.Ю.]],  [[Участник:A.Freeman|Фролов А.А.]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; был опубликовн физиком и математиком Корнелием Ланцощем в 1950 году&amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот метод является частным случаем алгоритма Арнольда в случае, если исходная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - симметрична, и был представлен как итерационный метод вычисления собственных значений симметричной матрицы. Этот метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов исходной матрицы. Хотя алгоритм и был эффективным в вычислительном смысле, но он на некоторое время был предан забвению из-за численной неустойчивости. Только в 1970 Ojalvo и Newman модифицировали алгоритм для использования в арифметике с плавающей точкой&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;. Новый метод получил название [[Алгоритм Ланцоша с полной переортогонализацией | алгоритма Ланцоша с полной переортогонализацией]]. Но эта статья про его исходную версию.&lt;br /&gt;
На вход алгоритма подается вещественная симметричная матрица  &amp;lt;math&amp;gt;A = A^{T}&amp;lt;/math&amp;gt;,&lt;br /&gt;
{{Шаблон:ASymmetric}}&lt;br /&gt;
Поэтому достаточно хранить только чуть больше половины элементов исходной матрицы.&lt;br /&gt;
&lt;br /&gt;
Сам алгоритм соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца. На каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, состоящая из ортонормированных векторов Ланцоша. А в качестве приближенных собственных значений берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k \times k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 \\&lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 \\&lt;br /&gt;
&amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных значений и собственных векторов такой матрицы значительно проще чем их вычисление для исходной матрицы. Например, они могут быть вычислены с помощью [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы| метода «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]]. В этом методе эта процедура занимает &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций, где константа оказывается на практике довольно мала.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, начальный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: собственные вектора матрицы  &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; являющиеся столбцами матрицы &amp;lt;math&amp;gt;Q_k V&amp;lt;/math&amp;gt;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм на псевдокоде:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
q_1 = &amp;amp; \frac{b}{\|b\|_2},\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; if \; \beta_i == 0 \; then \; break\\&lt;br /&gt;
&amp;amp; q_{i+1} = \frac{z}{\beta_i}\\&lt;br /&gt;
end \; &amp;amp; for&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Затем вычислить собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром на каждой итерации является вычисление произведения матрицы на вектор:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&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;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
1. \, \beta_0 = &amp;amp; 0,\; q_0 = 0,\\&lt;br /&gt;
\|b\|_2 = &amp;amp;\sqrt{\sum\limits_{j=1}^{n} b_j^2},\\&lt;br /&gt;
2. \, q_{1_{j}} = &amp;amp;\frac{b_{j}}{\|b\|_2}, \; j = 1,\, \dots \,, n\\&lt;br /&gt;
for \; i = &amp;amp; 1 \; to \; k \\&lt;br /&gt;
3. \, z_j &amp;amp; = \sum\limits_{m=1}^{n} a_{jm} q_{i_m}, \; j = 1,\, \dots \,, n\\&lt;br /&gt;
4. \, \alpha_i &amp;amp; = \sum\limits_{j=1}^{n}q_j z_j\\&lt;br /&gt;
5. \, z_j &amp;amp; = z_j - \alpha_i q_{i_j} - \beta_{i-1}q_{i-1_j}, \, j = 1,\, \dots \,, n\\&lt;br /&gt;
6. \, \beta_i &amp;amp; = \|z\|_2 = \sqrt{\sum\limits_{j=1}^{n} z_m^2}\\&lt;br /&gt;
if \; \beta_i &amp;amp; == 0 \; then \; break\\&lt;br /&gt;
7. \, q_{i+1_j} &amp;amp; = \frac{z_j}{\beta_i}, \; j = 1,\, \dots \,, n\\&lt;br /&gt;
end \; &amp;amp; for&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычисления &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и соответствующих им собственных векторов алгоритмом Ланцоша без переортогонализации состоит из следующих операций:&lt;br /&gt;
* инициализация&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций&lt;br /&gt;
* нахождение собственных значений и векторов трехдиагональной симметричной матрицы порядка &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Инициализация состоит из следующих операций:&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; операций сложений&lt;br /&gt;
** извлечение квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций делений (нормирование)&lt;br /&gt;
Каждая из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций состоит из:&lt;br /&gt;
* умножение матрицы на вектор:&lt;br /&gt;
** &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* скалярное произведение двух векторов&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сложение&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
** &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; вычитаний&lt;br /&gt;
* норма вектора:&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
** &amp;lt;math&amp;gt;n-1&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; операций деления&lt;br /&gt;
&lt;br /&gt;
Итого (без учета решения трехдиагональной матрицы):&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2 + 4n) + n &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2+3n-2) +  n-1&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt; kn + n &amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; вычислений квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Для нахождение собственных значений и векторов трехдиагональной симметричной матрицы эффективней всего использовать [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы | метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]], который требует &amp;lt;math&amp;gt; O(k^3) &amp;lt;/math&amp;gt; операций.&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метод Ланцоша без переортогонализации относится к алгоритмам &#039;&#039;с квадратичной сложностью&#039;&#039;.&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;
Алгоритм Ланцоша в параллельной форме состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и вычисления собственных значений матрицы &amp;lt;math&amp;gt;T_k&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;\log n&amp;lt;/math&amp;gt; и линейную ширину ярусов &amp;lt;math&amp;gt;\frac{n}{2}, \frac{n}{4}, ... , 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Инициализации состоит из следующих операций:&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** вычисление скалярного произведения вектора самого на себя:&lt;br /&gt;
*** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итерационная часть алгоритма состоит из следующих операций:&lt;br /&gt;
* умножение матрицы на число:&lt;br /&gt;
** ярус умножений с шириной &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log n&amp;lt;/math&amp;gt; ярусов с наибольшей шириной &amp;lt;math&amp;gt;\frac{n^2}{2}&amp;lt;/math&amp;gt; (блок вычисления n сумм n элементов)&lt;br /&gt;
* вычисление скалярного произведения двух векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с  наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt;&lt;br /&gt;
** два яруса сложений шириной &amp;lt;math&amp;gt;n&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;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; ярусов сложений с максимальной шириной &amp;lt;math&amp;gt;\frac{n}{2}&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; операций деления&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, в параллельном варианте основную долю времени будут занимать операции сложения при умножении матрицы на вектор.&lt;br /&gt;
При классификации по высоте ЯПФ Алгоритм Ланцоша относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;. При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}, i \geq j&amp;lt;/math&amp;gt;), число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n + 1)}{2} + 1&amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/поддиагональные элементы, единица относится к параметру &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
по &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;k+kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является субквадратичным: &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&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;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации ===&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте IETL&amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/lanczos.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;/div&gt;</summary>
		<author><name>A.Freeman</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=12282</id>
		<title>Участник:A.Freeman/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=12282"/>
		<updated>2016-10-15T22:46:17Z</updated>

		<summary type="html">&lt;p&gt;A.Freeman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша без переортогонализации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}+1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k + kn&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:KAKTUZ|Заспа А.Ю.]],  [[Участник:A.Freeman|Фролов А.А.]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; был опубликовн физиком и математиком Корнелием Ланцощем в 1950 году&amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот метод является частным случаем алгоритма Арнольда в случае, если исходная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - симметрична, и был представлен как итерационный метод вычисления собственных значений симметричной матрицы. Этот метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов исходной матрицы. Хотя алгоритм и был эффективным в вычислительном смысле, но он на некоторое время был предан забвению из-за численной неустойчивости. Только в 1970 Ojalvo и Newman модифицировали алгоритм для использования в арифметике с плавающей точкой&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;. Новый метод получил название [[Алгоритм Ланцоша с полной переортогонализацией | алгоритма Ланцоша с полной переортогонализацией]]. Но эта статья про его исходную версию.&lt;br /&gt;
На вход алгоритма подается вещественная симметричная матрица  &amp;lt;math&amp;gt;A = A^{T}&amp;lt;/math&amp;gt;,&lt;br /&gt;
{{Шаблон:ASymmetric}}&lt;br /&gt;
Поэтому достаточно хранить только чуть больше половины элементов исходной матрицы.&lt;br /&gt;
&lt;br /&gt;
Сам алгоритм соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца. На каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, состоящая из ортонормированных векторов Ланцоша. А в качестве приближенных собственных значений берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k \times k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 \\&lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 \\&lt;br /&gt;
&amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных значений и собственных векторов такой матрицы значительно проще чем их вычисление для исходной матрицы. Например, они могут быть вычислены с помощью [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы| метода «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]]. В этом методе эта процедура занимает &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций, где константа оказывается на практике довольно мала.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, начальный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: собственные вектора матрицы  &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; являющиеся столбцами матрицы &amp;lt;math&amp;gt;Q_k V&amp;lt;/math&amp;gt;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм на псевдокоде:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
q_1 = &amp;amp; \frac{b}{\|b\|_2},\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; if \; \beta_i == 0 \; then \; break\\&lt;br /&gt;
&amp;amp; q_{i+1} = \frac{z}{\beta_i}\\&lt;br /&gt;
end \; &amp;amp; for&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Затем вычислить собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром на каждой итерации является вычисление произведения матрицы на вектор:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&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;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
1. \, \beta_0 = &amp;amp; 0,\; q_0 = 0,\\&lt;br /&gt;
\|b\|_2 = &amp;amp;\sqrt{\sum\limits_{j=1}^{n} b_j^2},\\&lt;br /&gt;
2. \, q_{1_{j}} = &amp;amp;\frac{b_{j}}{\|b\|_2}, \; j = 1,\, \dots \,, n\\&lt;br /&gt;
for \; i = &amp;amp; 1 \; to \; k \\&lt;br /&gt;
3. \, z_j &amp;amp; = \sum\limits_{m=1}^{n} a_{jm} q_{i_m}, \; j = 1,\, \dots \,, n\\&lt;br /&gt;
4. \, \alpha_i &amp;amp; = \sum\limits_{j=1}^{n}q_j z_j\\&lt;br /&gt;
5. \, z_j &amp;amp; = z_j - \alpha_i q_{i_j} - \beta_{i-1}q_{i-1_j}, \, j = 1,\, \dots \,, n\\&lt;br /&gt;
6. \, \beta_i &amp;amp; = \|z\|_2 = \sqrt{\sum\limits_{j=1}^{n} z_m^2}\\&lt;br /&gt;
if \; \beta_i &amp;amp; == 0 \; then \; break\\&lt;br /&gt;
7. \, q_{i+1_j} &amp;amp; = \frac{z_j}{\beta_i}, \; j = 1,\, \dots \,, n\\&lt;br /&gt;
end \; &amp;amp; for&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для вычисления &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и соответствующих им собственных векторов алгоритмом Ланцоша без переортогонализации в худшем случае требуется:&lt;br /&gt;
* &amp;lt;math&amp;gt; kn^2 + 4 kn + n &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; вычислений квадратного корня,&lt;br /&gt;
* &amp;lt;math&amp;gt; n(k + 1) &amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt; n + k(n^2+3n-1)&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* нахождение собственных значений и векторов трехдиагональной симметричной матрицы размера &amp;lt;math&amp;gt; k \times k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Для нахождение собственных значений и векторов трехдиагональной симметричной матрицы эффективней всего использовать [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы | метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]], который требует &amp;lt;math&amp;gt; O(k^3) &amp;lt;/math&amp;gt; операций.&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метод Ланцоша без переортогонализации относится к алгоритмам &#039;&#039;с квадратичной сложностью&#039;&#039;.&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;
Алгоритм Ланцоша в параллельной форме состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и вычисления собственных значений матрицы &amp;lt;math&amp;gt;T_k&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;\log n&amp;lt;/math&amp;gt; и линейную ширину ярусов &amp;lt;math&amp;gt;\frac{n}{2}, \frac{n}{4}, ... , 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Инициализации состоит из следующих операций:&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** скалярное произведение двух векторов:&lt;br /&gt;
*** ярус умножений с шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log n&amp;lt;/math&amp;gt; ярусов с наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt; (блок вычисления суммы n элементов)&lt;br /&gt;
** ярус извлечения квадратного корня&lt;br /&gt;
* ярус делений  с шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (нормирование вектора)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итерационная часть алгоритма состоит из следующих операций:&lt;br /&gt;
* умножение матрицы на число:&lt;br /&gt;
** ярус умножений с шириной &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log n&amp;lt;/math&amp;gt; ярусов с наибольшей шириной &amp;lt;math&amp;gt;\frac{n^2}{2}&amp;lt;/math&amp;gt; (блок вычисления n сумм n элементов)&lt;br /&gt;
* &amp;lt;math&amp;gt;\log{n} + 1&amp;lt;/math&amp;gt; ярусов вычисления скалярного произведения с шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (скалярное произведение двух векторов)&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt;&lt;br /&gt;
** два яруса сложений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** &amp;lt;math&amp;gt;\log{n} + 1&amp;lt;/math&amp;gt; ярусов вычисления скалярного произведения с шириной &amp;lt;math&amp;gt;n&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; операций деления (нормирование вектора, может отсутствовать на последней итерации)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, в параллельном варианте основную долю времени будут занимать операции сложения при умножении матрицы на вектор.&lt;br /&gt;
При классификации по высоте ЯПФ Алгоритм Ланцоша относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;. При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}, i \geq j&amp;lt;/math&amp;gt;), число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n + 1)}{2} + 1&amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/поддиагональные элементы, единица относится к параметру &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
по &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;k+kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является субквадратичным: &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&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;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации ===&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте IETL&amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/lanczos.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;/div&gt;</summary>
		<author><name>A.Freeman</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=12280</id>
		<title>Участник:A.Freeman/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=12280"/>
		<updated>2016-10-15T22:45:43Z</updated>

		<summary type="html">&lt;p&gt;A.Freeman: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша без переортогонализации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}+1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k + kn&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:KAKTUZ|Заспа А.Ю.]],  [[Участник:A.Freeman|Фролов А.А.]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; был опубликовн физиком и математиком Корнелием Ланцощем в 1950 году&amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот метод является частным случаем алгоритма Арнольда в случае, если исходная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - симметрична, и был представлен как итерационный метод вычисления собственных значений симметричной матрицы. Этот метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов исходной матрицы. Хотя алгоритм и был эффективным в вычислительном смысле, но он на некоторое время был предан забвению из-за численной неустойчивости. Только в 1970 Ojalvo и Newman модифицировали алгоритм для использования в арифметике с плавающей точкой&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;. Новый метод получил название [[Алгоритм Ланцоша с полной переортогонализацией | алгоритма Ланцоша с полной переортогонализацией]]. Но эта статья про его исходную версию.&lt;br /&gt;
На вход алгоритма подается вещественная симметричная матрица  &amp;lt;math&amp;gt;A = A^{T}&amp;lt;/math&amp;gt;,&lt;br /&gt;
{{Шаблон:ASymmetric}}&lt;br /&gt;
Поэтому достаточно хранить только чуть больше половины элементов исходной матрицы.&lt;br /&gt;
&lt;br /&gt;
Сам алгоритм соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца. На каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, состоящая из ортонормированных векторов Ланцоша. А в качестве приближенных собственных значений берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k \times k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 \\&lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 \\&lt;br /&gt;
&amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных значений и собственных векторов такой матрицы значительно проще чем их вычисление для исходной матрицы. Например, они могут быть вычислены с помощью [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы| метода «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]]. В этом методе эта процедура занимает &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций, где константа оказывается на практике довольно мала.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, начальный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: собственные вектора матрицы  &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; являющиеся столбцами матрицы &amp;lt;math&amp;gt;Q_k V&amp;lt;/math&amp;gt;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм на псевдокоде:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
q_1 = &amp;amp; \frac{b}{\|b\|_2},\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; if \; \beta_i == 0 \; then \; break\\&lt;br /&gt;
&amp;amp; q_{i+1} = \frac{z}{\beta_i}\\&lt;br /&gt;
end \; &amp;amp; for&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Затем вычислить собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром на каждой итерации является вычисление произведения матрицы на вектор:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&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;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
1. \, \beta_0 = &amp;amp; 0,\; q_0 = 0,\\&lt;br /&gt;
\|b\|_2 = &amp;amp;\sqrt{\sum\limits_{j=1}^{n} b_j^2},\\&lt;br /&gt;
2. \, q_{1_{j}} = &amp;amp;\frac{b_{j}}{\|b\|_2}, \; j = 1,\, \dots \,, n\\&lt;br /&gt;
for \; i = &amp;amp; 1 \; to \; k \\&lt;br /&gt;
3. \, z_j &amp;amp; = \sum\limits_{m=1}^{n} a_{jm} q_{i_m}, \; j = 1,\, \dots \,, n\\&lt;br /&gt;
4. \, \alpha_i &amp;amp; = \sum\limits_{j=1}^{n}q_j z_j\\&lt;br /&gt;
5. \, z_j &amp;amp; = z_j - \alpha_i q_{i_j} - \beta_{i-1}q_{i-1_j}, \, j = 1,\, \dots \,, n\\&lt;br /&gt;
6. \, \beta_i &amp;amp; = \|z\|_2 = \sqrt{\sum\limits_{j=1}^{n} z_m^2}\\&lt;br /&gt;
if \; \beta_i &amp;amp; == 0 \; then \; break\\&lt;br /&gt;
7. \, q_{i+1_j} &amp;amp; = \frac{z_j}{\beta_i}, \; j = 1,\, \dots \,, n\\&lt;br /&gt;
end \; &amp;amp; for&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для вычисления &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и соответствующих им собственных векторов алгоритмом Ланцоша без переортогонализации в худшем случае требуется:&lt;br /&gt;
* &amp;lt;math&amp;gt; kn^2 + 4 kn + n &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; вычислений квадратного корня,&lt;br /&gt;
* &amp;lt;math&amp;gt; n(k + 1) &amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt; n + k(n^2+3n-1)&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* нахождение собственных значений и векторов трехдиагональной симметричной матрицы размера &amp;lt;math&amp;gt; k \times k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Для нахождение собственных значений и векторов трехдиагональной симметричной матрицы эффективней всего использовать [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы | метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]], который требует &amp;lt;math&amp;gt; O(k^3) &amp;lt;/math&amp;gt; операций.&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метод Ланцоша без переортогонализации относится к алгоритмам &#039;&#039;с квадратичной сложностью&#039;&#039;.&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;
Алгоритм Ланцоша в параллельной форме состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и вычисления собственных значений матрицы &amp;lt;math&amp;gt;T_k&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;\log n&amp;lt;/math&amp;gt; и линейную ширину ярусов &amp;lt;math&amp;gt;\frac{n}{2}, \frac{n}{4}, ... , 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Инициализации состоит из следующих операций:&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** скалярное произведение двух векторов:&lt;br /&gt;
*** ярус умножений с шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log n&amp;lt;/math&amp;gt; ярусов с наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt; (блок вычисления суммы n элементов)&lt;br /&gt;
** ярус извлечения квадратного корня&lt;br /&gt;
* ярус делений  с шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (нормирование вектора)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итерационная часть алгоритма состоит из следующих операций:&lt;br /&gt;
* умножение матрицы на число:&lt;br /&gt;
** ярус умножений с шириной &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log n&amp;lt;/math&amp;gt; ярусов с наибольшей шириной &amp;lt;math&amp;gt;\frac{n^2}{2}&amp;lt;/math&amp;gt; (блок вычисления n сумм n элементов)&lt;br /&gt;
* &amp;lt;math&amp;gt;\log{n} + 1&amp;lt;/math&amp;gt; ярусов вычисления скалярного произведения с шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (скалярное произведение двух векторов)&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt;&lt;br /&gt;
** два яруса сложений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** &amp;lt;math&amp;gt;\log{n} + 1&amp;lt;/math&amp;gt; ярусов вычисления скалярного произведения с шириной &amp;lt;math&amp;gt;n&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; операций деления (нормирование вектора, может отсутствовать на последней итерации)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, в параллельном варианте основную долю времени будут занимать операции сложения при умножении матрицы на вектор.&lt;br /&gt;
При классификации по высоте ЯПФ Алгоритм Ланцоша относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;. При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}, i \geq j&amp;lt;/math&amp;gt;), число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n + 1)}{2} + 1&amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/поддиагональные элементы, единица относится к параметру &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
по &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;k+kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является субквадратичным: &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&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;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации ===&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте IETL&amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/lanczos.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;/div&gt;</summary>
		<author><name>A.Freeman</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=12276</id>
		<title>Участник:A.Freeman/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=12276"/>
		<updated>2016-10-15T22:44:54Z</updated>

		<summary type="html">&lt;p&gt;A.Freeman: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша без переортогонализации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}+1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k + kn&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:KAKTUZ|Заспа А.Ю.]],  [[Участник:A.Freeman|Фролов А.А.]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; был опубликовн физиком и математиком Корнелием Ланцощем в 1950 году&amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот метод является частным случаем алгоритма Арнольда в случае, если исходная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - симметрична, и был представлен как итерационный метод вычисления собственных значений симметричной матрицы. Этот метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов исходной матрицы. Хотя алгоритм и был эффективным в вычислительном смысле, но он на некоторое время был предан забвению из-за численной неустойчивости. Только в 1970 Ojalvo и Newman модифицировали алгоритм для использования в арифметике с плавающей точкой&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;. Новый метод получил название [[Алгоритм Ланцоша с полной переортогонализацией | алгоритма Ланцоша с полной переортогонализацией]]. Но эта статья про его исходную версию.&lt;br /&gt;
На вход алгоритма подается вещественная симметричная матрица  &amp;lt;math&amp;gt;A = A^{T}&amp;lt;/math&amp;gt;,&lt;br /&gt;
{{Шаблон:ASymmetric}}&lt;br /&gt;
Поэтому достаточно хранить только чуть больше половины элементов исходной матрицы.&lt;br /&gt;
&lt;br /&gt;
Сам алгоритм соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца. На каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, состоящая из ортонормированных векторов Ланцоша. А в качестве приближенных собственных значений берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k \times k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 \\&lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 \\&lt;br /&gt;
&amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных значений и собственных векторов такой матрицы значительно проще чем их вычисление для исходной матрицы. Например, они могут быть вычислены с помощью [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы| метода «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]]. В этом методе эта процедура занимает &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций, где константа оказывается на практике довольно мала.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, начальный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: собственные вектора матрицы  &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; являющиеся столбцами матрицы &amp;lt;math&amp;gt;Q_k V&amp;lt;/math&amp;gt;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм на псевдокоде:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
q_1 = &amp;amp; \frac{b}{\|b\|_2},\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; if \; \beta_i == 0 \; then \; break\\&lt;br /&gt;
&amp;amp; q_{i+1} = \frac{z}{\beta_i}\\&lt;br /&gt;
end \; &amp;amp; for&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Затем вычислить собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром на каждой итерации является вычисление произведения матрицы на вектор:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&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;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
1. \, \beta_0 = &amp;amp; 0,\; q_0 = 0,\\&lt;br /&gt;
\|b\|_2 = &amp;amp;\sqrt{\sum\limits_{j=1}^{n} b_j^2},\\&lt;br /&gt;
2. \, q_{1_{j}} = &amp;amp;\frac{b_{j}}{\|b\|_2}, \; j = 1,\, \dots \,, n\\&lt;br /&gt;
for \; i = &amp;amp; 1 \; to \; k \\&lt;br /&gt;
3. \, z_j &amp;amp; = \sum\limits_{m=1}^{n} a_{jm} q_{i_m}, \; j = 1,\, \dots \,, n\\&lt;br /&gt;
4. \, \alpha_i &amp;amp; = \sum\limits_{j=1}^{n}q_j z_j\\&lt;br /&gt;
5. \, z_j &amp;amp; = z_j - \alpha_i q_{i_j} - \beta_{i-1}q_{i-1_j}, \, j = 1,\, \dots \,, n\\&lt;br /&gt;
6. \, \beta_i &amp;amp; = \|z\|_2 = \sqrt{\sum\limits_{j=1}^{n} z_m^2}\\&lt;br /&gt;
if \; \beta_i &amp;amp; == 0 \; then \; break\\&lt;br /&gt;
7. \, q_{i+1_j} &amp;amp; = \frac{z_j}{\beta_i}, \; j = 1,\, \dots \,, n\\&lt;br /&gt;
end \; &amp;amp; for&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для вычисления &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и соответствующих им собственных векторов алгоритмом Ланцоша без переортогонализации в худшем случае требуется:&lt;br /&gt;
* &amp;lt;math&amp;gt; kn^2 + 4 kn + n &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; вычислений квадратного корня,&lt;br /&gt;
* &amp;lt;math&amp;gt; n(k + 1) &amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt; n + k(n^2+3n-1)&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* нахождение собственных значений и векторов трехдиагональной симметричной матрицы размера &amp;lt;math&amp;gt; k \times k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Для нахождение собственных значений и векторов трехдиагональной симметричной матрицы эффективней всего использовать [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы | метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]], который требует &amp;lt;math&amp;gt; O(k^3) &amp;lt;/math&amp;gt; операций.&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метод Ланцоша без переортогонализации относится к алгоритмам &#039;&#039;с квадратичной сложностью&#039;&#039;.&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;
Алгоритм Ланцоша в параллельной форме состоит из инициализации, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций и вычисления собственных значений матрицы &amp;lt;math&amp;gt;T_k&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;\log n&amp;lt;/math&amp;gt; и линейную ширину ярусов &amp;lt;math&amp;gt;\frac{n}{2}, \frac{n}{4}, ... , 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Инициализации состоит из следующих операций:&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** скалярное произведение двух векторов:&lt;br /&gt;
*** ярус умножений с шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log n&amp;lt;/math&amp;gt; ярусов с наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt; (блок вычисления суммы n элементов)&lt;br /&gt;
** ярус извлечения квадратного корня&lt;br /&gt;
* ярус делений  с шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (нормирование вектора)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итерационная часть алгоритма состоит из следующих операций:&lt;br /&gt;
* умножение матрицы на число:&lt;br /&gt;
** ярус умножений с шириной &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log n&amp;lt;/math&amp;gt; ярусов с наибольшей шириной &amp;lt;math&amp;gt;\frac{n^2}{2}&amp;lt;/math&amp;gt; (блок вычисления n сумм n элементов)&lt;br /&gt;
* &amp;lt;math&amp;gt;\log{n} + 1&amp;lt;/math&amp;gt; ярусов вычисления скалярного произведения с шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (скалярное произведение двух векторов)&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt;&lt;br /&gt;
** два яруса сложений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** &amp;lt;math&amp;gt;\log{n} + 1&amp;lt;/math&amp;gt; ярусов вычисления скалярного произведения с шириной &amp;lt;math&amp;gt;n&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; операций деления (нормирование вектора, может отсутствовать на последней итерации)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, в параллельном варианте основную долю времени будут занимать операции сложения при умножении матрицы на вектор.&lt;br /&gt;
При классификации по высоте ЯПФ Алгоритм Ланцоша относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;. При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}, i \geq j&amp;lt;/math&amp;gt;), число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n + 1)}{2} + 1&amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/поддиагональные элементы, единица относится к параметру &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
по &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;k+kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является квадратичным: &amp;lt;math&amp;gt;\frac{kn^2}{k}&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;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации ===&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте IETL&amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/lanczos.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;/div&gt;</summary>
		<author><name>A.Freeman</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=12259</id>
		<title>Участник:A.Freeman/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=12259"/>
		<updated>2016-10-15T22:28:35Z</updated>

		<summary type="html">&lt;p&gt;A.Freeman: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша без переортогонализации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}+1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k + kn&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:KAKTUZ|Заспа А.Ю.]],  [[Участник:A.Freeman|Фролов А.А.]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; был опубликовн физиком и математиком Корнелием Ланцощем в 1950 году&amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот метод является частным случаем алгоритма Арнольда в случае, если исходная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - симметрична, и был представлен как итерационный метод вычисления собственных значений симметричной матрицы. Этот метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов исходной матрицы. Хотя алгоритм и был эффективным в вычислительном смысле, но он на некоторое время был предан забвению из-за численной неустойчивости. Только в 1970 Ojalvo и Newman модифицировали алгоритм для использования в арифметике с плавающей точкой&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;. Новый метод получил название [[Алгоритм Ланцоша с полной переортогонализацией | алгоритма Ланцоша с полной переортогонализацией]]. Но эта статья про его исходную версию.&lt;br /&gt;
На вход алгоритма подается вещественная симметричная матрица  &amp;lt;math&amp;gt;A = A^{T}&amp;lt;/math&amp;gt;,&lt;br /&gt;
{{Шаблон:ASymmetric}}&lt;br /&gt;
Поэтому достаточно хранить только чуть больше половины элементов исходной матрицы.&lt;br /&gt;
&lt;br /&gt;
Сам алгоритм соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца. На каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, состоящая из ортонормированных векторов Ланцоша. А в качестве приближенных собственных значений берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k \times k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 \\&lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 \\&lt;br /&gt;
&amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных значений и собственных векторов такой матрицы значительно проще чем их вычисление для исходной матрицы. Например, они могут быть вычислены с помощью [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы| метода «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]]. В этом методе эта процедура занимает &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций, где константа оказывается на практике довольно мала.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, начальный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: собственные вектора матрицы  &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; являющиеся столбцами матрицы &amp;lt;math&amp;gt;Q_k V&amp;lt;/math&amp;gt;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм на псевдокоде:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
q_1 = &amp;amp; \frac{b}{\|b\|_2},\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; if \; \beta_i == 0 \; then \; break\\&lt;br /&gt;
&amp;amp; q_{i+1} = \frac{z}{\beta_i}\\&lt;br /&gt;
end \; &amp;amp; for&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Затем вычислить собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром на каждой итерации является вычисление произведения матрицы на вектор:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&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;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
1. \, \beta_0 = &amp;amp; 0,\; q_0 = 0,\\&lt;br /&gt;
\|b\|_2 = &amp;amp;\sqrt{\sum\limits_{j=1}^{n} b_j^2},\\&lt;br /&gt;
2. \, q_{1_{j}} = &amp;amp;\frac{b_{j}}{\|b\|_2}, \; j = 1,\, \dots \,, n\\&lt;br /&gt;
for \; i = &amp;amp; 1 \; to \; k \\&lt;br /&gt;
3. \, z_j &amp;amp; = \sum\limits_{m=1}^{n} a_{jm} q_{i_m}, \; j = 1,\, \dots \,, n\\&lt;br /&gt;
4. \, \alpha_i &amp;amp; = \sum\limits_{j=1}^{n}q_j z_j\\&lt;br /&gt;
5. \, z_j &amp;amp; = z_j - \alpha_i q_{i_j} - \beta_{i-1}q_{i-1_j}, \, j = 1,\, \dots \,, n\\&lt;br /&gt;
6. \, \beta_i &amp;amp; = \|z\|_2 = \sqrt{\sum\limits_{j=1}^{n} z_m^2}\\&lt;br /&gt;
if \; \beta_i &amp;amp; == 0 \; then \; break\\&lt;br /&gt;
7. \, q_{i+1_j} &amp;amp; = \frac{z_j}{\beta_i}, \; j = 1,\, \dots \,, n\\&lt;br /&gt;
end \; &amp;amp; for&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для вычисления &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и соответствующих им собственных векторов алгоритмом Ланцоша без переортогонализации в худшем случае требуется:&lt;br /&gt;
* &amp;lt;math&amp;gt; kn^2 + 4 kn + n &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; вычислений квадратного корня,&lt;br /&gt;
* &amp;lt;math&amp;gt; n(k + 1) &amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt; n + k(n^2+3n-1)&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* нахождение собственных значений и векторов трехдиагональной симметричной матрицы размера &amp;lt;math&amp;gt; k \times k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Для нахождение собственных значений и векторов трехдиагональной симметричной матрицы эффективней всего использовать [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы | метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]], который требует &amp;lt;math&amp;gt; O(k^3) &amp;lt;/math&amp;gt; операций.&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метод Ланцоша без переортогонализации относится к алгоритмам &#039;&#039;с квадратичной сложностью&#039;&#039;.&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;
Заметим, что вычисление суммы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; элементов имеет высоту &amp;lt;math&amp;gt;\log n&amp;lt;/math&amp;gt; и линейную ширину ярусов &amp;lt;math&amp;gt;\frac{n}{2}, \frac{n}{4}, ... , 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша в параллельной форме состоит из инициализации и &amp;lt;math&amp;gt;k&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;&lt;br /&gt;
*** &amp;lt;math&amp;gt;\log n&amp;lt;/math&amp;gt; ярусов с наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt; (блок вычисления суммы n элементов)&lt;br /&gt;
** ярус извлечения квадратного корня&lt;br /&gt;
* ярус делений  с шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (нормирование вектора)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итерационная часть алгоритма состоит из следующих операций:&lt;br /&gt;
* умножение матрицы на число:&lt;br /&gt;
** ярус умножений с шириной &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log n&amp;lt;/math&amp;gt; ярусов с наибольшей шириной &amp;lt;math&amp;gt;\frac{n^2}{2}&amp;lt;/math&amp;gt; (блок вычисления n сумм n элементов)&lt;br /&gt;
* &amp;lt;math&amp;gt;\log{n} + 1&amp;lt;/math&amp;gt; ярусов вычисления скалярного произведения с шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (скалярное произведение двух векторов)&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt;&lt;br /&gt;
** два яруса сложений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** &amp;lt;math&amp;gt;\log{n} + 1&amp;lt;/math&amp;gt; ярусов вычисления скалярного произведения с шириной &amp;lt;math&amp;gt;n&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; операций деления (нормирование вектора, может отсутствовать на последней итерации)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, в параллельном варианте основную долю времени будут занимать операции сложения при умножении матрицы на вектор.&lt;br /&gt;
При классификации по высоте ЯПФ Алгоритм Ланцоша относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;. При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}, i \geq j&amp;lt;/math&amp;gt;), число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n + 1)}{2} + 1&amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/поддиагональные элементы, единица относится к параметру &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
по &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;k+kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является квадратичным: &amp;lt;math&amp;gt;\frac{kn^2}{k}&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;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации ===&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте IETL&amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/lanczos.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;/div&gt;</summary>
		<author><name>A.Freeman</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=12236</id>
		<title>Участник:A.Freeman/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=12236"/>
		<updated>2016-10-15T22:14:11Z</updated>

		<summary type="html">&lt;p&gt;A.Freeman: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша без переортогонализации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}+1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k + kn&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:KAKTUZ|Заспа А.Ю.]],  [[Участник:A.Freeman|Фролов А.А.]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; был опубликовн физиком и математиком Корнелием Ланцощем в 1950 году&amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот метод является частным случаем алгоритма Арнольда в случае, если исходная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - симметрична, и был представлен как итерационный метод вычисления собственных значений симметричной матрицы. Этот метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов исходной матрицы. Хотя алгоритм и был эффективным в вычислительном смысле, но он на некоторое время был предан забвению из-за численной неустойчивости. Только в 1970 Ojalvo и Newman модифицировали алгоритм для использования в арифметике с плавающей точкой&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;. Новый метод получил название [[Алгоритм Ланцоша с полной переортогонализацией | алгоритма Ланцоша с полной переортогонализацией]]. Но эта статья про его исходную версию.&lt;br /&gt;
На вход алгоритма подается вещественная симметричная матрица  &amp;lt;math&amp;gt;A = A^{T}&amp;lt;/math&amp;gt;,&lt;br /&gt;
{{Шаблон:ASymmetric}}&lt;br /&gt;
Поэтому достаточно хранить только чуть больше половины элементов исходной матрицы.&lt;br /&gt;
&lt;br /&gt;
Сам алгоритм соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца. На каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, состоящая из ортонормированных векторов Ланцоша. А в качестве приближенных собственных значений берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k \times k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 \\&lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 \\&lt;br /&gt;
&amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных значений и собственных векторов такой матрицы значительно проще чем их вычисление для исходной матрицы. Например, они могут быть вычислены с помощью [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы| метода «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]]. В этом методе эта процедура занимает &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций, где константа оказывается на практике довольно мала.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, начальный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: собственные вектора матрицы  &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; являющиеся столбцами матрицы &amp;lt;math&amp;gt;Q_k V&amp;lt;/math&amp;gt;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм на псевдокоде:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
q_1 = &amp;amp; \frac{b}{\|b\|_2},\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; if \; \beta_i == 0 \; then \; break\\&lt;br /&gt;
&amp;amp; q_{i+1} = \frac{z}{\beta_i}\\&lt;br /&gt;
end \; &amp;amp; for&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Затем вычислить собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром на каждой итерации является вычисление произведения матрицы на вектор:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&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;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
1. \, \beta_0 = &amp;amp; 0,\; q_0 = 0,\\&lt;br /&gt;
\|b\|_2 = &amp;amp;\sqrt{\sum\limits_{j=1}^{n} b_j^2},\\&lt;br /&gt;
2. \, q_{1_{j}} = &amp;amp;\frac{b_{j}}{\|b\|_2}, \; j = 1,\, \dots \,, n\\&lt;br /&gt;
for \; i = &amp;amp; 1 \; to \; k \\&lt;br /&gt;
3. \, z_j &amp;amp; = \sum\limits_{m=1}^{n} a_{jm} q_{i_m}, \; j = 1,\, \dots \,, n\\&lt;br /&gt;
4. \, \alpha_i &amp;amp; = \sum\limits_{j=1}^{n}q_j z_j\\&lt;br /&gt;
5. \, z_j &amp;amp; = z_j - \alpha_i q_{i_j} - \beta_{i-1}q_{i-1_j}, \, j = 1,\, \dots \,, n\\&lt;br /&gt;
6. \, \beta_i &amp;amp; = \|z\|_2 = \sqrt{\sum\limits_{j=1}^{n} z_m^2}\\&lt;br /&gt;
if \; \beta_i &amp;amp; == 0 \; then \; break\\&lt;br /&gt;
7. \, q_{i+1_j} &amp;amp; = \frac{z_j}{\beta_i}, \; j = 1,\, \dots \,, n\\&lt;br /&gt;
end \; &amp;amp; for&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для вычисления &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и соответствующих им собственных векторов алгоритмом Ланцоша без переортогонализации в худшем случае требуется:&lt;br /&gt;
* &amp;lt;math&amp;gt; kn^2 + 4 kn + n &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; вычислений квадратного корня,&lt;br /&gt;
* &amp;lt;math&amp;gt; n(k + 1) &amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt; n + k(n^2+3n-1)&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* нахождение собственных значений и векторов трехдиагональной симметричной матрицы размера &amp;lt;math&amp;gt; k \times k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Для нахождение собственных значений и векторов трехдиагональной симметричной матрицы эффективней всего использовать [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы | метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]], который требует &amp;lt;math&amp;gt; O(k^3) &amp;lt;/math&amp;gt; операций.&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метод Ланцоша без переортогонализации относится к алгоритмам &#039;&#039;с квадратичной сложностью&#039;&#039;.&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;
Заметим, что вычисление суммы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; элементов имеет высоту &amp;lt;math&amp;gt;\log n&amp;lt;/math&amp;gt; и линейную ширину ярусов &amp;lt;math&amp;gt;\frac{n}{2}, \frac{n}{4}, ... , 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша в параллельной форме состоит из инициализации и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций. Инициализации состоит из следующих ярусов:&lt;br /&gt;
* ярус с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
* ярус с &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* ярус с вычислением квадратного корня&lt;br /&gt;
* ярус &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; делений&lt;br /&gt;
&lt;br /&gt;
Итерационная часть алгоритма состоит из следующих операций:&lt;br /&gt;
* умножение матрицы на число:&lt;br /&gt;
** ярус умножений с шириной &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log n&amp;lt;/math&amp;gt; ярусов с наибольшей шириной &amp;lt;math&amp;gt;\frac{n^2}{2}&amp;lt;/math&amp;gt; (блок вычисления n сумм n элементов)&lt;br /&gt;
* скалярное произведение двух векторов:&lt;br /&gt;
** ярус умножений с шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\log n&amp;lt;/math&amp;gt; ярусов с наибольшей шириной &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt; (блок вычисления суммы n элементов)&lt;br /&gt;
* вычисление линейной комбинации векторов:&lt;br /&gt;
** ярус умножений шириной &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt;&lt;br /&gt;
** два яруса сложений шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
* вычисление нормы:&lt;br /&gt;
** &amp;lt;math&amp;gt;\log{n} + 1&amp;lt;/math&amp;gt; ярусов вычисления скалярного произведения с шириной &amp;lt;math&amp;gt;n&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; операций, может отсутствовать на последней итерации&lt;br /&gt;
&lt;br /&gt;
Таким образом, в параллельном варианте основную долю времени будут занимать операции сложения при умножении матрицы на вектор.&lt;br /&gt;
При классификации по высоте ЯПФ Алгоритм Ланцоша относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;. При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}, i \geq j&amp;lt;/math&amp;gt;), число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n + 1)}{2} + 1&amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/поддиагональные элементы, единица относится к параметру &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
по &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;k+kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является квадратичным: &amp;lt;math&amp;gt;\frac{kn^2}{k}&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;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации ===&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте IETL&amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/lanczos.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;/div&gt;</summary>
		<author><name>A.Freeman</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=12209</id>
		<title>Участник:A.Freeman/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=12209"/>
		<updated>2016-10-15T21:50:08Z</updated>

		<summary type="html">&lt;p&gt;A.Freeman: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша без переортогонализации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}+1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k + kn&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:KAKTUZ|Заспа А.Ю.]],  [[Участник:A.Freeman|Фролов А.А.]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; был опубликовн физиком и математиком Корнелием Ланцощем в 1950 году&amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот метод является частным случаем алгоритма Арнольда в случае, если исходная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - симметрична, и был представлен как итерационный метод вычисления собственных значений симметричной матрицы. Этот метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов исходной матрицы. Хотя алгоритм и был эффективным в вычислительном смысле, но он на некоторое время был предан забвению из-за численной неустойчивости. Только в 1970 Ojalvo и Newman модифицировали алгоритм для использования в арифметике с плавающей точкой&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;. Новый метод получил название [[Алгоритм Ланцоша с полной переортогонализацией | алгоритма Ланцоша с полной переортогонализацией]]. Но эта статья про его исходную версию.&lt;br /&gt;
На вход алгоритма подается вещественная симметричная матрица  &amp;lt;math&amp;gt;A = A^{T}&amp;lt;/math&amp;gt;,&lt;br /&gt;
{{Шаблон:ASymmetric}}&lt;br /&gt;
Поэтому достаточно хранить только чуть больше половины элементов исходной матрицы.&lt;br /&gt;
&lt;br /&gt;
Сам алгоритм соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца. На каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, состоящая из ортонормированных векторов Ланцоша. А в качестве приближенных собственных значений берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k \times k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 \\&lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 \\&lt;br /&gt;
&amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных значений и собственных векторов такой матрицы значительно проще чем их вычисление для исходной матрицы. Например, они могут быть вычислены с помощью [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы| метода «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]]. В этом методе эта процедура занимает &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций, где константа оказывается на практике довольно мала.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, начальный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: собственные вектора матрицы  &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; являющиеся столбцами матрицы &amp;lt;math&amp;gt;Q_k V&amp;lt;/math&amp;gt;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм на псевдокоде:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
q_1 = &amp;amp; \frac{b}{\|b\|_2},\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; if \; \beta_i == 0 \; then \; break\\&lt;br /&gt;
&amp;amp; q_{i+1} = \frac{z}{\beta_i}\\&lt;br /&gt;
end \; &amp;amp; for&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Затем вычислить собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром на каждой итерации является вычисление произведения матрицы на вектор:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&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;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
1. \, \beta_0 = &amp;amp; 0,\; q_0 = 0,\\&lt;br /&gt;
\|b\|_2 = &amp;amp;\sqrt{\sum\limits_{j=1}^{n} b_j^2},\\&lt;br /&gt;
2. \, q_{1_{j}} = &amp;amp;\frac{b_{j}}{\|b\|_2}, \; j = 1,\, \dots \,, n\\&lt;br /&gt;
for \; i = &amp;amp; 1 \; to \; k \\&lt;br /&gt;
3. \, z_j &amp;amp; = \sum\limits_{m=1}^{n} a_{jm} q_{i_m}, \; j = 1,\, \dots \,, n\\&lt;br /&gt;
4. \, \alpha_i &amp;amp; = \sum\limits_{j=1}^{n}q_j z_j\\&lt;br /&gt;
5. \, z_j &amp;amp; = z_j - \alpha_i q_{i_j} - \beta_{i-1}q_{i-1_j}, \, j = 1,\, \dots \,, n\\&lt;br /&gt;
6. \, \beta_i &amp;amp; = \|z\|_2 = \sqrt{\sum\limits_{j=1}^{n} z_m^2}\\&lt;br /&gt;
if \; \beta_i &amp;amp; == 0 \; then \; break\\&lt;br /&gt;
7. \, q_{i+1_j} &amp;amp; = \frac{z_j}{\beta_i}, \; j = 1,\, \dots \,, n\\&lt;br /&gt;
end \; &amp;amp; for&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для вычисления &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и соответствующих им собственных векторов алгоритмом Ланцоша без переортогонализации в худшем случае требуется:&lt;br /&gt;
* &amp;lt;math&amp;gt; kn^2 + 4 kn + n &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; вычислений квадратного корня,&lt;br /&gt;
* &amp;lt;math&amp;gt; n(k + 1) &amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt; n + k(n^2+3n-1)&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* нахождение собственных значений и векторов трехдиагональной симметричной матрицы размера &amp;lt;math&amp;gt; k \times k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Для нахождение собственных значений и векторов трехдиагональной симметричной матрицы эффективней всего использовать [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы | метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]], который требует &amp;lt;math&amp;gt; O(k^3) &amp;lt;/math&amp;gt; операций.&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метод Ланцоша без переортогонализации относится к алгоритмам &#039;&#039;с квадратичной сложностью&#039;&#039;.&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;
Алгоритм Ланцоша в параллельной форме состоит из инициализации и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций. Инициализации состоит из следующих ярусов:&lt;br /&gt;
* ярус с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
* ярус с &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* ярус с вычислением квадратного корня&lt;br /&gt;
* ярус &amp;lt;math&amp;gt;n&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;\log n&amp;lt;/math&amp;gt; и линейную ширину ярусов &amp;lt;math&amp;gt;n/2, n/4, ..., 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Итерационная часть алгоритма состоит из следующих ярусов:&lt;br /&gt;
* 4 яруса умножений с максимальной шириной &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
* 3 блока вычислений сумм &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; элементов, состоящих из &amp;lt;math&amp;gt;\log n&amp;lt;/math&amp;gt; ярусов и наибольшей шириной &amp;lt;math&amp;gt;\frac{n^2}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
* ярус из двух последовательных вычитаний с шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
* ярус извлечения квадратного корня с единичным вычислением&lt;br /&gt;
* ярус деления, содержащий &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций, может отсутствовать на последней итерации&lt;br /&gt;
&lt;br /&gt;
Таким образом, в параллельном варианте основную долю времени будут занимать операции сложения. &lt;br /&gt;
При классификации по высоте ЯПФ Алгоритм Ланцоша относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;. При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}, i \geq j&amp;lt;/math&amp;gt;), число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n + 1)}{2} + 1&amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/поддиагональные элементы, единица относится к параметру &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
по &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;k+kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является квадратичным: &amp;lt;math&amp;gt;\frac{kn^2}{k}&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;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации ===&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте IETL&amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/lanczos.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;/div&gt;</summary>
		<author><name>A.Freeman</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=12204</id>
		<title>Участник:A.Freeman/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:A.Freeman/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=12204"/>
		<updated>2016-10-15T21:46:13Z</updated>

		<summary type="html">&lt;p&gt;A.Freeman: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша без переортогонализации&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}+1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k + kn&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:KAKTUZ|Заспа А.Ю.]],  [[Участник:A.Freeman|Фролов А.А.]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; был опубликовн физиком и математиком Корнелием Ланцощем в 1950 году&amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот метод является частным случаем алгоритма Арнольда в случае, если исходная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - симметрична, и был представлен как итерационный метод вычисления собственных значений симметричной матрицы. Этот метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов исходной матрицы. Хотя алгоритм и был эффективным в вычислительном смысле, но он на некоторое время был предан забвению из-за численной неустойчивости. Только в 1970 Ojalvo и Newman модифицировали алгоритм для использования в арифметике с плавающей точкой&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;. Новый метод получил название [[Алгоритм Ланцоша с полной переортогонализацией | алгоритма Ланцоша с полной переортогонализацией]]. Но эта статья про его исходную версию.&lt;br /&gt;
На вход алгоритма подается вещественная симметричная матрица  &amp;lt;math&amp;gt;A = A^{T}&amp;lt;/math&amp;gt;,&lt;br /&gt;
{{Шаблон:ASymmetric}}&lt;br /&gt;
Поэтому достаточно хранить только чуть больше половины элементов исходной матрицы.&lt;br /&gt;
&lt;br /&gt;
Сам алгоритм соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца. На каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, состоящая из ортонормированных векторов Ланцоша. А в качестве приближенных собственных значений берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k \times k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 \\&lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 \\&lt;br /&gt;
&amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных значений и собственных векторов такой матрицы значительно проще чем их вычисление для исходной матрицы. Например, они могут быть вычислены с помощью [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы| метода «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]]. В этом методе эта процедура занимает &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций, где константа оказывается на практике довольно мала.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, начальный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: собственные вектора матрицы  &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; являющиеся столбцами матрицы &amp;lt;math&amp;gt;Q_k V&amp;lt;/math&amp;gt;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм на псевдокоде:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
q_1 = &amp;amp; \frac{b}{\|b\|_2},\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; if \; \beta_i == 0 \; then \; break\\&lt;br /&gt;
&amp;amp; q_{i+1} = \frac{z}{\beta_i}\\&lt;br /&gt;
end \; &amp;amp; for&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Затем вычислить собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром на каждой итерации является вычисление произведения матрицы на вектор:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&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;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
1. \, \beta_0 = &amp;amp; 0,\; q_0 = 0,\\&lt;br /&gt;
\|b\|_2 = &amp;amp;\sqrt{\sum\limits_{j=1}^{n} b_j^2},\\&lt;br /&gt;
2. \, q_{1_{j}} = &amp;amp;\frac{b_{j}}{\|b\|_2}, \; j = 1,\, \dots \,, n\\&lt;br /&gt;
for \; i = &amp;amp; 1 \; to \; k \\&lt;br /&gt;
3. \, z_j &amp;amp; = \sum\limits_{m=1}^{n} a_{jm} q_{i_m}, \; j = 1,\, \dots \,, n\\&lt;br /&gt;
4. \, \alpha_i &amp;amp; = \sum\limits_{j=1}^{n}q_j z_j\\&lt;br /&gt;
5. \, z_j &amp;amp; = z_j - \alpha_i q_{i_j} - \beta_{i-1}q_{i-1_j}, \, j = 1,\, \dots \,, n\\&lt;br /&gt;
6. \, \beta_i &amp;amp; = \|z\|_2 = \sqrt{\sum\limits_{j=1}^{n} z_m^2}\\&lt;br /&gt;
if \; \beta_i &amp;amp; == 0 \; then \; break\\&lt;br /&gt;
7. \, q_{i+1_j} &amp;amp; = \frac{z_j}{\beta_i}, \; j = 1,\, \dots \,, n\\&lt;br /&gt;
end \; &amp;amp; for&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для вычисления &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и соответствующих им собственных векторов алгоритмом Ланцоша без переортогонализации в худшем случае требуется:&lt;br /&gt;
* &amp;lt;math&amp;gt; kn^2 + 4 kn + n &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; вычислений квадратного корня,&lt;br /&gt;
* &amp;lt;math&amp;gt; n(k + 1) &amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt; n + k(n^2+3n-1)&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* нахождение собственных значений и векторов трехдиагональной симметричной матрицы размера &amp;lt;math&amp;gt; k \times k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
Для нахождение собственных значений и векторов трехдиагональной симметричной матрицы эффективней всего использовать [[Метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы | метод «разделяй и властвуй» вычисления собственных значений и векторов симметричной трехдиагональной матрицы]], который требует &amp;lt;math&amp;gt; O(k^3) &amp;lt;/math&amp;gt; операций.&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метод Ланцоша без переортогонализации относится к алгоритмам &#039;&#039;с квадратичной сложностью&#039;&#039;.&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;
Алгоритм Ланцоша в параллельной форме состоит из инициализации и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций. Инициализации состоит из следующих ярусов:&lt;br /&gt;
* ярус с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
* ярус с &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* ярус с вычислением квадратного корня&lt;br /&gt;
* ярус &amp;lt;math&amp;gt;n&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;\log n&amp;lt;/math&amp;gt; и линейную ширину ярусов &amp;lt;math&amp;gt;n/2, n/4, ..., 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Итерационная часть алгоритма состоит из следующих ярусов:&lt;br /&gt;
* 4 яруса умножений с шириной ярусов &amp;lt;math&amp;gt;n^2, n, 2n, n&amp;lt;/math&amp;gt;&lt;br /&gt;
* 3 блока вычислений сумм &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; элементов, состоящих из &amp;lt;math&amp;gt;\log n&amp;lt;/math&amp;gt; ярусов и наибольшей шириной для каждого блока &amp;lt;math&amp;gt;\frac{n^2}{2}, \frac{n}{2}, \frac{n}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
* ярус из двух последовательных вычитаний с шириной &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
* ярус извлечения квадратного корня с единичным вычислением&lt;br /&gt;
* ярус деления, содержащий &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций, может отсутствовать на последней итерации&lt;br /&gt;
&lt;br /&gt;
Таким образом, в параллельном варианте основную долю времени будут занимать операции сложения. &lt;br /&gt;
При классификации по высоте ЯПФ Алгоритм Ланцоша относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;. При классификации по ширине ЯПФ его сложность будет &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}, i \geq j&amp;lt;/math&amp;gt;), число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;\frac{n (n + 1)}{2} + 1&amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/поддиагональные элементы, единица относится к параметру &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
по &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближений собственных значений и собственных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &lt;br /&gt;
&amp;lt;math&amp;gt;k+kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является квадратичным: &amp;lt;math&amp;gt;\frac{kn^2}{k}&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;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации ===&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте IETL&amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/lanczos.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;/div&gt;</summary>
		<author><name>A.Freeman</name></author>
	</entry>
</feed>