<?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=KAKTUZ</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=KAKTUZ"/>
	<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/KAKTUZ"/>
	<updated>2026-10-22T22:58:30Z</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=19510</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=19510"/>
		<updated>2016-11-29T20:04:13Z</updated>

		<summary type="html">&lt;p&gt;KAKTUZ: &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>KAKTUZ</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=18018</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=18018"/>
		<updated>2016-11-17T20:34:01Z</updated>

		<summary type="html">&lt;p&gt;KAKTUZ: &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;
Проведём исследование масштабируемости параллельной реализации алгоритма Ланцоша без переортогонализации согласно [[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;
[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>KAKTUZ</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=18017</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=18017"/>
		<updated>2016-11-17T20:32:00Z</updated>

		<summary type="html">&lt;p&gt;KAKTUZ: Отмена правки 17633, сделанной участником ASA (обс.)&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.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;
[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>KAKTUZ</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=18016</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=18016"/>
		<updated>2016-11-17T20:31:05Z</updated>

		<summary type="html">&lt;p&gt;KAKTUZ: /* Масштабируемость алгоритма и его реализации */&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;
[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>KAKTUZ</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=17306</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=17306"/>
		<updated>2016-11-15T15:54:50Z</updated>

		<summary type="html">&lt;p&gt;KAKTUZ: /* Последовательная сложность алгоритма */&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.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;
=== Динамические характеристики и эффективность реализации алгоритма ===&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>KAKTUZ</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=17302</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=17302"/>
		<updated>2016-11-15T15:44:45Z</updated>

		<summary type="html">&lt;p&gt;KAKTUZ: /* Последовательная сложность алгоритма */&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.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;
=== Динамические характеристики и эффективность реализации алгоритма ===&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>KAKTUZ</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=15546</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=15546"/>
		<updated>2016-11-01T12:25:31Z</updated>

		<summary type="html">&lt;p&gt;KAKTUZ: &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;
На каждой итерации будет вычисляться умножение матрицы &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^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>KAKTUZ</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=15541</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=15541"/>
		<updated>2016-11-01T12:13:12Z</updated>

		<summary type="html">&lt;p&gt;KAKTUZ: &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;
На каждой итерации будет вычисляться умножение матрицы &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>KAKTUZ</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=15514</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=15514"/>
		<updated>2016-11-01T11:19:53Z</updated>

		<summary type="html">&lt;p&gt;KAKTUZ: /* Информационный граф */&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;
Алгоритм Ланцоша без переортогонализации не является детерминированным (возможно выполнение меньшего числа итераций алгоритма), в случае если все собственные значения уже вычислены.&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>KAKTUZ</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=15512</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=15512"/>
		<updated>2016-11-01T11:14:51Z</updated>

		<summary type="html">&lt;p&gt;KAKTUZ: /* Информационный граф */&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;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>KAKTUZ</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=15511</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=15511"/>
		<updated>2016-11-01T11:12:46Z</updated>

		<summary type="html">&lt;p&gt;KAKTUZ: /* Макроструктура алгоритма */&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;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>KAKTUZ</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=15510</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=15510"/>
		<updated>2016-11-01T11:11:59Z</updated>

		<summary type="html">&lt;p&gt;KAKTUZ: &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;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>KAKTUZ</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=15494</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=15494"/>
		<updated>2016-11-01T10:55:02Z</updated>

		<summary type="html">&lt;p&gt;KAKTUZ: /* Макроструктура алгоритма */&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;
&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>KAKTUZ</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=14693</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=14693"/>
		<updated>2016-10-29T12:10:01Z</updated>

		<summary type="html">&lt;p&gt;KAKTUZ: /* Математическое описание алгоритма */&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|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>KAKTUZ</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=14680</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=14680"/>
		<updated>2016-10-29T11:37:41Z</updated>

		<summary type="html">&lt;p&gt;KAKTUZ: /* Схема реализации последовательного алгоритма */&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;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|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>KAKTUZ</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=14677</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=14677"/>
		<updated>2016-10-29T11:22:00Z</updated>

		<summary type="html">&lt;p&gt;KAKTUZ: /* Схема реализации последовательного алгоритма */&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;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_m^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;&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>KAKTUZ</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=14675</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=14675"/>
		<updated>2016-10-29T11:18:55Z</updated>

		<summary type="html">&lt;p&gt;KAKTUZ: /* Схема реализации последовательного алгоритма */&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;
&amp;lt;math&amp;gt;1.\, \beta_0 = 0,\; q_0 = 0&amp;lt;/math&amp;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;
&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;
&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;
&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;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;
&amp;lt;math&amp;gt;i.4\, \beta_i = \|z\|_2 = \sqrt{\sum\limits_{j=1}^{n} z_m^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;&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>KAKTUZ</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=14618</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=14618"/>
		<updated>2016-10-28T22:00:08Z</updated>

		<summary type="html">&lt;p&gt;KAKTUZ: /* Математическое описание алгоритма */&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|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>KAKTUZ</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=14617</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=14617"/>
		<updated>2016-10-28T21:59:24Z</updated>

		<summary type="html">&lt;p&gt;KAKTUZ: /* Математическое описание алгоритма */&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;. После выполнения данных действий начинаются итерации алгоритма. Которых будет не больше чем &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;
На &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|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>KAKTUZ</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=14604</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=14604"/>
		<updated>2016-10-28T20:49:44Z</updated>

		<summary type="html">&lt;p&gt;KAKTUZ: /* Макроструктура алгоритма */&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;
&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;
Последовательность исполнения метода следующая:&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>KAKTUZ</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88_%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_1.png&amp;diff=12860</id>
		<title>Файл:Ланцош без переортогонализации 1.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:%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88_%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_1.png&amp;diff=12860"/>
		<updated>2016-10-16T21:10:37Z</updated>

		<summary type="html">&lt;p&gt;KAKTUZ: Информационный граф алгоритма Ланцоша без переортогонализации&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Информационный граф алгоритма Ланцоша без переортогонализации&lt;/div&gt;</summary>
		<author><name>KAKTUZ</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%89_%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_1.png&amp;diff=12859</id>
		<title>Файл:Ланцощ без переортогонализации 1.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:%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%89_%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_1.png&amp;diff=12859"/>
		<updated>2016-10-16T21:08:21Z</updated>

		<summary type="html">&lt;p&gt;KAKTUZ: KAKTUZ загрузил новую версию Файл:Ланцощ без переортогонализации 1.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Информационный граф алгоритма Ланцоша без переортогонализации&lt;/div&gt;</summary>
		<author><name>KAKTUZ</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%89_%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_1.png&amp;diff=12857</id>
		<title>Файл:Ланцощ без переортогонализации 1.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:%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%89_%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_1.png&amp;diff=12857"/>
		<updated>2016-10-16T21:07:20Z</updated>

		<summary type="html">&lt;p&gt;KAKTUZ: Информационный граф алгоритма Ланцоша без переортогонализации&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Информационный граф алгоритма Ланцоша без переортогонализации&lt;/div&gt;</summary>
		<author><name>KAKTUZ</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=12314</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=12314"/>
		<updated>2016-10-15T23:18:37Z</updated>

		<summary type="html">&lt;p&gt;KAKTUZ: /* Ресурс параллелизма алгоритма */&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)&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>KAKTUZ</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=12312</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=12312"/>
		<updated>2016-10-15T23:15:21Z</updated>

		<summary type="html">&lt;p&gt;KAKTUZ: /* Ресурс параллелизма алгоритма */&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;&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>KAKTUZ</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=12301</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=12301"/>
		<updated>2016-10-15T23:01:23Z</updated>

		<summary type="html">&lt;p&gt;KAKTUZ: /* Ресурс параллелизма алгоритма */&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;
** вычисление скалярного произведения вектора самого на себя:&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>KAKTUZ</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=11467</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=11467"/>
		<updated>2016-10-15T19:33:45Z</updated>

		<summary type="html">&lt;p&gt;KAKTUZ: /* Математическое описание алгоритма */&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)&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;
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;
TBD&lt;br /&gt;
&lt;br /&gt;
== Программная реализация ==&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации ===&lt;/div&gt;</summary>
		<author><name>KAKTUZ</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=11448</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=11448"/>
		<updated>2016-10-15T19:31:27Z</updated>

		<summary type="html">&lt;p&gt;KAKTUZ: /* Макроструктура алгоритма */&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)&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;
Исходные данные: симметрическая матрица &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;
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;
TBD&lt;br /&gt;
&lt;br /&gt;
== Программная реализация ==&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации ===&lt;/div&gt;</summary>
		<author><name>KAKTUZ</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=11429</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=11429"/>
		<updated>2016-10-15T19:29:03Z</updated>

		<summary type="html">&lt;p&gt;KAKTUZ: &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)&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;
Исходные данные: симметрическая матрица &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;
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;
TBD&lt;br /&gt;
&lt;br /&gt;
== Программная реализация ==&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации ===&lt;/div&gt;</summary>
		<author><name>KAKTUZ</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=11424</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=11424"/>
		<updated>2016-10-15T19:28:08Z</updated>

		<summary type="html">&lt;p&gt;KAKTUZ: &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)&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;
Исходные данные: симметрическая матрица &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;
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;
TBD&lt;br /&gt;
&lt;br /&gt;
== Программная реализация ==&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации ===&lt;/div&gt;</summary>
		<author><name>KAKTUZ</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=6170</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=6170"/>
		<updated>2016-10-12T21:52:49Z</updated>

		<summary type="html">&lt;p&gt;KAKTUZ: &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(k\; n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(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]])&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;
