<?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=Shostix</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=Shostix"/>
	<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/Shostix"/>
	<updated>2026-10-22T15:52:46Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Shostix/%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=22468</id>
		<title>Участник:Shostix/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:Shostix/%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=22468"/>
		<updated>2017-02-08T12:07:13Z</updated>

		<summary type="html">&lt;p&gt;Shostix: /* Масштабируемость алгоритма и его реализации */&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;
| 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;kn+k&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;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Авторы&#039;&#039;&#039;: А.В. Шостик.&lt;br /&gt;
&lt;br /&gt;
==Свойства и структура алгоритма==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - один из итерационных методов вычисления собственных значений и собственных векторов симметричных матриц (задача &amp;lt;math&amp;gt;Ax = \lambda x&amp;lt;/math&amp;gt;). Используется для работы с матрицами столь большими, что классические численные методы нахождения собственных значений неприменимы из-за высокой вычислительной сложности. На практике чаще всего используется для работы с большими разреженными матрицами.&lt;br /&gt;
&lt;br /&gt;
Алгоритм был предложен в 1950 году венгерским физиком и математиком Корнелием Ланцошем. Основан на понятии построения крыловского подпространства и процедуре Рэлея-Ритца: строит последовательность трехдиагональных матриц с тем свойством, что экстремальные собственные значения для каждой последующей трехдиагональной матрицы дают все более точные оценки экстремальных собственных значений для А. &lt;br /&gt;
&lt;br /&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;
&#039;&#039;Исходные данные&#039;&#039;:&lt;br /&gt;
 &lt;br /&gt;
