<?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=Error0x0</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=Error0x0"/>
	<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/Error0x0"/>
	<updated>2026-10-22T19:06:41Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Error0x0&amp;diff=22127</id>
		<title>Обсуждение участника:Error0x0</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Error0x0&amp;diff=22127"/>
		<updated>2017-02-03T19:47:11Z</updated>

		<summary type="html">&lt;p&gt;Error0x0: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Участник:Error0x0/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией]] ==&lt;br /&gt;
&lt;br /&gt;
* В разделе 1.3 не приведено описание вычислительного ядра&lt;br /&gt;
* Не указано ФИО автора&lt;br /&gt;
* Не приведена краткая сводка свойств алгоритма в начале статьи&lt;br /&gt;
&lt;br /&gt;
Добавил.&lt;br /&gt;
&lt;br /&gt;
* В разделе 1.4 требуется привести описание алгоритма на верхнем уровне (на основе макроопераций). [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:35, 1 ноября 2016 (MSK)&lt;br /&gt;
* В разделе 1.5 кроме кода нужны также текстовые пояснения. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:35, 1 ноября 2016 (MSK)&lt;br /&gt;
* В разделе 1.10 должна быть оценка вычислительной мощности алгоритма. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:35, 1 ноября 2016 (MSK)&lt;br /&gt;
* Не заполнен раздел 2.4 описания. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:44, 16 ноября 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
Пункты 1.4, 1.5, 1.10 исправлены, пункт 2.4 добавлен&lt;br /&gt;
* В разделе 1.4 должно быть не перечисление макроопераций, а нужно показать структуру алгоритма на макроуровне. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:10, 3 февраля 2017 (MSK)&lt;br /&gt;
* Граф, приведённый в разделе 1.7, не является информационным графом (направленный ациклический граф, вершины - операции, дуги - информационные зависимости). [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:10, 3 февраля 2017 (MSK)&lt;br /&gt;
* В разделе 2.4 не приведены все параметры запуска теста - например, с какими опциями проводилась компиляция. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:10, 3 февраля 2017 (MSK) &lt;br /&gt;
* Из графиков в разделе 2.4 следует сделать выводы о масштабируемости реализации. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:10, 3 февраля 2017 (MSK)&lt;br /&gt;
&lt;br /&gt;
Исправлено.&lt;/div&gt;</summary>
		<author><name>Error0x0</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=22126</id>
		<title>Участник:Error0x0/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=22126"/>
		<updated>2017-02-03T19:46:45Z</updated>

		<summary type="html">&lt;p&gt;Error0x0: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{assignment}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(k^2 n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log k \log n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор описания: [[Участник:Error0x0|В. А. Янушковский]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша представляет собой итерационный алгоритм для вычисления собственных значений симметрической матрицы. &lt;br /&gt;
Идея алгоритма заключается в построении матрицы &amp;lt;math&amp;gt;Q_k = [q_1, ..., q_k]&amp;lt;/math&amp;gt; из ортонормированных векторов Ланцоша и использовании собственных значений трёхдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; (чисел Ритца) как приближения к искомым собственным числам матрицы&amp;lt;ref name=&amp;quot;Деммель&amp;quot;&amp;gt;Деммель&amp;amp;nbsp;Дж. Вычислительная линейная алгебра&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;q_1 = b/||b||_2, \beta_0=0, q_0=0&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;z = Aq_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# производится переортогонализация &amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1} {(z^T q_i)q_i}&amp;lt;/math&amp;gt;,&lt;br /&gt;
# &amp;lt;math&amp;gt;\beta_j = ||z||_2&amp;lt;/math&amp;gt;, если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt;, алгоритм останавливается,&lt;br /&gt;
# &amp;lt;math&amp;gt;q_{j+1} = z/\beta_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# вычисляются собственные значения и векторы матрицы &amp;lt;math&amp;gt;T_j = Q_j^T A Q_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Основной вклад в сложность алгоритма даёт полная переортогонализация внутри каждой итерации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1} {(z^T q_i)q_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Алгоритм имеет следующую макроструктуру:&lt;br /&gt;
* Начальная инициализация (деление вектора на норму &amp;lt;math&amp;gt;q_1 = b/||b||_2&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;z = Aq_j&amp;lt;/math&amp;gt;)&lt;br /&gt;
** Переортогонализация &amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1} {(z^T q_i)q_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
** Нахождение следующего вектора &amp;lt;math&amp;gt;q_{j+1} = z/\beta_j&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\beta_j = ||z||_2&amp;lt;/math&amp;gt;&lt;br /&gt;
** Нахождение следующего собственного значения и вектора матрицы &amp;lt;math&amp;gt;T_j = Q_j^T A Q_j&amp;lt;/math&amp;gt; (числа Ритца, используется метод &amp;quot;разделяй и властвуй&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
beta[0] = 0 # инициализация&lt;br /&gt;
q[0] = 0&lt;br /&gt;
q[1] = b / norm(b) # вычисление первого столбца&lt;br /&gt;
for j in [1 .. k]: # k итераций&lt;br /&gt;
    z = mul(A, q[j]) # вектор Ланцоша как произведение матрицы A на столбец q[j]&lt;br /&gt;
    alpha[j] = scalar_mul(q[j], z) # вычисление alpha[j]&lt;br /&gt;
    for i in [1 .. j - 1]: # полная переортогонализация&lt;br /&gt;
        z -= scalar_mul(z, q[i]) * q[i]&lt;br /&gt;
    beta[j] = norm(z) # вычисление нормы z&lt;br /&gt;
    if beta[j] == 0: # останов, если норма z равна нулю&lt;br /&gt;
        break&lt;br /&gt;
    result.append(next_ritz_number(alpha, beta, j)) # вычисление следующего собственного значения и вектора матрицы Tj&lt;br /&gt;
return result&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основной вклад в сложность даёт полная переортогонализация: на каждой из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций для всех &amp;lt;math&amp;gt;i \in [0...j-1]&amp;lt;/math&amp;gt; выполняется &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; сложений, итого &amp;lt;math&amp;gt;\frac{k(k-1)}{2} 4n \approx 2k^2 n&amp;lt;/math&amp;gt;. &lt;br /&gt;
Таким образом, для метода с полной переортогонализацией сложность составляет &amp;lt;math&amp;gt;O(k^2 n)&amp;lt;/math&amp;gt;, сложность по памяти -- &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
На рисунке приведён информационный граф одной итерации алгоритма&lt;br /&gt;
[[File:Lanczos graph.png|thumb|center|800px|Рисунок 1. Информационный граф итерации алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Для процесса переортогонализации возможна параллельная оптимизация в двух местах:&lt;br /&gt;
* Итерации внутреннего цикла могут вычисляться параллельно, однако, требуется суммирование вычитаемых векторов, соответственно, сложность переортогонализации можно снизить с &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(n \log k)&amp;lt;/math&amp;gt;&lt;br /&gt;
* В каждой итерации внутреннего цикла возможно распараллеливание вычисления выражения справа (скалярное произведение и умножение вектора на число), что теоретически позволяет снизить сложность итерации с &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данны&#039;&#039;&#039;е: квадратная симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: собственные числа матрицы&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Полная переортогонализация соответствует повторной процедуре ортогонализациии Грама-Шмидта для обеспечения ортогональности вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; векторам &amp;lt;math&amp;gt;q_1, ..., q_k&amp;lt;/math&amp;gt;. В случае идеально точной арифметики данная переортогонализация не требовалась бы, однако в реальных вычислениях ошибки округления приводят к потере ортогональности, в связи с чем требуется переортогонализация.&lt;br /&gt;
Однако, единственной проблемой, возникающей при отсутствии переортогонализации, является появление повторных копий чисел Ритца (собственных значений), что в случае, если не требуется установление кратностей собственных значений, допустимо.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма примерно равна &amp;lt;math&amp;gt;2k^2 / n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Исследование масштабируемости алгоритма проводилось на суперкомпьютере IBM Blue Gene/P ВМК МГУ.&lt;br /&gt;
&lt;br /&gt;
Алгоритм тестировался на следующих параметрах:&lt;br /&gt;
* размер входной матрицы: 2048-8192 с шагом 512&lt;br /&gt;
* число узлов: 1-256     &lt;br /&gt;
&lt;br /&gt;
Зависимость времени выполнения от параметров изображена на графике:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lanczos full chart.png|center|border |800px]]&lt;br /&gt;
Из рисунка видно, что алгоритм хорошо масштабируется, время выполнения на одном ядре растёт существенно быстрее чем на множестве ядер. При этом, для маленькой матрице на большом числе ядер прирост эффективности практически отсутствует.&lt;br /&gt;
&lt;br /&gt;
[http://pastebin.com/u7KThy6D  Используемая реализация алгоритма на языке C++]&lt;br /&gt;
&lt;br /&gt;
Пример компиляции и запуска:&lt;br /&gt;
  $ mpixlcxx_r -o lanczos lanczos.cpp&lt;br /&gt;
  $ mpisubmit.bg -n 256 -w 00:5:00 lanczos&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Библиотека [http://www.nag.co.uk/numeric/fl/nagdoc_fl23/html/INDEXES/KWIC/lanczos.html NAG Library] содержит ряд процедур для решения СЛАУ и поиска собственных значений на основе алгоритма Ланцоша.&lt;br /&gt;
&lt;br /&gt;
[http://www.mathworks.com/help/techdoc/ref/eigs.html MATLAB] и [https://www.gnu.org/software/octave/doc/interpreter/Sparse-Linear-Algebra.html#doc_002deigs GNU Octave] позволяют с помощью функции &#039;&#039;eigs()&#039;&#039; находить собственные значения на основе данного алгоритма.&lt;br /&gt;
&lt;br /&gt;
Matlab-реализация доступна как часть [http://www.cs.cmu.edu/~bickson/gabp/#download Gaussian Belief Propagation Matlab Package]. [http://www.graphlab.ml.cmu.edu/pmf.html GraphLab] содержит несколько параллельных реализаций алгоритма на C++.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>Error0x0</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=22125</id>
		<title>Участник:Error0x0/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=22125"/>
		<updated>2017-02-03T19:46:15Z</updated>

		<summary type="html">&lt;p&gt;Error0x0: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(k^2 n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log k \log n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор описания: [[Участник:Error0x0|В. А. Янушковский]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша представляет собой итерационный алгоритм для вычисления собственных значений симметрической матрицы. &lt;br /&gt;
Идея алгоритма заключается в построении матрицы &amp;lt;math&amp;gt;Q_k = [q_1, ..., q_k]&amp;lt;/math&amp;gt; из ортонормированных векторов Ланцоша и использовании собственных значений трёхдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; (чисел Ритца) как приближения к искомым собственным числам матрицы&amp;lt;ref name=&amp;quot;Деммель&amp;quot;&amp;gt;Деммель&amp;amp;nbsp;Дж. Вычислительная линейная алгебра&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;q_1 = b/||b||_2, \beta_0=0, q_0=0&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;z = Aq_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# производится переортогонализация &amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1} {(z^T q_i)q_i}&amp;lt;/math&amp;gt;,&lt;br /&gt;
# &amp;lt;math&amp;gt;\beta_j = ||z||_2&amp;lt;/math&amp;gt;, если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt;, алгоритм останавливается,&lt;br /&gt;
# &amp;lt;math&amp;gt;q_{j+1} = z/\beta_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# вычисляются собственные значения и векторы матрицы &amp;lt;math&amp;gt;T_j = Q_j^T A Q_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Основной вклад в сложность алгоритма даёт полная переортогонализация внутри каждой итерации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1} {(z^T q_i)q_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Алгоритм имеет следующую макроструктуру:&lt;br /&gt;
* Начальная инициализация (деление вектора на норму &amp;lt;math&amp;gt;q_1 = b/||b||_2&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;z = Aq_j&amp;lt;/math&amp;gt;)&lt;br /&gt;
** Переортогонализация &amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1} {(z^T q_i)q_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
** Нахождение следующего вектора &amp;lt;math&amp;gt;q_{j+1} = z/\beta_j&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\beta_j = ||z||_2&amp;lt;/math&amp;gt;&lt;br /&gt;
** Нахождение следующего собственного значения и вектора матрицы &amp;lt;math&amp;gt;T_j = Q_j^T A Q_j&amp;lt;/math&amp;gt; (числа Ритца, используется метод &amp;quot;разделяй и властвуй&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
beta[0] = 0 # инициализация&lt;br /&gt;
q[0] = 0&lt;br /&gt;
q[1] = b / norm(b) # вычисление первого столбца&lt;br /&gt;
for j in [1 .. k]: # k итераций&lt;br /&gt;
    z = mul(A, q[j]) # вектор Ланцоша как произведение матрицы A на столбец q[j]&lt;br /&gt;
    alpha[j] = scalar_mul(q[j], z) # вычисление alpha[j]&lt;br /&gt;
    for i in [1 .. j - 1]: # полная переортогонализация&lt;br /&gt;
        z -= scalar_mul(z, q[i]) * q[i]&lt;br /&gt;
    beta[j] = norm(z) # вычисление нормы z&lt;br /&gt;
    if beta[j] == 0: # останов, если норма z равна нулю&lt;br /&gt;
        break&lt;br /&gt;
    result.append(next_ritz_number(alpha, beta, j)) # вычисление следующего собственного значения и вектора матрицы Tj&lt;br /&gt;
return result&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основной вклад в сложность даёт полная переортогонализация: на каждой из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций для всех &amp;lt;math&amp;gt;i \in [0...j-1]&amp;lt;/math&amp;gt; выполняется &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; сложений, итого &amp;lt;math&amp;gt;\frac{k(k-1)}{2} 4n \approx 2k^2 n&amp;lt;/math&amp;gt;. &lt;br /&gt;
Таким образом, для метода с полной переортогонализацией сложность составляет &amp;lt;math&amp;gt;O(k^2 n)&amp;lt;/math&amp;gt;, сложность по памяти -- &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
На рисунке приведён информационный граф одной итерации алгоритма&lt;br /&gt;
[[File:Lanczos graph.png|thumb|center|800px|Рисунок 1. Информационный граф итерации алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Для процесса переортогонализации возможна параллельная оптимизация в двух местах:&lt;br /&gt;
* Итерации внутреннего цикла могут вычисляться параллельно, однако, требуется суммирование вычитаемых векторов, соответственно, сложность переортогонализации можно снизить с &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(n \log k)&amp;lt;/math&amp;gt;&lt;br /&gt;
* В каждой итерации внутреннего цикла возможно распараллеливание вычисления выражения справа (скалярное произведение и умножение вектора на число), что теоретически позволяет снизить сложность итерации с &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данны&#039;&#039;&#039;е: квадратная симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: собственные числа матрицы&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Полная переортогонализация соответствует повторной процедуре ортогонализациии Грама-Шмидта для обеспечения ортогональности вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; векторам &amp;lt;math&amp;gt;q_1, ..., q_k&amp;lt;/math&amp;gt;. В случае идеально точной арифметики данная переортогонализация не требовалась бы, однако в реальных вычислениях ошибки округления приводят к потере ортогональности, в связи с чем требуется переортогонализация.&lt;br /&gt;
Однако, единственной проблемой, возникающей при отсутствии переортогонализации, является появление повторных копий чисел Ритца (собственных значений), что в случае, если не требуется установление кратностей собственных значений, допустимо.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма примерно равна &amp;lt;math&amp;gt;2k^2 / n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Исследование масштабируемости алгоритма проводилось на суперкомпьютере IBM Blue Gene/P ВМК МГУ.&lt;br /&gt;
&lt;br /&gt;
Алгоритм тестировался на следующих параметрах:&lt;br /&gt;
* размер входной матрицы: 2048-8192 с шагом 512&lt;br /&gt;
* число узлов: 1-256     &lt;br /&gt;
&lt;br /&gt;
Зависимость времени выполнения от параметров изображена на графике:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lanczos full chart.png|center|border |800px]]&lt;br /&gt;
Из рисунка видно, что алгоритм хорошо масштабируется, время выполнения на одном ядре растёт существенно быстрее чем на множестве ядер. При этом, для маленькой матрице на большом числе ядер прирост эффективности практически отсутствует.&lt;br /&gt;
&lt;br /&gt;
[http://pastebin.com/u7KThy6D  Используемая реализация алгоритма на языке C++]&lt;br /&gt;
&lt;br /&gt;
Пример компиляции и запуска:&lt;br /&gt;
  $ mpixlcxx_r -o lanczos lanczos.cpp&lt;br /&gt;
  $ mpisubmit.bg -n 256 -w 00:5:00 lanczos&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Библиотека [http://www.nag.co.uk/numeric/fl/nagdoc_fl23/html/INDEXES/KWIC/lanczos.html NAG Library] содержит ряд процедур для решения СЛАУ и поиска собственных значений на основе алгоритма Ланцоша.&lt;br /&gt;
&lt;br /&gt;
[http://www.mathworks.com/help/techdoc/ref/eigs.html MATLAB] и [https://www.gnu.org/software/octave/doc/interpreter/Sparse-Linear-Algebra.html#doc_002deigs GNU Octave] позволяют с помощью функции &#039;&#039;eigs()&#039;&#039; находить собственные значения на основе данного алгоритма.&lt;br /&gt;
&lt;br /&gt;
Matlab-реализация доступна как часть [http://www.cs.cmu.edu/~bickson/gabp/#download Gaussian Belief Propagation Matlab Package]. [http://www.graphlab.ml.cmu.edu/pmf.html GraphLab] содержит несколько параллельных реализаций алгоритма на C++.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>Error0x0</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=22124</id>
		<title>Участник:Error0x0/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=22124"/>
		<updated>2017-02-03T19:41:25Z</updated>

		<summary type="html">&lt;p&gt;Error0x0: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(k^2 n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log k \log n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор описания: [[Участник:Error0x0|В. А. Янушковский]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша представляет собой итерационный алгоритм для вычисления собственных значений симметрической матрицы. &lt;br /&gt;
Идея алгоритма заключается в построении матрицы &amp;lt;math&amp;gt;Q_k = [q_1, ..., q_k]&amp;lt;/math&amp;gt; из ортонормированных векторов Ланцоша и использовании собственных значений трёхдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; (чисел Ритца) как приближения к искомым собственным числам матрицы&amp;lt;ref name=&amp;quot;Деммель&amp;quot;&amp;gt;Деммель&amp;amp;nbsp;Дж. Вычислительная линейная алгебра&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;q_1 = b/||b||_2, \beta_0=0, q_0=0&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;z = Aq_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# производится переортогонализация &amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1} {(z^T q_i)q_i}&amp;lt;/math&amp;gt;,&lt;br /&gt;
# &amp;lt;math&amp;gt;\beta_j = ||z||_2&amp;lt;/math&amp;gt;, если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt;, алгоритм останавливается,&lt;br /&gt;
# &amp;lt;math&amp;gt;q_{j+1} = z/\beta_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# вычисляются собственные значения и векторы матрицы &amp;lt;math&amp;gt;T_j = Q_j^T A Q_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Основной вклад в сложность алгоритма даёт полная переортогонализация внутри каждой итерации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1} {(z^T q_i)q_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Алгоритм имеет следующую макроструктуру:&lt;br /&gt;
* Начальная инициализация (деление вектора на норму &amp;lt;math&amp;gt;q_1 = b/||b||_2&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;z = Aq_j&amp;lt;/math&amp;gt;)&lt;br /&gt;
** Переортогонализация &amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1} {(z^T q_i)q_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
** Нахождение следующего вектора &amp;lt;math&amp;gt;q_{j+1} = z/\beta_j&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\beta_j = ||z||_2&amp;lt;/math&amp;gt;&lt;br /&gt;
** Нахождение следующего собственного значения и вектора матрицы &amp;lt;math&amp;gt;T_j = Q_j^T A Q_j&amp;lt;/math&amp;gt; (числа Ритца, используется метод &amp;quot;разделяй и властвуй&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
beta[0] = 0 # инициализация&lt;br /&gt;
q[0] = 0&lt;br /&gt;
q[1] = b / norm(b) # вычисление первого столбца&lt;br /&gt;
for j in [1 .. k]: # k итераций&lt;br /&gt;
    z = mul(A, q[j]) # вектор Ланцоша как произведение матрицы A на столбец q[j]&lt;br /&gt;
    alpha[j] = scalar_mul(q[j], z) # вычисление alpha[j]&lt;br /&gt;
    for i in [1 .. j - 1]: # полная переортогонализация&lt;br /&gt;
        z -= scalar_mul(z, q[i]) * q[i]&lt;br /&gt;
    beta[j] = norm(z) # вычисление нормы z&lt;br /&gt;
    if beta[j] == 0: # останов, если норма z равна нулю&lt;br /&gt;
        break&lt;br /&gt;
    result.append(next_ritz_number(alpha, beta, j)) # вычисление следующего собственного значения и вектора матрицы Tj&lt;br /&gt;
return result&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основной вклад в сложность даёт полная переортогонализация: на каждой из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций для всех &amp;lt;math&amp;gt;i \in [0...j-1]&amp;lt;/math&amp;gt; выполняется &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; сложений, итого &amp;lt;math&amp;gt;\frac{k(k-1)}{2} 4n \approx 2k^2 n&amp;lt;/math&amp;gt;. &lt;br /&gt;
Таким образом, для метода с полной переортогонализацией сложность составляет &amp;lt;math&amp;gt;O(k^2 n)&amp;lt;/math&amp;gt;, сложность по памяти -- &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
На рисунке приведён информационный граф одной итерации алгоритма&lt;br /&gt;
[[File:Lanczos graph.png|thumb|center|800px|Рисунок 1. Информационный граф итерации алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Для процесса переортогонализации возможна параллельная оптимизация в двух местах:&lt;br /&gt;
* Итерации внутреннего цикла могут вычисляться параллельно, однако, требуется суммирование вычитаемых векторов, соответственно, сложность переортогонализации можно снизить с &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(n \log k)&amp;lt;/math&amp;gt;&lt;br /&gt;
* В каждой итерации внутреннего цикла возможно распараллеливание вычисления выражения справа (скалярное произведение и умножение вектора на число), что теоретически позволяет снизить сложность итерации с &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данны&#039;&#039;&#039;е: квадратная симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: собственные числа матрицы&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Полная переортогонализация соответствует повторной процедуре ортогонализациии Грама-Шмидта для обеспечения ортогональности вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; векторам &amp;lt;math&amp;gt;q_1, ..., q_k&amp;lt;/math&amp;gt;. В случае идеально точной арифметики данная переортогонализация не требовалась бы, однако в реальных вычислениях ошибки округления приводят к потере ортогональности, в связи с чем требуется переортогонализация.&lt;br /&gt;
Однако, единственной проблемой, возникающей при отсутствии переортогонализации, является появление повторных копий чисел Ритца (собственных значений), что в случае, если не требуется установление кратностей собственных значений, допустимо.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма примерно равна &amp;lt;math&amp;gt;2k^2 / n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Исследование масштабируемости алгоритма проводилось на суперкомпьютере IBM Blue Gene/P ВМК МГУ.&lt;br /&gt;
&lt;br /&gt;
Алгоритм тестировался на следующих параметрах:&lt;br /&gt;
* размер входной матрицы: 2048-8192 с шагом 512&lt;br /&gt;
* число узлов: 1-256     &lt;br /&gt;
&lt;br /&gt;
Зависимость времени выполнения от параметров изображена на графике:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lanczos full chart.png|center|border |800px]]&lt;br /&gt;
Из рисунка видно, что &lt;br /&gt;
&lt;br /&gt;
[http://pastebin.com/u7KThy6D  Используемая реализация алгоритма на языке C++]&lt;br /&gt;
&lt;br /&gt;
Пример компиляции и запуска:&lt;br /&gt;
  $ mpixlcxx_r -o lanczos lanczos.cpp&lt;br /&gt;
  $ mpisubmit.bg -n 256 -w 00:5:00 lanczos&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Библиотека [http://www.nag.co.uk/numeric/fl/nagdoc_fl23/html/INDEXES/KWIC/lanczos.html NAG Library] содержит ряд процедур для решения СЛАУ и поиска собственных значений на основе алгоритма Ланцоша.&lt;br /&gt;
&lt;br /&gt;
[http://www.mathworks.com/help/techdoc/ref/eigs.html MATLAB] и [https://www.gnu.org/software/octave/doc/interpreter/Sparse-Linear-Algebra.html#doc_002deigs GNU Octave] позволяют с помощью функции &#039;&#039;eigs()&#039;&#039; находить собственные значения на основе данного алгоритма.&lt;br /&gt;
&lt;br /&gt;
Matlab-реализация доступна как часть [http://www.cs.cmu.edu/~bickson/gabp/#download Gaussian Belief Propagation Matlab Package]. [http://www.graphlab.ml.cmu.edu/pmf.html GraphLab] содержит несколько параллельных реализаций алгоритма на C++.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>Error0x0</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=22123</id>
		<title>Участник:Error0x0/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=22123"/>
		<updated>2017-02-03T18:39:14Z</updated>

		<summary type="html">&lt;p&gt;Error0x0: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(k^2 n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log k \log n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор описания: [[Участник:Error0x0|В. А. Янушковский]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша представляет собой итерационный алгоритм для вычисления собственных значений симметрической матрицы. &lt;br /&gt;
Идея алгоритма заключается в построении матрицы &amp;lt;math&amp;gt;Q_k = [q_1, ..., q_k]&amp;lt;/math&amp;gt; из ортонормированных векторов Ланцоша и использовании собственных значений трёхдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; (чисел Ритца) как приближения к искомым собственным числам матрицы&amp;lt;ref name=&amp;quot;Деммель&amp;quot;&amp;gt;Деммель&amp;amp;nbsp;Дж. Вычислительная линейная алгебра&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;q_1 = b/||b||_2, \beta_0=0, q_0=0&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;z = Aq_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# производится переортогонализация &amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1} {(z^T q_i)q_i}&amp;lt;/math&amp;gt;,&lt;br /&gt;
# &amp;lt;math&amp;gt;\beta_j = ||z||_2&amp;lt;/math&amp;gt;, если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt;, алгоритм останавливается,&lt;br /&gt;
# &amp;lt;math&amp;gt;q_{j+1} = z/\beta_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# вычисляются собственные значения и векторы матрицы &amp;lt;math&amp;gt;T_j = Q_j^T A Q_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Основной вклад в сложность алгоритма даёт полная переортогонализация внутри каждой итерации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1} {(z^T q_i)q_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Алгоритм имеет следующую макроструктуру:&lt;br /&gt;
* Начальная инициализация (деление вектора на норму &amp;lt;math&amp;gt;q_1 = b/||b||_2&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;z = Aq_j&amp;lt;/math&amp;gt;)&lt;br /&gt;
** Переортогонализация &amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1} {(z^T q_i)q_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
** Нахождение следующего вектора &amp;lt;math&amp;gt;q_{j+1} = z/\beta_j&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\beta_j = ||z||_2&amp;lt;/math&amp;gt;&lt;br /&gt;
** Нахождение следующего собственного значения и вектора матрицы &amp;lt;math&amp;gt;T_j = Q_j^T A Q_j&amp;lt;/math&amp;gt; (числа Ритца, используется метод &amp;quot;разделяй и властвуй&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
beta[0] = 0 # инициализация&lt;br /&gt;
q[0] = 0&lt;br /&gt;
q[1] = b / norm(b) # вычисление первого столбца&lt;br /&gt;
for j in [1 .. k]: # k итераций&lt;br /&gt;
    z = mul(A, q[j]) # вектор Ланцоша как произведение матрицы A на столбец q[j]&lt;br /&gt;
    alpha[j] = scalar_mul(q[j], z) # вычисление alpha[j]&lt;br /&gt;
    for i in [1 .. j - 1]: # полная переортогонализация&lt;br /&gt;
        z -= scalar_mul(z, q[i]) * q[i]&lt;br /&gt;
    beta[j] = norm(z) # вычисление нормы z&lt;br /&gt;
    if beta[j] == 0: # останов, если норма z равна нулю&lt;br /&gt;
        break&lt;br /&gt;
    result.append(next_ritz_number(alpha, beta, j)) # вычисление следующего собственного значения и вектора матрицы Tj&lt;br /&gt;
return result&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основной вклад в сложность даёт полная переортогонализация: на каждой из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций для всех &amp;lt;math&amp;gt;i \in [0...j-1]&amp;lt;/math&amp;gt; выполняется &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; сложений, итого &amp;lt;math&amp;gt;\frac{k(k-1)}{2} 4n \approx 2k^2 n&amp;lt;/math&amp;gt;. &lt;br /&gt;
Таким образом, для метода с полной переортогонализацией сложность составляет &amp;lt;math&amp;gt;O(k^2 n)&amp;lt;/math&amp;gt;, сложность по памяти -- &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
На рисунке приведён информационный граф одной итерации алгоритма&lt;br /&gt;
[[File:Lanczos graph.png|thumb|center|800px|Рисунок 1. Информационный граф итерации алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Для процесса переортогонализации возможна параллельная оптимизация в двух местах:&lt;br /&gt;
* Итерации внутреннего цикла могут вычисляться параллельно, однако, требуется суммирование вычитаемых векторов, соответственно, сложность переортогонализации можно снизить с &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(n \log k)&amp;lt;/math&amp;gt;&lt;br /&gt;
* В каждой итерации внутреннего цикла возможно распараллеливание вычисления выражения справа (скалярное произведение и умножение вектора на число), что теоретически позволяет снизить сложность итерации с &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данны&#039;&#039;&#039;е: квадратная симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: собственные числа матрицы&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Полная переортогонализация соответствует повторной процедуре ортогонализациии Грама-Шмидта для обеспечения ортогональности вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; векторам &amp;lt;math&amp;gt;q_1, ..., q_k&amp;lt;/math&amp;gt;. В случае идеально точной арифметики данная переортогонализация не требовалась бы, однако в реальных вычислениях ошибки округления приводят к потере ортогональности, в связи с чем требуется переортогонализация.&lt;br /&gt;
Однако, единственной проблемой, возникающей при отсутствии переортогонализации, является появление повторных копий чисел Ритца (собственных значений), что в случае, если не требуется установление кратностей собственных значений, допустимо.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма примерно равна &amp;lt;math&amp;gt;2k^2 / n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Исследование масштабируемости алгоритма проводилось на суперкомпьютере IBM Blue Gene/P ВМК МГУ.&lt;br /&gt;
&lt;br /&gt;
Для компиляции программы использовались компиляторы intel/15.0.090 и Openmpi/1.8.4-icc.&lt;br /&gt;
&lt;br /&gt;
Алгоритм тестировался на следующих параметрах:&lt;br /&gt;
* размер входной матрицы: 5000-40000 с шагом 5000&lt;br /&gt;
* число узлов: 1-128     &lt;br /&gt;
&lt;br /&gt;
Зависимость времени выполнения от параметров изображена на графике:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lanczos full chart.png|center|border |800px]]&lt;br /&gt;
[http://pastebin.com/u7KThy6D  Используемая реализация алгоритма на языке C++]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Библиотека [http://www.nag.co.uk/numeric/fl/nagdoc_fl23/html/INDEXES/KWIC/lanczos.html NAG Library] содержит ряд процедур для решения СЛАУ и поиска собственных значений на основе алгоритма Ланцоша.&lt;br /&gt;
&lt;br /&gt;
[http://www.mathworks.com/help/techdoc/ref/eigs.html MATLAB] и [https://www.gnu.org/software/octave/doc/interpreter/Sparse-Linear-Algebra.html#doc_002deigs GNU Octave] позволяют с помощью функции &#039;&#039;eigs()&#039;&#039; находить собственные значения на основе данного алгоритма.&lt;br /&gt;
&lt;br /&gt;
Matlab-реализация доступна как часть [http://www.cs.cmu.edu/~bickson/gabp/#download Gaussian Belief Propagation Matlab Package]. [http://www.graphlab.ml.cmu.edu/pmf.html GraphLab] содержит несколько параллельных реализаций алгоритма на C++.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>Error0x0</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=22122</id>
		<title>Участник:Error0x0/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=22122"/>
		<updated>2017-02-03T18:38:35Z</updated>

		<summary type="html">&lt;p&gt;Error0x0: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(k^2 n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log k \log n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор описания: [[Участник:Error0x0|В. А. Янушковский]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша представляет собой итерационный алгоритм для вычисления собственных значений симметрической матрицы. &lt;br /&gt;
Идея алгоритма заключается в построении матрицы &amp;lt;math&amp;gt;Q_k = [q_1, ..., q_k]&amp;lt;/math&amp;gt; из ортонормированных векторов Ланцоша и использовании собственных значений трёхдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; (чисел Ритца) как приближения к искомым собственным числам матрицы&amp;lt;ref name=&amp;quot;Деммель&amp;quot;&amp;gt;Деммель&amp;amp;nbsp;Дж. Вычислительная линейная алгебра&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;q_1 = b/||b||_2, \beta_0=0, q_0=0&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;z = Aq_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# производится переортогонализация &amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1} {(z^T q_i)q_i}&amp;lt;/math&amp;gt;,&lt;br /&gt;
# &amp;lt;math&amp;gt;\beta_j = ||z||_2&amp;lt;/math&amp;gt;, если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt;, алгоритм останавливается,&lt;br /&gt;
# &amp;lt;math&amp;gt;q_{j+1} = z/\beta_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# вычисляются собственные значения и векторы матрицы &amp;lt;math&amp;gt;T_j = Q_j^T A Q_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Основной вклад в сложность алгоритма даёт полная переортогонализация внутри каждой итерации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1} {(z^T q_i)q_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Алгоритм имеет следующую макроструктуру:&lt;br /&gt;
* Начальная инициализация (деление вектора на норму &amp;lt;math&amp;gt;q_1 = b/||b||_2&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;z = Aq_j&amp;lt;/math&amp;gt;)&lt;br /&gt;
** Переортогонализация &amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1} {(z^T q_i)q_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
** Нахождение следующего вектора &amp;lt;math&amp;gt;q_{j+1} = z/\beta_j&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\beta_j = ||z||_2&amp;lt;/math&amp;gt;&lt;br /&gt;
** Нахождение следующего собственного значения и вектора матрицы &amp;lt;math&amp;gt;T_j = Q_j^T A Q_j&amp;lt;/math&amp;gt; (числа Ритца, используется метод &amp;quot;разделяй и властвуй&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
beta[0] = 0 # инициализация&lt;br /&gt;
q[0] = 0&lt;br /&gt;
q[1] = b / norm(b) # вычисление первого столбца&lt;br /&gt;
for j in [1 .. k]: # k итераций&lt;br /&gt;
    z = mul(A, q[j]) # вектор Ланцоша как произведение матрицы A на столбец q[j]&lt;br /&gt;
    alpha[j] = scalar_mul(q[j], z) # вычисление alpha[j]&lt;br /&gt;
    for i in [1 .. j - 1]: # полная переортогонализация&lt;br /&gt;
        z -= scalar_mul(z, q[i]) * q[i]&lt;br /&gt;
    beta[j] = norm(z) # вычисление нормы z&lt;br /&gt;
    if beta[j] == 0: # останов, если норма z равна нулю&lt;br /&gt;
        break&lt;br /&gt;
    result.append(next_ritz_number(alpha, beta, j)) # вычисление следующего собственного значения и вектора матрицы Tj&lt;br /&gt;
return result&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основной вклад в сложность даёт полная переортогонализация: на каждой из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций для всех &amp;lt;math&amp;gt;i \in [0...j-1]&amp;lt;/math&amp;gt; выполняется &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; сложений, итого &amp;lt;math&amp;gt;\frac{k(k-1)}{2} 4n \approx 2k^2 n&amp;lt;/math&amp;gt;. &lt;br /&gt;
Таким образом, для метода с полной переортогонализацией сложность составляет &amp;lt;math&amp;gt;O(k^2 n)&amp;lt;/math&amp;gt;, сложность по памяти -- &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:Lanczos graph.png|thumb|center|800px|Рисунок 1. Информационный граф]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Для процесса переортогонализации возможна параллельная оптимизация в двух местах:&lt;br /&gt;
* Итерации внутреннего цикла могут вычисляться параллельно, однако, требуется суммирование вычитаемых векторов, соответственно, сложность переортогонализации можно снизить с &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(n \log k)&amp;lt;/math&amp;gt;&lt;br /&gt;
* В каждой итерации внутреннего цикла возможно распараллеливание вычисления выражения справа (скалярное произведение и умножение вектора на число), что теоретически позволяет снизить сложность итерации с &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данны&#039;&#039;&#039;е: квадратная симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: собственные числа матрицы&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Полная переортогонализация соответствует повторной процедуре ортогонализациии Грама-Шмидта для обеспечения ортогональности вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; векторам &amp;lt;math&amp;gt;q_1, ..., q_k&amp;lt;/math&amp;gt;. В случае идеально точной арифметики данная переортогонализация не требовалась бы, однако в реальных вычислениях ошибки округления приводят к потере ортогональности, в связи с чем требуется переортогонализация.&lt;br /&gt;
Однако, единственной проблемой, возникающей при отсутствии переортогонализации, является появление повторных копий чисел Ритца (собственных значений), что в случае, если не требуется установление кратностей собственных значений, допустимо.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма примерно равна &amp;lt;math&amp;gt;2k^2 / n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Исследование масштабируемости алгоритма проводилось на суперкомпьютере IBM Blue Gene/P ВМК МГУ.&lt;br /&gt;
&lt;br /&gt;
Для компиляции программы использовались компиляторы intel/15.0.090 и Openmpi/1.8.4-icc.&lt;br /&gt;
&lt;br /&gt;
Алгоритм тестировался на следующих параметрах:&lt;br /&gt;
* размер входной матрицы: 5000-40000 с шагом 5000&lt;br /&gt;
* число узлов: 1-128     &lt;br /&gt;
&lt;br /&gt;
Зависимость времени выполнения от параметров изображена на графике:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lanczos full chart.png|center|border |800px]]&lt;br /&gt;
[http://pastebin.com/u7KThy6D  Используемая реализация алгоритма на языке C++]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Библиотека [http://www.nag.co.uk/numeric/fl/nagdoc_fl23/html/INDEXES/KWIC/lanczos.html NAG Library] содержит ряд процедур для решения СЛАУ и поиска собственных значений на основе алгоритма Ланцоша.&lt;br /&gt;
&lt;br /&gt;
[http://www.mathworks.com/help/techdoc/ref/eigs.html MATLAB] и [https://www.gnu.org/software/octave/doc/interpreter/Sparse-Linear-Algebra.html#doc_002deigs GNU Octave] позволяют с помощью функции &#039;&#039;eigs()&#039;&#039; находить собственные значения на основе данного алгоритма.&lt;br /&gt;
&lt;br /&gt;
Matlab-реализация доступна как часть [http://www.cs.cmu.edu/~bickson/gabp/#download Gaussian Belief Propagation Matlab Package]. [http://www.graphlab.ml.cmu.edu/pmf.html GraphLab] содержит несколько параллельных реализаций алгоритма на C++.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>Error0x0</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=22121</id>
		<title>Участник:Error0x0/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=22121"/>
		<updated>2017-02-03T18:05:02Z</updated>

		<summary type="html">&lt;p&gt;Error0x0: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(k^2 n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log k \log n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор описания: [[Участник:Error0x0|В. А. Янушковский]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша представляет собой итерационный алгоритм для вычисления собственных значений симметрической матрицы. &lt;br /&gt;
Идея алгоритма заключается в построении матрицы &amp;lt;math&amp;gt;Q_k = [q_1, ..., q_k]&amp;lt;/math&amp;gt; из ортонормированных векторов Ланцоша и использовании собственных значений трёхдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; (чисел Ритца) как приближения к искомым собственным числам матрицы&amp;lt;ref name=&amp;quot;Деммель&amp;quot;&amp;gt;Деммель&amp;amp;nbsp;Дж. Вычислительная линейная алгебра&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;q_1 = b/||b||_2, \beta_0=0, q_0=0&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;z = Aq_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# производится переортогонализация &amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1} {(z^T q_i)q_i}&amp;lt;/math&amp;gt;,&lt;br /&gt;
# &amp;lt;math&amp;gt;\beta_j = ||z||_2&amp;lt;/math&amp;gt;, если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt;, алгоритм останавливается,&lt;br /&gt;
# &amp;lt;math&amp;gt;q_{j+1} = z/\beta_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# вычисляются собственные значения и векторы матрицы &amp;lt;math&amp;gt;T_j = Q_j^T A Q_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Основной вклад в сложность алгоритма даёт полная переортогонализация внутри каждой итерации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1} {(z^T q_i)q_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Алгоритм имеет следующую макроструктуру:&lt;br /&gt;
* Начальная инициализация (деление вектора на норму &amp;lt;math&amp;gt;q_1 = b/||b||_2&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;z = Aq_j&amp;lt;/math&amp;gt;)&lt;br /&gt;
** Переортогонализация &amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1} {(z^T q_i)q_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
** Нахождение следующего вектора &amp;lt;math&amp;gt;q_{j+1} = z/\beta_j&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\beta_j = ||z||_2&amp;lt;/math&amp;gt;&lt;br /&gt;
** Нахождение следующего собственного значения и вектора матрицы &amp;lt;math&amp;gt;T_j = Q_j^T A Q_j&amp;lt;/math&amp;gt; (числа Ритца, используется метод &amp;quot;разделяй и властвуй&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
beta[0] = 0 # инициализация&lt;br /&gt;
q[0] = 0&lt;br /&gt;
q[1] = b / norm(b) # вычисление первого столбца&lt;br /&gt;
for j in [1 .. k]: # k итераций&lt;br /&gt;
    z = mul(A, q[j]) # вектор Ланцоша как произведение матрицы A на столбец q[j]&lt;br /&gt;
    alpha[j] = scalar_mul(q[j], z) # вычисление alpha[j]&lt;br /&gt;
    for i in [1 .. j - 1]: # полная переортогонализация&lt;br /&gt;
        z -= scalar_mul(z, q[i]) * q[i]&lt;br /&gt;
    beta[j] = norm(z) # вычисление нормы z&lt;br /&gt;
    if beta[j] == 0: # останов, если норма z равна нулю&lt;br /&gt;
        break&lt;br /&gt;
    result.append(next_ritz_number(alpha, beta, j)) # вычисление следующего собственного значения и вектора матрицы Tj&lt;br /&gt;
return result&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основной вклад в сложность даёт полная переортогонализация: на каждой из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций для всех &amp;lt;math&amp;gt;i \in [0...j-1]&amp;lt;/math&amp;gt; выполняется &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; сложений, итого &amp;lt;math&amp;gt;\frac{k(k-1)}{2} 4n \approx 2k^2 n&amp;lt;/math&amp;gt;. &lt;br /&gt;
Таким образом, для метода с полной переортогонализацией сложность составляет &amp;lt;math&amp;gt;O(k^2 n)&amp;lt;/math&amp;gt;, сложность по памяти -- &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:Lanczos graph.png|thumb|center|640px|Рисунок 1. Информационный граф]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Для процесса переортогонализации возможна параллельная оптимизация в двух местах:&lt;br /&gt;
* Итерации внутреннего цикла могут вычисляться параллельно, однако, требуется суммирование вычитаемых векторов, соответственно, сложность переортогонализации можно снизить с &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(n \log k)&amp;lt;/math&amp;gt;&lt;br /&gt;
* В каждой итерации внутреннего цикла возможно распараллеливание вычисления выражения справа (скалярное произведение и умножение вектора на число), что теоретически позволяет снизить сложность итерации с &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данны&#039;&#039;&#039;е: квадратная симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: собственные числа матрицы&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Полная переортогонализация соответствует повторной процедуре ортогонализациии Грама-Шмидта для обеспечения ортогональности вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; векторам &amp;lt;math&amp;gt;q_1, ..., q_k&amp;lt;/math&amp;gt;. В случае идеально точной арифметики данная переортогонализация не требовалась бы, однако в реальных вычислениях ошибки округления приводят к потере ортогональности, в связи с чем требуется переортогонализация.&lt;br /&gt;
Однако, единственной проблемой, возникающей при отсутствии переортогонализации, является появление повторных копий чисел Ритца (собственных значений), что в случае, если не требуется установление кратностей собственных значений, допустимо.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма примерно равна &amp;lt;math&amp;gt;2k^2 / n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Исследование масштабируемости алгоритма проводилось на суперкомпьютере IBM Blue Gene/P ВМК МГУ.&lt;br /&gt;
&lt;br /&gt;
Для компиляции программы использовались компиляторы intel/15.0.090 и Openmpi/1.8.4-icc.&lt;br /&gt;
&lt;br /&gt;
Алгоритм тестировался на следующих параметрах:&lt;br /&gt;
* размер входной матрицы: 5000-40000 с шагом 5000&lt;br /&gt;
* число узлов: 1-128     &lt;br /&gt;
&lt;br /&gt;
Зависимость времени выполнения от параметров изображена на графике:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lanczos full chart.png|center|border |800px]]&lt;br /&gt;
[http://pastebin.com/u7KThy6D  Используемая реализация алгоритма на языке C++]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Библиотека [http://www.nag.co.uk/numeric/fl/nagdoc_fl23/html/INDEXES/KWIC/lanczos.html NAG Library] содержит ряд процедур для решения СЛАУ и поиска собственных значений на основе алгоритма Ланцоша.&lt;br /&gt;
&lt;br /&gt;
[http://www.mathworks.com/help/techdoc/ref/eigs.html MATLAB] и [https://www.gnu.org/software/octave/doc/interpreter/Sparse-Linear-Algebra.html#doc_002deigs GNU Octave] позволяют с помощью функции &#039;&#039;eigs()&#039;&#039; находить собственные значения на основе данного алгоритма.&lt;br /&gt;
&lt;br /&gt;
Matlab-реализация доступна как часть [http://www.cs.cmu.edu/~bickson/gabp/#download Gaussian Belief Propagation Matlab Package]. [http://www.graphlab.ml.cmu.edu/pmf.html GraphLab] содержит несколько параллельных реализаций алгоритма на C++.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>Error0x0</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=22039</id>
		<title>Участник:Error0x0/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=22039"/>
		<updated>2017-02-02T12:31:44Z</updated>

		<summary type="html">&lt;p&gt;Error0x0: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{assignment}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(k^2 n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log k \log n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор описания: [[Участник:Error0x0|В. А. Янушковский]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша представляет собой итерационный алгоритм для вычисления собственных значений симметрической матрицы. &lt;br /&gt;
Идея алгоритма заключается в построении матрицы &amp;lt;math&amp;gt;Q_k = [q_1, ..., q_k]&amp;lt;/math&amp;gt; из ортонормированных векторов Ланцоша и использовании собственных значений трёхдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; (чисел Ритца) как приближения к искомым собственным числам матрицы&amp;lt;ref name=&amp;quot;Деммель&amp;quot;&amp;gt;Деммель&amp;amp;nbsp;Дж. Вычислительная линейная алгебра&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;q_1 = b/||b||_2, \beta_0=0, q_0=0&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;z = Aq_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# производится переортогонализация &amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1} {(z^T q_i)q_i}&amp;lt;/math&amp;gt;,&lt;br /&gt;
# &amp;lt;math&amp;gt;\beta_j = ||z||_2&amp;lt;/math&amp;gt;, если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt;, алгоритм останавливается,&lt;br /&gt;
# &amp;lt;math&amp;gt;q_{j+1} = z/\beta_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# вычисляются собственные значения и векторы матрицы &amp;lt;math&amp;gt;T_j = Q_j^T A Q_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Основной вклад в сложность алгоритма даёт полная переортогонализация внутри каждой итерации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1} {(z^T q_i)q_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
используются следующие макрооперации:&lt;br /&gt;
* Нахождение нормы вектора (евклидовой)&lt;br /&gt;
* Умножение/деление вектора на число&lt;br /&gt;
* Умножение матрицы на вектор (&amp;lt;math&amp;gt;z = Aq_j&amp;lt;/math&amp;gt;)&lt;br /&gt;
* Скалярное произведение двух векторов&lt;br /&gt;
* Вычитание векторов&lt;br /&gt;
* Вычисление собственных значений и векторов трёхдиагональной матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; (числа Ритца, используется метод &amp;quot;разделяй и властвуй&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
beta[0] = 0 # инициализация&lt;br /&gt;
q[0] = 0&lt;br /&gt;
q[1] = b / norm(b) # вычисление первого столбца&lt;br /&gt;
for j in [1 .. k]: # k итераций&lt;br /&gt;
    z = mul(A, q[j]) # вектор Ланцоша как произведение матрицы A на столбец q[j]&lt;br /&gt;
    alpha[j] = scalar_mul(q[j], z) # вычисление alpha[j]&lt;br /&gt;
    for i in [1 .. j - 1]: # полная переортогонализация&lt;br /&gt;
        z -= scalar_mul(z, q[i]) * q[i]&lt;br /&gt;
    beta[j] = norm(z) # вычисление нормы z&lt;br /&gt;
    if beta[j] == 0: # останов, если норма z равна нулю&lt;br /&gt;
        break&lt;br /&gt;
    result.append(next_ritz_number(alpha, beta, j)) # вычисление следующего собственного значения и вектора матрицы Tj&lt;br /&gt;
return result&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основной вклад в сложность даёт полная переортогонализация: на каждой из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций для всех &amp;lt;math&amp;gt;i \in [0...j-1]&amp;lt;/math&amp;gt; выполняется &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; сложений, итого &amp;lt;math&amp;gt;\frac{k(k-1)}{2} 4n \approx 2k^2 n&amp;lt;/math&amp;gt;. &lt;br /&gt;
Таким образом, для метода с полной переортогонализацией сложность составляет &amp;lt;math&amp;gt;O(k^2 n)&amp;lt;/math&amp;gt;, сложность по памяти -- &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:Lanczos graph.png|thumb|center|640px|Рисунок 1. Информационный граф]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Для процесса переортогонализации возможна параллельная оптимизация в двух местах:&lt;br /&gt;
* Итерации внутреннего цикла могут вычисляться параллельно, однако, требуется суммирование вычитаемых векторов, соответственно, сложность переортогонализации можно снизить с &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(n \log k)&amp;lt;/math&amp;gt;&lt;br /&gt;
* В каждой итерации внутреннего цикла возможно распараллеливание вычисления выражения справа (скалярное произведение и умножение вектора на число), что теоретически позволяет снизить сложность итерации с &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данны&#039;&#039;&#039;е: квадратная симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: собственные числа матрицы&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Полная переортогонализация соответствует повторной процедуре ортогонализациии Грама-Шмидта для обеспечения ортогональности вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; векторам &amp;lt;math&amp;gt;q_1, ..., q_k&amp;lt;/math&amp;gt;. В случае идеально точной арифметики данная переортогонализация не требовалась бы, однако в реальных вычислениях ошибки округления приводят к потере ортогональности, в связи с чем требуется переортогонализация.&lt;br /&gt;
Однако, единственной проблемой, возникающей при отсутствии переортогонализации, является появление повторных копий чисел Ритца (собственных значений), что в случае, если не требуется установление кратностей собственных значений, допустимо.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма примерно равна &amp;lt;math&amp;gt;2k^2 / n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Исследование масштабируемости алгоритма проводилось на суперкомпьютере IBM Blue Gene/P ВМК МГУ.&lt;br /&gt;
&lt;br /&gt;
Для компиляции программы использовались компиляторы intel/15.0.090 и Openmpi/1.8.4-icc.&lt;br /&gt;
&lt;br /&gt;
Алгоритм тестировался на следующих параметрах:&lt;br /&gt;
* размер входной матрицы: 5000-40000 с шагом 5000&lt;br /&gt;
* число узлов: 1-128     &lt;br /&gt;
&lt;br /&gt;
Зависимость времени выполнения от параметров изображена на графике:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lanczos full chart.png|center|border |800px]]&lt;br /&gt;
[http://pastebin.com/u7KThy6D  Используемая реализация алгоритма на языке C++]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Библиотека [http://www.nag.co.uk/numeric/fl/nagdoc_fl23/html/INDEXES/KWIC/lanczos.html NAG Library] содержит ряд процедур для решения СЛАУ и поиска собственных значений на основе алгоритма Ланцоша.&lt;br /&gt;
&lt;br /&gt;
[http://www.mathworks.com/help/techdoc/ref/eigs.html MATLAB] и [https://www.gnu.org/software/octave/doc/interpreter/Sparse-Linear-Algebra.html#doc_002deigs GNU Octave] позволяют с помощью функции &#039;&#039;eigs()&#039;&#039; находить собственные значения на основе данного алгоритма.&lt;br /&gt;
&lt;br /&gt;
Matlab-реализация доступна как часть [http://www.cs.cmu.edu/~bickson/gabp/#download Gaussian Belief Propagation Matlab Package]. [http://www.graphlab.ml.cmu.edu/pmf.html GraphLab] содержит несколько параллельных реализаций алгоритма на C++.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>Error0x0</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Error0x0&amp;diff=22029</id>
		<title>Обсуждение участника:Error0x0</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Error0x0&amp;diff=22029"/>
		<updated>2017-02-01T21:04:02Z</updated>

		<summary type="html">&lt;p&gt;Error0x0: /* Статья Участник:Error0x0/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Участник:Error0x0/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией]] ==&lt;br /&gt;
&lt;br /&gt;
* В разделе 1.3 не приведено описание вычислительного ядра&lt;br /&gt;
* Не указано ФИО автора&lt;br /&gt;
* Не приведена краткая сводка свойств алгоритма в начале статьи&lt;br /&gt;
&lt;br /&gt;
Добавил.&lt;br /&gt;
&lt;br /&gt;
* В разделе 1.4 требуется привести описание алгоритма на верхнем уровне (на основе макроопераций). [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:35, 1 ноября 2016 (MSK)&lt;br /&gt;
* В разделе 1.5 кроме кода нужны также текстовые пояснения. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:35, 1 ноября 2016 (MSK)&lt;br /&gt;
* В разделе 1.10 должна быть оценка вычислительной мощности алгоритма. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:35, 1 ноября 2016 (MSK)&lt;br /&gt;
* Не заполнен раздел 2.4 описания. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:44, 16 ноября 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
Пункты 1.4, 1.5, 1.10 исправлены, пункт 2.4 добавлен&lt;/div&gt;</summary>
		<author><name>Error0x0</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=22028</id>
		<title>Участник:Error0x0/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=22028"/>
		<updated>2017-02-01T21:03:14Z</updated>

		<summary type="html">&lt;p&gt;Error0x0: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(k^2 n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log k \log n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор описания: [[Участник:Error0x0|В. А. Янушковский]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша представляет собой итерационный алгоритм для вычисления собственных значений симметрической матрицы. &lt;br /&gt;
Идея алгоритма заключается в построении матрицы &amp;lt;math&amp;gt;Q_k = [q_1, ..., q_k]&amp;lt;/math&amp;gt; из ортонормированных векторов Ланцоша и использовании собственных значений трёхдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; (чисел Ритца) как приближения к искомым собственным числам матрицы&amp;lt;ref name=&amp;quot;Деммель&amp;quot;&amp;gt;Деммель&amp;amp;nbsp;Дж. Вычислительная линейная алгебра&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;q_1 = b/||b||_2, \beta_0=0, q_0=0&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;z = Aq_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# производится переортогонализация &amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1} {(z^T q_i)q_i}&amp;lt;/math&amp;gt;,&lt;br /&gt;
# &amp;lt;math&amp;gt;\beta_j = ||z||_2&amp;lt;/math&amp;gt;, если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt;, алгоритм останавливается,&lt;br /&gt;
# &amp;lt;math&amp;gt;q_{j+1} = z/\beta_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# вычисляются собственные значения и векторы матрицы &amp;lt;math&amp;gt;T_j = Q_j^T A Q_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Основной вклад в сложность алгоритма даёт полная переортогонализация внутри каждой итерации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1} {(z^T q_i)q_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
используются следующие макрооперации:&lt;br /&gt;
* Нахождение нормы вектора (евклидовой)&lt;br /&gt;
* Умножение/деление вектора на число&lt;br /&gt;
* Умножение матрицы на вектор (&amp;lt;math&amp;gt;z = Aq_j&amp;lt;/math&amp;gt;)&lt;br /&gt;
* Скалярное произведение двух векторов&lt;br /&gt;
* Вычитание векторов&lt;br /&gt;
* Вычисление собственных значений и векторов трёхдиагональной матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; (числа Ритца, используется метод &amp;quot;разделяй и властвуй&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
beta[0] = 0 # инициализация&lt;br /&gt;
q[0] = 0&lt;br /&gt;
q[1] = b / norm(b) # вычисление первого столбца&lt;br /&gt;
for j in [1 .. k]: # k итераций&lt;br /&gt;
    z = mul(A, q[j]) # вектор Ланцоша как произведение матрицы A на столбец q[j]&lt;br /&gt;
    alpha[j] = scalar_mul(q[j], z) # вычисление alpha[j]&lt;br /&gt;
    for i in [1 .. j - 1]: # полная переортогонализация&lt;br /&gt;
        z -= scalar_mul(z, q[i]) * q[i]&lt;br /&gt;
    beta[j] = norm(z) # вычисление нормы z&lt;br /&gt;
    if beta[j] == 0: # останов, если норма z равна нулю&lt;br /&gt;
        break&lt;br /&gt;
    result.append(next_ritz_number(alpha, beta, j)) # вычисление следующего собственного значения и вектора матрицы Tj&lt;br /&gt;
return result&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основной вклад в сложность даёт полная переортогонализация: на каждой из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций для всех &amp;lt;math&amp;gt;i \in [0...j-1]&amp;lt;/math&amp;gt; выполняется &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; сложений, итого &amp;lt;math&amp;gt;\frac{k(k-1)}{2} 4n \approx 2k^2 n&amp;lt;/math&amp;gt;. &lt;br /&gt;
Таким образом, для метода с полной переортогонализацией сложность составляет &amp;lt;math&amp;gt;O(k^2 n)&amp;lt;/math&amp;gt;, сложность по памяти -- &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:Lanczos graph.png|thumb|center|640px|Рисунок 1. Информационный граф]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Для процесса переортогонализации возможна параллельная оптимизация в двух местах:&lt;br /&gt;
* Итерации внутреннего цикла могут вычисляться параллельно, однако, требуется суммирование вычитаемых векторов, соответственно, сложность переортогонализации можно снизить с &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(n \log k)&amp;lt;/math&amp;gt;&lt;br /&gt;
* В каждой итерации внутреннего цикла возможно распараллеливание вычисления выражения справа (скалярное произведение и умножение вектора на число), что теоретически позволяет снизить сложность итерации с &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данны&#039;&#039;&#039;е: квадратная симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: собственные числа матрицы&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Полная переортогонализация соответствует повторной процедуре ортогонализациии Грама-Шмидта для обеспечения ортогональности вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; векторам &amp;lt;math&amp;gt;q_1, ..., q_k&amp;lt;/math&amp;gt;. В случае идеально точной арифметики данная переортогонализация не требовалась бы, однако в реальных вычислениях ошибки округления приводят к потере ортогональности, в связи с чем требуется переортогонализация.&lt;br /&gt;
Однако, единственной проблемой, возникающей при отсутствии переортогонализации, является появление повторных копий чисел Ритца (собственных значений), что в случае, если не требуется установление кратностей собственных значений, допустимо.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма примерно равна &amp;lt;math&amp;gt;2k^2 / n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Исследование масштабируемости алгоритма проводилось на суперкомпьютере IBM Blue Gene/P ВМК МГУ.&lt;br /&gt;
&lt;br /&gt;
Для компиляции программы использовались компиляторы intel/15.0.090 и Openmpi/1.8.4-icc.&lt;br /&gt;
&lt;br /&gt;
Алгоритм тестировался на следующих параметрах:&lt;br /&gt;
* размер входной матрицы: 5000-40000 с шагом 5000&lt;br /&gt;
* число узлов: 1-128     &lt;br /&gt;
&lt;br /&gt;
Зависимость времени выполнения от параметров изображена на графике:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lanczos full chart.png|center|border |800px]]&lt;br /&gt;
[http://pastebin.com/u7KThy6D  Используемая реализация алгоритма на языке C++]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Библиотека [http://www.nag.co.uk/numeric/fl/nagdoc_fl23/html/INDEXES/KWIC/lanczos.html NAG Library] содержит ряд процедур для решения СЛАУ и поиска собственных значений на основе алгоритма Ланцоша.&lt;br /&gt;
&lt;br /&gt;
[http://www.mathworks.com/help/techdoc/ref/eigs.html MATLAB] и [https://www.gnu.org/software/octave/doc/interpreter/Sparse-Linear-Algebra.html#doc_002deigs GNU Octave] позволяют с помощью функции &#039;&#039;eigs()&#039;&#039; находить собственные значения на основе данного алгоритма.&lt;br /&gt;
&lt;br /&gt;
Matlab-реализация доступна как часть [http://www.cs.cmu.edu/~bickson/gabp/#download Gaussian Belief Propagation Matlab Package]. [http://www.graphlab.ml.cmu.edu/pmf.html GraphLab] содержит несколько параллельных реализаций алгоритма на C++.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>Error0x0</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=22027</id>
		<title>Участник:Error0x0/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=22027"/>
		<updated>2017-02-01T21:02:58Z</updated>

		<summary type="html">&lt;p&gt;Error0x0: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(k^2 n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log k \log n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор описания: [[Участник:Error0x0|В. А. Янушковский]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша представляет собой итерационный алгоритм для вычисления собственных значений симметрической матрицы. &lt;br /&gt;
Идея алгоритма заключается в построении матрицы &amp;lt;math&amp;gt;Q_k = [q_1, ..., q_k]&amp;lt;/math&amp;gt; из ортонормированных векторов Ланцоша и использовании собственных значений трёхдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; (чисел Ритца) как приближения к искомым собственным числам матрицы&amp;lt;ref name=&amp;quot;Деммель&amp;quot;&amp;gt;Деммель&amp;amp;nbsp;Дж. Вычислительная линейная алгебра&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;q_1 = b/||b||_2, \beta_0=0, q_0=0&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;z = Aq_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# производится переортогонализация &amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1} {(z^T q_i)q_i}&amp;lt;/math&amp;gt;,&lt;br /&gt;
# &amp;lt;math&amp;gt;\beta_j = ||z||_2&amp;lt;/math&amp;gt;, если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt;, алгоритм останавливается,&lt;br /&gt;
# &amp;lt;math&amp;gt;q_{j+1} = z/\beta_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# вычисляются собственные значения и векторы матрицы &amp;lt;math&amp;gt;T_j = Q_j^T A Q_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Основной вклад в сложность алгоритма даёт полная переортогонализация внутри каждой итерации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1} {(z^T q_i)q_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
используются следующие макрооперации:&lt;br /&gt;
* Нахождение нормы вектора (евклидовой)&lt;br /&gt;
* Умножение/деление вектора на число&lt;br /&gt;
* Умножение матрицы на вектор (&amp;lt;math&amp;gt;z = Aq_j&amp;lt;/math&amp;gt;)&lt;br /&gt;
* Скалярное произведение двух векторов&lt;br /&gt;
* Вычитание векторов&lt;br /&gt;
* Вычисление собственных значений и векторов трёхдиагональной матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; (числа Ритца, используется метод &amp;quot;разделяй и властвуй&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
beta[0] = 0 # инициализация&lt;br /&gt;
q[0] = 0&lt;br /&gt;
q[1] = b / norm(b) # вычисление первого столбца&lt;br /&gt;
for j in [1 .. k]: # k итераций&lt;br /&gt;
    z = mul(A, q[j]) # вектор Ланцоша как произведение матрицы A на столбец q[j]&lt;br /&gt;
    alpha[j] = scalar_mul(q[j], z) # вычисление alpha[j]&lt;br /&gt;
    for i in [1 .. j - 1]: # полная переортогонализация&lt;br /&gt;
        z -= scalar_mul(z, q[i]) * q[i]&lt;br /&gt;
    beta[j] = norm(z) # вычисление нормы z&lt;br /&gt;
    if beta[j] == 0: # останов, если норма z равна нулю&lt;br /&gt;
        break&lt;br /&gt;
    result.append(next_ritz_number(alpha, beta, j)) # вычисление следующего собственного значения и вектора матрицы Tj&lt;br /&gt;
return result&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основной вклад в сложность даёт полная переортогонализация: на каждой из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций для всех &amp;lt;math&amp;gt;i \in [0...j-1]&amp;lt;/math&amp;gt; выполняется &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; сложений, итого &amp;lt;math&amp;gt;\frac{k(k-1)}{2} 4n \approx 2k^2 n&amp;lt;/math&amp;gt;. &lt;br /&gt;
Таким образом, для метода с полной переортогонализацией сложность составляет &amp;lt;math&amp;gt;O(k^2 n)&amp;lt;/math&amp;gt;, сложность по памяти -- &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:Lanczos graph.png|thumb|center|640px|Рисунок 1. Информационный граф]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Для процесса переортогонализации возможна параллельная оптимизация в двух местах:&lt;br /&gt;
* Итерации внутреннего цикла могут вычисляться параллельно, однако, требуется суммирование вычитаемых векторов, соответственно, сложность переортогонализации можно снизить с &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(n \log k)&amp;lt;/math&amp;gt;&lt;br /&gt;
* В каждой итерации внутреннего цикла возможно распараллеливание вычисления выражения справа (скалярное произведение и умножение вектора на число), что теоретически позволяет снизить сложность итерации с &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данны&#039;&#039;&#039;е: квадратная симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: собственные числа матрицы&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Полная переортогонализация соответствует повторной процедуре ортогонализациии Грама-Шмидта для обеспечения ортогональности вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; векторам &amp;lt;math&amp;gt;q_1, ..., q_k&amp;lt;/math&amp;gt;. В случае идеально точной арифметики данная переортогонализация не требовалась бы, однако в реальных вычислениях ошибки округления приводят к потере ортогональности, в связи с чем требуется переортогонализация.&lt;br /&gt;
Однако, единственной проблемой, возникающей при отсутствии переортогонализации, является появление повторных копий чисел Ритца (собственных значений), что в случае, если не требуется установление кратностей собственных значений, допустимо.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма примерно равна &amp;lt;math&amp;gt;2k^2 / n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Исследование масштабируемости алгоритма проводилось на суперкомпьютере IBM Blue Gene/P ВМК МГУ.&lt;br /&gt;
&lt;br /&gt;
Для компиляции программы использовались компиляторы intel/15.0.090 и Openmpi/1.8.4-icc.&lt;br /&gt;
&lt;br /&gt;
Алгоритм тестировался на следующих параметрах:&lt;br /&gt;
* размер входной матрицы: 5000-40000 с шагом 5000&lt;br /&gt;
* число узлов: 1-128     &lt;br /&gt;
&lt;br /&gt;
Зависимость времени выполнения от параметров изображена на графике:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lanczos full chart.png center|border |800px]]&lt;br /&gt;
[http://pastebin.com/u7KThy6D  Используемая реализация алгоритма на языке C++]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Библиотека [http://www.nag.co.uk/numeric/fl/nagdoc_fl23/html/INDEXES/KWIC/lanczos.html NAG Library] содержит ряд процедур для решения СЛАУ и поиска собственных значений на основе алгоритма Ланцоша.&lt;br /&gt;
&lt;br /&gt;
[http://www.mathworks.com/help/techdoc/ref/eigs.html MATLAB] и [https://www.gnu.org/software/octave/doc/interpreter/Sparse-Linear-Algebra.html#doc_002deigs GNU Octave] позволяют с помощью функции &#039;&#039;eigs()&#039;&#039; находить собственные значения на основе данного алгоритма.&lt;br /&gt;
&lt;br /&gt;
Matlab-реализация доступна как часть [http://www.cs.cmu.edu/~bickson/gabp/#download Gaussian Belief Propagation Matlab Package]. [http://www.graphlab.ml.cmu.edu/pmf.html GraphLab] содержит несколько параллельных реализаций алгоритма на C++.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>Error0x0</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=22026</id>
		<title>Участник:Error0x0/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=22026"/>
		<updated>2017-02-01T20:59:35Z</updated>

		<summary type="html">&lt;p&gt;Error0x0: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(k^2 n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log k \log n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор описания: [[Участник:Error0x0|В. А. Янушковский]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша представляет собой итерационный алгоритм для вычисления собственных значений симметрической матрицы. &lt;br /&gt;
Идея алгоритма заключается в построении матрицы &amp;lt;math&amp;gt;Q_k = [q_1, ..., q_k]&amp;lt;/math&amp;gt; из ортонормированных векторов Ланцоша и использовании собственных значений трёхдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; (чисел Ритца) как приближения к искомым собственным числам матрицы&amp;lt;ref name=&amp;quot;Деммель&amp;quot;&amp;gt;Деммель&amp;amp;nbsp;Дж. Вычислительная линейная алгебра&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;q_1 = b/||b||_2, \beta_0=0, q_0=0&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;z = Aq_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# производится переортогонализация &amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1} {(z^T q_i)q_i}&amp;lt;/math&amp;gt;,&lt;br /&gt;
# &amp;lt;math&amp;gt;\beta_j = ||z||_2&amp;lt;/math&amp;gt;, если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt;, алгоритм останавливается,&lt;br /&gt;
# &amp;lt;math&amp;gt;q_{j+1} = z/\beta_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# вычисляются собственные значения и векторы матрицы &amp;lt;math&amp;gt;T_j = Q_j^T A Q_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Основной вклад в сложность алгоритма даёт полная переортогонализация внутри каждой итерации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1} {(z^T q_i)q_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
используются следующие макрооперации:&lt;br /&gt;
* Нахождение нормы вектора (евклидовой)&lt;br /&gt;
* Умножение/деление вектора на число&lt;br /&gt;
* Умножение матрицы на вектор (&amp;lt;math&amp;gt;z = Aq_j&amp;lt;/math&amp;gt;)&lt;br /&gt;
* Скалярное произведение двух векторов&lt;br /&gt;
* Вычитание векторов&lt;br /&gt;
* Вычисление собственных значений и векторов трёхдиагональной матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; (числа Ритца, используется метод &amp;quot;разделяй и властвуй&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
beta[0] = 0 # инициализация&lt;br /&gt;
q[0] = 0&lt;br /&gt;
q[1] = b / norm(b) # вычисление первого столбца&lt;br /&gt;
for j in [1 .. k]: # k итераций&lt;br /&gt;
    z = mul(A, q[j]) # вектор Ланцоша как произведение матрицы A на столбец q[j]&lt;br /&gt;
    alpha[j] = scalar_mul(q[j], z) # вычисление alpha[j]&lt;br /&gt;
    for i in [1 .. j - 1]: # полная переортогонализация&lt;br /&gt;
        z -= scalar_mul(z, q[i]) * q[i]&lt;br /&gt;
    beta[j] = norm(z) # вычисление нормы z&lt;br /&gt;
    if beta[j] == 0: # останов, если норма z равна нулю&lt;br /&gt;
        break&lt;br /&gt;
    result.append(next_ritz_number(alpha, beta, j)) # вычисление следующего собственного значения и вектора матрицы Tj&lt;br /&gt;
return result&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основной вклад в сложность даёт полная переортогонализация: на каждой из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций для всех &amp;lt;math&amp;gt;i \in [0...j-1]&amp;lt;/math&amp;gt; выполняется &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; сложений, итого &amp;lt;math&amp;gt;\frac{k(k-1)}{2} 4n \approx 2k^2 n&amp;lt;/math&amp;gt;. &lt;br /&gt;
Таким образом, для метода с полной переортогонализацией сложность составляет &amp;lt;math&amp;gt;O(k^2 n)&amp;lt;/math&amp;gt;, сложность по памяти -- &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:Lanczos graph.png|thumb|center|640px|Рисунок 1. Информационный граф]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Для процесса переортогонализации возможна параллельная оптимизация в двух местах:&lt;br /&gt;
* Итерации внутреннего цикла могут вычисляться параллельно, однако, требуется суммирование вычитаемых векторов, соответственно, сложность переортогонализации можно снизить с &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(n \log k)&amp;lt;/math&amp;gt;&lt;br /&gt;
* В каждой итерации внутреннего цикла возможно распараллеливание вычисления выражения справа (скалярное произведение и умножение вектора на число), что теоретически позволяет снизить сложность итерации с &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данны&#039;&#039;&#039;е: квадратная симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: собственные числа матрицы&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Полная переортогонализация соответствует повторной процедуре ортогонализациии Грама-Шмидта для обеспечения ортогональности вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; векторам &amp;lt;math&amp;gt;q_1, ..., q_k&amp;lt;/math&amp;gt;. В случае идеально точной арифметики данная переортогонализация не требовалась бы, однако в реальных вычислениях ошибки округления приводят к потере ортогональности, в связи с чем требуется переортогонализация.&lt;br /&gt;
Однако, единственной проблемой, возникающей при отсутствии переортогонализации, является появление повторных копий чисел Ритца (собственных значений), что в случае, если не требуется установление кратностей собственных значений, допустимо.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма примерно равна &amp;lt;math&amp;gt;2k^2 / n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Исследование масштабируемости алгоритма проводилось на суперкомпьютере IBM Blue Gene/P ВМК МГУ.&lt;br /&gt;
&lt;br /&gt;
Для компиляции программы использовались компиляторы intel/15.0.090 и Openmpi/1.8.4-icc.&lt;br /&gt;
&lt;br /&gt;
Алгоритм тестировался на следующих параметрах:&lt;br /&gt;
* размер входной матрицы: 5000-40000 с шагом 5000&lt;br /&gt;
* число узлов: 1-128     &lt;br /&gt;
&lt;br /&gt;
Зависимость времени выполнения от параметров изображена на графике:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lanczos full chart.png]]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Библиотека [http://www.nag.co.uk/numeric/fl/nagdoc_fl23/html/INDEXES/KWIC/lanczos.html NAG Library] содержит ряд процедур для решения СЛАУ и поиска собственных значений на основе алгоритма Ланцоша.&lt;br /&gt;
&lt;br /&gt;
[http://www.mathworks.com/help/techdoc/ref/eigs.html MATLAB] и [https://www.gnu.org/software/octave/doc/interpreter/Sparse-Linear-Algebra.html#doc_002deigs GNU Octave] позволяют с помощью функции &#039;&#039;eigs()&#039;&#039; находить собственные значения на основе данного алгоритма.&lt;br /&gt;
&lt;br /&gt;
Matlab-реализация доступна как часть [http://www.cs.cmu.edu/~bickson/gabp/#download Gaussian Belief Propagation Matlab Package]. [http://www.graphlab.ml.cmu.edu/pmf.html GraphLab] содержит несколько параллельных реализаций алгоритма на C++.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>Error0x0</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Error0x0&amp;diff=22000</id>
		<title>Обсуждение участника:Error0x0</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Error0x0&amp;diff=22000"/>
		<updated>2017-02-01T18:16:59Z</updated>

		<summary type="html">&lt;p&gt;Error0x0: /* Статья Участник:Error0x0/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Участник:Error0x0/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией]] ==&lt;br /&gt;
&lt;br /&gt;
* В разделе 1.3 не приведено описание вычислительного ядра&lt;br /&gt;
* Не указано ФИО автора&lt;br /&gt;
* Не приведена краткая сводка свойств алгоритма в начале статьи&lt;br /&gt;
&lt;br /&gt;
Добавил.&lt;br /&gt;
&lt;br /&gt;
* В разделе 1.4 требуется привести описание алгоритма на верхнем уровне (на основе макроопераций). [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:35, 1 ноября 2016 (MSK)&lt;br /&gt;
* В разделе 1.5 кроме кода нужны также текстовые пояснения. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:35, 1 ноября 2016 (MSK)&lt;br /&gt;
* В разделе 1.10 должна быть оценка вычислительной мощности алгоритма. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:35, 1 ноября 2016 (MSK)&lt;br /&gt;
* Не заполнен раздел 2.4 описания. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:44, 16 ноября 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
Пункты 1.4, 1.5, 1.10 исправлены&lt;/div&gt;</summary>
		<author><name>Error0x0</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=21999</id>
		<title>Участник:Error0x0/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=21999"/>
		<updated>2017-02-01T18:15:52Z</updated>

		<summary type="html">&lt;p&gt;Error0x0: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(k^2 n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log k \log n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор описания: [[Участник:Error0x0|В. А. Янушковский]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша представляет собой итерационный алгоритм для вычисления собственных значений симметрической матрицы. &lt;br /&gt;
Идея алгоритма заключается в построении матрицы &amp;lt;math&amp;gt;Q_k = [q_1, ..., q_k]&amp;lt;/math&amp;gt; из ортонормированных векторов Ланцоша и использовании собственных значений трёхдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; (чисел Ритца) как приближения к искомым собственным числам матрицы&amp;lt;ref name=&amp;quot;Деммель&amp;quot;&amp;gt;Деммель&amp;amp;nbsp;Дж. Вычислительная линейная алгебра&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;q_1 = b/||b||_2, \beta_0=0, q_0=0&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;z = Aq_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# производится переортогонализация &amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1} {(z^T q_i)q_i}&amp;lt;/math&amp;gt;,&lt;br /&gt;
# &amp;lt;math&amp;gt;\beta_j = ||z||_2&amp;lt;/math&amp;gt;, если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt;, алгоритм останавливается,&lt;br /&gt;
# &amp;lt;math&amp;gt;q_{j+1} = z/\beta_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# вычисляются собственные значения и векторы матрицы &amp;lt;math&amp;gt;T_j = Q_j^T A Q_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Основной вклад в сложность алгоритма даёт полная переортогонализация внутри каждой итерации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1} {(z^T q_i)q_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
используются следующие макрооперации:&lt;br /&gt;
* Нахождение нормы вектора (евклидовой)&lt;br /&gt;
* Умножение/деление вектора на число&lt;br /&gt;
* Умножение матрицы на вектор (&amp;lt;math&amp;gt;z = Aq_j&amp;lt;/math&amp;gt;)&lt;br /&gt;
* Скалярное произведение двух векторов&lt;br /&gt;
* Вычитание векторов&lt;br /&gt;
* Вычисление собственных значений и векторов трёхдиагональной матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; (числа Ритца, используется метод &amp;quot;разделяй и властвуй&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
beta[0] = 0 # инициализация&lt;br /&gt;
q[0] = 0&lt;br /&gt;
q[1] = b / norm(b) # вычисление первого столбца&lt;br /&gt;
for j in [1 .. k]: # k итераций&lt;br /&gt;
    z = mul(A, q[j]) # вектор Ланцоша как произведение матрицы A на столбец q[j]&lt;br /&gt;
    alpha[j] = scalar_mul(q[j], z) # вычисление alpha[j]&lt;br /&gt;
    for i in [1 .. j - 1]: # полная переортогонализация&lt;br /&gt;
        z -= scalar_mul(z, q[i]) * q[i]&lt;br /&gt;
    beta[j] = norm(z) # вычисление нормы z&lt;br /&gt;
    if beta[j] == 0: # останов, если норма z равна нулю&lt;br /&gt;
        break&lt;br /&gt;
    result.append(next_ritz_number(alpha, beta, j)) # вычисление следующего собственного значения и вектора матрицы Tj&lt;br /&gt;
return result&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основной вклад в сложность даёт полная переортогонализация: на каждой из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций для всех &amp;lt;math&amp;gt;i \in [0...j-1]&amp;lt;/math&amp;gt; выполняется &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; сложений, итого &amp;lt;math&amp;gt;\frac{k(k-1)}{2} 4n \approx 2k^2 n&amp;lt;/math&amp;gt;. &lt;br /&gt;
Таким образом, для метода с полной переортогонализацией сложность составляет &amp;lt;math&amp;gt;O(k^2 n)&amp;lt;/math&amp;gt;, сложность по памяти -- &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:Lanczos graph.png|thumb|center|640px|Рисунок 1. Информационный граф]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Для процесса переортогонализации возможна параллельная оптимизация в двух местах:&lt;br /&gt;
* Итерации внутреннего цикла могут вычисляться параллельно, однако, требуется суммирование вычитаемых векторов, соответственно, сложность переортогонализации можно снизить с &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(n \log k)&amp;lt;/math&amp;gt;&lt;br /&gt;
* В каждой итерации внутреннего цикла возможно распараллеливание вычисления выражения справа (скалярное произведение и умножение вектора на число), что теоретически позволяет снизить сложность итерации с &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данны&#039;&#039;&#039;е: квадратная симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: собственные числа матрицы&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Полная переортогонализация соответствует повторной процедуре ортогонализациии Грама-Шмидта для обеспечения ортогональности вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; векторам &amp;lt;math&amp;gt;q_1, ..., q_k&amp;lt;/math&amp;gt;. В случае идеально точной арифметики данная переортогонализация не требовалась бы, однако в реальных вычислениях ошибки округления приводят к потере ортогональности, в связи с чем требуется переортогонализация.&lt;br /&gt;
Однако, единственной проблемой, возникающей при отсутствии переортогонализации, является появление повторных копий чисел Ритца (собственных значений), что в случае, если не требуется установление кратностей собственных значений, допустимо.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма примерно равна &amp;lt;math&amp;gt;2k^2 / n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Библиотека [http://www.nag.co.uk/numeric/fl/nagdoc_fl23/html/INDEXES/KWIC/lanczos.html NAG Library] содержит ряд процедур для решения СЛАУ и поиска собственных значений на основе алгоритма Ланцоша.&lt;br /&gt;
&lt;br /&gt;
[http://www.mathworks.com/help/techdoc/ref/eigs.html MATLAB] и [https://www.gnu.org/software/octave/doc/interpreter/Sparse-Linear-Algebra.html#doc_002deigs GNU Octave] позволяют с помощью функции &#039;&#039;eigs()&#039;&#039; находить собственные значения на основе данного алгоритма.&lt;br /&gt;
&lt;br /&gt;
Matlab-реализация доступна как часть [http://www.cs.cmu.edu/~bickson/gabp/#download Gaussian Belief Propagation Matlab Package]. [http://www.graphlab.ml.cmu.edu/pmf.html GraphLab] содержит несколько параллельных реализаций алгоритма на C++.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>Error0x0</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=21998</id>
		<title>Участник:Error0x0/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=21998"/>
		<updated>2017-02-01T18:15:01Z</updated>

		<summary type="html">&lt;p&gt;Error0x0: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(k^2 n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log k \log n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор описания: [[Участник:Error0x0|В. А. Янушковский]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша представляет собой итерационный алгоритм для вычисления собственных значений симметрической матрицы. &lt;br /&gt;
Идея алгоритма заключается в построении матрицы &amp;lt;math&amp;gt;Q_k = [q_1, ..., q_k]&amp;lt;/math&amp;gt; из ортонормированных векторов Ланцоша и использовании собственных значений трёхдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; (чисел Ритца) как приближения к искомым собственным числам матрицы&amp;lt;ref name=&amp;quot;Деммель&amp;quot;&amp;gt;Деммель&amp;amp;nbsp;Дж. Вычислительная линейная алгебра&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;q_1 = b/||b||_2, \beta_0=0, q_0=0&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;z = Aq_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# производится переортогонализация &amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1} {(z^T q_i)q_i}&amp;lt;/math&amp;gt;,&lt;br /&gt;
# &amp;lt;math&amp;gt;\beta_j = ||z||_2&amp;lt;/math&amp;gt;, если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt;, алгоритм останавливается,&lt;br /&gt;
# &amp;lt;math&amp;gt;q_{j+1} = z/\beta_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# вычисляются собственные значения и векторы матрицы &amp;lt;math&amp;gt;T_j = Q_j^T A Q_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Основной вклад в сложность алгоритма даёт полная переортогонализация внутри каждой итерации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1} {(z^T q_i)q_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
используются следующие макрооперации:&lt;br /&gt;
* Нахождение нормы вектора (евклидовой)&lt;br /&gt;
* Умножение/деление вектора на число&lt;br /&gt;
* Умножение матрицы на вектор (&amp;lt;math&amp;gt;z = Aq_j&amp;lt;/math&amp;gt;)&lt;br /&gt;
* Скалярное произведение двух векторов&lt;br /&gt;
* Вычитание векторов&lt;br /&gt;
* Вычисление собственных значений и векторов трёхдиагональной матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; (числа Ритца, используется метод &amp;quot;разделяй и властвуй&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
beta[0] = 0 # инициализация&lt;br /&gt;
q[0] = 0&lt;br /&gt;
q[1] = b / norm(b) # вычисление первого столбца&lt;br /&gt;
for j in [1 .. k]: # k итераций&lt;br /&gt;
    z = mul(A, q[j]) # вектор Ланцоша как произведение матрицы A на столбец q[j]&lt;br /&gt;
    alpha[j] = scalar_mul(q[j], z) # вычисление alpha[j]&lt;br /&gt;
    for i in [1 .. j - 1]: # полная переортогонализация&lt;br /&gt;
        z -= scalar_mul(z, q[i]) * q[i]&lt;br /&gt;
    beta[j] = norm(z) # вычисление нормы z&lt;br /&gt;
    if beta[j] == 0: # останов, если норма z равна нулю&lt;br /&gt;
        break&lt;br /&gt;
    result.append(next_ritz_number(alpha, beta, j)) # вычисление следующего собственного значения и вектора матрицы Tj&lt;br /&gt;
return result&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основной вклад в сложность даёт полная переортогонализация: на каждой из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций для всех &amp;lt;math&amp;gt;i \in [0...j-1]&amp;lt;/math&amp;gt; выполняется &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; сложений, итого &amp;lt;math&amp;gt;\frac{k(k-1)}{2} 4n \approx 2k^2 n&amp;lt;/math&amp;gt;. &lt;br /&gt;
таким образом, для метода с полной переортогонализацией сложность составляет &amp;lt;math&amp;gt;O(k^2 n)&amp;lt;/math&amp;gt;, сложность по памяти -- &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:Lanczos graph.png|thumb|center|640px|Рисунок 1. Информационный граф]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Для процесса переортогонализации возможна параллельная оптимизация в двух местах:&lt;br /&gt;
* Итерации внутреннего цикла могут вычисляться параллельно, однако, требуется суммирование вычитаемых векторов, соответственно, сложность переортогонализации можно снизить с &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(n \log k)&amp;lt;/math&amp;gt;&lt;br /&gt;
* В каждой итерации внутреннего цикла возможно распараллеливание вычисления выражения справа (скалярное произведение и умножение вектора на число), что теоретически позволяет снизить сложность итерации с &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данны&#039;&#039;&#039;е: квадратная симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: собственные числа матрицы&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Полная переортогонализация соответствует повторной процедуре ортогонализациии Грама-Шмидта для обеспечения ортогональности вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; векторам &amp;lt;math&amp;gt;q_1, ..., q_k&amp;lt;/math&amp;gt;. В случае идеально точной арифметики данная переортогонализация не требовалась бы, однако в реальных вычислениях ошибки округления приводят к потере ортогональности, в связи с чем требуется переортогонализация.&lt;br /&gt;
Однако, единственной проблемой, возникающей при отсутствии переортогонализации, является появление повторных копий чисел Ритца (собственных значений), что в случае, если не требуется установление кратностей собственных значений, допустимо.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма примерно равна &amp;lt;math&amp;gt;2k^2 / n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Библиотека [http://www.nag.co.uk/numeric/fl/nagdoc_fl23/html/INDEXES/KWIC/lanczos.html NAG Library] содержит ряд процедур для решения СЛАУ и поиска собственных значений на основе алгоритма Ланцоша.&lt;br /&gt;
&lt;br /&gt;
[http://www.mathworks.com/help/techdoc/ref/eigs.html MATLAB] и [https://www.gnu.org/software/octave/doc/interpreter/Sparse-Linear-Algebra.html#doc_002deigs GNU Octave] позволяют с помощью функции &#039;&#039;eigs()&#039;&#039; находить собственные значения на основе данного алгоритма.&lt;br /&gt;
&lt;br /&gt;
Matlab-реализация доступна как часть [http://www.cs.cmu.edu/~bickson/gabp/#download Gaussian Belief Propagation Matlab Package]. [http://www.graphlab.ml.cmu.edu/pmf.html GraphLab] содержит несколько параллельных реализаций алгоритма на C++.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>Error0x0</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=21997</id>
		<title>Участник:Error0x0/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=21997"/>
		<updated>2017-02-01T18:05:13Z</updated>

		<summary type="html">&lt;p&gt;Error0x0: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(k^2 n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log k \log n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор описания: [[Участник:Error0x0|В. А. Янушковский]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша представляет собой итерационный алгоритм для вычисления собственных значений симметрической матрицы. &lt;br /&gt;
Идея алгоритма заключается в построении матрицы &amp;lt;math&amp;gt;Q_k = [q_1, ..., q_k]&amp;lt;/math&amp;gt; из ортонормированных векторов Ланцоша и использовании собственных значений трёхдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; (чисел Ритца) как приближения к искомым собственным числам матрицы&amp;lt;ref name=&amp;quot;Деммель&amp;quot;&amp;gt;Деммель&amp;amp;nbsp;Дж. Вычислительная линейная алгебра&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;q_1 = b/||b||_2, \beta_0=0, q_0=0&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;z = Aq_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# производится переортогонализация &amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1} {(z^T q_i)q_i}&amp;lt;/math&amp;gt;,&lt;br /&gt;
# &amp;lt;math&amp;gt;\beta_j = ||z||_2&amp;lt;/math&amp;gt;, если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt;, алгоритм останавливается,&lt;br /&gt;
# &amp;lt;math&amp;gt;q_{j+1} = z/\beta_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# вычисляются собственные значения и векторы матрицы &amp;lt;math&amp;gt;T_j = Q_j^T A Q_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Основной вклад в сложность алгоритма даёт полная переортогонализация внутри каждой итерации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1} {(z^T q_i)q_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные элементы алгоритма:&lt;br /&gt;
* Нахождение векторов Ланцоша&lt;br /&gt;
* Полная переортогонализация (Грамма-Шмидта)&lt;br /&gt;
* Вычисление собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; (числа Ритца)&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
beta[0] = 0 # инициализация&lt;br /&gt;
q[0] = 0&lt;br /&gt;
q[1] = b / norm(b) # вычисление первого столбца&lt;br /&gt;
for j in [1 .. k]: # k итераций&lt;br /&gt;
    z = mul(A, q[j]) # вектор Ланцоша как произведение матрицы A на столбец q[j]&lt;br /&gt;
    alpha[j] = scalar_mul(q[j], z) # вычисление alpha[j]&lt;br /&gt;
    for i in [1 .. j - 1]: # полная переортогонализация&lt;br /&gt;
        z -= mul(scalar_mul(z, q[i]), q[i])&lt;br /&gt;
    beta[j] = norm(z) # вычисление нормы z&lt;br /&gt;
    if beta[j] == 0: # останов, если норма z равна нулю&lt;br /&gt;
        break&lt;br /&gt;
    result.append(next_ritz_number(alpha, beta, j)) # вычисление следующего собственного значения и вектора матрицы Tj&lt;br /&gt;
return result&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основной вклад в сложность даёт полная переортогонализация: на каждой из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций для всех &amp;lt;math&amp;gt;i \in [0...j-1]&amp;lt;/math&amp;gt; выполняется &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; сложений, итого &amp;lt;math&amp;gt;\frac{k(k-1)}{2} 4n \approx 2k^2 n&amp;lt;/math&amp;gt;. &lt;br /&gt;
таким образом, для метода с полной переортогонализацией сложность составляет &amp;lt;math&amp;gt;O(k^2 n)&amp;lt;/math&amp;gt;, сложность по памяти -- &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:Lanczos graph.png|thumb|center|640px|Рисунок 1. Информационный граф]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Для процесса переортогонализации возможна параллельная оптимизация в двух местах:&lt;br /&gt;
* Итерации внутреннего цикла могут вычисляться параллельно, однако, требуется суммирование вычитаемых векторов, соответственно, сложность переортогонализации можно снизить с &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(n \log k)&amp;lt;/math&amp;gt;&lt;br /&gt;
* В каждой итерации внутреннего цикла возможно распараллеливание вычисления выражения справа (скалярное произведение и умножение вектора на число), что теоретически позволяет снизить сложность итерации с &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данны&#039;&#039;&#039;е: квадратная симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: собственные числа матрицы&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Полная переортогонализация соответствует повторной процедуре ортогонализациии Грама-Шмидта для обеспечения ортогональности вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; векторам &amp;lt;math&amp;gt;q_1, ..., q_k&amp;lt;/math&amp;gt;. В случае идеально точной арифметики данная переортогонализация не требовалась бы, однако в реальных вычислениях ошибки округления приводят к потере ортогональности, в связи с чем требуется переортогонализация.&lt;br /&gt;
Однако, единственной проблемой, возникающей при отсутствии переортогонализации, является появление повторных копий чисел Ритца (собственных значений), что в случае, если не требуется установление кратностей собственных значений, допустимо.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма примерно равна &amp;lt;math&amp;gt;2k^2 / n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Библиотека [http://www.nag.co.uk/numeric/fl/nagdoc_fl23/html/INDEXES/KWIC/lanczos.html NAG Library] содержит ряд процедур для решения СЛАУ и поиска собственных значений на основе алгоритма Ланцоша.&lt;br /&gt;
&lt;br /&gt;
[http://www.mathworks.com/help/techdoc/ref/eigs.html MATLAB] и [https://www.gnu.org/software/octave/doc/interpreter/Sparse-Linear-Algebra.html#doc_002deigs GNU Octave] позволяют с помощью функции &#039;&#039;eigs()&#039;&#039; находить собственные значения на основе данного алгоритма.&lt;br /&gt;
&lt;br /&gt;
Matlab-реализация доступна как часть [http://www.cs.cmu.edu/~bickson/gabp/#download Gaussian Belief Propagation Matlab Package]. [http://www.graphlab.ml.cmu.edu/pmf.html GraphLab] содержит несколько параллельных реализаций алгоритма на C++.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>Error0x0</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=21996</id>
		<title>Участник:Error0x0/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=21996"/>
		<updated>2017-02-01T18:04:44Z</updated>

		<summary type="html">&lt;p&gt;Error0x0: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(k^2 n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log k \log n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор описания: [[Участник:Error0x0|В. А. Янушковский]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша представляет собой итерационный алгоритм для вычисления собственных значений симметрической матрицы. &lt;br /&gt;
Идея алгоритма заключается в построении матрицы &amp;lt;math&amp;gt;Q_k = [q_1, ..., q_k]&amp;lt;/math&amp;gt; из ортонормированных векторов Ланцоша и использовании собственных значений трёхдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; (чисел Ритца) как приближения к искомым собственным числам матрицы&amp;lt;ref name=&amp;quot;Деммель&amp;quot;&amp;gt;Деммель&amp;amp;nbsp;Дж. Вычислительная линейная алгебра&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;q_1 = b/||b||_2, \beta_0=0, q_0=0&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;z = Aq_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# производится переортогонализация &amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1} {(z^T q_i)q_i}&amp;lt;/math&amp;gt;,&lt;br /&gt;
# &amp;lt;math&amp;gt;\beta_j = ||z||_2&amp;lt;/math&amp;gt;, если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt;, алгоритм останавливается,&lt;br /&gt;
# &amp;lt;math&amp;gt;q_{j+1} = z/\beta_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# вычисляются собственные значения и векторы матрицы &amp;lt;math&amp;gt;T_j = Q_j^T A Q_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Основной вклад в сложность алгоритма даёт полная переортогонализация внутри каждой итерации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1} {(z^T q_i)q_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные элементы алгоритма:&lt;br /&gt;
* Нахождение векторов Ланцоша&lt;br /&gt;
* Полная переортогонализация (Грамма-Шмидта)&lt;br /&gt;
* Вычисление собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; (числа Ритца)&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
beta[0] = 0 # инициализация&lt;br /&gt;
q[0] = 0&lt;br /&gt;
q[1] = b / norm(b) # вычисление первого столбца&lt;br /&gt;
for j in [1 .. k]: # k итераций&lt;br /&gt;
    z = mul(A, q[j]) # вектор Ланцоша как произведение матрицы A на столбец q[j]&lt;br /&gt;
    alpha[j] = scalar_mul(q[j], z) # вычисление alpha[j]&lt;br /&gt;
    for i in [1 .. j - 1]: # полная переортогонализация&lt;br /&gt;
        z -= mul(scalar_mul(z, q[i]), q[i])&lt;br /&gt;
    beta[j] = norm(z) # вычисление нормы z&lt;br /&gt;
    if beta[j] == 0: # останов, если норма z равна нулю&lt;br /&gt;
        break&lt;br /&gt;
    result.append(next_ritz_number(alpha, beta, j)) # вычисление следующего собственного значения и вектора матрицы Tj&lt;br /&gt;
return result&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основной вклад в сложность даёт полная переортогонализация: на каждой из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций для всех &amp;lt;math&amp;gt;i \in [0...j-1]&amp;lt;/math&amp;gt; выполняется &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; сложений, итого &amp;lt;math&amp;gt;\frac{k(k-1)}{2} 4n \approx 2k^2 n&amp;lt;/math&amp;gt;. &lt;br /&gt;
таким образом, для метода с полной переортогонализацией сложность составляет &amp;lt;math&amp;gt;O(k^2 n)&amp;lt;/math&amp;gt;, сложность по памяти -- &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:Lanczos graph.png|thumb|center|640px|Рисунок 1. Информационный граф]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Для процесса переортогонализации возможна параллельная оптимизация в двух местах:&lt;br /&gt;
* Итерации внутреннего цикла могут вычисляться параллельно, однако, требуется суммирование вычитаемых векторов, соответственно, сложность переортогонализации можно снизить с &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(n \log k)&amp;lt;/math&amp;gt;&lt;br /&gt;
* В каждой итерации внутреннего цикла возможно распараллеливание вычисления выражения справа (скалярное произведение и умножение вектора на число), что теоретически позволяет снизить сложность итерации с &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данны&#039;&#039;&#039;е: квадратная симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: собственные числа матрицы&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Полная переортогонализация соответствует повторной процедуре ортогонализациии Грама-Шмидта для обеспечения ортогональности вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; векторам &amp;lt;math&amp;gt;q_1, ..., q_k&amp;lt;/math&amp;gt;. В случае идеально точной арифметики данная переортогонализация не требовалась бы, однако в реальных вычислениях ошибки округления приводят к потере ортогональности, в связи с чем требуется переортогонализация.&lt;br /&gt;
Однако, единственной проблемой, возникающей при отсутствии переортогонализации, является появление повторных копий чисел Ритца (собственных значений), что в случае, если не требуется установление кратностей собственных значений, допустимо.&lt;br /&gt;
Вычислительная мощность алгоритма примерно равна &amp;lt;math&amp;gt;2k^2 / n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность данного алгоритма: &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Библиотека [http://www.nag.co.uk/numeric/fl/nagdoc_fl23/html/INDEXES/KWIC/lanczos.html NAG Library] содержит ряд процедур для решения СЛАУ и поиска собственных значений на основе алгоритма Ланцоша.&lt;br /&gt;
&lt;br /&gt;
[http://www.mathworks.com/help/techdoc/ref/eigs.html MATLAB] и [https://www.gnu.org/software/octave/doc/interpreter/Sparse-Linear-Algebra.html#doc_002deigs GNU Octave] позволяют с помощью функции &#039;&#039;eigs()&#039;&#039; находить собственные значения на основе данного алгоритма.&lt;br /&gt;
&lt;br /&gt;
Matlab-реализация доступна как часть [http://www.cs.cmu.edu/~bickson/gabp/#download Gaussian Belief Propagation Matlab Package]. [http://www.graphlab.ml.cmu.edu/pmf.html GraphLab] содержит несколько параллельных реализаций алгоритма на C++.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>Error0x0</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=21969</id>
		<title>Участник:Error0x0/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=21969"/>
		<updated>2017-02-01T15:21:58Z</updated>

		<summary type="html">&lt;p&gt;Error0x0: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(k^2 n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log k \log n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор описания: [[Участник:Error0x0|В. А. Янушковский]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша представляет собой итерационный алгоритм для вычисления собственных значений симметрической матрицы. &lt;br /&gt;
Идея алгоритма заключается в построении матрицы &amp;lt;math&amp;gt;Q_k = [q_1, ..., q_k]&amp;lt;/math&amp;gt; из ортонормированных векторов Ланцоша и использовании собственных значений трёхдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; (чисел Ритца) как приближения к искомым собственным числам матрицы&amp;lt;ref name=&amp;quot;Деммель&amp;quot;&amp;gt;Деммель&amp;amp;nbsp;Дж. Вычислительная линейная алгебра&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;q_1 = b/||b||_2, \beta_0=0, q_0=0&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;z = Aq_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# производится переортогонализация &amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1} {(z^T q_i)q_i}&amp;lt;/math&amp;gt;,&lt;br /&gt;
# &amp;lt;math&amp;gt;\beta_j = ||z||_2&amp;lt;/math&amp;gt;, если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt;, алгоритм останавливается,&lt;br /&gt;
# &amp;lt;math&amp;gt;q_{j+1} = z/\beta_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# вычисляются собственные значения и векторы матрицы &amp;lt;math&amp;gt;T_j = Q_j^T A Q_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Основной вклад в сложность алгоритма даёт полная переортогонализация внутри каждой итерации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1} {(z^T q_i)q_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные элементы алгоритма:&lt;br /&gt;
* Нахождение векторов Ланцоша&lt;br /&gt;
* Полная переортогонализация (Грамма-Шмидта)&lt;br /&gt;
* Вычисление собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; (числа Ритца)&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
q[1] = b / norm(b)&lt;br /&gt;
beta[0] = 0&lt;br /&gt;
q[0] = 0&lt;br /&gt;
for j in [1 .. k]:&lt;br /&gt;
    z = mul(A, q[j])&lt;br /&gt;
    zT = transposed(z)&lt;br /&gt;
    for i in [1 .. j - 1]:&lt;br /&gt;
        z -= mul(scalar_mul(zT, q[i]), q[i])&lt;br /&gt;
    beta[j] = norm(z)&lt;br /&gt;
    if beta[j] == 0:&lt;br /&gt;
        break&lt;br /&gt;
    result = ritz_numbers(mul(transpose(Q[j]), A, Q[j]))&lt;br /&gt;
return result&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Для метода с полной переортогонализацией сложность составляет &amp;lt;math&amp;gt;O(k^2 n)&amp;lt;/math&amp;gt;, сложность по памяти -- &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:Lanczos graph.png|thumb|center|640px|Рисунок 1. Информационный граф]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Для процесса переортогонализации возможна параллельная оптимизация в двух местах:&lt;br /&gt;
* Итерации внутреннего цикла могут вычисляться параллельно, однако, требуется суммирование вычитаемых векторов, соответственно, сложность переортогонализации можно снизить с &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(n \log k)&amp;lt;/math&amp;gt;&lt;br /&gt;
* В каждой итерации внутреннего цикла возможно распараллеливание вычисления выражения справа (скалярное произведение и умножение вектора на число), что теоретически позволяет снизить сложность итерации с &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данны&#039;&#039;&#039;е: квадратная симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: собственные числа матрицы&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Полная переортогонализация соответствует повторной процедуре ортогонализациии Грама-Шмидта для обеспечения ортогональности вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; векторам &amp;lt;math&amp;gt;q_1, ..., q_k&amp;lt;/math&amp;gt;. В случае идеально точной арифметики данная переортогонализация не требовалась бы, однако в реальных вычислениях ошибки округления приводят к потере ортогональности, в связи с чем требуется переортогонализация.&lt;br /&gt;
Однако, единственной проблемой, возникающей при отсутствии переортогонализации, является появление повторных копий чисел Ритца (собственных значений), что в случае, если не требуется установление кратностей собственных значений, допустимо.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность данного алгоритма: &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Библиотека [http://www.nag.co.uk/numeric/fl/nagdoc_fl23/html/INDEXES/KWIC/lanczos.html NAG Library] содержит ряд процедур для решения СЛАУ и поиска собственных значений на основе алгоритма Ланцоша.&lt;br /&gt;
&lt;br /&gt;
[http://www.mathworks.com/help/techdoc/ref/eigs.html MATLAB] и [https://www.gnu.org/software/octave/doc/interpreter/Sparse-Linear-Algebra.html#doc_002deigs GNU Octave] позволяют с помощью функции &#039;&#039;eigs()&#039;&#039; находить собственные значения на основе данного алгоритма.&lt;br /&gt;
&lt;br /&gt;
Matlab-реализация доступна как часть [http://www.cs.cmu.edu/~bickson/gabp/#download Gaussian Belief Propagation Matlab Package]. [http://www.graphlab.ml.cmu.edu/pmf.html GraphLab] содержит несколько параллельных реализаций алгоритма на C++.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>Error0x0</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=21967</id>
		<title>Участник:Error0x0/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=21967"/>
		<updated>2017-02-01T15:18:41Z</updated>

		<summary type="html">&lt;p&gt;Error0x0: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(k^2 n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log k \log n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор описания: [[Участник:Error0x0|В. А. Янушковский]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша представляет собой итерационный алгоритм для вычисления собственных значений симметрической матрицы. &lt;br /&gt;
Идея алгоритма заключается в построении матрицы &amp;lt;math&amp;gt;Q_k = [q_1, ..., q_k]&amp;lt;/math&amp;gt; из ортонормированных векторов Ланцоша и использовании собственных значений трёхдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; (чисел Ритца) как приближения к искомым собственным числам матрицы&amp;lt;ref name=&amp;quot;Деммель&amp;quot;&amp;gt;Деммель&amp;amp;nbsp;Дж. Вычислительная линейная алгебра&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;q_1 = b/||b||_2, \beta_0=0, q_0=0&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;z = Aq_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# производится переортогонализация &amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1} {(z^T q_i)q_i}&amp;lt;/math&amp;gt;,&lt;br /&gt;
# &amp;lt;math&amp;gt;\beta_j = ||z||_2&amp;lt;/math&amp;gt;, если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt;, алгоритм останавливается,&lt;br /&gt;
# &amp;lt;math&amp;gt;q_{j+1} = z/\beta_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# вычисляются собственные значения и векторы матрицы &amp;lt;math&amp;gt;T_j = Q_j^T A Q_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Основной вклад в сложность алгоритма даёт полная переортогонализация внутри каждой итерации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1} {(z^T q_i)q_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные элементы алгоритма:&lt;br /&gt;
* Нахождение векторов Ланцоша&lt;br /&gt;
* Полная переортогонализация (Грамма-Шмидта)&lt;br /&gt;
* Вычисление собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; (числа Ритца)&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
q[1] = b / norm(b)&lt;br /&gt;
beta[0] = 0&lt;br /&gt;
q[0] = 0&lt;br /&gt;
for j in [1 .. k]:&lt;br /&gt;
    z = mul(A, q[j])&lt;br /&gt;
    zT = transposed(z)&lt;br /&gt;
    for i in [1 .. j - 1]:&lt;br /&gt;
        z -= mul(scalar_mul(zT, q[i]), q[i])&lt;br /&gt;
    beta[j] = norm(z)&lt;br /&gt;
    if beta[j] == 0:&lt;br /&gt;
        break&lt;br /&gt;
    result = ritz_numbers(mul(transpose(Q[j]), A, Q[j]))&lt;br /&gt;
return result&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Для метода с полной переортогонализацией сложность составляет &amp;lt;math&amp;gt;O(k^2 n)&amp;lt;/math&amp;gt;, сложность по памяти -- &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:Lanczos graph.png|thumb|center|640px|Рисунок 1. Информационный граф]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Для процесса переортогонализации возможна параллельная оптимизация в двух местах:&lt;br /&gt;
* Итерации внутреннего цикла могут вычисляться параллельно, однако, требуется суммирование вычитаемых векторов, соответственно, сложность переортогонализации можно снизить с &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(n \log k)&amp;lt;/math&amp;gt;&lt;br /&gt;
* В каждой итерации внутреннего цикла возможно распараллеливание вычисления выражения справа (скалярное произведение и умножение вектора на число), что теоретически позволяет снизить сложность итерации с &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данны&#039;&#039;&#039;е: квадратная симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: собственные числа матрицы&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Полная переортогонализация соответствует повторной процедуре ортогонализациии Грама-Шмидта для обеспечения ортогональности вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; векторам &amp;lt;math&amp;gt;q_1, ..., q_k&amp;lt;/math&amp;gt;. В случае идеально точной арифметики данная переортогонализация не требовалась бы, однако в реальных вычислениях ошибки округления приводят к потере ортогональности, в связи с чем требуется переортогонализация.&lt;br /&gt;
Однако, единственной проблемой, возникающей при отсутствии переортогонализации, является появление повторных копий чисел Ритца (собственных значений), что в случае, если не требуется установление кратностей собственных значений, допустимо.&lt;br /&gt;
&lt;br /&gt;
Последовательная сложность данного алгоритма: &amp;lt;math&amp;gt;O(k^2 n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Библиотека [http://www.nag.co.uk/numeric/fl/nagdoc_fl23/html/INDEXES/KWIC/lanczos.html NAG Library] содержит ряд процедур для решения СЛАУ и поиска собственных значений на основе алгоритма Ланцоша.&lt;br /&gt;
&lt;br /&gt;
[http://www.mathworks.com/help/techdoc/ref/eigs.html MATLAB] и [https://www.gnu.org/software/octave/doc/interpreter/Sparse-Linear-Algebra.html#doc_002deigs GNU Octave] позволяют с помощью функции &#039;&#039;eigs()&#039;&#039; находить собственные значения на основе данного алгоритма.&lt;br /&gt;
&lt;br /&gt;
Matlab-реализация доступна как часть [http://www.cs.cmu.edu/~bickson/gabp/#download Gaussian Belief Propagation Matlab Package]. [http://www.graphlab.ml.cmu.edu/pmf.html GraphLab] содержит несколько параллельных реализаций алгоритма на C++.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>Error0x0</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Error0x0&amp;diff=15025</id>
		<title>Обсуждение участника:Error0x0</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Error0x0&amp;diff=15025"/>
		<updated>2016-10-31T11:09:57Z</updated>

		<summary type="html">&lt;p&gt;Error0x0: /* Статья Участник:Error0x0/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Участник:Error0x0/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией]] ==&lt;br /&gt;
&lt;br /&gt;
* В разделе 1.3 не приведено описание вычислительного ядра&lt;br /&gt;
* Не указано ФИО автора&lt;br /&gt;
* Не приведена краткая сводка свойств алгоритма в начале статьи&lt;br /&gt;
&lt;br /&gt;
Добавил.&lt;/div&gt;</summary>
		<author><name>Error0x0</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=15023</id>
		<title>Участник:Error0x0/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=15023"/>
		<updated>2016-10-31T11:07:18Z</updated>

		<summary type="html">&lt;p&gt;Error0x0: &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(k^2 n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log k \log n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор описания: [[Участник:Error0x0|В. А. Янушковский]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша представляет собой итерационный алгоритм для вычисления собственных значений симметрической матрицы. &lt;br /&gt;
Идея алгоритма заключается в построении матрицы &amp;lt;math&amp;gt;Q_k = [q_1, ..., q_k]&amp;lt;/math&amp;gt; из ортонормированных векторов Ланцоша и использовании собственных значений трёхдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; (чисел Ритца) как приближения к искомым собственным числам матрицы&amp;lt;ref name=&amp;quot;Деммель&amp;quot;&amp;gt;Деммель&amp;amp;nbsp;Дж. Вычислительная линейная алгебра&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;q_1 = b/||b||_2, \beta_0=0, q_0=0&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;z = Aq_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# производится переортогонализация &amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1} {(z^T q_i)q_i}&amp;lt;/math&amp;gt;,&lt;br /&gt;
# &amp;lt;math&amp;gt;\beta_j = ||z||_2&amp;lt;/math&amp;gt;, если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt;, алгоритм останавливается,&lt;br /&gt;
# &amp;lt;math&amp;gt;q_{j+1} = z/\beta_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# вычисляются собственные значения и векторы матрицы &amp;lt;math&amp;gt;T_j = Q_j^T A Q_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Основной вклад в сложность алгоритма даёт полная переортогонализация внутри каждой итерации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1} {(z^T q_i)q_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные элементы алгоритма:&lt;br /&gt;
* Нахождение векторов Ланцоша&lt;br /&gt;
* Полная переортогонализация (Грамма-Шмидта)&lt;br /&gt;
* Вычисление собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; (числа Ритца)&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
q[1] = b / norm(b)&lt;br /&gt;
beta[0] = 0&lt;br /&gt;
q[0] = 0&lt;br /&gt;
for j in [1 .. k]:&lt;br /&gt;
    z = mul(A, q[j])&lt;br /&gt;
    zT = transposed(z)&lt;br /&gt;
    for i in [1 .. j - 1]:&lt;br /&gt;
        z -= mul(scalar_mul(zT, q[i]), q[i])&lt;br /&gt;
    beta[j] = norm(z)&lt;br /&gt;
    if beta[j] == 0:&lt;br /&gt;
        break&lt;br /&gt;
    result = ritz_numbers(mul(transpose(Q[j]), A, Q[j]))&lt;br /&gt;
return result&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Для метода с полной переортогонализацией сложность составляет &amp;lt;math&amp;gt;O(k^2 n)&amp;lt;/math&amp;gt;, сложность по памяти -- &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:Lanczos graph.png|thumb|center|640px|Рисунок 1. Информационный граф]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Для процесса переортогонализации возможна параллельная оптимизация в двух местах:&lt;br /&gt;
* Итерации внутреннего цикла могут вычисляться параллельно, однако, требуется суммирование вычитаемых векторов, соответственно, сложность переортогонализации можно снизить с &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(n \log k)&amp;lt;/math&amp;gt;&lt;br /&gt;
* В каждой итерации внутреннего цикла возможно распараллеливание вычисления выражения справа (скалярное произведение и умножение вектора на число), что теоретически позволяет снизить сложность итерации с &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данны&#039;&#039;&#039;е: квадратная симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: собственные числа матрицы&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Полная переортогонализация соответствует повторной процедуре ортогонализациии Грама-Шмидта для обеспечения ортогональности вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; векторам &amp;lt;math&amp;gt;q_1, ..., q_k&amp;lt;/math&amp;gt;. В случае идеально точной арифметики данная переортогонализация не требовалась бы, однако в реальных вычислениях ошибки округления приводят к потере ортогональности, в связи с чем требуется переортогонализация.&lt;br /&gt;
Однако, единственной проблемой, возникающей при отсутствии переортогонализации, является появление повторных копий чисел Ритца (собственных значений), что в случае, если не требуется установление кратностей собственных значений, допустимо.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Библиотека [http://www.nag.co.uk/numeric/fl/nagdoc_fl23/html/INDEXES/KWIC/lanczos.html NAG Library] содержит ряд процедур для решения СЛАУ и поиска собственных значений на основе алгоритма Ланцоша.&lt;br /&gt;
&lt;br /&gt;
[http://www.mathworks.com/help/techdoc/ref/eigs.html MATLAB] и [https://www.gnu.org/software/octave/doc/interpreter/Sparse-Linear-Algebra.html#doc_002deigs GNU Octave] позволяют с помощью функции &#039;&#039;eigs()&#039;&#039; находить собственные значения на основе данного алгоритма.&lt;br /&gt;
&lt;br /&gt;
Matlab-реализация доступна как часть [http://www.cs.cmu.edu/~bickson/gabp/#download Gaussian Belief Propagation Matlab Package]. [http://www.graphlab.ml.cmu.edu/pmf.html GraphLab] содержит несколько параллельных реализаций алгоритма на C++.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>Error0x0</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=15022</id>
		<title>Участник:Error0x0/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=15022"/>
		<updated>2016-10-31T11:05:22Z</updated>

		<summary type="html">&lt;p&gt;Error0x0: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(k^2 n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log k \log n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Автор описания: [[Участник:Error0x0|В. А. Янушковский]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша представляет собой итерационный алгоритм для вычисления собственных значений симметрической матрицы. &lt;br /&gt;
Идея алгоритма заключается в построении матрицы &amp;lt;math&amp;gt;Q_k = [q_1, ..., q_k]&amp;lt;/math&amp;gt; из ортонормированных векторов Ланцоша и использовании собственных значений трёхдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; (чисел Ритца) как приближения к искомым собственным числам матрицы&amp;lt;ref name=&amp;quot;Деммель&amp;quot;&amp;gt;Деммель&amp;amp;nbsp;Дж. Вычислительная линейная алгебра&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;q_1 = b/||b||_2, \beta_0=0, q_0=0&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;z = Aq_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# производится переортогонализация &amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1} {(z^T q_i)q_i}&amp;lt;/math&amp;gt;,&lt;br /&gt;
# &amp;lt;math&amp;gt;\beta_j = ||z||_2&amp;lt;/math&amp;gt;, если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt;, алгоритм останавливается,&lt;br /&gt;
# &amp;lt;math&amp;gt;q_{j+1} = z/\beta_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# вычисляются собственные значения и векторы матрицы &amp;lt;math&amp;gt;T_j = Q_j^T A Q_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Основной вклад в сложность алгоритма даёт полная переортогонализация внутри каждой итерации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1} {(z^T q_i)q_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные элементы алгоритма:&lt;br /&gt;
* Нахождение векторов Ланцоша&lt;br /&gt;
* Полная переортогонализация (Грамма-Шмидта)&lt;br /&gt;
* Вычисление собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; (числа Ритца)&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
q[1] = b / norm(b)&lt;br /&gt;
beta[0] = 0&lt;br /&gt;
q[0] = 0&lt;br /&gt;
for j in [1 .. k]:&lt;br /&gt;
    z = mul(A, q[j])&lt;br /&gt;
    zT = transposed(z)&lt;br /&gt;
    for i in [1 .. j - 1]:&lt;br /&gt;
        z -= mul(scalar_mul(zT, q[i]), q[i])&lt;br /&gt;
    beta[j] = norm(z)&lt;br /&gt;
    if beta[j] == 0:&lt;br /&gt;
        break&lt;br /&gt;
    result = ritz_numbers(mul(transpose(Q[j]), A, Q[j]))&lt;br /&gt;
return result&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Для метода с полной переортогонализацией сложность составляет &amp;lt;math&amp;gt;O(k^2 n)&amp;lt;/math&amp;gt;, сложность по памяти -- &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:Lanczos graph.png|thumb|center|640px|Рисунок 1. Информационный граф]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Для процесса переортогонализации возможна параллельная оптимизация в двух местах:&lt;br /&gt;
* Итерации внутреннего цикла могут вычисляться параллельно, однако, требуется суммирование вычитаемых векторов, соответственно, сложность переортогонализации можно снизить с &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(n \log k)&amp;lt;/math&amp;gt;&lt;br /&gt;
* В каждой итерации внутреннего цикла возможно распараллеливание вычисления выражения справа (скалярное произведение и умножение вектора на число), что теоретически позволяет снизить сложность итерации с &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данны&#039;&#039;&#039;е: квадратная симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: собственные числа матрицы&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Полная переортогонализация соответствует повторной процедуре ортогонализациии Грама-Шмидта для обеспечения ортогональности вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; векторам &amp;lt;math&amp;gt;q_1, ..., q_k&amp;lt;/math&amp;gt;. В случае идеально точной арифметики данная переортогонализация не требовалась бы, однако в реальных вычислениях ошибки округления приводят к потере ортогональности, в связи с чем требуется переортогонализация.&lt;br /&gt;
Однако, единственной проблемой, возникающей при отсутствии переортогонализации, является появление повторных копий чисел Ритца (собственных значений), что в случае, если не требуется установление кратностей собственных значений, допустимо.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Библиотека [http://www.nag.co.uk/numeric/fl/nagdoc_fl23/html/INDEXES/KWIC/lanczos.html NAG Library] содержит ряд процедур для решения СЛАУ и поиска собственных значений на основе алгоритма Ланцоша.&lt;br /&gt;
&lt;br /&gt;
[http://www.mathworks.com/help/techdoc/ref/eigs.html MATLAB] и [https://www.gnu.org/software/octave/doc/interpreter/Sparse-Linear-Algebra.html#doc_002deigs GNU Octave] позволяют с помощью функции &#039;&#039;eigs()&#039;&#039; находить собственные значения на основе данного алгоритма.&lt;br /&gt;
&lt;br /&gt;
Matlab-реализация доступна как часть [http://www.cs.cmu.edu/~bickson/gabp/#download Gaussian Belief Propagation Matlab Package]. [http://www.graphlab.ml.cmu.edu/pmf.html GraphLab] содержит несколько параллельных реализаций алгоритма на C++.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>Error0x0</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=11955</id>
		<title>Участник:Error0x0/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=11955"/>
		<updated>2016-10-15T20:48:03Z</updated>

		<summary type="html">&lt;p&gt;Error0x0: /* ЧАСТЬ. Программная реализация алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша представляет собой итерационный алгоритм для вычисления собственных значений симметрической матрицы. &lt;br /&gt;
Идея алгоритма заключается в построении матрицы &amp;lt;math&amp;gt;Q_k = [q_1, ..., q_k]&amp;lt;/math&amp;gt; из ортонормированных векторов Ланцоша и использовании собственных значений трёхдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; (чисел Ритца) как приближения к искомым собственным числам матрицы&amp;lt;ref name=&amp;quot;Деммель&amp;quot;&amp;gt;Деммель&amp;amp;nbsp;Дж. Вычислительная линейная алгебра&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;q_1 = b/||b||_2, \beta_0=0, q_0=0&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;z = Aq_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# производится переортогонализация &amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1} {(z^T q_i)q_i}&amp;lt;/math&amp;gt;,&lt;br /&gt;
# &amp;lt;math&amp;gt;\beta_j = ||z||_2&amp;lt;/math&amp;gt;, если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt;, алгоритм останавливается,&lt;br /&gt;
# &amp;lt;math&amp;gt;q_{j+1} = z/\beta_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# вычисляются собственные значения и векторы матрицы &amp;lt;math&amp;gt;T_j = Q_j^T A Q_j&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;
* Вычисление собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; (числа Ритца)&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
q[1] = b / norm(b)&lt;br /&gt;
beta[0] = 0&lt;br /&gt;
q[0] = 0&lt;br /&gt;
for j in [1 .. k]:&lt;br /&gt;
    z = mul(A, q[j])&lt;br /&gt;
    zT = transposed(z)&lt;br /&gt;
    for i in [1 .. j - 1]:&lt;br /&gt;
        z -= mul(scalar_mul(zT, q[i]), q[i])&lt;br /&gt;
    beta[j] = norm(z)&lt;br /&gt;
    if beta[j] == 0:&lt;br /&gt;
        break&lt;br /&gt;
    result = ritz_numbers(mul(transpose(Q[j]), A, Q[j]))&lt;br /&gt;
return result&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Для метода с полной переортогонализацией сложность составляет &amp;lt;math&amp;gt;O(k^2 n)&amp;lt;/math&amp;gt;, сложность по памяти -- &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:Lanczos graph.png|thumb|center|640px|Рисунок 1. Информационный граф]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Для процесса переортогонализации возможна параллельная оптимизация в двух местах:&lt;br /&gt;
* Итерации внутреннего цикла могут вычисляться параллельно, однако, требуется суммирование вычитаемых векторов, соответственно, сложность переортогонализации можно снизить с &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(n \log k)&amp;lt;/math&amp;gt;&lt;br /&gt;
* В каждой итерации внутреннего цикла возможно распараллеливание вычисления выражения справа (скалярное произведение и умножение вектора на число), что теоретически позволяет снизить сложность итерации с &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данны&#039;&#039;&#039;е: квадратная симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: собственные числа матрицы&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Полная переортогонализация соответствует повторной процедуре ортогонализациии Грама-Шмидта для обеспечения ортогональности вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; векторам &amp;lt;math&amp;gt;q_1, ..., q_k&amp;lt;/math&amp;gt;. В случае идеально точной арифметики данная переортогонализация не требовалась бы, однако в реальных вычислениях ошибки округления приводят к потере ортогональности, в связи с чем требуется переортогонализация.&lt;br /&gt;
Однако, единственной проблемой, возникающей при отсутствии переортогонализации, является появление повторных копий чисел Ритца (собственных значений), что в случае, если не требуется установление кратностей собственных значений, допустимо.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Библиотека [http://www.nag.co.uk/numeric/fl/nagdoc_fl23/html/INDEXES/KWIC/lanczos.html NAG Library] содержит ряд процедур для решения СЛАУ и поиска собственных значений на основе алгоритма Ланцоша.&lt;br /&gt;
&lt;br /&gt;
[http://www.mathworks.com/help/techdoc/ref/eigs.html MATLAB] и [https://www.gnu.org/software/octave/doc/interpreter/Sparse-Linear-Algebra.html#doc_002deigs GNU Octave] позволяют с помощью функции &#039;&#039;eigs()&#039;&#039; находить собственные значения на основе данного алгоритма.&lt;br /&gt;
&lt;br /&gt;
Matlab-реализация доступна как часть [http://www.cs.cmu.edu/~bickson/gabp/#download Gaussian Belief Propagation Matlab Package]. [http://www.graphlab.ml.cmu.edu/pmf.html GraphLab] содержит несколько параллельных реализаций алгоритма на C++.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>Error0x0</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=11952</id>
		<title>Участник:Error0x0/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=11952"/>
		<updated>2016-10-15T20:47:47Z</updated>

		<summary type="html">&lt;p&gt;Error0x0: /* ЧАСТЬ. Свойства и структура алгоритмов */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша представляет собой итерационный алгоритм для вычисления собственных значений симметрической матрицы. &lt;br /&gt;
Идея алгоритма заключается в построении матрицы &amp;lt;math&amp;gt;Q_k = [q_1, ..., q_k]&amp;lt;/math&amp;gt; из ортонормированных векторов Ланцоша и использовании собственных значений трёхдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; (чисел Ритца) как приближения к искомым собственным числам матрицы&amp;lt;ref name=&amp;quot;Деммель&amp;quot;&amp;gt;Деммель&amp;amp;nbsp;Дж. Вычислительная линейная алгебра&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;q_1 = b/||b||_2, \beta_0=0, q_0=0&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;z = Aq_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# производится переортогонализация &amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1} {(z^T q_i)q_i}&amp;lt;/math&amp;gt;,&lt;br /&gt;
# &amp;lt;math&amp;gt;\beta_j = ||z||_2&amp;lt;/math&amp;gt;, если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt;, алгоритм останавливается,&lt;br /&gt;
# &amp;lt;math&amp;gt;q_{j+1} = z/\beta_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# вычисляются собственные значения и векторы матрицы &amp;lt;math&amp;gt;T_j = Q_j^T A Q_j&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;
* Вычисление собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; (числа Ритца)&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
q[1] = b / norm(b)&lt;br /&gt;
beta[0] = 0&lt;br /&gt;
q[0] = 0&lt;br /&gt;
for j in [1 .. k]:&lt;br /&gt;
    z = mul(A, q[j])&lt;br /&gt;
    zT = transposed(z)&lt;br /&gt;
    for i in [1 .. j - 1]:&lt;br /&gt;
        z -= mul(scalar_mul(zT, q[i]), q[i])&lt;br /&gt;
    beta[j] = norm(z)&lt;br /&gt;
    if beta[j] == 0:&lt;br /&gt;
        break&lt;br /&gt;
    result = ritz_numbers(mul(transpose(Q[j]), A, Q[j]))&lt;br /&gt;
return result&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Для метода с полной переортогонализацией сложность составляет &amp;lt;math&amp;gt;O(k^2 n)&amp;lt;/math&amp;gt;, сложность по памяти -- &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:Lanczos graph.png|thumb|center|640px|Рисунок 1. Информационный граф]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Для процесса переортогонализации возможна параллельная оптимизация в двух местах:&lt;br /&gt;
* Итерации внутреннего цикла могут вычисляться параллельно, однако, требуется суммирование вычитаемых векторов, соответственно, сложность переортогонализации можно снизить с &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(n \log k)&amp;lt;/math&amp;gt;&lt;br /&gt;
* В каждой итерации внутреннего цикла возможно распараллеливание вычисления выражения справа (скалярное произведение и умножение вектора на число), что теоретически позволяет снизить сложность итерации с &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данны&#039;&#039;&#039;е: квадратная симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: собственные числа матрицы&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Полная переортогонализация соответствует повторной процедуре ортогонализациии Грама-Шмидта для обеспечения ортогональности вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; векторам &amp;lt;math&amp;gt;q_1, ..., q_k&amp;lt;/math&amp;gt;. В случае идеально точной арифметики данная переортогонализация не требовалась бы, однако в реальных вычислениях ошибки округления приводят к потере ортогональности, в связи с чем требуется переортогонализация.&lt;br /&gt;
Однако, единственной проблемой, возникающей при отсутствии переортогонализации, является появление повторных копий чисел Ритца (собственных значений), что в случае, если не требуется установление кратностей собственных значений, допустимо.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Библиотека [http://www.nag.co.uk/numeric/fl/nagdoc_fl23/html/INDEXES/KWIC/lanczos.html NAG Library] содержит ряд процедур для решения СЛАУ и поиска собственных значений на основе алгоритма Ланцоша.&lt;br /&gt;
&lt;br /&gt;
[http://www.mathworks.com/help/techdoc/ref/eigs.html MATLAB] и [https://www.gnu.org/software/octave/doc/interpreter/Sparse-Linear-Algebra.html#doc_002deigs GNU Octave] позволяют с помощью функции &#039;&#039;eigs()&#039;&#039; находить собственные значения на основе данного алгоритма.&lt;br /&gt;
&lt;br /&gt;
Matlab-реализация доступна как часть [http://www.cs.cmu.edu/~bickson/gabp/#download Gaussian Belief Propagation Matlab Package]. [http://www.graphlab.ml.cmu.edu/pmf.html GraphLab] содержит несколько параллельных реализаций алгоритма на C++.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>Error0x0</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=11943</id>
		<title>Участник:Error0x0/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=11943"/>
		<updated>2016-10-15T20:47:06Z</updated>

		<summary type="html">&lt;p&gt;Error0x0: /* Литература */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша представляет собой итерационный алгоритм для вычисления собственных значений симметрической матрицы. &lt;br /&gt;
Идея алгоритма заключается в построении матрицы &amp;lt;math&amp;gt;Q_k = [q_1, ..., q_k]&amp;lt;/math&amp;gt; из ортонормированных векторов Ланцоша и использовании собственных значений трёхдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; (чисел Ритца) как приближения к искомым собственным числам матрицы&amp;lt;ref name=&amp;quot;Деммель&amp;quot;&amp;gt;Деммель&amp;amp;nbsp;Дж. Вычислительная линейная алгебра&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;q_1 = b/||b||_2, \beta_0=0, q_0=0&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;z = Aq_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# производится переортогонализация &amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1} {(z^T q_i)q_i}&amp;lt;/math&amp;gt;,&lt;br /&gt;
# &amp;lt;math&amp;gt;\beta_j = ||z||_2&amp;lt;/math&amp;gt;, если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt;, алгоритм останавливается,&lt;br /&gt;
# &amp;lt;math&amp;gt;q_{j+1} = z/\beta_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# вычисляются собственные значения и векторы матрицы &amp;lt;math&amp;gt;T_j = Q_j^T A Q_j&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;
* Вычисление собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; (числа Ритца)&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
q[1] = b / norm(b)&lt;br /&gt;
beta[0] = 0&lt;br /&gt;
q[0] = 0&lt;br /&gt;
for j in [1 .. k]:&lt;br /&gt;
    z = mul(A, q[j])&lt;br /&gt;
    zT = transposed(z)&lt;br /&gt;
    for i in [1 .. j - 1]:&lt;br /&gt;
        z -= mul(scalar_mul(zT, q[i]), q[i])&lt;br /&gt;
    beta[j] = norm(z)&lt;br /&gt;
    if beta[j] == 0:&lt;br /&gt;
        break&lt;br /&gt;
    result = ritz_numbers(mul(transpose(Q[j]), A, Q[j]))&lt;br /&gt;
return result&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Для метода с полной переортогонализацией сложность составляет &amp;lt;math&amp;gt;O(k^2 n)&amp;lt;/math&amp;gt;, сложность по памяти -- &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:Lanczos graph.png|thumb|center|640px|Рисунок 1. Информационный граф]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Для процесса переортогонализации возможна параллельная оптимизация в двух местах:&lt;br /&gt;
* Итерации внутреннего цикла могут вычисляться параллельно, однако, требуется суммирование вычитаемых векторов, соответственно, сложность переортогонализации можно снизить с &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(n \log k)&amp;lt;/math&amp;gt;&lt;br /&gt;
* В каждой итерации внутреннего цикла возможно распараллеливание вычисления выражения справа (скалярное произведение и умножение вектора на число), что теоретически позволяет снизить сложность итерации с &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данны&#039;&#039;&#039;е: квадратная симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: собственные числа матрицы&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Полная переортогонализация соответствует повторной процедуре ортогонализациии Грама-Шмидта для обеспечения ортогональности вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; векторам &amp;lt;math&amp;gt;q_1, ..., q_k&amp;lt;/math&amp;gt;. В случае идеально точной арифметики данная переортогонализация не требовалась бы, однако в реальных вычислениях ошибки округления приводят к потере ортогональности, в связи с чем требуется переортогонализация.&lt;br /&gt;
Однако, единственной проблемой, возникающей при отсутствии переортогонализации, является появление повторных копий чисел Ритца (собственных значений), что в случае, если не требуется установление кратностей собственных значений, допустимо.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Библиотека [http://www.nag.co.uk/numeric/fl/nagdoc_fl23/html/INDEXES/KWIC/lanczos.html NAG Library] содержит ряд процедур для решения СЛАУ и поиска собственных значений на основе алгоритма Ланцоша.&lt;br /&gt;
&lt;br /&gt;
[http://www.mathworks.com/help/techdoc/ref/eigs.html MATLAB] и [https://www.gnu.org/software/octave/doc/interpreter/Sparse-Linear-Algebra.html#doc_002deigs GNU Octave] позволяют с помощью функции &#039;&#039;eigs()&#039;&#039; находить собственные значения на основе данного алгоритма.&lt;br /&gt;
&lt;br /&gt;
Matlab-реализация доступна как часть [http://www.cs.cmu.edu/~bickson/gabp/#download Gaussian Belief Propagation Matlab Package]. [http://www.graphlab.ml.cmu.edu/pmf.html GraphLab] содержит несколько параллельных реализаций алгоритма на C++.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>Error0x0</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=11940</id>
		<title>Участник:Error0x0/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=11940"/>
		<updated>2016-10-15T20:46:52Z</updated>

		<summary type="html">&lt;p&gt;Error0x0: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша представляет собой итерационный алгоритм для вычисления собственных значений симметрической матрицы. &lt;br /&gt;
Идея алгоритма заключается в построении матрицы &amp;lt;math&amp;gt;Q_k = [q_1, ..., q_k]&amp;lt;/math&amp;gt; из ортонормированных векторов Ланцоша и использовании собственных значений трёхдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; (чисел Ритца) как приближения к искомым собственным числам матрицы&amp;lt;ref name=&amp;quot;Деммель&amp;quot;&amp;gt;Деммель&amp;amp;nbsp;Дж. Вычислительная линейная алгебра&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;q_1 = b/||b||_2, \beta_0=0, q_0=0&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;z = Aq_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# производится переортогонализация &amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1} {(z^T q_i)q_i}&amp;lt;/math&amp;gt;,&lt;br /&gt;
# &amp;lt;math&amp;gt;\beta_j = ||z||_2&amp;lt;/math&amp;gt;, если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt;, алгоритм останавливается,&lt;br /&gt;
# &amp;lt;math&amp;gt;q_{j+1} = z/\beta_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# вычисляются собственные значения и векторы матрицы &amp;lt;math&amp;gt;T_j = Q_j^T A Q_j&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;
* Вычисление собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; (числа Ритца)&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
q[1] = b / norm(b)&lt;br /&gt;
beta[0] = 0&lt;br /&gt;
q[0] = 0&lt;br /&gt;
for j in [1 .. k]:&lt;br /&gt;
    z = mul(A, q[j])&lt;br /&gt;
    zT = transposed(z)&lt;br /&gt;
    for i in [1 .. j - 1]:&lt;br /&gt;
        z -= mul(scalar_mul(zT, q[i]), q[i])&lt;br /&gt;
    beta[j] = norm(z)&lt;br /&gt;
    if beta[j] == 0:&lt;br /&gt;
        break&lt;br /&gt;
    result = ritz_numbers(mul(transpose(Q[j]), A, Q[j]))&lt;br /&gt;
return result&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Для метода с полной переортогонализацией сложность составляет &amp;lt;math&amp;gt;O(k^2 n)&amp;lt;/math&amp;gt;, сложность по памяти -- &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:Lanczos graph.png|thumb|center|640px|Рисунок 1. Информационный граф]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Для процесса переортогонализации возможна параллельная оптимизация в двух местах:&lt;br /&gt;
* Итерации внутреннего цикла могут вычисляться параллельно, однако, требуется суммирование вычитаемых векторов, соответственно, сложность переортогонализации можно снизить с &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(n \log k)&amp;lt;/math&amp;gt;&lt;br /&gt;
* В каждой итерации внутреннего цикла возможно распараллеливание вычисления выражения справа (скалярное произведение и умножение вектора на число), что теоретически позволяет снизить сложность итерации с &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данны&#039;&#039;&#039;е: квадратная симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: собственные числа матрицы&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Полная переортогонализация соответствует повторной процедуре ортогонализациии Грама-Шмидта для обеспечения ортогональности вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; векторам &amp;lt;math&amp;gt;q_1, ..., q_k&amp;lt;/math&amp;gt;. В случае идеально точной арифметики данная переортогонализация не требовалась бы, однако в реальных вычислениях ошибки округления приводят к потере ортогональности, в связи с чем требуется переортогонализация.&lt;br /&gt;
Однако, единственной проблемой, возникающей при отсутствии переортогонализации, является появление повторных копий чисел Ритца (собственных значений), что в случае, если не требуется установление кратностей собственных значений, допустимо.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Библиотека [http://www.nag.co.uk/numeric/fl/nagdoc_fl23/html/INDEXES/KWIC/lanczos.html NAG Library] содержит ряд процедур для решения СЛАУ и поиска собственных значений на основе алгоритма Ланцоша.&lt;br /&gt;
&lt;br /&gt;
[http://www.mathworks.com/help/techdoc/ref/eigs.html MATLAB] и [https://www.gnu.org/software/octave/doc/interpreter/Sparse-Linear-Algebra.html#doc_002deigs GNU Octave] позволяют с помощью функции &#039;&#039;eigs()&#039;&#039; находить собственные значения на основе данного алгоритма.&lt;br /&gt;
&lt;br /&gt;
Matlab-реализация доступна как часть [http://www.cs.cmu.edu/~bickson/gabp/#download Gaussian Belief Propagation Matlab Package]. [http://www.graphlab.ml.cmu.edu/pmf.html GraphLab] содержит несколько параллельных реализаций алгоритма на C++.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Дж. Деммель «Вычислительная линейная алгебра»&lt;/div&gt;</summary>
		<author><name>Error0x0</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=11900</id>
		<title>Участник:Error0x0/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=11900"/>
		<updated>2016-10-15T20:42:59Z</updated>

		<summary type="html">&lt;p&gt;Error0x0: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша представляет собой итерационный алгоритм для вычисления собственных значений симметрической матрицы. &lt;br /&gt;
Идея алгоритма заключается в построении матрицы &amp;lt;math&amp;gt;Q_k = [q_1, ..., q_k]&amp;lt;/math&amp;gt; из ортонормированных векторов Ланцоша и использовании собственных значений трёхдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; (чисел Ритца) как приближения к искомым собственным числам матрицы.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;q_1 = b/||b||_2, \beta_0=0, q_0=0&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;z = Aq_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# производится переортогонализация &amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1} {(z^T q_i)q_i}&amp;lt;/math&amp;gt;,&lt;br /&gt;
# &amp;lt;math&amp;gt;\beta_j = ||z||_2&amp;lt;/math&amp;gt;, если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt;, алгоритм останавливается,&lt;br /&gt;
# &amp;lt;math&amp;gt;q_{j+1} = z/\beta_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# вычисляются собственные значения и векторы матрицы &amp;lt;math&amp;gt;T_j = Q_j^T A Q_j&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;
* Вычисление собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; (числа Ритца)&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
q[1] = b / norm(b)&lt;br /&gt;
beta[0] = 0&lt;br /&gt;
q[0] = 0&lt;br /&gt;
for j in [1 .. k]:&lt;br /&gt;
    z = mul(A, q[j])&lt;br /&gt;
    zT = transposed(z)&lt;br /&gt;
    for i in [1 .. j - 1]:&lt;br /&gt;
        z -= mul(scalar_mul(zT, q[i]), q[i])&lt;br /&gt;
    beta[j] = norm(z)&lt;br /&gt;
    if beta[j] == 0:&lt;br /&gt;
        break&lt;br /&gt;
    result = ritz_numbers(mul(transpose(Q[j]), A, Q[j]))&lt;br /&gt;
return result&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Для метода с полной переортогонализацией сложность составляет &amp;lt;math&amp;gt;O(k^2 n)&amp;lt;/math&amp;gt;, сложность по памяти -- &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:Lanczos graph.png|thumb|center|640px|Рисунок 1. Информационный граф]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Для процесса переортогонализации возможна параллельная оптимизация в двух местах:&lt;br /&gt;
* Итерации внутреннего цикла могут вычисляться параллельно, однако, требуется суммирование вычитаемых векторов, соответственно, сложность переортогонализации можно снизить с &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(n \log k)&amp;lt;/math&amp;gt;&lt;br /&gt;
* В каждой итерации внутреннего цикла возможно распараллеливание вычисления выражения справа (скалярное произведение и умножение вектора на число), что теоретически позволяет снизить сложность итерации с &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данны&#039;&#039;&#039;е: квадратная симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: собственные числа матрицы&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Полная переортогонализация соответствует повторной процедуре ортогонализациии Грама-Шмидта для обеспечения ортогональности вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; векторам &amp;lt;math&amp;gt;q_1, ..., q_k&amp;lt;/math&amp;gt;. В случае идеально точной арифметики данная переортогонализация не требовалась бы, однако в реальных вычислениях ошибки округления приводят к потере ортогональности, в связи с чем требуется переортогонализация.&lt;br /&gt;
Однако, единственной проблемой, возникающей при отсутствии переортогонализации, является появление повторных копий чисел Ритца (собственных значений), что в случае, если не требуется установление кратностей собственных значений, допустимо.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Библиотека [http://www.nag.co.uk/numeric/fl/nagdoc_fl23/html/INDEXES/KWIC/lanczos.html NAG Library] содержит ряд процедур для решения СЛАУ и поиска собственных значений на основе алгоритма Ланцоша.&lt;br /&gt;
&lt;br /&gt;
[http://www.mathworks.com/help/techdoc/ref/eigs.html MATLAB] и [https://www.gnu.org/software/octave/doc/interpreter/Sparse-Linear-Algebra.html#doc_002deigs GNU Octave] позволяют с помощью функции &#039;&#039;eigs()&#039;&#039; находить собственные значения на основе данного алгоритма.&lt;br /&gt;
&lt;br /&gt;
Matlab-реализация доступна как часть [http://www.cs.cmu.edu/~bickson/gabp/#download Gaussian Belief Propagation Matlab Package]. [http://www.graphlab.ml.cmu.edu/pmf.html GraphLab] содержит несколько параллельных реализаций алгоритма на C++.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Дж. Деммель «Вычислительная линейная алгебра»&lt;/div&gt;</summary>
		<author><name>Error0x0</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=11877</id>
		<title>Участник:Error0x0/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=11877"/>
		<updated>2016-10-15T20:41:12Z</updated>

		<summary type="html">&lt;p&gt;Error0x0: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша представляет собой итерационный алгоритм для вычисления собственных значений симметрической матрицы. &lt;br /&gt;
Идея алгоритма заключается в построении матрицы &amp;lt;math&amp;gt;Q_k = [q_1, ..., q_k]&amp;lt;/math&amp;gt; из ортонормированных векторов Ланцоша и использовании собственных значений трёхдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; (чисел Ритца) как приближения к искомым собственным числам матрицы.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;q_1 = b/||b||_2, \beta_0=0, q_0=0&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;z = Aq_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# производится переортогонализация &amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1} {(z^T q_i)q_i}&amp;lt;/math&amp;gt;,&lt;br /&gt;
# &amp;lt;math&amp;gt;\beta_j = ||z||_2&amp;lt;/math&amp;gt;, если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt;, алгоритм останавливается,&lt;br /&gt;
# &amp;lt;math&amp;gt;q_{j+1} = z/\beta_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# вычисляются собственные значения и векторы матрицы &amp;lt;math&amp;gt;T_j = Q_j^T A Q_j&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;
* Вычисление собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; (числа Ритца)&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
q[1] = b / norm(b)&lt;br /&gt;
beta[0] = 0&lt;br /&gt;
q[0] = 0&lt;br /&gt;
for j in [1 .. k]:&lt;br /&gt;
    z = mul(A, q[j])&lt;br /&gt;
    zT = transposed(z)&lt;br /&gt;
    for i in [1 .. j - 1]:&lt;br /&gt;
        z -= mul(scalar_mul(zT, q[i]), q[i])&lt;br /&gt;
    beta[j] = norm(z)&lt;br /&gt;
    if beta[j] == 0:&lt;br /&gt;
        break&lt;br /&gt;
    result = ritz_numbers(mul(transpose(Q[j]), A, Q[j]))&lt;br /&gt;
return result&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Для метода с полной переортогонализацией сложность составляет &amp;lt;math&amp;gt;O(k^2 n)&amp;lt;/math&amp;gt;, сложность по памяти -- &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:Lanczos graph.png|thumb|center|640px|Рисунок 1. Информационный граф]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Для процесса переортогонализации возможна параллельная оптимизация в двух местах:&lt;br /&gt;
* Итерации внутреннего цикла могут вычисляться параллельно, однако, требуется суммирование вычитаемых векторов, соответственно, сложность переортогонализации можно снизить с &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(n \log k)&amp;lt;/math&amp;gt;&lt;br /&gt;
* В каждой итерации внутреннего цикла возможно распараллеливание вычисления выражения справа (скалярное произведение и умножение вектора на число), что теоретически позволяет снизить сложность итерации с &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данны&#039;&#039;&#039;е: квадратная симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: собственные числа матрицы&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Полная переортогонализация соответствует повторной процедуре ортогонализациии Грама-Шмидта для обеспечения ортогональности вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; векторам &amp;lt;math&amp;gt;q_1, ..., q_k&amp;lt;/math&amp;gt;. В случае идеально точной арифметики данная переортогонализация не требовалась бы, однако в реальных вычислениях ошибки округления приводят к потере ортогональности, в связи с чем требуется переортогонализация.&lt;br /&gt;
Однако, единственной проблемой, возникающей при отсутствии переортогонализации, является появление повторных копий чисел Ритца (собственных значений), что в случае, если не требуется установление кратностей собственных значений, допустимо.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Библиотека [http://www.nag.co.uk/numeric/fl/nagdoc_fl23/html/INDEXES/KWIC/lanczos.html NAG Library] содержит ряд процедур для решения СЛАУ и поиска собственных значений на основе алгоритма Ланцоша.&lt;br /&gt;
&lt;br /&gt;
[http://www.mathworks.com/help/techdoc/ref/eigs.html MATLAB] и [https://www.gnu.org/software/octave/doc/interpreter/Sparse-Linear-Algebra.html#doc_002deigs GNU Octave] позволяют с помощью функции &#039;&#039;eigs()&#039;&#039; находить собственные значения на основе данного алгоритма.&lt;br /&gt;
&lt;br /&gt;
Matlab-реализация доступна как часть [http://www.cs.cmu.edu/~bickson/gabp/#download Gaussian Belief Propagation Matlab Package]. [http://www.graphlab.ml.cmu.edu/pmf.html GraphLab] содержит несколько параллельных реализаций алгоритма на C++.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Дж. Деммель «Вычислительная линейная алгебра»&lt;/div&gt;</summary>
		<author><name>Error0x0</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=11868</id>
		<title>Участник:Error0x0/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=11868"/>
		<updated>2016-10-15T20:39:58Z</updated>

		<summary type="html">&lt;p&gt;Error0x0: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша представляет собой итерационный алгоритм для вычисления собственных значений симметрической матрицы. &lt;br /&gt;
Идея алгоритма заключается в построении матрицы &amp;lt;math&amp;gt;Q_k = [q_1, ..., q_k]&amp;lt;/math&amp;gt; из ортонормированных векторов Ланцоша и использовании собственных значений трёхдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; (чисел Ритца) как приближения к искомым собственным числам матрицы.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;q_1 = b/||b||_2, \beta_0=0, q_0=0&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;z = Aq_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# производится переортогонализация &amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1} {(z^T q_i)q_i}&amp;lt;/math&amp;gt;,&lt;br /&gt;
# &amp;lt;math&amp;gt;\beta_j = ||z||_2&amp;lt;/math&amp;gt;, если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt;, алгоритм останавливается,&lt;br /&gt;
# &amp;lt;math&amp;gt;q_{j+1} = z/\beta_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# вычисляются собственные значения и векторы матрицы &amp;lt;math&amp;gt;T_j = Q_j^T A Q_j&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;
* Вычисление собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; (числа Ритца)&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
q[1] = b / norm(b)&lt;br /&gt;
beta[0] = 0&lt;br /&gt;
q[0] = 0&lt;br /&gt;
for j in [1 .. k]:&lt;br /&gt;
    z = mul(A, q[j])&lt;br /&gt;
    zT = transposed(z)&lt;br /&gt;
    for i in [1 .. j - 1]:&lt;br /&gt;
        z -= mul(scalar_mul(zT, q[i]), q[i])&lt;br /&gt;
    beta[j] = norm(z)&lt;br /&gt;
    if beta[j] == 0:&lt;br /&gt;
        break&lt;br /&gt;
    result = ritz_numbers(mul(transpose(Q[j]), A, Q[j]))&lt;br /&gt;
return result&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Для метода с полной переортогонализацией сложность составляет &amp;lt;math&amp;gt;O(k^2 n)&amp;lt;/math&amp;gt;, сложность по памяти -- &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[File:Lanczos graph.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Для процесса переортогонализации возможна параллельная оптимизация в двух местах:&lt;br /&gt;
* Итерации внутреннего цикла могут вычисляться параллельно, однако, требуется суммирование вычитаемых векторов, соответственно, сложность переортогонализации можно снизить с &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(n \log k)&amp;lt;/math&amp;gt;&lt;br /&gt;
* В каждой итерации внутреннего цикла возможно распараллеливание вычисления выражения справа (скалярное произведение и умножение вектора на число), что теоретически позволяет снизить сложность итерации с &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данны&#039;&#039;&#039;е: квадратная симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: собственные числа матрицы&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Полная переортогонализация соответствует повторной процедуре ортогонализациии Грама-Шмидта для обеспечения ортогональности вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; векторам &amp;lt;math&amp;gt;q_1, ..., q_k&amp;lt;/math&amp;gt;. В случае идеально точной арифметики данная переортогонализация не требовалась бы, однако в реальных вычислениях ошибки округления приводят к потере ортогональности, в связи с чем требуется переортогонализация.&lt;br /&gt;
Однако, единственной проблемой, возникающей при отсутствии переортогонализации, является появление повторных копий чисел Ритца (собственных значений), что в случае, если не требуется установление кратностей собственных значений, допустимо.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Библиотека [http://www.nag.co.uk/numeric/fl/nagdoc_fl23/html/INDEXES/KWIC/lanczos.html NAG Library] содержит ряд процедур для решения СЛАУ и поиска собственных значений на основе алгоритма Ланцоша.&lt;br /&gt;
&lt;br /&gt;
[http://www.mathworks.com/help/techdoc/ref/eigs.html MATLAB] и [https://www.gnu.org/software/octave/doc/interpreter/Sparse-Linear-Algebra.html#doc_002deigs GNU Octave] позволяют с помощью функции &#039;&#039;eigs()&#039;&#039; находить собственные значения на основе данного алгоритма.&lt;br /&gt;
&lt;br /&gt;
Matlab-реализация доступна как часть [http://www.cs.cmu.edu/~bickson/gabp/#download Gaussian Belief Propagation Matlab Package]. [http://www.graphlab.ml.cmu.edu/pmf.html GraphLab] содержит несколько параллельных реализаций алгоритма на C++.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Дж. Деммель «Вычислительная линейная алгебра»&lt;/div&gt;</summary>
		<author><name>Error0x0</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=11855</id>
		<title>Участник:Error0x0/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=11855"/>
		<updated>2016-10-15T20:38:10Z</updated>

		<summary type="html">&lt;p&gt;Error0x0: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша представляет собой итерационный алгоритм для вычисления собственных значений симметрической матрицы. &lt;br /&gt;
Идея алгоритма заключается в построении матрицы &amp;lt;math&amp;gt;Q_k = [q_1, ..., q_k]&amp;lt;/math&amp;gt; из ортонормированных векторов Ланцоша и использовании собственных значений трёхдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; (чисел Ритца) как приближения к искомым собственным числам матрицы.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;q_1 = b/||b||_2, \beta_0=0, q_0=0&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;z = Aq_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# производится переортогонализация &amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1} {(z^T q_i)q_i}&amp;lt;/math&amp;gt;,&lt;br /&gt;
# &amp;lt;math&amp;gt;\beta_j = ||z||_2&amp;lt;/math&amp;gt;, если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt;, алгоритм останавливается,&lt;br /&gt;
# &amp;lt;math&amp;gt;q_{j+1} = z/\beta_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# вычисляются собственные значения и векторы матрицы &amp;lt;math&amp;gt;T_j = Q_j^T A Q_j&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;
* Вычисление собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; (числа Ритца)&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
q[1] = b / norm(b)&lt;br /&gt;
beta[0] = 0&lt;br /&gt;
q[0] = 0&lt;br /&gt;
for j in [1 .. k]:&lt;br /&gt;
    z = mul(A, q[j])&lt;br /&gt;
    zT = transposed(z)&lt;br /&gt;
    for i in [1 .. j - 1]:&lt;br /&gt;
        z -= mul(scalar_mul(zT, q[i]), q[i])&lt;br /&gt;
    beta[j] = norm(z)&lt;br /&gt;
    if beta[j] == 0:&lt;br /&gt;
        break&lt;br /&gt;
    result = ritz_numbers(mul(transpose(Q[j]), A, Q[j]))&lt;br /&gt;
return result&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Для метода с полной переортогонализацией сложность составляет &amp;lt;math&amp;gt;O(k^2 n)&amp;lt;/math&amp;gt;, сложность по памяти -- &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[Файл:Lanczos_graph.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Для процесса переортогонализации возможна параллельная оптимизация в двух местах:&lt;br /&gt;
* Итерации внутреннего цикла могут вычисляться параллельно, однако, требуется суммирование вычитаемых векторов, соответственно, сложность переортогонализации можно снизить с &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(n \log k)&amp;lt;/math&amp;gt;&lt;br /&gt;
* В каждой итерации внутреннего цикла возможно распараллеливание вычисления выражения справа (скалярное произведение и умножение вектора на число), что теоретически позволяет снизить сложность итерации с &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данны&#039;&#039;&#039;е: квадратная симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: собственные числа матрицы&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Полная переортогонализация соответствует повторной процедуре ортогонализациии Грама-Шмидта для обеспечения ортогональности вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; векторам &amp;lt;math&amp;gt;q_1, ..., q_k&amp;lt;/math&amp;gt;. В случае идеально точной арифметики данная переортогонализация не требовалась бы, однако в реальных вычислениях ошибки округления приводят к потере ортогональности, в связи с чем требуется переортогонализация.&lt;br /&gt;
Однако, единственной проблемой, возникающей при отсутствии переортогонализации, является появление повторных копий чисел Ритца (собственных значений), что в случае, если не требуется установление кратностей собственных значений, допустимо.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Библиотека [http://www.nag.co.uk/numeric/fl/nagdoc_fl23/html/INDEXES/KWIC/lanczos.html NAG Library] содержит ряд процедур для решения СЛАУ и поиска собственных значений на основе алгоритма Ланцоша.&lt;br /&gt;
&lt;br /&gt;
[http://www.mathworks.com/help/techdoc/ref/eigs.html MATLAB] и [https://www.gnu.org/software/octave/doc/interpreter/Sparse-Linear-Algebra.html#doc_002deigs GNU Octave] позволяют с помощью функции &#039;&#039;eigs()&#039;&#039; находить собственные значения на основе данного алгоритма.&lt;br /&gt;
&lt;br /&gt;
Matlab-реализация доступна как часть [http://www.cs.cmu.edu/~bickson/gabp/#download Gaussian Belief Propagation Matlab Package]. [http://www.graphlab.ml.cmu.edu/pmf.html GraphLab] содержит несколько параллельных реализаций алгоритма на C++.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Дж. Деммель «Вычислительная линейная алгебра»&lt;/div&gt;</summary>
		<author><name>Error0x0</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=11800</id>
		<title>Участник:Error0x0/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=11800"/>
		<updated>2016-10-15T20:29:53Z</updated>

		<summary type="html">&lt;p&gt;Error0x0: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша представляет собой итерационный алгоритм для вычисления собственных значений симметрической матрицы. &lt;br /&gt;
Идея алгоритма заключается в построении матрицы &amp;lt;math&amp;gt;Q_k = [q_1, ..., q_k]&amp;lt;/math&amp;gt; из ортонормированных векторов Ланцоша и использовании собственных значений трёхдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; (чисел Ритца) как приближения к искомым собственным числам матрицы.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;q_1 = b/||b||_2, \beta_0=0, q_0=0&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;z = Aq_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# производится переортогонализация &amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1} {(z^T q_i)q_i}&amp;lt;/math&amp;gt;,&lt;br /&gt;
# &amp;lt;math&amp;gt;\beta_j = ||z||_2&amp;lt;/math&amp;gt;, если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt;, алгоритм останавливается,&lt;br /&gt;
# &amp;lt;math&amp;gt;q_{j+1} = z/\beta_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# вычисляются собственные значения и векторы матрицы &amp;lt;math&amp;gt;T_j = Q_j^T A Q_j&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;
* Вычисление собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; (числа Ритца)&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
q[1] = b / norm(b)&lt;br /&gt;
beta[0] = 0&lt;br /&gt;
q[0] = 0&lt;br /&gt;
for j in [1 .. k]:&lt;br /&gt;
    z = mul(A, q[j])&lt;br /&gt;
    zT = transposed(z)&lt;br /&gt;
    for i in [1 .. j - 1]:&lt;br /&gt;
        z -= mul(scalar_mul(zT, q[i]), q[i])&lt;br /&gt;
    beta[j] = norm(z)&lt;br /&gt;
    if beta[j] == 0:&lt;br /&gt;
        break&lt;br /&gt;
    result = ritz_numbers(mul(transpose(Q[j]), A, Q[j]))&lt;br /&gt;
return result&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Для метода с полной переортогонализацией сложность составляет &amp;lt;math&amp;gt;O(k^2 n)&amp;lt;/math&amp;gt;, сложность по памяти -- &amp;lt;math&amp;gt;O(kn)&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;
* Итерации внутреннего цикла могут вычисляться параллельно, однако, требуется суммирование вычитаемых векторов, соответственно, сложность переортогонализации можно снизить с &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(n \log k)&amp;lt;/math&amp;gt;&lt;br /&gt;
* В каждой итерации внутреннего цикла возможно распараллеливание вычисления выражения справа (скалярное произведение и умножение вектора на число), что теоретически позволяет снизить сложность итерации с &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данны&#039;&#039;&#039;е: квадратная симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: собственные числа матрицы&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Полная переортогонализация соответствует повторной процедуре ортогонализациии Грама-Шмидта для обеспечения ортогональности вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; векторам &amp;lt;math&amp;gt;q_1, ..., q_k&amp;lt;/math&amp;gt;. В случае идеально точной арифметики данная переортогонализация не требовалась бы, однако в реальных вычислениях ошибки округления приводят к потере ортогональности, в связи с чем требуется переортогонализация.&lt;br /&gt;
Однако, единственной проблемой, возникающей при отсутствии переортогонализации, является появление повторных копий чисел Ритца (собственных значений), что в случае, если не требуется установление кратностей собственных значений, допустимо.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Библиотека [http://www.nag.co.uk/numeric/fl/nagdoc_fl23/html/INDEXES/KWIC/lanczos.html NAG Library] содержит ряд процедур для решения СЛАУ и поиска собственных значений на основе алгоритма Ланцоша.&lt;br /&gt;
&lt;br /&gt;
[http://www.mathworks.com/help/techdoc/ref/eigs.html MATLAB] и [https://www.gnu.org/software/octave/doc/interpreter/Sparse-Linear-Algebra.html#doc_002deigs GNU Octave] позволяют с помощью функции &#039;&#039;eigs()&#039;&#039; находить собственные значения на основе данного алгоритма.&lt;br /&gt;
&lt;br /&gt;
Matlab-реализация доступна как часть [http://www.cs.cmu.edu/~bickson/gabp/#download Gaussian Belief Propagation Matlab Package]. [http://www.graphlab.ml.cmu.edu/pmf.html GraphLab] содержит несколько параллельных реализаций алгоритма на C++.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Дж. Деммель «Вычислительная линейная алгебра»&lt;/div&gt;</summary>
		<author><name>Error0x0</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=11754</id>
		<title>Участник:Error0x0/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=11754"/>
		<updated>2016-10-15T20:21:03Z</updated>

		<summary type="html">&lt;p&gt;Error0x0: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша представляет собой итерационный алгоритм для вычисления собственных значений симметрической матрицы. &lt;br /&gt;
Идея алгоритма заключается в построении матрицы &amp;lt;math&amp;gt;Q_k = [q_1, ..., q_k]&amp;lt;/math&amp;gt; из ортонормированных векторов Ланцоша и использовании собственных значений трёхдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; (чисел Ритца) как приближения к искомым собственным числам матрицы.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;q_1 = b/||b||_2, \beta_0=0, q_0=0&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;z = Aq_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# производится переортогонализация &amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1} {(z^T q_i)q_i}&amp;lt;/math&amp;gt;,&lt;br /&gt;
# &amp;lt;math&amp;gt;\beta_j = ||z||_2&amp;lt;/math&amp;gt;, если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt;, алгоритм останавливается,&lt;br /&gt;
# &amp;lt;math&amp;gt;q_j+1 = z/\beta_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# вычисляются собственные значения и векторы матрицы &amp;lt;math&amp;gt;T_j = Q_j^T A Q_j&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;
* Вычисление собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; (числа Ритца)&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
q[1] = b / norm(b)&lt;br /&gt;
beta[0] = 0&lt;br /&gt;
q[0] = 0&lt;br /&gt;
for j in [1 .. k]:&lt;br /&gt;
    z = mul(A, q[j])&lt;br /&gt;
    zT = transposed(z)&lt;br /&gt;
    for i in [1 .. j - 1]:&lt;br /&gt;
        z -= mul(scalar_mul(zT, q[i]), q[i])&lt;br /&gt;
    beta[j] = norm(z)&lt;br /&gt;
    if beta[j] == 0:&lt;br /&gt;
        break&lt;br /&gt;
    result = ritz_numbers(mul(transpose(Q[j]), A, Q[j]))&lt;br /&gt;
return result&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Для метода с полной переортогонализацией сложность составляет &amp;lt;math&amp;gt;O(k^2 n)&amp;lt;/math&amp;gt;, сложность по памяти -- &amp;lt;math&amp;gt;O(kn)&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;
* Итерации внутреннего цикла могут вычисляться параллельно, однако, требуется суммирование вычитаемых векторов, соответственно, сложность переортогонализации можно снизить с &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(n \log k)&amp;lt;/math&amp;gt;&lt;br /&gt;
* В каждой итерации внутреннего цикла возможно распараллеливание вычисления выражения справа (скалярное произведение и умножение вектора на число), что теоретически позволяет снизить сложность итерации с &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данны&#039;&#039;&#039;е: квадратная симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: собственные числа матрицы&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Полная переортогонализация соответствует повторной процедуре ортогонализациии Грама-Шмидта для обеспечения ортогональности вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; векторам &amp;lt;math&amp;gt;q_1, ..., q_k&amp;lt;/math&amp;gt;. В случае идеально точной арифметики данная переортогонализация не требовалась бы, однако в реальных вычислениях ошибки округления приводят к потере ортогональности, в связи с чем требуется переортогонализация.&lt;br /&gt;
Однако, единственной проблемой, возникающей при отсутствии переортогонализации, является появление повторных копий чисел Ритца (собственных значений), что в случае, если не требуется установление кратностей собственных значений, допустимо.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Библиотека [http://www.nag.co.uk/numeric/fl/nagdoc_fl23/html/INDEXES/KWIC/lanczos.html NAG Library] содержит ряд процедур для решения СЛАУ и поиска собственных значений на основе алгоритма Ланцоша.&lt;br /&gt;
&lt;br /&gt;
[http://www.mathworks.com/help/techdoc/ref/eigs.html MATLAB] и [https://www.gnu.org/software/octave/doc/interpreter/Sparse-Linear-Algebra.html#doc_002deigs GNU Octave] позволяют с помощью функции &#039;&#039;eigs()&#039;&#039; находить собственные значения на основе данного алгоритма.&lt;br /&gt;
&lt;br /&gt;
Matlab-реализация доступна как часть [http://www.cs.cmu.edu/~bickson/gabp/#download Gaussian Belief Propagation Matlab Package]. [http://www.graphlab.ml.cmu.edu/pmf.html GraphLab] содержит несколько параллельных реализаций алгоритма на C++.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Дж. Деммель «Вычислительная линейная алгебра»&lt;/div&gt;</summary>
		<author><name>Error0x0</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=11746</id>
		<title>Участник:Error0x0/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=11746"/>
		<updated>2016-10-15T20:19:36Z</updated>

		<summary type="html">&lt;p&gt;Error0x0: /* Литература */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша представляет собой итерационный алгоритм для вычисления собственных значений симметрической матрицы. &lt;br /&gt;
Идея алгоритма заключается в построении матрицы &amp;lt;math&amp;gt;Q_k = [q_1, ..., q_k]&amp;lt;/math&amp;gt; из ортонормированных векторов Ланцоша и нахождении собственных значений трёхдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;q_1 = b/||b||_2, \beta_0=0, q_0=0&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;z = Aq_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# производится переортогонализация &amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1} {(z^T q_i)q_i}&amp;lt;/math&amp;gt;,&lt;br /&gt;
# &amp;lt;math&amp;gt;\beta_j = ||z||_2&amp;lt;/math&amp;gt;, если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt;, алгоритм останавливается,&lt;br /&gt;
# &amp;lt;math&amp;gt;q_j+1 = z/\beta_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# вычисляются собственные значения и векторы матрицы &amp;lt;math&amp;gt;T_j = Q_j^T A Q_j&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;
* Вычисление собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; (числа Ритца)&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
q[1] = b / norm(b)&lt;br /&gt;
beta[0] = 0&lt;br /&gt;
q[0] = 0&lt;br /&gt;
for j in [1 .. k]:&lt;br /&gt;
    z = mul(A, q[j])&lt;br /&gt;
    zT = transposed(z)&lt;br /&gt;
    for i in [1 .. j - 1]:&lt;br /&gt;
        z -= mul(scalar_mul(zT, q[i]), q[i])&lt;br /&gt;
    beta[j] = norm(z)&lt;br /&gt;
    if beta[j] == 0:&lt;br /&gt;
        break&lt;br /&gt;
    result = ritz_numbers(mul(transpose(Q[j]), A, Q[j]))&lt;br /&gt;
return result&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Для метода с полной переортогонализацией сложность составляет &amp;lt;math&amp;gt;O(k^2 n)&amp;lt;/math&amp;gt;, сложность по памяти -- &amp;lt;math&amp;gt;O(kn)&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;
* Итерации внутреннего цикла могут вычисляться параллельно, однако, требуется суммирование вычитаемых векторов, соответственно, сложность переортогонализации можно снизить с &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(n \log k)&amp;lt;/math&amp;gt;&lt;br /&gt;
* В каждой итерации внутреннего цикла возможно распараллеливание вычисления выражения справа (скалярное произведение и умножение вектора на число), что теоретически позволяет снизить сложность итерации с &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данны&#039;&#039;&#039;е: квадратная симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: собственные числа матрицы&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Полная переортогонализация соответствует повторной процедуре ортогонализациии Грама-Шмидта для обеспечения ортогональности вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; векторам &amp;lt;math&amp;gt;q_1, ..., q_k&amp;lt;/math&amp;gt;. В случае идеально точной арифметики данная переортогонализация не требовалась бы, однако в реальных вычислениях ошибки округления приводят к потере ортогональности, в связи с чем требуется переортогонализация.&lt;br /&gt;
Однако, единственной проблемой, возникающей при отсутствии переортогонализации, является появление повторных копий чисел Ритца (собственных значений), что в случае, если не требуется установление кратностей собственных значений, допустимо.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Библиотека [http://www.nag.co.uk/numeric/fl/nagdoc_fl23/html/INDEXES/KWIC/lanczos.html NAG Library] содержит ряд процедур для решения СЛАУ и поиска собственных значений на основе алгоритма Ланцоша.&lt;br /&gt;
&lt;br /&gt;
[http://www.mathworks.com/help/techdoc/ref/eigs.html MATLAB] и [https://www.gnu.org/software/octave/doc/interpreter/Sparse-Linear-Algebra.html#doc_002deigs GNU Octave] позволяют с помощью функции &#039;&#039;eigs()&#039;&#039; находить собственные значения на основе данного алгоритма.&lt;br /&gt;
&lt;br /&gt;
Matlab-реализация доступна как часть [http://www.cs.cmu.edu/~bickson/gabp/#download Gaussian Belief Propagation Matlab Package]. [http://www.graphlab.ml.cmu.edu/pmf.html GraphLab] содержит несколько параллельных реализаций алгоритма на C++.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Дж. Деммель «Вычислительная линейная алгебра»&lt;/div&gt;</summary>
		<author><name>Error0x0</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=11738</id>
		<title>Участник:Error0x0/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=11738"/>
		<updated>2016-10-15T20:18:16Z</updated>

		<summary type="html">&lt;p&gt;Error0x0: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша представляет собой итерационный алгоритм для вычисления собственных значений симметрической матрицы. &lt;br /&gt;
Идея алгоритма заключается в построении матрицы &amp;lt;math&amp;gt;Q_k = [q_1, ..., q_k]&amp;lt;/math&amp;gt; из ортонормированных векторов Ланцоша и нахождении собственных значений трёхдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;q_1 = b/||b||_2, \beta_0=0, q_0=0&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;z = Aq_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# производится переортогонализация &amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1} {(z^T q_i)q_i}&amp;lt;/math&amp;gt;,&lt;br /&gt;
# &amp;lt;math&amp;gt;\beta_j = ||z||_2&amp;lt;/math&amp;gt;, если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt;, алгоритм останавливается,&lt;br /&gt;
# &amp;lt;math&amp;gt;q_j+1 = z/\beta_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# вычисляются собственные значения и векторы матрицы &amp;lt;math&amp;gt;T_j = Q_j^T A Q_j&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;
* Вычисление собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; (числа Ритца)&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
q[1] = b / norm(b)&lt;br /&gt;
beta[0] = 0&lt;br /&gt;
q[0] = 0&lt;br /&gt;
for j in [1 .. k]:&lt;br /&gt;
    z = mul(A, q[j])&lt;br /&gt;
    zT = transposed(z)&lt;br /&gt;
    for i in [1 .. j - 1]:&lt;br /&gt;
        z -= mul(scalar_mul(zT, q[i]), q[i])&lt;br /&gt;
    beta[j] = norm(z)&lt;br /&gt;
    if beta[j] == 0:&lt;br /&gt;
        break&lt;br /&gt;
    result = ritz_numbers(mul(transpose(Q[j]), A, Q[j]))&lt;br /&gt;
return result&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Для метода с полной переортогонализацией сложность составляет &amp;lt;math&amp;gt;O(k^2 n)&amp;lt;/math&amp;gt;, сложность по памяти -- &amp;lt;math&amp;gt;O(kn)&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;
* Итерации внутреннего цикла могут вычисляться параллельно, однако, требуется суммирование вычитаемых векторов, соответственно, сложность переортогонализации можно снизить с &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(n \log k)&amp;lt;/math&amp;gt;&lt;br /&gt;
* В каждой итерации внутреннего цикла возможно распараллеливание вычисления выражения справа (скалярное произведение и умножение вектора на число), что теоретически позволяет снизить сложность итерации с &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данны&#039;&#039;&#039;е: квадратная симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: собственные числа матрицы&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Полная переортогонализация соответствует повторной процедуре ортогонализациии Грама-Шмидта для обеспечения ортогональности вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; векторам &amp;lt;math&amp;gt;q_1, ..., q_k&amp;lt;/math&amp;gt;. В случае идеально точной арифметики данная переортогонализация не требовалась бы, однако в реальных вычислениях ошибки округления приводят к потере ортогональности, в связи с чем требуется переортогонализация.&lt;br /&gt;
Однако, единственной проблемой, возникающей при отсутствии переортогонализации, является появление повторных копий чисел Ритца (собственных значений), что в случае, если не требуется установление кратностей собственных значений, допустимо.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Библиотека [http://www.nag.co.uk/numeric/fl/nagdoc_fl23/html/INDEXES/KWIC/lanczos.html NAG Library] содержит ряд процедур для решения СЛАУ и поиска собственных значений на основе алгоритма Ланцоша.&lt;br /&gt;
&lt;br /&gt;
[http://www.mathworks.com/help/techdoc/ref/eigs.html MATLAB] и [https://www.gnu.org/software/octave/doc/interpreter/Sparse-Linear-Algebra.html#doc_002deigs GNU Octave] позволяют с помощью функции &#039;&#039;eigs()&#039;&#039; находить собственные значения на основе данного алгоритма.&lt;br /&gt;
&lt;br /&gt;
Matlab-реализация доступна как часть [http://www.cs.cmu.edu/~bickson/gabp/#download Gaussian Belief Propagation Matlab Package]. [http://www.graphlab.ml.cmu.edu/pmf.html GraphLab] содержит несколько параллельных реализаций алгоритма на C++.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. - СПб.: БХВ-Петербург, 2002. - 608 с.&lt;br /&gt;
&lt;br /&gt;
[2] Воеводин В.В., Воеводин Вад.В. Спасительная локальность суперкомпьютеров //Открытые системы. - 2013. - № 9. - С. 12-15.&lt;br /&gt;
&lt;br /&gt;
[3] Воеводин Вад.В., Швец П. Метод покрытий для оценки локальности использования данных в программах // Вестник УГАТУ. — 2014. — Т. 18, № 1(62). — С. 224–229.&lt;br /&gt;
&lt;br /&gt;
[4] Антонов А.С., Теплов А.М. О практической сложности понятия масштабируемости параллельных программ// Высокопроизводительные параллельные вычисления на кластерных системах (HPC 2014): Материалы XIV Международной конференции -Пермь: Издательство ПНИПУ, 2014. С. 20-27.&lt;br /&gt;
&lt;br /&gt;
[5] Никитенко Д.А. Комплексный анализ производительности суперкомпьютерных систем, основанный на данных системного мониторинга // Вычислительные методы и программирование. 2014. 15. 85–97.&lt;/div&gt;</summary>
		<author><name>Error0x0</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=11708</id>
		<title>Участник:Error0x0/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=11708"/>
		<updated>2016-10-15T20:13:43Z</updated>

		<summary type="html">&lt;p&gt;Error0x0: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша представляет собой итерационный алгоритм для вычисления собственных значений симметрической матрицы. &lt;br /&gt;
Идея алгоритма заключается в построении матрицы &amp;lt;math&amp;gt;Q_k = [q_1, ..., q_k]&amp;lt;/math&amp;gt; из ортонормированных векторов Ланцоша и нахождении собственных значений трёхдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;q_1 = b/||b||_2, \beta_0=0, q_0=0&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;z = Aq_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# производится переортогонализация &amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1} {(z^T q_i)q_i}&amp;lt;/math&amp;gt;,&lt;br /&gt;
# &amp;lt;math&amp;gt;\beta_j = ||z||_2&amp;lt;/math&amp;gt;, если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt;, алгоритм останавливается,&lt;br /&gt;
# &amp;lt;math&amp;gt;q_j+1 = z/\beta_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# вычисляются собственные значения и векторы матрицы &amp;lt;math&amp;gt;T_j = Q_j^T A Q_j&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;
* Вычисление собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; (числа Ритца)&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
q[1] = b / norm(b)&lt;br /&gt;
beta[0] = 0&lt;br /&gt;
q[0] = 0&lt;br /&gt;
for j in [1 .. k]:&lt;br /&gt;
    z = mul(A, q[j])&lt;br /&gt;
    zT = transposed(z)&lt;br /&gt;
    for i in [1 .. j - 1]:&lt;br /&gt;
        z -= mul(scalar_mul(zT, q[i]), q[i])&lt;br /&gt;
    beta[j] = norm(z)&lt;br /&gt;
    if beta[j] == 0:&lt;br /&gt;
        break&lt;br /&gt;
    result = ritz_numbers(mul(transpose(Q[j]), A, Q[j]))&lt;br /&gt;
return result&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Для метода с полной переортогонализацией сложность составляет &amp;lt;math&amp;gt;O(k^2 n)&amp;lt;/math&amp;gt;, сложность по памяти -- &amp;lt;math&amp;gt;O(kn)&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;
* Итерации внутреннего цикла могут вычисляться параллельно, однако, требуется суммирование вычитаемых векторов, соответственно, сложность переортогонализации можно снизить с &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(n \log k)&amp;lt;/math&amp;gt;&lt;br /&gt;
* В каждой итерации внутреннего цикла возможно распараллеливание вычисления выражения справа (скалярное произведение и умножение вектора на число), что теоретически позволяет снизить сложность итерации с &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данны&#039;&#039;&#039;е: квадратная симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: собственные числа матрицы&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Полная переортогонализация соответствует повторной процедуре ортогонализациии Грама-Шмидта для обеспечения ортогональности вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; векторам &amp;lt;math&amp;gt;q_1, ..., q_k&amp;lt;/math&amp;gt;. В случае идеально точной арифметики данная переортогонализация не требовалась бы, однако в реальных вычислениях ошибки округления приводят к потере ортогональности, в связи с чем требуется переортогонализация.&lt;br /&gt;
Однако, единственной проблемой, возникающей при отсутствии переортогонализации, является появление повторных копий чисел Ритца (собственных значений), что в случае, если не требуется установление кратностей собственных значений, допустимо.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Библиотека [[NAG Numerical Library|NAG Library]] содержит ряд процедур&amp;lt;ref&amp;gt;{{ cite web | author = The Numerical Algorithms Group  | title = Keyword Index: Lanczos | work = NAG Library Manual, Mark 23 | url = http://www.nag.co.uk/numeric/fl/nagdoc_fl23/html/INDEXES/KWIC/lanczos.html | accessdate = 2012-02-09 }}&amp;lt;/ref&amp;gt; для решения СЛАУ и поиска собственных значений на основе алгоритма Ланцоша.&lt;br /&gt;
&lt;br /&gt;
[[MATLAB]] и [[GNU Octave]] позволяют с помощью функции &#039;&#039;eigs()&#039;&#039; находить собственные значения на основе данного алгоритма([http://www.mathworks.com/help/techdoc/ref/eigs.html Matlab]/[https://www.gnu.org/software/octave/doc/interpreter/Sparse-Linear-Algebra.html#doc_002deigs Octave]).&lt;br /&gt;
&lt;br /&gt;
Matlab-реализация доступна как часть [http://www.cs.cmu.edu/~bickson/gabp/#download Gaussian Belief Propagation Matlab Package]. [[GraphLab]]&amp;lt;ref&amp;gt;[http://www.graphlab.ml.cmu.edu/pmf.html GraphLab]&amp;lt;/ref&amp;gt; содержит несколько параллельных реализаций алгоритма на C++.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. - СПб.: БХВ-Петербург, 2002. - 608 с.&lt;br /&gt;
&lt;br /&gt;
[2] Воеводин В.В., Воеводин Вад.В. Спасительная локальность суперкомпьютеров //Открытые системы. - 2013. - № 9. - С. 12-15.&lt;br /&gt;
&lt;br /&gt;
[3] Воеводин Вад.В., Швец П. Метод покрытий для оценки локальности использования данных в программах // Вестник УГАТУ. — 2014. — Т. 18, № 1(62). — С. 224–229.&lt;br /&gt;
&lt;br /&gt;
[4] Антонов А.С., Теплов А.М. О практической сложности понятия масштабируемости параллельных программ// Высокопроизводительные параллельные вычисления на кластерных системах (HPC 2014): Материалы XIV Международной конференции -Пермь: Издательство ПНИПУ, 2014. С. 20-27.&lt;br /&gt;
&lt;br /&gt;
[5] Никитенко Д.А. Комплексный анализ производительности суперкомпьютерных систем, основанный на данных системного мониторинга // Вычислительные методы и программирование. 2014. 15. 85–97.&lt;/div&gt;</summary>
		<author><name>Error0x0</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=11574</id>
		<title>Участник:Error0x0/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=11574"/>
		<updated>2016-10-15T19:53:31Z</updated>

		<summary type="html">&lt;p&gt;Error0x0: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша представляет собой итерационный алгоритм для вычисления собственных значений симметрической матрицы. &lt;br /&gt;
Идея алгоритма заключается в построении матрицы &amp;lt;math&amp;gt;Q_k = [q_1, ..., q_k]&amp;lt;/math&amp;gt; из ортонормированных векторов Ланцоша и нахождении собственных значений трёхдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;q_1 = b/||b||_2, \beta_0=0, q_0=0&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;z = Aq_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# производится переортогонализация &amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1} {(z^T q_i)q_i}&amp;lt;/math&amp;gt;,&lt;br /&gt;
# &amp;lt;math&amp;gt;\beta_j = ||z||_2&amp;lt;/math&amp;gt;, если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt;, алгоритм останавливается,&lt;br /&gt;
# &amp;lt;math&amp;gt;q_j+1 = z/\beta_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# вычисляются собственные значения и векторы матрицы &amp;lt;math&amp;gt;T_j = Q_j^T A Q_j&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;
* Вычисление собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; (числа Ритца)&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
q[1] = b / norm(b)&lt;br /&gt;
beta[0] = 0&lt;br /&gt;
q[0] = 0&lt;br /&gt;
for j in [1 .. k]:&lt;br /&gt;
    z = mul(A, q[j])&lt;br /&gt;
    zT = transposed(z)&lt;br /&gt;
    for i in [1 .. j - 1]:&lt;br /&gt;
        z -= mul(scalar_mul(zT, q[i]), q[i])&lt;br /&gt;
    beta[j] = norm(z)&lt;br /&gt;
    if beta[j] == 0:&lt;br /&gt;
        break&lt;br /&gt;
    result = ritz_numbers(mul(transpose(Q[j]), A, Q[j]))&lt;br /&gt;
return result&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Для метода с полной переортогонализацией сложность составляет &amp;lt;math&amp;gt;O(k^2 n)&amp;lt;/math&amp;gt;, сложность по памяти -- &amp;lt;math&amp;gt;O(kn)&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;
* Итерации внутреннего цикла могут вычисляться параллельно, однако, требуется суммирование вычитаемых векторов, соответственно, сложность переортогонализации можно снизить с &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(n \log k)&amp;lt;/math&amp;gt;&lt;br /&gt;
* В каждой итерации внутреннего цикла возможно распараллеливание вычисления выражения справа (скалярное произведение и умножение вектора на число), что теоретически позволяет снизить сложность итерации с &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данны&#039;&#039;&#039;е: квадратная симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: собственные числа матрицы&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Полная переортогонализация соответствует повторной процедуре ортогонализациии Грама-Шмидта для обеспечения ортогональности вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; векторам &amp;lt;math&amp;gt;q_1, ..., q_k&amp;lt;/math&amp;gt;. В случае идеально точной арифметики данная переортогонализация не требовалась бы, однако в реальных вычислениях ошибки округления приводят к потере ортогональности, в связи с чем требуется переортогонализация.&lt;br /&gt;
Однако, единственной проблемой, возникающей при отсутствии переортогонализации, является появление повторных копий чисел Ритца (собственных значений), что в случае, если не требуется установление кратностей собственных значений, допустимо.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. - СПб.: БХВ-Петербург, 2002. - 608 с.&lt;br /&gt;
&lt;br /&gt;
[2] Воеводин В.В., Воеводин Вад.В. Спасительная локальность суперкомпьютеров //Открытые системы. - 2013. - № 9. - С. 12-15.&lt;br /&gt;
&lt;br /&gt;
[3] Воеводин Вад.В., Швец П. Метод покрытий для оценки локальности использования данных в программах // Вестник УГАТУ. — 2014. — Т. 18, № 1(62). — С. 224–229.&lt;br /&gt;
&lt;br /&gt;
[4] Антонов А.С., Теплов А.М. О практической сложности понятия масштабируемости параллельных программ// Высокопроизводительные параллельные вычисления на кластерных системах (HPC 2014): Материалы XIV Международной конференции -Пермь: Издательство ПНИПУ, 2014. С. 20-27.&lt;br /&gt;
&lt;br /&gt;
[5] Никитенко Д.А. Комплексный анализ производительности суперкомпьютерных систем, основанный на данных системного мониторинга // Вычислительные методы и программирование. 2014. 15. 85–97.&lt;/div&gt;</summary>
		<author><name>Error0x0</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=11502</id>
		<title>Участник:Error0x0/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=11502"/>
		<updated>2016-10-15T19:39:22Z</updated>

		<summary type="html">&lt;p&gt;Error0x0: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша представляет собой итерационный алгоритм для вычисления собственных значений симметрической матрицы. &lt;br /&gt;
Идея алгоритма заключается в построении матрицы &amp;lt;math&amp;gt;Q_k = [q_1, ..., q_k]&amp;lt;/math&amp;gt; из ортонормированных векторов Ланцоша и нахождении собственных значений трёхдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;q_1 = b/||b||_2, \beta_0=0, q_0=0&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;z = Aq_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# производится переортогонализация &amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1} {(z^T q_i)q_i}&amp;lt;/math&amp;gt;,&lt;br /&gt;
# &amp;lt;math&amp;gt;\beta_j = ||z||_2&amp;lt;/math&amp;gt;, если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt;, алгоритм останавливается,&lt;br /&gt;
# &amp;lt;math&amp;gt;q_j+1 = z/\beta_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# вычисляются собственные значения и векторы матрицы &amp;lt;math&amp;gt;T_j = Q_j^T A Q_j&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;
* Вычисление собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; (числа Ритца)&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
q[1] = b / norm(b)&lt;br /&gt;
beta[0] = 0&lt;br /&gt;
q[0] = 0&lt;br /&gt;
for j in [1 .. k]:&lt;br /&gt;
    z = mul(A, q[j])&lt;br /&gt;
    zT = transposed(z)&lt;br /&gt;
    for i in [1 .. j - 1]:&lt;br /&gt;
        z -= mul(scalar_mul(zT, q[i]), q[i])&lt;br /&gt;
    beta[j] = norm(z)&lt;br /&gt;
    if beta[j] == 0:&lt;br /&gt;
        break&lt;br /&gt;
    result = ritz_numbers(mul(transpose(Q[j]), A, Q[j]))&lt;br /&gt;
return result&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Для метода с полной переортогонализацией сложность составляет &amp;lt;math&amp;gt;O(k^2 n)&amp;lt;/math&amp;gt;, сложность по памяти -- &amp;lt;math&amp;gt;O(kn)&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;
&#039;&#039;&#039;Входные данны&#039;&#039;&#039;е: квадратная симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: собственные числа матрицы&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Полная переортогонализация соответствует повторной процедуре ортогонализациии Грама-Шмидта для обеспечения ортогональности вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; векторам &amp;lt;math&amp;gt;q_1, ..., q_k&amp;lt;/math&amp;gt;. В случае идеально точной арифметики данная переортогонализация не требовалась бы, однако в реальных вычислениях ошибки округления приводят к потере ортогональности, в связи с чем требуется переортогонализация.&lt;br /&gt;
Однако, единственной проблемой, возникающей при отсутствии переортогонализации, является появление повторных копий чисел Ритца (собственных значений), что в случае, если не требуется установление кратностей собственных значений, допустимо.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. - СПб.: БХВ-Петербург, 2002. - 608 с.&lt;br /&gt;
&lt;br /&gt;
[2] Воеводин В.В., Воеводин Вад.В. Спасительная локальность суперкомпьютеров //Открытые системы. - 2013. - № 9. - С. 12-15.&lt;br /&gt;
&lt;br /&gt;
[3] Воеводин Вад.В., Швец П. Метод покрытий для оценки локальности использования данных в программах // Вестник УГАТУ. — 2014. — Т. 18, № 1(62). — С. 224–229.&lt;br /&gt;
&lt;br /&gt;
[4] Антонов А.С., Теплов А.М. О практической сложности понятия масштабируемости параллельных программ// Высокопроизводительные параллельные вычисления на кластерных системах (HPC 2014): Материалы XIV Международной конференции -Пермь: Издательство ПНИПУ, 2014. С. 20-27.&lt;br /&gt;
&lt;br /&gt;
[5] Никитенко Д.А. Комплексный анализ производительности суперкомпьютерных систем, основанный на данных системного мониторинга // Вычислительные методы и программирование. 2014. 15. 85–97.&lt;/div&gt;</summary>
		<author><name>Error0x0</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=11498</id>
		<title>Участник:Error0x0/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=11498"/>
		<updated>2016-10-15T19:38:35Z</updated>

		<summary type="html">&lt;p&gt;Error0x0: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша представляет собой итерационный алгоритм для вычисления собственных значений симметрической матрицы. &lt;br /&gt;
Идея алгоритма заключается в построении матрицы &amp;lt;math&amp;gt;Q_k = [q_1, ..., q_k]&amp;lt;/math&amp;gt; из ортонормированных векторов Ланцоша и нахождении собственных значений трёхдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;q_1 = b/||b||_2, \beta_0=0, q_0=0&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;z = Aq_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# производится переортогонализация &amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1} {(z^T q_i)q_i}&amp;lt;/math&amp;gt;,&lt;br /&gt;
# &amp;lt;math&amp;gt;\beta_j = ||z||_2&amp;lt;/math&amp;gt;, если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt;, алгоритм останавливается,&lt;br /&gt;
# &amp;lt;math&amp;gt;q_j+1 = z/\beta_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# вычисляются собственные значения и векторы матрицы &amp;lt;math&amp;gt;T_j = Q_j^T A Q_j&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;
* Вычисление собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; (числа Ритца)&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
q[1] = b / norm(b)&lt;br /&gt;
beta[0] = 0&lt;br /&gt;
q[0] = 0&lt;br /&gt;
for j in [1 .. k]:&lt;br /&gt;
    z = mul(A, q[j])&lt;br /&gt;
    zT = transposed(z)&lt;br /&gt;
    for i in [1 .. j - 1]:&lt;br /&gt;
        z -= mul(scalar_mul(zT, q[i]), q[i])&lt;br /&gt;
    beta[j] = norm(z)&lt;br /&gt;
    if beta[j] == 0:&lt;br /&gt;
        break&lt;br /&gt;
    result = ritz_numbers(mul(transpose(Q[j]), A, Q[j]))&lt;br /&gt;
return result&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Для метода с полной переортогонализацией сложность составляет &amp;lt;math&amp;gt;O(k^2 n)&amp;lt;/math&amp;gt;, сложность по памяти -- &amp;lt;math&amp;gt;O(kn)&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;
&#039;&#039;&#039;Входные данны&#039;&#039;&#039;е: квадратная симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: собственные числа матрицы&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Полная переортогонализация соответствует повторной процедуре ортогонализациии Грама-Шмидта для обеспечения ортогональности вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; векторам &amp;lt;math&amp;gt;q_1, ..., q_k&amp;lt;/math&amp;gt;. В случае идеально точной арифметики данная переортогонализация не требовалась бы, однако в реальных вычислениях ошибки округления приводят к потере ортогональности, в связи с чем требуется переортогонализация.&lt;br /&gt;
Однако, единственной проблемой, возникающей при отсутствии переортогонализации, является появление повторных копий чисел Ритца (собственных значений), что в случае, если не требуется установление кратностей собственных значений, допустимо.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. - СПб.: БХВ-Петербург, 2002. - 608 с.&lt;br /&gt;
&lt;br /&gt;
[2] Воеводин В.В., Воеводин Вад.В. Спасительная локальность суперкомпьютеров //Открытые системы. - 2013. - № 9. - С. 12-15.&lt;br /&gt;
&lt;br /&gt;
[3] Воеводин Вад.В., Швец П. Метод покрытий для оценки локальности использования данных в программах // Вестник УГАТУ. — 2014. — Т. 18, № 1(62). — С. 224–229.&lt;br /&gt;
&lt;br /&gt;
[4] Антонов А.С., Теплов А.М. О практической сложности понятия масштабируемости параллельных программ// Высокопроизводительные параллельные вычисления на кластерных системах (HPC 2014): Материалы XIV Международной конференции -Пермь: Издательство ПНИПУ, 2014. С. 20-27.&lt;br /&gt;
&lt;br /&gt;
[5] Никитенко Д.А. Комплексный анализ производительности суперкомпьютерных систем, основанный на данных системного мониторинга // Вычислительные методы и программирование. 2014. 15. 85–97.&lt;/div&gt;</summary>
		<author><name>Error0x0</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=11496</id>
		<title>Участник:Error0x0/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=11496"/>
		<updated>2016-10-15T19:38:12Z</updated>

		<summary type="html">&lt;p&gt;Error0x0: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша представляет собой итерационный алгоритм для вычисления собственных значений симметрической матрицы. &lt;br /&gt;
Идея алгоритма заключается в построении матрицы &amp;lt;math&amp;gt;Q_k = [q_1, ..., q_k]&amp;lt;/math&amp;gt; из ортонормированных векторов Ланцоша и нахождении собственных значений трёхдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;q_1 = b/||b||_2, \beta_0=0, q_0=0&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;z = Aq_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# производится переортогонализация &amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1} {(z^T q_i)q_i}&amp;lt;/math&amp;gt;,&lt;br /&gt;
# &amp;lt;math&amp;gt;\beta_j = ||z||_2&amp;lt;/math&amp;gt;, если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt;, алгоритм останавливается,&lt;br /&gt;
# &amp;lt;math&amp;gt;q_j+1 = z/\beta_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# вычисляются собственные значения и векторы матрицы &amp;lt;math&amp;gt;T_j = Q_j^T A Q_j&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;
* Вычисление собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; (числа Ритца)&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
q[1] = b / norm(b)&lt;br /&gt;
beta[0] = 0&lt;br /&gt;
q[0] = 0&lt;br /&gt;
for j in [1 .. k]:&lt;br /&gt;
    z = mul(A, q[j])&lt;br /&gt;
    zT = transposed(z)&lt;br /&gt;
    for i in [1 .. j - 1]:&lt;br /&gt;
        z -= mul(scalar_mul(zT,q[i]), q[i])&lt;br /&gt;
    beta[j] = norm(z)&lt;br /&gt;
    if beta[j] == 0:&lt;br /&gt;
        break&lt;br /&gt;
    result = ritz_numbers(mul(transpose(Q[j]), A, Q[j]))&lt;br /&gt;
return result&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Для метода с полной переортогонализацией сложность составляет &amp;lt;math&amp;gt;O(k^2 n)&amp;lt;/math&amp;gt;, сложность по памяти -- &amp;lt;math&amp;gt;O(kn)&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;
&#039;&#039;&#039;Входные данны&#039;&#039;&#039;е: квадратная симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: собственные числа матрицы&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Полная переортогонализация соответствует повторной процедуре ортогонализациии Грама-Шмидта для обеспечения ортогональности вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; векторам &amp;lt;math&amp;gt;q_1, ..., q_k&amp;lt;/math&amp;gt;. В случае идеально точной арифметики данная переортогонализация не требовалась бы, однако в реальных вычислениях ошибки округления приводят к потере ортогональности, в связи с чем требуется переортогонализация.&lt;br /&gt;
Однако, единственной проблемой, возникающей при отсутствии переортогонализации, является появление повторных копий чисел Ритца (собственных значений), что в случае, если не требуется установление кратностей собственных значений, допустимо.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. - СПб.: БХВ-Петербург, 2002. - 608 с.&lt;br /&gt;
&lt;br /&gt;
[2] Воеводин В.В., Воеводин Вад.В. Спасительная локальность суперкомпьютеров //Открытые системы. - 2013. - № 9. - С. 12-15.&lt;br /&gt;
&lt;br /&gt;
[3] Воеводин Вад.В., Швец П. Метод покрытий для оценки локальности использования данных в программах // Вестник УГАТУ. — 2014. — Т. 18, № 1(62). — С. 224–229.&lt;br /&gt;
&lt;br /&gt;
[4] Антонов А.С., Теплов А.М. О практической сложности понятия масштабируемости параллельных программ// Высокопроизводительные параллельные вычисления на кластерных системах (HPC 2014): Материалы XIV Международной конференции -Пермь: Издательство ПНИПУ, 2014. С. 20-27.&lt;br /&gt;
&lt;br /&gt;
[5] Никитенко Д.А. Комплексный анализ производительности суперкомпьютерных систем, основанный на данных системного мониторинга // Вычислительные методы и программирование. 2014. 15. 85–97.&lt;/div&gt;</summary>
		<author><name>Error0x0</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=11489</id>
		<title>Участник:Error0x0/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=11489"/>
		<updated>2016-10-15T19:37:48Z</updated>

		<summary type="html">&lt;p&gt;Error0x0: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша представляет собой итерационный алгоритм для вычисления собственных значений симметрической матрицы. &lt;br /&gt;
Идея алгоритма заключается в построении матрицы &amp;lt;math&amp;gt;Q_k = [q_1, ..., q_k]&amp;lt;/math&amp;gt; из ортонормированных векторов Ланцоша и нахождении собственных значений трёхдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;q_1 = b/||b||_2, \beta_0=0, q_0=0&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;z = Aq_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# производится переортогонализация &amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1} {(z^T q_i)q_i}&amp;lt;/math&amp;gt;,&lt;br /&gt;
# &amp;lt;math&amp;gt;\beta_j = ||z||_2&amp;lt;/math&amp;gt;, если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt;, алгоритм останавливается,&lt;br /&gt;
# &amp;lt;math&amp;gt;q_j+1 = z/\beta_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# вычисляются собственные значения и векторы матрицы &amp;lt;math&amp;gt;T_j = Q_j^T A Q_j&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;
* Вычисление собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; (числа Ритца)&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
q[1] = b / norm(b)&lt;br /&gt;
beta[0] = 0&lt;br /&gt;
q[0] = 0&lt;br /&gt;
for j in [1 .. k]:&lt;br /&gt;
    z = mul(A, q[j])&lt;br /&gt;
    z_fixed = z&lt;br /&gt;
    for i in [1 .. j - 1]:&lt;br /&gt;
        z -= mul(scalar_mul(transpose(z_fixed),q[i]), q[i])&lt;br /&gt;
    beta[j] = norm(z)&lt;br /&gt;
    if beta[j] == 0:&lt;br /&gt;
        break&lt;br /&gt;
    result = ritz_numbers(mul(transpose(Q[j]), A, Q[j]))&lt;br /&gt;
return result&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Для метода с полной переортогонализацией сложность составляет &amp;lt;math&amp;gt;O(k^2 n)&amp;lt;/math&amp;gt;, сложность по памяти -- &amp;lt;math&amp;gt;O(kn)&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;
&#039;&#039;&#039;Входные данны&#039;&#039;&#039;е: квадратная симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: собственные числа матрицы&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Полная переортогонализация соответствует повторной процедуре ортогонализациии Грама-Шмидта для обеспечения ортогональности вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; векторам &amp;lt;math&amp;gt;q_1, ..., q_k&amp;lt;/math&amp;gt;. В случае идеально точной арифметики данная переортогонализация не требовалась бы, однако в реальных вычислениях ошибки округления приводят к потере ортогональности, в связи с чем требуется переортогонализация.&lt;br /&gt;
Однако, единственной проблемой, возникающей при отсутствии переортогонализации, является появление повторных копий чисел Ритца (собственных значений), что в случае, если не требуется установление кратностей собственных значений, допустимо.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. - СПб.: БХВ-Петербург, 2002. - 608 с.&lt;br /&gt;
&lt;br /&gt;
[2] Воеводин В.В., Воеводин Вад.В. Спасительная локальность суперкомпьютеров //Открытые системы. - 2013. - № 9. - С. 12-15.&lt;br /&gt;
&lt;br /&gt;
[3] Воеводин Вад.В., Швец П. Метод покрытий для оценки локальности использования данных в программах // Вестник УГАТУ. — 2014. — Т. 18, № 1(62). — С. 224–229.&lt;br /&gt;
&lt;br /&gt;
[4] Антонов А.С., Теплов А.М. О практической сложности понятия масштабируемости параллельных программ// Высокопроизводительные параллельные вычисления на кластерных системах (HPC 2014): Материалы XIV Международной конференции -Пермь: Издательство ПНИПУ, 2014. С. 20-27.&lt;br /&gt;
&lt;br /&gt;
[5] Никитенко Д.А. Комплексный анализ производительности суперкомпьютерных систем, основанный на данных системного мониторинга // Вычислительные методы и программирование. 2014. 15. 85–97.&lt;/div&gt;</summary>
		<author><name>Error0x0</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=11477</id>
		<title>Участник:Error0x0/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=11477"/>
		<updated>2016-10-15T19:35:22Z</updated>

		<summary type="html">&lt;p&gt;Error0x0: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша представляет собой итерационный алгоритм для вычисления собственных значений симметрической матрицы. &lt;br /&gt;
Идея алгоритма заключается в построении матрицы &amp;lt;math&amp;gt;Q_k = [q_1, ..., q_k]&amp;lt;/math&amp;gt; из ортонормированных векторов Ланцоша и нахождении собственных значений трёхдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;q_1 = b/||b||_2, \beta_0=0, q_0=0&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;z = Aq_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# производится переортогонализация &amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1} {(z^T q_i)q_i}&amp;lt;/math&amp;gt;,&lt;br /&gt;
# &amp;lt;math&amp;gt;\beta_j = ||z||_2&amp;lt;/math&amp;gt;, если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt;, алгоритм останавливается,&lt;br /&gt;
# &amp;lt;math&amp;gt;q_j+1 = z/\beta_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# вычисляются собственные значения и векторы матрицы &amp;lt;math&amp;gt;T_j = Q_j^T A Q_j&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;
* Вычисление собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; (числа Ритца)&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
q[1] = b / norm(b)&lt;br /&gt;
beta[0] = 0&lt;br /&gt;
q[0] = 0&lt;br /&gt;
for j in [1 .. k]:&lt;br /&gt;
    z = mul(A, q[j])&lt;br /&gt;
    for i in [1 .. j - 1]:&lt;br /&gt;
        z -= mul(scalar_mul(transpose(z),q[i]), q[i])&lt;br /&gt;
    beta[j] = norm(z)&lt;br /&gt;
    if beta[j] == 0:&lt;br /&gt;
        break&lt;br /&gt;
    result = ritz_numbers(mul(transpose(Q[j]), A, Q[j]))&lt;br /&gt;
return result&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Для метода с полной переортогонализацией сложность составляет &amp;lt;math&amp;gt;O(k^2 n)&amp;lt;/math&amp;gt;, сложность по памяти -- &amp;lt;math&amp;gt;O(kn)&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;
&#039;&#039;&#039;Входные данны&#039;&#039;&#039;е: квадратная симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: собственные числа матрицы&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Полная переортогонализация соответствует повторной процедуре ортогонализациии Грама-Шмидта для обеспечения ортогональности вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; векторам &amp;lt;math&amp;gt;q_1, ..., q_k&amp;lt;/math&amp;gt;. В случае идеально точной арифметики данная переортогонализация не требовалась бы, однако в реальных вычислениях ошибки округления приводят к потере ортогональности, в связи с чем требуется переортогонализация.&lt;br /&gt;
Однако, единственной проблемой, возникающей при отсутствии переортогонализации, является появление повторных копий чисел Ритца (собственных значений), что в случае, если не требуется установление кратностей собственных значений, допустимо.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. - СПб.: БХВ-Петербург, 2002. - 608 с.&lt;br /&gt;
&lt;br /&gt;
[2] Воеводин В.В., Воеводин Вад.В. Спасительная локальность суперкомпьютеров //Открытые системы. - 2013. - № 9. - С. 12-15.&lt;br /&gt;
&lt;br /&gt;
[3] Воеводин Вад.В., Швец П. Метод покрытий для оценки локальности использования данных в программах // Вестник УГАТУ. — 2014. — Т. 18, № 1(62). — С. 224–229.&lt;br /&gt;
&lt;br /&gt;
[4] Антонов А.С., Теплов А.М. О практической сложности понятия масштабируемости параллельных программ// Высокопроизводительные параллельные вычисления на кластерных системах (HPC 2014): Материалы XIV Международной конференции -Пермь: Издательство ПНИПУ, 2014. С. 20-27.&lt;br /&gt;
&lt;br /&gt;
[5] Никитенко Д.А. Комплексный анализ производительности суперкомпьютерных систем, основанный на данных системного мониторинга // Вычислительные методы и программирование. 2014. 15. 85–97.&lt;/div&gt;</summary>
		<author><name>Error0x0</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=11472</id>
		<title>Участник:Error0x0/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=11472"/>
		<updated>2016-10-15T19:34:39Z</updated>

		<summary type="html">&lt;p&gt;Error0x0: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша представляет собой итерационный алгоритм для вычисления собственных значений симметрической матрицы. &lt;br /&gt;
Идея алгоритма заключается в построении матрицы &amp;lt;math&amp;gt;Q_k = [q_1, ..., q_k]&amp;lt;/math&amp;gt; из ортонормированных векторов Ланцоша и нахождении собственных значений трёхдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;q_1 = b/||b||_2, \beta_0=0, q_0=0&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;z = Aq_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# производится переортогонализация &amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1} {(z^T q_i)q_i}&amp;lt;/math&amp;gt;,&lt;br /&gt;
# &amp;lt;math&amp;gt;\beta_j = ||z||_2&amp;lt;/math&amp;gt;, если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt;, алгоритм останавливается,&lt;br /&gt;
# &amp;lt;math&amp;gt;q_j+1 = z/\beta_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# вычисляются собственные значения и векторы матрицы &amp;lt;math&amp;gt;T_j = Q_j^T A Q_j&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;
* Вычисление собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; (числа Ритца)&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
q[1] = b / norm(b)&lt;br /&gt;
beta[0] = 0&lt;br /&gt;
q[0] = 0&lt;br /&gt;
for j in [1 .. k]:&lt;br /&gt;
    z = mul(A, q[j])&lt;br /&gt;
    for i in [1 .. j - 1]:&lt;br /&gt;
        z -= mul(scalar_mul(transpose(z),q[i]), q[i])&lt;br /&gt;
    beta[j] = norm(z)&lt;br /&gt;
    if beta[j] == 0:&lt;br /&gt;
        break&lt;br /&gt;
    result = ritz_numbers(mul(transpose(Q[j]), A, Q[j]))&lt;br /&gt;
return result&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Для метода с полной переортогонализацией сложность составляет &amp;lt;math&amp;gt;O(k^2 n)&amp;lt;/math&amp;gt;, сложность по памяти -- &amp;lt;math&amp;gt;O(kn)&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;
&#039;&#039;&#039;Входные данны&#039;&#039;&#039;е: квадратная симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: собственные числа матрицы&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Полная переортогонализация соответствует повторной процедуре ортогонализациии Грама-Шмидта для обеспечения ортогональности вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; векторам &amp;lt;math&amp;gt;q_1, ..., q_k&amp;lt;/math&amp;gt;. В случае идеально точной арифметики данная переортогонализация не требовалась бы, однако в реальных вычислениях ошибки округления приводят к потере ортогональности, в связи с чем требуется переортогонализация.&lt;br /&gt;
Однако, единственной проблемой, возникающей при отсутствии переортогонализации, является появление повторных копий чисел Ритца (собственных значений), что в случае, если не требуется установление кратностей собственных значений, допустимо.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. - СПб.: БХВ-Петербург, 2002. - 608 с.&lt;br /&gt;
&lt;br /&gt;
[2] Воеводин В.В., Воеводин Вад.В. Спасительная локальность суперкомпьютеров //Открытые системы. - 2013. - № 9. - С. 12-15.&lt;br /&gt;
&lt;br /&gt;
[3] Воеводин Вад.В., Швец П. Метод покрытий для оценки локальности использования данных в программах // Вестник УГАТУ. — 2014. — Т. 18, № 1(62). — С. 224–229.&lt;br /&gt;
&lt;br /&gt;
[4] Антонов А.С., Теплов А.М. О практической сложности понятия масштабируемости параллельных программ// Высокопроизводительные параллельные вычисления на кластерных системах (HPC 2014): Материалы XIV Международной конференции -Пермь: Издательство ПНИПУ, 2014. С. 20-27.&lt;br /&gt;
&lt;br /&gt;
[5] Никитенко Д.А. Комплексный анализ производительности суперкомпьютерных систем, основанный на данных системного мониторинга // Вычислительные методы и программирование. 2014. 15. 85–97.&lt;/div&gt;</summary>
		<author><name>Error0x0</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=11470</id>
		<title>Участник:Error0x0/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=11470"/>
		<updated>2016-10-15T19:34:08Z</updated>

		<summary type="html">&lt;p&gt;Error0x0: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша представляет собой итерационный алгоритм для вычисления собственных значений симметрической матрицы. &lt;br /&gt;
Идея алгоритма заключается в построении матрицы &amp;lt;math&amp;gt;Q_k = [q_1, ..., q_k]&amp;lt;/math&amp;gt; из ортонормированных векторов Ланцоша и нахождении собственных значений трёхдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;q_1 = b/||b||_2, \beta_0=0, q_0=0&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;z = Aq_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# производится переортогонализация &amp;lt;math&amp;gt;z = z - \sum^j-1 _i=1 {(z^T q_i)q_i}&amp;lt;/math&amp;gt;,&lt;br /&gt;
# &amp;lt;math&amp;gt;\beta_j = ||z||_2&amp;lt;/math&amp;gt;, если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt;, алгоритм останавливается,&lt;br /&gt;
# &amp;lt;math&amp;gt;q_j+1 = z/\beta_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# вычисляются собственные значения и векторы матрицы &amp;lt;math&amp;gt;T_j = Q_j^T A Q_j&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;
* Вычисление собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; (числа Ритца)&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
q[1] = b / norm(b)&lt;br /&gt;
beta[0] = 0&lt;br /&gt;
q[0] = 0&lt;br /&gt;
for j in [1 .. k]:&lt;br /&gt;
    z = mul(A, q[j])&lt;br /&gt;
    for i in [1 .. j - 1]:&lt;br /&gt;
        z -= mul(scalar_mul(transpose(z),q[i]), q[i])&lt;br /&gt;
    beta[j] = norm(z)&lt;br /&gt;
    if beta[j] == 0:&lt;br /&gt;
        break&lt;br /&gt;
    result = ritz_numbers(mul(transpose(Q[j]), A, Q[j]))&lt;br /&gt;
return result&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Для метода с полной переортогонализацией сложность составляет &amp;lt;math&amp;gt;O(k^2 n)&amp;lt;/math&amp;gt;, сложность по памяти -- &amp;lt;math&amp;gt;O(kn)&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;
&#039;&#039;&#039;Входные данны&#039;&#039;&#039;е: квадратная симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: собственные числа матрицы&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Полная переортогонализация соответствует повторной процедуре ортогонализациии Грама-Шмидта для обеспечения ортогональности вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; векторам &amp;lt;math&amp;gt;q_1, ..., q_k&amp;lt;/math&amp;gt;. В случае идеально точной арифметики данная переортогонализация не требовалась бы, однако в реальных вычислениях ошибки округления приводят к потере ортогональности, в связи с чем требуется переортогонализация.&lt;br /&gt;
Однако, единственной проблемой, возникающей при отсутствии переортогонализации, является появление повторных копий чисел Ритца (собственных значений), что в случае, если не требуется установление кратностей собственных значений, допустимо.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. - СПб.: БХВ-Петербург, 2002. - 608 с.&lt;br /&gt;
&lt;br /&gt;
[2] Воеводин В.В., Воеводин Вад.В. Спасительная локальность суперкомпьютеров //Открытые системы. - 2013. - № 9. - С. 12-15.&lt;br /&gt;
&lt;br /&gt;
[3] Воеводин Вад.В., Швец П. Метод покрытий для оценки локальности использования данных в программах // Вестник УГАТУ. — 2014. — Т. 18, № 1(62). — С. 224–229.&lt;br /&gt;
&lt;br /&gt;
[4] Антонов А.С., Теплов А.М. О практической сложности понятия масштабируемости параллельных программ// Высокопроизводительные параллельные вычисления на кластерных системах (HPC 2014): Материалы XIV Международной конференции -Пермь: Издательство ПНИПУ, 2014. С. 20-27.&lt;br /&gt;
&lt;br /&gt;
[5] Никитенко Д.А. Комплексный анализ производительности суперкомпьютерных систем, основанный на данных системного мониторинга // Вычислительные методы и программирование. 2014. 15. 85–97.&lt;/div&gt;</summary>
		<author><name>Error0x0</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=11463</id>
		<title>Участник:Error0x0/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=11463"/>
		<updated>2016-10-15T19:33:03Z</updated>

		<summary type="html">&lt;p&gt;Error0x0: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша представляет собой итерационный алгоритм для вычисления собственных значений симметрической матрицы. &lt;br /&gt;
Идея алгоритма заключается в построении матрицы &amp;lt;math&amp;gt;Q_k = [q_1, ..., q_k]&amp;lt;/math&amp;gt; из ортонормированных векторов Ланцоша и нахождении собственных значений трёхдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;q_1 = b/||b||_2, \beta_0=0, q_0=0&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;z = Aq_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# производится переортогонализация &amp;lt;math&amp;gt;z = z - \sum ^j-1 _i=1 {(z^T q_i)q_i}&amp;lt;/math&amp;gt;,&lt;br /&gt;
# &amp;lt;math&amp;gt;\beta_j = ||z||_2&amp;lt;/math&amp;gt;, если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt;, алгоритм останавливается,&lt;br /&gt;
# &amp;lt;math&amp;gt;q_j+1 = z/\beta_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# вычисляются собственные значения и векторы матрицы &amp;lt;math&amp;gt;T_j = Q_j^T A Q_j&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;
* Вычисление собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; (числа Ритца)&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
q[1] = b / norm(b)&lt;br /&gt;
beta[0] = 0&lt;br /&gt;
q[0] = 0&lt;br /&gt;
for j in [1 .. k]:&lt;br /&gt;
    z = mul(A, q[j])&lt;br /&gt;
    for i in [1 .. j - 1]:&lt;br /&gt;
        z -= mul(scalar_mul(transpose(z),q[i]), q[i])&lt;br /&gt;
    beta[j] = norm(z)&lt;br /&gt;
    if beta[j] == 0:&lt;br /&gt;
        break&lt;br /&gt;
    result = ritz_numbers(mul(transpose(Q[j]), A, Q[j]))&lt;br /&gt;
return result&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Для метода с полной переортогонализацией сложность составляет &amp;lt;math&amp;gt;O(k^2 n)&amp;lt;/math&amp;gt;, сложность по памяти -- &amp;lt;math&amp;gt;O(kn)&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;
&#039;&#039;&#039;Входные данны&#039;&#039;&#039;е: квадратная симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: собственные числа матрицы&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Полная переортогонализация соответствует повторной процедуре ортогонализациии Грама-Шмидта для обеспечения ортогональности вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; векторам &amp;lt;math&amp;gt;q_1, ..., q_k&amp;lt;/math&amp;gt;. В случае идеально точной арифметики данная переортогонализация не требовалась бы, однако в реальных вычислениях ошибки округления приводят к потере ортогональности, в связи с чем требуется переортогонализация.&lt;br /&gt;
Однако, единственной проблемой, возникающей при отсутствии переортогонализации, является появление повторных копий чисел Ритца (собственных значений), что в случае, если не требуется установление кратностей собственных значений, допустимо.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. - СПб.: БХВ-Петербург, 2002. - 608 с.&lt;br /&gt;
&lt;br /&gt;
[2] Воеводин В.В., Воеводин Вад.В. Спасительная локальность суперкомпьютеров //Открытые системы. - 2013. - № 9. - С. 12-15.&lt;br /&gt;
&lt;br /&gt;
[3] Воеводин Вад.В., Швец П. Метод покрытий для оценки локальности использования данных в программах // Вестник УГАТУ. — 2014. — Т. 18, № 1(62). — С. 224–229.&lt;br /&gt;
&lt;br /&gt;
[4] Антонов А.С., Теплов А.М. О практической сложности понятия масштабируемости параллельных программ// Высокопроизводительные параллельные вычисления на кластерных системах (HPC 2014): Материалы XIV Международной конференции -Пермь: Издательство ПНИПУ, 2014. С. 20-27.&lt;br /&gt;
&lt;br /&gt;
[5] Никитенко Д.А. Комплексный анализ производительности суперкомпьютерных систем, основанный на данных системного мониторинга // Вычислительные методы и программирование. 2014. 15. 85–97.&lt;/div&gt;</summary>
		<author><name>Error0x0</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=11460</id>
		<title>Участник:Error0x0/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=11460"/>
		<updated>2016-10-15T19:32:13Z</updated>

		<summary type="html">&lt;p&gt;Error0x0: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша представляет собой итерационный алгоритм для вычисления собственных значений симметрической матрицы. &lt;br /&gt;
Идея алгоритма заключается в построении матрицы &amp;lt;math&amp;gt;Q_k = [q_1, ..., q_k]&amp;lt;/math&amp;gt; из ортонормированных векторов Ланцоша и нахождении собственных значений трёхдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;q_1 = b/||b||_2, \beta_0=0, q_0=0&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;z = Aq_j,&lt;br /&gt;
# производится переортогонализация &amp;lt;math&amp;gt;z = z - \sum ^j-1 _i=1 {(z^T q_i)q_i}&amp;lt;/math&amp;gt;,&lt;br /&gt;
# &amp;lt;math&amp;gt;\beta_j = ||z||_2&amp;lt;/math&amp;gt;, если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt;, алгоритм останавливается,&lt;br /&gt;
# &amp;lt;math&amp;gt;q_j+1 = z/\beta_j&amp;lt;/math&amp;gt;,&lt;br /&gt;
# вычисляются собственные значения и векторы матрицы &amp;lt;math&amp;gt;T_j = Q_j^T A Q_j&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;
* Вычисление собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; (числа Ритца)&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
q[1] = b / norm(b)&lt;br /&gt;
beta[0] = 0&lt;br /&gt;
q[0] = 0&lt;br /&gt;
for j in [1 .. k]:&lt;br /&gt;
    z = mul(A, q[j])&lt;br /&gt;
    for i in [1 .. j - 1]:&lt;br /&gt;
        z -= mul(scalar_mul(transpose(z),q[i]), q[i])&lt;br /&gt;
    beta[j] = norm(z)&lt;br /&gt;
    if beta[j] == 0:&lt;br /&gt;
        break&lt;br /&gt;
    result = ritz_numbers(mul(transpose(Q[j]), A, Q[j]))&lt;br /&gt;
return result&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Для метода с полной переортогонализацией сложность составляет &amp;lt;math&amp;gt;O(k^2 n)&amp;lt;/math&amp;gt;, сложность по памяти -- &amp;lt;math&amp;gt;O(kn)&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;
&#039;&#039;&#039;Входные данны&#039;&#039;&#039;е: квадратная симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: собственные числа матрицы&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Полная переортогонализация соответствует повторной процедуре ортогонализациии Грама-Шмидта для обеспечения ортогональности вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; векторам &amp;lt;math&amp;gt;q_1, ..., q_k&amp;lt;/math&amp;gt;. В случае идеально точной арифметики данная переортогонализация не требовалась бы, однако в реальных вычислениях ошибки округления приводят к потере ортогональности, в связи с чем требуется переортогонализация.&lt;br /&gt;
Однако, единственной проблемой, возникающей при отсутствии переортогонализации, является появление повторных копий чисел Ритца (собственных значений), что в случае, если не требуется установление кратностей собственных значений, допустимо.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. - СПб.: БХВ-Петербург, 2002. - 608 с.&lt;br /&gt;
&lt;br /&gt;
[2] Воеводин В.В., Воеводин Вад.В. Спасительная локальность суперкомпьютеров //Открытые системы. - 2013. - № 9. - С. 12-15.&lt;br /&gt;
&lt;br /&gt;
[3] Воеводин Вад.В., Швец П. Метод покрытий для оценки локальности использования данных в программах // Вестник УГАТУ. — 2014. — Т. 18, № 1(62). — С. 224–229.&lt;br /&gt;
&lt;br /&gt;
[4] Антонов А.С., Теплов А.М. О практической сложности понятия масштабируемости параллельных программ// Высокопроизводительные параллельные вычисления на кластерных системах (HPC 2014): Материалы XIV Международной конференции -Пермь: Издательство ПНИПУ, 2014. С. 20-27.&lt;br /&gt;
&lt;br /&gt;
[5] Никитенко Д.А. Комплексный анализ производительности суперкомпьютерных систем, основанный на данных системного мониторинга // Вычислительные методы и программирование. 2014. 15. 85–97.&lt;/div&gt;</summary>
		<author><name>Error0x0</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=11430</id>
		<title>Участник:Error0x0/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=11430"/>
		<updated>2016-10-15T19:29:11Z</updated>

		<summary type="html">&lt;p&gt;Error0x0: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша представляет собой итерационный алгоритм для вычисления собственных значений симметрической матрицы. &lt;br /&gt;
Идея алгоритма заключается в построении матрицы &amp;lt;math&amp;gt;Q_k = [q_1, ..., q_k]&amp;lt;/math&amp;gt; из ортонормированных векторов Ланцоша и нахождении собственных значений трёхдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;q_1 = b/||b||_2, \beta_0=0, q_0=0&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;z = Aq_j, \alpha_j = q_j^T z&amp;lt;/math&amp;gt;,&lt;br /&gt;
# производится переортогонализация &amp;lt;math&amp;gt;z = z - \sum ^j-1 _i=1 {(z^T q_i)q_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;\beta_j = ||z||_2&amp;lt;/math&amp;gt;, если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt;, алгоритм останавливается&lt;br /&gt;
# &amp;lt;math&amp;gt;q_j+1 = z/\beta_j&amp;lt;/math&amp;gt;&lt;br /&gt;
# вычисляются собственные значения и векторы матрицы &amp;lt;math&amp;gt;T_j = Q_j^T A Q_j&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;
* Вычисление собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; (числа Ритца)&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
q[1] = b / norm(b)&lt;br /&gt;
beta[0] = 0&lt;br /&gt;
q[0] = 0&lt;br /&gt;
for j in [1 .. k]:&lt;br /&gt;
    z = mul(A, q[j])&lt;br /&gt;
    for i in [1 .. j - 1]:&lt;br /&gt;
        z -= mul(scalar_mul(transpose(z),q[i]), q[i])&lt;br /&gt;
    beta[j] = norm(z)&lt;br /&gt;
    if beta[j] == 0:&lt;br /&gt;
        break&lt;br /&gt;
    result = ritz_numbers(mul(transpose(Q[j]), A, Q[j]))&lt;br /&gt;
return result&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Для метода с полной переортогонализацией сложность составляет &amp;lt;math&amp;gt;O(k^2 n)&amp;lt;/math&amp;gt;, сложность по памяти -- &amp;lt;math&amp;gt;O(kn)&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;
&#039;&#039;&#039;Входные данны&#039;&#039;&#039;е: квадратная симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: собственные числа матрицы&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Полная переортогонализация соответствует повторной процедуре ортогонализациии Грама-Шмидта для обеспечения ортогональности вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; векторам &amp;lt;math&amp;gt;q_1, ..., q_k&amp;lt;/math&amp;gt;. В случае идеально точной арифметики данная переортогонализация не требовалась бы, однако в реальных вычислениях ошибки округления приводят к потере ортогональности, в связи с чем требуется переортогонализация.&lt;br /&gt;
Однако, единственной проблемой, возникающей при отсутствии переортогонализации, является появление повторных копий чисел Ритца (собственных значений), что в случае, если не требуется установление кратностей собственных значений, допустимо.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. - СПб.: БХВ-Петербург, 2002. - 608 с.&lt;br /&gt;
&lt;br /&gt;
[2] Воеводин В.В., Воеводин Вад.В. Спасительная локальность суперкомпьютеров //Открытые системы. - 2013. - № 9. - С. 12-15.&lt;br /&gt;
&lt;br /&gt;
[3] Воеводин Вад.В., Швец П. Метод покрытий для оценки локальности использования данных в программах // Вестник УГАТУ. — 2014. — Т. 18, № 1(62). — С. 224–229.&lt;br /&gt;
&lt;br /&gt;
[4] Антонов А.С., Теплов А.М. О практической сложности понятия масштабируемости параллельных программ// Высокопроизводительные параллельные вычисления на кластерных системах (HPC 2014): Материалы XIV Международной конференции -Пермь: Издательство ПНИПУ, 2014. С. 20-27.&lt;br /&gt;
&lt;br /&gt;
[5] Никитенко Д.А. Комплексный анализ производительности суперкомпьютерных систем, основанный на данных системного мониторинга // Вычислительные методы и программирование. 2014. 15. 85–97.&lt;/div&gt;</summary>
		<author><name>Error0x0</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=11362</id>
		<title>Участник:Error0x0/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=11362"/>
		<updated>2016-10-15T19:19:01Z</updated>

		<summary type="html">&lt;p&gt;Error0x0: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша представляет собой итерационный алгоритм для вычисления собственных значений симметрической матрицы. &lt;br /&gt;
Идея алгоритма заключается в построении матрицы &amp;lt;math&amp;gt;Q_k = [q_1, ..., q_k]&amp;lt;/math&amp;gt; из ортонормированных векторов Ланцоша и нахождении собственных значений трёхдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;q_1 = b/||b||_2, \beta_0=0, q_0=0&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;z = Aq_j, \alpha_j = q_j^T z&amp;lt;/math&amp;gt;,&lt;br /&gt;
# производится переортогонализация &amp;lt;math&amp;gt;z = z - \sum ^j-1 _i=1 {(z^T q_i)q_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;\beta_j = ||z||_2&amp;lt;/math&amp;gt;, если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt;, алгоритм останавливается&lt;br /&gt;
# &amp;lt;math&amp;gt;q_j+1 = z/\beta_j&amp;lt;/math&amp;gt;&lt;br /&gt;
# вычисляются собственные значения и векторы матрицы &amp;lt;math&amp;gt;T_j = Q_j^T A Q_j&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;
* Вычисление собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; (числа Ритца)&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
q[1] = b / norm(b)&lt;br /&gt;
beta[0] = 0&lt;br /&gt;
q[0] = 0&lt;br /&gt;
for j in [1 .. k]:&lt;br /&gt;
    z = mul(A, q[j])&lt;br /&gt;
    for i in [1 .. j - 1]:&lt;br /&gt;
        z -= mul(scalar_mul(transpose(z),q[i]), q[i])&lt;br /&gt;
    beta[j] = norm(z)&lt;br /&gt;
    if beta[j] == 0:&lt;br /&gt;
        break&lt;br /&gt;
    result = ritz_numbers(mul(transpose(Q[j]), A, Q[j]))&lt;br /&gt;
return result&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Для метода с полной переортогонализацией сложность составляет &amp;lt;math&amp;gt;O(k^2 n)&amp;lt;/math&amp;gt;, сложность по памяти -- &amp;lt;math&amp;gt;O(kn)&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;
&#039;&#039;&#039;Входные данны&#039;&#039;&#039;е: квадратная симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: собственные числа матрицы&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. - СПб.: БХВ-Петербург, 2002. - 608 с.&lt;br /&gt;
&lt;br /&gt;
[2] Воеводин В.В., Воеводин Вад.В. Спасительная локальность суперкомпьютеров //Открытые системы. - 2013. - № 9. - С. 12-15.&lt;br /&gt;
&lt;br /&gt;
[3] Воеводин Вад.В., Швец П. Метод покрытий для оценки локальности использования данных в программах // Вестник УГАТУ. — 2014. — Т. 18, № 1(62). — С. 224–229.&lt;br /&gt;
&lt;br /&gt;
[4] Антонов А.С., Теплов А.М. О практической сложности понятия масштабируемости параллельных программ// Высокопроизводительные параллельные вычисления на кластерных системах (HPC 2014): Материалы XIV Международной конференции -Пермь: Издательство ПНИПУ, 2014. С. 20-27.&lt;br /&gt;
&lt;br /&gt;
[5] Никитенко Д.А. Комплексный анализ производительности суперкомпьютерных систем, основанный на данных системного мониторинга // Вычислительные методы и программирование. 2014. 15. 85–97.&lt;/div&gt;</summary>
		<author><name>Error0x0</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=11206</id>
		<title>Участник:Error0x0/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=11206"/>
		<updated>2016-10-15T18:53:23Z</updated>

		<summary type="html">&lt;p&gt;Error0x0: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша представляет собой итерационный алгоритм для вычисления собственных значений симметрической матрицы. &lt;br /&gt;
Идея алгоритма заключается в построении матрицы &amp;lt;math&amp;gt;Q_k = [q_1, ..., q_k]&amp;lt;/math&amp;gt; из ортонормированных векторов Ланцоша и нахождении собственных значений трёхдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;q_1 = b/||b||_2, \beta_0=0, q_0=0&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;z = Aq_j, \alpha_j = q_j^T z&amp;lt;/math&amp;gt;,&lt;br /&gt;
# производится переортогонализация &amp;lt;math&amp;gt;z = z - \sum ^j-1 _i=1 {(z^T q_i)q_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;\beta_j = ||z||_2&amp;lt;/math&amp;gt;, если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt;, алгоритм останавливается&lt;br /&gt;
# &amp;lt;math&amp;gt;q_j+1 = z/\beta_j&amp;lt;/math&amp;gt;&lt;br /&gt;
# вычисляются собственные значения и векторы матрицы &amp;lt;math&amp;gt;T_j = Q_j^T A Q_j&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;
* Вычисление собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; (числа Ритца)&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
q[1] = b / norm(b)&lt;br /&gt;
beta[0] = 0&lt;br /&gt;
q[0] = 0&lt;br /&gt;
for j in [1 .. k]:&lt;br /&gt;
    z = mul(A, q[j])&lt;br /&gt;
    for i in [1 .. j - 1]:&lt;br /&gt;
        z -= mul(scalar_mul(transpose(z),q[i]), q[i])&lt;br /&gt;
    beta[j] = norm(z)&lt;br /&gt;
    if beta[j] == 0:&lt;br /&gt;
        break&lt;br /&gt;
    result = ritz_numbers(mul(transpose(Q[j]), A, Q[j]))&lt;br /&gt;
return result&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Для метода с полной переортогонализацией сложность составляет &amp;lt;math&amp;gt;O(k^2 n)&amp;lt;/math&amp;gt;, сложность по памяти -- &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. - СПб.: БХВ-Петербург, 2002. - 608 с.&lt;br /&gt;
&lt;br /&gt;
[2] Воеводин В.В., Воеводин Вад.В. Спасительная локальность суперкомпьютеров //Открытые системы. - 2013. - № 9. - С. 12-15.&lt;br /&gt;
&lt;br /&gt;
[3] Воеводин Вад.В., Швец П. Метод покрытий для оценки локальности использования данных в программах // Вестник УГАТУ. — 2014. — Т. 18, № 1(62). — С. 224–229.&lt;br /&gt;
&lt;br /&gt;
[4] Антонов А.С., Теплов А.М. О практической сложности понятия масштабируемости параллельных программ// Высокопроизводительные параллельные вычисления на кластерных системах (HPC 2014): Материалы XIV Международной конференции -Пермь: Издательство ПНИПУ, 2014. С. 20-27.&lt;br /&gt;
&lt;br /&gt;
[5] Никитенко Д.А. Комплексный анализ производительности суперкомпьютерных систем, основанный на данных системного мониторинга // Вычислительные методы и программирование. 2014. 15. 85–97.&lt;/div&gt;</summary>
		<author><name>Error0x0</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=11203</id>
		<title>Участник:Error0x0/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=11203"/>
		<updated>2016-10-15T18:53:07Z</updated>

		<summary type="html">&lt;p&gt;Error0x0: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша представляет собой итерационный алгоритм для вычисления собственных значений симметрической матрицы. &lt;br /&gt;
Идея алгоритма заключается в построении матрицы &amp;lt;math&amp;gt;Q_k = [q_1, ..., q_k]&amp;lt;/math&amp;gt; из ортонормированных векторов Ланцоша и нахождении собственных значений трёхдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;q_1 = b/||b||_2, \beta_0=0, q_0=0&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;z = Aq_j, \alpha_j = q_j^T z&amp;lt;/math&amp;gt;,&lt;br /&gt;
# производится переортогонализация &amp;lt;math&amp;gt;z = z - \sum ^j-1 _i=1 {(z^T q_i)q_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;\beta_j = ||z||_2&amp;lt;/math&amp;gt;, если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt;, алгоритм останавливается&lt;br /&gt;
# &amp;lt;math&amp;gt;q_j+1 = z/\beta_j&amp;lt;/math&amp;gt;&lt;br /&gt;
# вычисляются собственные значения и векторы матрицы &amp;lt;math&amp;gt;T_j = Q_j^T A Q_j&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;
* Вычисление собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; (числа Ритца)&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
q[1] = b / norm(b)&lt;br /&gt;
beta[0] = 0&lt;br /&gt;
q[0] = 0&lt;br /&gt;
for j in [1 .. k]:&lt;br /&gt;
    z = mul(A, q[j])&lt;br /&gt;
    for i in [1 .. j - 1]:&lt;br /&gt;
        z -= mul(scalar_mul(transpose(z),q[i]), q[i])&lt;br /&gt;
    beta[j] = norm(z)&lt;br /&gt;
    if beta[j] == 0:&lt;br /&gt;
        break&lt;br /&gt;
    result = ritz_numbers(mul(transpose(Q[j]), A, Q[j]))&lt;br /&gt;
return result&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Для метода с полной переортогонализацией сложность составляет &amp;lt;math&amp;gt;O(k^2 n)&amp;lt;/math&amp;gt;, сложность по памяти --- &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. - СПб.: БХВ-Петербург, 2002. - 608 с.&lt;br /&gt;
&lt;br /&gt;
[2] Воеводин В.В., Воеводин Вад.В. Спасительная локальность суперкомпьютеров //Открытые системы. - 2013. - № 9. - С. 12-15.&lt;br /&gt;
&lt;br /&gt;
[3] Воеводин Вад.В., Швец П. Метод покрытий для оценки локальности использования данных в программах // Вестник УГАТУ. — 2014. — Т. 18, № 1(62). — С. 224–229.&lt;br /&gt;
&lt;br /&gt;
[4] Антонов А.С., Теплов А.М. О практической сложности понятия масштабируемости параллельных программ// Высокопроизводительные параллельные вычисления на кластерных системах (HPC 2014): Материалы XIV Международной конференции -Пермь: Издательство ПНИПУ, 2014. С. 20-27.&lt;br /&gt;
&lt;br /&gt;
[5] Никитенко Д.А. Комплексный анализ производительности суперкомпьютерных систем, основанный на данных системного мониторинга // Вычислительные методы и программирование. 2014. 15. 85–97.&lt;/div&gt;</summary>
		<author><name>Error0x0</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=11198</id>
		<title>Участник:Error0x0/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Error0x0/%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_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%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%B5%D0%B9&amp;diff=11198"/>
		<updated>2016-10-15T18:51:34Z</updated>

		<summary type="html">&lt;p&gt;Error0x0: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша представляет собой итерационный алгоритм для вычисления собственных значений симметрической матрицы. &lt;br /&gt;
Идея алгоритма заключается в построении матрицы &amp;lt;math&amp;gt;Q_k = [q_1, ..., q_k]&amp;lt;/math&amp;gt; из ортонормированных векторов Ланцоша и нахождении собственных значений трёхдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;q_1 = b/||b||_2, \beta_0=0, q_0=0&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;z = Aq_j, \alpha_j = q_j^T z&amp;lt;/math&amp;gt;,&lt;br /&gt;
# производится переортогонализация &amp;lt;math&amp;gt;z = z - \sum ^j-1 _i=1 {(z^T q_i)q_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;\beta_j = ||z||_2&amp;lt;/math&amp;gt;, если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt;, алгоритм останавливается&lt;br /&gt;
# &amp;lt;math&amp;gt;q_j+1 = z/\beta_j&amp;lt;/math&amp;gt;&lt;br /&gt;
# вычисляются собственные значения и векторы матрицы &amp;lt;math&amp;gt;T_j = Q_j^T A Q_j&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;
* Вычисление собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; (числа Ритца)&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
q[1] = b / norm(b)&lt;br /&gt;
beta[0] = 0&lt;br /&gt;
q[0] = 0&lt;br /&gt;
for j in [1 .. k]:&lt;br /&gt;
    z = mul(A, q[j])&lt;br /&gt;
    for i in [1 .. j - 1]:&lt;br /&gt;
        z -= mul(scalar_mul(transpose(z),q[i]), q[i])&lt;br /&gt;
    beta[j] = norm(z)&lt;br /&gt;
    if beta[j] == 0:&lt;br /&gt;
        break&lt;br /&gt;
    result = ritz_numbers(mul(transpose(Q[j]), A, Q[j]))&lt;br /&gt;
return result&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. - СПб.: БХВ-Петербург, 2002. - 608 с.&lt;br /&gt;
&lt;br /&gt;
[2] Воеводин В.В., Воеводин Вад.В. Спасительная локальность суперкомпьютеров //Открытые системы. - 2013. - № 9. - С. 12-15.&lt;br /&gt;
&lt;br /&gt;
[3] Воеводин Вад.В., Швец П. Метод покрытий для оценки локальности использования данных в программах // Вестник УГАТУ. — 2014. — Т. 18, № 1(62). — С. 224–229.&lt;br /&gt;
&lt;br /&gt;
[4] Антонов А.С., Теплов А.М. О практической сложности понятия масштабируемости параллельных программ// Высокопроизводительные параллельные вычисления на кластерных системах (HPC 2014): Материалы XIV Международной конференции -Пермь: Издательство ПНИПУ, 2014. С. 20-27.&lt;br /&gt;
&lt;br /&gt;
[5] Никитенко Д.А. Комплексный анализ производительности суперкомпьютерных систем, основанный на данных системного мониторинга // Вычислительные методы и программирование. 2014. 15. 85–97.&lt;/div&gt;</summary>
		<author><name>Error0x0</name></author>
	</entry>
</feed>