Исходные данные: симметрическая матрица &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;/div&gt;</summary>
		<author><name>KAKTUZ</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=6150</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=6150"/>
		<updated>2016-10-12T21:44:06Z</updated>

		<summary type="html">&lt;p&gt;KAKTUZ: /* Последовательная сложность алгоритма */&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(k\; n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(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]])&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;
Исходные данные: симметрическая матрица &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;
Для нахождение собственных значений и векторов трехдиагональной симметричной матрицы эффективней всего использовать &lt;br /&gt;
При классификации по последовательной сложности, таким образом, метод Холецкого относится к алгоритмам &#039;&#039;с кубической сложностью&#039;&#039;.&lt;/div&gt;</summary>
		<author><name>KAKTUZ</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=6141</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=6141"/>
		<updated>2016-10-12T21:41:14Z</updated>

		<summary type="html">&lt;p&gt;KAKTUZ: &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(k\; n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(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]])&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;
Исходные данные: симметрическая матрица &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; 1 &amp;lt;/math&amp;gt; нахождение собственных значений и векторов трехдиагональной симметричной матрицы.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
При этом использование режима накопления требует совершения умножений и вычитаний в режиме двойной точности (или использования функции вроде DPROD в Фортране), что ещё больше увеличивает долю умножений и сложений/вычитаний во времени, требуемом для выполнения метода Холецкого.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метод Холецкого относится к алгоритмам &#039;&#039;с кубической сложностью&#039;&#039;.&lt;/div&gt;</summary>
		<author><name>KAKTUZ</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=6088</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=6088"/>
		<updated>2016-10-12T21:04:27Z</updated>

		<summary type="html">&lt;p&gt;KAKTUZ: /* Схема реализации последовательного алгоритма */&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(k\; n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(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]])&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;