*   симметрическая матрица &amp;lt;math&amp;gt;A=A^T&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, элементы матрицы &amp;lt;math&amp;gt;a_{ij}=a_{ji}&amp;lt;/math&amp;gt;&lt;br /&gt;
*   начальный вектор &amp;lt;math&amp;gt;v = {v_1, v_2, ..., v_n}, v \neq \theta&amp;lt;/math&amp;gt; &lt;br /&gt;
Так как матрица является симметрической, достаточно хранить &amp;lt;math&amp;gt;\frac{n(n+1)}{2}&amp;lt;/math&amp;gt; ее элементов.&lt;br /&gt;
&lt;br /&gt;
Для исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; строится крыловское подпространство. Крыловское подпространство - это линейная оболочка векторов &amp;lt;math&amp;gt;[v, Av, A^2v, ..., A^{k-1}v]&amp;lt;/math&amp;gt;, называемых векторами Ланцоша.&lt;br /&gt;
Каждый из векторов Ланцоша ортонормируется: &amp;lt;math&amp;gt;q_k=\frac{A^kv}{\|A^kv\|}&amp;lt;/math&amp;gt;, и на шаге &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; алгоритма имеется Крыловская матрица &amp;lt;math&amp;gt;Q = {q_0, ..., q_{k-1}}&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&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;k&amp;lt;/math&amp;gt;-ым приближением собственного вектора исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
В качестве приближенных собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; берутся собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt; (числа Ритца). В качестве алгоритма нахождения собственных векторов и собственных значений симметрической трехдиагональной матрицы будем использовать метод &amp;quot;разделяй и властвуй&amp;quot;, который требует &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций.&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Выходные данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* совокупность собственных векторов матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; (т.е. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-ых приближений собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;)&lt;br /&gt;
* совокупность собственных значений матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; (т.е. &amp;lt;math&amp;gt;k&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;
&#039;&#039;&#039;Вычислительное ядро&#039;&#039;&#039;. т.е. часть алгоритма, требующая наибольших вычислительных затрат на каждой итерации состоит из вычисления промежуточного вектора &amp;lt;math&amp;gt;z=Aq_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&#039;&#039;&#039; Итерация алгоритма: &#039;&#039;&#039;&lt;br /&gt;
* вычисление нормы вектора,&lt;br /&gt;
* деление вектора на число,&lt;br /&gt;
* умножение матрицы на вектор,&lt;br /&gt;
* линейная комбинация векторов (умножение на число и сложение).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Финальный расчет: &#039;&#039;&#039;&lt;br /&gt;
* вычисление собственных векторов и собственных значений трехдиагональной симметричной матрицы.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Псевдокод алгоритма&#039;&#039;&amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Вход&#039;&#039;&#039;  : размерность матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, элементы симметричной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, количество итераций &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
 &#039;&#039;&#039;Выход&#039;&#039;&#039; : собственные вектора матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, матрица собственных значений &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
q_1 = &amp;amp; b/ \|b\|_2,\; &lt;br /&gt;
\beta_0 = 0,\; &lt;br /&gt;
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 \\ &lt;br /&gt;
&amp;amp; \; \; \; \; exit\\&lt;br /&gt;
&amp;amp; else \\&lt;br /&gt;
&amp;amp; \; \; \; \; q_{i+1} = 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;
&amp;lt;math&amp;gt;procedure(T_k)&amp;lt;/math&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt;procedure()&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; итераций и финального расчета собственных векторов и собственных значений.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим сложность каждой макрооперации алгоритма:&lt;br /&gt;
* вычисление нормы вектора - &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений, операция извлечения корня&lt;br /&gt;
* деление вектора на число - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций&lt;br /&gt;
* умножение матрицы на вектор - &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций&lt;br /&gt;
* скалярное произведение векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций&lt;br /&gt;
* линейная комбинация векторов - &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений и вычитаний&lt;br /&gt;
* вычисление собственных векторов и собственных значений матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; методом &amp;quot;Разделяй и властвуй&amp;quot;  - &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Инициализация:&#039;&#039;&#039; &lt;br /&gt;
* вычисление нормы вектора,&lt;br /&gt;
* деление вектора на число.&lt;br /&gt;
&#039;&#039;&#039;Одна итерация:&#039;&#039;&#039; &lt;br /&gt;
* умножение матрицы на вектор,&lt;br /&gt;
* скалярное произведение векторов,&lt;br /&gt;
* линейная комбинация векторов,&lt;br /&gt;
* вычисление нормы вектора,&lt;br /&gt;
* деление вектора на число.&lt;br /&gt;
&#039;&#039;&#039;Финальный расчет:&#039;&#039;&#039;&lt;br /&gt;
* вычисление собственных векторов и собственных значений матрицы&lt;br /&gt;
&lt;br /&gt;
Итого &#039;&#039;&#039;последовательная сложность алгоритма&#039;&#039;&#039; составляет &amp;lt;math&amp;gt;O(3n+k(n^2+n+2n+2n+3n))+O(k^3)&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;k&amp;lt;/math&amp;gt;, сложность алгоритма Ланцоша можно рассматривать &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма с входными и выходными данными можно описать в виде рисунка:&lt;br /&gt;
&lt;br /&gt;
[[File:Ланцош.png|600px|thumb|center|Рисунок 1. Информационный граф алгоритма Ланцоша.&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; — операция деления, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;A&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;L&amp;lt;/math&amp;gt; — операция вычисления линейной комбинации векторов, &amp;lt;br/&amp;gt;&lt;br /&gt;
▽ - проверка условия &amp;lt;math&amp;gt;\mathsf{(\beta_i = 0)}&amp;lt;/math&amp;gt; и выход из цикла в случае выполнения условия]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Внутри каждой итерации алгоритма можно задействовать параллельные вычисления для суммирования векторов (использовать суммирование методом сдваивания элементов). Эта операция будет использована в макрооперации умножения матрицы на вектор, которая требует в последовательной реализации &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сложение. В таком виде сложение &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; элементов можно выполнить за &amp;lt;math&amp;gt;\log_2 n&amp;lt;/math&amp;gt; действий.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Входные данные&#039;&#039;: симметрическая матрица &amp;lt;math&amp;gt;A=A^T&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;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Объем входных данных&#039;&#039;: &amp;lt;math&amp;gt;\frac{n(n+1)}{2} + 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Выходные данные&#039;&#039;: &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;
&#039;&#039;Объем выходных данных&#039;&#039;: &amp;lt;math&amp;gt;kn+k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Сложность последовательной реализации алгоритма &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;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;
** В умножении матрицы на вектор сложение n элементов выполняется в &amp;lt;math&amp;gt;\log_2 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;
* Отношение последовательной сложности  к параллельной &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Вычислительная мощность алгоритма Ланцоша из последовательной сложности алгоритма &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+2k}&amp;lt;/math&amp;gt;. Учитывая &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; много меньше  &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, вычислительная мощность ≈ &amp;lt;math&amp;gt; 2k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* В алгоритме Ланцоша возможно выполнение числа итераций менее &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; если все собственные значения матрицы вычисляются раньше.&lt;br /&gt;
* Для найденных собственных значений справедливо: &amp;lt;math&amp;gt;\lambda_i(T_{k+1})\geq \lambda_i(T_{k})\geq \lambda_{i+1}(T_{k+1})\geq \lambda_{i+1}(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;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;[http://parallel.ru/cluster/].&lt;br /&gt;
&lt;br /&gt;
Исследовалась реализация&amp;lt;ref&amp;gt;http://pastebin.com/3W4uUVGj&amp;lt;/ref&amp;gt; на языке C++ с использованием MPI.  Компилятор GCC 5.2.1; версия MPI 1.8.4;&lt;br /&gt;
&lt;br /&gt;
Для компиляции и запуска использовались следующие команды:&lt;br /&gt;
&amp;lt;pre&amp;gt;$ mpic++ -std=c++0x -O2 &amp;lt;CPP_FILE&amp;gt; -lm -static-libstdc++ -o &amp;lt;EXE_FILE&amp;gt;&lt;br /&gt;
$ mpirun -np &amp;lt;N_PROCESSORS&amp;gt; &amp;lt;EXE_FILE&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Число процессоров: 2, 4, 8, 16, 32, 64, 128.&lt;br /&gt;
* Размерность матрицы &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; от 5 000 до  50 000, шаг 5 000.&lt;br /&gt;
* Количество итераций алгоритма Ланцоша для всех экспериментов 200.&lt;br /&gt;
&lt;br /&gt;
Результаты:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+  Время выполнения алгоритма&lt;br /&gt;
|-&lt;br /&gt;
!&lt;br /&gt;
! 2&lt;br /&gt;
! 4&lt;br /&gt;
! 8&lt;br /&gt;
! 16 &lt;br /&gt;
! 32&lt;br /&gt;
! 48&lt;br /&gt;
! 64 &lt;br /&gt;
! 96&lt;br /&gt;
! 128&lt;br /&gt;
|-&lt;br /&gt;
! 5000&lt;br /&gt;
| 1,5243&lt;br /&gt;
| 1,0951&lt;br /&gt;
| 0,9334&lt;br /&gt;
| 0,6631&lt;br /&gt;
| 0,7456&lt;br /&gt;
| 0,7038&lt;br /&gt;
| 0,7989&lt;br /&gt;
| 0,9985&lt;br /&gt;
| 0,985&lt;br /&gt;
|-&lt;br /&gt;
! 10 000&lt;br /&gt;
| 5,667&lt;br /&gt;
| 4,2625&lt;br /&gt;
| 2,7502&lt;br /&gt;
| 3,6762&lt;br /&gt;
| 3,4435&lt;br /&gt;
| 3,6192&lt;br /&gt;
| 3,5194&lt;br /&gt;
| 3,8486&lt;br /&gt;
| 3,2956&lt;br /&gt;
|-&lt;br /&gt;
! 15 000&lt;br /&gt;
| 12,5207&lt;br /&gt;
| 6,5995&lt;br /&gt;
| 7,2897&lt;br /&gt;
| 8,5086&lt;br /&gt;
| 8,539&lt;br /&gt;
| 9,0018&lt;br /&gt;
| 8,9427&lt;br /&gt;
| 15,0132&lt;br /&gt;
| 7,7088&lt;br /&gt;
|-&lt;br /&gt;
! 20 000&lt;br /&gt;
| 23,8143&lt;br /&gt;
| 15,851&lt;br /&gt;
| 10,6313&lt;br /&gt;
| 13,7241&lt;br /&gt;
| 12,8051&lt;br /&gt;
| 14,3183&lt;br /&gt;
| 13,2946&lt;br /&gt;
| 14,0864&lt;br /&gt;
| 13,7499&lt;br /&gt;
|-&lt;br /&gt;
! 25 000&lt;br /&gt;
| 37,5419&lt;br /&gt;
| 17,9436&lt;br /&gt;
| 15,5451&lt;br /&gt;
| 18,3944&lt;br /&gt;
| 19,6076&lt;br /&gt;
| 18,5444&lt;br /&gt;
| 19,1347&lt;br /&gt;
| 21,8366&lt;br /&gt;
| 21,4454&lt;br /&gt;
|-&lt;br /&gt;
! 30 000&lt;br /&gt;
| 55,014&lt;br /&gt;
| 26,2702&lt;br /&gt;
| 22,3943&lt;br /&gt;
| 26,4935&lt;br /&gt;
| 25,5618&lt;br /&gt;
| 29,6784&lt;br /&gt;
| 28,0853&lt;br /&gt;
| 27,8872&lt;br /&gt;
| 31,2415&lt;br /&gt;
|-&lt;br /&gt;
! 35 000&lt;br /&gt;
| 71,3969&lt;br /&gt;
| 37,4811&lt;br /&gt;
| 30,2274&lt;br /&gt;
| 34,0041&lt;br /&gt;
| 38,1028&lt;br /&gt;
| 38,4912&lt;br /&gt;
| 38,0174&lt;br /&gt;
| 37,1407&lt;br /&gt;
| 40,4463&lt;br /&gt;
|-&lt;br /&gt;
! 40 000&lt;br /&gt;
| 100,326&lt;br /&gt;
| 47,4248&lt;br /&gt;
| 40,2295&lt;br /&gt;
| 44,0332&lt;br /&gt;
| 50,0015&lt;br /&gt;
| 52,9428&lt;br /&gt;
| 46,2961&lt;br /&gt;
| 51,4372&lt;br /&gt;
| 49,7504&lt;br /&gt;
|-&lt;br /&gt;
! 45 000&lt;br /&gt;
| 142,93&lt;br /&gt;
| 66,4829&lt;br /&gt;
| 52,1382&lt;br /&gt;
| 55,4683&lt;br /&gt;
| 62,3042&lt;br /&gt;
| 65,0885&lt;br /&gt;
| 60,0512&lt;br /&gt;
| 57,8891&lt;br /&gt;
| 64,3764&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ниже приведен график зависимости времени выполнения программы от числа процессоров и размера исходной матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:Lanzcos.png|600px|thumb|center|Рисунок 2. Время работы программы в зависимости от количества процессоров и размера матрицы.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Procs&amp;lt;/math&amp;gt; —  количество процессоров, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Size&amp;lt;/math&amp;gt; — размерность матрицы &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Time&amp;lt;/math&amp;gt; — время работы алгоритма в сек. &amp;lt;br/&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша для точной арифметики без переортогонализации на практике используется гораздо реже, чем алгоритм Ланцоша с частичной или полной ортогонализацией, но, тем не менее, существует множество реализаций данного алгоритма, как последовательных, так и параллельных. Ниже перечислены наиболее известные и обозреваемые в литературе &amp;lt;ref&amp;gt;Hernandez V. et al. A survey of software for sparse eigenvalue problems //Universidad Politecnica de Valencia, Valencia, Spain, SLEPc Technical Report STR-6, – 2009.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Hernandez V. et al. Lanczos methods in SLEPc //Universidad Politécnica de Valencia, Valencia, Spain, SLEPc Technical Report STR-5. – 2006. – С. 136.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;http://www.grycap.upv.es/slepc&amp;lt;/ref&amp;gt; проекты на базе данного алгоритма. &lt;br /&gt;
&lt;br /&gt;
* UNDERWOOD (1977) &amp;lt;ref&amp;gt;Golub, G. H. and R. Underwood.  The Block Lanczos Method for Computing Eigenvalues.  In Mathematical Software III (edited by J. Rice), pp. 364{377. Academic Press, New York, NY, USA&amp;lt;/ref&amp;gt;. Без переортогонализации и с частичной реортогонализацией. Язык Fortran 77.&lt;br /&gt;
* PROPACK (1998) &amp;lt;ref&amp;gt;http://www.daimi.au.dk/PB/537&amp;lt;/ref&amp;gt;. Частичная реортогонализация. Язык Fortran 77, Matlab. Присутствует реализация с распараллеливанием на базе OpenMP.&lt;br /&gt;
* BLKLAN (2004) &amp;lt;ref&amp;gt;Liu, G., W. Xu, and S. Qiao. Block Lanczos Tridiagonalization of Complex Symmetric Matrices. Technical  Report  CAS-04-07-SQ,  Department  of  Computing  and  Software,  McMaster  University, Hamilton, Ontario, Canada&amp;lt;/ref&amp;gt;. Без реортогонализации, с частичной реортогонализацией. Язык C, Matlab.&lt;br /&gt;
* IETL (2006) &amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/&amp;lt;/ref&amp;gt;. Только без реортогонализации. Язык C++.&lt;br /&gt;
* SLEPc (2009) &amp;lt;ref&amp;gt;Hernandez V., Roman J. E., Vidal V. SLEPc: A scalable and flexible toolkit for the solution of eigenvalue problems //ACM Transactions on Mathematical Software (TOMS).– Т. 31. – №. 3. – С. 351-362.&amp;lt;/ref&amp;gt;. Без реортогонализации, с выборочной реортогонализацией, с частичной реортогонализацией, с полной реортогонализацией. Язык C. Присутствует реализация с распараллеливанием на базе MPI.&lt;br /&gt;
* Lanczos Plus Plus (2009) &amp;lt;ref&amp;gt;https://github.com/g1257/LanczosPlusPlus&amp;lt;/ref&amp;gt;. Пример реализации алгоритма Ланцоша в применении к задаче расчета взаимодействия сильно кореллированных электронов. С частичной переортогонализацией, с полной переортогонализацией. Язык C++.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Shostix</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:Shostix/%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=22445</id>
		<title>Участник:Shostix/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:Shostix/%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=22445"/>
		<updated>2017-02-08T03:08:21Z</updated>

		<summary type="html">&lt;p&gt;Shostix: &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;
| 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;kn+k&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;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Авторы&#039;&#039;&#039;: А.В. Шостик.&lt;br /&gt;
&lt;br /&gt;
==Свойства и структура алгоритма==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - один из итерационных методов вычисления собственных значений и собственных векторов симметричных матриц (задача &amp;lt;math&amp;gt;Ax = \lambda x&amp;lt;/math&amp;gt;). Используется для работы с матрицами столь большими, что классические численные методы нахождения собственных значений неприменимы из-за высокой вычислительной сложности. На практике чаще всего используется для работы с большими разреженными матрицами.&lt;br /&gt;
&lt;br /&gt;
Алгоритм был предложен в 1950 году венгерским физиком и математиком Корнелием Ланцошем. Основан на понятии построения крыловского подпространства и процедуре Рэлея-Ритца: строит последовательность трехдиагональных матриц с тем свойством, что экстремальные собственные значения для каждой последующей трехдиагональной матрицы дают все более точные оценки экстремальных собственных значений для А. &lt;br /&gt;
&lt;br /&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;
&#039;&#039;Исходные данные&#039;&#039;:&lt;br /&gt;
 &lt;br /&gt;
*   симметрическая матрица &amp;lt;math&amp;gt;A=A^T&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, элементы матрицы &amp;lt;math&amp;gt;a_{ij}=a_{ji}&amp;lt;/math&amp;gt;&lt;br /&gt;
*   начальный вектор &amp;lt;math&amp;gt;v = {v_1, v_2, ..., v_n}, v \neq \theta&amp;lt;/math&amp;gt; &lt;br /&gt;
Так как матрица является симметрической, достаточно хранить &amp;lt;math&amp;gt;\frac{n(n+1)}{2}&amp;lt;/math&amp;gt; ее элементов.&lt;br /&gt;
&lt;br /&gt;
Для исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; строится крыловское подпространство. Крыловское подпространство - это линейная оболочка векторов &amp;lt;math&amp;gt;[v, Av, A^2v, ..., A^{k-1}v]&amp;lt;/math&amp;gt;, называемых векторами Ланцоша.&lt;br /&gt;
Каждый из векторов Ланцоша ортонормируется: &amp;lt;math&amp;gt;q_k=\frac{A^kv}{\|A^kv\|}&amp;lt;/math&amp;gt;, и на шаге &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; алгоритма имеется Крыловская матрица &amp;lt;math&amp;gt;Q = {q_0, ..., q_{k-1}}&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&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;k&amp;lt;/math&amp;gt;-ым приближением собственного вектора исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
В качестве приближенных собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; берутся собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt; (числа Ритца). В качестве алгоритма нахождения собственных векторов и собственных значений симметрической трехдиагональной матрицы будем использовать метод &amp;quot;разделяй и властвуй&amp;quot;, который требует &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций.&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Выходные данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* совокупность собственных векторов матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; (т.е. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-ых приближений собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;)&lt;br /&gt;
* совокупность собственных значений матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; (т.е. &amp;lt;math&amp;gt;k&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;
&#039;&#039;&#039;Вычислительное ядро&#039;&#039;&#039;. т.е. часть алгоритма, требующая наибольших вычислительных затрат на каждой итерации состоит из вычисления промежуточного вектора &amp;lt;math&amp;gt;z=Aq_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&#039;&#039;&#039; Итерация алгоритма: &#039;&#039;&#039;&lt;br /&gt;
* вычисление нормы вектора,&lt;br /&gt;
* деление вектора на число,&lt;br /&gt;
* умножение матрицы на вектор,&lt;br /&gt;
* линейная комбинация векторов (умножение на число и сложение).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Финальный расчет: &#039;&#039;&#039;&lt;br /&gt;
* вычисление собственных векторов и собственных значений трехдиагональной симметричной матрицы.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Псевдокод алгоритма&#039;&#039;&amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Вход&#039;&#039;&#039;  : размерность матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, элементы симметричной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, количество итераций &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
 &#039;&#039;&#039;Выход&#039;&#039;&#039; : собственные вектора матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, матрица собственных значений &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
q_1 = &amp;amp; b/ \|b\|_2,\; &lt;br /&gt;
\beta_0 = 0,\; &lt;br /&gt;
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 \\ &lt;br /&gt;
&amp;amp; \; \; \; \; exit\\&lt;br /&gt;
&amp;amp; else \\&lt;br /&gt;
&amp;amp; \; \; \; \; q_{i+1} = 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;
&amp;lt;math&amp;gt;procedure(T_k)&amp;lt;/math&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt;procedure()&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; итераций и финального расчета собственных векторов и собственных значений.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим сложность каждой макрооперации алгоритма:&lt;br /&gt;
* вычисление нормы вектора - &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений, операция извлечения корня&lt;br /&gt;
* деление вектора на число - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций&lt;br /&gt;
* умножение матрицы на вектор - &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций&lt;br /&gt;
* скалярное произведение векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций&lt;br /&gt;
* линейная комбинация векторов - &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений и вычитаний&lt;br /&gt;
* вычисление собственных векторов и собственных значений матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; методом &amp;quot;Разделяй и властвуй&amp;quot;  - &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Инициализация:&#039;&#039;&#039; &lt;br /&gt;
* вычисление нормы вектора,&lt;br /&gt;
* деление вектора на число.&lt;br /&gt;
&#039;&#039;&#039;Одна итерация:&#039;&#039;&#039; &lt;br /&gt;
* умножение матрицы на вектор,&lt;br /&gt;
* скалярное произведение векторов,&lt;br /&gt;
* линейная комбинация векторов,&lt;br /&gt;
* вычисление нормы вектора,&lt;br /&gt;
* деление вектора на число.&lt;br /&gt;
&#039;&#039;&#039;Финальный расчет:&#039;&#039;&#039;&lt;br /&gt;
* вычисление собственных векторов и собственных значений матрицы&lt;br /&gt;
&lt;br /&gt;
Итого &#039;&#039;&#039;последовательная сложность алгоритма&#039;&#039;&#039; составляет &amp;lt;math&amp;gt;O(3n+k(n^2+n+2n+2n+3n))+O(k^3)&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;k&amp;lt;/math&amp;gt;, сложность алгоритма Ланцоша можно рассматривать &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма с входными и выходными данными можно описать в виде рисунка:&lt;br /&gt;
&lt;br /&gt;
[[File:Ланцош.png|600px|thumb|center|Рисунок 1. Информационный граф алгоритма Ланцоша.&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; — операция деления, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;A&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;L&amp;lt;/math&amp;gt; — операция вычисления линейной комбинации векторов, &amp;lt;br/&amp;gt;&lt;br /&gt;
▽ - проверка условия &amp;lt;math&amp;gt;\mathsf{(\beta_i = 0)}&amp;lt;/math&amp;gt; и выход из цикла в случае выполнения условия]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Внутри каждой итерации алгоритма можно задействовать параллельные вычисления для суммирования векторов (использовать суммирование методом сдваивания элементов). Эта операция будет использована в макрооперации умножения матрицы на вектор, которая требует в последовательной реализации &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сложение. В таком виде сложение &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; элементов можно выполнить за &amp;lt;math&amp;gt;\log_2 n&amp;lt;/math&amp;gt; действий.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Входные данные&#039;&#039;: симметрическая матрица &amp;lt;math&amp;gt;A=A^T&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;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Объем входных данных&#039;&#039;: &amp;lt;math&amp;gt;\frac{n(n+1)}{2} + 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Выходные данные&#039;&#039;: &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;
&#039;&#039;Объем выходных данных&#039;&#039;: &amp;lt;math&amp;gt;kn+k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Сложность последовательной реализации алгоритма &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;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;
** В умножении матрицы на вектор сложение n элементов выполняется в &amp;lt;math&amp;gt;\log_2 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;
* Отношение последовательной сложности  к параллельной &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Вычислительная мощность алгоритма Ланцоша из последовательной сложности алгоритма &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+2k}&amp;lt;/math&amp;gt;. Учитывая &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; много меньше  &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, вычислительная мощность ≈ &amp;lt;math&amp;gt; 2k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* В алгоритме Ланцоша возможно выполнение числа итераций менее &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; если все собственные значения матрицы вычисляются раньше.&lt;br /&gt;
* Для найденных собственных значений справедливо: &amp;lt;math&amp;gt;\lambda_i(T_{k+1})\geq \lambda_i(T_{k})\geq \lambda_{i+1}(T_{k+1})\geq \lambda_{i+1}(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;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;[http://parallel.ru/cluster/].&lt;br /&gt;
&lt;br /&gt;
Исследовалась реализация&amp;lt;ref&amp;gt;http://pastebin.com/3W4uUVGj&amp;lt;/ref&amp;gt; на языке C++ с использованием MPI.  Компилятор GCC 5.2.1; версия MPI 1.8.4;&lt;br /&gt;
&lt;br /&gt;
Для компиляции и запуска использовались следующие команды:&lt;br /&gt;
&amp;lt;pre&amp;gt;$ mpic++ -std=c++0x -O2 &amp;lt;CPP_FILE&amp;gt; -lm -static-libstdc++ -o &amp;lt;EXE_FILE&amp;gt;&lt;br /&gt;
$ mpirun -np &amp;lt;N_PROCESSORS&amp;gt; &amp;lt;EXE_FILE&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Число процессоров: 2, 4, 8, 16, 32, 64, 128.&lt;br /&gt;
* Размерность матрицы &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; от 5 000 до  50 000, шаг 5 000.&lt;br /&gt;
* Количество итераций алгоритма Ланцоша для всех экспериментов 200.&lt;br /&gt;
&lt;br /&gt;
Ниже приведена зависимость времени выполнения программы от числа процессоров и размера исходной матрицы.&lt;br /&gt;
&lt;br /&gt;
[[|600px|thumb|center|Рисунок 2. Эффективность параллельной реализации алгоритма Ланцоша.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Size&amp;lt;/math&amp;gt; — размерность матрицы &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Cores&amp;lt;/math&amp;gt; — количество процессоров, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Eff&amp;lt;/math&amp;gt; — эффективность алгоритма в %. &amp;lt;br/&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выводы&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша для точной арифметики без переортогонализации на практике используется гораздо реже, чем алгоритм Ланцоша с частичной или полной ортогонализацией, но, тем не менее, существует множество реализаций данного алгоритма, как последовательных, так и параллельных. Ниже перечислены наиболее известные и обозреваемые в литературе &amp;lt;ref&amp;gt;Hernandez V. et al. A survey of software for sparse eigenvalue problems //Universidad Politecnica de Valencia, Valencia, Spain, SLEPc Technical Report STR-6, – 2009.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Hernandez V. et al. Lanczos methods in SLEPc //Universidad Politécnica de Valencia, Valencia, Spain, SLEPc Technical Report STR-5. – 2006. – С. 136.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;http://www.grycap.upv.es/slepc&amp;lt;/ref&amp;gt; проекты на базе данного алгоритма. &lt;br /&gt;
&lt;br /&gt;
* UNDERWOOD (1977) &amp;lt;ref&amp;gt;Golub, G. H. and R. Underwood.  The Block Lanczos Method for Computing Eigenvalues.  In Mathematical Software III (edited by J. Rice), pp. 364{377. Academic Press, New York, NY, USA&amp;lt;/ref&amp;gt;. Без переортогонализации и с частичной реортогонализацией. Язык Fortran 77.&lt;br /&gt;
* PROPACK (1998) &amp;lt;ref&amp;gt;http://www.daimi.au.dk/PB/537&amp;lt;/ref&amp;gt;. Частичная реортогонализация. Язык Fortran 77, Matlab. Присутствует реализация с распараллеливанием на базе OpenMP.&lt;br /&gt;
* BLKLAN (2004) &amp;lt;ref&amp;gt;Liu, G., W. Xu, and S. Qiao. Block Lanczos Tridiagonalization of Complex Symmetric Matrices. Technical  Report  CAS-04-07-SQ,  Department  of  Computing  and  Software,  McMaster  University, Hamilton, Ontario, Canada&amp;lt;/ref&amp;gt;. Без реортогонализации, с частичной реортогонализацией. Язык C, Matlab.&lt;br /&gt;
* IETL (2006) &amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/&amp;lt;/ref&amp;gt;. Только без реортогонализации. Язык C++.&lt;br /&gt;
* SLEPc (2009) &amp;lt;ref&amp;gt;Hernandez V., Roman J. E., Vidal V. SLEPc: A scalable and flexible toolkit for the solution of eigenvalue problems //ACM Transactions on Mathematical Software (TOMS).– Т. 31. – №. 3. – С. 351-362.&amp;lt;/ref&amp;gt;. Без реортогонализации, с выборочной реортогонализацией, с частичной реортогонализацией, с полной реортогонализацией. Язык C. Присутствует реализация с распараллеливанием на базе MPI.&lt;br /&gt;
* Lanczos Plus Plus (2009) &amp;lt;ref&amp;gt;https://github.com/g1257/LanczosPlusPlus&amp;lt;/ref&amp;gt;. Пример реализации алгоритма Ланцоша в применении к задаче расчета взаимодействия сильно кореллированных электронов. С частичной переортогонализацией, с полной переортогонализацией. Язык C++.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Shostix</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:Shostix/%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=22444</id>
		<title>Участник:Shostix/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:Shostix/%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=22444"/>
		<updated>2017-02-08T03:04:23Z</updated>

		<summary type="html">&lt;p&gt;Shostix: /* Масштабируемость алгоритма и его реализации */&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;
| 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;kn+k&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;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Авторы&#039;&#039;&#039;: А.В. Шостик.&lt;br /&gt;
&lt;br /&gt;
==Свойства и структура алгоритма==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - один из итерационных методов вычисления собственных значений и собственных векторов симметричных матриц (задача &amp;lt;math&amp;gt;Ax = \lambda x&amp;lt;/math&amp;gt;). Используется для работы с матрицами столь большими, что классические численные методы нахождения собственных значений неприменимы из-за высокой вычислительной сложности. На практике чаще всего используется для работы с большими разреженными матрицами.&lt;br /&gt;
&lt;br /&gt;
Алгоритм был предложен в 1950 году венгерским физиком и математиком Корнелием Ланцошем. Основан на понятии построения крыловского подпространства и процедуре Рэлея-Ритца: строит последовательность трехдиагональных матриц с тем свойством, что экстремальные собственные значения для каждой последующей трехдиагональной матрицы дают все более точные оценки экстремальных собственных значений для А. &lt;br /&gt;
&lt;br /&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;
&#039;&#039;Исходные данные&#039;&#039;:&lt;br /&gt;
 &lt;br /&gt;
*   симметрическая матрица &amp;lt;math&amp;gt;A=A^T&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, элементы матрицы &amp;lt;math&amp;gt;a_{ij}=a_{ji}&amp;lt;/math&amp;gt;&lt;br /&gt;
*   начальный вектор &amp;lt;math&amp;gt;v = {v_1, v_2, ..., v_n}, v \neq \theta&amp;lt;/math&amp;gt; &lt;br /&gt;
Так как матрица является симметрической, достаточно хранить &amp;lt;math&amp;gt;\frac{n(n+1)}{2}&amp;lt;/math&amp;gt; ее элементов.&lt;br /&gt;
&lt;br /&gt;
Для исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; строится крыловское подпространство. Крыловское подпространство - это линейная оболочка векторов &amp;lt;math&amp;gt;[v, Av, A^2v, ..., A^{k-1}v]&amp;lt;/math&amp;gt;, называемых векторами Ланцоша.&lt;br /&gt;
Каждый из векторов Ланцоша ортонормируется: &amp;lt;math&amp;gt;q_k=\frac{A^kv}{\|A^kv\|}&amp;lt;/math&amp;gt;, и на шаге &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; алгоритма имеется Крыловская матрица &amp;lt;math&amp;gt;Q = {q_0, ..., q_{k-1}}&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&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;k&amp;lt;/math&amp;gt;-ым приближением собственного вектора исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
В качестве приближенных собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; берутся собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt; (числа Ритца). В качестве алгоритма нахождения собственных векторов и собственных значений симметрической трехдиагональной матрицы будем использовать метод &amp;quot;разделяй и властвуй&amp;quot;, который требует &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций.&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Выходные данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* совокупность собственных векторов матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; (т.е. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-ых приближений собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;)&lt;br /&gt;
* совокупность собственных значений матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; (т.е. &amp;lt;math&amp;gt;k&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;
&#039;&#039;&#039;Вычислительное ядро&#039;&#039;&#039;. т.е. часть алгоритма, требующая наибольших вычислительных затрат на каждой итерации состоит из вычисления промежуточного вектора &amp;lt;math&amp;gt;z=Aq_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&#039;&#039;&#039; Итерация алгоритма: &#039;&#039;&#039;&lt;br /&gt;
* вычисление нормы вектора,&lt;br /&gt;
* деление вектора на число,&lt;br /&gt;
* умножение матрицы на вектор,&lt;br /&gt;
* линейная комбинация векторов (умножение на число и сложение).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Финальный расчет: &#039;&#039;&#039;&lt;br /&gt;
* вычисление собственных векторов и собственных значений трехдиагональной симметричной матрицы.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Псевдокод алгоритма&#039;&#039;&amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Вход&#039;&#039;&#039;  : размерность матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, элементы симметричной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, количество итераций &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
 &#039;&#039;&#039;Выход&#039;&#039;&#039; : собственные вектора матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, матрица собственных значений &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
q_1 = &amp;amp; b/ \|b\|_2,\; &lt;br /&gt;
\beta_0 = 0,\; &lt;br /&gt;
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 \\ &lt;br /&gt;
&amp;amp; \; \; \; \; exit\\&lt;br /&gt;
&amp;amp; else \\&lt;br /&gt;
&amp;amp; \; \; \; \; q_{i+1} = 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;
&amp;lt;math&amp;gt;procedure(T_k)&amp;lt;/math&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt;procedure()&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; итераций и финального расчета собственных векторов и собственных значений.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим сложность каждой макрооперации алгоритма:&lt;br /&gt;
* вычисление нормы вектора - &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений, операция извлечения корня&lt;br /&gt;
* деление вектора на число - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций&lt;br /&gt;
* умножение матрицы на вектор - &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций&lt;br /&gt;
* скалярное произведение векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций&lt;br /&gt;
* линейная комбинация векторов - &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений и вычитаний&lt;br /&gt;
* вычисление собственных векторов и собственных значений матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; методом &amp;quot;Разделяй и властвуй&amp;quot;  - &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Инициализация:&#039;&#039;&#039; &lt;br /&gt;
* вычисление нормы вектора,&lt;br /&gt;
* деление вектора на число.&lt;br /&gt;
&#039;&#039;&#039;Одна итерация:&#039;&#039;&#039; &lt;br /&gt;
* умножение матрицы на вектор,&lt;br /&gt;
* скалярное произведение векторов,&lt;br /&gt;
* линейная комбинация векторов,&lt;br /&gt;
* вычисление нормы вектора,&lt;br /&gt;
* деление вектора на число.&lt;br /&gt;
&#039;&#039;&#039;Финальный расчет:&#039;&#039;&#039;&lt;br /&gt;
* вычисление собственных векторов и собственных значений матрицы&lt;br /&gt;
&lt;br /&gt;
Итого &#039;&#039;&#039;последовательная сложность алгоритма&#039;&#039;&#039; составляет &amp;lt;math&amp;gt;O(3n+k(n^2+n+2n+2n+3n))+O(k^3)&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;k&amp;lt;/math&amp;gt;, сложность алгоритма Ланцоша можно рассматривать &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма с входными и выходными данными можно описать в виде рисунка:&lt;br /&gt;
&lt;br /&gt;
[[File:Ланцош.png|600px|thumb|center|Рисунок 1. Информационный граф алгоритма Ланцоша.&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; — операция деления, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;A&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;L&amp;lt;/math&amp;gt; — операция вычисления линейной комбинации векторов, &amp;lt;br/&amp;gt;&lt;br /&gt;
▽ - проверка условия &amp;lt;math&amp;gt;\mathsf{(\beta_i = 0)}&amp;lt;/math&amp;gt; и выход из цикла в случае выполнения условия]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Внутри каждой итерации алгоритма можно задействовать параллельные вычисления для суммирования векторов (использовать суммирование методом сдваивания элементов). Эта операция будет использована в макрооперации умножения матрицы на вектор, которая требует в последовательной реализации &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сложение. В таком виде сложение &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; элементов можно выполнить за &amp;lt;math&amp;gt;\log_2 n&amp;lt;/math&amp;gt; действий.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Входные данные&#039;&#039;: симметрическая матрица &amp;lt;math&amp;gt;A=A^T&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;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Объем входных данных&#039;&#039;: &amp;lt;math&amp;gt;\frac{n(n+1)}{2} + 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Выходные данные&#039;&#039;: &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;
&#039;&#039;Объем выходных данных&#039;&#039;: &amp;lt;math&amp;gt;kn+k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Сложность последовательной реализации алгоритма &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;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;
** В умножении матрицы на вектор сложение n элементов выполняется в &amp;lt;math&amp;gt;\log_2 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;
* Отношение последовательной сложности  к параллельной &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Вычислительная мощность алгоритма Ланцоша из последовательной сложности алгоритма &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+2k}&amp;lt;/math&amp;gt;. Учитывая &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; много меньше  &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, вычислительная мощность ≈ &amp;lt;math&amp;gt; 2k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* В алгоритме Ланцоша возможно выполнение числа итераций менее &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; если все собственные значения матрицы вычисляются раньше.&lt;br /&gt;
* Для найденных собственных значений справедливо: &amp;lt;math&amp;gt;\lambda_i(T_{k+1})\geq \lambda_i(T_{k})\geq \lambda_{i+1}(T_{k+1})\geq \lambda_{i+1}(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;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;[http://parallel.ru/cluster/].&lt;br /&gt;
&lt;br /&gt;
Исследовалась реализация&amp;lt;ref&amp;gt;http://pastebin.com/3W4uUVGj&amp;lt;/ref&amp;gt; на языке C++ с использованием MPI.  Компилятор GCC 5.2.1; версия MPI 1.8.4;&lt;br /&gt;
&lt;br /&gt;
Для компиляции и запуска использовались следующие команды:&lt;br /&gt;
&amp;lt;pre&amp;gt;$ mpic++ -std=c++0x -O2 &amp;lt;CPP_FILE&amp;gt; -lm -static-libstdc++ -o &amp;lt;EXE_FILE&amp;gt;&lt;br /&gt;
$ mpirun -np &amp;lt;N_PROCESSORS&amp;gt; &amp;lt;EXE_FILE&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Число процессоров: 2, 4, 8, 16, 32, 64, 128.&lt;br /&gt;
* Размерность матрицы &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; от 5 000 до  50 000, шаг 5 000.&lt;br /&gt;
* Количество итераций алгоритма Ланцоша для всех экспериментов 200.&lt;br /&gt;
&lt;br /&gt;
Ниже приведена зависимость времени выполнения программы от числа процессоров и размера исходной матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:Lanczos Without Orthogonalization Eff2.png|600px|thumb|center|Рисунок 2. Эффективность параллельной реализации алгоритма Ланцоша.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Size&amp;lt;/math&amp;gt; — размерность матрицы &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Cores&amp;lt;/math&amp;gt; — количество процессоров, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Eff&amp;lt;/math&amp;gt; — эффективность алгоритма в %. &amp;lt;br/&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выводы&#039;&#039;&#039;:&lt;br /&gt;
* минимальная эффективность алгоритма при указанных параметрах составила 1.9% (при числе процессоров 32, размерности матрицы 5 000),&lt;br /&gt;
* максимальная эффективность алгоритма при указанных параметрах составила 59.5% (при числе процессоров 256, размерности матрицы 200 000),&lt;br /&gt;
* средняя эффективность алгоритма при числе процессоров от 32 до 256 и размерности матрицы от 25 000 до 200 000 составила 52,7%,&lt;br /&gt;
* при размерности матрицы менее 25 000 эффективность алгоритма менее 23%.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша для точной арифметики без переортогонализации на практике используется гораздо реже, чем алгоритм Ланцоша с частичной или полной ортогонализацией, но, тем не менее, существует множество реализаций данного алгоритма, как последовательных, так и параллельных. Ниже перечислены наиболее известные и обозреваемые в литературе &amp;lt;ref&amp;gt;Hernandez V. et al. A survey of software for sparse eigenvalue problems //Universidad Politecnica de Valencia, Valencia, Spain, SLEPc Technical Report STR-6, – 2009.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Hernandez V. et al. Lanczos methods in SLEPc //Universidad Politécnica de Valencia, Valencia, Spain, SLEPc Technical Report STR-5. – 2006. – С. 136.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;http://www.grycap.upv.es/slepc&amp;lt;/ref&amp;gt; проекты на базе данного алгоритма. &lt;br /&gt;
&lt;br /&gt;
* UNDERWOOD (1977) &amp;lt;ref&amp;gt;Golub, G. H. and R. Underwood.  The Block Lanczos Method for Computing Eigenvalues.  In Mathematical Software III (edited by J. Rice), pp. 364{377. Academic Press, New York, NY, USA&amp;lt;/ref&amp;gt;. Без переортогонализации и с частичной реортогонализацией. Язык Fortran 77.&lt;br /&gt;
* PROPACK (1998) &amp;lt;ref&amp;gt;http://www.daimi.au.dk/PB/537&amp;lt;/ref&amp;gt;. Частичная реортогонализация. Язык Fortran 77, Matlab. Присутствует реализация с распараллеливанием на базе OpenMP.&lt;br /&gt;
* BLKLAN (2004) &amp;lt;ref&amp;gt;Liu, G., W. Xu, and S. Qiao. Block Lanczos Tridiagonalization of Complex Symmetric Matrices. Technical  Report  CAS-04-07-SQ,  Department  of  Computing  and  Software,  McMaster  University, Hamilton, Ontario, Canada&amp;lt;/ref&amp;gt;. Без реортогонализации, с частичной реортогонализацией. Язык C, Matlab.&lt;br /&gt;
* IETL (2006) &amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/&amp;lt;/ref&amp;gt;. Только без реортогонализации. Язык C++.&lt;br /&gt;
* SLEPc (2009) &amp;lt;ref&amp;gt;Hernandez V., Roman J. E., Vidal V. SLEPc: A scalable and flexible toolkit for the solution of eigenvalue problems //ACM Transactions on Mathematical Software (TOMS).– Т. 31. – №. 3. – С. 351-362.&amp;lt;/ref&amp;gt;. Без реортогонализации, с выборочной реортогонализацией, с частичной реортогонализацией, с полной реортогонализацией. Язык C. Присутствует реализация с распараллеливанием на базе MPI.&lt;br /&gt;
* Lanczos Plus Plus (2009) &amp;lt;ref&amp;gt;https://github.com/g1257/LanczosPlusPlus&amp;lt;/ref&amp;gt;. Пример реализации алгоритма Ланцоша в применении к задаче расчета взаимодействия сильно кореллированных электронов. С частичной переортогонализацией, с полной переортогонализацией. Язык C++.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Shostix</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:Shostix/%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=22047</id>
		<title>Участник:Shostix/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:Shostix/%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=22047"/>
		<updated>2017-02-02T21:05:44Z</updated>

		<summary type="html">&lt;p&gt;Shostix: &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;
| 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;kn+k&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;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Авторы&#039;&#039;&#039;: А.В. Шостик.&lt;br /&gt;
&lt;br /&gt;
==Свойства и структура алгоритма==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - один из итерационных методов вычисления собственных значений и собственных векторов симметричных матриц (задача &amp;lt;math&amp;gt;Ax = \lambda x&amp;lt;/math&amp;gt;). Используется для работы с матрицами столь большими, что классические численные методы нахождения собственных значений неприменимы из-за высокой вычислительной сложности. На практике чаще всего используется для работы с большими разреженными матрицами.&lt;br /&gt;
&lt;br /&gt;
Алгоритм был предложен в 1950 году венгерским физиком и математиком Корнелием Ланцошем. Основан на понятии построения крыловского подпространства и процедуре Рэлея-Ритца: строит последовательность трехдиагональных матриц с тем свойством, что экстремальные собственные значения для каждой последующей трехдиагональной матрицы дают все более точные оценки экстремальных собственных значений для А. &lt;br /&gt;
&lt;br /&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;
&#039;&#039;Исходные данные&#039;&#039;:&lt;br /&gt;
 &lt;br /&gt;
*   симметрическая матрица &amp;lt;math&amp;gt;A=A^T&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, элементы матрицы &amp;lt;math&amp;gt;a_{ij}=a_{ji}&amp;lt;/math&amp;gt;&lt;br /&gt;
*   начальный вектор &amp;lt;math&amp;gt;v = {v_1, v_2, ..., v_n}, v \neq \theta&amp;lt;/math&amp;gt; &lt;br /&gt;
Так как матрица является симметрической, достаточно хранить &amp;lt;math&amp;gt;\frac{n(n+1)}{2}&amp;lt;/math&amp;gt; ее элементов.&lt;br /&gt;
&lt;br /&gt;
Для исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; строится крыловское подпространство. Крыловское подпространство - это линейная оболочка векторов &amp;lt;math&amp;gt;[v, Av, A^2v, ..., A^{k-1}v]&amp;lt;/math&amp;gt;, называемых векторами Ланцоша.&lt;br /&gt;
Каждый из векторов Ланцоша ортонормируется: &amp;lt;math&amp;gt;q_k=\frac{A^kv}{\|A^kv\|}&amp;lt;/math&amp;gt;, и на шаге &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; алгоритма имеется Крыловская матрица &amp;lt;math&amp;gt;Q = {q_0, ..., q_{k-1}}&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&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;k&amp;lt;/math&amp;gt;-ым приближением собственного вектора исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
В качестве приближенных собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; берутся собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt; (числа Ритца). В качестве алгоритма нахождения собственных векторов и собственных значений симметрической трехдиагональной матрицы будем использовать метод &amp;quot;разделяй и властвуй&amp;quot;, который требует &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций.&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Выходные данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* совокупность собственных векторов матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; (т.е. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-ых приближений собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;)&lt;br /&gt;
* совокупность собственных значений матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; (т.е. &amp;lt;math&amp;gt;k&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;
&#039;&#039;&#039;Вычислительное ядро&#039;&#039;&#039;. т.е. часть алгоритма, требующая наибольших вычислительных затрат на каждой итерации состоит из вычисления промежуточного вектора &amp;lt;math&amp;gt;z=Aq_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&#039;&#039;&#039; Итерация алгоритма: &#039;&#039;&#039;&lt;br /&gt;
* вычисление нормы вектора,&lt;br /&gt;
* деление вектора на число,&lt;br /&gt;
* умножение матрицы на вектор,&lt;br /&gt;
* линейная комбинация векторов (умножение на число и сложение).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Финальный расчет: &#039;&#039;&#039;&lt;br /&gt;
* вычисление собственных векторов и собственных значений трехдиагональной симметричной матрицы.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Псевдокод алгоритма&#039;&#039;&amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Вход&#039;&#039;&#039;  : размерность матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, элементы симметричной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, количество итераций &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
 &#039;&#039;&#039;Выход&#039;&#039;&#039; : собственные вектора матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, матрица собственных значений &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
q_1 = &amp;amp; b/ \|b\|_2,\; &lt;br /&gt;
\beta_0 = 0,\; &lt;br /&gt;
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 \\ &lt;br /&gt;
&amp;amp; \; \; \; \; exit\\&lt;br /&gt;
&amp;amp; else \\&lt;br /&gt;
&amp;amp; \; \; \; \; q_{i+1} = 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;
&amp;lt;math&amp;gt;procedure(T_k)&amp;lt;/math&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt;procedure()&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; итераций и финального расчета собственных векторов и собственных значений.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим сложность каждой макрооперации алгоритма:&lt;br /&gt;
* вычисление нормы вектора - &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений, операция извлечения корня&lt;br /&gt;
* деление вектора на число - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций&lt;br /&gt;
* умножение матрицы на вектор - &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций&lt;br /&gt;
* скалярное произведение векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций&lt;br /&gt;
* линейная комбинация векторов - &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений и вычитаний&lt;br /&gt;
* вычисление собственных векторов и собственных значений матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; методом &amp;quot;Разделяй и властвуй&amp;quot;  - &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Инициализация:&#039;&#039;&#039; &lt;br /&gt;
* вычисление нормы вектора,&lt;br /&gt;
* деление вектора на число.&lt;br /&gt;
&#039;&#039;&#039;Одна итерация:&#039;&#039;&#039; &lt;br /&gt;
* умножение матрицы на вектор,&lt;br /&gt;
* скалярное произведение векторов,&lt;br /&gt;
* линейная комбинация векторов,&lt;br /&gt;
* вычисление нормы вектора,&lt;br /&gt;
* деление вектора на число.&lt;br /&gt;
&#039;&#039;&#039;Финальный расчет:&#039;&#039;&#039;&lt;br /&gt;
* вычисление собственных векторов и собственных значений матрицы&lt;br /&gt;
&lt;br /&gt;
Итого &#039;&#039;&#039;последовательная сложность алгоритма&#039;&#039;&#039; составляет &amp;lt;math&amp;gt;O(3n+k(n^2+n+2n+2n+3n))+O(k^3)&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;k&amp;lt;/math&amp;gt;, сложность алгоритма Ланцоша можно рассматривать &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма с входными и выходными данными можно описать в виде рисунка:&lt;br /&gt;
&lt;br /&gt;
[[File:Ланцош.png|600px|thumb|center|Рисунок 1. Информационный граф алгоритма Ланцоша.&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; — операция деления, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;A&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;L&amp;lt;/math&amp;gt; — операция вычисления линейной комбинации векторов, &amp;lt;br/&amp;gt;&lt;br /&gt;
▽ - проверка условия &amp;lt;math&amp;gt;\mathsf{(\beta_i = 0)}&amp;lt;/math&amp;gt; и выход из цикла в случае выполнения условия]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Внутри каждой итерации алгоритма можно задействовать параллельные вычисления для суммирования векторов (использовать суммирование методом сдваивания элементов). Эта операция будет использована в макрооперации умножения матрицы на вектор, которая требует в последовательной реализации &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сложение. В таком виде сложение &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; элементов можно выполнить за &amp;lt;math&amp;gt;\log_2 n&amp;lt;/math&amp;gt; действий.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Входные данные&#039;&#039;: симметрическая матрица &amp;lt;math&amp;gt;A=A^T&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;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Объем входных данных&#039;&#039;: &amp;lt;math&amp;gt;\frac{n(n+1)}{2} + 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Выходные данные&#039;&#039;: &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;
&#039;&#039;Объем выходных данных&#039;&#039;: &amp;lt;math&amp;gt;kn+k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Сложность последовательной реализации алгоритма &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;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;
** В умножении матрицы на вектор сложение n элементов выполняется в &amp;lt;math&amp;gt;\log_2 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;
* Отношение последовательной сложности  к параллельной &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Вычислительная мощность алгоритма Ланцоша из последовательной сложности алгоритма &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+2k}&amp;lt;/math&amp;gt;. Учитывая &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; много меньше  &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, вычислительная мощность ≈ &amp;lt;math&amp;gt; 2k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* В алгоритме Ланцоша возможно выполнение числа итераций менее &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; если все собственные значения матрицы вычисляются раньше.&lt;br /&gt;
* Для найденных собственных значений справедливо: &amp;lt;math&amp;gt;\lambda_i(T_{k+1})\geq \lambda_i(T_{k})\geq \lambda_{i+1}(T_{k+1})\geq \lambda_{i+1}(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;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;[http://parallel.ru/cluster/].&lt;br /&gt;
&lt;br /&gt;
Исследуемая реализация на языке C [https://algowiki-project.org/ru/%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_%28%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%29#.D0.A1.D1.83.D1.89.D0.B5.D1.81.D1.82.D0.B2.D1.83.D1.8E.D1.89.D0.B8.D0.B5_.D1.80.D0.B5.D0.B0.D0.BB.D0.B8.D0.B7.D0.B0.D1.86.D0.B8.D0.B8] &amp;lt;ref&amp;gt;https://github.com/xrstalker/lanczos&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Компилятор gcc, аргумент -std=c11. Openmpi-1.8.4&lt;br /&gt;
&lt;br /&gt;
* Число процессоров варьировалось от 32 до 256, step = 16.&lt;br /&gt;
* Размер матрицы изменялся от &amp;lt;math&amp;gt;5 000 \times 5 000&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;200 000 \times 200 000&amp;lt;/math&amp;gt;, step = 5 000.&lt;br /&gt;
&lt;br /&gt;
Ниже приведена зависимость эффективности параллельной реализации от указанных выше параметров.&lt;br /&gt;
&lt;br /&gt;
[[File:Lanczos Without Orthogonalization Eff2.png|600px|thumb|center|Рисунок 2. Эффективность параллельной реализации алгоритма Ланцоша.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Size&amp;lt;/math&amp;gt; — размерность матрицы &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Cores&amp;lt;/math&amp;gt; — количество процессоров, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Eff&amp;lt;/math&amp;gt; — эффективность алгоритма в %. &amp;lt;br/&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выводы&#039;&#039;&#039;:&lt;br /&gt;
* минимальная эффективность алгоритма при указанных параметрах составила 1.9% (при числе процессоров 32, размерности матрицы 5 000),&lt;br /&gt;
* максимальная эффективность алгоритма при указанных параметрах составила 59.5% (при числе процессоров 256, размерности матрицы 200 000),&lt;br /&gt;
* средняя эффективность алгоритма при числе процессоров от 32 до 256 и размерности матрицы от 25 000 до 200 000 составила 52,7%,&lt;br /&gt;
* при размерности матрицы менее 25 000 эффективность алгоритма менее 23%.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша для точной арифметики без переортогонализации на практике используется гораздо реже, чем алгоритм Ланцоша с частичной или полной ортогонализацией, но, тем не менее, существует множество реализаций данного алгоритма, как последовательных, так и параллельных. Ниже перечислены наиболее известные и обозреваемые в литературе &amp;lt;ref&amp;gt;Hernandez V. et al. A survey of software for sparse eigenvalue problems //Universidad Politecnica de Valencia, Valencia, Spain, SLEPc Technical Report STR-6, – 2009.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Hernandez V. et al. Lanczos methods in SLEPc //Universidad Politécnica de Valencia, Valencia, Spain, SLEPc Technical Report STR-5. – 2006. – С. 136.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;http://www.grycap.upv.es/slepc&amp;lt;/ref&amp;gt; проекты на базе данного алгоритма. &lt;br /&gt;
&lt;br /&gt;
* UNDERWOOD (1977) &amp;lt;ref&amp;gt;Golub, G. H. and R. Underwood.  The Block Lanczos Method for Computing Eigenvalues.  In Mathematical Software III (edited by J. Rice), pp. 364{377. Academic Press, New York, NY, USA&amp;lt;/ref&amp;gt;. Без переортогонализации и с частичной реортогонализацией. Язык Fortran 77.&lt;br /&gt;
* PROPACK (1998) &amp;lt;ref&amp;gt;http://www.daimi.au.dk/PB/537&amp;lt;/ref&amp;gt;. Частичная реортогонализация. Язык Fortran 77, Matlab. Присутствует реализация с распараллеливанием на базе OpenMP.&lt;br /&gt;
* BLKLAN (2004) &amp;lt;ref&amp;gt;Liu, G., W. Xu, and S. Qiao. Block Lanczos Tridiagonalization of Complex Symmetric Matrices. Technical  Report  CAS-04-07-SQ,  Department  of  Computing  and  Software,  McMaster  University, Hamilton, Ontario, Canada&amp;lt;/ref&amp;gt;. Без реортогонализации, с частичной реортогонализацией. Язык C, Matlab.&lt;br /&gt;
* IETL (2006) &amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/&amp;lt;/ref&amp;gt;. Только без реортогонализации. Язык C++.&lt;br /&gt;
* SLEPc (2009) &amp;lt;ref&amp;gt;Hernandez V., Roman J. E., Vidal V. SLEPc: A scalable and flexible toolkit for the solution of eigenvalue problems //ACM Transactions on Mathematical Software (TOMS).– Т. 31. – №. 3. – С. 351-362.&amp;lt;/ref&amp;gt;. Без реортогонализации, с выборочной реортогонализацией, с частичной реортогонализацией, с полной реортогонализацией. Язык C. Присутствует реализация с распараллеливанием на базе MPI.&lt;br /&gt;
* Lanczos Plus Plus (2009) &amp;lt;ref&amp;gt;https://github.com/g1257/LanczosPlusPlus&amp;lt;/ref&amp;gt;. Пример реализации алгоритма Ланцоша в применении к задаче расчета взаимодействия сильно кореллированных электронов. С частичной переортогонализацией, с полной переортогонализацией. Язык C++.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Shostix</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:Shostix/%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=22046</id>
		<title>Участник:Shostix/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:Shostix/%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=22046"/>
		<updated>2017-02-02T20:54:19Z</updated>

		<summary type="html">&lt;p&gt;Shostix: &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;
| 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;kn+k&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;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Авторы&#039;&#039;&#039;:&lt;br /&gt;
* [[Участник:Shostix|А.В. Шостик]].&lt;br /&gt;
&lt;br /&gt;
==Свойства и структура алгоритма==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - один из итерационных методов вычисления собственных значений и собственных векторов симметричных матриц (задача &amp;lt;math&amp;gt;Ax = \lambda x&amp;lt;/math&amp;gt;). Используется для работы с матрицами столь большими, что классические численные методы нахождения собственных значений неприменимы из-за высокой вычислительной сложности. На практике чаще всего используется для работы с большими разреженными матрицами.&lt;br /&gt;
&lt;br /&gt;
Алгоритм был предложен в 1950 году венгерским физиком и математиком Корнелием Ланцошем. Основан на понятии построения крыловского подпространства и процедуре Рэлея-Ритца: строит последовательность трехдиагональных матриц с тем свойством, что экстремальные собственные значения для каждой последующей трехдиагональной матрицы дают все более точные оценки экстремальных собственных значений для А. &lt;br /&gt;
&lt;br /&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;
&#039;&#039;Исходные данные&#039;&#039;:&lt;br /&gt;
 &lt;br /&gt;
*   симметрическая матрица &amp;lt;math&amp;gt;A=A^T&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, элементы матрицы &amp;lt;math&amp;gt;a_{ij}=a_{ji}&amp;lt;/math&amp;gt;&lt;br /&gt;
*   начальный вектор &amp;lt;math&amp;gt;v = {v_1, v_2, ..., v_n}, v \neq \theta&amp;lt;/math&amp;gt; &lt;br /&gt;
Так как матрица является симметрической, достаточно хранить &amp;lt;math&amp;gt;\frac{n(n+1)}{2}&amp;lt;/math&amp;gt; ее элементов.&lt;br /&gt;
&lt;br /&gt;
Для исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; строится крыловское подпространство. Крыловское подпространство - это линейная оболочка векторов &amp;lt;math&amp;gt;[v, Av, A^2v, ..., A^{k-1}v]&amp;lt;/math&amp;gt;, называемых векторами Ланцоша.&lt;br /&gt;
Каждый из векторов Ланцоша ортонормируется: &amp;lt;math&amp;gt;q_k=\frac{A^kv}{\|A^kv\|}&amp;lt;/math&amp;gt;, и на шаге &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; алгоритма имеется Крыловская матрица &amp;lt;math&amp;gt;Q = {q_0, ..., q_{k-1}}&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&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;k&amp;lt;/math&amp;gt;-ым приближением собственного вектора исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
В качестве приближенных собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; берутся собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt; (числа Ритца). В качестве алгоритма нахождения собственных векторов и собственных значений симметрической трехдиагональной матрицы будем использовать метод &amp;quot;разделяй и властвуй&amp;quot;, который требует &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций.&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Выходные данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* совокупность собственных векторов матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; (т.е. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-ых приближений собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;)&lt;br /&gt;
* совокупность собственных значений матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; (т.е. &amp;lt;math&amp;gt;k&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;
&#039;&#039;&#039;Вычислительное ядро&#039;&#039;&#039;. т.е. часть алгоритма, требующая наибольших вычислительных затрат на каждой итерации состоит из вычисления промежуточного вектора &amp;lt;math&amp;gt;z=Aq_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&#039;&#039;&#039; Итерация алгоритма: &#039;&#039;&#039;&lt;br /&gt;
* вычисление нормы вектора,&lt;br /&gt;
* деление вектора на число,&lt;br /&gt;
* умножение матрицы на вектор,&lt;br /&gt;
* линейная комбинация векторов (умножение на число и сложение).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Финальный расчет: &#039;&#039;&#039;&lt;br /&gt;
* вычисление собственных векторов и собственных значений трехдиагональной симметричной матрицы.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Псевдокод алгоритма&#039;&#039;&amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Вход&#039;&#039;&#039;  : размерность матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, элементы симметричной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, количество итераций &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
 &#039;&#039;&#039;Выход&#039;&#039;&#039; : собственные вектора матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, матрица собственных значений &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
q_1 = &amp;amp; b/ \|b\|_2,\; &lt;br /&gt;
\beta_0 = 0,\; &lt;br /&gt;
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 \\ &lt;br /&gt;
&amp;amp; \; \; \; \; exit\\&lt;br /&gt;
&amp;amp; else \\&lt;br /&gt;
&amp;amp; \; \; \; \; q_{i+1} = 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;
&amp;lt;math&amp;gt;procedure(T_k)&amp;lt;/math&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt;procedure()&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; итераций и финального расчета собственных векторов и собственных значений.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим сложность каждой макрооперации алгоритма:&lt;br /&gt;
* вычисление нормы вектора - &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений, операция извлечения корня&lt;br /&gt;
* деление вектора на число - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций&lt;br /&gt;
* умножение матрицы на вектор - &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций&lt;br /&gt;
* скалярное произведение векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций&lt;br /&gt;
* линейная комбинация векторов - &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений и вычитаний&lt;br /&gt;
* вычисление собственных векторов и собственных значений матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; методом &amp;quot;Разделяй и властвуй&amp;quot;  - &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Инициализация:&#039;&#039;&#039; &lt;br /&gt;
* вычисление нормы вектора,&lt;br /&gt;
* деление вектора на число.&lt;br /&gt;
&#039;&#039;&#039;Одна итерация:&#039;&#039;&#039; &lt;br /&gt;
* умножение матрицы на вектор,&lt;br /&gt;
* скалярное произведение векторов,&lt;br /&gt;
* линейная комбинация векторов,&lt;br /&gt;
* вычисление нормы вектора,&lt;br /&gt;
* деление вектора на число.&lt;br /&gt;
&#039;&#039;&#039;Финальный расчет:&#039;&#039;&#039;&lt;br /&gt;
* вычисление собственных векторов и собственных значений матрицы&lt;br /&gt;
&lt;br /&gt;
Итого &#039;&#039;&#039;последовательная сложность алгоритма&#039;&#039;&#039; составляет &amp;lt;math&amp;gt;O(3n+k(n^2+n+2n+2n+3n))+O(k^3)&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;k&amp;lt;/math&amp;gt;, сложность алгоритма Ланцоша можно рассматривать &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма с входными и выходными данными можно описать в виде рисунка:&lt;br /&gt;
&lt;br /&gt;
[[File:Ланцош.png|600px|thumb|center|Рисунок 1. Информационный граф алгоритма Ланцоша.&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; — операция деления, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;A&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;L&amp;lt;/math&amp;gt; — операция вычисления линейной комбинации векторов, &amp;lt;br/&amp;gt;&lt;br /&gt;
▽ - проверка условия &amp;lt;math&amp;gt;\mathsf{(\beta_i = 0)}&amp;lt;/math&amp;gt; и выход из цикла в случае выполнения условия]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Внутри каждой итерации алгоритма можно задействовать параллельные вычисления для суммирования векторов (использовать суммирование методом сдваивания элементов). Эта операция будет использована в макрооперации умножения матрицы на вектор, которая требует в последовательной реализации &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сложение. В таком виде сложение &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; элементов можно выполнить за &amp;lt;math&amp;gt;\log_2 n&amp;lt;/math&amp;gt; действий.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Входные данные&#039;&#039;: симметрическая матрица &amp;lt;math&amp;gt;A=A^T&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;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Объем входных данных&#039;&#039;: &amp;lt;math&amp;gt;\frac{n(n+1)}{2} + 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Выходные данные&#039;&#039;: &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;
&#039;&#039;Объем выходных данных&#039;&#039;: &amp;lt;math&amp;gt;kn+k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Сложность последовательной реализации алгоритма &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;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;
** В умножении матрицы на вектор сложение n элементов выполняется в &amp;lt;math&amp;gt;\log_2 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;
* Отношение последовательной сложности  к параллельной &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Вычислительная мощность алгоритма Ланцоша из последовательной сложности алгоритма &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+2k}&amp;lt;/math&amp;gt;. Учитывая &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; много меньше  &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, вычислительная мощность ≈ &amp;lt;math&amp;gt; 2k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* В алгоритме Ланцоша возможно выполнение числа итераций менее &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; если все собственные значения матрицы вычисляются раньше.&lt;br /&gt;
* Для найденных собственных значений справедливо: &amp;lt;math&amp;gt;\lambda_i(T_{k+1})\geq \lambda_i(T_{k})\geq \lambda_{i+1}(T_{k+1})\geq \lambda_{i+1}(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;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;[http://parallel.ru/cluster/].&lt;br /&gt;
&lt;br /&gt;
Исследуемая реализация на языке C [https://algowiki-project.org/ru/%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_%28%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%29#.D0.A1.D1.83.D1.89.D0.B5.D1.81.D1.82.D0.B2.D1.83.D1.8E.D1.89.D0.B8.D0.B5_.D1.80.D0.B5.D0.B0.D0.BB.D0.B8.D0.B7.D0.B0.D1.86.D0.B8.D0.B8] &amp;lt;ref&amp;gt;https://github.com/xrstalker/lanczos&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Компилятор gcc, аргумент -std=c11. Openmpi-1.8.4&lt;br /&gt;
&lt;br /&gt;
* Число процессоров варьировалось от 32 до 256, step = 16.&lt;br /&gt;
* Размер матрицы изменялся от &amp;lt;math&amp;gt;5 000 \times 5 000&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;200 000 \times 200 000&amp;lt;/math&amp;gt;, step = 5 000.&lt;br /&gt;
&lt;br /&gt;
Ниже приведена зависимость эффективности параллельной реализации от указанных выше параметров.&lt;br /&gt;
&lt;br /&gt;
[[File:Lanczos Without Orthogonalization Eff2.png|600px|thumb|center|Рисунок 2. Эффективность параллельной реализации алгоритма Ланцоша.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Size&amp;lt;/math&amp;gt; — размерность матрицы &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Cores&amp;lt;/math&amp;gt; — количество процессоров, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Eff&amp;lt;/math&amp;gt; — эффективность алгоритма в %. &amp;lt;br/&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выводы&#039;&#039;&#039;:&lt;br /&gt;
* минимальная эффективность алгоритма при указанных параметрах составила 1.9% (при числе процессоров 32, размерности матрицы 5 000),&lt;br /&gt;
* максимальная эффективность алгоритма при указанных параметрах составила 59.5% (при числе процессоров 256, размерности матрицы 200 000),&lt;br /&gt;
* средняя эффективность алгоритма при числе процессоров от 32 до 256 и размерности матрицы от 25 000 до 200 000 составила 52,7%,&lt;br /&gt;
* при размерности матрицы менее 25 000 эффективность алгоритма менее 23%.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша для точной арифметики без переортогонализации на практике используется гораздо реже, чем алгоритм Ланцоша с частичной или полной ортогонализацией, но, тем не менее, существует множество реализаций данного алгоритма, как последовательных, так и параллельных. Ниже перечислены наиболее известные и обозреваемые в литературе &amp;lt;ref&amp;gt;Hernandez V. et al. A survey of software for sparse eigenvalue problems //Universidad Politecnica de Valencia, Valencia, Spain, SLEPc Technical Report STR-6, – 2009.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Hernandez V. et al. Lanczos methods in SLEPc //Universidad Politécnica de Valencia, Valencia, Spain, SLEPc Technical Report STR-5. – 2006. – С. 136.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;http://www.grycap.upv.es/slepc&amp;lt;/ref&amp;gt; проекты на базе данного алгоритма. &lt;br /&gt;
&lt;br /&gt;
* UNDERWOOD (1977) &amp;lt;ref&amp;gt;Golub, G. H. and R. Underwood.  The Block Lanczos Method for Computing Eigenvalues.  In Mathematical Software III (edited by J. Rice), pp. 364{377. Academic Press, New York, NY, USA&amp;lt;/ref&amp;gt;. Без переортогонализации и с частичной реортогонализацией. Язык Fortran 77.&lt;br /&gt;
* PROPACK (1998) &amp;lt;ref&amp;gt;http://www.daimi.au.dk/PB/537&amp;lt;/ref&amp;gt;. Частичная реортогонализация. Язык Fortran 77, Matlab. Присутствует реализация с распараллеливанием на базе OpenMP.&lt;br /&gt;
* BLKLAN (2004) &amp;lt;ref&amp;gt;Liu, G., W. Xu, and S. Qiao. Block Lanczos Tridiagonalization of Complex Symmetric Matrices. Technical  Report  CAS-04-07-SQ,  Department  of  Computing  and  Software,  McMaster  University, Hamilton, Ontario, Canada&amp;lt;/ref&amp;gt;. Без реортогонализации, с частичной реортогонализацией. Язык C, Matlab.&lt;br /&gt;
* IETL (2006) &amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/&amp;lt;/ref&amp;gt;. Только без реортогонализации. Язык C++.&lt;br /&gt;
* SLEPc (2009) &amp;lt;ref&amp;gt;Hernandez V., Roman J. E., Vidal V. SLEPc: A scalable and flexible toolkit for the solution of eigenvalue problems //ACM Transactions on Mathematical Software (TOMS).– Т. 31. – №. 3. – С. 351-362.&amp;lt;/ref&amp;gt;. Без реортогонализации, с выборочной реортогонализацией, с частичной реортогонализацией, с полной реортогонализацией. Язык C. Присутствует реализация с распараллеливанием на базе MPI.&lt;br /&gt;
* Lanczos Plus Plus (2009) &amp;lt;ref&amp;gt;https://github.com/g1257/LanczosPlusPlus&amp;lt;/ref&amp;gt;. Пример реализации алгоритма Ланцоша в применении к задаче расчета взаимодействия сильно кореллированных электронов. С частичной переортогонализацией, с полной переортогонализацией. Язык C++.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Shostix</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:Shostix/%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=22045</id>
		<title>Участник:Shostix/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:Shostix/%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=22045"/>
		<updated>2017-02-02T20:53:47Z</updated>

		<summary type="html">&lt;p&gt;Shostix: &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;
| 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;kn+k&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;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Авторы&#039;&#039;&#039;:&lt;br /&gt;
* [[Участник:Shostix|А.В. Шостик]].&lt;br /&gt;
&lt;br /&gt;
==Свойства и структура алгоритма==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - один из итерационных методов вычисления собственных значений и собственных векторов симметричных матриц (задача &amp;lt;math&amp;gt;Ax = \lambda x&amp;lt;/math&amp;gt;). Используется для работы с матрицами столь большими, что классические численные методы нахождения собственных значений неприменимы из-за высокой вычислительной сложности. На практике чаще всего используется для работы с большими разреженными матрицами.&lt;br /&gt;
&lt;br /&gt;
Алгоритм был предложен в 1950 году венгерским физиком и математиком Корнелием Ланцошем. Основан на понятии построения крыловского подпространства и процедуре Рэлея-Ритца: строит последовательность трехдиагональных матриц с тем свойством, что экстремальные собственные значения для каждой последующей трехдиагональной матрицы дают все более точные оценки экстремальных собственных значений для А. &lt;br /&gt;
&lt;br /&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;
&#039;&#039;Исходные данные&#039;&#039;:&lt;br /&gt;
 &lt;br /&gt;
*   симметрическая матрица &amp;lt;math&amp;gt;A=A^T&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, элементы матрицы &amp;lt;math&amp;gt;a_{ij}=a_{ji}&amp;lt;/math&amp;gt;&lt;br /&gt;
*   начальный вектор &amp;lt;math&amp;gt;v = {v_1, v_2, ..., v_n}, v \neq \theta&amp;lt;/math&amp;gt; &lt;br /&gt;
Так как матрица является симметрической, достаточно хранить &amp;lt;math&amp;gt;\frac{n(n+1)}{2}&amp;lt;/math&amp;gt; ее элементов.&lt;br /&gt;
&lt;br /&gt;
Для исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; строится крыловское подпространство. Крыловское подпространство - это линейная оболочка векторов &amp;lt;math&amp;gt;[v, Av, A^2v, ..., A^{k-1}v]&amp;lt;/math&amp;gt;, называемых векторами Ланцоша.&lt;br /&gt;
Каждый из векторов Ланцоша ортонормируется: &amp;lt;math&amp;gt;q_k=\frac{A^kv}{\|A^kv\|}&amp;lt;/math&amp;gt;, и на шаге &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; алгоритма имеется Крыловская матрица &amp;lt;math&amp;gt;Q = {q_0, ..., q_{k-1}}&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&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;k&amp;lt;/math&amp;gt;-ым приближением собственного вектора исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
В качестве приближенных собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; берутся собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt; (числа Ритца). В качестве алгоритма нахождения собственных векторов и собственных значений симметрической трехдиагональной матрицы будем использовать метод &amp;quot;разделяй и властвуй&amp;quot;, который требует &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций.&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Выходные данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* совокупность собственных векторов матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; (т.е. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-ых приближений собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;)&lt;br /&gt;
* совокупность собственных значений матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; (т.е. &amp;lt;math&amp;gt;k&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;
&#039;&#039;&#039;Вычислительное ядро&#039;&#039;&#039;. т.е. часть алгоритма, требующая наибольших вычислительных затрат на каждой итерации состоит из вычисления промежуточного вектора &amp;lt;math&amp;gt;z=Aq_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&#039;&#039;&#039; Итерация алгоритма: &#039;&#039;&#039;&lt;br /&gt;
* вычисление нормы вектора,&lt;br /&gt;
* деление вектора на число,&lt;br /&gt;
* умножение матрицы на вектор,&lt;br /&gt;
* линейная комбинация векторов (умножение на число и сложение).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Финальный расчет: &#039;&#039;&#039;&lt;br /&gt;
* вычисление собственных векторов и собственных значений трехдиагональной симметричной матрицы.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Псевдокод алгоритма&#039;&#039;&amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Вход&#039;&#039;&#039;  : размерность матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, элементы симметричной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, количество итераций &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
 &#039;&#039;&#039;Выход&#039;&#039;&#039; : собственные вектора матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, матрица собственных значений &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
q_1 = &amp;amp; b/ \|b\|_2,\; &lt;br /&gt;
\beta_0 = 0,\; &lt;br /&gt;
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 \\ &lt;br /&gt;
&amp;amp; \; \; \; \; exit\\&lt;br /&gt;
&amp;amp; else \\&lt;br /&gt;
&amp;amp; \; \; \; \; q_{i+1} = 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;
&amp;lt;math&amp;gt;procedure(T_k)&amp;lt;/math&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt;procedure()&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; итераций и финального расчета собственных векторов и собственных значений.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим сложность каждой макрооперации алгоритма:&lt;br /&gt;
* вычисление нормы вектора - &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений, операция извлечения корня&lt;br /&gt;
* деление вектора на число - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций&lt;br /&gt;
* умножение матрицы на вектор - &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций&lt;br /&gt;
* скалярное произведение векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций&lt;br /&gt;
* линейная комбинация векторов - &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений и вычитаний&lt;br /&gt;
* вычисление собственных векторов и собственных значений матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; методом &amp;quot;Разделяй и властвуй&amp;quot;  - &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Инициализация:&#039;&#039;&#039; &lt;br /&gt;
* вычисление нормы вектора,&lt;br /&gt;
* деление вектора на число.&lt;br /&gt;
&#039;&#039;&#039;Одна итерация:&#039;&#039;&#039; &lt;br /&gt;
* умножение матрицы на вектор,&lt;br /&gt;
* скалярное произведение векторов,&lt;br /&gt;
* линейная комбинация векторов,&lt;br /&gt;
* вычисление нормы вектора,&lt;br /&gt;
* деление вектора на число.&lt;br /&gt;
&#039;&#039;&#039;Финальный расчет:&#039;&#039;&#039;&lt;br /&gt;
* вычисление собственных векторов и собственных значений матрицы&lt;br /&gt;
&lt;br /&gt;
Итого &#039;&#039;&#039;последовательная сложность алгоритма&#039;&#039;&#039; составляет &amp;lt;math&amp;gt;O(3n+k(n^2+n+2n+2n+3n))+O(k^3)&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;k&amp;lt;/math&amp;gt;, сложность алгоритма Ланцоша можно рассматривать &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма с входными и выходными данными можно описать в виде рисунка:&lt;br /&gt;
&lt;br /&gt;
[[File:Ланцош.png|600px|thumb|center|Рисунок 1. Информационный граф алгоритма Ланцоша.&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; — операция деления, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;A&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;L&amp;lt;/math&amp;gt; — операция вычисления линейной комбинации векторов, &amp;lt;br/&amp;gt;&lt;br /&gt;
▽ - проверка условия &amp;lt;math&amp;gt;\mathsf{(\beta_i = 0)}&amp;lt;/math&amp;gt; и выход из цикла в случае выполнения условия]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Внутри каждой итерации алгоритма можно задействовать параллельные вычисления для суммирования векторов (использовать суммирование методом сдваивания элементов). Эта операция будет использована в макрооперации умножения матрицы на вектор, которая требует в последовательной реализации &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сложение. В таком виде сложение &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; элементов можно выполнить за &amp;lt;math&amp;gt;\log_2 n&amp;lt;/math&amp;gt; действий.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Входные данные&#039;&#039;: симметрическая матрица &amp;lt;math&amp;gt;A=A^T&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;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Объем входных данных&#039;&#039;: &amp;lt;math&amp;gt;\frac{n(n+1)}{2} + 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Выходные данные&#039;&#039;: &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;
&#039;&#039;Объем выходных данных&#039;&#039;: &amp;lt;math&amp;gt;kn+k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Сложность последовательной реализации алгоритма &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;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;
** В умножении матрицы на вектор сложение n элементов выполняется в &amp;lt;math&amp;gt;\log_2 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;
* Отношение последовательной сложности  к параллельной &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Вычислительная мощность алгоритма Ланцоша из последовательной сложности алгоритма &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+2k}&amp;lt;/math&amp;gt;. Учитывая &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; много меньше  &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, вычислительная мощность ≈ &amp;lt;math&amp;gt; 2k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* В алгоритме Ланцоша возможно выполнение числа итераций менее &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; если все собственные значения матрицы вычисляются раньше.&lt;br /&gt;
* Для найденных собственных значений справедливо: &amp;lt;math&amp;gt;\lambda_i(T_{k+1})\geq \lambda_i(T_{k})\geq \lambda_{i+1}(T_{k+1})\geq \lambda_{i+1}(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;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;[http://parallel.ru/cluster/].&lt;br /&gt;
&lt;br /&gt;
Исследуемая реализация на языке C [https://algowiki-project.org/ru/%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_%28%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%29#.D0.A1.D1.83.D1.89.D0.B5.D1.81.D1.82.D0.B2.D1.83.D1.8E.D1.89.D0.B8.D0.B5_.D1.80.D0.B5.D0.B0.D0.BB.D0.B8.D0.B7.D0.B0.D1.86.D0.B8.D0.B8] &amp;lt;ref&amp;gt;https://github.com/xrstalker/lanczos&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Компилятор gcc, аргумент -std=c11. Openmpi-1.8.4&lt;br /&gt;
&lt;br /&gt;
* Число процессоров варьировалось от 32 до 256, step = 16.&lt;br /&gt;
* Размер матрицы изменялся от &amp;lt;math&amp;gt;5 000 \times 5 000&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;200 000 \times 200 000&amp;lt;/math&amp;gt;, step = 5 000.&lt;br /&gt;
&lt;br /&gt;
Ниже приведена зависимость эффективности параллельной реализации от указанных выше параметров.&lt;br /&gt;
&lt;br /&gt;
[[File:Lanczos Without Orthogonalization Eff2.png|600px|thumb|center|Рисунок 2. Эффективность параллельной реализации алгоритма Ланцоша.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Size&amp;lt;/math&amp;gt; — размерность матрицы &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Cores&amp;lt;/math&amp;gt; — количество процессоров, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;Eff&amp;lt;/math&amp;gt; — эффективность алгоритма в %. &amp;lt;br/&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выводы&#039;&#039;&#039;:&lt;br /&gt;
* минимальная эффективность алгоритма при указанных параметрах составила 1.9% (при числе процессоров 32, размерности матрицы 5 000),&lt;br /&gt;
* максимальная эффективность алгоритма при указанных параметрах составила 59.5% (при числе процессоров 256, размерности матрицы 200 000),&lt;br /&gt;
* средняя эффективность алгоритма при числе процессоров от 32 до 256 и размерности матрицы от 25 000 до 200 000 составила 52,7%,&lt;br /&gt;
* при размерности матрицы менее 25 000 эффективность алгоритма менее 23%.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша для точной арифметики без переортогонализации на практике используется гораздо реже, чем алгоритм Ланцоша с частичной или полной ортогонализацией, но, тем не менее, существует множество реализаций данного алгоритма, как последовательных, так и параллельных. Ниже перечислены наиболее известные и обозреваемые в литературе &amp;lt;ref&amp;gt;Hernandez V. et al. A survey of software for sparse eigenvalue problems //Universidad Politecnica de Valencia, Valencia, Spain, SLEPc Technical Report STR-6, – 2009.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Hernandez V. et al. Lanczos methods in SLEPc //Universidad Politécnica de Valencia, Valencia, Spain, SLEPc Technical Report STR-5. – 2006. – С. 136.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;http://www.grycap.upv.es/slepc&amp;lt;/ref&amp;gt; проекты на базе данного алгоритма. &lt;br /&gt;
&lt;br /&gt;
* UNDERWOOD (1977) &amp;lt;ref&amp;gt;Golub, G. H. and R. Underwood.  The Block Lanczos Method for Computing Eigenvalues.  In Mathematical Software III (edited by J. Rice), pp. 364{377. Academic Press, New York, NY, USA&amp;lt;/ref&amp;gt;. Без переортогонализации и с частичной реортогонализацией. Язык Fortran 77.&lt;br /&gt;
* PROPACK (1998) &amp;lt;ref&amp;gt;http://www.daimi.au.dk/PB/537&amp;lt;/ref&amp;gt;. Частичная реортогонализация. Язык Fortran 77, Matlab. Присутствует реализация с распараллеливанием на базе OpenMP.&lt;br /&gt;
* BLKLAN (2004) &amp;lt;ref&amp;gt;Liu, G., W. Xu, and S. Qiao. Block Lanczos Tridiagonalization of Complex Symmetric Matrices. Technical  Report  CAS-04-07-SQ,  Department  of  Computing  and  Software,  McMaster  University, Hamilton, Ontario, Canada&amp;lt;/ref&amp;gt;. Без реортогонализации, с частичной реортогонализацией. Язык C, Matlab.&lt;br /&gt;
* IETL (2006) &amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/&amp;lt;/ref&amp;gt;. Только без реортогонализации. Язык C++.&lt;br /&gt;
* SLEPc (2009) &amp;lt;ref&amp;gt;Hernandez V., Roman J. E., Vidal V. SLEPc: A scalable and flexible toolkit for the solution of eigenvalue problems //ACM Transactions on Mathematical Software (TOMS).– Т. 31. – №. 3. – С. 351-362.&amp;lt;/ref&amp;gt;. Без реортогонализации, с выборочной реортогонализацией, с частичной реортогонализацией, с полной реортогонализацией. Язык C. Присутствует реализация с распараллеливанием на базе MPI.&lt;br /&gt;
* Lanczos Plus Plus (2009) &amp;lt;ref&amp;gt;https://github.com/g1257/LanczosPlusPlus&amp;lt;/ref&amp;gt;. Пример реализация алгоритма Ланцоша в применении к задаче расчета взаимодействия сильно кореллированных электронов. С частичной переортогонализацией, с полной переортогонализацией. Язык C++.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Shostix</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:Shostix/%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=22044</id>
		<title>Участник:Shostix/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:Shostix/%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=22044"/>
		<updated>2017-02-02T20:14:00Z</updated>

		<summary type="html">&lt;p&gt;Shostix: &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;
| 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;kn+k&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;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Авторы&#039;&#039;&#039;:&lt;br /&gt;
* [[Участник:Shostix|А.В. Шостик]].&lt;br /&gt;
&lt;br /&gt;
==Свойства и структура алгоритма==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - один из итерационных методов вычисления собственных значений и собственных векторов симметричных матриц (задача &amp;lt;math&amp;gt;Ax = \lambda x&amp;lt;/math&amp;gt;). Используется для работы с матрицами столь большими, что классические численные методы нахождения собственных значений неприменимы из-за высокой вычислительной сложности. На практике чаще всего используется для работы с большими разреженными матрицами.&lt;br /&gt;
&lt;br /&gt;
Алгоритм был предложен в 1950 году венгерским физиком и математиком Корнелием Ланцошем. Основан на понятии построения крыловского подпространства и процедуре Рэлея-Ритца: строит последовательность трехдиагональных матриц с тем свойством, что экстремальные собственные значения для каждой последующей трехдиагональной матрицы дают все более точные оценки экстремальных собственных значений для А. &lt;br /&gt;
&lt;br /&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;
&#039;&#039;Исходные данные&#039;&#039;:&lt;br /&gt;
 &lt;br /&gt;
*   симметрическая матрица &amp;lt;math&amp;gt;A=A^T&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, элементы матрицы &amp;lt;math&amp;gt;a_{ij}=a_{ji}&amp;lt;/math&amp;gt;&lt;br /&gt;
*   начальный вектор &amp;lt;math&amp;gt;v = {v_1, v_2, ..., v_n}, v \neq \theta&amp;lt;/math&amp;gt; &lt;br /&gt;
Так как матрица является симметрической, достаточно хранить &amp;lt;math&amp;gt;\frac{n(n+1)}{2}&amp;lt;/math&amp;gt; ее элементов.&lt;br /&gt;
&lt;br /&gt;
Для исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; строится крыловское подпространство. Крыловское подпространство - это линейная оболочка векторов &amp;lt;math&amp;gt;[v, Av, A^2v, ..., A^{k-1}v]&amp;lt;/math&amp;gt;, называемых векторами Ланцоша.&lt;br /&gt;
Каждый из векторов Ланцоша ортонормируется: &amp;lt;math&amp;gt;q_k=\frac{A^kv}{\|A^kv\|}&amp;lt;/math&amp;gt;, и на шаге &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; алгоритма имеется Крыловская матрица &amp;lt;math&amp;gt;Q = {q_0, ..., q_{k-1}}&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&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;k&amp;lt;/math&amp;gt;-ым приближением собственного вектора исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
В качестве приближенных собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; берутся собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt; (числа Ритца). В качестве алгоритма нахождения собственных векторов и собственных значений симметрической трехдиагональной матрицы будем использовать метод &amp;quot;разделяй и властвуй&amp;quot;, который требует &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций.&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Выходные данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* совокупность собственных векторов матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; (т.е. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-ых приближений собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;)&lt;br /&gt;
* совокупность собственных значений матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; (т.е. &amp;lt;math&amp;gt;k&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;
&#039;&#039;&#039;Вычислительное ядро&#039;&#039;&#039;. т.е. часть алгоритма, требующая наибольших вычислительных затрат на каждой итерации состоит из вычисления промежуточного вектора &amp;lt;math&amp;gt;z=Aq_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&#039;&#039;&#039; Итерация алгоритма: &#039;&#039;&#039;&lt;br /&gt;
* вычисление нормы вектора,&lt;br /&gt;
* деление вектора на число,&lt;br /&gt;
* умножение матрицы на вектор,&lt;br /&gt;
* линейная комбинация векторов (умножение на число и сложение).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Финальный расчет: &#039;&#039;&#039;&lt;br /&gt;
* вычисление собственных векторов и собственных значений трехдиагональной симметричной матрицы.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Псевдокод алгоритма&#039;&#039;&amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Вход&#039;&#039;&#039;  : размерность матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, элементы симметричной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, количество итераций &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
 &#039;&#039;&#039;Выход&#039;&#039;&#039; : собственные вектора матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, матрица собственных значений &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
q_1 = &amp;amp; b/ \|b\|_2,\; &lt;br /&gt;
\beta_0 = 0,\; &lt;br /&gt;
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 \\ &lt;br /&gt;
&amp;amp; \; \; \; \; exit\\&lt;br /&gt;
&amp;amp; else \\&lt;br /&gt;
&amp;amp; \; \; \; \; q_{i+1} = 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;
&amp;lt;math&amp;gt;procedure(T_k)&amp;lt;/math&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt;procedure()&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; итераций и финального расчета собственных векторов и собственных значений.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим сложность каждой макрооперации алгоритма:&lt;br /&gt;
* вычисление нормы вектора - &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений, операция извлечения корня&lt;br /&gt;
* деление вектора на число - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций&lt;br /&gt;
* умножение матрицы на вектор - &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций&lt;br /&gt;
* скалярное произведение векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций&lt;br /&gt;
* линейная комбинация векторов - &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений и вычитаний&lt;br /&gt;
* вычисление собственных векторов и собственных значений матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; методом &amp;quot;Разделяй и властвуй&amp;quot;  - &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Инициализация:&#039;&#039;&#039; &lt;br /&gt;
* вычисление нормы вектора,&lt;br /&gt;
* деление вектора на число.&lt;br /&gt;
&#039;&#039;&#039;Одна итерация:&#039;&#039;&#039; &lt;br /&gt;
* умножение матрицы на вектор,&lt;br /&gt;
* скалярное произведение векторов,&lt;br /&gt;
* линейная комбинация векторов,&lt;br /&gt;
* вычисление нормы вектора,&lt;br /&gt;
* деление вектора на число.&lt;br /&gt;
&#039;&#039;&#039;Финальный расчет:&#039;&#039;&#039;&lt;br /&gt;
* вычисление собственных векторов и собственных значений матрицы&lt;br /&gt;
&lt;br /&gt;
Итого &#039;&#039;&#039;последовательная сложность алгоритма&#039;&#039;&#039; составляет &amp;lt;math&amp;gt;O(3n+k(n^2+n+2n+2n+3n))+O(k^3)&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;k&amp;lt;/math&amp;gt;, сложность алгоритма Ланцоша можно рассматривать &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма с входными и выходными данными можно описать в виде рисунка:&lt;br /&gt;
&lt;br /&gt;
[[File:Ланцош.png|600px|thumb|center|Рисунок 1. Информационный граф алгоритма Ланцоша.&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; — операция деления, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;A&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;L&amp;lt;/math&amp;gt; — операция вычисления линейной комбинации векторов, &amp;lt;br/&amp;gt;&lt;br /&gt;
▽ - проверка условия &amp;lt;math&amp;gt;\mathsf{(\beta_i = 0)}&amp;lt;/math&amp;gt; и выход из цикла в случае выполнения условия]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Внутри каждой итерации алгоритма можно задействовать параллельные вычисления для суммирования векторов (использовать суммирование методом сдваивания элементов). Эта операция будет использована в макрооперации умножения матрицы на вектор, которая требует в последовательной реализации &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сложение. В таком виде сложение &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; элементов можно выполнить за &amp;lt;math&amp;gt;\log_2 n&amp;lt;/math&amp;gt; действий.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Входные данные&#039;&#039;: симметрическая матрица &amp;lt;math&amp;gt;A=A^T&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;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Объем входных данных&#039;&#039;: &amp;lt;math&amp;gt;\frac{n(n+1)}{2} + 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Выходные данные&#039;&#039;: &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;
&#039;&#039;Объем выходных данных&#039;&#039;: &amp;lt;math&amp;gt;kn+k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Сложность последовательной реализации алгоритма &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;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;
** В умножении матрицы на вектор сложение n элементов выполняется в &amp;lt;math&amp;gt;\log_2 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;
* Отношение последовательной сложности  к параллельной &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Вычислительная мощность алгоритма Ланцоша из последовательной сложности алгоритма &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+2k}&amp;lt;/math&amp;gt;. Учитывая &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; много меньше  &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, вычислительная мощность ≈ &amp;lt;math&amp;gt; 2k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* В алгоритме Ланцоша возможно выполнение числа итераций менее &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; если все собственные значения матрицы вычисляются раньше.&lt;br /&gt;
* Для найденных собственных значений справедливо: &amp;lt;math&amp;gt;\lambda_i(T_{k+1})\geq \lambda_i(T_{k})\geq \lambda_{i+1}(T_{k+1})\geq \lambda_{i+1}(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;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;[http://parallel.ru/cluster/].&lt;br /&gt;
&lt;br /&gt;
Исследуемая реализация на языке C [https://algowiki-project.org/ru/%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_%28%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%29#.D0.A1.D1.83.D1.89.D0.B5.D1.81.D1.82.D0.B2.D1.83.D1.8E.D1.89.D0.B8.D0.B5_.D1.80.D0.B5.D0.B0.D0.BB.D0.B8.D0.B7.D0.B0.D1.86.D0.B8.D0.B8] &amp;lt;ref&amp;gt;https://github.com/xrstalker/lanczos&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Компилятор gcc, аргумент -std=c11. Openmpi-1.8.4&lt;br /&gt;
&lt;br /&gt;
* Число процессоров варьировалось от 32 до 256, step = 16.&lt;br /&gt;
* Размер матрицы изменялся от &amp;lt;math&amp;gt;5 000 \times 5 000&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;200 000 \times 200 000&amp;lt;/math&amp;gt;, step = 5 000.&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;ref&amp;gt;Hernandez V. et al. A survey of software for sparse eigenvalue problems //Universidad Politecnica de Valencia, Valencia, Spain, SLEPc Technical Report STR-6, – 2009.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Hernandez V. et al. Lanczos methods in SLEPc //Universidad Politécnica de Valencia, Valencia, Spain, SLEPc Technical Report STR-5. – 2006. – С. 136.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;http://www.grycap.upv.es/slepc&amp;lt;/ref&amp;gt; проекты на базе данного алгоритма в хронологическом порядке. &lt;br /&gt;
&lt;br /&gt;
* UNDERWOOD (1977) &amp;lt;ref&amp;gt;Golub, G. H. and R. Underwood.  The Block Lanczos Method for Computing Eigenvalues.  In Mathematical Software III (edited by J. Rice), pp. 364{377. Academic Press, New York, NY, USA&amp;lt;/ref&amp;gt;. Без переортогонализации и с частичной реортогонализацией. Язык Fortran 77.&lt;br /&gt;
* PROPACK (1998) &amp;lt;ref&amp;gt;http://www.daimi.au.dk/PB/537&amp;lt;/ref&amp;gt;. Частичная реортогонализация. Язык Fortran 77, Matlab. Присутствует реализация с распараллеливанием на базе OpenMP.&lt;br /&gt;
* BLKLAN (2004) &amp;lt;ref&amp;gt;Liu, G., W. Xu, and S. Qiao. Block Lanczos Tridiagonalization of Complex Symmetric Matrices. Technical  Report  CAS-04-07-SQ,  Department  of  Computing  and  Software,  McMaster  University, Hamilton, Ontario, Canada&amp;lt;/ref&amp;gt;. Без реортогонализации, с частичной реортогонализацией. Язык C, Matlab.&lt;br /&gt;
* IETL (2006) &amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/&amp;lt;/ref&amp;gt;. Только без реортогонализации. Язык C++.&lt;br /&gt;
* SLEPc (2009) &amp;lt;ref&amp;gt;Hernandez V., Roman J. E., Vidal V. SLEPc: A scalable and flexible toolkit for the solution of eigenvalue problems //ACM Transactions on Mathematical Software (TOMS).– Т. 31. – №. 3. – С. 351-362.&amp;lt;/ref&amp;gt;. Без реортогонализации, с выборочной реортогонализацией, с частичной реортогонализацией, с полной реортогонализацией. Язык C. Присутствует реализация с распараллеливанием на базе MPI.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Shostix</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:Shostix/%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=22043</id>
		<title>Участник:Shostix/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:Shostix/%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=22043"/>
		<updated>2017-02-02T19:18:25Z</updated>

		<summary type="html">&lt;p&gt;Shostix: /* Существующие реализации алгоритма */&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;
| 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;kn+k&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;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Авторы&#039;&#039;&#039;:&lt;br /&gt;
* [[Участник:Shostix|А.В. Шостик]].&lt;br /&gt;
&lt;br /&gt;
==Свойства и структура алгоритма==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - один из итерационных методов вычисления собственных значений и собственных векторов симметричных матриц (задача &amp;lt;math&amp;gt;Ax = \lambda x&amp;lt;/math&amp;gt;). Используется для работы с матрицами столь большими, что классические численные методы нахождения собственных значений неприменимы из-за высокой вычислительной сложности. На практике чаще всего используется для работы с большими разреженными матрицами.&lt;br /&gt;
&lt;br /&gt;
Алгоритм был предложен в 1950 году венгерским физиком и математиком Корнелием Ланцошем. Основан на понятии построения крыловского подпространства и процедуре Рэлея-Ритца: строит последовательность трехдиагональных матриц с тем свойством, что экстремальные собственные значения для каждой последующей трехдиагональной матрицы дают все более точные оценки экстремальных собственных значений для А. &lt;br /&gt;
&lt;br /&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;
&#039;&#039;Исходные данные&#039;&#039;:&lt;br /&gt;
 &lt;br /&gt;
*   симметрическая матрица &amp;lt;math&amp;gt;A=A^T&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, элементы матрицы &amp;lt;math&amp;gt;a_{ij}=a_{ji}&amp;lt;/math&amp;gt;&lt;br /&gt;
*   начальный вектор &amp;lt;math&amp;gt;v = {v_1, v_2, ..., v_n}, v \neq \theta&amp;lt;/math&amp;gt; &lt;br /&gt;
Так как матрица является симметрической, достаточно хранить &amp;lt;math&amp;gt;\frac{n(n+1)}{2}&amp;lt;/math&amp;gt; ее элементов.&lt;br /&gt;
&lt;br /&gt;
Для исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; строится крыловское подпространство. Крыловское подпространство - это линейная оболочка векторов &amp;lt;math&amp;gt;[v, Av, A^2v, ..., A^{k-1}v]&amp;lt;/math&amp;gt;, называемых векторами Ланцоша.&lt;br /&gt;
Каждый из векторов Ланцоша ортонормируется: &amp;lt;math&amp;gt;q_k=\frac{A^kv}{\|A^kv\|}&amp;lt;/math&amp;gt;, и на шаге &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; алгоритма имеется Крыловская матрица &amp;lt;math&amp;gt;Q = {q_0, ..., q_{k-1}}&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&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;k&amp;lt;/math&amp;gt;-ым приближением собственного вектора исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
В качестве приближенных собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; берутся собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt; (числа Ритца). В качестве алгоритма нахождения собственных векторов и собственных значений симметрической трехдиагональной матрицы будем использовать метод &amp;quot;разделяй и властвуй&amp;quot;, который требует &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций.&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Выходные данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* совокупность собственных векторов матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; (т.е. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-ых приближений собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;)&lt;br /&gt;
* совокупность собственных значений матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; (т.е. &amp;lt;math&amp;gt;k&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;
&#039;&#039;&#039;Вычислительное ядро&#039;&#039;&#039;. т.е. часть алгоритма, требующая наибольших вычислительных затрат на каждой итерации состоит из вычисления промежуточного вектора &amp;lt;math&amp;gt;z=Aq_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&#039;&#039;&#039; Итерация алгоритма: &#039;&#039;&#039;&lt;br /&gt;
* вычисление нормы вектора,&lt;br /&gt;
* деление вектора на число,&lt;br /&gt;
* умножение матрицы на вектор,&lt;br /&gt;
* линейная комбинация векторов (умножение на число и сложение).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Финальный расчет: &#039;&#039;&#039;&lt;br /&gt;
* вычисление собственных векторов и собственных значений трехдиагональной симметричной матрицы.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Псевдокод алгоритма&#039;&#039;&amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Вход&#039;&#039;&#039;  : размерность матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, элементы симметричной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, количество итераций &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
 &#039;&#039;&#039;Выход&#039;&#039;&#039; : собственные вектора матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, матрица собственных значений &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
q_1 = &amp;amp; b/ \|b\|_2,\; &lt;br /&gt;
\beta_0 = 0,\; &lt;br /&gt;
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 \\ &lt;br /&gt;
&amp;amp; \; \; \; \; exit\\&lt;br /&gt;
&amp;amp; else \\&lt;br /&gt;
&amp;amp; \; \; \; \; q_{i+1} = 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;
&amp;lt;math&amp;gt;procedure(T_k)&amp;lt;/math&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt;procedure()&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; итераций и финального расчета собственных векторов и собственных значений.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим сложность каждой макрооперации алгоритма:&lt;br /&gt;
* вычисление нормы вектора - &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений, операция извлечения корня&lt;br /&gt;
* деление вектора на число - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций&lt;br /&gt;
* умножение матрицы на вектор - &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций&lt;br /&gt;
* скалярное произведение векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций&lt;br /&gt;
* линейная комбинация векторов - &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений и вычитаний&lt;br /&gt;
* вычисление собственных векторов и собственных значений матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; методом &amp;quot;Разделяй и властвуй&amp;quot;  - &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Инициализация:&#039;&#039;&#039; &lt;br /&gt;
* вычисление нормы вектора,&lt;br /&gt;
* деление вектора на число.&lt;br /&gt;
&#039;&#039;&#039;Одна итерация:&#039;&#039;&#039; &lt;br /&gt;
* умножение матрицы на вектор,&lt;br /&gt;
* скалярное произведение векторов,&lt;br /&gt;
* линейная комбинация векторов,&lt;br /&gt;
* вычисление нормы вектора,&lt;br /&gt;
* деление вектора на число.&lt;br /&gt;
&#039;&#039;&#039;Финальный расчет:&#039;&#039;&#039;&lt;br /&gt;
* вычисление собственных векторов и собственных значений матрицы&lt;br /&gt;
&lt;br /&gt;
Итого &#039;&#039;&#039;последовательная сложность алгоритма&#039;&#039;&#039; составляет &amp;lt;math&amp;gt;O(3n+k(n^2+n+2n+2n+3n))+O(k^3)&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;k&amp;lt;/math&amp;gt;, сложность алгоритма Ланцоша можно рассматривать &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма с входными и выходными данными можно описать в виде рисунка:&lt;br /&gt;
&lt;br /&gt;
[[File:Ланцош.png|600px|thumb|center|Рисунок 1. Информационный граф алгоритма Ланцоша.&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; — операция деления, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;A&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;L&amp;lt;/math&amp;gt; — операция вычисления линейной комбинации векторов, &amp;lt;br/&amp;gt;&lt;br /&gt;
▽ - проверка условия &amp;lt;math&amp;gt;\mathsf{(\beta_i = 0)}&amp;lt;/math&amp;gt; и выход из цикла в случае выполнения условия]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Внутри каждой итерации алгоритма можно задействовать параллельные вычисления для суммирования векторов (использовать суммирование методом сдваивания элементов). Эта операция будет использована в макрооперации умножения матрицы на вектор, которая требует в последовательной реализации &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сложение. В таком виде сложение &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; элементов можно выполнить за &amp;lt;math&amp;gt;\log_2 n&amp;lt;/math&amp;gt; действий.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Входные данные&#039;&#039;: симметрическая матрица &amp;lt;math&amp;gt;A=A^T&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;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Объем входных данных&#039;&#039;: &amp;lt;math&amp;gt;\frac{n(n+1)}{2} + 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Выходные данные&#039;&#039;: &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;
&#039;&#039;Объем выходных данных&#039;&#039;: &amp;lt;math&amp;gt;kn+k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Сложность последовательной реализации алгоритма &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;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;
** В умножении матрицы на вектор сложение n элементов выполняется в &amp;lt;math&amp;gt;\log_2 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;
* Отношение последовательной сложности  к параллельной &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Вычислительная мощность алгоритма Ланцоша из последовательной сложности алгоритма &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+2k}&amp;lt;/math&amp;gt;. Учитывая &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; много меньше  &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, вычислительная мощность ≈ &amp;lt;math&amp;gt; 2k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* В алгоритме Ланцоша возможно выполнение числа итераций менее &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; если все собственные значения матрицы вычисляются раньше.&lt;br /&gt;
* Для найденных собственных значений справедливо: &amp;lt;math&amp;gt;\lambda_i(T_{k+1})\geq \lambda_i(T_{k})\geq \lambda_{i+1}(T_{k+1})\geq \lambda_{i+1}(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;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&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;ref&amp;gt;Hernandez V. et al. A survey of software for sparse eigenvalue problems //Universidad Politecnica de Valencia, Valencia, Spain, SLEPc Technical Report STR-6, http://www. grycap. upv. es/slepc. – 2009.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Hernandez V. et al. Lanczos methods in SLEPc //Universidad Politécnica de Valencia, Valencia, Spain, SLEPc Technical Report STR-5. – 2006. – С. 136.&amp;lt;/ref&amp;gt; проекты на базе данного алгоритма в хронологическом порядке. &lt;br /&gt;
&lt;br /&gt;
* UNDERWOOD (1977) &amp;lt;ref&amp;gt;Golub, G. H. and R. Underwood.  The Block Lanczos Method for Computing Eigenvalues.  In Mathematical Software III (edited by J. Rice), pp. 364{377. Academic Press, New York, NY, USA&amp;lt;/ref&amp;gt;. Без переортогонализации и с частичной реортогонализацией. Язык Fortran 77.&lt;br /&gt;
* PROPACK (1998) &amp;lt;ref&amp;gt;http://www.daimi.au.dk/PB/537&amp;lt;/ref&amp;gt;. Частичная реортогонализация. Язык Fortran 77, Matlab. Присутствует параллельная реализация OpenMP.&lt;br /&gt;
* BLKLAN (2004) &amp;lt;ref&amp;gt;Liu, G., W. Xu, and S. Qiao. Block Lanczos Tridiagonalization of Complex Symmetric Matrices. Technical  Report  CAS-04-07-SQ,  Department  of  Computing  and  Software,  McMaster  University, Hamilton, Ontario, Canada&amp;lt;/ref&amp;gt;. Без реортогонализации, с частичной реортогонализацией. Язык C, Matlab.&lt;br /&gt;
* IETL (2006) &amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/&amp;lt;/ref&amp;gt;. Только без реортогонализации. Язык C++.&lt;br /&gt;
* SLEPc (2009) &amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/&amp;lt;/ref&amp;gt;. Без реортогонализации, с выборочной реортогонализацией, с частичной реортогонализацией, с полной реортогонализацией. Язык C, Fortran 77. Присутствует реализация с распараллеливанием на базе MPI.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Shostix</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:Shostix/%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=21706</id>
		<title>Участник:Shostix/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:Shostix/%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=21706"/>
		<updated>2017-01-24T08:34:49Z</updated>

		<summary type="html">&lt;p&gt;Shostix: &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;
| 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;kn+k&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;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Авторы&#039;&#039;&#039;:&lt;br /&gt;
* [[Участник:Shostix|А.В. Шостик]].&lt;br /&gt;
&lt;br /&gt;
==Свойства и структура алгоритма==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - один из итерационных методов вычисления собственных значений и собственных векторов симметричных матриц (задача &amp;lt;math&amp;gt;Ax = \lambda x&amp;lt;/math&amp;gt;). Используется для работы с матрицами столь большими, что классические численные методы нахождения собственных значений неприменимы из-за высокой вычислительной сложности. На практике чаще всего используется для работы с большими разреженными матрицами.&lt;br /&gt;
&lt;br /&gt;
Алгоритм был предложен в 1950 году венгерским физиком и математиком Корнелием Ланцошем. Основан на понятии построения крыловского подпространства и процедуре Рэлея-Ритца: строит последовательность трехдиагональных матриц с тем свойством, что экстремальные собственные значения для каждой последующей трехдиагональной матрицы дают все более точные оценки экстремальных собственных значений для А. &lt;br /&gt;
&lt;br /&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;
&#039;&#039;Исходные данные&#039;&#039;:&lt;br /&gt;
 &lt;br /&gt;
*   симметрическая матрица &amp;lt;math&amp;gt;A=A^T&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, элементы матрицы &amp;lt;math&amp;gt;a_{ij}=a_{ji}&amp;lt;/math&amp;gt;&lt;br /&gt;
*   начальный вектор &amp;lt;math&amp;gt;v = {v_1, v_2, ..., v_n}, v \neq \theta&amp;lt;/math&amp;gt; &lt;br /&gt;
Так как матрица является симметрической, достаточно хранить &amp;lt;math&amp;gt;\frac{n(n+1)}{2}&amp;lt;/math&amp;gt; ее элементов.&lt;br /&gt;
&lt;br /&gt;
Для исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; строится крыловское подпространство. Крыловское подпространство - это линейная оболочка векторов &amp;lt;math&amp;gt;[v, Av, A^2v, ..., A^{k-1}v]&amp;lt;/math&amp;gt;, называемых векторами Ланцоша.&lt;br /&gt;
Каждый из векторов Ланцоша ортонормируется: &amp;lt;math&amp;gt;q_k=\frac{A^kv}{\|A^kv\|}&amp;lt;/math&amp;gt;, и на шаге &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; алгоритма имеется Крыловская матрица &amp;lt;math&amp;gt;Q = {q_0, ..., q_{k-1}}&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&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;k&amp;lt;/math&amp;gt;-ым приближением собственного вектора исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
В качестве приближенных собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; берутся собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt; (числа Ритца). В качестве алгоритма нахождения собственных векторов и собственных значений симметрической трехдиагональной матрицы будем использовать метод &amp;quot;разделяй и властвуй&amp;quot;, который требует &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций.&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Выходные данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* совокупность собственных векторов матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; (т.е. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-ых приближений собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;)&lt;br /&gt;
* совокупность собственных значений матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; (т.е. &amp;lt;math&amp;gt;k&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;
&#039;&#039;&#039;Вычислительное ядро&#039;&#039;&#039;. т.е. часть алгоритма, требующая наибольших вычислительных затрат на каждой итерации состоит из вычисления промежуточного вектора &amp;lt;math&amp;gt;z=Aq_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&#039;&#039;&#039; Итерация алгоритма: &#039;&#039;&#039;&lt;br /&gt;
* вычисление нормы вектора,&lt;br /&gt;
* деление вектора на число,&lt;br /&gt;
* умножение матрицы на вектор,&lt;br /&gt;
* линейная комбинация векторов (умножение на число и сложение).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Финальный расчет: &#039;&#039;&#039;&lt;br /&gt;
* вычисление собственных векторов и собственных значений трехдиагональной симметричной матрицы.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Псевдокод алгоритма&#039;&#039;&amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Вход&#039;&#039;&#039;  : размерность матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, элементы симметричной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, количество итераций &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
 &#039;&#039;&#039;Выход&#039;&#039;&#039; : собственные вектора матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, матрица собственных значений &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
q_1 = &amp;amp; b/ \|b\|_2,\; &lt;br /&gt;
\beta_0 = 0,\; &lt;br /&gt;
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 \\ &lt;br /&gt;
&amp;amp; \; \; \; \; exit\\&lt;br /&gt;
&amp;amp; else \\&lt;br /&gt;
&amp;amp; \; \; \; \; q_{i+1} = 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;
&amp;lt;math&amp;gt;procedure(T_k)&amp;lt;/math&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt;procedure()&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; итераций и финального расчета собственных векторов и собственных значений.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим сложность каждой макрооперации алгоритма:&lt;br /&gt;
* вычисление нормы вектора - &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений, операция извлечения корня&lt;br /&gt;
* деление вектора на число - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций&lt;br /&gt;
* умножение матрицы на вектор - &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций&lt;br /&gt;
* скалярное произведение векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций&lt;br /&gt;
* линейная комбинация векторов - &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений и вычитаний&lt;br /&gt;
* вычисление собственных векторов и собственных значений матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; методом &amp;quot;Разделяй и властвуй&amp;quot;  - &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Инициализация:&#039;&#039;&#039; &lt;br /&gt;
* вычисление нормы вектора,&lt;br /&gt;
* деление вектора на число.&lt;br /&gt;
&#039;&#039;&#039;Одна итерация:&#039;&#039;&#039; &lt;br /&gt;
* умножение матрицы на вектор,&lt;br /&gt;
* скалярное произведение векторов,&lt;br /&gt;
* линейная комбинация векторов,&lt;br /&gt;
* вычисление нормы вектора,&lt;br /&gt;
* деление вектора на число.&lt;br /&gt;
&#039;&#039;&#039;Финальный расчет:&#039;&#039;&#039;&lt;br /&gt;
* вычисление собственных векторов и собственных значений матрицы&lt;br /&gt;
&lt;br /&gt;
Итого &#039;&#039;&#039;последовательная сложность алгоритма&#039;&#039;&#039; составляет &amp;lt;math&amp;gt;O(3n+k(n^2+n+2n+2n+3n))+O(k^3)&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;k&amp;lt;/math&amp;gt;, сложность алгоритма Ланцоша можно рассматривать &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма с входными и выходными данными можно описать в виде рисунка:&lt;br /&gt;
&lt;br /&gt;
[[File:Ланцош.png|600px|thumb|center|Рисунок 1. Информационный граф алгоритма Ланцоша.&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; — операция деления, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;A&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;L&amp;lt;/math&amp;gt; — операция вычисления линейной комбинации векторов, &amp;lt;br/&amp;gt;&lt;br /&gt;
▽ - проверка условия &amp;lt;math&amp;gt;\mathsf{(\beta_i = 0)}&amp;lt;/math&amp;gt; и выход из цикла в случае выполнения условия]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Внутри каждой итерации алгоритма можно задействовать параллельные вычисления для суммирования векторов (использовать суммирование методом сдваивания элементов). Эта операция будет использована в макрооперации умножения матрицы на вектор, которая требует в последовательной реализации &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сложение. В таком виде сложение &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; элементов можно выполнить за &amp;lt;math&amp;gt;\log_2 n&amp;lt;/math&amp;gt; действий.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Входные данные&#039;&#039;: симметрическая матрица &amp;lt;math&amp;gt;A=A^T&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;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Объем входных данных&#039;&#039;: &amp;lt;math&amp;gt;\frac{n(n+1)}{2} + 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Выходные данные&#039;&#039;: &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;
&#039;&#039;Объем выходных данных&#039;&#039;: &amp;lt;math&amp;gt;kn+k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Сложность последовательной реализации алгоритма &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;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;
** В умножении матрицы на вектор сложение n элементов выполняется в &amp;lt;math&amp;gt;\log_2 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;
* Отношение последовательной сложности  к параллельной &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Вычислительная мощность алгоритма Ланцоша из последовательной сложности алгоритма &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+2k}&amp;lt;/math&amp;gt;. Учитывая &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; много меньше  &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, вычислительная мощность ≈ &amp;lt;math&amp;gt; 2k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* В алгоритме Ланцоша возможно выполнение числа итераций менее &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; если все собственные значения матрицы вычисляются раньше.&lt;br /&gt;
* Для найденных собственных значений справедливо: &amp;lt;math&amp;gt;\lambda_i(T_{k+1})\geq \lambda_i(T_{k})\geq \lambda_{i+1}(T_{k+1})\geq \lambda_{i+1}(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;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;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>Shostix</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:Shostix/%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=21705</id>
		<title>Участник:Shostix/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:Shostix/%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=21705"/>
		<updated>2017-01-24T08:29:28Z</updated>

		<summary type="html">&lt;p&gt;Shostix: &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;
| 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;kn+k&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;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Авторы&#039;&#039;&#039;:&lt;br /&gt;
* [[Участник:Shostix|А.В. Шостик]].&lt;br /&gt;
&lt;br /&gt;
==Свойства и структура алгоритма==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - один из итерационных методов вычисления собственных значений и собственных векторов симметричных матриц (задача &amp;lt;math&amp;gt;Ax = \lambda x&amp;lt;/math&amp;gt;). Используется для работы с матрицами столь большими, что классические численные методы нахождения собственных значений неприменимы из-за высокой вычислительной сложности. На практике чаще всего используется для работы с большими разреженными матрицами.&lt;br /&gt;
&lt;br /&gt;
Алгоритм был предложен в 1950 году венгерским физиком и математиком Корнелием Ланцошем. Основан на понятии построения крыловского подпространства и процедуре Рэлея-Ритца: строит последовательность трехдиагональных матриц с тем свойством, что экстремальные собственные значения для каждой последующей трехдиагональной матрицы дают все более точные оценки экстремальных собственных значений для А. &lt;br /&gt;
&lt;br /&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;
&#039;&#039;Исходные данные&#039;&#039;:&lt;br /&gt;
 &lt;br /&gt;
*   симметрическая матрица &amp;lt;math&amp;gt;A=A^T&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, элементы матрицы &amp;lt;math&amp;gt;a_{ij}=a_{ji}&amp;lt;/math&amp;gt;&lt;br /&gt;
*   начальный вектор &amp;lt;math&amp;gt;v = {v_1, v_2, ..., v_n}, v \neq \theta&amp;lt;/math&amp;gt; &lt;br /&gt;
Так как матрица является симметрической, достаточно хранить &amp;lt;math&amp;gt;\frac{n(n+1)}{2}&amp;lt;/math&amp;gt; ее элементов.&lt;br /&gt;
&lt;br /&gt;
Для исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; строится крыловское подпространство. Крыловское подпространство - это линейная оболочка векторов &amp;lt;math&amp;gt;[v, Av, A^2v, ..., A^{k-1}v]&amp;lt;/math&amp;gt;, называемых векторами Ланцоша.&lt;br /&gt;
Каждый из векторов Ланцоша ортонормируется: &amp;lt;math&amp;gt;q_k=\frac{A^kv}{\|A^kv\|}&amp;lt;/math&amp;gt;, и на шаге &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; алгоритма имеется Крыловская матрица &amp;lt;math&amp;gt;Q = {q_0, ..., q_{k-1}}&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&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;k&amp;lt;/math&amp;gt;-ым приближением собственного вектора исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
В качестве приближенных собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; берутся собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt; (числа Ритца). В качестве алгоритма нахождения собственных векторов и собственных значений симметрической трехдиагональной матрицы будем использовать метод &amp;quot;разделяй и властвуй&amp;quot;, который требует &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций.&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Выходные данные&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* совокупность собственных векторов матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; (т.е. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-ых приближений собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;)&lt;br /&gt;
* совокупность собственных значений матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; (т.е. &amp;lt;math&amp;gt;k&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;
&#039;&#039;&#039;Вычислительное ядро&#039;&#039;&#039;. т.е. часть алгоритма, требующая наибольших вычислительных затрат на каждой итерации состоит из вычисления промежуточного вектора &amp;lt;math&amp;gt;z=Aq_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&#039;&#039;&#039; Итерация алгоритма: &#039;&#039;&#039;&lt;br /&gt;
* вычисление нормы вектора,&lt;br /&gt;
* деление вектора на число,&lt;br /&gt;
* умножение матрицы на вектор,&lt;br /&gt;
* линейная комбинация векторов (умножение на число и сложение).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Финальный расчет: &#039;&#039;&#039;&lt;br /&gt;
* вычисление собственных векторов и собственных значений трехдиагональной симметричной матрицы.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Псевдокод алгоритма&#039;&#039;&amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Вход&#039;&#039;&#039;  : размерность матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, элементы симметричной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, количество итераций &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
 &#039;&#039;&#039;Выход&#039;&#039;&#039; : собственные вектора матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, матрица собственных значений &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
q_1 = &amp;amp; b/ \|b\|_2,\; &lt;br /&gt;
\beta_0 = 0,\; &lt;br /&gt;
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 \\ &lt;br /&gt;
&amp;amp; \; \; \; \; exit\\&lt;br /&gt;
&amp;amp; else \\&lt;br /&gt;
&amp;amp; \; \; \; \; q_{i+1} = 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;
&amp;lt;math&amp;gt;procedure(T_k)&amp;lt;/math&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt;procedure()&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; итераций и финального расчета собственных векторов и собственных значений.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим сложность каждой макрооперации алгоритма:&lt;br /&gt;
* вычисление нормы вектора - &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений, операция извлечения корня&lt;br /&gt;
* деление вектора на число - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций&lt;br /&gt;
* умножение матрицы на вектор - &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций&lt;br /&gt;
* скалярное произведение векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций&lt;br /&gt;
* линейная комбинация векторов - &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений и вычитаний&lt;br /&gt;
* вычисление собственных векторов и собственных значений матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; методом &amp;quot;Разделяй и властвуй&amp;quot;  - &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Инициализация:&#039;&#039;&#039; &lt;br /&gt;
* вычисление нормы вектора,&lt;br /&gt;
* деление вектора на число.&lt;br /&gt;
&#039;&#039;&#039;Одна итерация:&#039;&#039;&#039; &lt;br /&gt;
* умножение матрицы на вектор,&lt;br /&gt;
* скалярное произведение векторов,&lt;br /&gt;
* линейная комбинация векторов,&lt;br /&gt;
* вычисление нормы вектора,&lt;br /&gt;
* деление вектора на число.&lt;br /&gt;
&#039;&#039;&#039;Финальный расчет:&#039;&#039;&#039;&lt;br /&gt;
* вычисление собственных векторов и собственных значений матрицы&lt;br /&gt;
&lt;br /&gt;
Итого &#039;&#039;&#039;последовательная сложность алгоритма&#039;&#039;&#039; составляет &amp;lt;math&amp;gt;O(3n+k(n^2+n+2n+2n+3n))+O(k^3)&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;k&amp;lt;/math&amp;gt;, сложность алгоритма Ланцоша можно рассматривать &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма с входными и выходными данными можно описать в виде рисунка:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ланцош.png|600px|thumb|center|Рисунок 1. Информационный граф алгоритма Ланцоша.&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; — операция деления, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;A&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;L&amp;lt;/math&amp;gt; — операция вычисления линейной комбинации векторов, &amp;lt;br/&amp;gt;&lt;br /&gt;
▽ - проверка условия &amp;lt;math&amp;gt;\mathsf{(\beta_i = 0)}&amp;lt;/math&amp;gt; и выход из цикла в случае выполнения условия]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Внутри каждой итерации алгоритма можно задействовать параллельные вычисления для суммирования векторов (использовать суммирование методом сдваивания элементов). Эта операция будет использована в макрооперации умножения матрицы на вектор, которая требует в последовательной реализации &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сложение. В таком виде сложение &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; элементов можно выполнить за &amp;lt;math&amp;gt;\log_2 n&amp;lt;/math&amp;gt; действий.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Входные данные&#039;&#039;: симметрическая матрица &amp;lt;math&amp;gt;A=A^T&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;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Объем входных данных&#039;&#039;: &amp;lt;math&amp;gt;\frac{n(n+1)}{2} + 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Выходные данные&#039;&#039;: &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;
&#039;&#039;Объем выходных данных&#039;&#039;: &amp;lt;math&amp;gt;kn+k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Сложность последовательной реализации алгоритма &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;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;
** В умножении матрицы на вектор сложение n элементов выполняется в &amp;lt;math&amp;gt;\log_2 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;
* Отношение последовательной сложности  к параллельной &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Вычислительная мощность алгоритма Ланцоша из последовательной сложности алгоритма &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+2k}&amp;lt;/math&amp;gt;. Учитывая &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; много меньше  &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, вычислительная мощность ≈ &amp;lt;math&amp;gt; 2k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* В алгоритме Ланцоша возможно выполнение числа итераций менее &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; если все собственные значения матрицы вычисляются раньше.&lt;br /&gt;
* Для найденных собственных значений справедливо: &amp;lt;math&amp;gt;\lambda_i(T_{k+1})\geq \lambda_i(T_{k})\geq \lambda_{i+1}(T_{k+1})\geq \lambda_{i+1}(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;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;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>Shostix</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:Shostix/%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=21559</id>
		<title>Участник:Shostix/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:Shostix/%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=21559"/>
		<updated>2017-01-19T00:52:52Z</updated>

		<summary type="html">&lt;p&gt;Shostix: &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;
| input_data        = &amp;lt;math&amp;gt;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;
| 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;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Авторы&#039;&#039;&#039;:&lt;br /&gt;
* [[Участник:Shostix|А.В. Шостик]].&lt;br /&gt;
&lt;br /&gt;
==Свойства и структура алгоритма==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - один из итерационных методов вычисления собственных значений симметричных матриц. Используется для работы с матрицами столь большими, что классические численные методы нахождения собственных значений наприменимы из-за высокой вычислительной сложности.&lt;br /&gt;
&lt;br /&gt;
Алгоритм был предложен в 1950 году венгерским физиком и математиком Корнелием Ланцошем. Основан на методе Ланцоша для построения крыловского подпространства и процедуре Рэлея-Ритца.&lt;br /&gt;
&lt;br /&gt;
В данной статье будет рассмотрен простой метод Ланцоша (без ортогонализации). Он не является устойчивым к влиянию ошибок округления, в отличие от своих модификаций - алгоритма Ланцоша с выборочной ортогонализацией и полной ортогонализацией. На практике часто применяется алгоритм Ланцоша с полной ортогонализацией, предложенный в 1970 году. Он является оптимальным по точности вычислений, хоть и наиболее дорогостоящим алгоритмом из указанных.&lt;br /&gt;
&lt;br /&gt;
Для наименее дорогостоящего в вычислениях алгоритма Ланцоша без ортогонализации будем подразумевать отсутствие влияния ошибок округления на вычислительный процесс. &lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;/div&gt;</summary>
		<author><name>Shostix</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:Shostix/%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=21558</id>
		<title>Участник:Shostix/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:Shostix/%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=21558"/>
		<updated>2017-01-19T00:48:45Z</updated>

		<summary type="html">&lt;p&gt;Shostix: &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;
| input_data        = &amp;lt;math&amp;gt;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;
| 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;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Авторы&#039;&#039;&#039;:&lt;br /&gt;
* [[Участник:Shostix|А.В. Шостик]].&lt;br /&gt;
&lt;br /&gt;
==Свойства и структура алгоритма==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - один из итерационных методов вычисления собственных значений симметричных матриц. Используется для работы с матрицами столь большими, что классические численные методы нахождения собственных значений наприменимы из-за высокой вычислительной сложности.&lt;br /&gt;
&lt;br /&gt;
Алгоритм был предложен в 1950 году венгерским физиком и математиком Корнелием Ланцошем. Основан на методе Ланцоша для построения крыловского подпространства и процедуре Рэлея-Ритца.&lt;br /&gt;
&lt;br /&gt;
В данной статье будет рассмотрен простой метод Ланцоша (без ортогонализации). Он не является устойчивым к влиянию ошибок округления, в отличие от своих модификаций - алгоритма Ланцоша с выборочной ортогонализацией и полной ортогонализацией. На практике часто применяется алгоритм Ланцоша с полной ортогонализацией, предложенный в 1970 году. Он является оптимальным по точности вычислений, хоть и наиболее дорогостоящим алгоритмом из указанных.&lt;br /&gt;
&lt;br /&gt;
Для наименее дорогостоящего в вычислениях алгоритма Ланцоша без ортогонализации будем подразумевать отсутствие влияния ошибок округления на вычислительный процесс. &lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Исходные данные&#039;&#039;:&lt;/div&gt;</summary>
		<author><name>Shostix</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:Shostix/%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=21557</id>
		<title>Участник:Shostix/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:Shostix/%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=21557"/>
		<updated>2017-01-19T00:08:43Z</updated>

		<summary type="html">&lt;p&gt;Shostix: &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;
| input_data = &amp;lt;math&amp;gt;n&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;
| 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;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Авторы&#039;&#039;&#039;:&lt;br /&gt;
* [[Участник:Shostix|А.В. Шостик]].&lt;br /&gt;
&lt;br /&gt;
==Свойства и структура алгоритма==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - один из итерационных методов вычисления собственных значений симметричных матриц. Используется для работы с матрицами столь большими, что классические численные методы нахождения собственных значений наприменимы из-за высокой вычислительной сложности.&lt;br /&gt;
&lt;br /&gt;
Алгоритм был предложен в 1950 году венгерским физиком и математиком Корнелием Ланцошем. Основан на методе Ланцоша для построения крыловского подпространства и процедуре Рэлея-Ритца.&lt;br /&gt;
&lt;br /&gt;
В данной статье будет рассмотрен простой метод Ланцоша (без ортогонализации). Он не является устойчивым к влиянию ошибок округления, в отличие от своих модификаций - алгоритма Ланцоша с выборочной ортогонализацией и полной ортогонализацией. На практике часто применяется алгоритм Ланцоша с полной ортогонализацией, предложенный в 1970 году. Он является оптимальным по точности вычислений, хоть и наиболее дорогостоящим алгоритмом из указанных.&lt;br /&gt;
&lt;br /&gt;
Для наименее дорогостоящего в вычислениях алгоритма Ланцоша без ортогонализации будем подразумевать отсутствие влияния ошибок округления на вычислительный процесс. &lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;/div&gt;</summary>
		<author><name>Shostix</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:Shostix/%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=21556</id>
		<title>Участник:Shostix/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:Shostix/%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=21556"/>
		<updated>2017-01-18T23:50:17Z</updated>

		<summary type="html">&lt;p&gt;Shostix: &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;
| input_data = &amp;lt;math&amp;gt;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;
| 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;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Авторы&#039;&#039;&#039;:&lt;br /&gt;
* [[Участник:Shostix|А.В. Шостик]].&lt;br /&gt;
&lt;br /&gt;
==Свойства и структура алгоритма==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - один из итерационных методов вычисления собственных значений симметричных матриц. Используется для работы с матрицами столь большими, что классические численные методы нахождения собственных значений наприменимы из-за высокой вычислительной сложности.&lt;br /&gt;
&lt;br /&gt;
Алгоритм был предложен в 1950 году венгерским физиком и математиком Корнелием Ланцошем. Основан на методе Ланцоша для построения крыловского подпространства и процедуре Рэлея-Ритца.&lt;br /&gt;
&lt;br /&gt;
В данной статье будет рассмотрен простой метод Ланцоша (без ортогонализации). Он не является устойчивым к влиянию ошибок округления, в отличие от своих модификаций - алгоритма Ланцоша с выборочной ортогонализацией и полной ортогонализацией. На практике часто применяется алгоритм Ланцоша с полной ортогонализацией, предложенный в 1970 году. Он является оптимальным по точности вычислений, хоть и наиболее дорогостоящим алгоритмом из указанных.&lt;br /&gt;
&lt;br /&gt;
Для наименее дорогостоящего в вычислениях алгоритма Ланцоша без ортогонализации будем подразумевать отсутствие влияния ошибок округления на вычислительный процесс. &lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;/div&gt;</summary>
		<author><name>Shostix</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:Shostix/%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=21555</id>
		<title>Участник:Shostix/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:Shostix/%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=21555"/>
		<updated>2017-01-18T23:44:15Z</updated>

		<summary type="html">&lt;p&gt;Shostix: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Свойства и структура алгоритма==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;/div&gt;</summary>
		<author><name>Shostix</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:Shostix/%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=21554</id>
		<title>Участник:Shostix/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:Shostix/%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=21554"/>
		<updated>2017-01-18T23:38:13Z</updated>

		<summary type="html">&lt;p&gt;Shostix: Новая страница: «{{algorithm | name = Алгоритм Ланцоша для точной арифметики (без ортогонализации) | serial_complexity = &amp;lt;math&amp;gt;…»&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;
| input_data = &amp;lt;math&amp;gt;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;
| 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;
}}&lt;/div&gt;</summary>
		<author><name>Shostix</name></author>
	</entry>
</feed>