Исходные данные: симметрическая матрица &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, \; j = 1,\, \dots \,, n\\&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;/div&gt;</summary>
		<author><name>KAKTUZ</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=5985</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=5985"/>
		<updated>2016-10-12T19:27:04Z</updated>

		<summary type="html">&lt;p&gt;KAKTUZ: /* Математическое описание алгоритма */&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(k\; n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(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]])&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;
Исходные данные: симметрическая матрица &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;
\beta_0 = 0,\; q_0 = 0,\\&lt;br /&gt;
\|b\|_2 = &lt;br /&gt;
q_{1_{j}} = &amp;amp; \frac{b_{j}}{\|b\|_2} \; j = 1,\; \dots \;, n\\&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;/div&gt;</summary>
		<author><name>KAKTUZ</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=5814</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=5814"/>
		<updated>2016-10-12T15:08:28Z</updated>

		<summary type="html">&lt;p&gt;KAKTUZ: &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(k\; n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(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]])&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;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, начальный вектор &amp;lt;math&amp;gt;q_1&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;
\beta_0 = 0,\; q_0 = 0,\\&lt;br /&gt;
\|b\|_2 = &lt;br /&gt;
q_{1_{j}} = &amp;amp; \frac{b_{j}}{\|b\|_2} \; j = 1,\; \dots \;, n\\&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;/div&gt;</summary>
		<author><name>KAKTUZ</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=5800</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=5800"/>
		<updated>2016-10-12T14:55:16Z</updated>

		<summary type="html">&lt;p&gt;KAKTUZ: /* Макроструктура алгоритма */&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(k\; n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(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]])&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;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, начальный вектор &amp;lt;math&amp;gt;q_1&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;/div&gt;</summary>
		<author><name>KAKTUZ</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=5796</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=5796"/>
		<updated>2016-10-12T14:53:39Z</updated>

		<summary type="html">&lt;p&gt;KAKTUZ: &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(k\; n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(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]])&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;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, начальный вектор &amp;lt;math&amp;gt;q_1&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;/div&gt;</summary>
		<author><name>KAKTUZ</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=5782</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=5782"/>
		<updated>2016-10-12T14:33:20Z</updated>

		<summary type="html">&lt;p&gt;KAKTUZ: &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(k\; n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(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]])&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;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, начальный вектор &amp;lt;math&amp;gt;q_1&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;/div&gt;</summary>
		<author><name>KAKTUZ</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=5723</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=5723"/>
		<updated>2016-10-12T12:15:20Z</updated>

		<summary type="html">&lt;p&gt;KAKTUZ: &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(k\; n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(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]])&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;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, начальный вектор &amp;lt;math&amp;gt;q_1&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;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
q_1  &amp;amp;= \frac{b}{\|b\|},\: \beta_0 = 0,\: q_0 = 0\\&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;
&lt;br /&gt;
В ряде реализаций деление на диагональный элемент выполняется в два этапа: вычисление &amp;lt;math&amp;gt;\frac{1}{l_{ii}}&amp;lt;/math&amp;gt; и затем умножение на него всех (видоизменённых) &amp;lt;math&amp;gt;a_{ji}&amp;lt;/math&amp;gt; . Здесь мы этот вариант алгоритма не рассматриваем. Заметим только, что он имеет худшие параллельные характеристики, чем представленный.&lt;/div&gt;</summary>
		<author><name>KAKTUZ</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=5719</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=5719"/>
		<updated>2016-10-12T12:01:35Z</updated>

		<summary type="html">&lt;p&gt;KAKTUZ: &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(k\; n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(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]])&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;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, начальный вектор &amp;lt;math&amp;gt;q_1&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;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
l_{11} &amp;amp; = \sqrt{a_{11}}, \\&lt;br /&gt;
l_{j1} &amp;amp; = \frac{a_{j1}}{l_{11}}, \quad j \in [2, n], \\&lt;br /&gt;
l_{ii} &amp;amp; = \sqrt{a_{ii} - \sum_{p = 1}^{i - 1} l_{ip}^2}, \quad i \in [2, n], \\&lt;br /&gt;
l_{ji} &amp;amp; = \left (a_{ji} - \sum_{p = 1}^{i - 1} l_{ip} l_{jp} \right ) / l_{ii}, \quad i \in [2, n - 1], j \in [i + 1, n].&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;\frac{1}{l_{ii}}&amp;lt;/math&amp;gt; и затем умножение на него всех (видоизменённых) &amp;lt;math&amp;gt;a_{ji}&amp;lt;/math&amp;gt; . Здесь мы этот вариант алгоритма не рассматриваем. Заметим только, что он имеет худшие параллельные характеристики, чем представленный.&lt;/div&gt;</summary>
		<author><name>KAKTUZ</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=5712</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=5712"/>
		<updated>2016-10-12T11:38:12Z</updated>

		<summary type="html">&lt;p&gt;KAKTUZ: &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(k\; n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(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]])&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;
Исходные данные: положительно определённая симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&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;/div&gt;</summary>
		<author><name>KAKTUZ</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=5707</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=5707"/>
		<updated>2016-10-12T11:32:20Z</updated>

		<summary type="html">&lt;p&gt;KAKTUZ: &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(k\; n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(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]])&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;
Исходные данные: положительно определённая симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&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;/div&gt;</summary>
		<author><name>KAKTUZ</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=5706</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=5706"/>
		<updated>2016-10-12T11:31:05Z</updated>

		<summary type="html">&lt;p&gt;KAKTUZ: &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(k\; n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(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]])&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;
Исходные данные: положительно определённая симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&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;/div&gt;</summary>
		<author><name>KAKTUZ</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=5687</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=5687"/>
		<updated>2016-10-12T10:57:22Z</updated>

		<summary type="html">&lt;p&gt;KAKTUZ: &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(k\; n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(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]])&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 модифицировали алгоритм для использования в арифметике с плавающей точкой. Новый метод получил название &#039;&#039;&#039;Алгоритм Ланцоша с полной переортогонализацией&#039;&#039;&#039;. Но эта статья про его обычную исходную версию.&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;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: положительно определённая симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&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;/div&gt;</summary>
		<author><name>KAKTUZ</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:TridiagMatrix&amp;diff=5662</id>
		<title>Шаблон:TridiagMatrix</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:TridiagMatrix&amp;diff=5662"/>
		<updated>2016-10-12T10:22:50Z</updated>

		<summary type="html">&lt;p&gt;KAKTUZ: Новая страница: «&amp;lt;math&amp;gt; \begin{pmatrix} \alpha_1 &amp;amp; \beta_1 \\ \beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 \\ &amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots \\ &amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{n-1} \\ &amp;amp; &amp;amp; &amp;amp; \beta_{n-1}…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;math&amp;gt;&lt;br /&gt;
\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_{n-1} \\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \beta_{n-1} &amp;amp; \alpha_n&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;/div&gt;</summary>
		<author><name>KAKTUZ</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:ASymmetric&amp;diff=5655</id>
		<title>Шаблон:ASymmetric</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:ASymmetric&amp;diff=5655"/>
		<updated>2016-10-12T10:11:15Z</updated>

		<summary type="html">&lt;p&gt;KAKTUZ: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;:&amp;lt;math&amp;gt;&lt;br /&gt;
A = \begin{pmatrix}&lt;br /&gt;
 a_{11} &amp;amp; a_{12} &amp;amp; a_{13} &amp;amp; \cdots &amp;amp; a_{1\ n-1} &amp;amp; a_{1\ n} \\&lt;br /&gt;
 a_{12} &amp;amp; a_{22} &amp;amp; a_{23} &amp;amp; \cdots &amp;amp; a_{2\ n-1} &amp;amp; a_{2\ n} \\&lt;br /&gt;
 a_{13} &amp;amp; a_{23} &amp;amp; a_{33} &amp;amp; \cdots &amp;amp; a_{3\ n-1} &amp;amp; a_{3\ n} \\&lt;br /&gt;
 \vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \vdots \\&lt;br /&gt;
 a_{1\ n-1} &amp;amp; \cdots &amp;amp; \cdots &amp;amp; a_{n-2\ n-1} &amp;amp; a_{n-1\ n-1} &amp;amp; a_{n-1\ n} \\&lt;br /&gt;
 a_{1\ n} &amp;amp; \cdots &amp;amp; \cdots &amp;amp; a_{n-2\ n} &amp;amp; a_{n-1\ n} &amp;amp; a_{n\ n} \\&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;/div&gt;</summary>
		<author><name>KAKTUZ</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=5412</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=5412"/>
		<updated>2016-10-11T18:05:09Z</updated>

		<summary type="html">&lt;p&gt;KAKTUZ: Новая страница: «{{algorithm | name              = Алгоритм Ланцоша без переортогонализации | serial_complexity = &amp;lt;math&amp;gt;O(k\; n^2)&amp;lt;/math&amp;gt; | pf…»&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(k\; n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(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]])&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 модифицировали алгоритм для использования в арифметике с плавающей точкой. Новый метод получил название &#039;&#039;&#039;Алгоритм Ланцоша с полной переортогонализацией&#039;&#039;&#039;. Но эта статья про его обычную исходную версию.&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;
&lt;br /&gt;
Исходные данные: положительно определённая симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&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;/div&gt;</summary>
		<author><name>KAKTUZ</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:ASymmetric&amp;diff=5393</id>
		<title>Шаблон:ASymmetric</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:ASymmetric&amp;diff=5393"/>
		<updated>2016-10-11T16:04:26Z</updated>

		<summary type="html">&lt;p&gt;KAKTUZ: Новая страница: «:&amp;lt;math&amp;gt; A = \begin{bmatrix}  a_{11} &amp;amp; a_{12} &amp;amp; a_{13} &amp;amp; \cdots &amp;amp; a_{1\ n-1} &amp;amp; a_{1\ n} \\  a_{12} &amp;amp; a_{22} &amp;amp; a_{23} &amp;amp; \cdots &amp;amp; a_{2\ n-1} &amp;amp; a_{2\ n} \\  a_{13} &amp;amp;…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;:&amp;lt;math&amp;gt;&lt;br /&gt;
A = \begin{bmatrix}&lt;br /&gt;
 a_{11} &amp;amp; a_{12} &amp;amp; a_{13} &amp;amp; \cdots &amp;amp; a_{1\ n-1} &amp;amp; a_{1\ n} \\&lt;br /&gt;
 a_{12} &amp;amp; a_{22} &amp;amp; a_{23} &amp;amp; \cdots &amp;amp; a_{2\ n-1} &amp;amp; a_{2\ n} \\&lt;br /&gt;
 a_{13} &amp;amp; a_{23} &amp;amp; a_{33} &amp;amp; \cdots &amp;amp; a_{3\ n-1} &amp;amp; a_{3\ n} \\&lt;br /&gt;
 \vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \vdots \\&lt;br /&gt;
 a_{1\ n-1} &amp;amp; \cdots &amp;amp; \cdots &amp;amp; a_{n-2\ n-1} &amp;amp; a_{n-1\ n-1} &amp;amp; a_{n-1\ n} \\&lt;br /&gt;
 a_{1\ n} &amp;amp; \cdots &amp;amp; \cdots &amp;amp; a_{n-2\ n} &amp;amp; a_{n-1\ n} &amp;amp; a_{n\ n} \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;/div&gt;</summary>
		<author><name>KAKTUZ</name></author>
	</entry>
</feed>