<?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=Alexbashirov</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=Alexbashirov"/>
	<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/Alexbashirov"/>
	<updated>2026-10-22T17:52:53Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=21198</id>
		<title>Участник:Alexbashirov/Алгоритм Ланцоша для точной арифметики</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=21198"/>
		<updated>2016-12-18T15:40:54Z</updated>

		<summary type="html">&lt;p&gt;Alexbashirov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник: Alexbashirov|Баширов А.Д.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name             = Алгоритм Ланцоша для точной арифметики&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;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;
Алгоритм Ланцоша является итерационным алгоритмом поиска собственных значений симметричной матрицы, разработанным венгерским физиком и математиком XX столетия Корнелием Ланцошем в 1950 году. Алгоритм совмещает в себе два других алгоритма: алгоритм построения подпространства Крылова (который также был создан Ланцошем) и процедуру Рэлея-Ритца приближения собственных значений матрицы. Алгоритм является вариацией степенного метода, позволяющего найти собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-го порядка. Однако в алгоритме число итераций ограничено некоторым &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;. Несмотря на заявленную вычислительную эффективность, алгоритм не получил широкого применения в своём первоначальном виде, ввиду его неустойчивости. 20 лет спустя, в 1970 году ученые Ojalvo и Newman показали доработанный алгоритм Ланцоша, который теперь стал устойчивым а также предложили способ выбора вектора начального приближения &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt;. Полученный последователями Ланцоша алгоритм получил название &amp;quot;Алгоритм Ланцоша с полной переортогонализацией&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма===&lt;br /&gt;
Алгоритм Ланцоша работает с вещественной симметричной матрицей &amp;lt;math&amp;gt;A=A^T&amp;lt;/math&amp;gt;, таким образом в памяти достаточно хранить лишь немногим более половины элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Прежде чем переходить к описанию алгоритма, следует упомянуть следующие понятия: подпространство Крылова и процесс Рэлея-Ритца, о которых уже было сказано в исторической справке выше. &lt;br /&gt;
Подпространством Крылова называется набор векторов&amp;lt;math&amp;gt;K_n =[b,Ab,A^2b,...,A^{n-1}b]&amp;lt;/math&amp;gt;. Начав свою работу с произвольного вектора &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, степенной метод вычисляет вектора &amp;lt;math&amp;gt;Ab, A^2b,...,A^{n-1}b&amp;lt;/math&amp;gt; итерационно сохраняя полученный результат в вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Полученная последовательность векторов сходится к собственному вектору, отвечающему максимальному собственному значению &amp;lt;math&amp;gt;\lambda_{max}&amp;lt;/math&amp;gt;. Однако, использование лишь последнего полученного вектора и потеря всех предшествующих посчитанных величин не всегда является наилучшим выбором. Поэтому сохранив все вектора и объединив их в одну матрицу мы получим так называемую &amp;lt;i&amp;gt;матрицу Крылова  &amp;lt;/i&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K_j = [b,Ab,A^2b,...,A^{j-1}b]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Столбцы получившейся матрицы не ортогональны, однако их можно ортогонализовать, применив процесс Грамма-Шмидта. Получившиеся вектора будут составлять базис подпространства Крылова &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt;. Можно ожидать, что вектора полученного базиса будут достаточно хорошо приближать &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; собственных векторов, отвечающих &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; наибольшим собственным значения.&lt;br /&gt;
&lt;br /&gt;
Затем с использованием полученной матрицы из ортогональных векторов &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt; мы получим трехдиагональную матрицу &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; на основе исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
Наконец, к полученной матрице &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; будет применяться &amp;lt;i&amp;gt;процесс Рэлея-Ритца&amp;lt;/i&amp;gt;, который найдет собственные значения трехдиагональной матрицы. В последствии эти значения и будут приближениями искомых собственных значений исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма Ланцоша, то есть наиболее ресурсно-затратной частью алгоритма, является шаг на котором на каждой итерации происходит перемножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;, полученный на предыдущей итерации. Полученный в результате умножения вектор обозначается &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; z=Aq_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;Q_j=[q_1,q_2,...q_j]&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортонормированных вектров Ланцоша и последующее формирование трехдиагональной матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;. Число таких векторов и, следовательно, размер матрицы растет с каждой итерацией. Итерационный процесс завершается при &amp;lt;math&amp;gt;j=k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На долю второй части алгоритма приходится поиск собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;, полученной в первой части.&lt;br /&gt;
&lt;br /&gt;
=== Схема последовательной реализации алгоритма ===&lt;br /&gt;
&amp;lt;math&amp;gt;q=b/||b||_2&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\beta_0=0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;q_0=0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; ~ {\rm for } j=1 ~ {\rm to} k&amp;lt;/math&amp;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;
&amp;lt;math&amp;gt;\alpha_j = q_j^T z&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; z = z - \alpha_jq_j -\beta_{j-1}q_{j-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \beta_j = ||z||_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; ~ {\rm if} \beta_j = 0 ~ {\rm quit}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; q_{j+1} = z/\beta_j&amp;lt;/math&amp;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;
&amp;lt;math&amp;gt; ~ {\rm end} ~ {\rm for} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выше представлен псевдокод, отражающий последовательность действий в алгоритме метода. Перечислим основные ступени в данном методе:&lt;br /&gt;
* Прежде чем войти в цикл, происходит инициализация констант &amp;lt;math&amp;gt;\Beta_0,q_0&amp;lt;/math&amp;gt;, вычисление нормы вектора начального приближения &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и нормализация этого вектора.&lt;br /&gt;
* Затем, в цикле, происходит: &lt;br /&gt;
**поиск вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, являющегося результатом применения матричного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;; &lt;br /&gt;
**скалярное произведение двух векторов &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**вычисляется линейная комбинация векторов; &lt;br /&gt;
**вычисляется норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**проверяется условие выхода из цикла (равенство нулю нормы вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;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;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Посчитаем количество операций, необходимых для поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений и векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; действий для умножения матрицы на вектор&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; действия для перемножения двух векторов&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  операций для поэлементного сложения или вычитания двух векторов&lt;br /&gt;
* для отыскания нормы вектора помимо &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  сложений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  умножений требуется 1 операция извлечения корня&lt;br /&gt;
* для поиска собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; требуется &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарно для одной итерации алгоритма требуется совершить  &amp;lt;math&amp;gt;O(n^2)+O(k^3)&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;A&amp;lt;/math&amp;gt; используются на каждом итерационном слое, поэтому обозначена как входные данные на втором и третьем слоях на схеме.&lt;br /&gt;
Те данные, которые передаются на следущий итерационный слой с предыдущего - обозначены стрелками между вторым и третьим слоями.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Информационный_граф_1.png|1000px|thumb|center| &amp;lt;math&amp;gt;||x||&amp;lt;/math&amp;gt; - операция вычисления нормы;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; - операция деления;&lt;br /&gt;
• - операция скалярного умножения векторов;&lt;br /&gt;
Ax - операция применения оператора A к вектору x;&lt;br /&gt;
F - операция вычисления линейной комбинации.&lt;br /&gt;
Желтый ромб символизирует проверку логического условия выхода из итерационного цикла (в случае если посчитанная норма равна нулю).&lt;br /&gt;
Input,Out - входные и выходные данные.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Поскольку алгоритм является итерационным, то выполнять параллельные операции возможно только внутри каждой итерации алгоритма. Сами итерации выполняются в строгой последовательности и не могут быть параллелизованны. Однако внутри каждой итерации происходят два процесса, которые могут быть параллелизованны:&lt;br /&gt;
* умножение матрицы на вектор,&lt;br /&gt;
* процесс поиска собственных значений. Этот процесс является самостоятельной задачей. Для поиска собственных значений могут использоваться различные методы, например такие, как QR-алгоритм или метод &amp;quot;Разделяй и властвуй&amp;quot;. Соответственно, в зависимости от выбранного алгоритма поиска с./знач. могут иметь различные свойства.&lt;br /&gt;
&lt;br /&gt;
Умножение квадратной матрицы размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt; на вектор размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
В свою очередь ресурс параллелизма операции поиска собственных значений зависит от выбранного способа и не рассматривается в данной статье.&lt;br /&gt;
&lt;br /&gt;
Таким образом, с точки зрения ресурса параллелизма, алгоритм Ланцоша обладает линейной сложностью по ширине ЯПФ и квадратичной сложностью по высоте ЯПФ. Основное время работы алгоритма будет уделено операции умножения матрицы на вектор, имеющей ширину яруса &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;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;A&amp;lt;/math&amp;gt;, следовательно на вход данный алгоритм во всяком случае получает 1 число и 1 матрицу размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;. Помимо этого для начала работы алгоритму нужен некоторый вектор &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; начального приближения размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, который тоже является входными данными.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После окончания работы алгоритма мы получаем набор собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, состоящий из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; элементов. Если помимо собственных значений выводятся еще и полученные собственные векторы, то суммарный объём всех таких векторов составляет &amp;lt;math&amp;gt;k\times n&amp;lt;/math&amp;gt; элементов. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, совокупный объём входных данных составляет: &amp;lt;math&amp;gt;n^2+n+1&amp;lt;/math&amp;gt; элемент, а на выходе получаем &amp;lt;math&amp;gt;k(n+1)&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;lt;math&amp;gt;A&amp;lt;/math&amp;gt;) начиная с максимального в абсолютном смысле значения. Это выгодно отличает данный алгоритм с точки зрения поиска собственных значений матрицы, находящихся по краям её спектра.&lt;br /&gt;
&lt;br /&gt;
Не является полностью детерминированным, т.к. может досрочно завершить работу, если будут найдены все ненулевые собственные значения.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма (то есть отношение числа операций к суммарному объему входных и выходных данных) равна &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+2n+1}&amp;lt;/math&amp;gt;. Следовательно порядок мощности алгоритма примерно равен &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;, при &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В случае использования метода вычисления собственных значений с линейной сложностью, соотношение последовательной и параллельной сложностей будет равно &amp;lt;math&amp;gt;(k ^ 2 + n ^ 2) / (k  + 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;
Для компиляции программы использовались компиляторы intel/15.0.090 и  Openmpi/1.8.4-icc.&lt;br /&gt;
&lt;br /&gt;
Для проведения расчетов и получения полноценной картины поведения алгоритма в зависимости от входных данных и числа процессоров, программа была запущена на следующих параметрах:&lt;br /&gt;
&lt;br /&gt;
* в качестве размера входной матрицы подавались значения в диапазоне [2000:30000] c шагом 2000.&lt;br /&gt;
* Число процессоров варьировалось от 1 до 256. &lt;br /&gt;
* В качестве числа, отвечающего за количество выполняемых методом итераций бралось значение 100.&lt;br /&gt;
&lt;br /&gt;
Ниже на рисунке изображен трехмерный график, показывающий зависимость времени выполнения программы от входных данных/&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lanczos_time_matrix.png|1000px|thumb|center| График зависимости времени выполнения программы от входных данных]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Также была исследована эффективность распараллеливания:&lt;br /&gt;
* Средняя эффективность выполнения алгоритма составила порядка 12%&lt;br /&gt;
* Наивысший показатель равен 43%&lt;br /&gt;
* Минимальное значение составило &amp;lt;1%&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма=== &lt;br /&gt;
=== Выводы для классов архитектур=== &lt;br /&gt;
=== Существующие реализации алгоритма===&lt;br /&gt;
&lt;br /&gt;
В настоящее время алгоритм Ланцоша поиска собственных значений квадратной симметричной матрицы включён в несколько библиотек и реализован на различных языках, среди которых такие наиболее распространенные как &#039;&#039;&#039;C&#039;&#039;&#039;, &#039;&#039;&#039;C++&#039;&#039;&#039;, &#039;&#039;&#039;FORTRAN77/90&#039;&#039;&#039;, &#039;&#039;&#039;MathLab&#039;&#039;&#039;.&lt;br /&gt;
Так, например, в языке &#039;&#039;&#039;MathLab&#039;&#039;&#039; во встроенном пакете &#039;&#039;&#039;ARPACK&#039;&#039;&#039; найти собственные значения методом Ланцоша можно при помощи вызова функции &#039;&#039;eigs()&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
На языке &#039;&#039;&#039;С&#039;&#039;&#039; существует библиотека &#039;&#039;&#039;[http://www.cs.wm.edu/~andreas/software/ PRIMME]&#039;&#039;&#039;, название которой расшифровывается как PReconditioned Iterative MultiMethod Eigensolver (итерационные методы поиска собственных значений с предусловием).&lt;br /&gt;
&lt;br /&gt;
Библиотека &#039;&#039;&#039;[http://www.nag.co.uk NAG] Numerical Library&#039;&#039;&#039; также содержит обширный набор функций, позволяющих проводить математический анализ, среди которых есть и реализация алгоритма Ланцоша. Библиотека доступна в трех пакетах: NAG C Library, NAG Fortran Library и NAG Library for .NET, совместна со многими языками и с основными операционными системами (Windows, Linux and OS X, а также Solaris, AIX и HP-UX).&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] Дж. Деммель «Вычислительная линейная алгебра», с 381.&lt;br /&gt;
&lt;br /&gt;
[2] Wikipedia https://en.wikipedia.org/wiki/Lanczos_algorithm&lt;br /&gt;
&lt;br /&gt;
[3] &amp;quot;[https://static.ph.ed.ac.uk/dissertations/hpc-msc/2013-2014/Investigation%20and%20Implementation%20of%20an%20Eigensolver%20Method.pdf Investigation and Implementation of an Eigensolver Method]&amp;quot;, Jorge Moreira, The University of Edinburgh, August 2014&lt;br /&gt;
&lt;br /&gt;
[4] &amp;quot;[http://www.physics.drexel.edu/~bob/Term_Reports/Hoppe_01.pdf Lanczos Vector Procedures]&amp;quot;, Travis Hoppe&lt;br /&gt;
&lt;br /&gt;
[5] &amp;quot;[http://pochenfullwave.ddns.net/wp-content/uploads/2015/09/61309283-Parallel-Scientific-Computing-in-C-and-MPI-2003.pdf Parallel Scientific Computing in C++ and MPI]&amp;quot;,&lt;br /&gt;
A seamless approach to parallel algorithms and their implementation,&lt;br /&gt;
George Em Karniadakis and Robert M. Kirby II,&lt;br /&gt;
Cambridge University Press&lt;/div&gt;</summary>
		<author><name>Alexbashirov</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:Alexbashirov&amp;diff=21197</id>
		<title>Обсуждение участника:Alexbashirov</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:Alexbashirov&amp;diff=21197"/>
		<updated>2016-12-18T15:40:03Z</updated>

		<summary type="html">&lt;p&gt;Alexbashirov: /* Новые замечания */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Участник:Alexbashirov/Алгоритм Ланцоша для точной арифметики]] ==&lt;br /&gt;
&lt;br /&gt;
=== Замечания по тексту ===&lt;br /&gt;
* К коду в разделе 1.5 нужно добавить словесные пояснения. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:22, 25 октября 2016 (MSK)&lt;br /&gt;
* В разделе 1.8 требуется представить оценку параллельной сложности алгоритма. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:22, 25 октября 2016 (MSK)&lt;br /&gt;
* В разделе 1.10 требуется представить оценку вычислительной мощности алгоритма. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:22, 25 октября 2016 (MSK)&lt;br /&gt;
** Оценки вычислительной мощности алгоритма так и не приведено. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 11:12, 1 ноября 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
=== Отсутствующие части ===&lt;br /&gt;
* Нет информации в разделе 1.7. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:22, 25 октября 2016 (MSK)&lt;br /&gt;
** Граф в разделе 1.7 не даёт представления об информационной связи между итерациями. Часть дуг изображена в виде стрелок (почему-то толстых), а часть - в виде ненаправленных кривых. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 11:12, 1 ноября 2016 (MSK)&lt;br /&gt;
* Не заполнен раздел 2.4 описания. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:08, 16 ноября 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
== Новые замечания ==&lt;br /&gt;
* не нужно убирать этот текст, хорошо бы прямо здесь отметить, что замечания исправлены&lt;br /&gt;
* [DONE] п.1.5 служебные слова выделить пробелами символом ~, а также набрать их прямым шрифтом (как это сделано мною для слова &amp;quot;quit&amp;quot;)&lt;br /&gt;
* [DONE] ждем п.2.4...&lt;br /&gt;
&lt;br /&gt;
P.S.: возникла некоторая путаница с тем, где проверяющие мою работу пишут мне замечания: в зависимости от того, из какой директории нажать на &amp;quot;Обсуждение&amp;quot; зависит куда будет совершен переход по ссылке. Я постарался удовлетворить обоим спискам замечаний.&lt;br /&gt;
&lt;br /&gt;
Спасибо!&lt;/div&gt;</summary>
		<author><name>Alexbashirov</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=21196</id>
		<title>Обсуждение участника:Alexbashirov/Алгоритм Ланцоша для точной арифметики</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=21196"/>
		<updated>2016-12-18T15:38:06Z</updated>

		<summary type="html">&lt;p&gt;Alexbashirov: /* Замечания */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Замечания ===&lt;br /&gt;
* [DONE] убрать название пункта &amp;quot;1.1.1 История&amp;quot;, а сам текст оставить.&lt;br /&gt;
* [DONE] 1.2 вместо ужирнения текста &amp;quot;матрицу Крылова&amp;quot;, &amp;quot;процесс Рэлея-Ритца&amp;quot; лучше использовать наклон, т.к. ужирнение занято для заголовков&lt;br /&gt;
* [DONE] 1.5 скан алгоритма заменить на набранный текст вместо фото из книжки&lt;br /&gt;
* [DONE] 1.7 добавить словесное описание графа&lt;br /&gt;
* [DONE] 1.8 &amp;quot;процесс поиска собственных значений&amp;quot; - уточнить&lt;br /&gt;
* [DONE] 1.10 &amp;quot;...векторов с 3-ух до 2-ух.&amp;quot; - лучше полностью написать словами без &amp;quot;ух&amp;quot;-ов.&lt;br /&gt;
* [DONE] 2.4 и 2.7 пока отсутствуют...&lt;/div&gt;</summary>
		<author><name>Alexbashirov</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=21195</id>
		<title>Участник:Alexbashirov/Алгоритм Ланцоша для точной арифметики</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=21195"/>
		<updated>2016-12-18T15:37:47Z</updated>

		<summary type="html">&lt;p&gt;Alexbashirov: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[Участник: Alexbashirov|Баширов А.Д.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name             = Алгоритм Ланцоша для точной арифметики&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;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;
Алгоритм Ланцоша является итерационным алгоритмом поиска собственных значений симметричной матрицы, разработанным венгерским физиком и математиком XX столетия Корнелием Ланцошем в 1950 году. Алгоритм совмещает в себе два других алгоритма: алгоритм построения подпространства Крылова (который также был создан Ланцошем) и процедуру Рэлея-Ритца приближения собственных значений матрицы. Алгоритм является вариацией степенного метода, позволяющего найти собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-го порядка. Однако в алгоритме число итераций ограничено некоторым &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;. Несмотря на заявленную вычислительную эффективность, алгоритм не получил широкого применения в своём первоначальном виде, ввиду его неустойчивости. 20 лет спустя, в 1970 году ученые Ojalvo и Newman показали доработанный алгоритм Ланцоша, который теперь стал устойчивым а также предложили способ выбора вектора начального приближения &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt;. Полученный последователями Ланцоша алгоритм получил название &amp;quot;Алгоритм Ланцоша с полной переортогонализацией&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма===&lt;br /&gt;
Алгоритм Ланцоша работает с вещественной симметричной матрицей &amp;lt;math&amp;gt;A=A^T&amp;lt;/math&amp;gt;, таким образом в памяти достаточно хранить лишь немногим более половины элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Прежде чем переходить к описанию алгоритма, следует упомянуть следующие понятия: подпространство Крылова и процесс Рэлея-Ритца, о которых уже было сказано в исторической справке выше. &lt;br /&gt;
Подпространством Крылова называется набор векторов&amp;lt;math&amp;gt;K_n =[b,Ab,A^2b,...,A^{n-1}b]&amp;lt;/math&amp;gt;. Начав свою работу с произвольного вектора &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, степенной метод вычисляет вектора &amp;lt;math&amp;gt;Ab, A^2b,...,A^{n-1}b&amp;lt;/math&amp;gt; итерационно сохраняя полученный результат в вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Полученная последовательность векторов сходится к собственному вектору, отвечающему максимальному собственному значению &amp;lt;math&amp;gt;\lambda_{max}&amp;lt;/math&amp;gt;. Однако, использование лишь последнего полученного вектора и потеря всех предшествующих посчитанных величин не всегда является наилучшим выбором. Поэтому сохранив все вектора и объединив их в одну матрицу мы получим так называемую &amp;lt;i&amp;gt;матрицу Крылова  &amp;lt;/i&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K_j = [b,Ab,A^2b,...,A^{j-1}b]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Столбцы получившейся матрицы не ортогональны, однако их можно ортогонализовать, применив процесс Грамма-Шмидта. Получившиеся вектора будут составлять базис подпространства Крылова &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt;. Можно ожидать, что вектора полученного базиса будут достаточно хорошо приближать &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; собственных векторов, отвечающих &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; наибольшим собственным значения.&lt;br /&gt;
&lt;br /&gt;
Затем с использованием полученной матрицы из ортогональных векторов &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt; мы получим трехдиагональную матрицу &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; на основе исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
Наконец, к полученной матрице &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; будет применяться &amp;lt;i&amp;gt;процесс Рэлея-Ритца&amp;lt;/i&amp;gt;, который найдет собственные значения трехдиагональной матрицы. В последствии эти значения и будут приближениями искомых собственных значений исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма Ланцоша, то есть наиболее ресурсно-затратной частью алгоритма, является шаг на котором на каждой итерации происходит перемножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;, полученный на предыдущей итерации. Полученный в результате умножения вектор обозначается &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; z=Aq_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;Q_j=[q_1,q_2,...q_j]&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортонормированных вектров Ланцоша и последующее формирование трехдиагональной матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;. Число таких векторов и, следовательно, размер матрицы растет с каждой итерацией. Итерационный процесс завершается при &amp;lt;math&amp;gt;j=k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На долю второй части алгоритма приходится поиск собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;, полученной в первой части.&lt;br /&gt;
&lt;br /&gt;
=== Схема последовательной реализации алгоритма ===&lt;br /&gt;
&amp;lt;math&amp;gt;q=b/||b||_2&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\beta_0=0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;q_0=0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; ~ {\rm for } j=1 ~ {\rm to} k&amp;lt;/math&amp;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;
&amp;lt;math&amp;gt;\alpha_j = q_j^T z&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; z = z - \alpha_jq_j -\beta_{j-1}q_{j-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \beta_j = ||z||_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; ~ {\rm if} \beta_j = 0 ~ {\rm quit}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; q_{j+1} = z/\beta_j&amp;lt;/math&amp;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;
&amp;lt;math&amp;gt; ~ {\rm end} ~ {\rm for} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выше представлен псевдокод, отражающий последовательность действий в алгоритме метода. Перечислим основные ступени в данном методе:&lt;br /&gt;
* Прежде чем войти в цикл, происходит инициализация констант &amp;lt;math&amp;gt;\Beta_0,q_0&amp;lt;/math&amp;gt;, вычисление нормы вектора начального приближения &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и нормализация этого вектора.&lt;br /&gt;
* Затем, в цикле, происходит: &lt;br /&gt;
**поиск вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, являющегося результатом применения матричного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;; &lt;br /&gt;
**скалярное произведение двух векторов &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**вычисляется линейная комбинация векторов; &lt;br /&gt;
**вычисляется норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**проверяется условие выхода из цикла (равенство нулю нормы вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;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;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Посчитаем количество операций, необходимых для поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений и векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; действий для умножения матрицы на вектор&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; действия для перемножения двух векторов&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  операций для поэлементного сложения или вычитания двух векторов&lt;br /&gt;
* для отыскания нормы вектора помимо &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  сложений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  умножений требуется 1 операция извлечения корня&lt;br /&gt;
* для поиска собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; требуется &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарно для одной итерации алгоритма требуется совершить  &amp;lt;math&amp;gt;O(n^2)+O(k^3)&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;A&amp;lt;/math&amp;gt; используются на каждом итерационном слое, поэтому обозначена как входные данные на втором и третьем слоях на схеме.&lt;br /&gt;
Те данные, которые передаются на следущий итерационный слой с предыдущего - обозначены стрелками между вторым и третьим слоями.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Информационный_граф_1.png|1000px|thumb|center| &amp;lt;math&amp;gt;||x||&amp;lt;/math&amp;gt; - операция вычисления нормы;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; - операция деления;&lt;br /&gt;
• - операция скалярного умножения векторов;&lt;br /&gt;
Ax - операция применения оператора A к вектору x;&lt;br /&gt;
F - операция вычисления линейной комбинации.&lt;br /&gt;
Желтый ромб символизирует проверку логического условия выхода из итерационного цикла (в случае если посчитанная норма равна нулю).&lt;br /&gt;
Input,Out - входные и выходные данные.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Поскольку алгоритм является итерационным, то выполнять параллельные операции возможно только внутри каждой итерации алгоритма. Сами итерации выполняются в строгой последовательности и не могут быть параллелизованны. Однако внутри каждой итерации происходят два процесса, которые могут быть параллелизованны:&lt;br /&gt;
* умножение матрицы на вектор,&lt;br /&gt;
* процесс поиска собственных значений. Этот процесс является самостоятельной задачей. Для поиска собственных значений могут использоваться различные методы, например такие, как QR-алгоритм или метод &amp;quot;Разделяй и властвуй&amp;quot;. Соответственно, в зависимости от выбранного алгоритма поиска с./знач. могут иметь различные свойства.&lt;br /&gt;
&lt;br /&gt;
Умножение квадратной матрицы размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt; на вектор размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
В свою очередь ресурс параллелизма операции поиска собственных значений зависит от выбранного способа и не рассматривается в данной статье.&lt;br /&gt;
&lt;br /&gt;
Таким образом, с точки зрения ресурса параллелизма, алгоритм Ланцоша обладает линейной сложностью по ширине ЯПФ и квадратичной сложностью по высоте ЯПФ. Основное время работы алгоритма будет уделено операции умножения матрицы на вектор, имеющей ширину яруса &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;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;A&amp;lt;/math&amp;gt;, следовательно на вход данный алгоритм во всяком случае получает 1 число и 1 матрицу размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;. Помимо этого для начала работы алгоритму нужен некоторый вектор &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; начального приближения размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, который тоже является входными данными.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После окончания работы алгоритма мы получаем набор собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, состоящий из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; элементов. Если помимо собственных значений выводятся еще и полученные собственные векторы, то суммарный объём всех таких векторов составляет &amp;lt;math&amp;gt;k\times n&amp;lt;/math&amp;gt; элементов. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, совокупный объём входных данных составляет: &amp;lt;math&amp;gt;n^2+n+1&amp;lt;/math&amp;gt; элемент, а на выходе получаем &amp;lt;math&amp;gt;k(n+1)&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;lt;math&amp;gt;A&amp;lt;/math&amp;gt;) начиная с максимального в абсолютном смысле значения. Это выгодно отличает данный алгоритм с точки зрения поиска собственных значений матрицы, находящихся по краям её спектра.&lt;br /&gt;
&lt;br /&gt;
Не является полностью детерминированным, т.к. может досрочно завершить работу, если будут найдены все ненулевые собственные значения.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма (то есть отношение числа операций к суммарному объему входных и выходных данных) равна &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+2n+1}&amp;lt;/math&amp;gt;. Следовательно порядок мощности алгоритма примерно равен &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;, при &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В случае использования метода вычисления собственных значений с линейной сложностью, соотношение последовательной и параллельной сложностей будет равно &amp;lt;math&amp;gt;(k ^ 2 + n ^ 2) / (k  + 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;
Для компиляции программы использовались компиляторы intel/15.0.090 и  Openmpi/1.8.4-icc.&lt;br /&gt;
&lt;br /&gt;
Для проведения расчетов и получения полноценной картины поведения алгоритма в зависимости от входных данных и числа процессоров, программа была запущена на следующих параметрах:&lt;br /&gt;
&lt;br /&gt;
* в качестве размера входной матрицы подавались значения в диапазоне [2000:30000] c шагом 2000.&lt;br /&gt;
* Число процессоров варьировалось от 1 до 256. &lt;br /&gt;
* В качестве числа, отвечающего за количество выполняемых методом итераций бралось значение 100.&lt;br /&gt;
&lt;br /&gt;
Ниже на рисунке изображен трехмерный график, показывающий зависимость времени выполнения программы от входных данных/&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lanczos_time_matrix.png|1000px|thumb|center| График зависимости времени выполнения программы от входных данных]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Также была исследована эффективность распараллеливания:&lt;br /&gt;
* Средняя эффективность выполнения алгоритма составила порядка 12%&lt;br /&gt;
* Наивысший показатель равен 43%&lt;br /&gt;
* Минимальное значение составило &amp;lt;1%&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма=== &lt;br /&gt;
=== Выводы для классов архитектур=== &lt;br /&gt;
=== Существующие реализации алгоритма===&lt;br /&gt;
&lt;br /&gt;
В настоящее время алгоритм Ланцоша поиска собственных значений квадратной симметричной матрицы включён в несколько библиотек и реализован на различных языках, среди которых такие наиболее распространенные как &#039;&#039;&#039;C&#039;&#039;&#039;, &#039;&#039;&#039;C++&#039;&#039;&#039;, &#039;&#039;&#039;FORTRAN77/90&#039;&#039;&#039;, &#039;&#039;&#039;MathLab&#039;&#039;&#039;.&lt;br /&gt;
Так, например, в языке &#039;&#039;&#039;MathLab&#039;&#039;&#039; во встроенном пакете &#039;&#039;&#039;ARPACK&#039;&#039;&#039; найти собственные значения методом Ланцоша можно при помощи вызова функции &#039;&#039;eigs()&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
На языке &#039;&#039;&#039;С&#039;&#039;&#039; существует библиотека &#039;&#039;&#039;[http://www.cs.wm.edu/~andreas/software/ PRIMME]&#039;&#039;&#039;, название которой расшифровывается как PReconditioned Iterative MultiMethod Eigensolver (итерационные методы поиска собственных значений с предусловием).&lt;br /&gt;
&lt;br /&gt;
Библиотека &#039;&#039;&#039;[http://www.nag.co.uk NAG] Numerical Library&#039;&#039;&#039; также содержит обширный набор функций, позволяющих проводить математический анализ, среди которых есть и реализация алгоритма Ланцоша. Библиотека доступна в трех пакетах: NAG C Library, NAG Fortran Library и NAG Library for .NET, совместна со многими языками и с основными операционными системами (Windows, Linux and OS X, а также Solaris, AIX и HP-UX).&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] Дж. Деммель «Вычислительная линейная алгебра», с 381.&lt;br /&gt;
&lt;br /&gt;
[2] Wikipedia https://en.wikipedia.org/wiki/Lanczos_algorithm&lt;br /&gt;
&lt;br /&gt;
[3] &amp;quot;[https://static.ph.ed.ac.uk/dissertations/hpc-msc/2013-2014/Investigation%20and%20Implementation%20of%20an%20Eigensolver%20Method.pdf Investigation and Implementation of an Eigensolver Method]&amp;quot;, Jorge Moreira, The University of Edinburgh, August 2014&lt;br /&gt;
&lt;br /&gt;
[4] &amp;quot;[http://www.physics.drexel.edu/~bob/Term_Reports/Hoppe_01.pdf Lanczos Vector Procedures]&amp;quot;, Travis Hoppe&lt;br /&gt;
&lt;br /&gt;
[5] &amp;quot;[http://pochenfullwave.ddns.net/wp-content/uploads/2015/09/61309283-Parallel-Scientific-Computing-in-C-and-MPI-2003.pdf Parallel Scientific Computing in C++ and MPI]&amp;quot;,&lt;br /&gt;
A seamless approach to parallel algorithms and their implementation,&lt;br /&gt;
George Em Karniadakis and Robert M. Kirby II,&lt;br /&gt;
Cambridge University Press&lt;/div&gt;</summary>
		<author><name>Alexbashirov</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=21192</id>
		<title>Обсуждение участника:Alexbashirov/Алгоритм Ланцоша для точной арифметики</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=21192"/>
		<updated>2016-12-18T15:31:51Z</updated>

		<summary type="html">&lt;p&gt;Alexbashirov: /* Замечания */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Замечания ===&lt;br /&gt;
* [DONE] убрать название пункта &amp;quot;1.1.1 История&amp;quot;, а сам текст оставить.&lt;br /&gt;
* [DONE] 1.2 вместо ужирнения текста &amp;quot;матрицу Крылова&amp;quot;, &amp;quot;процесс Рэлея-Ритца&amp;quot; лучше использовать наклон, т.к. ужирнение занято для заголовков&lt;br /&gt;
* [DONE] 1.5 скан алгоритма заменить на набранный текст вместо фото из книжки&lt;br /&gt;
* [DONE] 1.7 добавить словесное описание графа&lt;br /&gt;
* 1.8 &amp;quot;процесс поиска собственных значений&amp;quot; - уточнить&lt;br /&gt;
* [DONE] 1.10 &amp;quot;...векторов с 3-ух до 2-ух.&amp;quot; - лучше полностью написать словами без &amp;quot;ух&amp;quot;-ов.&lt;br /&gt;
* [DONE] 2.4 и 2.7 пока отсутствуют...&lt;/div&gt;</summary>
		<author><name>Alexbashirov</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=21190</id>
		<title>Участник:Alexbashirov/Алгоритм Ланцоша для точной арифметики</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=21190"/>
		<updated>2016-12-18T15:28:20Z</updated>

		<summary type="html">&lt;p&gt;Alexbashirov: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[Участник: Alexbashirov|Баширов А.Д.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name             = Алгоритм Ланцоша для точной арифметики&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;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;
Алгоритм Ланцоша является итерационным алгоритмом поиска собственных значений симметричной матрицы, разработанным венгерским физиком и математиком XX столетия Корнелием Ланцошем в 1950 году. Алгоритм совмещает в себе два других алгоритма: алгоритм построения подпространства Крылова (который также был создан Ланцошем) и процедуру Рэлея-Ритца приближения собственных значений матрицы. Алгоритм является вариацией степенного метода, позволяющего найти собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-го порядка. Однако в алгоритме число итераций ограничено некоторым &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;. Несмотря на заявленную вычислительную эффективность, алгоритм не получил широкого применения в своём первоначальном виде, ввиду его неустойчивости. 20 лет спустя, в 1970 году ученые Ojalvo и Newman показали доработанный алгоритм Ланцоша, который теперь стал устойчивым а также предложили способ выбора вектора начального приближения &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt;. Полученный последователями Ланцоша алгоритм получил название &amp;quot;Алгоритм Ланцоша с полной переортогонализацией&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма===&lt;br /&gt;
Алгоритм Ланцоша работает с вещественной симметричной матрицей &amp;lt;math&amp;gt;A=A^T&amp;lt;/math&amp;gt;, таким образом в памяти достаточно хранить лишь немногим более половины элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Прежде чем переходить к описанию алгоритма, следует упомянуть следующие понятия: подпространство Крылова и процесс Рэлея-Ритца, о которых уже было сказано в исторической справке выше. &lt;br /&gt;
Подпространством Крылова называется набор векторов&amp;lt;math&amp;gt;K_n =[b,Ab,A^2b,...,A^{n-1}b]&amp;lt;/math&amp;gt;. Начав свою работу с произвольного вектора &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, степенной метод вычисляет вектора &amp;lt;math&amp;gt;Ab, A^2b,...,A^{n-1}b&amp;lt;/math&amp;gt; итерационно сохраняя полученный результат в вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Полученная последовательность векторов сходится к собственному вектору, отвечающему максимальному собственному значению &amp;lt;math&amp;gt;\lambda_{max}&amp;lt;/math&amp;gt;. Однако, использование лишь последнего полученного вектора и потеря всех предшествующих посчитанных величин не всегда является наилучшим выбором. Поэтому сохранив все вектора и объединив их в одну матрицу мы получим так называемую &amp;lt;i&amp;gt;матрицу Крылова  &amp;lt;/i&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K_j = [b,Ab,A^2b,...,A^{j-1}b]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Столбцы получившейся матрицы не ортогональны, однако их можно ортогонализовать, применив процесс Грамма-Шмидта. Получившиеся вектора будут составлять базис подпространства Крылова &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt;. Можно ожидать, что вектора полученного базиса будут достаточно хорошо приближать &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; собственных векторов, отвечающих &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; наибольшим собственным значения.&lt;br /&gt;
&lt;br /&gt;
Затем с использованием полученной матрицы из ортогональных векторов &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt; мы получим трехдиагональную матрицу &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; на основе исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
Наконец, к полученной матрице &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; будет применяться &amp;lt;i&amp;gt;процесс Рэлея-Ритца&amp;lt;/i&amp;gt;, который найдет собственные значения трехдиагональной матрицы. В последствии эти значения и будут приближениями искомых собственных значений исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма Ланцоша, то есть наиболее ресурсно-затратной частью алгоритма, является шаг на котором на каждой итерации происходит перемножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;, полученный на предыдущей итерации. Полученный в результате умножения вектор обозначается &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; z=Aq_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;Q_j=[q_1,q_2,...q_j]&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортонормированных вектров Ланцоша и последующее формирование трехдиагональной матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;. Число таких векторов и, следовательно, размер матрицы растет с каждой итерацией. Итерационный процесс завершается при &amp;lt;math&amp;gt;j=k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На долю второй части алгоритма приходится поиск собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;, полученной в первой части.&lt;br /&gt;
&lt;br /&gt;
=== Схема последовательной реализации алгоритма ===&lt;br /&gt;
&amp;lt;math&amp;gt;q=b/||b||_2&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\beta_0=0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;q_0=0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; ~ {\rm for } j=1 ~ {\rm to} k&amp;lt;/math&amp;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;
&amp;lt;math&amp;gt;\alpha_j = q_j^T z&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; z = z - \alpha_jq_j -\beta_{j-1}q_{j-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \beta_j = ||z||_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; ~ {\rm if} \beta_j = 0 ~ {\rm quit}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; q_{j+1} = z/\beta_j&amp;lt;/math&amp;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;
&amp;lt;math&amp;gt; ~ {\rm end} ~ {\rm for} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выше представлен псевдокод, отражающий последовательность действий в алгоритме метода. Перечислим основные ступени в данном методе:&lt;br /&gt;
* Прежде чем войти в цикл, происходит инициализация констант &amp;lt;math&amp;gt;\Beta_0,q_0&amp;lt;/math&amp;gt;, вычисление нормы вектора начального приближения &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и нормализация этого вектора.&lt;br /&gt;
* Затем, в цикле, происходит: &lt;br /&gt;
**поиск вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, являющегося результатом применения матричного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;; &lt;br /&gt;
**скалярное произведение двух векторов &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**вычисляется линейная комбинация векторов; &lt;br /&gt;
**вычисляется норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**проверяется условие выхода из цикла (равенство нулю нормы вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;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;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Посчитаем количество операций, необходимых для поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений и векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; действий для умножения матрицы на вектор&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; действия для перемножения двух векторов&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  операций для поэлементного сложения или вычитания двух векторов&lt;br /&gt;
* для отыскания нормы вектора помимо &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  сложений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  умножений требуется 1 операция извлечения корня&lt;br /&gt;
* для поиска собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; требуется &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарно для одной итерации алгоритма требуется совершить  &amp;lt;math&amp;gt;O(n^2)+O(k^3)&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;A&amp;lt;/math&amp;gt; используются на каждом итерационном слое, поэтому обозначена как входные данные на втором и третьем слоях на схеме.&lt;br /&gt;
Те данные, которые передаются на следущий итерационный слой с предыдущего - обозначены стрелками между вторым и третьим слоями.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Информационный_граф_1.png|1000px|thumb|center| &amp;lt;math&amp;gt;||x||&amp;lt;/math&amp;gt; - операция вычисления нормы;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; - операция деления;&lt;br /&gt;
• - операция скалярного умножения векторов;&lt;br /&gt;
Ax - операция применения оператора A к вектору x;&lt;br /&gt;
F - операция вычисления линейной комбинации.&lt;br /&gt;
Желтый ромб символизирует проверку логического условия выхода из итерационного цикла (в случае если посчитанная норма равна нулю).&lt;br /&gt;
Input,Out - входные и выходные данные.]]&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;n\times n&amp;lt;/math&amp;gt; на вектор размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
В свою очередь ресурс параллелизма операции поиска собственных значений зависит от выбранного способа и не рассматривается в данной статье.&lt;br /&gt;
&lt;br /&gt;
Таким образом, с точки зрения ресурса параллелизма, алгоритм Ланцоша обладает линейной сложностью по ширине ЯПФ и квадратичной сложностью по высоте ЯПФ. Основное время работы алгоритма будет уделено операции умножения матрицы на вектор, имеющей ширину яруса &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;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;A&amp;lt;/math&amp;gt;, следовательно на вход данный алгоритм во всяком случае получает 1 число и 1 матрицу размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;. Помимо этого для начала работы алгоритму нужен некоторый вектор &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; начального приближения размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, который тоже является входными данными.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После окончания работы алгоритма мы получаем набор собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, состоящий из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; элементов. Если помимо собственных значений выводятся еще и полученные собственные векторы, то суммарный объём всех таких векторов составляет &amp;lt;math&amp;gt;k\times n&amp;lt;/math&amp;gt; элементов. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, совокупный объём входных данных составляет: &amp;lt;math&amp;gt;n^2+n+1&amp;lt;/math&amp;gt; элемент, а на выходе получаем &amp;lt;math&amp;gt;k(n+1)&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;lt;math&amp;gt;A&amp;lt;/math&amp;gt;) начиная с максимального в абсолютном смысле значения. Это выгодно отличает данный алгоритм с точки зрения поиска собственных значений матрицы, находящихся по краям её спектра.&lt;br /&gt;
&lt;br /&gt;
Не является полностью детерминированным, т.к. может досрочно завершить работу, если будут найдены все ненулевые собственные значения.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма (то есть отношение числа операций к суммарному объему входных и выходных данных) равна &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+2n+1}&amp;lt;/math&amp;gt;. Следовательно порядок мощности алгоритма примерно равен &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;, при &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В случае использования метода вычисления собственных значений с линейной сложностью, соотношение последовательной и параллельной сложностей будет равно &amp;lt;math&amp;gt;(k ^ 2 + n ^ 2) / (k  + 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;
Для компиляции программы использовались компиляторы intel/15.0.090 и  Openmpi/1.8.4-icc.&lt;br /&gt;
&lt;br /&gt;
Для проведения расчетов и получения полноценной картины поведения алгоритма в зависимости от входных данных и числа процессоров, программа была запущена на следующих параметрах:&lt;br /&gt;
&lt;br /&gt;
* в качестве размера входной матрицы подавались значения в диапазоне [2000:30000] c шагом 2000.&lt;br /&gt;
* Число процессоров варьировалось от 1 до 256. &lt;br /&gt;
* В качестве числа, отвечающего за количество выполняемых методом итераций бралось значение 100.&lt;br /&gt;
&lt;br /&gt;
Ниже на рисунке изображен трехмерный график, показывающий зависимость времени выполнения программы от входных данных/&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lanczos_time_matrix.png|1000px|thumb|center| График зависимости времени выполнения программы от входных данных]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Также была исследована эффективность распараллеливания:&lt;br /&gt;
* Средняя эффективность выполнения алгоритма составила порядка 12%&lt;br /&gt;
* Наивысший показатель равен 43%&lt;br /&gt;
* Минимальное значение составило &amp;lt;1%&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма=== &lt;br /&gt;
=== Выводы для классов архитектур=== &lt;br /&gt;
=== Существующие реализации алгоритма===&lt;br /&gt;
&lt;br /&gt;
В настоящее время алгоритм Ланцоша поиска собственных значений квадратной симметричной матрицы включён в несколько библиотек и реализован на различных языках, среди которых такие наиболее распространенные как &#039;&#039;&#039;C&#039;&#039;&#039;, &#039;&#039;&#039;C++&#039;&#039;&#039;, &#039;&#039;&#039;FORTRAN77/90&#039;&#039;&#039;, &#039;&#039;&#039;MathLab&#039;&#039;&#039;.&lt;br /&gt;
Так, например, в языке &#039;&#039;&#039;MathLab&#039;&#039;&#039; во встроенном пакете &#039;&#039;&#039;ARPACK&#039;&#039;&#039; найти собственные значения методом Ланцоша можно при помощи вызова функции &#039;&#039;eigs()&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
На языке &#039;&#039;&#039;С&#039;&#039;&#039; существует библиотека &#039;&#039;&#039;[http://www.cs.wm.edu/~andreas/software/ PRIMME]&#039;&#039;&#039;, название которой расшифровывается как PReconditioned Iterative MultiMethod Eigensolver (итерационные методы поиска собственных значений с предусловием).&lt;br /&gt;
&lt;br /&gt;
Библиотека &#039;&#039;&#039;[http://www.nag.co.uk NAG] Numerical Library&#039;&#039;&#039; также содержит обширный набор функций, позволяющих проводить математический анализ, среди которых есть и реализация алгоритма Ланцоша. Библиотека доступна в трех пакетах: NAG C Library, NAG Fortran Library и NAG Library for .NET, совместна со многими языками и с основными операционными системами (Windows, Linux and OS X, а также Solaris, AIX и HP-UX).&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] Дж. Деммель «Вычислительная линейная алгебра», с 381.&lt;br /&gt;
&lt;br /&gt;
[2] Wikipedia https://en.wikipedia.org/wiki/Lanczos_algorithm&lt;br /&gt;
&lt;br /&gt;
[3] &amp;quot;[https://static.ph.ed.ac.uk/dissertations/hpc-msc/2013-2014/Investigation%20and%20Implementation%20of%20an%20Eigensolver%20Method.pdf Investigation and Implementation of an Eigensolver Method]&amp;quot;, Jorge Moreira, The University of Edinburgh, August 2014&lt;br /&gt;
&lt;br /&gt;
[4] &amp;quot;[http://www.physics.drexel.edu/~bob/Term_Reports/Hoppe_01.pdf Lanczos Vector Procedures]&amp;quot;, Travis Hoppe&lt;br /&gt;
&lt;br /&gt;
[5] &amp;quot;[http://pochenfullwave.ddns.net/wp-content/uploads/2015/09/61309283-Parallel-Scientific-Computing-in-C-and-MPI-2003.pdf Parallel Scientific Computing in C++ and MPI]&amp;quot;,&lt;br /&gt;
A seamless approach to parallel algorithms and their implementation,&lt;br /&gt;
George Em Karniadakis and Robert M. Kirby II,&lt;br /&gt;
Cambridge University Press&lt;/div&gt;</summary>
		<author><name>Alexbashirov</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=21184</id>
		<title>Участник:Alexbashirov/Алгоритм Ланцоша для точной арифметики</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=21184"/>
		<updated>2016-12-18T15:10:50Z</updated>

		<summary type="html">&lt;p&gt;Alexbashirov: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[Участник: Alexbashirov|Баширов А.Д.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name             = Алгоритм Ланцоша для точной арифметики&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;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;
Алгоритм Ланцоша является итерационным алгоритмом поиска собственных значений симметричной матрицы, разработанным венгерским физиком и математиком XX столетия Корнелием Ланцошем в 1950 году. Алгоритм совмещает в себе два других алгоритма: алгоритм построения подпространства Крылова (который также был создан Ланцошем) и процедуру Рэлея-Ритца приближения собственных значений матрицы. Алгоритм является вариацией степенного метода, позволяющего найти собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-го порядка. Однако в алгоритме число итераций ограничено некоторым &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;. Несмотря на заявленную вычислительную эффективность, алгоритм не получил широкого применения в своём первоначальном виде, ввиду его неустойчивости. 20 лет спустя, в 1970 году ученые Ojalvo и Newman показали доработанный алгоритм Ланцоша, который теперь стал устойчивым а также предложили способ выбора вектора начального приближения &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt;. Полученный последователями Ланцоша алгоритм получил название &amp;quot;Алгоритм Ланцоша с полной переортогонализацией&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма===&lt;br /&gt;
Алгоритм Ланцоша работает с вещественной симметричной матрицей &amp;lt;math&amp;gt;A=A^T&amp;lt;/math&amp;gt;, таким образом в памяти достаточно хранить лишь немногим более половины элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Прежде чем переходить к описанию алгоритма, следует упомянуть следующие понятия: подпространство Крылова и процесс Рэлея-Ритца, о которых уже было сказано в исторической справке выше. &lt;br /&gt;
Подпространством Крылова называется набор векторов&amp;lt;math&amp;gt;K_n =[b,Ab,A^2b,...,A^{n-1}b]&amp;lt;/math&amp;gt;. Начав свою работу с произвольного вектора &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, степенной метод вычисляет вектора &amp;lt;math&amp;gt;Ab, A^2b,...,A^{n-1}b&amp;lt;/math&amp;gt; итерационно сохраняя полученный результат в вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Полученная последовательность векторов сходится к собственному вектору, отвечающему максимальному собственному значению &amp;lt;math&amp;gt;\lambda_{max}&amp;lt;/math&amp;gt;. Однако, использование лишь последнего полученного вектора и потеря всех предшествующих посчитанных величин не всегда является наилучшим выбором. Поэтому сохранив все вектора и объединив их в одну матрицу мы получим так называемую &amp;lt;i&amp;gt;матрицу Крылова  &amp;lt;/i&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K_j = [b,Ab,A^2b,...,A^{j-1}b]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Столбцы получившейся матрицы не ортогональны, однако их можно ортогонализовать, применив процесс Грамма-Шмидта. Получившиеся вектора будут составлять базис подпространства Крылова &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt;. Можно ожидать, что вектора полученного базиса будут достаточно хорошо приближать &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; собственных векторов, отвечающих &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; наибольшим собственным значения.&lt;br /&gt;
&lt;br /&gt;
Затем с использованием полученной матрицы из ортогональных векторов &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt; мы получим трехдиагональную матрицу &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; на основе исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
Наконец, к полученной матрице &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; будет применяться &amp;lt;i&amp;gt;процесс Рэлея-Ритца&amp;lt;/i&amp;gt;, который найдет собственные значения трехдиагональной матрицы. В последствии эти значения и будут приближениями искомых собственных значений исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма Ланцоша, то есть наиболее ресурсно-затратной частью алгоритма, является шаг на котором на каждой итерации происходит перемножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;, полученный на предыдущей итерации. Полученный в результате умножения вектор обозначается &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; z=Aq_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;Q_j=[q_1,q_2,...q_j]&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортонормированных вектров Ланцоша и последующее формирование трехдиагональной матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;. Число таких векторов и, следовательно, размер матрицы растет с каждой итерацией. Итерационный процесс завершается при &amp;lt;math&amp;gt;j=k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На долю второй части алгоритма приходится поиск собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;, полученной в первой части.&lt;br /&gt;
&lt;br /&gt;
=== Схема последовательной реализации алгоритма ===&lt;br /&gt;
&amp;lt;math&amp;gt;q=b/||b||_2&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\beta_0=0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;q_0=0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; ~ {\rm for } j=1 ~ {\rm to} k&amp;lt;/math&amp;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;
&amp;lt;math&amp;gt;\alpha_j = q_j^T z&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; z = z - \alpha_jq_j -\beta_{j-1}q_{j-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \beta_j = ||z||_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; ~ {\rm if} \beta_j = 0 ~ {\rm quit}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; q_{j+1} = z/\beta_j&amp;lt;/math&amp;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;
&amp;lt;math&amp;gt; ~ {\rm end} ~ {\rm for} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выше представлен псевдокод, отражающий последовательность действий в алгоритме метода. Перечислим основные ступени в данном методе:&lt;br /&gt;
* Прежде чем войти в цикл, происходит инициализация констант &amp;lt;math&amp;gt;\Beta_0,q_0&amp;lt;/math&amp;gt;, вычисление нормы вектора начального приближения &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и нормализация этого вектора.&lt;br /&gt;
* Затем, в цикле, происходит: &lt;br /&gt;
**поиск вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, являющегося результатом применения матричного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;; &lt;br /&gt;
**скалярное произведение двух векторов &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**вычисляется линейная комбинация векторов; &lt;br /&gt;
**вычисляется норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**проверяется условие выхода из цикла (равенство нулю нормы вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;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;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Посчитаем количество операций, необходимых для поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений и векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; действий для умножения матрицы на вектор&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; действия для перемножения двух векторов&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  операций для поэлементного сложения или вычитания двух векторов&lt;br /&gt;
* для отыскания нормы вектора помимо &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  сложений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  умножений требуется 1 операция извлечения корня&lt;br /&gt;
* для поиска собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; требуется &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарно для одной итерации алгоритма требуется совершить  &amp;lt;math&amp;gt;O(n^2)+O(k^3)&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;A&amp;lt;/math&amp;gt; используются на каждом итерационном слое, поэтому обозначена как входные данные на втором и третьем слоях на схеме.&lt;br /&gt;
Те данные, которые передаются на следущий итерационный слой с предыдущего - обозначены стрелками между вторым и третьим слоями.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Информационный_граф_1.png|1000px|thumb|center| &amp;lt;math&amp;gt;||x||&amp;lt;/math&amp;gt; - операция вычисления нормы;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; - операция деления;&lt;br /&gt;
• - операция скалярного умножения векторов;&lt;br /&gt;
Ax - операция применения оператора A к вектору x;&lt;br /&gt;
F - операция вычисления линейной комбинации.&lt;br /&gt;
Желтый ромб символизирует проверку логического условия выхода из итерационного цикла (в случае если посчитанная норма равна нулю).&lt;br /&gt;
Input,Out - входные и выходные данные.]]&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;n\times n&amp;lt;/math&amp;gt; на вектор размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
В свою очередь ресурс параллелизма операции поиска собственных значений зависит от выбранного способа и не рассматривается в данной статье.&lt;br /&gt;
&lt;br /&gt;
Таким образом, с точки зрения ресурса параллелизма, алгоритм Ланцоша обладает линейной сложностью по ширине ЯПФ и квадратичной сложностью по высоте ЯПФ. Основное время работы алгоритма будет уделено операции умножения матрицы на вектор, имеющей ширину яруса &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;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;A&amp;lt;/math&amp;gt;, следовательно на вход данный алгоритм во всяком случае получает 1 число и 1 матрицу размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;. Помимо этого для начала работы алгоритму нужен некоторый вектор &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; начального приближения размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, который тоже является входными данными.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После окончания работы алгоритма мы получаем набор собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, состоящий из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; элементов. Если помимо собственных значений выводятся еще и полученные собственные векторы, то суммарный объём всех таких векторов составляет &amp;lt;math&amp;gt;k\times n&amp;lt;/math&amp;gt; элементов. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, совокупный объём входных данных составляет: &amp;lt;math&amp;gt;n^2+n+1&amp;lt;/math&amp;gt; элемент, а на выходе получаем &amp;lt;math&amp;gt;k(n+1)&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;lt;math&amp;gt;A&amp;lt;/math&amp;gt;) начиная с максимального в абсолютном смысле значения. Это выгодно отличает данный алгоритм с точки зрения поиска собственных значений матрицы, находящихся по краям её спектра.&lt;br /&gt;
&lt;br /&gt;
Не является полностью детерминированным, т.к. может досрочно завершить работу, если будут найдены все ненулевые собственные значения.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма (то есть отношение числа операций к суммарному объему входных и выходных данных) равна &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+2n+1}&amp;lt;/math&amp;gt;. Следовательно порядок мощности алгоритма примерно равен &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;, при &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В случае использования метода вычисления собственных значений с линейной сложностью, соотношение последовательной и параллельной сложностей будет равно &amp;lt;math&amp;gt;(k ^ 2 + n ^ 2) / (k  + 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;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
[[Файл:Lanczos_time_matrix.png|1000px|thumb|center| ]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма=== &lt;br /&gt;
=== Выводы для классов архитектур=== &lt;br /&gt;
=== Существующие реализации алгоритма===&lt;br /&gt;
&lt;br /&gt;
В настоящее время алгоритм Ланцоша поиска собственных значений квадратной симметричной матрицы включён в несколько библиотек и реализован на различных языках, среди которых такие наиболее распространенные как &#039;&#039;&#039;C&#039;&#039;&#039;, &#039;&#039;&#039;C++&#039;&#039;&#039;, &#039;&#039;&#039;FORTRAN77/90&#039;&#039;&#039;, &#039;&#039;&#039;MathLab&#039;&#039;&#039;.&lt;br /&gt;
Так, например, в языке &#039;&#039;&#039;MathLab&#039;&#039;&#039; во встроенном пакете &#039;&#039;&#039;ARPACK&#039;&#039;&#039; найти собственные значения методом Ланцоша можно при помощи вызова функции &#039;&#039;eigs()&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
На языке &#039;&#039;&#039;С&#039;&#039;&#039; существует библиотека &#039;&#039;&#039;[http://www.cs.wm.edu/~andreas/software/ PRIMME]&#039;&#039;&#039;, название которой расшифровывается как PReconditioned Iterative MultiMethod Eigensolver (итерационные методы поиска собственных значений с предусловием).&lt;br /&gt;
&lt;br /&gt;
Библиотека &#039;&#039;&#039;[http://www.nag.co.uk NAG] Numerical Library&#039;&#039;&#039; также содержит обширный набор функций, позволяющих проводить математический анализ, среди которых есть и реализация алгоритма Ланцоша. Библиотека доступна в трех пакетах: NAG C Library, NAG Fortran Library и NAG Library for .NET, совместна со многими языками и с основными операционными системами (Windows, Linux and OS X, а также Solaris, AIX и HP-UX).&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] Дж. Деммель «Вычислительная линейная алгебра», с 381.&lt;br /&gt;
&lt;br /&gt;
[2] Wikipedia https://en.wikipedia.org/wiki/Lanczos_algorithm&lt;br /&gt;
&lt;br /&gt;
[3] &amp;quot;[https://static.ph.ed.ac.uk/dissertations/hpc-msc/2013-2014/Investigation%20and%20Implementation%20of%20an%20Eigensolver%20Method.pdf Investigation and Implementation of an Eigensolver Method]&amp;quot;, Jorge Moreira, The University of Edinburgh, August 2014&lt;br /&gt;
&lt;br /&gt;
[4] &amp;quot;[http://www.physics.drexel.edu/~bob/Term_Reports/Hoppe_01.pdf Lanczos Vector Procedures]&amp;quot;, Travis Hoppe&lt;br /&gt;
&lt;br /&gt;
[5] &amp;quot;[http://pochenfullwave.ddns.net/wp-content/uploads/2015/09/61309283-Parallel-Scientific-Computing-in-C-and-MPI-2003.pdf Parallel Scientific Computing in C++ and MPI]&amp;quot;,&lt;br /&gt;
A seamless approach to parallel algorithms and their implementation,&lt;br /&gt;
George Em Karniadakis and Robert M. Kirby II,&lt;br /&gt;
Cambridge University Press&lt;/div&gt;</summary>
		<author><name>Alexbashirov</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=21154</id>
		<title>Участник:Alexbashirov/Алгоритм Ланцоша для точной арифметики</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=21154"/>
		<updated>2016-12-17T20:18:58Z</updated>

		<summary type="html">&lt;p&gt;Alexbashirov: /* Схема последовательной реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[Участник: Alexbashirov|Баширов А.Д.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name             = Алгоритм Ланцоша для точной арифметики&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;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;
Алгоритм Ланцоша является итерационным алгоритмом поиска собственных значений симметричной матрицы, разработанным венгерским физиком и математиком XX столетия Корнелием Ланцошем в 1950 году. Алгоритм совмещает в себе два других алгоритма: алгоритм построения подпространства Крылова (который также был создан Ланцошем) и процедуру Рэлея-Ритца приближения собственных значений матрицы. Алгоритм является вариацией степенного метода, позволяющего найти собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-го порядка. Однако в алгоритме число итераций ограничено некоторым &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;. Несмотря на заявленную вычислительную эффективность, алгоритм не получил широкого применения в своём первоначальном виде, ввиду его неустойчивости. 20 лет спустя, в 1970 году ученые Ojalvo и Newman показали доработанный алгоритм Ланцоша, который теперь стал устойчивым а также предложили способ выбора вектора начального приближения &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt;. Полученный последователями Ланцоша алгоритм получил название &amp;quot;Алгоритм Ланцоша с полной переортогонализацией&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма===&lt;br /&gt;
Алгоритм Ланцоша работает с вещественной симметричной матрицей &amp;lt;math&amp;gt;A=A^T&amp;lt;/math&amp;gt;, таким образом в памяти достаточно хранить лишь немногим более половины элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Прежде чем переходить к описанию алгоритма, следует упомянуть следующие понятия: подпространство Крылова и процесс Рэлея-Ритца, о которых уже было сказано в исторической справке выше. &lt;br /&gt;
Подпространством Крылова называется набор векторов&amp;lt;math&amp;gt;K_n =[b,Ab,A^2b,...,A^{n-1}b]&amp;lt;/math&amp;gt;. Начав свою работу с произвольного вектора &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, степенной метод вычисляет вектора &amp;lt;math&amp;gt;Ab, A^2b,...,A^{n-1}b&amp;lt;/math&amp;gt; итерационно сохраняя полученный результат в вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Полученная последовательность векторов сходится к собственному вектору, отвечающему максимальному собственному значению &amp;lt;math&amp;gt;\lambda_{max}&amp;lt;/math&amp;gt;. Однако, использование лишь последнего полученного вектора и потеря всех предшествующих посчитанных величин не всегда является наилучшим выбором. Поэтому сохранив все вектора и объединив их в одну матрицу мы получим так называемую &amp;lt;i&amp;gt;матрицу Крылова  &amp;lt;/i&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K_j = [b,Ab,A^2b,...,A^{j-1}b]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Столбцы получившейся матрицы не ортогональны, однако их можно ортогонализовать, применив процесс Грамма-Шмидта. Получившиеся вектора будут составлять базис подпространства Крылова &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt;. Можно ожидать, что вектора полученного базиса будут достаточно хорошо приближать &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; собственных векторов, отвечающих &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; наибольшим собственным значения.&lt;br /&gt;
&lt;br /&gt;
Затем с использованием полученной матрицы из ортогональных векторов &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt; мы получим трехдиагональную матрицу &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; на основе исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
Наконец, к полученной матрице &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; будет применяться &amp;lt;i&amp;gt;процесс Рэлея-Ритца&amp;lt;/i&amp;gt;, который найдет собственные значения трехдиагональной матрицы. В последствии эти значения и будут приближениями искомых собственных значений исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма Ланцоша, то есть наиболее ресурсно-затратной частью алгоритма, является шаг на котором на каждой итерации происходит перемножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;, полученный на предыдущей итерации. Полученный в результате умножения вектор обозначается &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; z=Aq_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;Q_j=[q_1,q_2,...q_j]&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортонормированных вектров Ланцоша и последующее формирование трехдиагональной матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;. Число таких векторов и, следовательно, размер матрицы растет с каждой итерацией. Итерационный процесс завершается при &amp;lt;math&amp;gt;j=k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На долю второй части алгоритма приходится поиск собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;, полученной в первой части.&lt;br /&gt;
&lt;br /&gt;
=== Схема последовательной реализации алгоритма ===&lt;br /&gt;
&amp;lt;math&amp;gt;q=b/||b||_2&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\beta_0=0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;q_0=0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; ~ {\rm for } j=1 ~ {\rm to} k&amp;lt;/math&amp;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;
&amp;lt;math&amp;gt;\alpha_j = q_j^T z&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; z = z - \alpha_jq_j -\beta_{j-1}q_{j-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \beta_j = ||z||_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; ~ {\rm if} \beta_j = 0 ~ {\rm quit}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; q_{j+1} = z/\beta_j&amp;lt;/math&amp;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;
&amp;lt;math&amp;gt; ~ {\rm end} ~ {\rm for} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выше представлен псевдокод, отражающий последовательность действий в алгоритме метода. Перечислим основные ступени в данном методе:&lt;br /&gt;
* Прежде чем войти в цикл, происходит инициализация констант &amp;lt;math&amp;gt;\Beta_0,q_0&amp;lt;/math&amp;gt;, вычисление нормы вектора начального приближения &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и нормализация этого вектора.&lt;br /&gt;
* Затем, в цикле, происходит: &lt;br /&gt;
**поиск вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, являющегося результатом применения матричного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;; &lt;br /&gt;
**скалярное произведение двух векторов &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**вычисляется линейная комбинация векторов; &lt;br /&gt;
**вычисляется норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**проверяется условие выхода из цикла (равенство нулю нормы вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;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;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Посчитаем количество операций, необходимых для поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений и векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; действий для умножения матрицы на вектор&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; действия для перемножения двух векторов&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  операций для поэлементного сложения или вычитания двух векторов&lt;br /&gt;
* для отыскания нормы вектора помимо &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  сложений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  умножений требуется 1 операция извлечения корня&lt;br /&gt;
* для поиска собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; требуется &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарно для одной итерации алгоритма требуется совершить  &amp;lt;math&amp;gt;O(n^2)+O(k^3)&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;A&amp;lt;/math&amp;gt; используются на каждом итерационном слое, поэтому обозначена как входные данные на втором и третьем слоях на схеме.&lt;br /&gt;
Те данные, которые передаются на следущий итерационный слой с предыдущего - обозначены стрелками между вторым и третьим слоями.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Информационный_граф_1.png|1000px|thumb|center| &amp;lt;math&amp;gt;||x||&amp;lt;/math&amp;gt; - операция вычисления нормы;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; - операция деления;&lt;br /&gt;
• - операция скалярного умножения векторов;&lt;br /&gt;
Ax - операция применения оператора A к вектору x;&lt;br /&gt;
F - операция вычисления линейной комбинации.&lt;br /&gt;
Желтый ромб символизирует проверку логического условия выхода из итерационного цикла (в случае если посчитанная норма равна нулю).&lt;br /&gt;
Input,Out - входные и выходные данные.]]&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;n\times n&amp;lt;/math&amp;gt; на вектор размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
В свою очередь ресурс параллелизма операции поиска собственных значений зависит от выбранного способа и не рассматривается в данной статье.&lt;br /&gt;
&lt;br /&gt;
Таким образом, с точки зрения ресурса параллелизма, алгоритм Ланцоша обладает линейной сложностью по ширине ЯПФ и квадратичной сложностью по высоте ЯПФ. Основное время работы алгоритма будет уделено операции умножения матрицы на вектор, имеющей ширину яруса &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;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;A&amp;lt;/math&amp;gt;, следовательно на вход данный алгоритм во всяком случае получает 1 число и 1 матрицу размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;. Помимо этого для начала работы алгоритму нужен некоторый вектор &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; начального приближения размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, который тоже является входными данными.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После окончания работы алгоритма мы получаем набор собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, состоящий из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; элементов. Если помимо собственных значений выводятся еще и полученные собственные векторы, то суммарный объём всех таких векторов составляет &amp;lt;math&amp;gt;k\times n&amp;lt;/math&amp;gt; элементов. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, совокупный объём входных данных составляет: &amp;lt;math&amp;gt;n^2+n+1&amp;lt;/math&amp;gt; элемент, а на выходе получаем &amp;lt;math&amp;gt;k(n+1)&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;lt;math&amp;gt;A&amp;lt;/math&amp;gt;) начиная с максимального в абсолютном смысле значения. Это выгодно отличает данный алгоритм с точки зрения поиска собственных значений матрицы, находящихся по краям её спектра.&lt;br /&gt;
&lt;br /&gt;
Не является полностью детерминированным, т.к. может досрочно завершить работу, если будут найдены все ненулевые собственные значения.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма (то есть отношение числа операций к суммарному объему входных и выходных данных) равна &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+2n+1}&amp;lt;/math&amp;gt;. Следовательно порядок мощности алгоритма примерно равен &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;, при &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В случае использования метода вычисления собственных значений с линейной сложностью, соотношение последовательной и параллельной сложностей будет равно &amp;lt;math&amp;gt;(k ^ 2 + n ^ 2) / (k  + 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;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма=== &lt;br /&gt;
=== Выводы для классов архитектур=== &lt;br /&gt;
=== Существующие реализации алгоритма===&lt;br /&gt;
&lt;br /&gt;
В настоящее время алгоритм Ланцоша поиска собственных значений квадратной симметричной матрицы включён в несколько библиотек и реализован на различных языках, среди которых такие наиболее распространенные как &#039;&#039;&#039;C&#039;&#039;&#039;, &#039;&#039;&#039;C++&#039;&#039;&#039;, &#039;&#039;&#039;FORTRAN77/90&#039;&#039;&#039;, &#039;&#039;&#039;MathLab&#039;&#039;&#039;.&lt;br /&gt;
Так, например, в языке &#039;&#039;&#039;MathLab&#039;&#039;&#039; во встроенном пакете &#039;&#039;&#039;ARPACK&#039;&#039;&#039; найти собственные значения методом Ланцоша можно при помощи вызова функции &#039;&#039;eigs()&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
На языке &#039;&#039;&#039;С&#039;&#039;&#039; существует библиотека &#039;&#039;&#039;[http://www.cs.wm.edu/~andreas/software/ PRIMME]&#039;&#039;&#039;, название которой расшифровывается как PReconditioned Iterative MultiMethod Eigensolver (итерационные методы поиска собственных значений с предусловием).&lt;br /&gt;
&lt;br /&gt;
Библиотека &#039;&#039;&#039;[http://www.nag.co.uk NAG] Numerical Library&#039;&#039;&#039; также содержит обширный набор функций, позволяющих проводить математический анализ, среди которых есть и реализация алгоритма Ланцоша. Библиотека доступна в трех пакетах: NAG C Library, NAG Fortran Library и NAG Library for .NET, совместна со многими языками и с основными операционными системами (Windows, Linux and OS X, а также Solaris, AIX и HP-UX).&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] Дж. Деммель «Вычислительная линейная алгебра», с 381.&lt;br /&gt;
&lt;br /&gt;
[2] Wikipedia https://en.wikipedia.org/wiki/Lanczos_algorithm&lt;br /&gt;
&lt;br /&gt;
[3] &amp;quot;[https://static.ph.ed.ac.uk/dissertations/hpc-msc/2013-2014/Investigation%20and%20Implementation%20of%20an%20Eigensolver%20Method.pdf Investigation and Implementation of an Eigensolver Method]&amp;quot;, Jorge Moreira, The University of Edinburgh, August 2014&lt;br /&gt;
&lt;br /&gt;
[4] &amp;quot;[http://www.physics.drexel.edu/~bob/Term_Reports/Hoppe_01.pdf Lanczos Vector Procedures]&amp;quot;, Travis Hoppe&lt;br /&gt;
&lt;br /&gt;
[5] &amp;quot;[http://pochenfullwave.ddns.net/wp-content/uploads/2015/09/61309283-Parallel-Scientific-Computing-in-C-and-MPI-2003.pdf Parallel Scientific Computing in C++ and MPI]&amp;quot;,&lt;br /&gt;
A seamless approach to parallel algorithms and their implementation,&lt;br /&gt;
George Em Karniadakis and Robert M. Kirby II,&lt;br /&gt;
Cambridge University Press&lt;/div&gt;</summary>
		<author><name>Alexbashirov</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=21153</id>
		<title>Участник:Alexbashirov/Алгоритм Ланцоша для точной арифметики</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=21153"/>
		<updated>2016-12-17T20:18:29Z</updated>

		<summary type="html">&lt;p&gt;Alexbashirov: /* Схема последовательной реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[Участник: Alexbashirov|Баширов А.Д.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name             = Алгоритм Ланцоша для точной арифметики&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;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;
Алгоритм Ланцоша является итерационным алгоритмом поиска собственных значений симметричной матрицы, разработанным венгерским физиком и математиком XX столетия Корнелием Ланцошем в 1950 году. Алгоритм совмещает в себе два других алгоритма: алгоритм построения подпространства Крылова (который также был создан Ланцошем) и процедуру Рэлея-Ритца приближения собственных значений матрицы. Алгоритм является вариацией степенного метода, позволяющего найти собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-го порядка. Однако в алгоритме число итераций ограничено некоторым &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;. Несмотря на заявленную вычислительную эффективность, алгоритм не получил широкого применения в своём первоначальном виде, ввиду его неустойчивости. 20 лет спустя, в 1970 году ученые Ojalvo и Newman показали доработанный алгоритм Ланцоша, который теперь стал устойчивым а также предложили способ выбора вектора начального приближения &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt;. Полученный последователями Ланцоша алгоритм получил название &amp;quot;Алгоритм Ланцоша с полной переортогонализацией&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма===&lt;br /&gt;
Алгоритм Ланцоша работает с вещественной симметричной матрицей &amp;lt;math&amp;gt;A=A^T&amp;lt;/math&amp;gt;, таким образом в памяти достаточно хранить лишь немногим более половины элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Прежде чем переходить к описанию алгоритма, следует упомянуть следующие понятия: подпространство Крылова и процесс Рэлея-Ритца, о которых уже было сказано в исторической справке выше. &lt;br /&gt;
Подпространством Крылова называется набор векторов&amp;lt;math&amp;gt;K_n =[b,Ab,A^2b,...,A^{n-1}b]&amp;lt;/math&amp;gt;. Начав свою работу с произвольного вектора &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, степенной метод вычисляет вектора &amp;lt;math&amp;gt;Ab, A^2b,...,A^{n-1}b&amp;lt;/math&amp;gt; итерационно сохраняя полученный результат в вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Полученная последовательность векторов сходится к собственному вектору, отвечающему максимальному собственному значению &amp;lt;math&amp;gt;\lambda_{max}&amp;lt;/math&amp;gt;. Однако, использование лишь последнего полученного вектора и потеря всех предшествующих посчитанных величин не всегда является наилучшим выбором. Поэтому сохранив все вектора и объединив их в одну матрицу мы получим так называемую &amp;lt;i&amp;gt;матрицу Крылова  &amp;lt;/i&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K_j = [b,Ab,A^2b,...,A^{j-1}b]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Столбцы получившейся матрицы не ортогональны, однако их можно ортогонализовать, применив процесс Грамма-Шмидта. Получившиеся вектора будут составлять базис подпространства Крылова &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt;. Можно ожидать, что вектора полученного базиса будут достаточно хорошо приближать &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; собственных векторов, отвечающих &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; наибольшим собственным значения.&lt;br /&gt;
&lt;br /&gt;
Затем с использованием полученной матрицы из ортогональных векторов &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt; мы получим трехдиагональную матрицу &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; на основе исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
Наконец, к полученной матрице &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; будет применяться &amp;lt;i&amp;gt;процесс Рэлея-Ритца&amp;lt;/i&amp;gt;, который найдет собственные значения трехдиагональной матрицы. В последствии эти значения и будут приближениями искомых собственных значений исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма Ланцоша, то есть наиболее ресурсно-затратной частью алгоритма, является шаг на котором на каждой итерации происходит перемножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;, полученный на предыдущей итерации. Полученный в результате умножения вектор обозначается &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; z=Aq_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;Q_j=[q_1,q_2,...q_j]&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортонормированных вектров Ланцоша и последующее формирование трехдиагональной матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;. Число таких векторов и, следовательно, размер матрицы растет с каждой итерацией. Итерационный процесс завершается при &amp;lt;math&amp;gt;j=k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На долю второй части алгоритма приходится поиск собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;, полученной в первой части.&lt;br /&gt;
&lt;br /&gt;
=== Схема последовательной реализации алгоритма ===&lt;br /&gt;
&amp;lt;math&amp;gt;q=b/||b||_2&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\beta_0=0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;q_0=0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; ~ {\rm for} j=1 ~ {\rm to} k&amp;lt;/math&amp;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;
&amp;lt;math&amp;gt;\alpha_j = q_j^T z&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; z = z - \alpha_jq_j -\beta_{j-1}q_{j-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \beta_j = ||z||_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; ~ {\rm if} \beta_j = 0 ~ {\rm quit}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; q_{j+1} = z/\beta_j&amp;lt;/math&amp;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;
&amp;lt;math&amp;gt; ~ {\rm end for} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выше представлен псевдокод, отражающий последовательность действий в алгоритме метода. Перечислим основные ступени в данном методе:&lt;br /&gt;
* Прежде чем войти в цикл, происходит инициализация констант &amp;lt;math&amp;gt;\Beta_0,q_0&amp;lt;/math&amp;gt;, вычисление нормы вектора начального приближения &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и нормализация этого вектора.&lt;br /&gt;
* Затем, в цикле, происходит: &lt;br /&gt;
**поиск вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, являющегося результатом применения матричного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;; &lt;br /&gt;
**скалярное произведение двух векторов &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**вычисляется линейная комбинация векторов; &lt;br /&gt;
**вычисляется норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**проверяется условие выхода из цикла (равенство нулю нормы вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;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;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Посчитаем количество операций, необходимых для поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений и векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; действий для умножения матрицы на вектор&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; действия для перемножения двух векторов&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  операций для поэлементного сложения или вычитания двух векторов&lt;br /&gt;
* для отыскания нормы вектора помимо &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  сложений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  умножений требуется 1 операция извлечения корня&lt;br /&gt;
* для поиска собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; требуется &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарно для одной итерации алгоритма требуется совершить  &amp;lt;math&amp;gt;O(n^2)+O(k^3)&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;A&amp;lt;/math&amp;gt; используются на каждом итерационном слое, поэтому обозначена как входные данные на втором и третьем слоях на схеме.&lt;br /&gt;
Те данные, которые передаются на следущий итерационный слой с предыдущего - обозначены стрелками между вторым и третьим слоями.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Информационный_граф_1.png|1000px|thumb|center| &amp;lt;math&amp;gt;||x||&amp;lt;/math&amp;gt; - операция вычисления нормы;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; - операция деления;&lt;br /&gt;
• - операция скалярного умножения векторов;&lt;br /&gt;
Ax - операция применения оператора A к вектору x;&lt;br /&gt;
F - операция вычисления линейной комбинации.&lt;br /&gt;
Желтый ромб символизирует проверку логического условия выхода из итерационного цикла (в случае если посчитанная норма равна нулю).&lt;br /&gt;
Input,Out - входные и выходные данные.]]&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;n\times n&amp;lt;/math&amp;gt; на вектор размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
В свою очередь ресурс параллелизма операции поиска собственных значений зависит от выбранного способа и не рассматривается в данной статье.&lt;br /&gt;
&lt;br /&gt;
Таким образом, с точки зрения ресурса параллелизма, алгоритм Ланцоша обладает линейной сложностью по ширине ЯПФ и квадратичной сложностью по высоте ЯПФ. Основное время работы алгоритма будет уделено операции умножения матрицы на вектор, имеющей ширину яруса &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;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;A&amp;lt;/math&amp;gt;, следовательно на вход данный алгоритм во всяком случае получает 1 число и 1 матрицу размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;. Помимо этого для начала работы алгоритму нужен некоторый вектор &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; начального приближения размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, который тоже является входными данными.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После окончания работы алгоритма мы получаем набор собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, состоящий из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; элементов. Если помимо собственных значений выводятся еще и полученные собственные векторы, то суммарный объём всех таких векторов составляет &amp;lt;math&amp;gt;k\times n&amp;lt;/math&amp;gt; элементов. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, совокупный объём входных данных составляет: &amp;lt;math&amp;gt;n^2+n+1&amp;lt;/math&amp;gt; элемент, а на выходе получаем &amp;lt;math&amp;gt;k(n+1)&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;lt;math&amp;gt;A&amp;lt;/math&amp;gt;) начиная с максимального в абсолютном смысле значения. Это выгодно отличает данный алгоритм с точки зрения поиска собственных значений матрицы, находящихся по краям её спектра.&lt;br /&gt;
&lt;br /&gt;
Не является полностью детерминированным, т.к. может досрочно завершить работу, если будут найдены все ненулевые собственные значения.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма (то есть отношение числа операций к суммарному объему входных и выходных данных) равна &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+2n+1}&amp;lt;/math&amp;gt;. Следовательно порядок мощности алгоритма примерно равен &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;, при &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В случае использования метода вычисления собственных значений с линейной сложностью, соотношение последовательной и параллельной сложностей будет равно &amp;lt;math&amp;gt;(k ^ 2 + n ^ 2) / (k  + 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;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма=== &lt;br /&gt;
=== Выводы для классов архитектур=== &lt;br /&gt;
=== Существующие реализации алгоритма===&lt;br /&gt;
&lt;br /&gt;
В настоящее время алгоритм Ланцоша поиска собственных значений квадратной симметричной матрицы включён в несколько библиотек и реализован на различных языках, среди которых такие наиболее распространенные как &#039;&#039;&#039;C&#039;&#039;&#039;, &#039;&#039;&#039;C++&#039;&#039;&#039;, &#039;&#039;&#039;FORTRAN77/90&#039;&#039;&#039;, &#039;&#039;&#039;MathLab&#039;&#039;&#039;.&lt;br /&gt;
Так, например, в языке &#039;&#039;&#039;MathLab&#039;&#039;&#039; во встроенном пакете &#039;&#039;&#039;ARPACK&#039;&#039;&#039; найти собственные значения методом Ланцоша можно при помощи вызова функции &#039;&#039;eigs()&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
На языке &#039;&#039;&#039;С&#039;&#039;&#039; существует библиотека &#039;&#039;&#039;[http://www.cs.wm.edu/~andreas/software/ PRIMME]&#039;&#039;&#039;, название которой расшифровывается как PReconditioned Iterative MultiMethod Eigensolver (итерационные методы поиска собственных значений с предусловием).&lt;br /&gt;
&lt;br /&gt;
Библиотека &#039;&#039;&#039;[http://www.nag.co.uk NAG] Numerical Library&#039;&#039;&#039; также содержит обширный набор функций, позволяющих проводить математический анализ, среди которых есть и реализация алгоритма Ланцоша. Библиотека доступна в трех пакетах: NAG C Library, NAG Fortran Library и NAG Library for .NET, совместна со многими языками и с основными операционными системами (Windows, Linux and OS X, а также Solaris, AIX и HP-UX).&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] Дж. Деммель «Вычислительная линейная алгебра», с 381.&lt;br /&gt;
&lt;br /&gt;
[2] Wikipedia https://en.wikipedia.org/wiki/Lanczos_algorithm&lt;br /&gt;
&lt;br /&gt;
[3] &amp;quot;[https://static.ph.ed.ac.uk/dissertations/hpc-msc/2013-2014/Investigation%20and%20Implementation%20of%20an%20Eigensolver%20Method.pdf Investigation and Implementation of an Eigensolver Method]&amp;quot;, Jorge Moreira, The University of Edinburgh, August 2014&lt;br /&gt;
&lt;br /&gt;
[4] &amp;quot;[http://www.physics.drexel.edu/~bob/Term_Reports/Hoppe_01.pdf Lanczos Vector Procedures]&amp;quot;, Travis Hoppe&lt;br /&gt;
&lt;br /&gt;
[5] &amp;quot;[http://pochenfullwave.ddns.net/wp-content/uploads/2015/09/61309283-Parallel-Scientific-Computing-in-C-and-MPI-2003.pdf Parallel Scientific Computing in C++ and MPI]&amp;quot;,&lt;br /&gt;
A seamless approach to parallel algorithms and their implementation,&lt;br /&gt;
George Em Karniadakis and Robert M. Kirby II,&lt;br /&gt;
Cambridge University Press&lt;/div&gt;</summary>
		<author><name>Alexbashirov</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=20001</id>
		<title>Обсуждение участника:Alexbashirov/Алгоритм Ланцоша для точной арифметики</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=20001"/>
		<updated>2016-12-03T20:58:24Z</updated>

		<summary type="html">&lt;p&gt;Alexbashirov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Замечания ===&lt;br /&gt;
* [DONE] убрать название пункта &amp;quot;1.1.1 История&amp;quot;, а сам текст оставить.&lt;br /&gt;
* [DONE] 1.2 вместо ужирнения текста &amp;quot;матрицу Крылова&amp;quot;, &amp;quot;процесс Рэлея-Ритца&amp;quot; лучше использовать наклон, т.к. ужирнение занято для заголовков&lt;br /&gt;
* [DONE] 1.5 скан алгоритма заменить на набранный текст вместо фото из книжки&lt;br /&gt;
* [DONE] 1.7 добавить словесное описание графа&lt;br /&gt;
* 1.8 &amp;quot;процесс поиска собственных значений&amp;quot; - уточнить&lt;br /&gt;
* [DONE] 1.10 &amp;quot;...векторов с 3-ух до 2-ух.&amp;quot; - лучше полностью написать словами без &amp;quot;ух&amp;quot;-ов.&lt;br /&gt;
* 2.1-2.6 отсутствуют...&lt;/div&gt;</summary>
		<author><name>Alexbashirov</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=20000</id>
		<title>Участник:Alexbashirov/Алгоритм Ланцоша для точной арифметики</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=20000"/>
		<updated>2016-12-03T20:57:53Z</updated>

		<summary type="html">&lt;p&gt;Alexbashirov: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[Участник: Alexbashirov|Баширов А.Д.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name             = Алгоритм Ланцоша для точной арифметики&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;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;
Алгоритм Ланцоша является итерационным алгоритмом поиска собственных значений симметричной матрицы, разработанным венгерским физиком и математиком XX столетия Корнелием Ланцошем в 1950 году. Алгоритм совмещает в себе два других алгоритма: алгоритм построения подпространства Крылова (который также был создан Ланцошем) и процедуру Рэлея-Ритца приближения собственных значений матрицы. Алгоритм является вариацией степенного метода, позволяющего найти собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-го порядка. Однако в алгоритме число итераций ограничено некоторым &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;. Несмотря на заявленную вычислительную эффективность, алгоритм не получил широкого применения в своём первоначальном виде, ввиду его неустойчивости. 20 лет спустя, в 1970 году ученые Ojalvo и Newman показали доработанный алгоритм Ланцоша, который теперь стал устойчивым а также предложили способ выбора вектора начального приближения &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt;. Полученный последователями Ланцоша алгоритм получил название &amp;quot;Алгоритм Ланцоша с полной переортогонализацией&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма===&lt;br /&gt;
Алгоритм Ланцоша работает с вещественной симметричной матрицей &amp;lt;math&amp;gt;A=A^T&amp;lt;/math&amp;gt;, таким образом в памяти достаточно хранить лишь немногим более половины элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Прежде чем переходить к описанию алгоритма, следует упомянуть следующие понятия: подпространство Крылова и процесс Рэлея-Ритца, о которых уже было сказано в исторической справке выше. &lt;br /&gt;
Подпространством Крылова называется набор векторов&amp;lt;math&amp;gt;K_n =[b,Ab,A^2b,...,A^{n-1}b]&amp;lt;/math&amp;gt;. Начав свою работу с произвольного вектора &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, степенной метод вычисляет вектора &amp;lt;math&amp;gt;Ab, A^2b,...,A^{n-1}b&amp;lt;/math&amp;gt; итерационно сохраняя полученный результат в вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Полученная последовательность векторов сходится к собственному вектору, отвечающему максимальному собственному значению &amp;lt;math&amp;gt;\lambda_{max}&amp;lt;/math&amp;gt;. Однако, использование лишь последнего полученного вектора и потеря всех предшествующих посчитанных величин не всегда является наилучшим выбором. Поэтому сохранив все вектора и объединив их в одну матрицу мы получим так называемую &amp;lt;i&amp;gt;матрицу Крылова  &amp;lt;/i&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K_j = [b,Ab,A^2b,...,A^{j-1}b]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Столбцы получившейся матрицы не ортогональны, однако их можно ортогонализовать, применив процесс Грамма-Шмидта. Получившиеся вектора будут составлять базис подпространства Крылова &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt;. Можно ожидать, что вектора полученного базиса будут достаточно хорошо приближать &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; собственных векторов, отвечающих &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; наибольшим собственным значения.&lt;br /&gt;
&lt;br /&gt;
Затем с использованием полученной матрицы из ортогональных векторов &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt; мы получим трехдиагональную матрицу &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; на основе исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
Наконец, к полученной матрице &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; будет применяться &amp;lt;i&amp;gt;процесс Рэлея-Ритца&amp;lt;/i&amp;gt;, который найдет собственные значения трехдиагональной матрицы. В последствии эти значения и будут приближениями искомых собственных значений исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма Ланцоша, то есть наиболее ресурсно-затратной частью алгоритма, является шаг на котором на каждой итерации происходит перемножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;, полученный на предыдущей итерации. Полученный в результате умножения вектор обозначается &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; z=Aq_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;Q_j=[q_1,q_2,...q_j]&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортонормированных вектров Ланцоша и последующее формирование трехдиагональной матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;. Число таких векторов и, следовательно, размер матрицы растет с каждой итерацией. Итерационный процесс завершается при &amp;lt;math&amp;gt;j=k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На долю второй части алгоритма приходится поиск собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;, полученной в первой части.&lt;br /&gt;
&lt;br /&gt;
=== Схема последовательной реализации алгоритма ===&lt;br /&gt;
&amp;lt;math&amp;gt;q=b/||b||_2&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\beta_0=0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;q_0=0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; for j=1 to k&amp;lt;/math&amp;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;
&amp;lt;math&amp;gt;\alpha_j = q_j^T z&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; z = z - \alpha_jq_j -\beta_{j-1}q_{j-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \beta_j = ||z||_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; if \beta_j = 0 quit&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; q_{j+1} = z/\beta_j&amp;lt;/math&amp;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;
&amp;lt;math&amp;gt; end for &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выше представлен псевдокод, отражающий последовательность действий в алгоритме метода. Перечислим основные ступени в данном методе:&lt;br /&gt;
* Прежде чем войти в цикл, происходит инициализация констант &amp;lt;math&amp;gt;\Beta_0,q_0&amp;lt;/math&amp;gt;, вычисление нормы вектора начального приближения &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и нормализация этого вектора.&lt;br /&gt;
* Затем, в цикле, происходит: &lt;br /&gt;
**поиск вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, являющегося результатом применения матричного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;; &lt;br /&gt;
**скалярное произведение двух векторов &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**вычисляется линейная комбинация векторов; &lt;br /&gt;
**вычисляется норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**проверяется условие выхода из цикла (равенство нулю нормы вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;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;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Посчитаем количество операций, необходимых для поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений и векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; действий для умножения матрицы на вектор&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; действия для перемножения двух векторов&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  операций для поэлементного сложения или вычитания двух векторов&lt;br /&gt;
* для отыскания нормы вектора помимо &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  сложений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  умножений требуется 1 операция извлечения корня&lt;br /&gt;
* для поиска собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; требуется &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарно для одной итерации алгоритма требуется совершить  &amp;lt;math&amp;gt;O(n^2)+O(k^3)&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;A&amp;lt;/math&amp;gt; используются на каждом итерационном слое, поэтому обозначена как входные данные на втором и третьем слоях на схеме.&lt;br /&gt;
Те данные, которые передаются на следущий итерационный слой с предыдущего - обозначены стрелками между вторым и третьим слоями.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Информационный_граф_1.png|1000px|thumb|center| &amp;lt;math&amp;gt;||x||&amp;lt;/math&amp;gt; - операция вычисления нормы;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; - операция деления;&lt;br /&gt;
• - операция скалярного умножения векторов;&lt;br /&gt;
Ax - операция применения оператора A к вектору x;&lt;br /&gt;
F - операция вычисления линейной комбинации.&lt;br /&gt;
Желтый ромб символизирует проверку логического условия выхода из итерационного цикла (в случае если посчитанная норма равна нулю).&lt;br /&gt;
Input,Out - входные и выходные данные.]]&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;n\times n&amp;lt;/math&amp;gt; на вектор размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
В свою очередь ресурс параллелизма операции поиска собственных значений зависит от выбранного способа и не рассматривается в данной статье.&lt;br /&gt;
&lt;br /&gt;
Таким образом, с точки зрения ресурса параллелизма, алгоритм Ланцоша обладает линейной сложностью по ширине ЯПФ и квадратичной сложностью по высоте ЯПФ. Основное время работы алгоритма будет уделено операции умножения матрицы на вектор, имеющей ширину яруса &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;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;A&amp;lt;/math&amp;gt;, следовательно на вход данный алгоритм во всяком случае получает 1 число и 1 матрицу размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;. Помимо этого для начала работы алгоритму нужен некоторый вектор &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; начального приближения размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, который тоже является входными данными.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После окончания работы алгоритма мы получаем набор собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, состоящий из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; элементов. Если помимо собственных значений выводятся еще и полученные собственные векторы, то суммарный объём всех таких векторов составляет &amp;lt;math&amp;gt;k\times n&amp;lt;/math&amp;gt; элементов. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, совокупный объём входных данных составляет: &amp;lt;math&amp;gt;n^2+n+1&amp;lt;/math&amp;gt; элемент, а на выходе получаем &amp;lt;math&amp;gt;k(n+1)&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;lt;math&amp;gt;A&amp;lt;/math&amp;gt;) начиная с максимального в абсолютном смысле значения. Это выгодно отличает данный алгоритм с точки зрения поиска собственных значений матрицы, находящихся по краям её спектра.&lt;br /&gt;
&lt;br /&gt;
Не является полностью детерминированным, т.к. может досрочно завершить работу, если будут найдены все ненулевые собственные значения.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма (то есть отношение числа операций к суммарному объему входных и выходных данных) равна &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+2n+1}&amp;lt;/math&amp;gt;. Следовательно порядок мощности алгоритма примерно равен &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;, при &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В случае использования метода вычисления собственных значений с линейной сложностью, соотношение последовательной и параллельной сложностей будет равно &amp;lt;math&amp;gt;(k ^ 2 + n ^ 2) / (k  + 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;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма=== &lt;br /&gt;
=== Выводы для классов архитектур=== &lt;br /&gt;
=== Существующие реализации алгоритма===&lt;br /&gt;
&lt;br /&gt;
В настоящее время алгоритм Ланцоша поиска собственных значений квадратной симметричной матрицы включён в несколько библиотек и реализован на различных языках, среди которых такие наиболее распространенные как &#039;&#039;&#039;C&#039;&#039;&#039;, &#039;&#039;&#039;C++&#039;&#039;&#039;, &#039;&#039;&#039;FORTRAN77/90&#039;&#039;&#039;, &#039;&#039;&#039;MathLab&#039;&#039;&#039;.&lt;br /&gt;
Так, например, в языке &#039;&#039;&#039;MathLab&#039;&#039;&#039; во встроенном пакете &#039;&#039;&#039;ARPACK&#039;&#039;&#039; найти собственные значения методом Ланцоша можно при помощи вызова функции &#039;&#039;eigs()&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
На языке &#039;&#039;&#039;С&#039;&#039;&#039; существует библиотека &#039;&#039;&#039;[http://www.cs.wm.edu/~andreas/software/ PRIMME]&#039;&#039;&#039;, название которой расшифровывается как PReconditioned Iterative MultiMethod Eigensolver (итерационные методы поиска собственных значений с предусловием).&lt;br /&gt;
&lt;br /&gt;
Библиотека &#039;&#039;&#039;[http://www.nag.co.uk NAG] Numerical Library&#039;&#039;&#039; также содержит обширный набор функций, позволяющих проводить математический анализ, среди которых есть и реализация алгоритма Ланцоша. Библиотека доступна в трех пакетах: NAG C Library, NAG Fortran Library и NAG Library for .NET, совместна со многими языками и с основными операционными системами (Windows, Linux and OS X, а также Solaris, AIX и HP-UX).&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] Дж. Деммель «Вычислительная линейная алгебра», с 381.&lt;br /&gt;
&lt;br /&gt;
[2] Wikipedia https://en.wikipedia.org/wiki/Lanczos_algorithm&lt;br /&gt;
&lt;br /&gt;
[3] &amp;quot;[https://static.ph.ed.ac.uk/dissertations/hpc-msc/2013-2014/Investigation%20and%20Implementation%20of%20an%20Eigensolver%20Method.pdf Investigation and Implementation of an Eigensolver Method]&amp;quot;, Jorge Moreira, The University of Edinburgh, August 2014&lt;br /&gt;
&lt;br /&gt;
[4] &amp;quot;[http://www.physics.drexel.edu/~bob/Term_Reports/Hoppe_01.pdf Lanczos Vector Procedures]&amp;quot;, Travis Hoppe&lt;br /&gt;
&lt;br /&gt;
[5] &amp;quot;[http://pochenfullwave.ddns.net/wp-content/uploads/2015/09/61309283-Parallel-Scientific-Computing-in-C-and-MPI-2003.pdf Parallel Scientific Computing in C++ and MPI]&amp;quot;,&lt;br /&gt;
A seamless approach to parallel algorithms and their implementation,&lt;br /&gt;
George Em Karniadakis and Robert M. Kirby II,&lt;br /&gt;
Cambridge University Press&lt;/div&gt;</summary>
		<author><name>Alexbashirov</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=19999</id>
		<title>Обсуждение участника:Alexbashirov/Алгоритм Ланцоша для точной арифметики</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=19999"/>
		<updated>2016-12-03T20:28:07Z</updated>

		<summary type="html">&lt;p&gt;Alexbashirov: /* Замечания */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Замечания ===&lt;br /&gt;
* [DONE] убрать название пункта &amp;quot;1.1.1 История&amp;quot;, а сам текст оставить.&lt;br /&gt;
* [DONE] 1.2 вместо ужирнения текста &amp;quot;матрицу Крылова&amp;quot;, &amp;quot;процесс Рэлея-Ритца&amp;quot; лучше использовать наклон, т.к. ужирнение занято для заголовков&lt;br /&gt;
* [DONE] 1.5 скан алгоритма заменить на набранный текст вместо фото из книжки&lt;br /&gt;
* 1.7 добавить словесное описание графа&lt;br /&gt;
* 1.8 &amp;quot;процесс поиска собственных значений&amp;quot; - уточнить&lt;br /&gt;
* [DONE] 1.10 &amp;quot;...векторов с 3-ух до 2-ух.&amp;quot; - лучше полностью написать словами без &amp;quot;ух&amp;quot;-ов.&lt;br /&gt;
* 2.1-2.6 отсутствуют...&lt;/div&gt;</summary>
		<author><name>Alexbashirov</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=19998</id>
		<title>Участник:Alexbashirov/Алгоритм Ланцоша для точной арифметики</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=19998"/>
		<updated>2016-12-03T20:22:19Z</updated>

		<summary type="html">&lt;p&gt;Alexbashirov: /* Схема последовательной реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[Участник: Alexbashirov|Баширов А.Д.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name             = Алгоритм Ланцоша для точной арифметики&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;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;
Алгоритм Ланцоша является итерационным алгоритмом поиска собственных значений симметричной матрицы, разработанным венгерским физиком и математиком XX столетия Корнелием Ланцошем в 1950 году. Алгоритм совмещает в себе два других алгоритма: алгоритм построения подпространства Крылова (который также был создан Ланцошем) и процедуру Рэлея-Ритца приближения собственных значений матрицы. Алгоритм является вариацией степенного метода, позволяющего найти собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-го порядка. Однако в алгоритме число итераций ограничено некоторым &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;. Несмотря на заявленную вычислительную эффективность, алгоритм не получил широкого применения в своём первоначальном виде, ввиду его неустойчивости. 20 лет спустя, в 1970 году ученые Ojalvo и Newman показали доработанный алгоритм Ланцоша, который теперь стал устойчивым а также предложили способ выбора вектора начального приближения &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt;. Полученный последователями Ланцоша алгоритм получил название &amp;quot;Алгоритм Ланцоша с полной переортогонализацией&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма===&lt;br /&gt;
Алгоритм Ланцоша работает с вещественной симметричной матрицей &amp;lt;math&amp;gt;A=A^T&amp;lt;/math&amp;gt;, таким образом в памяти достаточно хранить лишь немногим более половины элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Прежде чем переходить к описанию алгоритма, следует упомянуть следующие понятия: подпространство Крылова и процесс Рэлея-Ритца, о которых уже было сказано в исторической справке выше. &lt;br /&gt;
Подпространством Крылова называется набор векторов&amp;lt;math&amp;gt;K_n =[b,Ab,A^2b,...,A^{n-1}b]&amp;lt;/math&amp;gt;. Начав свою работу с произвольного вектора &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, степенной метод вычисляет вектора &amp;lt;math&amp;gt;Ab, A^2b,...,A^{n-1}b&amp;lt;/math&amp;gt; итерационно сохраняя полученный результат в вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Полученная последовательность векторов сходится к собственному вектору, отвечающему максимальному собственному значению &amp;lt;math&amp;gt;\lambda_{max}&amp;lt;/math&amp;gt;. Однако, использование лишь последнего полученного вектора и потеря всех предшествующих посчитанных величин не всегда является наилучшим выбором. Поэтому сохранив все вектора и объединив их в одну матрицу мы получим так называемую &amp;lt;i&amp;gt;матрицу Крылова  &amp;lt;/i&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K_j = [b,Ab,A^2b,...,A^{j-1}b]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Столбцы получившейся матрицы не ортогональны, однако их можно ортогонализовать, применив процесс Грамма-Шмидта. Получившиеся вектора будут составлять базис подпространства Крылова &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt;. Можно ожидать, что вектора полученного базиса будут достаточно хорошо приближать &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; собственных векторов, отвечающих &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; наибольшим собственным значения.&lt;br /&gt;
&lt;br /&gt;
Затем с использованием полученной матрицы из ортогональных векторов &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt; мы получим трехдиагональную матрицу &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; на основе исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
Наконец, к полученной матрице &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; будет применяться &amp;lt;i&amp;gt;процесс Рэлея-Ритца&amp;lt;/i&amp;gt;, который найдет собственные значения трехдиагональной матрицы. В последствии эти значения и будут приближениями искомых собственных значений исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма Ланцоша, то есть наиболее ресурсно-затратной частью алгоритма, является шаг на котором на каждой итерации происходит перемножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;, полученный на предыдущей итерации. Полученный в результате умножения вектор обозначается &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; z=Aq_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;Q_j=[q_1,q_2,...q_j]&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортонормированных вектров Ланцоша и последующее формирование трехдиагональной матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;. Число таких векторов и, следовательно, размер матрицы растет с каждой итерацией. Итерационный процесс завершается при &amp;lt;math&amp;gt;j=k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На долю второй части алгоритма приходится поиск собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;, полученной в первой части.&lt;br /&gt;
&lt;br /&gt;
=== Схема последовательной реализации алгоритма ===&lt;br /&gt;
&amp;lt;math&amp;gt;q=b/||b||_2&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\beta_0=0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;q_0=0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; for j=1 to k&amp;lt;/math&amp;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;
&amp;lt;math&amp;gt;\alpha_j = q_j^T z&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; z = z - \alpha_jq_j -\beta_{j-1}q_{j-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \beta_j = ||z||_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; if \beta_j = 0 quit&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; q_{j+1} = z/\beta_j&amp;lt;/math&amp;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;
&amp;lt;math&amp;gt; end for &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выше представлен псевдокод, отражающий последовательность действий в алгоритме метода. Перечислим основные ступени в данном методе:&lt;br /&gt;
* Прежде чем войти в цикл, происходит инициализация констант &amp;lt;math&amp;gt;\Beta_0,q_0&amp;lt;/math&amp;gt;, вычисление нормы вектора начального приближения &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и нормализация этого вектора.&lt;br /&gt;
* Затем, в цикле, происходит: &lt;br /&gt;
**поиск вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, являющегося результатом применения матричного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;; &lt;br /&gt;
**скалярное произведение двух векторов &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**вычисляется линейная комбинация векторов; &lt;br /&gt;
**вычисляется норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**проверяется условие выхода из цикла (равенство нулю нормы вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;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;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Посчитаем количество операций, необходимых для поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений и векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; действий для умножения матрицы на вектор&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; действия для перемножения двух векторов&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  операций для поэлементного сложения или вычитания двух векторов&lt;br /&gt;
* для отыскания нормы вектора помимо &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  сложений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  умножений требуется 1 операция извлечения корня&lt;br /&gt;
* для поиска собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; требуется &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарно для одной итерации алгоритма требуется совершить  &amp;lt;math&amp;gt;O(n^2)+O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
В данном разделе представлен информационный граф алгоритма, дающий представление о переходе от одной итерации к другой.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Информационный_граф_1.png|1000px|thumb|center| &amp;lt;math&amp;gt;||x||&amp;lt;/math&amp;gt; - операция вычисления нормы;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; - операция деления;&lt;br /&gt;
• - операция скалярного умножения векторов;&lt;br /&gt;
Ax - операция применения оператора A к вектору x;&lt;br /&gt;
F - операция вычисления линейной комбинации.&lt;br /&gt;
Желтый ромб символизирует проверку логического условия выхода из итерационного цикла (в случае если посчитанная норма равна нулю).&lt;br /&gt;
Input,Out - входные и выходные данные.]]&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;n\times n&amp;lt;/math&amp;gt; на вектор размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
В свою очередь ресурс параллелизма операции поиска собственных значений зависит от выбранного способа и не рассматривается в данной статье.&lt;br /&gt;
&lt;br /&gt;
Таким образом, с точки зрения ресурса параллелизма, алгоритм Ланцоша обладает линейной сложностью по ширине ЯПФ и квадратичной сложностью по высоте ЯПФ. Основное время работы алгоритма будет уделено операции умножения матрицы на вектор, имеющей ширину яруса &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;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;A&amp;lt;/math&amp;gt;, следовательно на вход данный алгоритм во всяком случае получает 1 число и 1 матрицу размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;. Помимо этого для начала работы алгоритму нужен некоторый вектор &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; начального приближения размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, который тоже является входными данными.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После окончания работы алгоритма мы получаем набор собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, состоящий из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; элементов. Если помимо собственных значений выводятся еще и полученные собственные векторы, то суммарный объём всех таких векторов составляет &amp;lt;math&amp;gt;k\times n&amp;lt;/math&amp;gt; элементов. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, совокупный объём входных данных составляет: &amp;lt;math&amp;gt;n^2+n+1&amp;lt;/math&amp;gt; элемент, а на выходе получаем &amp;lt;math&amp;gt;k(n+1)&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;lt;math&amp;gt;A&amp;lt;/math&amp;gt;) начиная с максимального в абсолютном смысле значения. Это выгодно отличает данный алгоритм с точки зрения поиска собственных значений матрицы, находящихся по краям её спектра.&lt;br /&gt;
&lt;br /&gt;
Не является полностью детерминированным, т.к. может досрочно завершить работу, если будут найдены все ненулевые собственные значения.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма (то есть отношение числа операций к суммарному объему входных и выходных данных) равна &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+2n+1}&amp;lt;/math&amp;gt;. Следовательно порядок мощности алгоритма примерно равен &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;, при &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В случае использования метода вычисления собственных значений с линейной сложностью, соотношение последовательной и параллельной сложностей будет равно &amp;lt;math&amp;gt;(k ^ 2 + n ^ 2) / (k  + 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;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма=== &lt;br /&gt;
=== Выводы для классов архитектур=== &lt;br /&gt;
=== Существующие реализации алгоритма===&lt;br /&gt;
&lt;br /&gt;
В настоящее время алгоритм Ланцоша поиска собственных значений квадратной симметричной матрицы включён в несколько библиотек и реализован на различных языках, среди которых такие наиболее распространенные как &#039;&#039;&#039;C&#039;&#039;&#039;, &#039;&#039;&#039;C++&#039;&#039;&#039;, &#039;&#039;&#039;FORTRAN77/90&#039;&#039;&#039;, &#039;&#039;&#039;MathLab&#039;&#039;&#039;.&lt;br /&gt;
Так, например, в языке &#039;&#039;&#039;MathLab&#039;&#039;&#039; во встроенном пакете &#039;&#039;&#039;ARPACK&#039;&#039;&#039; найти собственные значения методом Ланцоша можно при помощи вызова функции &#039;&#039;eigs()&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
На языке &#039;&#039;&#039;С&#039;&#039;&#039; существует библиотека &#039;&#039;&#039;[http://www.cs.wm.edu/~andreas/software/ PRIMME]&#039;&#039;&#039;, название которой расшифровывается как PReconditioned Iterative MultiMethod Eigensolver (итерационные методы поиска собственных значений с предусловием).&lt;br /&gt;
&lt;br /&gt;
Библиотека &#039;&#039;&#039;[http://www.nag.co.uk NAG] Numerical Library&#039;&#039;&#039; также содержит обширный набор функций, позволяющих проводить математический анализ, среди которых есть и реализация алгоритма Ланцоша. Библиотека доступна в трех пакетах: NAG C Library, NAG Fortran Library и NAG Library for .NET, совместна со многими языками и с основными операционными системами (Windows, Linux and OS X, а также Solaris, AIX и HP-UX).&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] Дж. Деммель «Вычислительная линейная алгебра», с 381.&lt;br /&gt;
&lt;br /&gt;
[2] Wikipedia https://en.wikipedia.org/wiki/Lanczos_algorithm&lt;br /&gt;
&lt;br /&gt;
[3] &amp;quot;[https://static.ph.ed.ac.uk/dissertations/hpc-msc/2013-2014/Investigation%20and%20Implementation%20of%20an%20Eigensolver%20Method.pdf Investigation and Implementation of an Eigensolver Method]&amp;quot;, Jorge Moreira, The University of Edinburgh, August 2014&lt;br /&gt;
&lt;br /&gt;
[4] &amp;quot;[http://www.physics.drexel.edu/~bob/Term_Reports/Hoppe_01.pdf Lanczos Vector Procedures]&amp;quot;, Travis Hoppe&lt;br /&gt;
&lt;br /&gt;
[5] &amp;quot;[http://pochenfullwave.ddns.net/wp-content/uploads/2015/09/61309283-Parallel-Scientific-Computing-in-C-and-MPI-2003.pdf Parallel Scientific Computing in C++ and MPI]&amp;quot;,&lt;br /&gt;
A seamless approach to parallel algorithms and their implementation,&lt;br /&gt;
George Em Karniadakis and Robert M. Kirby II,&lt;br /&gt;
Cambridge University Press&lt;/div&gt;</summary>
		<author><name>Alexbashirov</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=19997</id>
		<title>Участник:Alexbashirov/Алгоритм Ланцоша для точной арифметики</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=19997"/>
		<updated>2016-12-03T20:19:52Z</updated>

		<summary type="html">&lt;p&gt;Alexbashirov: /* Схема последовательной реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[Участник: Alexbashirov|Баширов А.Д.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name             = Алгоритм Ланцоша для точной арифметики&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;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;
Алгоритм Ланцоша является итерационным алгоритмом поиска собственных значений симметричной матрицы, разработанным венгерским физиком и математиком XX столетия Корнелием Ланцошем в 1950 году. Алгоритм совмещает в себе два других алгоритма: алгоритм построения подпространства Крылова (который также был создан Ланцошем) и процедуру Рэлея-Ритца приближения собственных значений матрицы. Алгоритм является вариацией степенного метода, позволяющего найти собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-го порядка. Однако в алгоритме число итераций ограничено некоторым &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;. Несмотря на заявленную вычислительную эффективность, алгоритм не получил широкого применения в своём первоначальном виде, ввиду его неустойчивости. 20 лет спустя, в 1970 году ученые Ojalvo и Newman показали доработанный алгоритм Ланцоша, который теперь стал устойчивым а также предложили способ выбора вектора начального приближения &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt;. Полученный последователями Ланцоша алгоритм получил название &amp;quot;Алгоритм Ланцоша с полной переортогонализацией&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма===&lt;br /&gt;
Алгоритм Ланцоша работает с вещественной симметричной матрицей &amp;lt;math&amp;gt;A=A^T&amp;lt;/math&amp;gt;, таким образом в памяти достаточно хранить лишь немногим более половины элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Прежде чем переходить к описанию алгоритма, следует упомянуть следующие понятия: подпространство Крылова и процесс Рэлея-Ритца, о которых уже было сказано в исторической справке выше. &lt;br /&gt;
Подпространством Крылова называется набор векторов&amp;lt;math&amp;gt;K_n =[b,Ab,A^2b,...,A^{n-1}b]&amp;lt;/math&amp;gt;. Начав свою работу с произвольного вектора &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, степенной метод вычисляет вектора &amp;lt;math&amp;gt;Ab, A^2b,...,A^{n-1}b&amp;lt;/math&amp;gt; итерационно сохраняя полученный результат в вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Полученная последовательность векторов сходится к собственному вектору, отвечающему максимальному собственному значению &amp;lt;math&amp;gt;\lambda_{max}&amp;lt;/math&amp;gt;. Однако, использование лишь последнего полученного вектора и потеря всех предшествующих посчитанных величин не всегда является наилучшим выбором. Поэтому сохранив все вектора и объединив их в одну матрицу мы получим так называемую &amp;lt;i&amp;gt;матрицу Крылова  &amp;lt;/i&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K_j = [b,Ab,A^2b,...,A^{j-1}b]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Столбцы получившейся матрицы не ортогональны, однако их можно ортогонализовать, применив процесс Грамма-Шмидта. Получившиеся вектора будут составлять базис подпространства Крылова &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt;. Можно ожидать, что вектора полученного базиса будут достаточно хорошо приближать &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; собственных векторов, отвечающих &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; наибольшим собственным значения.&lt;br /&gt;
&lt;br /&gt;
Затем с использованием полученной матрицы из ортогональных векторов &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt; мы получим трехдиагональную матрицу &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; на основе исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
Наконец, к полученной матрице &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; будет применяться &amp;lt;i&amp;gt;процесс Рэлея-Ритца&amp;lt;/i&amp;gt;, который найдет собственные значения трехдиагональной матрицы. В последствии эти значения и будут приближениями искомых собственных значений исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма Ланцоша, то есть наиболее ресурсно-затратной частью алгоритма, является шаг на котором на каждой итерации происходит перемножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;, полученный на предыдущей итерации. Полученный в результате умножения вектор обозначается &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; z=Aq_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;Q_j=[q_1,q_2,...q_j]&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортонормированных вектров Ланцоша и последующее формирование трехдиагональной матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;. Число таких векторов и, следовательно, размер матрицы растет с каждой итерацией. Итерационный процесс завершается при &amp;lt;math&amp;gt;j=k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На долю второй части алгоритма приходится поиск собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;, полученной в первой части.&lt;br /&gt;
&lt;br /&gt;
=== Схема последовательной реализации алгоритма ===&lt;br /&gt;
&amp;lt;math&amp;gt;q=b/||b||_2&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\beta_0=0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;q_0=0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; for j=1 to k&amp;lt;/math&amp;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;
&amp;lt;math&amp;gt;\alpha_j = q_j^T z&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; z = z - \alpha_jq_j -\beta_{j-1}q_{j-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \beta_j = ||z||_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; if \beta_j = 0 quit&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; q_{j+1} = z/\beta_j&amp;lt;/math&amp;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;
&amp;lt;math&amp;gt; end for &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
На рисунке выше представлен псевдокод, отражающий последовательность действий в алгоритме метода. Перечислим основные ступени в данном методе:&lt;br /&gt;
* Прежде чем войти в цикл, происходит инициализация констант &amp;lt;math&amp;gt;\Beta_0,q_0&amp;lt;/math&amp;gt;, вычисление нормы вектора начального приближения &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и нормализация этого вектора.&lt;br /&gt;
* Затем, в цикле, происходит: &lt;br /&gt;
**поиск вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, являющегося результатом применения матричного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;; &lt;br /&gt;
**скалярное произведение двух векторов &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**вычисляется линейная комбинация векторов; &lt;br /&gt;
**вычисляется норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**проверяется условие выхода из цикла (равенство нулю нормы вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;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;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Посчитаем количество операций, необходимых для поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений и векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; действий для умножения матрицы на вектор&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; действия для перемножения двух векторов&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  операций для поэлементного сложения или вычитания двух векторов&lt;br /&gt;
* для отыскания нормы вектора помимо &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  сложений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  умножений требуется 1 операция извлечения корня&lt;br /&gt;
* для поиска собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; требуется &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарно для одной итерации алгоритма требуется совершить  &amp;lt;math&amp;gt;O(n^2)+O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
В данном разделе представлен информационный граф алгоритма, дающий представление о переходе от одной итерации к другой.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Информационный_граф_1.png|1000px|thumb|center| &amp;lt;math&amp;gt;||x||&amp;lt;/math&amp;gt; - операция вычисления нормы;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; - операция деления;&lt;br /&gt;
• - операция скалярного умножения векторов;&lt;br /&gt;
Ax - операция применения оператора A к вектору x;&lt;br /&gt;
F - операция вычисления линейной комбинации.&lt;br /&gt;
Желтый ромб символизирует проверку логического условия выхода из итерационного цикла (в случае если посчитанная норма равна нулю).&lt;br /&gt;
Input,Out - входные и выходные данные.]]&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;n\times n&amp;lt;/math&amp;gt; на вектор размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
В свою очередь ресурс параллелизма операции поиска собственных значений зависит от выбранного способа и не рассматривается в данной статье.&lt;br /&gt;
&lt;br /&gt;
Таким образом, с точки зрения ресурса параллелизма, алгоритм Ланцоша обладает линейной сложностью по ширине ЯПФ и квадратичной сложностью по высоте ЯПФ. Основное время работы алгоритма будет уделено операции умножения матрицы на вектор, имеющей ширину яруса &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;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;A&amp;lt;/math&amp;gt;, следовательно на вход данный алгоритм во всяком случае получает 1 число и 1 матрицу размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;. Помимо этого для начала работы алгоритму нужен некоторый вектор &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; начального приближения размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, который тоже является входными данными.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После окончания работы алгоритма мы получаем набор собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, состоящий из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; элементов. Если помимо собственных значений выводятся еще и полученные собственные векторы, то суммарный объём всех таких векторов составляет &amp;lt;math&amp;gt;k\times n&amp;lt;/math&amp;gt; элементов. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, совокупный объём входных данных составляет: &amp;lt;math&amp;gt;n^2+n+1&amp;lt;/math&amp;gt; элемент, а на выходе получаем &amp;lt;math&amp;gt;k(n+1)&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;lt;math&amp;gt;A&amp;lt;/math&amp;gt;) начиная с максимального в абсолютном смысле значения. Это выгодно отличает данный алгоритм с точки зрения поиска собственных значений матрицы, находящихся по краям её спектра.&lt;br /&gt;
&lt;br /&gt;
Не является полностью детерминированным, т.к. может досрочно завершить работу, если будут найдены все ненулевые собственные значения.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма (то есть отношение числа операций к суммарному объему входных и выходных данных) равна &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+2n+1}&amp;lt;/math&amp;gt;. Следовательно порядок мощности алгоритма примерно равен &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;, при &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В случае использования метода вычисления собственных значений с линейной сложностью, соотношение последовательной и параллельной сложностей будет равно &amp;lt;math&amp;gt;(k ^ 2 + n ^ 2) / (k  + 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;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма=== &lt;br /&gt;
=== Выводы для классов архитектур=== &lt;br /&gt;
=== Существующие реализации алгоритма===&lt;br /&gt;
&lt;br /&gt;
В настоящее время алгоритм Ланцоша поиска собственных значений квадратной симметричной матрицы включён в несколько библиотек и реализован на различных языках, среди которых такие наиболее распространенные как &#039;&#039;&#039;C&#039;&#039;&#039;, &#039;&#039;&#039;C++&#039;&#039;&#039;, &#039;&#039;&#039;FORTRAN77/90&#039;&#039;&#039;, &#039;&#039;&#039;MathLab&#039;&#039;&#039;.&lt;br /&gt;
Так, например, в языке &#039;&#039;&#039;MathLab&#039;&#039;&#039; во встроенном пакете &#039;&#039;&#039;ARPACK&#039;&#039;&#039; найти собственные значения методом Ланцоша можно при помощи вызова функции &#039;&#039;eigs()&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
На языке &#039;&#039;&#039;С&#039;&#039;&#039; существует библиотека &#039;&#039;&#039;[http://www.cs.wm.edu/~andreas/software/ PRIMME]&#039;&#039;&#039;, название которой расшифровывается как PReconditioned Iterative MultiMethod Eigensolver (итерационные методы поиска собственных значений с предусловием).&lt;br /&gt;
&lt;br /&gt;
Библиотека &#039;&#039;&#039;[http://www.nag.co.uk NAG] Numerical Library&#039;&#039;&#039; также содержит обширный набор функций, позволяющих проводить математический анализ, среди которых есть и реализация алгоритма Ланцоша. Библиотека доступна в трех пакетах: NAG C Library, NAG Fortran Library и NAG Library for .NET, совместна со многими языками и с основными операционными системами (Windows, Linux and OS X, а также Solaris, AIX и HP-UX).&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] Дж. Деммель «Вычислительная линейная алгебра», с 381.&lt;br /&gt;
&lt;br /&gt;
[2] Wikipedia https://en.wikipedia.org/wiki/Lanczos_algorithm&lt;br /&gt;
&lt;br /&gt;
[3] &amp;quot;[https://static.ph.ed.ac.uk/dissertations/hpc-msc/2013-2014/Investigation%20and%20Implementation%20of%20an%20Eigensolver%20Method.pdf Investigation and Implementation of an Eigensolver Method]&amp;quot;, Jorge Moreira, The University of Edinburgh, August 2014&lt;br /&gt;
&lt;br /&gt;
[4] &amp;quot;[http://www.physics.drexel.edu/~bob/Term_Reports/Hoppe_01.pdf Lanczos Vector Procedures]&amp;quot;, Travis Hoppe&lt;br /&gt;
&lt;br /&gt;
[5] &amp;quot;[http://pochenfullwave.ddns.net/wp-content/uploads/2015/09/61309283-Parallel-Scientific-Computing-in-C-and-MPI-2003.pdf Parallel Scientific Computing in C++ and MPI]&amp;quot;,&lt;br /&gt;
A seamless approach to parallel algorithms and their implementation,&lt;br /&gt;
George Em Karniadakis and Robert M. Kirby II,&lt;br /&gt;
Cambridge University Press&lt;/div&gt;</summary>
		<author><name>Alexbashirov</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=19996</id>
		<title>Участник:Alexbashirov/Алгоритм Ланцоша для точной арифметики</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=19996"/>
		<updated>2016-12-03T19:59:17Z</updated>

		<summary type="html">&lt;p&gt;Alexbashirov: /* Схема последовательной реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[Участник: Alexbashirov|Баширов А.Д.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name             = Алгоритм Ланцоша для точной арифметики&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;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;
Алгоритм Ланцоша является итерационным алгоритмом поиска собственных значений симметричной матрицы, разработанным венгерским физиком и математиком XX столетия Корнелием Ланцошем в 1950 году. Алгоритм совмещает в себе два других алгоритма: алгоритм построения подпространства Крылова (который также был создан Ланцошем) и процедуру Рэлея-Ритца приближения собственных значений матрицы. Алгоритм является вариацией степенного метода, позволяющего найти собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-го порядка. Однако в алгоритме число итераций ограничено некоторым &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;. Несмотря на заявленную вычислительную эффективность, алгоритм не получил широкого применения в своём первоначальном виде, ввиду его неустойчивости. 20 лет спустя, в 1970 году ученые Ojalvo и Newman показали доработанный алгоритм Ланцоша, который теперь стал устойчивым а также предложили способ выбора вектора начального приближения &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt;. Полученный последователями Ланцоша алгоритм получил название &amp;quot;Алгоритм Ланцоша с полной переортогонализацией&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма===&lt;br /&gt;
Алгоритм Ланцоша работает с вещественной симметричной матрицей &amp;lt;math&amp;gt;A=A^T&amp;lt;/math&amp;gt;, таким образом в памяти достаточно хранить лишь немногим более половины элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Прежде чем переходить к описанию алгоритма, следует упомянуть следующие понятия: подпространство Крылова и процесс Рэлея-Ритца, о которых уже было сказано в исторической справке выше. &lt;br /&gt;
Подпространством Крылова называется набор векторов&amp;lt;math&amp;gt;K_n =[b,Ab,A^2b,...,A^{n-1}b]&amp;lt;/math&amp;gt;. Начав свою работу с произвольного вектора &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, степенной метод вычисляет вектора &amp;lt;math&amp;gt;Ab, A^2b,...,A^{n-1}b&amp;lt;/math&amp;gt; итерационно сохраняя полученный результат в вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Полученная последовательность векторов сходится к собственному вектору, отвечающему максимальному собственному значению &amp;lt;math&amp;gt;\lambda_{max}&amp;lt;/math&amp;gt;. Однако, использование лишь последнего полученного вектора и потеря всех предшествующих посчитанных величин не всегда является наилучшим выбором. Поэтому сохранив все вектора и объединив их в одну матрицу мы получим так называемую &amp;lt;i&amp;gt;матрицу Крылова  &amp;lt;/i&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K_j = [b,Ab,A^2b,...,A^{j-1}b]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Столбцы получившейся матрицы не ортогональны, однако их можно ортогонализовать, применив процесс Грамма-Шмидта. Получившиеся вектора будут составлять базис подпространства Крылова &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt;. Можно ожидать, что вектора полученного базиса будут достаточно хорошо приближать &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; собственных векторов, отвечающих &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; наибольшим собственным значения.&lt;br /&gt;
&lt;br /&gt;
Затем с использованием полученной матрицы из ортогональных векторов &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt; мы получим трехдиагональную матрицу &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; на основе исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
Наконец, к полученной матрице &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; будет применяться &amp;lt;i&amp;gt;процесс Рэлея-Ритца&amp;lt;/i&amp;gt;, который найдет собственные значения трехдиагональной матрицы. В последствии эти значения и будут приближениями искомых собственных значений исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма Ланцоша, то есть наиболее ресурсно-затратной частью алгоритма, является шаг на котором на каждой итерации происходит перемножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;, полученный на предыдущей итерации. Полученный в результате умножения вектор обозначается &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; z=Aq_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;Q_j=[q_1,q_2,...q_j]&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортонормированных вектров Ланцоша и последующее формирование трехдиагональной матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;. Число таких векторов и, следовательно, размер матрицы растет с каждой итерацией. Итерационный процесс завершается при &amp;lt;math&amp;gt;j=k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На долю второй части алгоритма приходится поиск собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;, полученной в первой части.&lt;br /&gt;
&lt;br /&gt;
=== Схема последовательной реализации алгоритма ===&lt;br /&gt;
&amp;lt;math&amp;gt;q=b/||b||_2; β_0=0; q_0=0&amp;lt;/math&amp;gt;&lt;br /&gt;
[[Файл:Ланцош_Схема реализации.png|800px]]&lt;br /&gt;
&lt;br /&gt;
На рисунке выше представлен псевдокод, отражающий последовательность действий в алгоритме метода. Перечислим основные ступени в данном методе:&lt;br /&gt;
* Прежде чем войти в цикл, происходит инициализация констант &amp;lt;math&amp;gt;\Beta_0,q_0&amp;lt;/math&amp;gt;, вычисление нормы вектора начального приближения &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и нормализация этого вектора.&lt;br /&gt;
* Затем, в цикле, происходит: &lt;br /&gt;
**поиск вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, являющегося результатом применения матричного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;; &lt;br /&gt;
**скалярное произведение двух векторов &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**вычисляется линейная комбинация векторов; &lt;br /&gt;
**вычисляется норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**проверяется условие выхода из цикла (равенство нулю нормы вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;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;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Посчитаем количество операций, необходимых для поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений и векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; действий для умножения матрицы на вектор&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; действия для перемножения двух векторов&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  операций для поэлементного сложения или вычитания двух векторов&lt;br /&gt;
* для отыскания нормы вектора помимо &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  сложений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  умножений требуется 1 операция извлечения корня&lt;br /&gt;
* для поиска собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; требуется &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарно для одной итерации алгоритма требуется совершить  &amp;lt;math&amp;gt;O(n^2)+O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
В данном разделе представлен информационный граф алгоритма, дающий представление о переходе от одной итерации к другой.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Информационный_граф_1.png|1000px|thumb|center| &amp;lt;math&amp;gt;||x||&amp;lt;/math&amp;gt; - операция вычисления нормы;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; - операция деления;&lt;br /&gt;
• - операция скалярного умножения векторов;&lt;br /&gt;
Ax - операция применения оператора A к вектору x;&lt;br /&gt;
F - операция вычисления линейной комбинации.&lt;br /&gt;
Желтый ромб символизирует проверку логического условия выхода из итерационного цикла (в случае если посчитанная норма равна нулю).&lt;br /&gt;
Input,Out - входные и выходные данные.]]&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;n\times n&amp;lt;/math&amp;gt; на вектор размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
В свою очередь ресурс параллелизма операции поиска собственных значений зависит от выбранного способа и не рассматривается в данной статье.&lt;br /&gt;
&lt;br /&gt;
Таким образом, с точки зрения ресурса параллелизма, алгоритм Ланцоша обладает линейной сложностью по ширине ЯПФ и квадратичной сложностью по высоте ЯПФ. Основное время работы алгоритма будет уделено операции умножения матрицы на вектор, имеющей ширину яруса &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;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;A&amp;lt;/math&amp;gt;, следовательно на вход данный алгоритм во всяком случае получает 1 число и 1 матрицу размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;. Помимо этого для начала работы алгоритму нужен некоторый вектор &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; начального приближения размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, который тоже является входными данными.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После окончания работы алгоритма мы получаем набор собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, состоящий из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; элементов. Если помимо собственных значений выводятся еще и полученные собственные векторы, то суммарный объём всех таких векторов составляет &amp;lt;math&amp;gt;k\times n&amp;lt;/math&amp;gt; элементов. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, совокупный объём входных данных составляет: &amp;lt;math&amp;gt;n^2+n+1&amp;lt;/math&amp;gt; элемент, а на выходе получаем &amp;lt;math&amp;gt;k(n+1)&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;lt;math&amp;gt;A&amp;lt;/math&amp;gt;) начиная с максимального в абсолютном смысле значения. Это выгодно отличает данный алгоритм с точки зрения поиска собственных значений матрицы, находящихся по краям её спектра.&lt;br /&gt;
&lt;br /&gt;
Не является полностью детерминированным, т.к. может досрочно завершить работу, если будут найдены все ненулевые собственные значения.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма (то есть отношение числа операций к суммарному объему входных и выходных данных) равна &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+2n+1}&amp;lt;/math&amp;gt;. Следовательно порядок мощности алгоритма примерно равен &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;, при &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В случае использования метода вычисления собственных значений с линейной сложностью, соотношение последовательной и параллельной сложностей будет равно &amp;lt;math&amp;gt;(k ^ 2 + n ^ 2) / (k  + 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;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма=== &lt;br /&gt;
=== Выводы для классов архитектур=== &lt;br /&gt;
=== Существующие реализации алгоритма===&lt;br /&gt;
&lt;br /&gt;
В настоящее время алгоритм Ланцоша поиска собственных значений квадратной симметричной матрицы включён в несколько библиотек и реализован на различных языках, среди которых такие наиболее распространенные как &#039;&#039;&#039;C&#039;&#039;&#039;, &#039;&#039;&#039;C++&#039;&#039;&#039;, &#039;&#039;&#039;FORTRAN77/90&#039;&#039;&#039;, &#039;&#039;&#039;MathLab&#039;&#039;&#039;.&lt;br /&gt;
Так, например, в языке &#039;&#039;&#039;MathLab&#039;&#039;&#039; во встроенном пакете &#039;&#039;&#039;ARPACK&#039;&#039;&#039; найти собственные значения методом Ланцоша можно при помощи вызова функции &#039;&#039;eigs()&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
На языке &#039;&#039;&#039;С&#039;&#039;&#039; существует библиотека &#039;&#039;&#039;[http://www.cs.wm.edu/~andreas/software/ PRIMME]&#039;&#039;&#039;, название которой расшифровывается как PReconditioned Iterative MultiMethod Eigensolver (итерационные методы поиска собственных значений с предусловием).&lt;br /&gt;
&lt;br /&gt;
Библиотека &#039;&#039;&#039;[http://www.nag.co.uk NAG] Numerical Library&#039;&#039;&#039; также содержит обширный набор функций, позволяющих проводить математический анализ, среди которых есть и реализация алгоритма Ланцоша. Библиотека доступна в трех пакетах: NAG C Library, NAG Fortran Library и NAG Library for .NET, совместна со многими языками и с основными операционными системами (Windows, Linux and OS X, а также Solaris, AIX и HP-UX).&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] Дж. Деммель «Вычислительная линейная алгебра», с 381.&lt;br /&gt;
&lt;br /&gt;
[2] Wikipedia https://en.wikipedia.org/wiki/Lanczos_algorithm&lt;br /&gt;
&lt;br /&gt;
[3] &amp;quot;[https://static.ph.ed.ac.uk/dissertations/hpc-msc/2013-2014/Investigation%20and%20Implementation%20of%20an%20Eigensolver%20Method.pdf Investigation and Implementation of an Eigensolver Method]&amp;quot;, Jorge Moreira, The University of Edinburgh, August 2014&lt;br /&gt;
&lt;br /&gt;
[4] &amp;quot;[http://www.physics.drexel.edu/~bob/Term_Reports/Hoppe_01.pdf Lanczos Vector Procedures]&amp;quot;, Travis Hoppe&lt;br /&gt;
&lt;br /&gt;
[5] &amp;quot;[http://pochenfullwave.ddns.net/wp-content/uploads/2015/09/61309283-Parallel-Scientific-Computing-in-C-and-MPI-2003.pdf Parallel Scientific Computing in C++ and MPI]&amp;quot;,&lt;br /&gt;
A seamless approach to parallel algorithms and their implementation,&lt;br /&gt;
George Em Karniadakis and Robert M. Kirby II,&lt;br /&gt;
Cambridge University Press&lt;/div&gt;</summary>
		<author><name>Alexbashirov</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=19995</id>
		<title>Участник:Alexbashirov/Алгоритм Ланцоша для точной арифметики</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=19995"/>
		<updated>2016-12-03T19:58:58Z</updated>

		<summary type="html">&lt;p&gt;Alexbashirov: /* Схема последовательной реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[Участник: Alexbashirov|Баширов А.Д.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name             = Алгоритм Ланцоша для точной арифметики&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;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;
Алгоритм Ланцоша является итерационным алгоритмом поиска собственных значений симметричной матрицы, разработанным венгерским физиком и математиком XX столетия Корнелием Ланцошем в 1950 году. Алгоритм совмещает в себе два других алгоритма: алгоритм построения подпространства Крылова (который также был создан Ланцошем) и процедуру Рэлея-Ритца приближения собственных значений матрицы. Алгоритм является вариацией степенного метода, позволяющего найти собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-го порядка. Однако в алгоритме число итераций ограничено некоторым &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;. Несмотря на заявленную вычислительную эффективность, алгоритм не получил широкого применения в своём первоначальном виде, ввиду его неустойчивости. 20 лет спустя, в 1970 году ученые Ojalvo и Newman показали доработанный алгоритм Ланцоша, который теперь стал устойчивым а также предложили способ выбора вектора начального приближения &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt;. Полученный последователями Ланцоша алгоритм получил название &amp;quot;Алгоритм Ланцоша с полной переортогонализацией&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма===&lt;br /&gt;
Алгоритм Ланцоша работает с вещественной симметричной матрицей &amp;lt;math&amp;gt;A=A^T&amp;lt;/math&amp;gt;, таким образом в памяти достаточно хранить лишь немногим более половины элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Прежде чем переходить к описанию алгоритма, следует упомянуть следующие понятия: подпространство Крылова и процесс Рэлея-Ритца, о которых уже было сказано в исторической справке выше. &lt;br /&gt;
Подпространством Крылова называется набор векторов&amp;lt;math&amp;gt;K_n =[b,Ab,A^2b,...,A^{n-1}b]&amp;lt;/math&amp;gt;. Начав свою работу с произвольного вектора &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, степенной метод вычисляет вектора &amp;lt;math&amp;gt;Ab, A^2b,...,A^{n-1}b&amp;lt;/math&amp;gt; итерационно сохраняя полученный результат в вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Полученная последовательность векторов сходится к собственному вектору, отвечающему максимальному собственному значению &amp;lt;math&amp;gt;\lambda_{max}&amp;lt;/math&amp;gt;. Однако, использование лишь последнего полученного вектора и потеря всех предшествующих посчитанных величин не всегда является наилучшим выбором. Поэтому сохранив все вектора и объединив их в одну матрицу мы получим так называемую &amp;lt;i&amp;gt;матрицу Крылова  &amp;lt;/i&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K_j = [b,Ab,A^2b,...,A^{j-1}b]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Столбцы получившейся матрицы не ортогональны, однако их можно ортогонализовать, применив процесс Грамма-Шмидта. Получившиеся вектора будут составлять базис подпространства Крылова &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt;. Можно ожидать, что вектора полученного базиса будут достаточно хорошо приближать &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; собственных векторов, отвечающих &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; наибольшим собственным значения.&lt;br /&gt;
&lt;br /&gt;
Затем с использованием полученной матрицы из ортогональных векторов &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt; мы получим трехдиагональную матрицу &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; на основе исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
Наконец, к полученной матрице &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; будет применяться &amp;lt;i&amp;gt;процесс Рэлея-Ритца&amp;lt;/i&amp;gt;, который найдет собственные значения трехдиагональной матрицы. В последствии эти значения и будут приближениями искомых собственных значений исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма Ланцоша, то есть наиболее ресурсно-затратной частью алгоритма, является шаг на котором на каждой итерации происходит перемножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;, полученный на предыдущей итерации. Полученный в результате умножения вектор обозначается &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; z=Aq_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;Q_j=[q_1,q_2,...q_j]&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортонормированных вектров Ланцоша и последующее формирование трехдиагональной матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;. Число таких векторов и, следовательно, размер матрицы растет с каждой итерацией. Итерационный процесс завершается при &amp;lt;math&amp;gt;j=k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На долю второй части алгоритма приходится поиск собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;, полученной в первой части.&lt;br /&gt;
&lt;br /&gt;
=== Схема последовательной реализации алгоритма ===&lt;br /&gt;
&amp;lt;math&amp;gt;q=b/||b||_2; β_0 = 0; q_0 = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
[[Файл:Ланцош_Схема реализации.png|800px]]&lt;br /&gt;
&lt;br /&gt;
На рисунке выше представлен псевдокод, отражающий последовательность действий в алгоритме метода. Перечислим основные ступени в данном методе:&lt;br /&gt;
* Прежде чем войти в цикл, происходит инициализация констант &amp;lt;math&amp;gt;\Beta_0,q_0&amp;lt;/math&amp;gt;, вычисление нормы вектора начального приближения &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и нормализация этого вектора.&lt;br /&gt;
* Затем, в цикле, происходит: &lt;br /&gt;
**поиск вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, являющегося результатом применения матричного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;; &lt;br /&gt;
**скалярное произведение двух векторов &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**вычисляется линейная комбинация векторов; &lt;br /&gt;
**вычисляется норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**проверяется условие выхода из цикла (равенство нулю нормы вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;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;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Посчитаем количество операций, необходимых для поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений и векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; действий для умножения матрицы на вектор&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; действия для перемножения двух векторов&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  операций для поэлементного сложения или вычитания двух векторов&lt;br /&gt;
* для отыскания нормы вектора помимо &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  сложений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  умножений требуется 1 операция извлечения корня&lt;br /&gt;
* для поиска собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; требуется &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарно для одной итерации алгоритма требуется совершить  &amp;lt;math&amp;gt;O(n^2)+O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
В данном разделе представлен информационный граф алгоритма, дающий представление о переходе от одной итерации к другой.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Информационный_граф_1.png|1000px|thumb|center| &amp;lt;math&amp;gt;||x||&amp;lt;/math&amp;gt; - операция вычисления нормы;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; - операция деления;&lt;br /&gt;
• - операция скалярного умножения векторов;&lt;br /&gt;
Ax - операция применения оператора A к вектору x;&lt;br /&gt;
F - операция вычисления линейной комбинации.&lt;br /&gt;
Желтый ромб символизирует проверку логического условия выхода из итерационного цикла (в случае если посчитанная норма равна нулю).&lt;br /&gt;
Input,Out - входные и выходные данные.]]&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;n\times n&amp;lt;/math&amp;gt; на вектор размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
В свою очередь ресурс параллелизма операции поиска собственных значений зависит от выбранного способа и не рассматривается в данной статье.&lt;br /&gt;
&lt;br /&gt;
Таким образом, с точки зрения ресурса параллелизма, алгоритм Ланцоша обладает линейной сложностью по ширине ЯПФ и квадратичной сложностью по высоте ЯПФ. Основное время работы алгоритма будет уделено операции умножения матрицы на вектор, имеющей ширину яруса &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;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;A&amp;lt;/math&amp;gt;, следовательно на вход данный алгоритм во всяком случае получает 1 число и 1 матрицу размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;. Помимо этого для начала работы алгоритму нужен некоторый вектор &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; начального приближения размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, который тоже является входными данными.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После окончания работы алгоритма мы получаем набор собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, состоящий из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; элементов. Если помимо собственных значений выводятся еще и полученные собственные векторы, то суммарный объём всех таких векторов составляет &amp;lt;math&amp;gt;k\times n&amp;lt;/math&amp;gt; элементов. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, совокупный объём входных данных составляет: &amp;lt;math&amp;gt;n^2+n+1&amp;lt;/math&amp;gt; элемент, а на выходе получаем &amp;lt;math&amp;gt;k(n+1)&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;lt;math&amp;gt;A&amp;lt;/math&amp;gt;) начиная с максимального в абсолютном смысле значения. Это выгодно отличает данный алгоритм с точки зрения поиска собственных значений матрицы, находящихся по краям её спектра.&lt;br /&gt;
&lt;br /&gt;
Не является полностью детерминированным, т.к. может досрочно завершить работу, если будут найдены все ненулевые собственные значения.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма (то есть отношение числа операций к суммарному объему входных и выходных данных) равна &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+2n+1}&amp;lt;/math&amp;gt;. Следовательно порядок мощности алгоритма примерно равен &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;, при &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В случае использования метода вычисления собственных значений с линейной сложностью, соотношение последовательной и параллельной сложностей будет равно &amp;lt;math&amp;gt;(k ^ 2 + n ^ 2) / (k  + 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;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма=== &lt;br /&gt;
=== Выводы для классов архитектур=== &lt;br /&gt;
=== Существующие реализации алгоритма===&lt;br /&gt;
&lt;br /&gt;
В настоящее время алгоритм Ланцоша поиска собственных значений квадратной симметричной матрицы включён в несколько библиотек и реализован на различных языках, среди которых такие наиболее распространенные как &#039;&#039;&#039;C&#039;&#039;&#039;, &#039;&#039;&#039;C++&#039;&#039;&#039;, &#039;&#039;&#039;FORTRAN77/90&#039;&#039;&#039;, &#039;&#039;&#039;MathLab&#039;&#039;&#039;.&lt;br /&gt;
Так, например, в языке &#039;&#039;&#039;MathLab&#039;&#039;&#039; во встроенном пакете &#039;&#039;&#039;ARPACK&#039;&#039;&#039; найти собственные значения методом Ланцоша можно при помощи вызова функции &#039;&#039;eigs()&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
На языке &#039;&#039;&#039;С&#039;&#039;&#039; существует библиотека &#039;&#039;&#039;[http://www.cs.wm.edu/~andreas/software/ PRIMME]&#039;&#039;&#039;, название которой расшифровывается как PReconditioned Iterative MultiMethod Eigensolver (итерационные методы поиска собственных значений с предусловием).&lt;br /&gt;
&lt;br /&gt;
Библиотека &#039;&#039;&#039;[http://www.nag.co.uk NAG] Numerical Library&#039;&#039;&#039; также содержит обширный набор функций, позволяющих проводить математический анализ, среди которых есть и реализация алгоритма Ланцоша. Библиотека доступна в трех пакетах: NAG C Library, NAG Fortran Library и NAG Library for .NET, совместна со многими языками и с основными операционными системами (Windows, Linux and OS X, а также Solaris, AIX и HP-UX).&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] Дж. Деммель «Вычислительная линейная алгебра», с 381.&lt;br /&gt;
&lt;br /&gt;
[2] Wikipedia https://en.wikipedia.org/wiki/Lanczos_algorithm&lt;br /&gt;
&lt;br /&gt;
[3] &amp;quot;[https://static.ph.ed.ac.uk/dissertations/hpc-msc/2013-2014/Investigation%20and%20Implementation%20of%20an%20Eigensolver%20Method.pdf Investigation and Implementation of an Eigensolver Method]&amp;quot;, Jorge Moreira, The University of Edinburgh, August 2014&lt;br /&gt;
&lt;br /&gt;
[4] &amp;quot;[http://www.physics.drexel.edu/~bob/Term_Reports/Hoppe_01.pdf Lanczos Vector Procedures]&amp;quot;, Travis Hoppe&lt;br /&gt;
&lt;br /&gt;
[5] &amp;quot;[http://pochenfullwave.ddns.net/wp-content/uploads/2015/09/61309283-Parallel-Scientific-Computing-in-C-and-MPI-2003.pdf Parallel Scientific Computing in C++ and MPI]&amp;quot;,&lt;br /&gt;
A seamless approach to parallel algorithms and their implementation,&lt;br /&gt;
George Em Karniadakis and Robert M. Kirby II,&lt;br /&gt;
Cambridge University Press&lt;/div&gt;</summary>
		<author><name>Alexbashirov</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=19994</id>
		<title>Участник:Alexbashirov/Алгоритм Ланцоша для точной арифметики</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=19994"/>
		<updated>2016-12-03T19:57:37Z</updated>

		<summary type="html">&lt;p&gt;Alexbashirov: /* Схема последовательной реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[Участник: Alexbashirov|Баширов А.Д.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name             = Алгоритм Ланцоша для точной арифметики&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;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;
Алгоритм Ланцоша является итерационным алгоритмом поиска собственных значений симметричной матрицы, разработанным венгерским физиком и математиком XX столетия Корнелием Ланцошем в 1950 году. Алгоритм совмещает в себе два других алгоритма: алгоритм построения подпространства Крылова (который также был создан Ланцошем) и процедуру Рэлея-Ритца приближения собственных значений матрицы. Алгоритм является вариацией степенного метода, позволяющего найти собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-го порядка. Однако в алгоритме число итераций ограничено некоторым &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;. Несмотря на заявленную вычислительную эффективность, алгоритм не получил широкого применения в своём первоначальном виде, ввиду его неустойчивости. 20 лет спустя, в 1970 году ученые Ojalvo и Newman показали доработанный алгоритм Ланцоша, который теперь стал устойчивым а также предложили способ выбора вектора начального приближения &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt;. Полученный последователями Ланцоша алгоритм получил название &amp;quot;Алгоритм Ланцоша с полной переортогонализацией&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма===&lt;br /&gt;
Алгоритм Ланцоша работает с вещественной симметричной матрицей &amp;lt;math&amp;gt;A=A^T&amp;lt;/math&amp;gt;, таким образом в памяти достаточно хранить лишь немногим более половины элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Прежде чем переходить к описанию алгоритма, следует упомянуть следующие понятия: подпространство Крылова и процесс Рэлея-Ритца, о которых уже было сказано в исторической справке выше. &lt;br /&gt;
Подпространством Крылова называется набор векторов&amp;lt;math&amp;gt;K_n =[b,Ab,A^2b,...,A^{n-1}b]&amp;lt;/math&amp;gt;. Начав свою работу с произвольного вектора &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, степенной метод вычисляет вектора &amp;lt;math&amp;gt;Ab, A^2b,...,A^{n-1}b&amp;lt;/math&amp;gt; итерационно сохраняя полученный результат в вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Полученная последовательность векторов сходится к собственному вектору, отвечающему максимальному собственному значению &amp;lt;math&amp;gt;\lambda_{max}&amp;lt;/math&amp;gt;. Однако, использование лишь последнего полученного вектора и потеря всех предшествующих посчитанных величин не всегда является наилучшим выбором. Поэтому сохранив все вектора и объединив их в одну матрицу мы получим так называемую &amp;lt;i&amp;gt;матрицу Крылова  &amp;lt;/i&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K_j = [b,Ab,A^2b,...,A^{j-1}b]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Столбцы получившейся матрицы не ортогональны, однако их можно ортогонализовать, применив процесс Грамма-Шмидта. Получившиеся вектора будут составлять базис подпространства Крылова &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt;. Можно ожидать, что вектора полученного базиса будут достаточно хорошо приближать &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; собственных векторов, отвечающих &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; наибольшим собственным значения.&lt;br /&gt;
&lt;br /&gt;
Затем с использованием полученной матрицы из ортогональных векторов &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt; мы получим трехдиагональную матрицу &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; на основе исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
Наконец, к полученной матрице &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; будет применяться &amp;lt;i&amp;gt;процесс Рэлея-Ритца&amp;lt;/i&amp;gt;, который найдет собственные значения трехдиагональной матрицы. В последствии эти значения и будут приближениями искомых собственных значений исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма Ланцоша, то есть наиболее ресурсно-затратной частью алгоритма, является шаг на котором на каждой итерации происходит перемножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;, полученный на предыдущей итерации. Полученный в результате умножения вектор обозначается &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; z=Aq_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;Q_j=[q_1,q_2,...q_j]&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортонормированных вектров Ланцоша и последующее формирование трехдиагональной матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;. Число таких векторов и, следовательно, размер матрицы растет с каждой итерацией. Итерационный процесс завершается при &amp;lt;math&amp;gt;j=k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На долю второй части алгоритма приходится поиск собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;, полученной в первой части.&lt;br /&gt;
&lt;br /&gt;
=== Схема последовательной реализации алгоритма ===&lt;br /&gt;
&amp;lt;math&amp;gt;q=b/||b||_2&amp;lt;/math&amp;gt;&lt;br /&gt;
[[Файл:Ланцош_Схема реализации.png|800px]]&lt;br /&gt;
&lt;br /&gt;
На рисунке выше представлен псевдокод, отражающий последовательность действий в алгоритме метода. Перечислим основные ступени в данном методе:&lt;br /&gt;
* Прежде чем войти в цикл, происходит инициализация констант &amp;lt;math&amp;gt;\Beta_0,q_0&amp;lt;/math&amp;gt;, вычисление нормы вектора начального приближения &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и нормализация этого вектора.&lt;br /&gt;
* Затем, в цикле, происходит: &lt;br /&gt;
**поиск вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, являющегося результатом применения матричного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;; &lt;br /&gt;
**скалярное произведение двух векторов &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**вычисляется линейная комбинация векторов; &lt;br /&gt;
**вычисляется норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**проверяется условие выхода из цикла (равенство нулю нормы вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;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;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Посчитаем количество операций, необходимых для поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений и векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; действий для умножения матрицы на вектор&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; действия для перемножения двух векторов&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  операций для поэлементного сложения или вычитания двух векторов&lt;br /&gt;
* для отыскания нормы вектора помимо &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  сложений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  умножений требуется 1 операция извлечения корня&lt;br /&gt;
* для поиска собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; требуется &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарно для одной итерации алгоритма требуется совершить  &amp;lt;math&amp;gt;O(n^2)+O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
В данном разделе представлен информационный граф алгоритма, дающий представление о переходе от одной итерации к другой.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Информационный_граф_1.png|1000px|thumb|center| &amp;lt;math&amp;gt;||x||&amp;lt;/math&amp;gt; - операция вычисления нормы;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; - операция деления;&lt;br /&gt;
• - операция скалярного умножения векторов;&lt;br /&gt;
Ax - операция применения оператора A к вектору x;&lt;br /&gt;
F - операция вычисления линейной комбинации.&lt;br /&gt;
Желтый ромб символизирует проверку логического условия выхода из итерационного цикла (в случае если посчитанная норма равна нулю).&lt;br /&gt;
Input,Out - входные и выходные данные.]]&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;n\times n&amp;lt;/math&amp;gt; на вектор размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
В свою очередь ресурс параллелизма операции поиска собственных значений зависит от выбранного способа и не рассматривается в данной статье.&lt;br /&gt;
&lt;br /&gt;
Таким образом, с точки зрения ресурса параллелизма, алгоритм Ланцоша обладает линейной сложностью по ширине ЯПФ и квадратичной сложностью по высоте ЯПФ. Основное время работы алгоритма будет уделено операции умножения матрицы на вектор, имеющей ширину яруса &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;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;A&amp;lt;/math&amp;gt;, следовательно на вход данный алгоритм во всяком случае получает 1 число и 1 матрицу размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;. Помимо этого для начала работы алгоритму нужен некоторый вектор &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; начального приближения размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, который тоже является входными данными.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После окончания работы алгоритма мы получаем набор собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, состоящий из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; элементов. Если помимо собственных значений выводятся еще и полученные собственные векторы, то суммарный объём всех таких векторов составляет &amp;lt;math&amp;gt;k\times n&amp;lt;/math&amp;gt; элементов. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, совокупный объём входных данных составляет: &amp;lt;math&amp;gt;n^2+n+1&amp;lt;/math&amp;gt; элемент, а на выходе получаем &amp;lt;math&amp;gt;k(n+1)&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;lt;math&amp;gt;A&amp;lt;/math&amp;gt;) начиная с максимального в абсолютном смысле значения. Это выгодно отличает данный алгоритм с точки зрения поиска собственных значений матрицы, находящихся по краям её спектра.&lt;br /&gt;
&lt;br /&gt;
Не является полностью детерминированным, т.к. может досрочно завершить работу, если будут найдены все ненулевые собственные значения.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма (то есть отношение числа операций к суммарному объему входных и выходных данных) равна &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+2n+1}&amp;lt;/math&amp;gt;. Следовательно порядок мощности алгоритма примерно равен &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;, при &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В случае использования метода вычисления собственных значений с линейной сложностью, соотношение последовательной и параллельной сложностей будет равно &amp;lt;math&amp;gt;(k ^ 2 + n ^ 2) / (k  + 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;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма=== &lt;br /&gt;
=== Выводы для классов архитектур=== &lt;br /&gt;
=== Существующие реализации алгоритма===&lt;br /&gt;
&lt;br /&gt;
В настоящее время алгоритм Ланцоша поиска собственных значений квадратной симметричной матрицы включён в несколько библиотек и реализован на различных языках, среди которых такие наиболее распространенные как &#039;&#039;&#039;C&#039;&#039;&#039;, &#039;&#039;&#039;C++&#039;&#039;&#039;, &#039;&#039;&#039;FORTRAN77/90&#039;&#039;&#039;, &#039;&#039;&#039;MathLab&#039;&#039;&#039;.&lt;br /&gt;
Так, например, в языке &#039;&#039;&#039;MathLab&#039;&#039;&#039; во встроенном пакете &#039;&#039;&#039;ARPACK&#039;&#039;&#039; найти собственные значения методом Ланцоша можно при помощи вызова функции &#039;&#039;eigs()&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
На языке &#039;&#039;&#039;С&#039;&#039;&#039; существует библиотека &#039;&#039;&#039;[http://www.cs.wm.edu/~andreas/software/ PRIMME]&#039;&#039;&#039;, название которой расшифровывается как PReconditioned Iterative MultiMethod Eigensolver (итерационные методы поиска собственных значений с предусловием).&lt;br /&gt;
&lt;br /&gt;
Библиотека &#039;&#039;&#039;[http://www.nag.co.uk NAG] Numerical Library&#039;&#039;&#039; также содержит обширный набор функций, позволяющих проводить математический анализ, среди которых есть и реализация алгоритма Ланцоша. Библиотека доступна в трех пакетах: NAG C Library, NAG Fortran Library и NAG Library for .NET, совместна со многими языками и с основными операционными системами (Windows, Linux and OS X, а также Solaris, AIX и HP-UX).&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] Дж. Деммель «Вычислительная линейная алгебра», с 381.&lt;br /&gt;
&lt;br /&gt;
[2] Wikipedia https://en.wikipedia.org/wiki/Lanczos_algorithm&lt;br /&gt;
&lt;br /&gt;
[3] &amp;quot;[https://static.ph.ed.ac.uk/dissertations/hpc-msc/2013-2014/Investigation%20and%20Implementation%20of%20an%20Eigensolver%20Method.pdf Investigation and Implementation of an Eigensolver Method]&amp;quot;, Jorge Moreira, The University of Edinburgh, August 2014&lt;br /&gt;
&lt;br /&gt;
[4] &amp;quot;[http://www.physics.drexel.edu/~bob/Term_Reports/Hoppe_01.pdf Lanczos Vector Procedures]&amp;quot;, Travis Hoppe&lt;br /&gt;
&lt;br /&gt;
[5] &amp;quot;[http://pochenfullwave.ddns.net/wp-content/uploads/2015/09/61309283-Parallel-Scientific-Computing-in-C-and-MPI-2003.pdf Parallel Scientific Computing in C++ and MPI]&amp;quot;,&lt;br /&gt;
A seamless approach to parallel algorithms and their implementation,&lt;br /&gt;
George Em Karniadakis and Robert M. Kirby II,&lt;br /&gt;
Cambridge University Press&lt;/div&gt;</summary>
		<author><name>Alexbashirov</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=19993</id>
		<title>Обсуждение участника:Alexbashirov/Алгоритм Ланцоша для точной арифметики</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=19993"/>
		<updated>2016-12-03T19:47:03Z</updated>

		<summary type="html">&lt;p&gt;Alexbashirov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Замечания ===&lt;br /&gt;
* [DONE] убрать название пункта &amp;quot;1.1.1 История&amp;quot;, а сам текст оставить.&lt;br /&gt;
* [DONE] 1.2 вместо ужирнения текста &amp;quot;матрицу Крылова&amp;quot;, &amp;quot;процесс Рэлея-Ритца&amp;quot; лучше использовать наклон, т.к. ужирнение занято для заголовков&lt;br /&gt;
* 1.5 скан алгоритма заменить на набранный текст вместо фото из книжки&lt;br /&gt;
* 1.7 добавить словесное описание графа&lt;br /&gt;
* 1.8 &amp;quot;процесс поиска собственных значений&amp;quot; - уточнить&lt;br /&gt;
* [DONE] 1.10 &amp;quot;...векторов с 3-ух до 2-ух.&amp;quot; - лучше полностью написать словами без &amp;quot;ух&amp;quot;-ов.&lt;br /&gt;
* 2.1-2.6 отсутствуют...&lt;/div&gt;</summary>
		<author><name>Alexbashirov</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=19992</id>
		<title>Участник:Alexbashirov/Алгоритм Ланцоша для точной арифметики</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=19992"/>
		<updated>2016-12-03T19:45:37Z</updated>

		<summary type="html">&lt;p&gt;Alexbashirov: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[Участник: Alexbashirov|Баширов А.Д.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name             = Алгоритм Ланцоша для точной арифметики&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;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;
Алгоритм Ланцоша является итерационным алгоритмом поиска собственных значений симметричной матрицы, разработанным венгерским физиком и математиком XX столетия Корнелием Ланцошем в 1950 году. Алгоритм совмещает в себе два других алгоритма: алгоритм построения подпространства Крылова (который также был создан Ланцошем) и процедуру Рэлея-Ритца приближения собственных значений матрицы. Алгоритм является вариацией степенного метода, позволяющего найти собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-го порядка. Однако в алгоритме число итераций ограничено некоторым &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;. Несмотря на заявленную вычислительную эффективность, алгоритм не получил широкого применения в своём первоначальном виде, ввиду его неустойчивости. 20 лет спустя, в 1970 году ученые Ojalvo и Newman показали доработанный алгоритм Ланцоша, который теперь стал устойчивым а также предложили способ выбора вектора начального приближения &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt;. Полученный последователями Ланцоша алгоритм получил название &amp;quot;Алгоритм Ланцоша с полной переортогонализацией&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма===&lt;br /&gt;
Алгоритм Ланцоша работает с вещественной симметричной матрицей &amp;lt;math&amp;gt;A=A^T&amp;lt;/math&amp;gt;, таким образом в памяти достаточно хранить лишь немногим более половины элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Прежде чем переходить к описанию алгоритма, следует упомянуть следующие понятия: подпространство Крылова и процесс Рэлея-Ритца, о которых уже было сказано в исторической справке выше. &lt;br /&gt;
Подпространством Крылова называется набор векторов&amp;lt;math&amp;gt;K_n =[b,Ab,A^2b,...,A^{n-1}b]&amp;lt;/math&amp;gt;. Начав свою работу с произвольного вектора &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, степенной метод вычисляет вектора &amp;lt;math&amp;gt;Ab, A^2b,...,A^{n-1}b&amp;lt;/math&amp;gt; итерационно сохраняя полученный результат в вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Полученная последовательность векторов сходится к собственному вектору, отвечающему максимальному собственному значению &amp;lt;math&amp;gt;\lambda_{max}&amp;lt;/math&amp;gt;. Однако, использование лишь последнего полученного вектора и потеря всех предшествующих посчитанных величин не всегда является наилучшим выбором. Поэтому сохранив все вектора и объединив их в одну матрицу мы получим так называемую &amp;lt;i&amp;gt;матрицу Крылова  &amp;lt;/i&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K_j = [b,Ab,A^2b,...,A^{j-1}b]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Столбцы получившейся матрицы не ортогональны, однако их можно ортогонализовать, применив процесс Грамма-Шмидта. Получившиеся вектора будут составлять базис подпространства Крылова &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt;. Можно ожидать, что вектора полученного базиса будут достаточно хорошо приближать &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; собственных векторов, отвечающих &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; наибольшим собственным значения.&lt;br /&gt;
&lt;br /&gt;
Затем с использованием полученной матрицы из ортогональных векторов &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt; мы получим трехдиагональную матрицу &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; на основе исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
Наконец, к полученной матрице &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; будет применяться &amp;lt;i&amp;gt;процесс Рэлея-Ритца&amp;lt;/i&amp;gt;, который найдет собственные значения трехдиагональной матрицы. В последствии эти значения и будут приближениями искомых собственных значений исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма Ланцоша, то есть наиболее ресурсно-затратной частью алгоритма, является шаг на котором на каждой итерации происходит перемножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;, полученный на предыдущей итерации. Полученный в результате умножения вектор обозначается &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; z=Aq_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;Q_j=[q_1,q_2,...q_j]&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортонормированных вектров Ланцоша и последующее формирование трехдиагональной матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;. Число таких векторов и, следовательно, размер матрицы растет с каждой итерацией. Итерационный процесс завершается при &amp;lt;math&amp;gt;j=k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На долю второй части алгоритма приходится поиск собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;, полученной в первой части.&lt;br /&gt;
&lt;br /&gt;
=== Схема последовательной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ланцош_Схема реализации.png|800px]]&lt;br /&gt;
&lt;br /&gt;
На рисунке выше представлен псевдокод, отражающий последовательность действий в алгоритме метода. Перечислим основные ступени в данном методе:&lt;br /&gt;
* Прежде чем войти в цикл, происходит инициализация констант &amp;lt;math&amp;gt;\Beta_0,q_0&amp;lt;/math&amp;gt;, вычисление нормы вектора начального приближения &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и нормализация этого вектора.&lt;br /&gt;
* Затем, в цикле, происходит: &lt;br /&gt;
**поиск вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, являющегося результатом применения матричного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;; &lt;br /&gt;
**скалярное произведение двух векторов &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**вычисляется линейная комбинация векторов; &lt;br /&gt;
**вычисляется норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**проверяется условие выхода из цикла (равенство нулю нормы вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;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;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Посчитаем количество операций, необходимых для поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений и векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; действий для умножения матрицы на вектор&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; действия для перемножения двух векторов&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  операций для поэлементного сложения или вычитания двух векторов&lt;br /&gt;
* для отыскания нормы вектора помимо &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  сложений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  умножений требуется 1 операция извлечения корня&lt;br /&gt;
* для поиска собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; требуется &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарно для одной итерации алгоритма требуется совершить  &amp;lt;math&amp;gt;O(n^2)+O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
В данном разделе представлен информационный граф алгоритма, дающий представление о переходе от одной итерации к другой.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Информационный_граф_1.png|1000px|thumb|center| &amp;lt;math&amp;gt;||x||&amp;lt;/math&amp;gt; - операция вычисления нормы;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; - операция деления;&lt;br /&gt;
• - операция скалярного умножения векторов;&lt;br /&gt;
Ax - операция применения оператора A к вектору x;&lt;br /&gt;
F - операция вычисления линейной комбинации.&lt;br /&gt;
Желтый ромб символизирует проверку логического условия выхода из итерационного цикла (в случае если посчитанная норма равна нулю).&lt;br /&gt;
Input,Out - входные и выходные данные.]]&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;n\times n&amp;lt;/math&amp;gt; на вектор размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
В свою очередь ресурс параллелизма операции поиска собственных значений зависит от выбранного способа и не рассматривается в данной статье.&lt;br /&gt;
&lt;br /&gt;
Таким образом, с точки зрения ресурса параллелизма, алгоритм Ланцоша обладает линейной сложностью по ширине ЯПФ и квадратичной сложностью по высоте ЯПФ. Основное время работы алгоритма будет уделено операции умножения матрицы на вектор, имеющей ширину яруса &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;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;A&amp;lt;/math&amp;gt;, следовательно на вход данный алгоритм во всяком случае получает 1 число и 1 матрицу размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;. Помимо этого для начала работы алгоритму нужен некоторый вектор &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; начального приближения размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, который тоже является входными данными.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После окончания работы алгоритма мы получаем набор собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, состоящий из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; элементов. Если помимо собственных значений выводятся еще и полученные собственные векторы, то суммарный объём всех таких векторов составляет &amp;lt;math&amp;gt;k\times n&amp;lt;/math&amp;gt; элементов. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, совокупный объём входных данных составляет: &amp;lt;math&amp;gt;n^2+n+1&amp;lt;/math&amp;gt; элемент, а на выходе получаем &amp;lt;math&amp;gt;k(n+1)&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;lt;math&amp;gt;A&amp;lt;/math&amp;gt;) начиная с максимального в абсолютном смысле значения. Это выгодно отличает данный алгоритм с точки зрения поиска собственных значений матрицы, находящихся по краям её спектра.&lt;br /&gt;
&lt;br /&gt;
Не является полностью детерминированным, т.к. может досрочно завершить работу, если будут найдены все ненулевые собственные значения.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма (то есть отношение числа операций к суммарному объему входных и выходных данных) равна &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+2n+1}&amp;lt;/math&amp;gt;. Следовательно порядок мощности алгоритма примерно равен &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;, при &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В случае использования метода вычисления собственных значений с линейной сложностью, соотношение последовательной и параллельной сложностей будет равно &amp;lt;math&amp;gt;(k ^ 2 + n ^ 2) / (k  + 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;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма=== &lt;br /&gt;
=== Выводы для классов архитектур=== &lt;br /&gt;
=== Существующие реализации алгоритма===&lt;br /&gt;
&lt;br /&gt;
В настоящее время алгоритм Ланцоша поиска собственных значений квадратной симметричной матрицы включён в несколько библиотек и реализован на различных языках, среди которых такие наиболее распространенные как &#039;&#039;&#039;C&#039;&#039;&#039;, &#039;&#039;&#039;C++&#039;&#039;&#039;, &#039;&#039;&#039;FORTRAN77/90&#039;&#039;&#039;, &#039;&#039;&#039;MathLab&#039;&#039;&#039;.&lt;br /&gt;
Так, например, в языке &#039;&#039;&#039;MathLab&#039;&#039;&#039; во встроенном пакете &#039;&#039;&#039;ARPACK&#039;&#039;&#039; найти собственные значения методом Ланцоша можно при помощи вызова функции &#039;&#039;eigs()&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
На языке &#039;&#039;&#039;С&#039;&#039;&#039; существует библиотека &#039;&#039;&#039;[http://www.cs.wm.edu/~andreas/software/ PRIMME]&#039;&#039;&#039;, название которой расшифровывается как PReconditioned Iterative MultiMethod Eigensolver (итерационные методы поиска собственных значений с предусловием).&lt;br /&gt;
&lt;br /&gt;
Библиотека &#039;&#039;&#039;[http://www.nag.co.uk NAG] Numerical Library&#039;&#039;&#039; также содержит обширный набор функций, позволяющих проводить математический анализ, среди которых есть и реализация алгоритма Ланцоша. Библиотека доступна в трех пакетах: NAG C Library, NAG Fortran Library и NAG Library for .NET, совместна со многими языками и с основными операционными системами (Windows, Linux and OS X, а также Solaris, AIX и HP-UX).&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] Дж. Деммель «Вычислительная линейная алгебра», с 381.&lt;br /&gt;
&lt;br /&gt;
[2] Wikipedia https://en.wikipedia.org/wiki/Lanczos_algorithm&lt;br /&gt;
&lt;br /&gt;
[3] &amp;quot;[https://static.ph.ed.ac.uk/dissertations/hpc-msc/2013-2014/Investigation%20and%20Implementation%20of%20an%20Eigensolver%20Method.pdf Investigation and Implementation of an Eigensolver Method]&amp;quot;, Jorge Moreira, The University of Edinburgh, August 2014&lt;br /&gt;
&lt;br /&gt;
[4] &amp;quot;[http://www.physics.drexel.edu/~bob/Term_Reports/Hoppe_01.pdf Lanczos Vector Procedures]&amp;quot;, Travis Hoppe&lt;br /&gt;
&lt;br /&gt;
[5] &amp;quot;[http://pochenfullwave.ddns.net/wp-content/uploads/2015/09/61309283-Parallel-Scientific-Computing-in-C-and-MPI-2003.pdf Parallel Scientific Computing in C++ and MPI]&amp;quot;,&lt;br /&gt;
A seamless approach to parallel algorithms and their implementation,&lt;br /&gt;
George Em Karniadakis and Robert M. Kirby II,&lt;br /&gt;
Cambridge University Press&lt;/div&gt;</summary>
		<author><name>Alexbashirov</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=19991</id>
		<title>Участник:Alexbashirov/Алгоритм Ланцоша для точной арифметики</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=19991"/>
		<updated>2016-12-03T19:44:40Z</updated>

		<summary type="html">&lt;p&gt;Alexbashirov: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[Участник: Alexbashirov|Баширов А.Д.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name             = Алгоритм Ланцоша для точной арифметики&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;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;
Алгоритм Ланцоша является итерационным алгоритмом поиска собственных значений симметричной матрицы, разработанным венгерским физиком и математиком XX столетия Корнелием Ланцошем в 1950 году. Алгоритм совмещает в себе два других алгоритма: алгоритм построения подпространства Крылова (который также был создан Ланцошем) и процедуру Рэлея-Ритца приближения собственных значений матрицы. Алгоритм является вариацией степенного метода, позволяющего найти собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-го порядка. Однако в алгоритме число итераций ограничено некоторым &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;. Несмотря на заявленную вычислительную эффективность, алгоритм не получил широкого применения в своём первоначальном виде, ввиду его неустойчивости. 20 лет спустя, в 1970 году ученые Ojalvo и Newman показали доработанный алгоритм Ланцоша, который теперь стал устойчивым а также предложили способ выбора вектора начального приближения &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt;. Полученный последователями Ланцоша алгоритм получил название &amp;quot;Алгоритм Ланцоша с полной переортогонализацией&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма===&lt;br /&gt;
Алгоритм Ланцоша работает с вещественной симметричной матрицей &amp;lt;math&amp;gt;A=A^T&amp;lt;/math&amp;gt;, таким образом в памяти достаточно хранить лишь немногим более половины элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Прежде чем переходить к описанию алгоритма, следует упомянуть следующие понятия: подпространство Крылова и процесс Рэлея-Ритца, о которых уже было сказано в исторической справке выше. &lt;br /&gt;
Подпространством Крылова называется набор векторов&amp;lt;math&amp;gt;K_n =[b,Ab,A^2b,...,A^{n-1}b]&amp;lt;/math&amp;gt;. Начав свою работу с произвольного вектора &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, степенной метод вычисляет вектора &amp;lt;math&amp;gt;Ab, A^2b,...,A^{n-1}b&amp;lt;/math&amp;gt; итерационно сохраняя полученный результат в вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Полученная последовательность векторов сходится к собственному вектору, отвечающему максимальному собственному значению &amp;lt;math&amp;gt;\lambda_{max}&amp;lt;/math&amp;gt;. Однако, использование лишь последнего полученного вектора и потеря всех предшествующих посчитанных величин не всегда является наилучшим выбором. Поэтому сохранив все вектора и объединив их в одну матрицу мы получим так называемую &amp;lt;i&amp;gt;матрицу Крылова  &amp;lt;/i&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K_j = [b,Ab,A^2b,...,A^{j-1}b]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Столбцы получившейся матрицы не ортогональны, однако их можно ортогонализовать, применив процесс Грамма-Шмидта. Получившиеся вектора будут составлять базис подпространства Крылова &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt;. Можно ожидать, что вектора полученного базиса будут достаточно хорошо приближать &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; собственных векторов, отвечающих &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; наибольшим собственным значения.&lt;br /&gt;
&lt;br /&gt;
Затем с использованием полученной матрицы из ортогональных векторов &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt; мы получим трехдиагональную матрицу &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; на основе исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
Наконец, к полученной матрице &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; будет применяться &amp;lt;i&amp;gt;процесс Рэлея-Ритца&amp;lt;/i&amp;gt;, который найдет собственные значения трехдиагональной матрицы. В последствии эти значения и будут приближениями искомых собственных значений исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма Ланцоша, то есть наиболее ресурсно-затратной частью алгоритма, является шаг на котором на каждой итерации происходит перемножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;, полученный на предыдущей итерации. Полученный в результате умножения вектор обозначается &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; z=Aq_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;Q_j=[q_1,q_2,...q_j]&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортонормированных вектров Ланцоша и последующее формирование трехдиагональной матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;. Число таких векторов и, следовательно, размер матрицы растет с каждой итерацией. Итерационный процесс завершается при &amp;lt;math&amp;gt;j=k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На долю второй части алгоритма приходится поиск собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;, полученной в первой части.&lt;br /&gt;
&lt;br /&gt;
=== Схема последовательной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ланцош_Схема реализации.png|800px]]&lt;br /&gt;
&lt;br /&gt;
На рисунке выше представлен псевдокод, отражающий последовательность действий в алгоритме метода. Перечислим основные ступени в данном методе:&lt;br /&gt;
* Прежде чем войти в цикл, происходит инициализация констант &amp;lt;math&amp;gt;\Beta_0,q_0&amp;lt;/math&amp;gt;, вычисление нормы вектора начального приближения &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и нормализация этого вектора.&lt;br /&gt;
* Затем, в цикле, происходит: &lt;br /&gt;
**поиск вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, являющегося результатом применения матричного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;; &lt;br /&gt;
**скалярное произведение двух векторов &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**вычисляется линейная комбинация векторов; &lt;br /&gt;
**вычисляется норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**проверяется условие выхода из цикла (равенство нулю нормы вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;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;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Посчитаем количество операций, необходимых для поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений и векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; действий для умножения матрицы на вектор&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; действия для перемножения двух векторов&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  операций для поэлементного сложения или вычитания двух векторов&lt;br /&gt;
* для отыскания нормы вектора помимо &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  сложений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  умножений требуется 1 операция извлечения корня&lt;br /&gt;
* для поиска собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; требуется &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарно для одной итерации алгоритма требуется совершить  &amp;lt;math&amp;gt;O(n^2)+O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
В данном разделе представлен информационный граф алгоритма, дающий представление о переходе от одной итерации к другой.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Информационный_граф_1.png|1000px|thumb|center| &amp;lt;math&amp;gt;||x||&amp;lt;/math&amp;gt; - операция вычисления нормы;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; - операция деления;&lt;br /&gt;
• - операция скалярного умножения векторов;&lt;br /&gt;
Ax - операция применения оператора A к вектору x;&lt;br /&gt;
F - операция вычисления линейной комбинации.&lt;br /&gt;
Желтый ромб символизирует проверку логического условия выхода из итерационного цикла (в случае если посчитанная норма равна нулю).&lt;br /&gt;
Input,Out - входные и выходные данные.]]&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;n\times n&amp;lt;/math&amp;gt; на вектор размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
В свою очередь ресурс параллелизма операции поиска собственных значений зависит от выбранного способа и не рассматривается в данной статье.&lt;br /&gt;
&lt;br /&gt;
Таким образом, с точки зрения ресурса параллелизма, алгоритм Ланцоша обладает линейной сложностью по ширине ЯПФ и квадратичной сложностью по высоте ЯПФ. Основное время работы алгоритма будет уделено операции умножения матрицы на вектор, имеющей ширину яруса &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;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;A&amp;lt;/math&amp;gt;, следовательно на вход данный алгоритм во всяком случае получает 1 число и 1 матрицу размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;. Помимо этого для начала работы алгоритму нужен некоторый вектор &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; начального приближения размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, который тоже является входными данными.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После окончания работы алгоритма мы получаем набор собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, состоящий из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; элементов. Если помимо собственных значений выводятся еще и полученные собственные векторы, то суммарный объём всех таких векторов составляет &amp;lt;math&amp;gt;k\times n&amp;lt;/math&amp;gt; элементов. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, совокупный объём входных данных составляет: &amp;lt;math&amp;gt;n^2+n+1&amp;lt;/math&amp;gt; элемент, а на выходе получаем &amp;lt;math&amp;gt;k(n+1)&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;lt;math&amp;gt;A&amp;lt;/math&amp;gt;) начиная с максимального в абсолютном смысле значения. Это выгодно отличает данный алгоритм с точки зрения поиска собственных значений матрицы, находящихся по краям её спектра.&lt;br /&gt;
&lt;br /&gt;
Не является полностью детерминированным, т.к. может досрочно завершить работу, если будут найдены все ненулевые собственные значения.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма (то есть отношение числа операций к суммарному объему входных и выходных данных) равна &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+2n+1}&amp;lt;/math&amp;gt;. Следовательно порядок мощности алгоритма примерно равен &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;, при &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В случае использования метода вычисления собственных значений с линейной сложностью, соотношение последовательной и параллельной сложностей будет равно &amp;lt;math&amp;gt;(k ^ 2 + n ^ 2) / (k  + n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша может быть модифицирован так, чтобы быть пригодным для применения к несимметричным системам.&lt;br /&gt;
&lt;br /&gt;
Существует усложнение алгоритма, которое позволяет сократить объём хранимых на каждой итерации векторов с 3-ух до 2-ух.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма=== &lt;br /&gt;
=== Локальность данных и вычислений=== &lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма=== &lt;br /&gt;
===  Масштабируемость алгоритма и его реализации===&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма=== &lt;br /&gt;
=== Выводы для классов архитектур=== &lt;br /&gt;
=== Существующие реализации алгоритма===&lt;br /&gt;
&lt;br /&gt;
В настоящее время алгоритм Ланцоша поиска собственных значений квадратной симметричной матрицы включён в несколько библиотек и реализован на различных языках, среди которых такие наиболее распространенные как &#039;&#039;&#039;C&#039;&#039;&#039;, &#039;&#039;&#039;C++&#039;&#039;&#039;, &#039;&#039;&#039;FORTRAN77/90&#039;&#039;&#039;, &#039;&#039;&#039;MathLab&#039;&#039;&#039;.&lt;br /&gt;
Так, например, в языке &#039;&#039;&#039;MathLab&#039;&#039;&#039; во встроенном пакете &#039;&#039;&#039;ARPACK&#039;&#039;&#039; найти собственные значения методом Ланцоша можно при помощи вызова функции &#039;&#039;eigs()&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
На языке &#039;&#039;&#039;С&#039;&#039;&#039; существует библиотека &#039;&#039;&#039;[http://www.cs.wm.edu/~andreas/software/ PRIMME]&#039;&#039;&#039;, название которой расшифровывается как PReconditioned Iterative MultiMethod Eigensolver (итерационные методы поиска собственных значений с предусловием).&lt;br /&gt;
&lt;br /&gt;
Библиотека &#039;&#039;&#039;[http://www.nag.co.uk NAG] Numerical Library&#039;&#039;&#039; также содержит обширный набор функций, позволяющих проводить математический анализ, среди которых есть и реализация алгоритма Ланцоша. Библиотека доступна в трех пакетах: NAG C Library, NAG Fortran Library и NAG Library for .NET, совместна со многими языками и с основными операционными системами (Windows, Linux and OS X, а также Solaris, AIX и HP-UX).&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] Дж. Деммель «Вычислительная линейная алгебра», с 381.&lt;br /&gt;
&lt;br /&gt;
[2] Wikipedia https://en.wikipedia.org/wiki/Lanczos_algorithm&lt;br /&gt;
&lt;br /&gt;
[3] &amp;quot;[https://static.ph.ed.ac.uk/dissertations/hpc-msc/2013-2014/Investigation%20and%20Implementation%20of%20an%20Eigensolver%20Method.pdf Investigation and Implementation of an Eigensolver Method]&amp;quot;, Jorge Moreira, The University of Edinburgh, August 2014&lt;br /&gt;
&lt;br /&gt;
[4] &amp;quot;[http://www.physics.drexel.edu/~bob/Term_Reports/Hoppe_01.pdf Lanczos Vector Procedures]&amp;quot;, Travis Hoppe&lt;br /&gt;
&lt;br /&gt;
[5] &amp;quot;[http://pochenfullwave.ddns.net/wp-content/uploads/2015/09/61309283-Parallel-Scientific-Computing-in-C-and-MPI-2003.pdf Parallel Scientific Computing in C++ and MPI]&amp;quot;,&lt;br /&gt;
A seamless approach to parallel algorithms and their implementation,&lt;br /&gt;
George Em Karniadakis and Robert M. Kirby II,&lt;br /&gt;
Cambridge University Press&lt;/div&gt;</summary>
		<author><name>Alexbashirov</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=19990</id>
		<title>Участник:Alexbashirov/Алгоритм Ланцоша для точной арифметики</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=19990"/>
		<updated>2016-12-03T19:44:08Z</updated>

		<summary type="html">&lt;p&gt;Alexbashirov: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[Участник: Alexbashirov|Баширов А.Д.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name             = Алгоритм Ланцоша для точной арифметики&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;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;
Алгоритм Ланцоша является итерационным алгоритмом поиска собственных значений симметричной матрицы, разработанным венгерским физиком и математиком XX столетия Корнелием Ланцошем в 1950 году. Алгоритм совмещает в себе два других алгоритма: алгоритм построения подпространства Крылова (который также был создан Ланцошем) и процедуру Рэлея-Ритца приближения собственных значений матрицы. Алгоритм является вариацией степенного метода, позволяющего найти собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-го порядка. Однако в алгоритме число итераций ограничено некоторым &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;. Несмотря на заявленную вычислительную эффективность, алгоритм не получил широкого применения в своём первоначальном виде, ввиду его неустойчивости. 20 лет спустя, в 1970 году ученые Ojalvo и Newman показали доработанный алгоритм Ланцоша, который теперь стал устойчивым а также предложили способ выбора вектора начального приближения &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt;. Полученный последователями Ланцоша алгоритм получил название &amp;quot;Алгоритм Ланцоша с полной переортогонализацией&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма===&lt;br /&gt;
Алгоритм Ланцоша работает с вещественной симметричной матрицей &amp;lt;math&amp;gt;A=A^T&amp;lt;/math&amp;gt;, таким образом в памяти достаточно хранить лишь немногим более половины элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Прежде чем переходить к описанию алгоритма, следует упомянуть следующие понятия: подпространство Крылова и процесс Рэлея-Ритца, о которых уже было сказано в исторической справке выше. &lt;br /&gt;
Подпространством Крылова называется набор векторов&amp;lt;math&amp;gt;K_n =[b,Ab,A^2b,...,A^{n-1}b]&amp;lt;/math&amp;gt;. Начав свою работу с произвольного вектора &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, степенной метод вычисляет вектора &amp;lt;math&amp;gt;Ab, A^2b,...,A^{n-1}b&amp;lt;/math&amp;gt; итерационно сохраняя полученный результат в вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Полученная последовательность векторов сходится к собственному вектору, отвечающему максимальному собственному значению &amp;lt;math&amp;gt;\lambda_{max}&amp;lt;/math&amp;gt;. Однако, использование лишь последнего полученного вектора и потеря всех предшествующих посчитанных величин не всегда является наилучшим выбором. Поэтому сохранив все вектора и объединив их в одну матрицу мы получим так называемую &amp;lt;i&amp;gt;матрицу Крылова  &amp;lt;/i&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K_j = [b,Ab,A^2b,...,A^{j-1}b]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Столбцы получившейся матрицы не ортогональны, однако их можно ортогонализовать, применив процесс Грамма-Шмидта. Получившиеся вектора будут составлять базис подпространства Крылова &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt;. Можно ожидать, что вектора полученного базиса будут достаточно хорошо приближать &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; собственных векторов, отвечающих &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; наибольшим собственным значения.&lt;br /&gt;
&lt;br /&gt;
Затем с использованием полученной матрицы из ортогональных векторов &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt; мы получим трехдиагональную матрицу &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; на основе исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
Наконец, к полученной матрице &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; будет применяться &#039;&#039;&#039;процесс Рэлея-Ритца&#039;&#039;&#039;, который найдет собственные значения трехдиагональной матрицы. В последствии эти значения и будут приближениями искомых собственных значений исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма Ланцоша, то есть наиболее ресурсно-затратной частью алгоритма, является шаг на котором на каждой итерации происходит перемножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;, полученный на предыдущей итерации. Полученный в результате умножения вектор обозначается &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; z=Aq_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;Q_j=[q_1,q_2,...q_j]&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортонормированных вектров Ланцоша и последующее формирование трехдиагональной матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;. Число таких векторов и, следовательно, размер матрицы растет с каждой итерацией. Итерационный процесс завершается при &amp;lt;math&amp;gt;j=k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На долю второй части алгоритма приходится поиск собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;, полученной в первой части.&lt;br /&gt;
&lt;br /&gt;
=== Схема последовательной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ланцош_Схема реализации.png|800px]]&lt;br /&gt;
&lt;br /&gt;
На рисунке выше представлен псевдокод, отражающий последовательность действий в алгоритме метода. Перечислим основные ступени в данном методе:&lt;br /&gt;
* Прежде чем войти в цикл, происходит инициализация констант &amp;lt;math&amp;gt;\Beta_0,q_0&amp;lt;/math&amp;gt;, вычисление нормы вектора начального приближения &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и нормализация этого вектора.&lt;br /&gt;
* Затем, в цикле, происходит: &lt;br /&gt;
**поиск вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, являющегося результатом применения матричного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;; &lt;br /&gt;
**скалярное произведение двух векторов &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**вычисляется линейная комбинация векторов; &lt;br /&gt;
**вычисляется норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**проверяется условие выхода из цикла (равенство нулю нормы вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;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;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Посчитаем количество операций, необходимых для поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений и векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; действий для умножения матрицы на вектор&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; действия для перемножения двух векторов&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  операций для поэлементного сложения или вычитания двух векторов&lt;br /&gt;
* для отыскания нормы вектора помимо &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  сложений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  умножений требуется 1 операция извлечения корня&lt;br /&gt;
* для поиска собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; требуется &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарно для одной итерации алгоритма требуется совершить  &amp;lt;math&amp;gt;O(n^2)+O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
В данном разделе представлен информационный граф алгоритма, дающий представление о переходе от одной итерации к другой.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Информационный_граф_1.png|1000px|thumb|center| &amp;lt;math&amp;gt;||x||&amp;lt;/math&amp;gt; - операция вычисления нормы;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; - операция деления;&lt;br /&gt;
• - операция скалярного умножения векторов;&lt;br /&gt;
Ax - операция применения оператора A к вектору x;&lt;br /&gt;
F - операция вычисления линейной комбинации.&lt;br /&gt;
Желтый ромб символизирует проверку логического условия выхода из итерационного цикла (в случае если посчитанная норма равна нулю).&lt;br /&gt;
Input,Out - входные и выходные данные.]]&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;n\times n&amp;lt;/math&amp;gt; на вектор размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
В свою очередь ресурс параллелизма операции поиска собственных значений зависит от выбранного способа и не рассматривается в данной статье.&lt;br /&gt;
&lt;br /&gt;
Таким образом, с точки зрения ресурса параллелизма, алгоритм Ланцоша обладает линейной сложностью по ширине ЯПФ и квадратичной сложностью по высоте ЯПФ. Основное время работы алгоритма будет уделено операции умножения матрицы на вектор, имеющей ширину яруса &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;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;A&amp;lt;/math&amp;gt;, следовательно на вход данный алгоритм во всяком случае получает 1 число и 1 матрицу размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;. Помимо этого для начала работы алгоритму нужен некоторый вектор &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; начального приближения размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, который тоже является входными данными.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После окончания работы алгоритма мы получаем набор собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, состоящий из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; элементов. Если помимо собственных значений выводятся еще и полученные собственные векторы, то суммарный объём всех таких векторов составляет &amp;lt;math&amp;gt;k\times n&amp;lt;/math&amp;gt; элементов. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, совокупный объём входных данных составляет: &amp;lt;math&amp;gt;n^2+n+1&amp;lt;/math&amp;gt; элемент, а на выходе получаем &amp;lt;math&amp;gt;k(n+1)&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;lt;math&amp;gt;A&amp;lt;/math&amp;gt;) начиная с максимального в абсолютном смысле значения. Это выгодно отличает данный алгоритм с точки зрения поиска собственных значений матрицы, находящихся по краям её спектра.&lt;br /&gt;
&lt;br /&gt;
Не является полностью детерминированным, т.к. может досрочно завершить работу, если будут найдены все ненулевые собственные значения.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма (то есть отношение числа операций к суммарному объему входных и выходных данных) равна &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+2n+1}&amp;lt;/math&amp;gt;. Следовательно порядок мощности алгоритма примерно равен &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;, при &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В случае использования метода вычисления собственных значений с линейной сложностью, соотношение последовательной и параллельной сложностей будет равно &amp;lt;math&amp;gt;(k ^ 2 + n ^ 2) / (k  + n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша может быть модифицирован так, чтобы быть пригодным для применения к несимметричным системам.&lt;br /&gt;
&lt;br /&gt;
Существует усложнение алгоритма, которое позволяет сократить объём хранимых на каждой итерации векторов с 3-ух до 2-ух.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма=== &lt;br /&gt;
=== Локальность данных и вычислений=== &lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма=== &lt;br /&gt;
===  Масштабируемость алгоритма и его реализации===&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма=== &lt;br /&gt;
=== Выводы для классов архитектур=== &lt;br /&gt;
=== Существующие реализации алгоритма===&lt;br /&gt;
&lt;br /&gt;
В настоящее время алгоритм Ланцоша поиска собственных значений квадратной симметричной матрицы включён в несколько библиотек и реализован на различных языках, среди которых такие наиболее распространенные как &#039;&#039;&#039;C&#039;&#039;&#039;, &#039;&#039;&#039;C++&#039;&#039;&#039;, &#039;&#039;&#039;FORTRAN77/90&#039;&#039;&#039;, &#039;&#039;&#039;MathLab&#039;&#039;&#039;.&lt;br /&gt;
Так, например, в языке &#039;&#039;&#039;MathLab&#039;&#039;&#039; во встроенном пакете &#039;&#039;&#039;ARPACK&#039;&#039;&#039; найти собственные значения методом Ланцоша можно при помощи вызова функции &#039;&#039;eigs()&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
На языке &#039;&#039;&#039;С&#039;&#039;&#039; существует библиотека &#039;&#039;&#039;[http://www.cs.wm.edu/~andreas/software/ PRIMME]&#039;&#039;&#039;, название которой расшифровывается как PReconditioned Iterative MultiMethod Eigensolver (итерационные методы поиска собственных значений с предусловием).&lt;br /&gt;
&lt;br /&gt;
Библиотека &#039;&#039;&#039;[http://www.nag.co.uk NAG] Numerical Library&#039;&#039;&#039; также содержит обширный набор функций, позволяющих проводить математический анализ, среди которых есть и реализация алгоритма Ланцоша. Библиотека доступна в трех пакетах: NAG C Library, NAG Fortran Library и NAG Library for .NET, совместна со многими языками и с основными операционными системами (Windows, Linux and OS X, а также Solaris, AIX и HP-UX).&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] Дж. Деммель «Вычислительная линейная алгебра», с 381.&lt;br /&gt;
&lt;br /&gt;
[2] Wikipedia https://en.wikipedia.org/wiki/Lanczos_algorithm&lt;br /&gt;
&lt;br /&gt;
[3] &amp;quot;[https://static.ph.ed.ac.uk/dissertations/hpc-msc/2013-2014/Investigation%20and%20Implementation%20of%20an%20Eigensolver%20Method.pdf Investigation and Implementation of an Eigensolver Method]&amp;quot;, Jorge Moreira, The University of Edinburgh, August 2014&lt;br /&gt;
&lt;br /&gt;
[4] &amp;quot;[http://www.physics.drexel.edu/~bob/Term_Reports/Hoppe_01.pdf Lanczos Vector Procedures]&amp;quot;, Travis Hoppe&lt;br /&gt;
&lt;br /&gt;
[5] &amp;quot;[http://pochenfullwave.ddns.net/wp-content/uploads/2015/09/61309283-Parallel-Scientific-Computing-in-C-and-MPI-2003.pdf Parallel Scientific Computing in C++ and MPI]&amp;quot;,&lt;br /&gt;
A seamless approach to parallel algorithms and their implementation,&lt;br /&gt;
George Em Karniadakis and Robert M. Kirby II,&lt;br /&gt;
Cambridge University Press&lt;/div&gt;</summary>
		<author><name>Alexbashirov</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=19989</id>
		<title>Участник:Alexbashirov/Алгоритм Ланцоша для точной арифметики</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=19989"/>
		<updated>2016-12-03T19:43:06Z</updated>

		<summary type="html">&lt;p&gt;Alexbashirov: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[Участник: Alexbashirov|Баширов А.Д.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name             = Алгоритм Ланцоша для точной арифметики&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;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;
Алгоритм Ланцоша является итерационным алгоритмом поиска собственных значений симметричной матрицы, разработанным венгерским физиком и математиком XX столетия Корнелием Ланцошем в 1950 году. Алгоритм совмещает в себе два других алгоритма: алгоритм построения подпространства Крылова (который также был создан Ланцошем) и процедуру Рэлея-Ритца приближения собственных значений матрицы. Алгоритм является вариацией степенного метода, позволяющего найти собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-го порядка. Однако в алгоритме число итераций ограничено некоторым &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;. Несмотря на заявленную вычислительную эффективность, алгоритм не получил широкого применения в своём первоначальном виде, ввиду его неустойчивости. 20 лет спустя, в 1970 году ученые Ojalvo и Newman показали доработанный алгоритм Ланцоша, который теперь стал устойчивым а также предложили способ выбора вектора начального приближения &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt;. Полученный последователями Ланцоша алгоритм получил название &amp;quot;Алгоритм Ланцоша с полной переортогонализацией&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма===&lt;br /&gt;
Алгоритм Ланцоша работает с вещественной симметричной матрицей &amp;lt;math&amp;gt;A=A^T&amp;lt;/math&amp;gt;, таким образом в памяти достаточно хранить лишь немногим более половины элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Прежде чем переходить к описанию алгоритма, следует упомянуть следующие понятия: подпространство Крылова и процесс Рэлея-Ритца, о которых уже было сказано в исторической справке выше. &lt;br /&gt;
Подпространством Крылова называется набор векторов&amp;lt;math&amp;gt;K_n =[b,Ab,A^2b,...,A^{n-1}b]&amp;lt;/math&amp;gt;. Начав свою работу с произвольного вектора &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, степенной метод вычисляет вектора &amp;lt;math&amp;gt;Ab, A^2b,...,A^{n-1}b&amp;lt;/math&amp;gt; итерационно сохраняя полученный результат в вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Полученная последовательность векторов сходится к собственному вектору, отвечающему максимальному собственному значению &amp;lt;math&amp;gt;\lambda_{max}&amp;lt;/math&amp;gt;. Однако, использование лишь последнего полученного вектора и потеря всех предшествующих посчитанных величин не всегда является наилучшим выбором. Поэтому сохранив все вектора и объединив их в одну матрицу мы получим так называемую &amp;lt;it&amp;gt;матрицу Крылова  &amp;lt;/it&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K_j = [b,Ab,A^2b,...,A^{j-1}b]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Столбцы получившейся матрицы не ортогональны, однако их можно ортогонализовать, применив процесс Грамма-Шмидта. Получившиеся вектора будут составлять базис подпространства Крылова &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt;. Можно ожидать, что вектора полученного базиса будут достаточно хорошо приближать &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; собственных векторов, отвечающих &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; наибольшим собственным значения.&lt;br /&gt;
&lt;br /&gt;
Затем с использованием полученной матрицы из ортогональных векторов &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt; мы получим трехдиагональную матрицу &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; на основе исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
Наконец, к полученной матрице &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; будет применяться &#039;&#039;&#039;процесс Рэлея-Ритца&#039;&#039;&#039;, который найдет собственные значения трехдиагональной матрицы. В последствии эти значения и будут приближениями искомых собственных значений исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма Ланцоша, то есть наиболее ресурсно-затратной частью алгоритма, является шаг на котором на каждой итерации происходит перемножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;, полученный на предыдущей итерации. Полученный в результате умножения вектор обозначается &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; z=Aq_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;Q_j=[q_1,q_2,...q_j]&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортонормированных вектров Ланцоша и последующее формирование трехдиагональной матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;. Число таких векторов и, следовательно, размер матрицы растет с каждой итерацией. Итерационный процесс завершается при &amp;lt;math&amp;gt;j=k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На долю второй части алгоритма приходится поиск собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;, полученной в первой части.&lt;br /&gt;
&lt;br /&gt;
=== Схема последовательной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ланцош_Схема реализации.png|800px]]&lt;br /&gt;
&lt;br /&gt;
На рисунке выше представлен псевдокод, отражающий последовательность действий в алгоритме метода. Перечислим основные ступени в данном методе:&lt;br /&gt;
* Прежде чем войти в цикл, происходит инициализация констант &amp;lt;math&amp;gt;\Beta_0,q_0&amp;lt;/math&amp;gt;, вычисление нормы вектора начального приближения &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и нормализация этого вектора.&lt;br /&gt;
* Затем, в цикле, происходит: &lt;br /&gt;
**поиск вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, являющегося результатом применения матричного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;; &lt;br /&gt;
**скалярное произведение двух векторов &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**вычисляется линейная комбинация векторов; &lt;br /&gt;
**вычисляется норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**проверяется условие выхода из цикла (равенство нулю нормы вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;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;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Посчитаем количество операций, необходимых для поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений и векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; действий для умножения матрицы на вектор&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; действия для перемножения двух векторов&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  операций для поэлементного сложения или вычитания двух векторов&lt;br /&gt;
* для отыскания нормы вектора помимо &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  сложений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  умножений требуется 1 операция извлечения корня&lt;br /&gt;
* для поиска собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; требуется &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарно для одной итерации алгоритма требуется совершить  &amp;lt;math&amp;gt;O(n^2)+O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
В данном разделе представлен информационный граф алгоритма, дающий представление о переходе от одной итерации к другой.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Информационный_граф_1.png|1000px|thumb|center| &amp;lt;math&amp;gt;||x||&amp;lt;/math&amp;gt; - операция вычисления нормы;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; - операция деления;&lt;br /&gt;
• - операция скалярного умножения векторов;&lt;br /&gt;
Ax - операция применения оператора A к вектору x;&lt;br /&gt;
F - операция вычисления линейной комбинации.&lt;br /&gt;
Желтый ромб символизирует проверку логического условия выхода из итерационного цикла (в случае если посчитанная норма равна нулю).&lt;br /&gt;
Input,Out - входные и выходные данные.]]&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;n\times n&amp;lt;/math&amp;gt; на вектор размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
В свою очередь ресурс параллелизма операции поиска собственных значений зависит от выбранного способа и не рассматривается в данной статье.&lt;br /&gt;
&lt;br /&gt;
Таким образом, с точки зрения ресурса параллелизма, алгоритм Ланцоша обладает линейной сложностью по ширине ЯПФ и квадратичной сложностью по высоте ЯПФ. Основное время работы алгоритма будет уделено операции умножения матрицы на вектор, имеющей ширину яруса &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;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;A&amp;lt;/math&amp;gt;, следовательно на вход данный алгоритм во всяком случае получает 1 число и 1 матрицу размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;. Помимо этого для начала работы алгоритму нужен некоторый вектор &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; начального приближения размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, который тоже является входными данными.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После окончания работы алгоритма мы получаем набор собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, состоящий из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; элементов. Если помимо собственных значений выводятся еще и полученные собственные векторы, то суммарный объём всех таких векторов составляет &amp;lt;math&amp;gt;k\times n&amp;lt;/math&amp;gt; элементов. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, совокупный объём входных данных составляет: &amp;lt;math&amp;gt;n^2+n+1&amp;lt;/math&amp;gt; элемент, а на выходе получаем &amp;lt;math&amp;gt;k(n+1)&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;lt;math&amp;gt;A&amp;lt;/math&amp;gt;) начиная с максимального в абсолютном смысле значения. Это выгодно отличает данный алгоритм с точки зрения поиска собственных значений матрицы, находящихся по краям её спектра.&lt;br /&gt;
&lt;br /&gt;
Не является полностью детерминированным, т.к. может досрочно завершить работу, если будут найдены все ненулевые собственные значения.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма (то есть отношение числа операций к суммарному объему входных и выходных данных) равна &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+2n+1}&amp;lt;/math&amp;gt;. Следовательно порядок мощности алгоритма примерно равен &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;, при &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В случае использования метода вычисления собственных значений с линейной сложностью, соотношение последовательной и параллельной сложностей будет равно &amp;lt;math&amp;gt;(k ^ 2 + n ^ 2) / (k  + n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша может быть модифицирован так, чтобы быть пригодным для применения к несимметричным системам.&lt;br /&gt;
&lt;br /&gt;
Существует усложнение алгоритма, которое позволяет сократить объём хранимых на каждой итерации векторов с 3-ух до 2-ух.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма=== &lt;br /&gt;
=== Локальность данных и вычислений=== &lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма=== &lt;br /&gt;
===  Масштабируемость алгоритма и его реализации===&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма=== &lt;br /&gt;
=== Выводы для классов архитектур=== &lt;br /&gt;
=== Существующие реализации алгоритма===&lt;br /&gt;
&lt;br /&gt;
В настоящее время алгоритм Ланцоша поиска собственных значений квадратной симметричной матрицы включён в несколько библиотек и реализован на различных языках, среди которых такие наиболее распространенные как &#039;&#039;&#039;C&#039;&#039;&#039;, &#039;&#039;&#039;C++&#039;&#039;&#039;, &#039;&#039;&#039;FORTRAN77/90&#039;&#039;&#039;, &#039;&#039;&#039;MathLab&#039;&#039;&#039;.&lt;br /&gt;
Так, например, в языке &#039;&#039;&#039;MathLab&#039;&#039;&#039; во встроенном пакете &#039;&#039;&#039;ARPACK&#039;&#039;&#039; найти собственные значения методом Ланцоша можно при помощи вызова функции &#039;&#039;eigs()&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
На языке &#039;&#039;&#039;С&#039;&#039;&#039; существует библиотека &#039;&#039;&#039;[http://www.cs.wm.edu/~andreas/software/ PRIMME]&#039;&#039;&#039;, название которой расшифровывается как PReconditioned Iterative MultiMethod Eigensolver (итерационные методы поиска собственных значений с предусловием).&lt;br /&gt;
&lt;br /&gt;
Библиотека &#039;&#039;&#039;[http://www.nag.co.uk NAG] Numerical Library&#039;&#039;&#039; также содержит обширный набор функций, позволяющих проводить математический анализ, среди которых есть и реализация алгоритма Ланцоша. Библиотека доступна в трех пакетах: NAG C Library, NAG Fortran Library и NAG Library for .NET, совместна со многими языками и с основными операционными системами (Windows, Linux and OS X, а также Solaris, AIX и HP-UX).&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] Дж. Деммель «Вычислительная линейная алгебра», с 381.&lt;br /&gt;
&lt;br /&gt;
[2] Wikipedia https://en.wikipedia.org/wiki/Lanczos_algorithm&lt;br /&gt;
&lt;br /&gt;
[3] &amp;quot;[https://static.ph.ed.ac.uk/dissertations/hpc-msc/2013-2014/Investigation%20and%20Implementation%20of%20an%20Eigensolver%20Method.pdf Investigation and Implementation of an Eigensolver Method]&amp;quot;, Jorge Moreira, The University of Edinburgh, August 2014&lt;br /&gt;
&lt;br /&gt;
[4] &amp;quot;[http://www.physics.drexel.edu/~bob/Term_Reports/Hoppe_01.pdf Lanczos Vector Procedures]&amp;quot;, Travis Hoppe&lt;br /&gt;
&lt;br /&gt;
[5] &amp;quot;[http://pochenfullwave.ddns.net/wp-content/uploads/2015/09/61309283-Parallel-Scientific-Computing-in-C-and-MPI-2003.pdf Parallel Scientific Computing in C++ and MPI]&amp;quot;,&lt;br /&gt;
A seamless approach to parallel algorithms and their implementation,&lt;br /&gt;
George Em Karniadakis and Robert M. Kirby II,&lt;br /&gt;
Cambridge University Press&lt;/div&gt;</summary>
		<author><name>Alexbashirov</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=19988</id>
		<title>Участник:Alexbashirov/Алгоритм Ланцоша для точной арифметики</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=19988"/>
		<updated>2016-12-03T19:41:19Z</updated>

		<summary type="html">&lt;p&gt;Alexbashirov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[Участник: Alexbashirov|Баширов А.Д.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name             = Алгоритм Ланцоша для точной арифметики&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;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;
Алгоритм Ланцоша является итерационным алгоритмом поиска собственных значений симметричной матрицы, разработанным венгерским физиком и математиком XX столетия Корнелием Ланцошем в 1950 году. Алгоритм совмещает в себе два других алгоритма: алгоритм построения подпространства Крылова (который также был создан Ланцошем) и процедуру Рэлея-Ритца приближения собственных значений матрицы. Алгоритм является вариацией степенного метода, позволяющего найти собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-го порядка. Однако в алгоритме число итераций ограничено некоторым &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;. Несмотря на заявленную вычислительную эффективность, алгоритм не получил широкого применения в своём первоначальном виде, ввиду его неустойчивости. 20 лет спустя, в 1970 году ученые Ojalvo и Newman показали доработанный алгоритм Ланцоша, который теперь стал устойчивым а также предложили способ выбора вектора начального приближения &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt;. Полученный последователями Ланцоша алгоритм получил название &amp;quot;Алгоритм Ланцоша с полной переортогонализацией&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма===&lt;br /&gt;
Алгоритм Ланцоша работает с вещественной симметричной матрицей &amp;lt;math&amp;gt;A=A^T&amp;lt;/math&amp;gt;, таким образом в памяти достаточно хранить лишь немногим более половины элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Прежде чем переходить к описанию алгоритма, следует упомянуть следующие понятия: подпространство Крылова и процесс Рэлея-Ритца, о которых уже было сказано в исторической справке выше. &lt;br /&gt;
Подпространством Крылова называется набор векторов&amp;lt;math&amp;gt;K_n =[b,Ab,A^2b,...,A^{n-1}b]&amp;lt;/math&amp;gt;. Начав свою работу с произвольного вектора &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, степенной метод вычисляет вектора &amp;lt;math&amp;gt;Ab, A^2b,...,A^{n-1}b&amp;lt;/math&amp;gt; итерационно сохраняя полученный результат в вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Полученная последовательность векторов сходится к собственному вектору, отвечающему максимальному собственному значению &amp;lt;math&amp;gt;\lambda_{max}&amp;lt;/math&amp;gt;. Однако, использование лишь последнего полученного вектора и потеря всех предшествующих посчитанных величин не всегда является наилучшим выбором. Поэтому сохранив все вектора и объединив их в одну матрицу мы получим так называемую &#039;&#039;&#039;матрицу Крылова&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K_j = [b,Ab,A^2b,...,A^{j-1}b]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Столбцы получившейся матрицы не ортогональны, однако их можно ортогонализовать, применив процесс Грамма-Шмидта. Получившиеся вектора будут составлять базис подпространства Крылова &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt;. Можно ожидать, что вектора полученного базиса будут достаточно хорошо приближать &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; собственных векторов, отвечающих &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; наибольшим собственным значения.&lt;br /&gt;
&lt;br /&gt;
Затем с использованием полученной матрицы из ортогональных векторов &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt; мы получим трехдиагональную матрицу &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; на основе исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
Наконец, к полученной матрице &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; будет применяться &#039;&#039;&#039;процесс Рэлея-Ритца&#039;&#039;&#039;, который найдет собственные значения трехдиагональной матрицы. В последствии эти значения и будут приближениями искомых собственных значений исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма Ланцоша, то есть наиболее ресурсно-затратной частью алгоритма, является шаг на котором на каждой итерации происходит перемножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;, полученный на предыдущей итерации. Полученный в результате умножения вектор обозначается &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; z=Aq_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;Q_j=[q_1,q_2,...q_j]&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортонормированных вектров Ланцоша и последующее формирование трехдиагональной матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;. Число таких векторов и, следовательно, размер матрицы растет с каждой итерацией. Итерационный процесс завершается при &amp;lt;math&amp;gt;j=k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На долю второй части алгоритма приходится поиск собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;, полученной в первой части.&lt;br /&gt;
&lt;br /&gt;
=== Схема последовательной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ланцош_Схема реализации.png|800px]]&lt;br /&gt;
&lt;br /&gt;
На рисунке выше представлен псевдокод, отражающий последовательность действий в алгоритме метода. Перечислим основные ступени в данном методе:&lt;br /&gt;
* Прежде чем войти в цикл, происходит инициализация констант &amp;lt;math&amp;gt;\Beta_0,q_0&amp;lt;/math&amp;gt;, вычисление нормы вектора начального приближения &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и нормализация этого вектора.&lt;br /&gt;
* Затем, в цикле, происходит: &lt;br /&gt;
**поиск вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, являющегося результатом применения матричного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;; &lt;br /&gt;
**скалярное произведение двух векторов &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**вычисляется линейная комбинация векторов; &lt;br /&gt;
**вычисляется норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**проверяется условие выхода из цикла (равенство нулю нормы вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;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;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Посчитаем количество операций, необходимых для поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений и векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; действий для умножения матрицы на вектор&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; действия для перемножения двух векторов&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  операций для поэлементного сложения или вычитания двух векторов&lt;br /&gt;
* для отыскания нормы вектора помимо &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  сложений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  умножений требуется 1 операция извлечения корня&lt;br /&gt;
* для поиска собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; требуется &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарно для одной итерации алгоритма требуется совершить  &amp;lt;math&amp;gt;O(n^2)+O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
В данном разделе представлен информационный граф алгоритма, дающий представление о переходе от одной итерации к другой.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Информационный_граф_1.png|1000px|thumb|center| &amp;lt;math&amp;gt;||x||&amp;lt;/math&amp;gt; - операция вычисления нормы;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; - операция деления;&lt;br /&gt;
• - операция скалярного умножения векторов;&lt;br /&gt;
Ax - операция применения оператора A к вектору x;&lt;br /&gt;
F - операция вычисления линейной комбинации.&lt;br /&gt;
Желтый ромб символизирует проверку логического условия выхода из итерационного цикла (в случае если посчитанная норма равна нулю).&lt;br /&gt;
Input,Out - входные и выходные данные.]]&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;n\times n&amp;lt;/math&amp;gt; на вектор размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
В свою очередь ресурс параллелизма операции поиска собственных значений зависит от выбранного способа и не рассматривается в данной статье.&lt;br /&gt;
&lt;br /&gt;
Таким образом, с точки зрения ресурса параллелизма, алгоритм Ланцоша обладает линейной сложностью по ширине ЯПФ и квадратичной сложностью по высоте ЯПФ. Основное время работы алгоритма будет уделено операции умножения матрицы на вектор, имеющей ширину яруса &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;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;A&amp;lt;/math&amp;gt;, следовательно на вход данный алгоритм во всяком случае получает 1 число и 1 матрицу размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;. Помимо этого для начала работы алгоритму нужен некоторый вектор &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; начального приближения размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, который тоже является входными данными.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После окончания работы алгоритма мы получаем набор собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, состоящий из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; элементов. Если помимо собственных значений выводятся еще и полученные собственные векторы, то суммарный объём всех таких векторов составляет &amp;lt;math&amp;gt;k\times n&amp;lt;/math&amp;gt; элементов. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, совокупный объём входных данных составляет: &amp;lt;math&amp;gt;n^2+n+1&amp;lt;/math&amp;gt; элемент, а на выходе получаем &amp;lt;math&amp;gt;k(n+1)&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;lt;math&amp;gt;A&amp;lt;/math&amp;gt;) начиная с максимального в абсолютном смысле значения. Это выгодно отличает данный алгоритм с точки зрения поиска собственных значений матрицы, находящихся по краям её спектра.&lt;br /&gt;
&lt;br /&gt;
Не является полностью детерминированным, т.к. может досрочно завершить работу, если будут найдены все ненулевые собственные значения.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма (то есть отношение числа операций к суммарному объему входных и выходных данных) равна &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+2n+1}&amp;lt;/math&amp;gt;. Следовательно порядок мощности алгоритма примерно равен &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;, при &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В случае использования метода вычисления собственных значений с линейной сложностью, соотношение последовательной и параллельной сложностей будет равно &amp;lt;math&amp;gt;(k ^ 2 + n ^ 2) / (k  + n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша может быть модифицирован так, чтобы быть пригодным для применения к несимметричным системам.&lt;br /&gt;
&lt;br /&gt;
Существует усложнение алгоритма, которое позволяет сократить объём хранимых на каждой итерации векторов с 3-ух до 2-ух.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма=== &lt;br /&gt;
=== Локальность данных и вычислений=== &lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма=== &lt;br /&gt;
===  Масштабируемость алгоритма и его реализации===&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма=== &lt;br /&gt;
=== Выводы для классов архитектур=== &lt;br /&gt;
=== Существующие реализации алгоритма===&lt;br /&gt;
&lt;br /&gt;
В настоящее время алгоритм Ланцоша поиска собственных значений квадратной симметричной матрицы включён в несколько библиотек и реализован на различных языках, среди которых такие наиболее распространенные как &#039;&#039;&#039;C&#039;&#039;&#039;, &#039;&#039;&#039;C++&#039;&#039;&#039;, &#039;&#039;&#039;FORTRAN77/90&#039;&#039;&#039;, &#039;&#039;&#039;MathLab&#039;&#039;&#039;.&lt;br /&gt;
Так, например, в языке &#039;&#039;&#039;MathLab&#039;&#039;&#039; во встроенном пакете &#039;&#039;&#039;ARPACK&#039;&#039;&#039; найти собственные значения методом Ланцоша можно при помощи вызова функции &#039;&#039;eigs()&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
На языке &#039;&#039;&#039;С&#039;&#039;&#039; существует библиотека &#039;&#039;&#039;[http://www.cs.wm.edu/~andreas/software/ PRIMME]&#039;&#039;&#039;, название которой расшифровывается как PReconditioned Iterative MultiMethod Eigensolver (итерационные методы поиска собственных значений с предусловием).&lt;br /&gt;
&lt;br /&gt;
Библиотека &#039;&#039;&#039;[http://www.nag.co.uk NAG] Numerical Library&#039;&#039;&#039; также содержит обширный набор функций, позволяющих проводить математический анализ, среди которых есть и реализация алгоритма Ланцоша. Библиотека доступна в трех пакетах: NAG C Library, NAG Fortran Library и NAG Library for .NET, совместна со многими языками и с основными операционными системами (Windows, Linux and OS X, а также Solaris, AIX и HP-UX).&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] Дж. Деммель «Вычислительная линейная алгебра», с 381.&lt;br /&gt;
&lt;br /&gt;
[2] Wikipedia https://en.wikipedia.org/wiki/Lanczos_algorithm&lt;br /&gt;
&lt;br /&gt;
[3] &amp;quot;[https://static.ph.ed.ac.uk/dissertations/hpc-msc/2013-2014/Investigation%20and%20Implementation%20of%20an%20Eigensolver%20Method.pdf Investigation and Implementation of an Eigensolver Method]&amp;quot;, Jorge Moreira, The University of Edinburgh, August 2014&lt;br /&gt;
&lt;br /&gt;
[4] &amp;quot;[http://www.physics.drexel.edu/~bob/Term_Reports/Hoppe_01.pdf Lanczos Vector Procedures]&amp;quot;, Travis Hoppe&lt;br /&gt;
&lt;br /&gt;
[5] &amp;quot;[http://pochenfullwave.ddns.net/wp-content/uploads/2015/09/61309283-Parallel-Scientific-Computing-in-C-and-MPI-2003.pdf Parallel Scientific Computing in C++ and MPI]&amp;quot;,&lt;br /&gt;
A seamless approach to parallel algorithms and their implementation,&lt;br /&gt;
George Em Karniadakis and Robert M. Kirby II,&lt;br /&gt;
Cambridge University Press&lt;/div&gt;</summary>
		<author><name>Alexbashirov</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=16608</id>
		<title>Участник:Alexbashirov/Алгоритм Ланцоша для точной арифметики</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=16608"/>
		<updated>2016-11-12T22:55:54Z</updated>

		<summary type="html">&lt;p&gt;Alexbashirov: /* История */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|ASA}}&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник: Alexbashirov|Баширов А.Д.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name             = Алгоритм Ланцоша для точной арифметики&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;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;
Алгоритм Ланцоша является итерационным алгоритмом поиска собственных значений симметричной матрицы, разработанным венгерским физиком и математиком XX столетия Корнелием Ланцошем в 1950 году. Алгоритм совмещает в себе два других алгоритма: алгоритм построения подпространства Крылова (который также был создан Ланцошем) и процедуру Рэлея-Ритца приближения собственных значений матрицы. Алгоритм является вариацией степенного метода, позволяющего найти собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-го порядка. Однако в алгоритме число итераций ограничено некоторым &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;. Несмотря на заявленную вычислительную эффективность, алгоритм не получил широкого применения в своём первоначальном виде, ввиду его неустойчивости. 20 лет спустя, в 1970 году ученые Ojalvo и Newman показали доработанный алгоритм Ланцоша, который теперь стал устойчивым а также предложили способ выбора вектора начального приближения &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt;. Полученный последователями Ланцоша алгоритм получил название &amp;quot;Алгоритм Ланцоша с полной переортогонализацией&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма===&lt;br /&gt;
Алгоритм Ланцоша работает с вещественной симметричной матрицей &amp;lt;math&amp;gt;A=A^T&amp;lt;/math&amp;gt;, таким образом в памяти достаточно хранить лишь немногим более половины элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Прежде чем переходить к описанию алгоритма, следует упомянуть следующие понятия: подпространство Крылова и процесс Рэлея-Ритца, о которых уже было сказано в исторической справке выше. &lt;br /&gt;
Подпространством Крылова называется набор векторов&amp;lt;math&amp;gt;K_n =[b,Ab,A^2b,...,A^{n-1}b]&amp;lt;/math&amp;gt;. Начав свою работу с произвольного вектора &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, степенной метод вычисляет вектора &amp;lt;math&amp;gt;Ab, A^2b,...,A^{n-1}b&amp;lt;/math&amp;gt; итерационно сохраняя полученный результат в вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Полученная последовательность векторов сходится к собственному вектору, отвечающему максимальному собственному значению &amp;lt;math&amp;gt;\lambda_{max}&amp;lt;/math&amp;gt;. Однако, использование лишь последнего полученного вектора и потеря всех предшествующих посчитанных величин не всегда является наилучшим выбором. Поэтому сохранив все вектора и объединив их в одну матрицу мы получим так называемую &#039;&#039;&#039;матрицу Крылова&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K_j = [b,Ab,A^2b,...,A^{j-1}b]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Столбцы получившейся матрицы не ортогональны, однако их можно ортогонализовать, применив процесс Грамма-Шмидта. Получившиеся вектора будут составлять базис подпространства Крылова &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt;. Можно ожидать, что вектора полученного базиса будут достаточно хорошо приближать &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; собственных векторов, отвечающих &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; наибольшим собственным значения.&lt;br /&gt;
&lt;br /&gt;
Затем с использованием полученной матрицы из ортогональных векторов &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt; мы получим трехдиагональную матрицу &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; на основе исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
Наконец, к полученной матрице &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; будет применяться &#039;&#039;&#039;процесс Рэлея-Ритца&#039;&#039;&#039;, который найдет собственные значения трехдиагональной матрицы. В последствии эти значения и будут приближениями искомых собственных значений исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма Ланцоша, то есть наиболее ресурсно-затратной частью алгоритма, является шаг на котором на каждой итерации происходит перемножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;, полученный на предыдущей итерации. Полученный в результате умножения вектор обозначается &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; z=Aq_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;Q_j=[q_1,q_2,...q_j]&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортонормированных вектров Ланцоша и последующее формирование трехдиагональной матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;. Число таких векторов и, следовательно, размер матрицы растет с каждой итерацией. Итерационный процесс завершается при &amp;lt;math&amp;gt;j=k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На долю второй части алгоритма приходится поиск собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;, полученной в первой части.&lt;br /&gt;
&lt;br /&gt;
=== Схема последовательной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ланцош_Схема реализации.png|800px]]&lt;br /&gt;
&lt;br /&gt;
На рисунке выше представлен псевдокод, отражающий последовательность действий в алгоритме метода. Перечислим основные ступени в данном методе:&lt;br /&gt;
* Прежде чем войти в цикл, происходит инициализация констант &amp;lt;math&amp;gt;\Beta_0,q_0&amp;lt;/math&amp;gt;, вычисление нормы вектора начального приближения &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и нормализация этого вектора.&lt;br /&gt;
* Затем, в цикле, происходит: &lt;br /&gt;
**поиск вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, являющегося результатом применения матричного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;; &lt;br /&gt;
**скалярное произведение двух векторов &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**вычисляется линейная комбинация векторов; &lt;br /&gt;
**вычисляется норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**проверяется условие выхода из цикла (равенство нулю нормы вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;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;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Посчитаем количество операций, необходимых для поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений и векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; действий для умножения матрицы на вектор&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; действия для перемножения двух векторов&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  операций для поэлементного сложения или вычитания двух векторов&lt;br /&gt;
* для отыскания нормы вектора помимо &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  сложений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  умножений требуется 1 операция извлечения корня&lt;br /&gt;
* для поиска собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; требуется &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарно для одной итерации алгоритма требуется совершить  &amp;lt;math&amp;gt;O(n^2)+O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
В данном разделе представлен информационный граф алгоритма, дающий представление о переходе от одной итерации к другой.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Информационный_граф_1.png|1000px|thumb|center| &amp;lt;math&amp;gt;||x||&amp;lt;/math&amp;gt; - операция вычисления нормы;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; - операция деления;&lt;br /&gt;
• - операция скалярного умножения векторов;&lt;br /&gt;
Ax - операция применения оператора A к вектору x;&lt;br /&gt;
F - операция вычисления линейной комбинации.&lt;br /&gt;
Желтый ромб символизирует проверку логического условия выхода из итерационного цикла (в случае если посчитанная норма равна нулю).&lt;br /&gt;
Input,Out - входные и выходные данные.]]&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;n\times n&amp;lt;/math&amp;gt; на вектор размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
В свою очередь ресурс параллелизма операции поиска собственных значений зависит от выбранного способа и не рассматривается в данной статье.&lt;br /&gt;
&lt;br /&gt;
Таким образом, с точки зрения ресурса параллелизма, алгоритм Ланцоша обладает линейной сложностью по ширине ЯПФ и квадратичной сложностью по высоте ЯПФ. Основное время работы алгоритма будет уделено операции умножения матрицы на вектор, имеющей ширину яруса &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;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;A&amp;lt;/math&amp;gt;, следовательно на вход данный алгоритм во всяком случае получает 1 число и 1 матрицу размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;. Помимо этого для начала работы алгоритму нужен некоторый вектор &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; начального приближения размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, который тоже является входными данными.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После окончания работы алгоритма мы получаем набор собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, состоящий из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; элементов. Если помимо собственных значений выводятся еще и полученные собственные векторы, то суммарный объём всех таких векторов составляет &amp;lt;math&amp;gt;k\times n&amp;lt;/math&amp;gt; элементов. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, совокупный объём входных данных составляет: &amp;lt;math&amp;gt;n^2+n+1&amp;lt;/math&amp;gt; элемент, а на выходе получаем &amp;lt;math&amp;gt;k(n+1)&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;lt;math&amp;gt;A&amp;lt;/math&amp;gt;) начиная с максимального в абсолютном смысле значения. Это выгодно отличает данный алгоритм с точки зрения поиска собственных значений матрицы, находящихся по краям её спектра.&lt;br /&gt;
&lt;br /&gt;
Не является полностью детерминированным, т.к. может досрочно завершить работу, если будут найдены все ненулевые собственные значения.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма (то есть отношение числа операций к суммарному объему входных и выходных данных) равна &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+2n+1}&amp;lt;/math&amp;gt;. Следовательно порядок мощности алгоритма примерно равен &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;, при &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В случае использования метода вычисления собственных значений с линейной сложностью, соотношение последовательной и параллельной сложностей будет равно &amp;lt;math&amp;gt;(k ^ 2 + n ^ 2) / (k  + n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша может быть модифицирован так, чтобы быть пригодным для применения к несимметричным системам.&lt;br /&gt;
&lt;br /&gt;
Существует усложнение алгоритма, которое позволяет сократить объём хранимых на каждой итерации векторов с 3-ух до 2-ух.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма=== &lt;br /&gt;
=== Локальность данных и вычислений=== &lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма=== &lt;br /&gt;
===  Масштабируемость алгоритма и его реализации===&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма=== &lt;br /&gt;
=== Выводы для классов архитектур=== &lt;br /&gt;
=== Существующие реализации алгоритма===&lt;br /&gt;
&lt;br /&gt;
В настоящее время алгоритм Ланцоша поиска собственных значений квадратной симметричной матрицы включён в несколько библиотек и реализован на различных языках, среди которых такие наиболее распространенные как &#039;&#039;&#039;C&#039;&#039;&#039;, &#039;&#039;&#039;C++&#039;&#039;&#039;, &#039;&#039;&#039;FORTRAN77/90&#039;&#039;&#039;, &#039;&#039;&#039;MathLab&#039;&#039;&#039;.&lt;br /&gt;
Так, например, в языке &#039;&#039;&#039;MathLab&#039;&#039;&#039; во встроенном пакете &#039;&#039;&#039;ARPACK&#039;&#039;&#039; найти собственные значения методом Ланцоша можно при помощи вызова функции &#039;&#039;eigs()&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
На языке &#039;&#039;&#039;С&#039;&#039;&#039; существует библиотека &#039;&#039;&#039;[http://www.cs.wm.edu/~andreas/software/ PRIMME]&#039;&#039;&#039;, название которой расшифровывается как PReconditioned Iterative MultiMethod Eigensolver (итерационные методы поиска собственных значений с предусловием).&lt;br /&gt;
&lt;br /&gt;
Библиотека &#039;&#039;&#039;[http://www.nag.co.uk NAG] Numerical Library&#039;&#039;&#039; также содержит обширный набор функций, позволяющих проводить математический анализ, среди которых есть и реализация алгоритма Ланцоша. Библиотека доступна в трех пакетах: NAG C Library, NAG Fortran Library и NAG Library for .NET, совместна со многими языками и с основными операционными системами (Windows, Linux and OS X, а также Solaris, AIX и HP-UX).&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] Дж. Деммель «Вычислительная линейная алгебра», с 381.&lt;br /&gt;
&lt;br /&gt;
[2] Wikipedia https://en.wikipedia.org/wiki/Lanczos_algorithm&lt;br /&gt;
&lt;br /&gt;
[3] &amp;quot;[https://static.ph.ed.ac.uk/dissertations/hpc-msc/2013-2014/Investigation%20and%20Implementation%20of%20an%20Eigensolver%20Method.pdf Investigation and Implementation of an Eigensolver Method]&amp;quot;, Jorge Moreira, The University of Edinburgh, August 2014&lt;br /&gt;
&lt;br /&gt;
[4] &amp;quot;[http://www.physics.drexel.edu/~bob/Term_Reports/Hoppe_01.pdf Lanczos Vector Procedures]&amp;quot;, Travis Hoppe&lt;br /&gt;
&lt;br /&gt;
[5] &amp;quot;[http://pochenfullwave.ddns.net/wp-content/uploads/2015/09/61309283-Parallel-Scientific-Computing-in-C-and-MPI-2003.pdf Parallel Scientific Computing in C++ and MPI]&amp;quot;,&lt;br /&gt;
A seamless approach to parallel algorithms and their implementation,&lt;br /&gt;
George Em Karniadakis and Robert M. Kirby II,&lt;br /&gt;
Cambridge University Press&lt;/div&gt;</summary>
		<author><name>Alexbashirov</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=15961</id>
		<title>Участник:Alexbashirov/Алгоритм Ланцоша для точной арифметики</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=15961"/>
		<updated>2016-11-05T19:35:07Z</updated>

		<summary type="html">&lt;p&gt;Alexbashirov: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник: Alexbashirov|Баширов А.Д.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name             = Алгоритм Ланцоша для точной арифметики&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;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;
Алгоритм Ланцоша является прямым алгоритмом поиска собственных значений симметричной матрицы, разработанным венгерским физиком и математиком XX столетия Корнелием Ланцошем в 1950 году. Алгоритм совмещает в себе два других алгоритма: алгоритм построения подпространства Крылова (который также был создан Ланцошем) и процедуру Рэлея-Ритца приближения собственных значений матрицы. Алгоритм является вариацией степенного метода, позволяющего найти собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-го порядка. Однако в алгоритме число итераций ограничено некоторым &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;. Несмотря на заявленную вычислительную эффективность, алгоритм не получил широкого применения в своём первоначальном виде, ввиду его неустойчивости. 20 лет спустя, в 1970 году ученые Ojalvo и Newman показали доработанный алгоритм Ланцоша, который теперь стал устойчивым а также предложили способ выбора вектора начального приближения &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt;. Полученный последователями Ланцоша алгоритм получил название &amp;quot;Алгоритм Ланцоша с полной переортогонализацией&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма===&lt;br /&gt;
Алгоритм Ланцоша работает с вещественной симметричной матрицей &amp;lt;math&amp;gt;A=A^T&amp;lt;/math&amp;gt;, таким образом в памяти достаточно хранить лишь немногим более половины элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Прежде чем переходить к описанию алгоритма, следует упомянуть следующие понятия: подпространство Крылова и процесс Рэлея-Ритца, о которых уже было сказано в исторической справке выше. &lt;br /&gt;
Подпространством Крылова называется набор векторов&amp;lt;math&amp;gt;K_n =[b,Ab,A^2b,...,A^{n-1}b]&amp;lt;/math&amp;gt;. Начав свою работу с произвольного вектора &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, степенной метод вычисляет вектора &amp;lt;math&amp;gt;Ab, A^2b,...,A^{n-1}b&amp;lt;/math&amp;gt; итерационно сохраняя полученный результат в вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Полученная последовательность векторов сходится к собственному вектору, отвечающему максимальному собственному значению &amp;lt;math&amp;gt;\lambda_{max}&amp;lt;/math&amp;gt;. Однако, использование лишь последнего полученного вектора и потеря всех предшествующих посчитанных величин не всегда является наилучшим выбором. Поэтому сохранив все вектора и объединив их в одну матрицу мы получим так называемую &#039;&#039;&#039;матрицу Крылова&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K_j = [b,Ab,A^2b,...,A^{j-1}b]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Столбцы получившейся матрицы не ортогональны, однако их можно ортогонализовать, применив процесс Грамма-Шмидта. Получившиеся вектора будут составлять базис подпространства Крылова &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt;. Можно ожидать, что вектора полученного базиса будут достаточно хорошо приближать &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; собственных векторов, отвечающих &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; наибольшим собственным значения.&lt;br /&gt;
&lt;br /&gt;
Затем с использованием полученной матрицы из ортогональных векторов &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt; мы получим трехдиагональную матрицу &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; на основе исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
Наконец, к полученной матрице &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; будет применяться &#039;&#039;&#039;процесс Рэлея-Ритца&#039;&#039;&#039;, который найдет собственные значения трехдиагональной матрицы. В последствии эти значения и будут приближениями искомых собственных значений исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма Ланцоша, то есть наиболее ресурсно-затратной частью алгоритма, является шаг на котором на каждой итерации происходит перемножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;, полученный на предыдущей итерации. Полученный в результате умножения вектор обозначается &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; z=Aq_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;Q_j=[q_1,q_2,...q_j]&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортонормированных вектров Ланцоша и последующее формирование трехдиагональной матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;. Число таких векторов и, следовательно, размер матрицы растет с каждой итерацией. Итерационный процесс завершается при &amp;lt;math&amp;gt;j=k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На долю второй части алгоритма приходится поиск собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;, полученной в первой части.&lt;br /&gt;
&lt;br /&gt;
=== Схема последовательной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ланцош_Схема реализации.png|800px]]&lt;br /&gt;
&lt;br /&gt;
На рисунке выше представлен псевдокод, отражающий последовательность действий в алгоритме метода. Перечислим основные ступени в данном методе:&lt;br /&gt;
* Прежде чем войти в цикл, происходит инициализация констант &amp;lt;math&amp;gt;\Beta_0,q_0&amp;lt;/math&amp;gt;, вычисление нормы вектора начального приближения &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и нормализация этого вектора.&lt;br /&gt;
* Затем, в цикле, происходит: &lt;br /&gt;
**поиск вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, являющегося результатом применения матричного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;; &lt;br /&gt;
**скалярное произведение двух векторов &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**вычисляется линейная комбинация векторов; &lt;br /&gt;
**вычисляется норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**проверяется условие выхода из цикла (равенство нулю нормы вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;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;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Посчитаем количество операций, необходимых для поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений и векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; действий для умножения матрицы на вектор&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; действия для перемножения двух векторов&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  операций для поэлементного сложения или вычитания двух векторов&lt;br /&gt;
* для отыскания нормы вектора помимо &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  сложений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  умножений требуется 1 операция извлечения корня&lt;br /&gt;
* для поиска собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; требуется &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарно для одной итерации алгоритма требуется совершить  &amp;lt;math&amp;gt;O(n^2)+O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
В данном разделе представлен информационный граф алгоритма, дающий представление о переходе от одной итерации к другой.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Информационный_граф_1.png|1000px|thumb|center| &amp;lt;math&amp;gt;||x||&amp;lt;/math&amp;gt; - операция вычисления нормы;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; - операция деления;&lt;br /&gt;
• - операция скалярного умножения векторов;&lt;br /&gt;
Ax - операция применения оператора A к вектору x;&lt;br /&gt;
F - операция вычисления линейной комбинации.&lt;br /&gt;
Желтый ромб символизирует проверку логического условия выхода из итерационного цикла (в случае если посчитанная норма равна нулю).&lt;br /&gt;
Input,Out - входные и выходные данные.]]&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;n\times n&amp;lt;/math&amp;gt; на вектор размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
В свою очередь ресурс параллелизма операции поиска собственных значений зависит от выбранного способа и не рассматривается в данной статье.&lt;br /&gt;
&lt;br /&gt;
Таким образом, с точки зрения ресурса параллелизма, алгоритм Ланцоша обладает линейной сложностью по ширине ЯПФ и квадратичной сложностью по высоте ЯПФ. Основное время работы алгоритма будет уделено операции умножения матрицы на вектор, имеющей ширину яруса &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;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;A&amp;lt;/math&amp;gt;, следовательно на вход данный алгоритм во всяком случае получает 1 число и 1 матрицу размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;. Помимо этого для начала работы алгоритму нужен некоторый вектор &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; начального приближения размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, который тоже является входными данными.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После окончания работы алгоритма мы получаем набор собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, состоящий из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; элементов. Если помимо собственных значений выводятся еще и полученные собственные векторы, то суммарный объём всех таких векторов составляет &amp;lt;math&amp;gt;k\times n&amp;lt;/math&amp;gt; элементов. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, совокупный объём входных данных составляет: &amp;lt;math&amp;gt;n^2+n+1&amp;lt;/math&amp;gt; элемент, а на выходе получаем &amp;lt;math&amp;gt;k(n+1)&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;lt;math&amp;gt;A&amp;lt;/math&amp;gt;) начиная с максимального в абсолютном смысле значения. Это выгодно отличает данный алгоритм с точки зрения поиска собственных значений матрицы, находящихся по краям её спектра.&lt;br /&gt;
&lt;br /&gt;
Не является полностью детерминированным, т.к. может досрочно завершить работу, если будут найдены все ненулевые собственные значения.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма (то есть отношение числа операций к суммарному объему входных и выходных данных) равна &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+2n+1}&amp;lt;/math&amp;gt;. Следовательно порядок мощности алгоритма примерно равен &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;, при &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В случае использования метода вычисления собственных значений с линейной сложностью, соотношение последовательной и параллельной сложностей будет равно &amp;lt;math&amp;gt;(k ^ 2 + n ^ 2) / (k  + n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша может быть модифицирован так, чтобы быть пригодным для применения к несимметричным системам.&lt;br /&gt;
&lt;br /&gt;
Существует усложнение алгоритма, которое позволяет сократить объём хранимых на каждой итерации векторов с 3-ух до 2-ух.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма=== &lt;br /&gt;
=== Локальность данных и вычислений=== &lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма=== &lt;br /&gt;
===  Масштабируемость алгоритма и его реализации===&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма=== &lt;br /&gt;
=== Выводы для классов архитектур=== &lt;br /&gt;
=== Существующие реализации алгоритма===&lt;br /&gt;
&lt;br /&gt;
В настоящее время алгоритм Ланцоша поиска собственных значений квадратной симметричной матрицы включён в несколько библиотек и реализован на различных языках, среди которых такие наиболее распространенные как &#039;&#039;&#039;C&#039;&#039;&#039;, &#039;&#039;&#039;C++&#039;&#039;&#039;, &#039;&#039;&#039;FORTRAN77/90&#039;&#039;&#039;, &#039;&#039;&#039;MathLab&#039;&#039;&#039;.&lt;br /&gt;
Так, например, в языке &#039;&#039;&#039;MathLab&#039;&#039;&#039; во встроенном пакете &#039;&#039;&#039;ARPACK&#039;&#039;&#039; найти собственные значения методом Ланцоша можно при помощи вызова функции &#039;&#039;eigs()&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
На языке &#039;&#039;&#039;С&#039;&#039;&#039; существует библиотека &#039;&#039;&#039;[http://www.cs.wm.edu/~andreas/software/ PRIMME]&#039;&#039;&#039;, название которой расшифровывается как PReconditioned Iterative MultiMethod Eigensolver (итерационные методы поиска собственных значений с предусловием).&lt;br /&gt;
&lt;br /&gt;
Библиотека &#039;&#039;&#039;[http://www.nag.co.uk NAG] Numerical Library&#039;&#039;&#039; также содержит обширный набор функций, позволяющих проводить математический анализ, среди которых есть и реализация алгоритма Ланцоша. Библиотека доступна в трех пакетах: NAG C Library, NAG Fortran Library и NAG Library for .NET, совместна со многими языками и с основными операционными системами (Windows, Linux and OS X, а также Solaris, AIX и HP-UX).&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] Дж. Деммель «Вычислительная линейная алгебра», с 381.&lt;br /&gt;
&lt;br /&gt;
[2] Wikipedia https://en.wikipedia.org/wiki/Lanczos_algorithm&lt;br /&gt;
&lt;br /&gt;
[3] &amp;quot;[https://static.ph.ed.ac.uk/dissertations/hpc-msc/2013-2014/Investigation%20and%20Implementation%20of%20an%20Eigensolver%20Method.pdf Investigation and Implementation of an Eigensolver Method]&amp;quot;, Jorge Moreira, The University of Edinburgh, August 2014&lt;br /&gt;
&lt;br /&gt;
[4] &amp;quot;[http://www.physics.drexel.edu/~bob/Term_Reports/Hoppe_01.pdf Lanczos Vector Procedures]&amp;quot;, Travis Hoppe&lt;br /&gt;
&lt;br /&gt;
[5] &amp;quot;[http://pochenfullwave.ddns.net/wp-content/uploads/2015/09/61309283-Parallel-Scientific-Computing-in-C-and-MPI-2003.pdf Parallel Scientific Computing in C++ and MPI]&amp;quot;,&lt;br /&gt;
A seamless approach to parallel algorithms and their implementation,&lt;br /&gt;
George Em Karniadakis and Robert M. Kirby II,&lt;br /&gt;
Cambridge University Press&lt;/div&gt;</summary>
		<author><name>Alexbashirov</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=15960</id>
		<title>Участник:Alexbashirov/Алгоритм Ланцоша для точной арифметики</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=15960"/>
		<updated>2016-11-05T19:34:18Z</updated>

		<summary type="html">&lt;p&gt;Alexbashirov: /* Литература */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник: Alexbashirov|Баширов А.Д.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name             = Алгоритм Ланцоша для точной арифметики&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;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;
Алгоритм Ланцоша является прямым алгоритмом поиска собственных значений симметричной матрицы, разработанным венгерским физиком и математиком XX столетия Корнелием Ланцошем в 1950 году. Алгоритм совмещает в себе два других алгоритма: алгоритм построения подпространства Крылова (который также был создан Ланцошем) и процедуру Рэлея-Ритца приближения собственных значений матрицы. Алгоритм является вариацией степенного метода, позволяющего найти собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-го порядка. Однако в алгоритме число итераций ограничено некоторым &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;. Несмотря на заявленную вычислительную эффективность, алгоритм не получил широкого применения в своём первоначальном виде, ввиду его неустойчивости. 20 лет спустя, в 1970 году ученые Ojalvo и Newman показали доработанный алгоритм Ланцоша, который теперь стал устойчивым а также предложили способ выбора вектора начального приближения &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt;. Полученный последователями Ланцоша алгоритм получил название &amp;quot;Алгоритм Ланцоша с полной переортогонализацией&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма===&lt;br /&gt;
Алгоритм Ланцоша работает с вещественной симметричной матрицей &amp;lt;math&amp;gt;A=A^T&amp;lt;/math&amp;gt;, таким образом в памяти достаточно хранить лишь немногим более половины элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Прежде чем переходить к описанию алгоритма, следует упомянуть следующие понятия: подпространство Крылова и процесс Рэлея-Ритца, о которых уже было сказано в исторической справке выше. &lt;br /&gt;
Подпространством Крылова называется набор векторов&amp;lt;math&amp;gt;K_n =[b,Ab,A^2b,...,A^{n-1}b]&amp;lt;/math&amp;gt;. Начав свою работу с произвольного вектора &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, степенной метод вычисляет вектора &amp;lt;math&amp;gt;Ab, A^2b,...,A^{n-1}b&amp;lt;/math&amp;gt; итерационно сохраняя полученный результат в вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Полученная последовательность векторов сходится к собственному вектору, отвечающему максимальному собственному значению &amp;lt;math&amp;gt;\lambda_{max}&amp;lt;/math&amp;gt;. Однако, использование лишь последнего полученного вектора и потеря всех предшествующих посчитанных величин не всегда является наилучшим выбором. Поэтому сохранив все вектора и объединив их в одну матрицу мы получим так называемую &#039;&#039;&#039;матрицу Крылова&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K_j = [b,Ab,A^2b,...,A^{j-1}b]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Столбцы получившейся матрицы не ортогональны, однако их можно ортогонализовать, применив процесс Грамма-Шмидта. Получившиеся вектора будут составлять базис подпространства Крылова &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt;. Можно ожидать, что вектора полученного базиса будут достаточно хорошо приближать &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; собственных векторов, отвечающих &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; наибольшим собственным значения.&lt;br /&gt;
&lt;br /&gt;
Затем с использованием полученной матрицы из ортогональных векторов &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt; мы получим трехдиагональную матрицу &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; на основе исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
Наконец, к полученной матрице &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; будет применяться &#039;&#039;&#039;процесс Рэлея-Ритца&#039;&#039;&#039;, который найдет собственные значения трехдиагональной матрицы. В последствии эти значения и будут приближениями искомых собственных значений исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма Ланцоша, то есть наиболее ресурсно-затратной частью алгоритма, является шаг на котором на каждой итерации происходит перемножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;, полученный на предыдущей итерации. Полученный в результате умножения вектор обозначается &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; z=Aq_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;Q_j=[q_1,q_2,...q_j]&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортонормированных вектров Ланцоша и последующее формирование трехдиагональной матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;. Число таких векторов и, следовательно, размер матрицы растет с каждой итерацией. Итерационный процесс завершается при &amp;lt;math&amp;gt;j=k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На долю второй части алгоритма приходится поиск собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;, полученной в первой части.&lt;br /&gt;
&lt;br /&gt;
=== Схема последовательной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ланцош_Схема реализации.png|800px]]&lt;br /&gt;
&lt;br /&gt;
На рисунке выше представлен псевдокод, отражающий последовательность действий в алгоритме метода. Перечислим основные ступени в данном методе:&lt;br /&gt;
* Прежде чем войти в цикл, происходит инициализация констант &amp;lt;math&amp;gt;\Beta_0,q_0&amp;lt;/math&amp;gt;, вычисление нормы вектора начального приближения &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и нормализация этого вектора.&lt;br /&gt;
* Затем, в цикле, происходит: &lt;br /&gt;
**поиск вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, являющегося результатом применения матричного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;; &lt;br /&gt;
**скалярное произведение двух векторов &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**вычисляется линейная комбинация векторов; &lt;br /&gt;
**вычисляется норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**проверяется условие выхода из цикла (равенство нулю нормы вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;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;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Посчитаем количество операций, необходимых для поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений и векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; действий для умножения матрицы на вектор&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; действия для перемножения двух векторов&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  операций для поэлементного сложения или вычитания двух векторов&lt;br /&gt;
* для отыскания нормы вектора помимо &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  сложений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  умножений требуется 1 операция извлечения корня&lt;br /&gt;
* для поиска собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; требуется &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарно для одной итерации алгоритма требуется совершить  &amp;lt;math&amp;gt;O(n^2)+O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
В данном разделе представлен информационный граф алгоритма, дающий представление о переходе от одной итерации к другой.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Информационный_граф_1.png|1000px|thumb|center| &amp;lt;math&amp;gt;||x||&amp;lt;/math&amp;gt; - операция вычисления нормы;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; - операция деления;&lt;br /&gt;
• - операция скалярного умножения векторов;&lt;br /&gt;
Ax - операция применения оператора A к вектору x;&lt;br /&gt;
F - операция вычисления линейной комбинации.]]&lt;br /&gt;
Желтый ромб символизирует проверку логического условия выхода из итерационного цикла (в случае если посчитанная норма равна нулю).&lt;br /&gt;
Input,Out - входные и выходные данные.&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;n\times n&amp;lt;/math&amp;gt; на вектор размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
В свою очередь ресурс параллелизма операции поиска собственных значений зависит от выбранного способа и не рассматривается в данной статье.&lt;br /&gt;
&lt;br /&gt;
Таким образом, с точки зрения ресурса параллелизма, алгоритм Ланцоша обладает линейной сложностью по ширине ЯПФ и квадратичной сложностью по высоте ЯПФ. Основное время работы алгоритма будет уделено операции умножения матрицы на вектор, имеющей ширину яруса &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;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;A&amp;lt;/math&amp;gt;, следовательно на вход данный алгоритм во всяком случае получает 1 число и 1 матрицу размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;. Помимо этого для начала работы алгоритму нужен некоторый вектор &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; начального приближения размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, который тоже является входными данными.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После окончания работы алгоритма мы получаем набор собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, состоящий из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; элементов. Если помимо собственных значений выводятся еще и полученные собственные векторы, то суммарный объём всех таких векторов составляет &amp;lt;math&amp;gt;k\times n&amp;lt;/math&amp;gt; элементов. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, совокупный объём входных данных составляет: &amp;lt;math&amp;gt;n^2+n+1&amp;lt;/math&amp;gt; элемент, а на выходе получаем &amp;lt;math&amp;gt;k(n+1)&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;lt;math&amp;gt;A&amp;lt;/math&amp;gt;) начиная с максимального в абсолютном смысле значения. Это выгодно отличает данный алгоритм с точки зрения поиска собственных значений матрицы, находящихся по краям её спектра.&lt;br /&gt;
&lt;br /&gt;
Не является полностью детерминированным, т.к. может досрочно завершить работу, если будут найдены все ненулевые собственные значения.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма (то есть отношение числа операций к суммарному объему входных и выходных данных) равна &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+2n+1}&amp;lt;/math&amp;gt;. Следовательно порядок мощности алгоритма примерно равен &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;, при &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В случае использования метода вычисления собственных значений с линейной сложностью, соотношение последовательной и параллельной сложностей будет равно &amp;lt;math&amp;gt;(k ^ 2 + n ^ 2) / (k  + n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша может быть модифицирован так, чтобы быть пригодным для применения к несимметричным системам.&lt;br /&gt;
&lt;br /&gt;
Существует усложнение алгоритма, которое позволяет сократить объём хранимых на каждой итерации векторов с 3-ух до 2-ух.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма=== &lt;br /&gt;
=== Локальность данных и вычислений=== &lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма=== &lt;br /&gt;
===  Масштабируемость алгоритма и его реализации===&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма=== &lt;br /&gt;
=== Выводы для классов архитектур=== &lt;br /&gt;
=== Существующие реализации алгоритма===&lt;br /&gt;
&lt;br /&gt;
В настоящее время алгоритм Ланцоша поиска собственных значений квадратной симметричной матрицы включён в несколько библиотек и реализован на различных языках, среди которых такие наиболее распространенные как &#039;&#039;&#039;C&#039;&#039;&#039;, &#039;&#039;&#039;C++&#039;&#039;&#039;, &#039;&#039;&#039;FORTRAN77/90&#039;&#039;&#039;, &#039;&#039;&#039;MathLab&#039;&#039;&#039;.&lt;br /&gt;
Так, например, в языке &#039;&#039;&#039;MathLab&#039;&#039;&#039; во встроенном пакете &#039;&#039;&#039;ARPACK&#039;&#039;&#039; найти собственные значения методом Ланцоша можно при помощи вызова функции &#039;&#039;eigs()&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
На языке &#039;&#039;&#039;С&#039;&#039;&#039; существует библиотека &#039;&#039;&#039;[http://www.cs.wm.edu/~andreas/software/ PRIMME]&#039;&#039;&#039;, название которой расшифровывается как PReconditioned Iterative MultiMethod Eigensolver (итерационные методы поиска собственных значений с предусловием).&lt;br /&gt;
&lt;br /&gt;
Библиотека &#039;&#039;&#039;[http://www.nag.co.uk NAG] Numerical Library&#039;&#039;&#039; также содержит обширный набор функций, позволяющих проводить математический анализ, среди которых есть и реализация алгоритма Ланцоша. Библиотека доступна в трех пакетах: NAG C Library, NAG Fortran Library и NAG Library for .NET, совместна со многими языками и с основными операционными системами (Windows, Linux and OS X, а также Solaris, AIX и HP-UX).&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] Дж. Деммель «Вычислительная линейная алгебра», с 381.&lt;br /&gt;
&lt;br /&gt;
[2] Wikipedia https://en.wikipedia.org/wiki/Lanczos_algorithm&lt;br /&gt;
&lt;br /&gt;
[3] &amp;quot;[https://static.ph.ed.ac.uk/dissertations/hpc-msc/2013-2014/Investigation%20and%20Implementation%20of%20an%20Eigensolver%20Method.pdf Investigation and Implementation of an Eigensolver Method]&amp;quot;, Jorge Moreira, The University of Edinburgh, August 2014&lt;br /&gt;
&lt;br /&gt;
[4] &amp;quot;[http://www.physics.drexel.edu/~bob/Term_Reports/Hoppe_01.pdf Lanczos Vector Procedures]&amp;quot;, Travis Hoppe&lt;br /&gt;
&lt;br /&gt;
[5] &amp;quot;[http://pochenfullwave.ddns.net/wp-content/uploads/2015/09/61309283-Parallel-Scientific-Computing-in-C-and-MPI-2003.pdf Parallel Scientific Computing in C++ and MPI]&amp;quot;,&lt;br /&gt;
A seamless approach to parallel algorithms and their implementation,&lt;br /&gt;
George Em Karniadakis and Robert M. Kirby II,&lt;br /&gt;
Cambridge University Press&lt;/div&gt;</summary>
		<author><name>Alexbashirov</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=15959</id>
		<title>Участник:Alexbashirov/Алгоритм Ланцоша для точной арифметики</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=15959"/>
		<updated>2016-11-05T19:33:08Z</updated>

		<summary type="html">&lt;p&gt;Alexbashirov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник: Alexbashirov|Баширов А.Д.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name             = Алгоритм Ланцоша для точной арифметики&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;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;
Алгоритм Ланцоша является прямым алгоритмом поиска собственных значений симметричной матрицы, разработанным венгерским физиком и математиком XX столетия Корнелием Ланцошем в 1950 году. Алгоритм совмещает в себе два других алгоритма: алгоритм построения подпространства Крылова (который также был создан Ланцошем) и процедуру Рэлея-Ритца приближения собственных значений матрицы. Алгоритм является вариацией степенного метода, позволяющего найти собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-го порядка. Однако в алгоритме число итераций ограничено некоторым &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;. Несмотря на заявленную вычислительную эффективность, алгоритм не получил широкого применения в своём первоначальном виде, ввиду его неустойчивости. 20 лет спустя, в 1970 году ученые Ojalvo и Newman показали доработанный алгоритм Ланцоша, который теперь стал устойчивым а также предложили способ выбора вектора начального приближения &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt;. Полученный последователями Ланцоша алгоритм получил название &amp;quot;Алгоритм Ланцоша с полной переортогонализацией&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма===&lt;br /&gt;
Алгоритм Ланцоша работает с вещественной симметричной матрицей &amp;lt;math&amp;gt;A=A^T&amp;lt;/math&amp;gt;, таким образом в памяти достаточно хранить лишь немногим более половины элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Прежде чем переходить к описанию алгоритма, следует упомянуть следующие понятия: подпространство Крылова и процесс Рэлея-Ритца, о которых уже было сказано в исторической справке выше. &lt;br /&gt;
Подпространством Крылова называется набор векторов&amp;lt;math&amp;gt;K_n =[b,Ab,A^2b,...,A^{n-1}b]&amp;lt;/math&amp;gt;. Начав свою работу с произвольного вектора &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, степенной метод вычисляет вектора &amp;lt;math&amp;gt;Ab, A^2b,...,A^{n-1}b&amp;lt;/math&amp;gt; итерационно сохраняя полученный результат в вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Полученная последовательность векторов сходится к собственному вектору, отвечающему максимальному собственному значению &amp;lt;math&amp;gt;\lambda_{max}&amp;lt;/math&amp;gt;. Однако, использование лишь последнего полученного вектора и потеря всех предшествующих посчитанных величин не всегда является наилучшим выбором. Поэтому сохранив все вектора и объединив их в одну матрицу мы получим так называемую &#039;&#039;&#039;матрицу Крылова&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K_j = [b,Ab,A^2b,...,A^{j-1}b]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Столбцы получившейся матрицы не ортогональны, однако их можно ортогонализовать, применив процесс Грамма-Шмидта. Получившиеся вектора будут составлять базис подпространства Крылова &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt;. Можно ожидать, что вектора полученного базиса будут достаточно хорошо приближать &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; собственных векторов, отвечающих &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; наибольшим собственным значения.&lt;br /&gt;
&lt;br /&gt;
Затем с использованием полученной матрицы из ортогональных векторов &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt; мы получим трехдиагональную матрицу &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; на основе исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
Наконец, к полученной матрице &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; будет применяться &#039;&#039;&#039;процесс Рэлея-Ритца&#039;&#039;&#039;, который найдет собственные значения трехдиагональной матрицы. В последствии эти значения и будут приближениями искомых собственных значений исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма Ланцоша, то есть наиболее ресурсно-затратной частью алгоритма, является шаг на котором на каждой итерации происходит перемножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;, полученный на предыдущей итерации. Полученный в результате умножения вектор обозначается &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; z=Aq_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;Q_j=[q_1,q_2,...q_j]&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортонормированных вектров Ланцоша и последующее формирование трехдиагональной матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;. Число таких векторов и, следовательно, размер матрицы растет с каждой итерацией. Итерационный процесс завершается при &amp;lt;math&amp;gt;j=k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На долю второй части алгоритма приходится поиск собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;, полученной в первой части.&lt;br /&gt;
&lt;br /&gt;
=== Схема последовательной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ланцош_Схема реализации.png|800px]]&lt;br /&gt;
&lt;br /&gt;
На рисунке выше представлен псевдокод, отражающий последовательность действий в алгоритме метода. Перечислим основные ступени в данном методе:&lt;br /&gt;
* Прежде чем войти в цикл, происходит инициализация констант &amp;lt;math&amp;gt;\Beta_0,q_0&amp;lt;/math&amp;gt;, вычисление нормы вектора начального приближения &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и нормализация этого вектора.&lt;br /&gt;
* Затем, в цикле, происходит: &lt;br /&gt;
**поиск вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, являющегося результатом применения матричного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;; &lt;br /&gt;
**скалярное произведение двух векторов &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**вычисляется линейная комбинация векторов; &lt;br /&gt;
**вычисляется норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**проверяется условие выхода из цикла (равенство нулю нормы вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;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;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Посчитаем количество операций, необходимых для поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений и векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; действий для умножения матрицы на вектор&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; действия для перемножения двух векторов&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  операций для поэлементного сложения или вычитания двух векторов&lt;br /&gt;
* для отыскания нормы вектора помимо &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  сложений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  умножений требуется 1 операция извлечения корня&lt;br /&gt;
* для поиска собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; требуется &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарно для одной итерации алгоритма требуется совершить  &amp;lt;math&amp;gt;O(n^2)+O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
В данном разделе представлен информационный граф алгоритма, дающий представление о переходе от одной итерации к другой.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Информационный_граф_1.png|1000px|thumb|center| &amp;lt;math&amp;gt;||x||&amp;lt;/math&amp;gt; - операция вычисления нормы;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; - операция деления;&lt;br /&gt;
• - операция скалярного умножения векторов;&lt;br /&gt;
Ax - операция применения оператора A к вектору x;&lt;br /&gt;
F - операция вычисления линейной комбинации.]]&lt;br /&gt;
Желтый ромб символизирует проверку логического условия выхода из итерационного цикла (в случае если посчитанная норма равна нулю).&lt;br /&gt;
Input,Out - входные и выходные данные.&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;n\times n&amp;lt;/math&amp;gt; на вектор размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
В свою очередь ресурс параллелизма операции поиска собственных значений зависит от выбранного способа и не рассматривается в данной статье.&lt;br /&gt;
&lt;br /&gt;
Таким образом, с точки зрения ресурса параллелизма, алгоритм Ланцоша обладает линейной сложностью по ширине ЯПФ и квадратичной сложностью по высоте ЯПФ. Основное время работы алгоритма будет уделено операции умножения матрицы на вектор, имеющей ширину яруса &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;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;A&amp;lt;/math&amp;gt;, следовательно на вход данный алгоритм во всяком случае получает 1 число и 1 матрицу размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;. Помимо этого для начала работы алгоритму нужен некоторый вектор &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; начального приближения размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, который тоже является входными данными.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После окончания работы алгоритма мы получаем набор собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, состоящий из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; элементов. Если помимо собственных значений выводятся еще и полученные собственные векторы, то суммарный объём всех таких векторов составляет &amp;lt;math&amp;gt;k\times n&amp;lt;/math&amp;gt; элементов. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, совокупный объём входных данных составляет: &amp;lt;math&amp;gt;n^2+n+1&amp;lt;/math&amp;gt; элемент, а на выходе получаем &amp;lt;math&amp;gt;k(n+1)&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;lt;math&amp;gt;A&amp;lt;/math&amp;gt;) начиная с максимального в абсолютном смысле значения. Это выгодно отличает данный алгоритм с точки зрения поиска собственных значений матрицы, находящихся по краям её спектра.&lt;br /&gt;
&lt;br /&gt;
Не является полностью детерминированным, т.к. может досрочно завершить работу, если будут найдены все ненулевые собственные значения.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма (то есть отношение числа операций к суммарному объему входных и выходных данных) равна &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+2n+1}&amp;lt;/math&amp;gt;. Следовательно порядок мощности алгоритма примерно равен &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;, при &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В случае использования метода вычисления собственных значений с линейной сложностью, соотношение последовательной и параллельной сложностей будет равно &amp;lt;math&amp;gt;(k ^ 2 + n ^ 2) / (k  + n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша может быть модифицирован так, чтобы быть пригодным для применения к несимметричным системам.&lt;br /&gt;
&lt;br /&gt;
Существует усложнение алгоритма, которое позволяет сократить объём хранимых на каждой итерации векторов с 3-ух до 2-ух.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма=== &lt;br /&gt;
=== Локальность данных и вычислений=== &lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма=== &lt;br /&gt;
===  Масштабируемость алгоритма и его реализации===&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма=== &lt;br /&gt;
=== Выводы для классов архитектур=== &lt;br /&gt;
=== Существующие реализации алгоритма===&lt;br /&gt;
&lt;br /&gt;
В настоящее время алгоритм Ланцоша поиска собственных значений квадратной симметричной матрицы включён в несколько библиотек и реализован на различных языках, среди которых такие наиболее распространенные как &#039;&#039;&#039;C&#039;&#039;&#039;, &#039;&#039;&#039;C++&#039;&#039;&#039;, &#039;&#039;&#039;FORTRAN77/90&#039;&#039;&#039;, &#039;&#039;&#039;MathLab&#039;&#039;&#039;.&lt;br /&gt;
Так, например, в языке &#039;&#039;&#039;MathLab&#039;&#039;&#039; во встроенном пакете &#039;&#039;&#039;ARPACK&#039;&#039;&#039; найти собственные значения методом Ланцоша можно при помощи вызова функции &#039;&#039;eigs()&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
На языке &#039;&#039;&#039;С&#039;&#039;&#039; существует библиотека &#039;&#039;&#039;[http://www.cs.wm.edu/~andreas/software/ PRIMME]&#039;&#039;&#039;, название которой расшифровывается как PReconditioned Iterative MultiMethod Eigensolver (итерационные методы поиска собственных значений с предусловием).&lt;br /&gt;
&lt;br /&gt;
Библиотека &#039;&#039;&#039;[http://www.nag.co.uk NAG] Numerical Library&#039;&#039;&#039; также содержит обширный набор функций, позволяющих проводить математический анализ, среди которых есть и реализация алгоритма Ланцоша. Библиотека доступна в трех пакетах: NAG C Library, NAG Fortran Library и NAG Library for .NET, совместна со многими языками и с основными операционными системами (Windows, Linux and OS X, а также Solaris, AIX и HP-UX).&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] Дж. Деммель «Вычислительная линейная алгебра», с 381.&lt;br /&gt;
&lt;br /&gt;
[2] Wikipedia https://en.wikipedia.org/wiki/Lanczos_algorithm&lt;br /&gt;
&lt;br /&gt;
[3] &amp;quot;[https://static.ph.ed.ac.uk/dissertations/hpc-msc/2013-2014/Investigation%20and%20Implementation%20of%20an%20Eigensolver%20Method.pdf Investigation and Implementation of an Eigensolver Method]&amp;quot;, Jorge Moreira, The University of Edinburgh, August 2014&lt;br /&gt;
&lt;br /&gt;
[4] &amp;quot;[http://www.physics.drexel.edu/~bob/Term_Reports/Hoppe_01.pdf Lanczos Vector Procedures]&amp;quot;, Travis Hoppe&lt;br /&gt;
&lt;br /&gt;
[5] &amp;quot;[http://pochenfullwave.ddns.net/wp-content/uploads/2015/09/61309283-Parallel-Scientific-Computing-in-C-and-MPI-2003.pdf Parallel Scientific Computing in C++ and MPI&lt;br /&gt;
A seamless approach to parallel algorithms and their implementation]&amp;quot;,&lt;br /&gt;
George Em Karniadakis and Robert M. Kirby II,&lt;br /&gt;
Cambridge University Press&lt;/div&gt;</summary>
		<author><name>Alexbashirov</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=15953</id>
		<title>Участник:Alexbashirov/Алгоритм Ланцоша для точной арифметики</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=15953"/>
		<updated>2016-11-05T14:57:19Z</updated>

		<summary type="html">&lt;p&gt;Alexbashirov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник: Alexbashirov|Баширов А.Д.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name             = Алгоритм Ланцоша для точной арифметики&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;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;
Алгоритм Ланцоша является прямым алгоритмом поиска собственных значений симметричной матрицы, разработанным венгерским физиком и математиком XX столетия Корнелием Ланцошем в 1950 году. Алгоритм совмещает в себе два других алгоритма: алгоритм построения подпространства Крылова (который также был создан Ланцошем) и процедуру Рэлея-Ритца приближения собственных значений матрицы. Алгоритм является вариацией степенного метода, позволяющего найти собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-го порядка. Однако в алгоритме число итераций ограничено некоторым &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;. Несмотря на заявленную вычислительную эффективность, алгоритм не получил широкого применения в своём первоначальном виде, ввиду его неустойчивости. 20 лет спустя, в 1970 году ученые Ojalvo и Newman показали доработанный алгоритм Ланцоша, который теперь стал устойчивым а также предложили способ выбора вектора начального приближения &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt;. Полученный последователями Ланцоша алгоритм получил название &amp;quot;Алгоритм Ланцоша с полной переортогонализацией&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма===&lt;br /&gt;
Алгоритм Ланцоша работает с вещественной симметричной матрицей &amp;lt;math&amp;gt;A=A^T&amp;lt;/math&amp;gt;, таким образом в памяти достаточно хранить лишь немногим более половины элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Прежде чем переходить к описанию алгоритма, следует упомянуть следующие понятия: подпространство Крылова и процесс Рэлея-Ритца, о которых уже было сказано в исторической справке выше. &lt;br /&gt;
Подпространством Крылова называется набор векторов&amp;lt;math&amp;gt;K_n =[b,Ab,A^2b,...,A^{n-1}b]&amp;lt;/math&amp;gt;. Начав свою работу с произвольного вектора &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, степенной метод вычисляет вектора &amp;lt;math&amp;gt;Ab, A^2b,...,A^{n-1}b&amp;lt;/math&amp;gt; итерационно сохраняя полученный результат в вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Полученная последовательность векторов сходится к собственному вектору, отвечающему максимальному собственному значению &amp;lt;math&amp;gt;\lambda_{max}&amp;lt;/math&amp;gt;. Однако, использование лишь последнего полученного вектора и потеря всех предшествующих посчитанных величин не всегда является наилучшим выбором. Поэтому сохранив все вектора и объединив их в одну матрицу мы получим так называемую &#039;&#039;&#039;матрицу Крылова&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K_j = [b,Ab,A^2b,...,A^{j-1}b]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Столбцы получившейся матрицы не ортогональны, однако их можно ортогонализовать, применив процесс Грамма-Шмидта. Получившиеся вектора будут составлять базис подпространства Крылова &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt;. Можно ожидать, что вектора полученного базиса будут достаточно хорошо приближать &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; собственных векторов, отвечающих &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; наибольшим собственным значения.&lt;br /&gt;
&lt;br /&gt;
Затем с использованием полученной матрицы из ортогональных векторов &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt; мы получим трехдиагональную матрицу &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; на основе исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
Наконец, к полученной матрице &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; будет применяться &#039;&#039;&#039;процесс Рэлея-Ритца&#039;&#039;&#039;, который найдет собственные значения трехдиагональной матрицы. В последствии эти значения и будут приближениями искомых собственных значений исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма Ланцоша, то есть наиболее ресурсно-затратной частью алгоритма, является шаг на котором на каждой итерации происходит перемножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;, полученный на предыдущей итерации. Полученный в результате умножения вектор обозначается &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; z=Aq_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;Q_j=[q_1,q_2,...q_j]&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортонормированных вектров Ланцоша и последующее формирование трехдиагональной матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;. Число таких векторов и, следовательно, размер матрицы растет с каждой итерацией. Итерационный процесс завершается при &amp;lt;math&amp;gt;j=k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На долю второй части алгоритма приходится поиск собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;, полученной в первой части.&lt;br /&gt;
&lt;br /&gt;
=== Схема последовательной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ланцош_Схема реализации.png|800px]]&lt;br /&gt;
&lt;br /&gt;
На рисунке выше представлен псевдокод, отражающий последовательность действий в алгоритме метода. Перечислим основные ступени в данном методе:&lt;br /&gt;
* Прежде чем войти в цикл, происходит инициализация констант &amp;lt;math&amp;gt;\Beta_0,q_0&amp;lt;/math&amp;gt;, вычисление нормы вектора начального приближения &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и нормализация этого вектора.&lt;br /&gt;
* Затем, в цикле, происходит: &lt;br /&gt;
**поиск вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, являющегося результатом применения матричного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;; &lt;br /&gt;
**скалярное произведение двух векторов &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**вычисляется линейная комбинация векторов; &lt;br /&gt;
**вычисляется норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**проверяется условие выхода из цикла (равенство нулю нормы вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;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;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Посчитаем количество операций, необходимых для поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений и векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; действий для умножения матрицы на вектор&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; действия для перемножения двух векторов&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  операций для поэлементного сложения или вычитания двух векторов&lt;br /&gt;
* для отыскания нормы вектора помимо &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  сложений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  умножений требуется 1 операция извлечения корня&lt;br /&gt;
* для поиска собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; требуется &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарно для одной итерации алгоритма требуется совершить  &amp;lt;math&amp;gt;O(n^2)+O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
В данном разделе представлен информационный граф алгоритма, дающий представление о переходе от одной итерации к другой.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Информационный_граф_1.png|1000px|thumb|center| &amp;lt;math&amp;gt;||x||&amp;lt;/math&amp;gt; - операция вычисления нормы;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; - операция деления;&lt;br /&gt;
• - операция скалярного умножения векторов;&lt;br /&gt;
Ax - операция применения оператора A к вектору x;&lt;br /&gt;
F - операция вычисления линейной комбинации.]]&lt;br /&gt;
Желтый ромб символизирует проверку логического условия выхода из итерационного цикла (в случае если посчитанная норма равна нулю).&lt;br /&gt;
Input,Out - входные и выходные данные.&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;n\times n&amp;lt;/math&amp;gt; на вектор размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
В свою очередь ресурс параллелизма операции поиска собственных значений зависит от выбранного способа и не рассматривается в данной статье.&lt;br /&gt;
&lt;br /&gt;
Таким образом, с точки зрения ресурса параллелизма, алгоритм Ланцоша обладает линейной сложностью по ширине ЯПФ и квадратичной сложностью по высоте ЯПФ. Основное время работы алгоритма будет уделено операции умножения матрицы на вектор, имеющей ширину яруса &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;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;A&amp;lt;/math&amp;gt;, следовательно на вход данный алгоритм во всяком случае получает 1 число и 1 матрицу размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;. Помимо этого для начала работы алгоритму нужен некоторый вектор &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; начального приближения размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, который тоже является входными данными.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После окончания работы алгоритма мы получаем набор собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, состоящий из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; элементов. Если помимо собственных значений выводятся еще и полученные собственные векторы, то суммарный объём всех таких векторов составляет &amp;lt;math&amp;gt;k\times n&amp;lt;/math&amp;gt; элементов. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, совокупный объём входных данных составляет: &amp;lt;math&amp;gt;n^2+n+1&amp;lt;/math&amp;gt; элемент, а на выходе получаем &amp;lt;math&amp;gt;k(n+1)&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;lt;math&amp;gt;A&amp;lt;/math&amp;gt;) начиная с максимального в абсолютном смысле значения. Это выгодно отличает данный алгоритм с точки зрения поиска собственных значений матрицы, находящихся по краям её спектра.&lt;br /&gt;
&lt;br /&gt;
Не является полностью детерминированным, т.к. может досрочно завершить работу, если будут найдены все ненулевые собственные значения.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма (то есть отношение числа операций к суммарному объему входных и выходных данных) равна &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+2n+1}&amp;lt;/math&amp;gt;. Следовательно порядок мощности алгоритма примерно равен &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;, при &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В случае использования метода вычисления собственных значений с линейной сложностью, соотношение последовательной и параллельной сложностей будет равно &amp;lt;math&amp;gt;(k ^ 2 + n ^ 2) / (k  + n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша может быть модифицирован так, чтобы быть пригодным для применения к несимметричным системам.&lt;br /&gt;
&lt;br /&gt;
Существует усложнение алгоритма, которое позволяет сократить объём хранимых на каждой итерации векторов с 3-ух до 2-ух.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма=== &lt;br /&gt;
=== Локальность данных и вычислений=== &lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма=== &lt;br /&gt;
===  Масштабируемость алгоритма и его реализации===&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма=== &lt;br /&gt;
=== Выводы для классов архитектур=== &lt;br /&gt;
=== Существующие реализации алгоритма===&lt;br /&gt;
&lt;br /&gt;
В настоящее время алгоритм Ланцоша поиска собственных значений квадратной симметричной матрицы включён в несколько библиотек и реализован на различных языках, среди которых такие наиболее распространенные как &#039;&#039;&#039;C&#039;&#039;&#039;, &#039;&#039;&#039;C++&#039;&#039;&#039;, &#039;&#039;&#039;FORTRAN77/90&#039;&#039;&#039;, &#039;&#039;&#039;MathLab&#039;&#039;&#039;.&lt;br /&gt;
Так, например, в языке &#039;&#039;&#039;MathLab&#039;&#039;&#039; во встроенном пакете &#039;&#039;&#039;ARPACK&#039;&#039;&#039; найти собственные значения методом Ланцоша можно при помощи вызова функции &#039;&#039;eigs()&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
На языке &#039;&#039;&#039;С&#039;&#039;&#039; существует библиотека &#039;&#039;&#039;[http://www.cs.wm.edu/~andreas/software/ PRIMME]&#039;&#039;&#039;, название которой расшифровывается как PReconditioned Iterative MultiMethod Eigensolver (итерационные методы поиска собственных значений с предусловием).&lt;br /&gt;
&lt;br /&gt;
Библиотека &#039;&#039;&#039;[http://www.nag.co.uk NAG] Numerical Library&#039;&#039;&#039; также содержит обширный набор функций, позволяющих проводить математический анализ, среди которых есть и реализация алгоритма Ланцоша. Библиотека доступна в трех пакетах: NAG C Library, NAG Fortran Library и NAG Library for .NET, совместна со многими языками и с основными операционными системами (Windows, Linux and OS X, а также Solaris, AIX и HP-UX).&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] Дж. Деммель «Вычислительная линейная алгебра», с 381.&lt;br /&gt;
&lt;br /&gt;
[2] Wikipedia https://en.wikipedia.org/wiki/Lanczos_algorithm&lt;br /&gt;
&lt;br /&gt;
[3] &amp;quot;[https://static.ph.ed.ac.uk/dissertations/hpc-msc/2013-2014/Investigation%20and%20Implementation%20of%20an%20Eigensolver%20Method.pdf Investigation and Implementation of an Eigensolver Method]&amp;quot;, Jorge Moreira, The University of Edinburgh, August 2014&lt;br /&gt;
&lt;br /&gt;
[4] &amp;quot;[http://www.physics.drexel.edu/~bob/Term_Reports/Hoppe_01.pdf Lanczos Vector Procedures]&amp;quot;, Travis Hoppe&lt;br /&gt;
&lt;br /&gt;
[5] Parallel Scientific Computing in C++ and MPI&lt;br /&gt;
A seamless approach to parallel algorithms and their implementation,&lt;br /&gt;
George Em Karniadakis and Robert M. Kirby II,&lt;br /&gt;
Cambridge University Press&lt;/div&gt;</summary>
		<author><name>Alexbashirov</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=15952</id>
		<title>Участник:Alexbashirov/Алгоритм Ланцоша для точной арифметики</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=15952"/>
		<updated>2016-11-05T14:54:49Z</updated>

		<summary type="html">&lt;p&gt;Alexbashirov: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[Участник: Alexbashirov|Баширов А.Д.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name             = Алгоритм Ланцоша для точной арифметики&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;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;
Алгоритм Ланцоша является прямым алгоритмом поиска собственных значений симметричной матрицы, разработанным венгерским физиком и математиком XX столетия Корнелием Ланцошем в 1950 году. Алгоритм совмещает в себе два других алгоритма: алгоритм построения подпространства Крылова (который также был создан Ланцошем) и процедуру Рэлея-Ритца приближения собственных значений матрицы. Алгоритм является вариацией степенного метода, позволяющего найти собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-го порядка. Однако в алгоритме число итераций ограничено некоторым &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;. Несмотря на заявленную вычислительную эффективность, алгоритм не получил широкого применения в своём первоначальном виде, ввиду его неустойчивости. 20 лет спустя, в 1970 году ученые Ojalvo и Newman показали доработанный алгоритм Ланцоша, который теперь стал устойчивым а также предложили способ выбора вектора начального приближения &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt;. Полученный последователями Ланцоша алгоритм получил название &amp;quot;Алгоритм Ланцоша с полной переортогонализацией&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма===&lt;br /&gt;
Алгоритм Ланцоша работает с вещественной симметричной матрицей &amp;lt;math&amp;gt;A=A^T&amp;lt;/math&amp;gt;, таким образом в памяти достаточно хранить лишь немногим более половины элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Прежде чем переходить к описанию алгоритма, следует упомянуть следующие понятия: подпространство Крылова и процесс Рэлея-Ритца, о которых уже было сказано в исторической справке выше. &lt;br /&gt;
Подпространством Крылова называется набор векторов&amp;lt;math&amp;gt;K_n =[b,Ab,A^2b,...,A^{n-1}b]&amp;lt;/math&amp;gt;. Начав свою работу с произвольного вектора &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, степенной метод вычисляет вектора &amp;lt;math&amp;gt;Ab, A^2b,...,A^{n-1}b&amp;lt;/math&amp;gt; итерационно сохраняя полученный результат в вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Полученная последовательность векторов сходится к собственному вектору, отвечающему максимальному собственному значению &amp;lt;math&amp;gt;\lambda_{max}&amp;lt;/math&amp;gt;. Однако, использование лишь последнего полученного вектора и потеря всех предшествующих посчитанных величин не всегда является наилучшим выбором. Поэтому сохранив все вектора и объединив их в одну матрицу мы получим так называемую &#039;&#039;&#039;матрицу Крылова&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K_j = [b,Ab,A^2b,...,A^{j-1}b]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Столбцы получившейся матрицы не ортогональны, однако их можно ортогонализовать, применив процесс Грамма-Шмидта. Получившиеся вектора будут составлять базис подпространства Крылова &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt;. Можно ожидать, что вектора полученного базиса будут достаточно хорошо приближать &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; собственных векторов, отвечающих &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; наибольшим собственным значения.&lt;br /&gt;
&lt;br /&gt;
Затем с использованием полученной матрицы из ортогональных векторов &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt; мы получим трехдиагональную матрицу &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; на основе исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
Наконец, к полученной матрице &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; будет применяться &#039;&#039;&#039;процесс Рэлея-Ритца&#039;&#039;&#039;, который найдет собственные значения трехдиагональной матрицы. В последствии эти значения и будут приближениями искомых собственных значений исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма Ланцоша, то есть наиболее ресурсно-затратной частью алгоритма, является шаг на котором на каждой итерации происходит перемножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;, полученный на предыдущей итерации. Полученный в результате умножения вектор обозначается &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; z=Aq_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;Q_j=[q_1,q_2,...q_j]&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортонормированных вектров Ланцоша и последующее формирование трехдиагональной матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;. Число таких векторов и, следовательно, размер матрицы растет с каждой итерацией. Итерационный процесс завершается при &amp;lt;math&amp;gt;j=k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На долю второй части алгоритма приходится поиск собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;, полученной в первой части.&lt;br /&gt;
&lt;br /&gt;
=== Схема последовательной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ланцош_Схема реализации.png|800px]]&lt;br /&gt;
&lt;br /&gt;
На рисунке выше представлен псевдокод, отражающий последовательность действий в алгоритме метода. Перечислим основные ступени в данном методе:&lt;br /&gt;
* Прежде чем войти в цикл, происходит инициализация констант &amp;lt;math&amp;gt;\Beta_0,q_0&amp;lt;/math&amp;gt;, вычисление нормы вектора начального приближения &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и нормализация этого вектора.&lt;br /&gt;
* Затем, в цикле, происходит: &lt;br /&gt;
**поиск вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, являющегося результатом применения матричного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;; &lt;br /&gt;
**скалярное произведение двух векторов &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**вычисляется линейная комбинация векторов; &lt;br /&gt;
**вычисляется норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**проверяется условие выхода из цикла (равенство нулю нормы вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;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;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Посчитаем количество операций, необходимых для поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений и векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; действий для умножения матрицы на вектор&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; действия для перемножения двух векторов&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  операций для поэлементного сложения или вычитания двух векторов&lt;br /&gt;
* для отыскания нормы вектора помимо &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  сложений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  умножений требуется 1 операция извлечения корня&lt;br /&gt;
* для поиска собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; требуется &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарно для одной итерации алгоритма требуется совершить  &amp;lt;math&amp;gt;O(n^2)+O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
В данном разделе представлен информационный граф алгоритма, дающий представление о переходе от одной итерации к другой.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Информационный_граф_1.png|1000px|thumb|center| &amp;lt;math&amp;gt;||x||&amp;lt;/math&amp;gt; - операция вычисления нормы;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; - операция деления;&lt;br /&gt;
• - операция скалярного умножения векторов;&lt;br /&gt;
Ax - операция применения оператора A к вектору x;&lt;br /&gt;
F - операция вычисления линейной комбинации.]]&lt;br /&gt;
Желтый ромб символизирует проверку логического условия выхода из итерационного цикла (в случае если посчитанная норма равна нулю).&lt;br /&gt;
Input,Out - входные и выходные данные.&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;n\times n&amp;lt;/math&amp;gt; на вектор размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
В свою очередь ресурс параллелизма операции поиска собственных значений зависит от выбранного способа и не рассматривается в данной статье.&lt;br /&gt;
&lt;br /&gt;
Таким образом, с точки зрения ресурса параллелизма, алгоритм Ланцоша обладает линейной сложностью по ширине ЯПФ и квадратичной сложностью по высоте ЯПФ. Основное время работы алгоритма будет уделено операции умножения матрицы на вектор, имеющей ширину яруса &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;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;A&amp;lt;/math&amp;gt;, следовательно на вход данный алгоритм во всяком случае получает 1 число и 1 матрицу размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;. Помимо этого для начала работы алгоритму нужен некоторый вектор &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; начального приближения размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, который тоже является входными данными.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После окончания работы алгоритма мы получаем набор собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, состоящий из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; элементов. Если помимо собственных значений выводятся еще и полученные собственные векторы, то суммарный объём всех таких векторов составляет &amp;lt;math&amp;gt;k\times n&amp;lt;/math&amp;gt; элементов. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, совокупный объём входных данных составляет: &amp;lt;math&amp;gt;n^2+n+1&amp;lt;/math&amp;gt; элемент, а на выходе получаем &amp;lt;math&amp;gt;k(n+1)&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;lt;math&amp;gt;A&amp;lt;/math&amp;gt;) начиная с максимального в абсолютном смысле значения. Это выгодно отличает данный алгоритм с точки зрения поиска собственных значений матрицы, находящихся по краям её спектра.&lt;br /&gt;
&lt;br /&gt;
Не является полностью детерминированным, т.к. может досрочно завершить работу, если будут найдены все ненулевые собственные значения.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма (то есть отношение числа операций к суммарному объему входных и выходных данных) равна &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+2n+1}&amp;lt;/math&amp;gt;. Следовательно порядок мощности алгоритма примерно равен &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;, при &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В случае использования метода вычисления собственных значений с линейной сложностью, соотношение последовательной и параллельной сложностей будет равно &amp;lt;math&amp;gt;(k ^ 2 + n ^ 2) / (k  + n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша может быть модифицирован так, чтобы быть пригодным для применения к несимметричным системам.&lt;br /&gt;
&lt;br /&gt;
Существует усложнение алгоритма, которое позволяет сократить объём хранимых на каждой итерации векторов с 3-ух до 2-ух.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма=== &lt;br /&gt;
=== Локальность данных и вычислений=== &lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма=== &lt;br /&gt;
===  Масштабируемость алгоритма и его реализации===&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма=== &lt;br /&gt;
=== Выводы для классов архитектур=== &lt;br /&gt;
=== Существующие реализации алгоритма===&lt;br /&gt;
&lt;br /&gt;
В настоящее время алгоритм Ланцоша поиска собственных значений квадратной симметричной матрицы включён в несколько библиотек и реализован на различных языках, среди которых такие наиболее распространенные как &#039;&#039;&#039;C&#039;&#039;&#039;, &#039;&#039;&#039;C++&#039;&#039;&#039;, &#039;&#039;&#039;FORTRAN77/90&#039;&#039;&#039;, &#039;&#039;&#039;MathLab&#039;&#039;&#039;.&lt;br /&gt;
Так, например, в языке &#039;&#039;&#039;MathLab&#039;&#039;&#039; во встроенном пакете &#039;&#039;&#039;ARPACK&#039;&#039;&#039; найти собственные значения методом Ланцоша можно при помощи вызова функции &#039;&#039;eigs()&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
На языке &#039;&#039;&#039;С&#039;&#039;&#039; существует библиотека &#039;&#039;&#039;[http://www.cs.wm.edu/~andreas/software/ PRIMME]&#039;&#039;&#039;, название которой расшифровывается как PReconditioned Iterative MultiMethod Eigensolver (итерационные методы поиска собственных значений с предусловием).&lt;br /&gt;
&lt;br /&gt;
Библиотека &#039;&#039;&#039;[http://www.nag.co.uk NAG] Numerical Library&#039;&#039;&#039; также содержит обширный набор функций, позволяющих проводить математический анализ, среди которых есть и реализация алгоритма Ланцоша. Библиотека доступна в трех пакетах: NAG C Library, NAG Fortran Library и NAG Library for .NET, совместна со многими языками и с основными операционными системами (Windows, Linux and OS X, а также Solaris, AIX и HP-UX).&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] Дж. Деммель «Вычислительная линейная алгебра», с 381.&lt;br /&gt;
&lt;br /&gt;
[2] Wikipedia https://en.wikipedia.org/wiki/Lanczos_algorithm&lt;br /&gt;
&lt;br /&gt;
[3] &amp;quot;[https://static.ph.ed.ac.uk/dissertations/hpc-msc/2013-2014/Investigation%20and%20Implementation%20of%20an%20Eigensolver%20Method.pdf Investigation and Implementation of an Eigensolver Method]&amp;quot;, Jorge Moreira, The University of Edinburgh, August 2014&lt;br /&gt;
&lt;br /&gt;
[4] &amp;quot;[http://www.physics.drexel.edu/~bob/Term_Reports/Hoppe_01.pdf Lanczos Vector Procedures]&amp;quot;, Travis Hoppe&lt;br /&gt;
&lt;br /&gt;
[5] Parallel Scientific Computing in C++ and MPI&lt;br /&gt;
A seamless approach to parallel algorithms and their implementation,&lt;br /&gt;
George Em Karniadakis and Robert M. Kirby II,&lt;br /&gt;
Cambridge University Press&lt;/div&gt;</summary>
		<author><name>Alexbashirov</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=15951</id>
		<title>Участник:Alexbashirov/Алгоритм Ланцоша для точной арифметики</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=15951"/>
		<updated>2016-11-05T14:53:13Z</updated>

		<summary type="html">&lt;p&gt;Alexbashirov: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[Участник: Alexbashirov|Баширов А.Д.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name             = Алгоритм Ланцоша для точной арифметики&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;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;
Алгоритм Ланцоша является прямым алгоритмом поиска собственных значений симметричной матрицы, разработанным венгерским физиком и математиком XX столетия Корнелием Ланцошем в 1950 году. Алгоритм совмещает в себе два других алгоритма: алгоритм построения подпространства Крылова (который также был создан Ланцошем) и процедуру Рэлея-Ритца приближения собственных значений матрицы. Алгоритм является вариацией степенного метода, позволяющего найти собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-го порядка. Однако в алгоритме число итераций ограничено некоторым &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;. Несмотря на заявленную вычислительную эффективность, алгоритм не получил широкого применения в своём первоначальном виде, ввиду его неустойчивости. 20 лет спустя, в 1970 году ученые Ojalvo и Newman показали доработанный алгоритм Ланцоша, который теперь стал устойчивым а также предложили способ выбора вектора начального приближения &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt;. Полученный последователями Ланцоша алгоритм получил название &amp;quot;Алгоритм Ланцоша с полной переортогонализацией&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма===&lt;br /&gt;
Алгоритм Ланцоша работает с вещественной симметричной матрицей &amp;lt;math&amp;gt;A=A^T&amp;lt;/math&amp;gt;, таким образом в памяти достаточно хранить лишь немногим более половины элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Прежде чем переходить к описанию алгоритма, следует упомянуть следующие понятия: подпространство Крылова и процесс Рэлея-Ритца, о которых уже было сказано в исторической справке выше. &lt;br /&gt;
Подпространством Крылова называется набор векторов&amp;lt;math&amp;gt;K_n =[b,Ab,A^2b,...,A^{n-1}b]&amp;lt;/math&amp;gt;. Начав свою работу с произвольного вектора &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, степенной метод вычисляет вектора &amp;lt;math&amp;gt;Ab, A^2b,...,A^{n-1}b&amp;lt;/math&amp;gt; итерационно сохраняя полученный результат в вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Полученная последовательность векторов сходится к собственному вектору, отвечающему максимальному собственному значению &amp;lt;math&amp;gt;\lambda_{max}&amp;lt;/math&amp;gt;. Однако, использование лишь последнего полученного вектора и потеря всех предшествующих посчитанных величин не всегда является наилучшим выбором. Поэтому сохранив все вектора и объединив их в одну матрицу мы получим так называемую &#039;&#039;&#039;матрицу Крылова&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K_j = [b,Ab,A^2b,...,A^{j-1}b]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Столбцы получившейся матрицы не ортогональны, однако их можно ортогонализовать, применив процесс Грамма-Шмидта. Получившиеся вектора будут составлять базис подпространства Крылова &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt;. Можно ожидать, что вектора полученного базиса будут достаточно хорошо приближать &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; собственных векторов, отвечающих &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; наибольшим собственным значения.&lt;br /&gt;
&lt;br /&gt;
Затем с использованием полученной матрицы из ортогональных векторов &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt; мы получим трехдиагональную матрицу &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; на основе исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
Наконец, к полученной матрице &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; будет применяться &#039;&#039;&#039;процесс Рэлея-Ритца&#039;&#039;&#039;, который найдет собственные значения трехдиагональной матрицы. В последствии эти значения и будут приближениями искомых собственных значений исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма Ланцоша, то есть наиболее ресурсно-затратной частью алгоритма, является шаг на котором на каждой итерации происходит перемножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;, полученный на предыдущей итерации. Полученный в результате умножения вектор обозначается &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; z=Aq_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;Q_j=[q_1,q_2,...q_j]&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортонормированных вектров Ланцоша и последующее формирование трехдиагональной матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;. Число таких векторов и, следовательно, размер матрицы растет с каждой итерацией. Итерационный процесс завершается при &amp;lt;math&amp;gt;j=k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На долю второй части алгоритма приходится поиск собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;, полученной в первой части.&lt;br /&gt;
&lt;br /&gt;
=== Схема последовательной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ланцош_Схема реализации.png|800px]]&lt;br /&gt;
&lt;br /&gt;
На рисунке выше представлен псевдокод, отражающий последовательность действий в алгоритме метода. Перечислим основные ступени в данном методе:&lt;br /&gt;
* Прежде чем войти в цикл, происходит инициализация констант &amp;lt;math&amp;gt;\Beta_0,q_0&amp;lt;/math&amp;gt;, вычисление нормы вектора начального приближения &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и нормализация этого вектора.&lt;br /&gt;
* Затем, в цикле, происходит: &lt;br /&gt;
**поиск вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, являющегося результатом применения матричного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;; &lt;br /&gt;
**скалярное произведение двух векторов &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**вычисляется линейная комбинация векторов; &lt;br /&gt;
**вычисляется норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**проверяется условие выхода из цикла (равенство нулю нормы вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;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;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Посчитаем количество операций, необходимых для поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений и векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; действий для умножения матрицы на вектор&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; действия для перемножения двух векторов&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  операций для поэлементного сложения или вычитания двух векторов&lt;br /&gt;
* для отыскания нормы вектора помимо &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  сложений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  умножений требуется 1 операция извлечения корня&lt;br /&gt;
* для поиска собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; требуется &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарно для одной итерации алгоритма требуется совершить  &amp;lt;math&amp;gt;O(n^2)+O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
В данном разделе представлен информационный граф алгоритма, дающий представление о переходе от одной итерации к другой.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Информационный_граф_1.png|1000px|thumb|center| &amp;lt;math&amp;gt;||x||&amp;lt;/math&amp;gt; - операция вычисления нормы;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; - операция деления;&lt;br /&gt;
• - операция скалярного умножения векторов;&lt;br /&gt;
Ax - операция применения оператора A к вектору x;&lt;br /&gt;
F - операция вычисления линейной комбинации.]]&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;n\times n&amp;lt;/math&amp;gt; на вектор размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
В свою очередь ресурс параллелизма операции поиска собственных значений зависит от выбранного способа и не рассматривается в данной статье.&lt;br /&gt;
&lt;br /&gt;
Таким образом, с точки зрения ресурса параллелизма, алгоритм Ланцоша обладает линейной сложностью по ширине ЯПФ и квадратичной сложностью по высоте ЯПФ. Основное время работы алгоритма будет уделено операции умножения матрицы на вектор, имеющей ширину яруса &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;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;A&amp;lt;/math&amp;gt;, следовательно на вход данный алгоритм во всяком случае получает 1 число и 1 матрицу размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;. Помимо этого для начала работы алгоритму нужен некоторый вектор &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; начального приближения размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, который тоже является входными данными.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После окончания работы алгоритма мы получаем набор собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, состоящий из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; элементов. Если помимо собственных значений выводятся еще и полученные собственные векторы, то суммарный объём всех таких векторов составляет &amp;lt;math&amp;gt;k\times n&amp;lt;/math&amp;gt; элементов. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, совокупный объём входных данных составляет: &amp;lt;math&amp;gt;n^2+n+1&amp;lt;/math&amp;gt; элемент, а на выходе получаем &amp;lt;math&amp;gt;k(n+1)&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;lt;math&amp;gt;A&amp;lt;/math&amp;gt;) начиная с максимального в абсолютном смысле значения. Это выгодно отличает данный алгоритм с точки зрения поиска собственных значений матрицы, находящихся по краям её спектра.&lt;br /&gt;
&lt;br /&gt;
Не является полностью детерминированным, т.к. может досрочно завершить работу, если будут найдены все ненулевые собственные значения.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма (то есть отношение числа операций к суммарному объему входных и выходных данных) равна &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+2n+1}&amp;lt;/math&amp;gt;. Следовательно порядок мощности алгоритма примерно равен &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;, при &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В случае использования метода вычисления собственных значений с линейной сложностью, соотношение последовательной и параллельной сложностей будет равно &amp;lt;math&amp;gt;(k ^ 2 + n ^ 2) / (k  + n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша может быть модифицирован так, чтобы быть пригодным для применения к несимметричным системам.&lt;br /&gt;
&lt;br /&gt;
Существует усложнение алгоритма, которое позволяет сократить объём хранимых на каждой итерации векторов с 3-ух до 2-ух.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма=== &lt;br /&gt;
=== Локальность данных и вычислений=== &lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма=== &lt;br /&gt;
===  Масштабируемость алгоритма и его реализации===&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма=== &lt;br /&gt;
=== Выводы для классов архитектур=== &lt;br /&gt;
=== Существующие реализации алгоритма===&lt;br /&gt;
&lt;br /&gt;
В настоящее время алгоритм Ланцоша поиска собственных значений квадратной симметричной матрицы включён в несколько библиотек и реализован на различных языках, среди которых такие наиболее распространенные как &#039;&#039;&#039;C&#039;&#039;&#039;, &#039;&#039;&#039;C++&#039;&#039;&#039;, &#039;&#039;&#039;FORTRAN77/90&#039;&#039;&#039;, &#039;&#039;&#039;MathLab&#039;&#039;&#039;.&lt;br /&gt;
Так, например, в языке &#039;&#039;&#039;MathLab&#039;&#039;&#039; во встроенном пакете &#039;&#039;&#039;ARPACK&#039;&#039;&#039; найти собственные значения методом Ланцоша можно при помощи вызова функции &#039;&#039;eigs()&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
На языке &#039;&#039;&#039;С&#039;&#039;&#039; существует библиотека &#039;&#039;&#039;[http://www.cs.wm.edu/~andreas/software/ PRIMME]&#039;&#039;&#039;, название которой расшифровывается как PReconditioned Iterative MultiMethod Eigensolver (итерационные методы поиска собственных значений с предусловием).&lt;br /&gt;
&lt;br /&gt;
Библиотека &#039;&#039;&#039;[http://www.nag.co.uk NAG] Numerical Library&#039;&#039;&#039; также содержит обширный набор функций, позволяющих проводить математический анализ, среди которых есть и реализация алгоритма Ланцоша. Библиотека доступна в трех пакетах: NAG C Library, NAG Fortran Library и NAG Library for .NET, совместна со многими языками и с основными операционными системами (Windows, Linux and OS X, а также Solaris, AIX и HP-UX).&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] Дж. Деммель «Вычислительная линейная алгебра», с 381.&lt;br /&gt;
&lt;br /&gt;
[2] Wikipedia https://en.wikipedia.org/wiki/Lanczos_algorithm&lt;br /&gt;
&lt;br /&gt;
[3] &amp;quot;[https://static.ph.ed.ac.uk/dissertations/hpc-msc/2013-2014/Investigation%20and%20Implementation%20of%20an%20Eigensolver%20Method.pdf Investigation and Implementation of an Eigensolver Method]&amp;quot;, Jorge Moreira, The University of Edinburgh, August 2014&lt;br /&gt;
&lt;br /&gt;
[4] &amp;quot;[http://www.physics.drexel.edu/~bob/Term_Reports/Hoppe_01.pdf Lanczos Vector Procedures]&amp;quot;, Travis Hoppe&lt;br /&gt;
&lt;br /&gt;
[5] Parallel Scientific Computing in C++ and MPI&lt;br /&gt;
A seamless approach to parallel algorithms and their implementation,&lt;br /&gt;
George Em Karniadakis and Robert M. Kirby II,&lt;br /&gt;
Cambridge University Press&lt;/div&gt;</summary>
		<author><name>Alexbashirov</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=15950</id>
		<title>Участник:Alexbashirov/Алгоритм Ланцоша для точной арифметики</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=15950"/>
		<updated>2016-11-05T14:52:13Z</updated>

		<summary type="html">&lt;p&gt;Alexbashirov: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[Участник: Alexbashirov|Баширов А.Д.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name             = Алгоритм Ланцоша для точной арифметики&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;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;
Алгоритм Ланцоша является прямым алгоритмом поиска собственных значений симметричной матрицы, разработанным венгерским физиком и математиком XX столетия Корнелием Ланцошем в 1950 году. Алгоритм совмещает в себе два других алгоритма: алгоритм построения подпространства Крылова (который также был создан Ланцошем) и процедуру Рэлея-Ритца приближения собственных значений матрицы. Алгоритм является вариацией степенного метода, позволяющего найти собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-го порядка. Однако в алгоритме число итераций ограничено некоторым &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;. Несмотря на заявленную вычислительную эффективность, алгоритм не получил широкого применения в своём первоначальном виде, ввиду его неустойчивости. 20 лет спустя, в 1970 году ученые Ojalvo и Newman показали доработанный алгоритм Ланцоша, который теперь стал устойчивым а также предложили способ выбора вектора начального приближения &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt;. Полученный последователями Ланцоша алгоритм получил название &amp;quot;Алгоритм Ланцоша с полной переортогонализацией&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма===&lt;br /&gt;
Алгоритм Ланцоша работает с вещественной симметричной матрицей &amp;lt;math&amp;gt;A=A^T&amp;lt;/math&amp;gt;, таким образом в памяти достаточно хранить лишь немногим более половины элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Прежде чем переходить к описанию алгоритма, следует упомянуть следующие понятия: подпространство Крылова и процесс Рэлея-Ритца, о которых уже было сказано в исторической справке выше. &lt;br /&gt;
Подпространством Крылова называется набор векторов&amp;lt;math&amp;gt;K_n =[b,Ab,A^2b,...,A^{n-1}b]&amp;lt;/math&amp;gt;. Начав свою работу с произвольного вектора &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, степенной метод вычисляет вектора &amp;lt;math&amp;gt;Ab, A^2b,...,A^{n-1}b&amp;lt;/math&amp;gt; итерационно сохраняя полученный результат в вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Полученная последовательность векторов сходится к собственному вектору, отвечающему максимальному собственному значению &amp;lt;math&amp;gt;\lambda_{max}&amp;lt;/math&amp;gt;. Однако, использование лишь последнего полученного вектора и потеря всех предшествующих посчитанных величин не всегда является наилучшим выбором. Поэтому сохранив все вектора и объединив их в одну матрицу мы получим так называемую &#039;&#039;&#039;матрицу Крылова&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K_j = [b,Ab,A^2b,...,A^{j-1}b]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Столбцы получившейся матрицы не ортогональны, однако их можно ортогонализовать, применив процесс Грамма-Шмидта. Получившиеся вектора будут составлять базис подпространства Крылова &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt;. Можно ожидать, что вектора полученного базиса будут достаточно хорошо приближать &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; собственных векторов, отвечающих &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; наибольшим собственным значения.&lt;br /&gt;
&lt;br /&gt;
Затем с использованием полученной матрицы из ортогональных векторов &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt; мы получим трехдиагональную матрицу &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; на основе исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
Наконец, к полученной матрице &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; будет применяться &#039;&#039;&#039;процесс Рэлея-Ритца&#039;&#039;&#039;, который найдет собственные значения трехдиагональной матрицы. В последствии эти значения и будут приближениями искомых собственных значений исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма Ланцоша, то есть наиболее ресурсно-затратной частью алгоритма, является шаг на котором на каждой итерации происходит перемножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;, полученный на предыдущей итерации. Полученный в результате умножения вектор обозначается &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; z=Aq_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;Q_j=[q_1,q_2,...q_j]&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортонормированных вектров Ланцоша и последующее формирование трехдиагональной матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;. Число таких векторов и, следовательно, размер матрицы растет с каждой итерацией. Итерационный процесс завершается при &amp;lt;math&amp;gt;j=k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На долю второй части алгоритма приходится поиск собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;, полученной в первой части.&lt;br /&gt;
&lt;br /&gt;
=== Схема последовательной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ланцош_Схема реализации.png|800px]]&lt;br /&gt;
&lt;br /&gt;
На рисунке выше представлен псевдокод, отражающий последовательность действий в алгоритме метода. Перечислим основные ступени в данном методе:&lt;br /&gt;
* Прежде чем войти в цикл, происходит инициализация констант &amp;lt;math&amp;gt;\Beta_0,q_0&amp;lt;/math&amp;gt;, вычисление нормы вектора начального приближения &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и нормализация этого вектора.&lt;br /&gt;
* Затем, в цикле, происходит: &lt;br /&gt;
**поиск вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, являющегося результатом применения матричного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;; &lt;br /&gt;
**скалярное произведение двух векторов &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**вычисляется линейная комбинация векторов; &lt;br /&gt;
**вычисляется норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**проверяется условие выхода из цикла (равенство нулю нормы вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;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;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Посчитаем количество операций, необходимых для поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений и векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; действий для умножения матрицы на вектор&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; действия для перемножения двух векторов&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  операций для поэлементного сложения или вычитания двух векторов&lt;br /&gt;
* для отыскания нормы вектора помимо &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  сложений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  умножений требуется 1 операция извлечения корня&lt;br /&gt;
* для поиска собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; требуется &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарно для одной итерации алгоритма требуется совершить  &amp;lt;math&amp;gt;O(n^2)+O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
В данном разделе представлен информационный граф алгоритма, дающий представление о переходе от одной итерации к другой.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Информационный_граф_1.png|1000px|thumb|center| &amp;lt;math&amp;gt;||x||&amp;lt;/math&amp;gt; - операция вычисления нормы;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; - операция деления;&lt;br /&gt;
• - операция скалярного умножения векторов;&lt;br /&gt;
&amp;lt;bf&amp;gt;Ax&amp;lt;/bf&amp;gt; - операция применения оператора A к вектору x;&lt;br /&gt;
&amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; - операция вычисления линейной комбинации&amp;amp;.]]&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;n\times n&amp;lt;/math&amp;gt; на вектор размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
В свою очередь ресурс параллелизма операции поиска собственных значений зависит от выбранного способа и не рассматривается в данной статье.&lt;br /&gt;
&lt;br /&gt;
Таким образом, с точки зрения ресурса параллелизма, алгоритм Ланцоша обладает линейной сложностью по ширине ЯПФ и квадратичной сложностью по высоте ЯПФ. Основное время работы алгоритма будет уделено операции умножения матрицы на вектор, имеющей ширину яруса &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;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;A&amp;lt;/math&amp;gt;, следовательно на вход данный алгоритм во всяком случае получает 1 число и 1 матрицу размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;. Помимо этого для начала работы алгоритму нужен некоторый вектор &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; начального приближения размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, который тоже является входными данными.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После окончания работы алгоритма мы получаем набор собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, состоящий из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; элементов. Если помимо собственных значений выводятся еще и полученные собственные векторы, то суммарный объём всех таких векторов составляет &amp;lt;math&amp;gt;k\times n&amp;lt;/math&amp;gt; элементов. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, совокупный объём входных данных составляет: &amp;lt;math&amp;gt;n^2+n+1&amp;lt;/math&amp;gt; элемент, а на выходе получаем &amp;lt;math&amp;gt;k(n+1)&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;lt;math&amp;gt;A&amp;lt;/math&amp;gt;) начиная с максимального в абсолютном смысле значения. Это выгодно отличает данный алгоритм с точки зрения поиска собственных значений матрицы, находящихся по краям её спектра.&lt;br /&gt;
&lt;br /&gt;
Не является полностью детерминированным, т.к. может досрочно завершить работу, если будут найдены все ненулевые собственные значения.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма (то есть отношение числа операций к суммарному объему входных и выходных данных) равна &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+2n+1}&amp;lt;/math&amp;gt;. Следовательно порядок мощности алгоритма примерно равен &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;, при &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В случае использования метода вычисления собственных значений с линейной сложностью, соотношение последовательной и параллельной сложностей будет равно &amp;lt;math&amp;gt;(k ^ 2 + n ^ 2) / (k  + n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша может быть модифицирован так, чтобы быть пригодным для применения к несимметричным системам.&lt;br /&gt;
&lt;br /&gt;
Существует усложнение алгоритма, которое позволяет сократить объём хранимых на каждой итерации векторов с 3-ух до 2-ух.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма=== &lt;br /&gt;
=== Локальность данных и вычислений=== &lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма=== &lt;br /&gt;
===  Масштабируемость алгоритма и его реализации===&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма=== &lt;br /&gt;
=== Выводы для классов архитектур=== &lt;br /&gt;
=== Существующие реализации алгоритма===&lt;br /&gt;
&lt;br /&gt;
В настоящее время алгоритм Ланцоша поиска собственных значений квадратной симметричной матрицы включён в несколько библиотек и реализован на различных языках, среди которых такие наиболее распространенные как &#039;&#039;&#039;C&#039;&#039;&#039;, &#039;&#039;&#039;C++&#039;&#039;&#039;, &#039;&#039;&#039;FORTRAN77/90&#039;&#039;&#039;, &#039;&#039;&#039;MathLab&#039;&#039;&#039;.&lt;br /&gt;
Так, например, в языке &#039;&#039;&#039;MathLab&#039;&#039;&#039; во встроенном пакете &#039;&#039;&#039;ARPACK&#039;&#039;&#039; найти собственные значения методом Ланцоша можно при помощи вызова функции &#039;&#039;eigs()&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
На языке &#039;&#039;&#039;С&#039;&#039;&#039; существует библиотека &#039;&#039;&#039;[http://www.cs.wm.edu/~andreas/software/ PRIMME]&#039;&#039;&#039;, название которой расшифровывается как PReconditioned Iterative MultiMethod Eigensolver (итерационные методы поиска собственных значений с предусловием).&lt;br /&gt;
&lt;br /&gt;
Библиотека &#039;&#039;&#039;[http://www.nag.co.uk NAG] Numerical Library&#039;&#039;&#039; также содержит обширный набор функций, позволяющих проводить математический анализ, среди которых есть и реализация алгоритма Ланцоша. Библиотека доступна в трех пакетах: NAG C Library, NAG Fortran Library и NAG Library for .NET, совместна со многими языками и с основными операционными системами (Windows, Linux and OS X, а также Solaris, AIX и HP-UX).&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] Дж. Деммель «Вычислительная линейная алгебра», с 381.&lt;br /&gt;
&lt;br /&gt;
[2] Wikipedia https://en.wikipedia.org/wiki/Lanczos_algorithm&lt;br /&gt;
&lt;br /&gt;
[3] &amp;quot;[https://static.ph.ed.ac.uk/dissertations/hpc-msc/2013-2014/Investigation%20and%20Implementation%20of%20an%20Eigensolver%20Method.pdf Investigation and Implementation of an Eigensolver Method]&amp;quot;, Jorge Moreira, The University of Edinburgh, August 2014&lt;br /&gt;
&lt;br /&gt;
[4] &amp;quot;[http://www.physics.drexel.edu/~bob/Term_Reports/Hoppe_01.pdf Lanczos Vector Procedures]&amp;quot;, Travis Hoppe&lt;br /&gt;
&lt;br /&gt;
[5] Parallel Scientific Computing in C++ and MPI&lt;br /&gt;
A seamless approach to parallel algorithms and their implementation,&lt;br /&gt;
George Em Karniadakis and Robert M. Kirby II,&lt;br /&gt;
Cambridge University Press&lt;/div&gt;</summary>
		<author><name>Alexbashirov</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=15949</id>
		<title>Участник:Alexbashirov/Алгоритм Ланцоша для точной арифметики</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=15949"/>
		<updated>2016-11-05T14:51:45Z</updated>

		<summary type="html">&lt;p&gt;Alexbashirov: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[Участник: Alexbashirov|Баширов А.Д.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name             = Алгоритм Ланцоша для точной арифметики&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;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;
Алгоритм Ланцоша является прямым алгоритмом поиска собственных значений симметричной матрицы, разработанным венгерским физиком и математиком XX столетия Корнелием Ланцошем в 1950 году. Алгоритм совмещает в себе два других алгоритма: алгоритм построения подпространства Крылова (который также был создан Ланцошем) и процедуру Рэлея-Ритца приближения собственных значений матрицы. Алгоритм является вариацией степенного метода, позволяющего найти собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-го порядка. Однако в алгоритме число итераций ограничено некоторым &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;. Несмотря на заявленную вычислительную эффективность, алгоритм не получил широкого применения в своём первоначальном виде, ввиду его неустойчивости. 20 лет спустя, в 1970 году ученые Ojalvo и Newman показали доработанный алгоритм Ланцоша, который теперь стал устойчивым а также предложили способ выбора вектора начального приближения &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt;. Полученный последователями Ланцоша алгоритм получил название &amp;quot;Алгоритм Ланцоша с полной переортогонализацией&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма===&lt;br /&gt;
Алгоритм Ланцоша работает с вещественной симметричной матрицей &amp;lt;math&amp;gt;A=A^T&amp;lt;/math&amp;gt;, таким образом в памяти достаточно хранить лишь немногим более половины элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Прежде чем переходить к описанию алгоритма, следует упомянуть следующие понятия: подпространство Крылова и процесс Рэлея-Ритца, о которых уже было сказано в исторической справке выше. &lt;br /&gt;
Подпространством Крылова называется набор векторов&amp;lt;math&amp;gt;K_n =[b,Ab,A^2b,...,A^{n-1}b]&amp;lt;/math&amp;gt;. Начав свою работу с произвольного вектора &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, степенной метод вычисляет вектора &amp;lt;math&amp;gt;Ab, A^2b,...,A^{n-1}b&amp;lt;/math&amp;gt; итерационно сохраняя полученный результат в вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Полученная последовательность векторов сходится к собственному вектору, отвечающему максимальному собственному значению &amp;lt;math&amp;gt;\lambda_{max}&amp;lt;/math&amp;gt;. Однако, использование лишь последнего полученного вектора и потеря всех предшествующих посчитанных величин не всегда является наилучшим выбором. Поэтому сохранив все вектора и объединив их в одну матрицу мы получим так называемую &#039;&#039;&#039;матрицу Крылова&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K_j = [b,Ab,A^2b,...,A^{j-1}b]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Столбцы получившейся матрицы не ортогональны, однако их можно ортогонализовать, применив процесс Грамма-Шмидта. Получившиеся вектора будут составлять базис подпространства Крылова &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt;. Можно ожидать, что вектора полученного базиса будут достаточно хорошо приближать &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; собственных векторов, отвечающих &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; наибольшим собственным значения.&lt;br /&gt;
&lt;br /&gt;
Затем с использованием полученной матрицы из ортогональных векторов &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt; мы получим трехдиагональную матрицу &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; на основе исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
Наконец, к полученной матрице &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; будет применяться &#039;&#039;&#039;процесс Рэлея-Ритца&#039;&#039;&#039;, который найдет собственные значения трехдиагональной матрицы. В последствии эти значения и будут приближениями искомых собственных значений исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма Ланцоша, то есть наиболее ресурсно-затратной частью алгоритма, является шаг на котором на каждой итерации происходит перемножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;, полученный на предыдущей итерации. Полученный в результате умножения вектор обозначается &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; z=Aq_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;Q_j=[q_1,q_2,...q_j]&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортонормированных вектров Ланцоша и последующее формирование трехдиагональной матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;. Число таких векторов и, следовательно, размер матрицы растет с каждой итерацией. Итерационный процесс завершается при &amp;lt;math&amp;gt;j=k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На долю второй части алгоритма приходится поиск собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;, полученной в первой части.&lt;br /&gt;
&lt;br /&gt;
=== Схема последовательной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ланцош_Схема реализации.png|800px]]&lt;br /&gt;
&lt;br /&gt;
На рисунке выше представлен псевдокод, отражающий последовательность действий в алгоритме метода. Перечислим основные ступени в данном методе:&lt;br /&gt;
* Прежде чем войти в цикл, происходит инициализация констант &amp;lt;math&amp;gt;\Beta_0,q_0&amp;lt;/math&amp;gt;, вычисление нормы вектора начального приближения &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и нормализация этого вектора.&lt;br /&gt;
* Затем, в цикле, происходит: &lt;br /&gt;
**поиск вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, являющегося результатом применения матричного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;; &lt;br /&gt;
**скалярное произведение двух векторов &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**вычисляется линейная комбинация векторов; &lt;br /&gt;
**вычисляется норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**проверяется условие выхода из цикла (равенство нулю нормы вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;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;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Посчитаем количество операций, необходимых для поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений и векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; действий для умножения матрицы на вектор&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; действия для перемножения двух векторов&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  операций для поэлементного сложения или вычитания двух векторов&lt;br /&gt;
* для отыскания нормы вектора помимо &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  сложений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  умножений требуется 1 операция извлечения корня&lt;br /&gt;
* для поиска собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; требуется &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарно для одной итерации алгоритма требуется совершить  &amp;lt;math&amp;gt;O(n^2)+O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
В данном разделе представлен информационный граф алгоритма, дающий представление о переходе от одной итерации к другой.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Информационный_граф_1.png|1000px|thumb|center| &amp;lt;math&amp;gt;||x||&amp;lt;/math&amp;gt; - операция вычисления нормы;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; - операция деления;&lt;br /&gt;
&amp;lt;math&amp;gt; •&amp;lt;/math&amp;gt; - операция скалярного умножения векторов;&lt;br /&gt;
&amp;lt;math&amp;gt;Ax&amp;lt;/math&amp;gt; - операция применения оператора A к вектору x;&lt;br /&gt;
&amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; - операция вычисления линейной комбинации&amp;amp;.]]&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;n\times n&amp;lt;/math&amp;gt; на вектор размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
В свою очередь ресурс параллелизма операции поиска собственных значений зависит от выбранного способа и не рассматривается в данной статье.&lt;br /&gt;
&lt;br /&gt;
Таким образом, с точки зрения ресурса параллелизма, алгоритм Ланцоша обладает линейной сложностью по ширине ЯПФ и квадратичной сложностью по высоте ЯПФ. Основное время работы алгоритма будет уделено операции умножения матрицы на вектор, имеющей ширину яруса &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;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;A&amp;lt;/math&amp;gt;, следовательно на вход данный алгоритм во всяком случае получает 1 число и 1 матрицу размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;. Помимо этого для начала работы алгоритму нужен некоторый вектор &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; начального приближения размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, который тоже является входными данными.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После окончания работы алгоритма мы получаем набор собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, состоящий из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; элементов. Если помимо собственных значений выводятся еще и полученные собственные векторы, то суммарный объём всех таких векторов составляет &amp;lt;math&amp;gt;k\times n&amp;lt;/math&amp;gt; элементов. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, совокупный объём входных данных составляет: &amp;lt;math&amp;gt;n^2+n+1&amp;lt;/math&amp;gt; элемент, а на выходе получаем &amp;lt;math&amp;gt;k(n+1)&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;lt;math&amp;gt;A&amp;lt;/math&amp;gt;) начиная с максимального в абсолютном смысле значения. Это выгодно отличает данный алгоритм с точки зрения поиска собственных значений матрицы, находящихся по краям её спектра.&lt;br /&gt;
&lt;br /&gt;
Не является полностью детерминированным, т.к. может досрочно завершить работу, если будут найдены все ненулевые собственные значения.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма (то есть отношение числа операций к суммарному объему входных и выходных данных) равна &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+2n+1}&amp;lt;/math&amp;gt;. Следовательно порядок мощности алгоритма примерно равен &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;, при &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В случае использования метода вычисления собственных значений с линейной сложностью, соотношение последовательной и параллельной сложностей будет равно &amp;lt;math&amp;gt;(k ^ 2 + n ^ 2) / (k  + n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша может быть модифицирован так, чтобы быть пригодным для применения к несимметричным системам.&lt;br /&gt;
&lt;br /&gt;
Существует усложнение алгоритма, которое позволяет сократить объём хранимых на каждой итерации векторов с 3-ух до 2-ух.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма=== &lt;br /&gt;
=== Локальность данных и вычислений=== &lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма=== &lt;br /&gt;
===  Масштабируемость алгоритма и его реализации===&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма=== &lt;br /&gt;
=== Выводы для классов архитектур=== &lt;br /&gt;
=== Существующие реализации алгоритма===&lt;br /&gt;
&lt;br /&gt;
В настоящее время алгоритм Ланцоша поиска собственных значений квадратной симметричной матрицы включён в несколько библиотек и реализован на различных языках, среди которых такие наиболее распространенные как &#039;&#039;&#039;C&#039;&#039;&#039;, &#039;&#039;&#039;C++&#039;&#039;&#039;, &#039;&#039;&#039;FORTRAN77/90&#039;&#039;&#039;, &#039;&#039;&#039;MathLab&#039;&#039;&#039;.&lt;br /&gt;
Так, например, в языке &#039;&#039;&#039;MathLab&#039;&#039;&#039; во встроенном пакете &#039;&#039;&#039;ARPACK&#039;&#039;&#039; найти собственные значения методом Ланцоша можно при помощи вызова функции &#039;&#039;eigs()&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
На языке &#039;&#039;&#039;С&#039;&#039;&#039; существует библиотека &#039;&#039;&#039;[http://www.cs.wm.edu/~andreas/software/ PRIMME]&#039;&#039;&#039;, название которой расшифровывается как PReconditioned Iterative MultiMethod Eigensolver (итерационные методы поиска собственных значений с предусловием).&lt;br /&gt;
&lt;br /&gt;
Библиотека &#039;&#039;&#039;[http://www.nag.co.uk NAG] Numerical Library&#039;&#039;&#039; также содержит обширный набор функций, позволяющих проводить математический анализ, среди которых есть и реализация алгоритма Ланцоша. Библиотека доступна в трех пакетах: NAG C Library, NAG Fortran Library и NAG Library for .NET, совместна со многими языками и с основными операционными системами (Windows, Linux and OS X, а также Solaris, AIX и HP-UX).&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] Дж. Деммель «Вычислительная линейная алгебра», с 381.&lt;br /&gt;
&lt;br /&gt;
[2] Wikipedia https://en.wikipedia.org/wiki/Lanczos_algorithm&lt;br /&gt;
&lt;br /&gt;
[3] &amp;quot;[https://static.ph.ed.ac.uk/dissertations/hpc-msc/2013-2014/Investigation%20and%20Implementation%20of%20an%20Eigensolver%20Method.pdf Investigation and Implementation of an Eigensolver Method]&amp;quot;, Jorge Moreira, The University of Edinburgh, August 2014&lt;br /&gt;
&lt;br /&gt;
[4] &amp;quot;[http://www.physics.drexel.edu/~bob/Term_Reports/Hoppe_01.pdf Lanczos Vector Procedures]&amp;quot;, Travis Hoppe&lt;br /&gt;
&lt;br /&gt;
[5] Parallel Scientific Computing in C++ and MPI&lt;br /&gt;
A seamless approach to parallel algorithms and their implementation,&lt;br /&gt;
George Em Karniadakis and Robert M. Kirby II,&lt;br /&gt;
Cambridge University Press&lt;/div&gt;</summary>
		<author><name>Alexbashirov</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=15948</id>
		<title>Участник:Alexbashirov/Алгоритм Ланцоша для точной арифметики</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=15948"/>
		<updated>2016-11-05T14:51:18Z</updated>

		<summary type="html">&lt;p&gt;Alexbashirov: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[Участник: Alexbashirov|Баширов А.Д.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name             = Алгоритм Ланцоша для точной арифметики&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;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;
Алгоритм Ланцоша является прямым алгоритмом поиска собственных значений симметричной матрицы, разработанным венгерским физиком и математиком XX столетия Корнелием Ланцошем в 1950 году. Алгоритм совмещает в себе два других алгоритма: алгоритм построения подпространства Крылова (который также был создан Ланцошем) и процедуру Рэлея-Ритца приближения собственных значений матрицы. Алгоритм является вариацией степенного метода, позволяющего найти собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-го порядка. Однако в алгоритме число итераций ограничено некоторым &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;. Несмотря на заявленную вычислительную эффективность, алгоритм не получил широкого применения в своём первоначальном виде, ввиду его неустойчивости. 20 лет спустя, в 1970 году ученые Ojalvo и Newman показали доработанный алгоритм Ланцоша, который теперь стал устойчивым а также предложили способ выбора вектора начального приближения &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt;. Полученный последователями Ланцоша алгоритм получил название &amp;quot;Алгоритм Ланцоша с полной переортогонализацией&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма===&lt;br /&gt;
Алгоритм Ланцоша работает с вещественной симметричной матрицей &amp;lt;math&amp;gt;A=A^T&amp;lt;/math&amp;gt;, таким образом в памяти достаточно хранить лишь немногим более половины элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Прежде чем переходить к описанию алгоритма, следует упомянуть следующие понятия: подпространство Крылова и процесс Рэлея-Ритца, о которых уже было сказано в исторической справке выше. &lt;br /&gt;
Подпространством Крылова называется набор векторов&amp;lt;math&amp;gt;K_n =[b,Ab,A^2b,...,A^{n-1}b]&amp;lt;/math&amp;gt;. Начав свою работу с произвольного вектора &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, степенной метод вычисляет вектора &amp;lt;math&amp;gt;Ab, A^2b,...,A^{n-1}b&amp;lt;/math&amp;gt; итерационно сохраняя полученный результат в вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Полученная последовательность векторов сходится к собственному вектору, отвечающему максимальному собственному значению &amp;lt;math&amp;gt;\lambda_{max}&amp;lt;/math&amp;gt;. Однако, использование лишь последнего полученного вектора и потеря всех предшествующих посчитанных величин не всегда является наилучшим выбором. Поэтому сохранив все вектора и объединив их в одну матрицу мы получим так называемую &#039;&#039;&#039;матрицу Крылова&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K_j = [b,Ab,A^2b,...,A^{j-1}b]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Столбцы получившейся матрицы не ортогональны, однако их можно ортогонализовать, применив процесс Грамма-Шмидта. Получившиеся вектора будут составлять базис подпространства Крылова &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt;. Можно ожидать, что вектора полученного базиса будут достаточно хорошо приближать &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; собственных векторов, отвечающих &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; наибольшим собственным значения.&lt;br /&gt;
&lt;br /&gt;
Затем с использованием полученной матрицы из ортогональных векторов &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt; мы получим трехдиагональную матрицу &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; на основе исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
Наконец, к полученной матрице &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; будет применяться &#039;&#039;&#039;процесс Рэлея-Ритца&#039;&#039;&#039;, который найдет собственные значения трехдиагональной матрицы. В последствии эти значения и будут приближениями искомых собственных значений исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма Ланцоша, то есть наиболее ресурсно-затратной частью алгоритма, является шаг на котором на каждой итерации происходит перемножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;, полученный на предыдущей итерации. Полученный в результате умножения вектор обозначается &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; z=Aq_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;Q_j=[q_1,q_2,...q_j]&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортонормированных вектров Ланцоша и последующее формирование трехдиагональной матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;. Число таких векторов и, следовательно, размер матрицы растет с каждой итерацией. Итерационный процесс завершается при &amp;lt;math&amp;gt;j=k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На долю второй части алгоритма приходится поиск собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;, полученной в первой части.&lt;br /&gt;
&lt;br /&gt;
=== Схема последовательной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ланцош_Схема реализации.png|800px]]&lt;br /&gt;
&lt;br /&gt;
На рисунке выше представлен псевдокод, отражающий последовательность действий в алгоритме метода. Перечислим основные ступени в данном методе:&lt;br /&gt;
* Прежде чем войти в цикл, происходит инициализация констант &amp;lt;math&amp;gt;\Beta_0,q_0&amp;lt;/math&amp;gt;, вычисление нормы вектора начального приближения &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и нормализация этого вектора.&lt;br /&gt;
* Затем, в цикле, происходит: &lt;br /&gt;
**поиск вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, являющегося результатом применения матричного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;; &lt;br /&gt;
**скалярное произведение двух векторов &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**вычисляется линейная комбинация векторов; &lt;br /&gt;
**вычисляется норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**проверяется условие выхода из цикла (равенство нулю нормы вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;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;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Посчитаем количество операций, необходимых для поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений и векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; действий для умножения матрицы на вектор&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; действия для перемножения двух векторов&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  операций для поэлементного сложения или вычитания двух векторов&lt;br /&gt;
* для отыскания нормы вектора помимо &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  сложений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  умножений требуется 1 операция извлечения корня&lt;br /&gt;
* для поиска собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; требуется &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарно для одной итерации алгоритма требуется совершить  &amp;lt;math&amp;gt;O(n^2)+O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
В данном разделе представлен информационный граф алгоритма, дающий представление о переходе от одной итерации к другой.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Информационный_граф_1.png|1000px|thumb|center| &amp;lt;math&amp;gt;||x||&amp;lt;/math&amp;gt; - операция вычисления нормы;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; - операция деления;&lt;br /&gt;
&amp;lt;math&amp;gt;/•&amp;lt;/math&amp;gt; - операция скалярного умножения векторов;&lt;br /&gt;
&amp;lt;math&amp;gt;Ax&amp;lt;/math&amp;gt; - операция применения оператора A к вектору x;&lt;br /&gt;
&amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; - операция вычисления линейной комбинации&amp;amp;.]]&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;n\times n&amp;lt;/math&amp;gt; на вектор размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
В свою очередь ресурс параллелизма операции поиска собственных значений зависит от выбранного способа и не рассматривается в данной статье.&lt;br /&gt;
&lt;br /&gt;
Таким образом, с точки зрения ресурса параллелизма, алгоритм Ланцоша обладает линейной сложностью по ширине ЯПФ и квадратичной сложностью по высоте ЯПФ. Основное время работы алгоритма будет уделено операции умножения матрицы на вектор, имеющей ширину яруса &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;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;A&amp;lt;/math&amp;gt;, следовательно на вход данный алгоритм во всяком случае получает 1 число и 1 матрицу размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;. Помимо этого для начала работы алгоритму нужен некоторый вектор &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; начального приближения размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, который тоже является входными данными.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После окончания работы алгоритма мы получаем набор собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, состоящий из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; элементов. Если помимо собственных значений выводятся еще и полученные собственные векторы, то суммарный объём всех таких векторов составляет &amp;lt;math&amp;gt;k\times n&amp;lt;/math&amp;gt; элементов. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, совокупный объём входных данных составляет: &amp;lt;math&amp;gt;n^2+n+1&amp;lt;/math&amp;gt; элемент, а на выходе получаем &amp;lt;math&amp;gt;k(n+1)&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;lt;math&amp;gt;A&amp;lt;/math&amp;gt;) начиная с максимального в абсолютном смысле значения. Это выгодно отличает данный алгоритм с точки зрения поиска собственных значений матрицы, находящихся по краям её спектра.&lt;br /&gt;
&lt;br /&gt;
Не является полностью детерминированным, т.к. может досрочно завершить работу, если будут найдены все ненулевые собственные значения.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма (то есть отношение числа операций к суммарному объему входных и выходных данных) равна &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+2n+1}&amp;lt;/math&amp;gt;. Следовательно порядок мощности алгоритма примерно равен &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;, при &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В случае использования метода вычисления собственных значений с линейной сложностью, соотношение последовательной и параллельной сложностей будет равно &amp;lt;math&amp;gt;(k ^ 2 + n ^ 2) / (k  + n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша может быть модифицирован так, чтобы быть пригодным для применения к несимметричным системам.&lt;br /&gt;
&lt;br /&gt;
Существует усложнение алгоритма, которое позволяет сократить объём хранимых на каждой итерации векторов с 3-ух до 2-ух.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма=== &lt;br /&gt;
=== Локальность данных и вычислений=== &lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма=== &lt;br /&gt;
===  Масштабируемость алгоритма и его реализации===&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма=== &lt;br /&gt;
=== Выводы для классов архитектур=== &lt;br /&gt;
=== Существующие реализации алгоритма===&lt;br /&gt;
&lt;br /&gt;
В настоящее время алгоритм Ланцоша поиска собственных значений квадратной симметричной матрицы включён в несколько библиотек и реализован на различных языках, среди которых такие наиболее распространенные как &#039;&#039;&#039;C&#039;&#039;&#039;, &#039;&#039;&#039;C++&#039;&#039;&#039;, &#039;&#039;&#039;FORTRAN77/90&#039;&#039;&#039;, &#039;&#039;&#039;MathLab&#039;&#039;&#039;.&lt;br /&gt;
Так, например, в языке &#039;&#039;&#039;MathLab&#039;&#039;&#039; во встроенном пакете &#039;&#039;&#039;ARPACK&#039;&#039;&#039; найти собственные значения методом Ланцоша можно при помощи вызова функции &#039;&#039;eigs()&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
На языке &#039;&#039;&#039;С&#039;&#039;&#039; существует библиотека &#039;&#039;&#039;[http://www.cs.wm.edu/~andreas/software/ PRIMME]&#039;&#039;&#039;, название которой расшифровывается как PReconditioned Iterative MultiMethod Eigensolver (итерационные методы поиска собственных значений с предусловием).&lt;br /&gt;
&lt;br /&gt;
Библиотека &#039;&#039;&#039;[http://www.nag.co.uk NAG] Numerical Library&#039;&#039;&#039; также содержит обширный набор функций, позволяющих проводить математический анализ, среди которых есть и реализация алгоритма Ланцоша. Библиотека доступна в трех пакетах: NAG C Library, NAG Fortran Library и NAG Library for .NET, совместна со многими языками и с основными операционными системами (Windows, Linux and OS X, а также Solaris, AIX и HP-UX).&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] Дж. Деммель «Вычислительная линейная алгебра», с 381.&lt;br /&gt;
&lt;br /&gt;
[2] Wikipedia https://en.wikipedia.org/wiki/Lanczos_algorithm&lt;br /&gt;
&lt;br /&gt;
[3] &amp;quot;[https://static.ph.ed.ac.uk/dissertations/hpc-msc/2013-2014/Investigation%20and%20Implementation%20of%20an%20Eigensolver%20Method.pdf Investigation and Implementation of an Eigensolver Method]&amp;quot;, Jorge Moreira, The University of Edinburgh, August 2014&lt;br /&gt;
&lt;br /&gt;
[4] &amp;quot;[http://www.physics.drexel.edu/~bob/Term_Reports/Hoppe_01.pdf Lanczos Vector Procedures]&amp;quot;, Travis Hoppe&lt;br /&gt;
&lt;br /&gt;
[5] Parallel Scientific Computing in C++ and MPI&lt;br /&gt;
A seamless approach to parallel algorithms and their implementation,&lt;br /&gt;
George Em Karniadakis and Robert M. Kirby II,&lt;br /&gt;
Cambridge University Press&lt;/div&gt;</summary>
		<author><name>Alexbashirov</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=15947</id>
		<title>Участник:Alexbashirov/Алгоритм Ланцоша для точной арифметики</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=15947"/>
		<updated>2016-11-05T14:50:43Z</updated>

		<summary type="html">&lt;p&gt;Alexbashirov: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[Участник: Alexbashirov|Баширов А.Д.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name             = Алгоритм Ланцоша для точной арифметики&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;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;
Алгоритм Ланцоша является прямым алгоритмом поиска собственных значений симметричной матрицы, разработанным венгерским физиком и математиком XX столетия Корнелием Ланцошем в 1950 году. Алгоритм совмещает в себе два других алгоритма: алгоритм построения подпространства Крылова (который также был создан Ланцошем) и процедуру Рэлея-Ритца приближения собственных значений матрицы. Алгоритм является вариацией степенного метода, позволяющего найти собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-го порядка. Однако в алгоритме число итераций ограничено некоторым &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;. Несмотря на заявленную вычислительную эффективность, алгоритм не получил широкого применения в своём первоначальном виде, ввиду его неустойчивости. 20 лет спустя, в 1970 году ученые Ojalvo и Newman показали доработанный алгоритм Ланцоша, который теперь стал устойчивым а также предложили способ выбора вектора начального приближения &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt;. Полученный последователями Ланцоша алгоритм получил название &amp;quot;Алгоритм Ланцоша с полной переортогонализацией&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма===&lt;br /&gt;
Алгоритм Ланцоша работает с вещественной симметричной матрицей &amp;lt;math&amp;gt;A=A^T&amp;lt;/math&amp;gt;, таким образом в памяти достаточно хранить лишь немногим более половины элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Прежде чем переходить к описанию алгоритма, следует упомянуть следующие понятия: подпространство Крылова и процесс Рэлея-Ритца, о которых уже было сказано в исторической справке выше. &lt;br /&gt;
Подпространством Крылова называется набор векторов&amp;lt;math&amp;gt;K_n =[b,Ab,A^2b,...,A^{n-1}b]&amp;lt;/math&amp;gt;. Начав свою работу с произвольного вектора &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, степенной метод вычисляет вектора &amp;lt;math&amp;gt;Ab, A^2b,...,A^{n-1}b&amp;lt;/math&amp;gt; итерационно сохраняя полученный результат в вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Полученная последовательность векторов сходится к собственному вектору, отвечающему максимальному собственному значению &amp;lt;math&amp;gt;\lambda_{max}&amp;lt;/math&amp;gt;. Однако, использование лишь последнего полученного вектора и потеря всех предшествующих посчитанных величин не всегда является наилучшим выбором. Поэтому сохранив все вектора и объединив их в одну матрицу мы получим так называемую &#039;&#039;&#039;матрицу Крылова&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K_j = [b,Ab,A^2b,...,A^{j-1}b]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Столбцы получившейся матрицы не ортогональны, однако их можно ортогонализовать, применив процесс Грамма-Шмидта. Получившиеся вектора будут составлять базис подпространства Крылова &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt;. Можно ожидать, что вектора полученного базиса будут достаточно хорошо приближать &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; собственных векторов, отвечающих &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; наибольшим собственным значения.&lt;br /&gt;
&lt;br /&gt;
Затем с использованием полученной матрицы из ортогональных векторов &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt; мы получим трехдиагональную матрицу &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; на основе исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
Наконец, к полученной матрице &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; будет применяться &#039;&#039;&#039;процесс Рэлея-Ритца&#039;&#039;&#039;, который найдет собственные значения трехдиагональной матрицы. В последствии эти значения и будут приближениями искомых собственных значений исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма Ланцоша, то есть наиболее ресурсно-затратной частью алгоритма, является шаг на котором на каждой итерации происходит перемножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;, полученный на предыдущей итерации. Полученный в результате умножения вектор обозначается &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; z=Aq_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;Q_j=[q_1,q_2,...q_j]&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортонормированных вектров Ланцоша и последующее формирование трехдиагональной матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;. Число таких векторов и, следовательно, размер матрицы растет с каждой итерацией. Итерационный процесс завершается при &amp;lt;math&amp;gt;j=k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На долю второй части алгоритма приходится поиск собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;, полученной в первой части.&lt;br /&gt;
&lt;br /&gt;
=== Схема последовательной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ланцош_Схема реализации.png|800px]]&lt;br /&gt;
&lt;br /&gt;
На рисунке выше представлен псевдокод, отражающий последовательность действий в алгоритме метода. Перечислим основные ступени в данном методе:&lt;br /&gt;
* Прежде чем войти в цикл, происходит инициализация констант &amp;lt;math&amp;gt;\Beta_0,q_0&amp;lt;/math&amp;gt;, вычисление нормы вектора начального приближения &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и нормализация этого вектора.&lt;br /&gt;
* Затем, в цикле, происходит: &lt;br /&gt;
**поиск вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, являющегося результатом применения матричного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;; &lt;br /&gt;
**скалярное произведение двух векторов &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**вычисляется линейная комбинация векторов; &lt;br /&gt;
**вычисляется норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**проверяется условие выхода из цикла (равенство нулю нормы вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;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;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Посчитаем количество операций, необходимых для поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений и векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; действий для умножения матрицы на вектор&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; действия для перемножения двух векторов&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  операций для поэлементного сложения или вычитания двух векторов&lt;br /&gt;
* для отыскания нормы вектора помимо &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  сложений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  умножений требуется 1 операция извлечения корня&lt;br /&gt;
* для поиска собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; требуется &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарно для одной итерации алгоритма требуется совершить  &amp;lt;math&amp;gt;O(n^2)+O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
В данном разделе представлен информационный граф алгоритма, дающий представление о переходе от одной итерации к другой.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Информационный_граф_1.png|1000px|thumb|center| &amp;lt;math&amp;gt;||x||&amp;lt;/math&amp;gt; - операция вычисления нормы;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; - операция деления;&lt;br /&gt;
&amp;lt;math&amp;gt;•&amp;lt;/math&amp;gt; - операция скалярного умножения векторов;&lt;br /&gt;
&amp;lt;math&amp;gt;Ax&amp;lt;/math&amp;gt; - операция применения оператора A к вектору x;&lt;br /&gt;
&amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; - операция вычисления линейной комбинации&amp;amp;.]]&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;n\times n&amp;lt;/math&amp;gt; на вектор размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
В свою очередь ресурс параллелизма операции поиска собственных значений зависит от выбранного способа и не рассматривается в данной статье.&lt;br /&gt;
&lt;br /&gt;
Таким образом, с точки зрения ресурса параллелизма, алгоритм Ланцоша обладает линейной сложностью по ширине ЯПФ и квадратичной сложностью по высоте ЯПФ. Основное время работы алгоритма будет уделено операции умножения матрицы на вектор, имеющей ширину яруса &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;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;A&amp;lt;/math&amp;gt;, следовательно на вход данный алгоритм во всяком случае получает 1 число и 1 матрицу размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;. Помимо этого для начала работы алгоритму нужен некоторый вектор &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; начального приближения размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, который тоже является входными данными.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После окончания работы алгоритма мы получаем набор собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, состоящий из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; элементов. Если помимо собственных значений выводятся еще и полученные собственные векторы, то суммарный объём всех таких векторов составляет &amp;lt;math&amp;gt;k\times n&amp;lt;/math&amp;gt; элементов. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, совокупный объём входных данных составляет: &amp;lt;math&amp;gt;n^2+n+1&amp;lt;/math&amp;gt; элемент, а на выходе получаем &amp;lt;math&amp;gt;k(n+1)&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;lt;math&amp;gt;A&amp;lt;/math&amp;gt;) начиная с максимального в абсолютном смысле значения. Это выгодно отличает данный алгоритм с точки зрения поиска собственных значений матрицы, находящихся по краям её спектра.&lt;br /&gt;
&lt;br /&gt;
Не является полностью детерминированным, т.к. может досрочно завершить работу, если будут найдены все ненулевые собственные значения.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма (то есть отношение числа операций к суммарному объему входных и выходных данных) равна &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+2n+1}&amp;lt;/math&amp;gt;. Следовательно порядок мощности алгоритма примерно равен &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;, при &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В случае использования метода вычисления собственных значений с линейной сложностью, соотношение последовательной и параллельной сложностей будет равно &amp;lt;math&amp;gt;(k ^ 2 + n ^ 2) / (k  + n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша может быть модифицирован так, чтобы быть пригодным для применения к несимметричным системам.&lt;br /&gt;
&lt;br /&gt;
Существует усложнение алгоритма, которое позволяет сократить объём хранимых на каждой итерации векторов с 3-ух до 2-ух.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма=== &lt;br /&gt;
=== Локальность данных и вычислений=== &lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма=== &lt;br /&gt;
===  Масштабируемость алгоритма и его реализации===&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма=== &lt;br /&gt;
=== Выводы для классов архитектур=== &lt;br /&gt;
=== Существующие реализации алгоритма===&lt;br /&gt;
&lt;br /&gt;
В настоящее время алгоритм Ланцоша поиска собственных значений квадратной симметричной матрицы включён в несколько библиотек и реализован на различных языках, среди которых такие наиболее распространенные как &#039;&#039;&#039;C&#039;&#039;&#039;, &#039;&#039;&#039;C++&#039;&#039;&#039;, &#039;&#039;&#039;FORTRAN77/90&#039;&#039;&#039;, &#039;&#039;&#039;MathLab&#039;&#039;&#039;.&lt;br /&gt;
Так, например, в языке &#039;&#039;&#039;MathLab&#039;&#039;&#039; во встроенном пакете &#039;&#039;&#039;ARPACK&#039;&#039;&#039; найти собственные значения методом Ланцоша можно при помощи вызова функции &#039;&#039;eigs()&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
На языке &#039;&#039;&#039;С&#039;&#039;&#039; существует библиотека &#039;&#039;&#039;[http://www.cs.wm.edu/~andreas/software/ PRIMME]&#039;&#039;&#039;, название которой расшифровывается как PReconditioned Iterative MultiMethod Eigensolver (итерационные методы поиска собственных значений с предусловием).&lt;br /&gt;
&lt;br /&gt;
Библиотека &#039;&#039;&#039;[http://www.nag.co.uk NAG] Numerical Library&#039;&#039;&#039; также содержит обширный набор функций, позволяющих проводить математический анализ, среди которых есть и реализация алгоритма Ланцоша. Библиотека доступна в трех пакетах: NAG C Library, NAG Fortran Library и NAG Library for .NET, совместна со многими языками и с основными операционными системами (Windows, Linux and OS X, а также Solaris, AIX и HP-UX).&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] Дж. Деммель «Вычислительная линейная алгебра», с 381.&lt;br /&gt;
&lt;br /&gt;
[2] Wikipedia https://en.wikipedia.org/wiki/Lanczos_algorithm&lt;br /&gt;
&lt;br /&gt;
[3] &amp;quot;[https://static.ph.ed.ac.uk/dissertations/hpc-msc/2013-2014/Investigation%20and%20Implementation%20of%20an%20Eigensolver%20Method.pdf Investigation and Implementation of an Eigensolver Method]&amp;quot;, Jorge Moreira, The University of Edinburgh, August 2014&lt;br /&gt;
&lt;br /&gt;
[4] &amp;quot;[http://www.physics.drexel.edu/~bob/Term_Reports/Hoppe_01.pdf Lanczos Vector Procedures]&amp;quot;, Travis Hoppe&lt;br /&gt;
&lt;br /&gt;
[5] Parallel Scientific Computing in C++ and MPI&lt;br /&gt;
A seamless approach to parallel algorithms and their implementation,&lt;br /&gt;
George Em Karniadakis and Robert M. Kirby II,&lt;br /&gt;
Cambridge University Press&lt;/div&gt;</summary>
		<author><name>Alexbashirov</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=15946</id>
		<title>Участник:Alexbashirov/Алгоритм Ланцоша для точной арифметики</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=15946"/>
		<updated>2016-11-05T14:45:52Z</updated>

		<summary type="html">&lt;p&gt;Alexbashirov: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[Участник: Alexbashirov|Баширов А.Д.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name             = Алгоритм Ланцоша для точной арифметики&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;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;
Алгоритм Ланцоша является прямым алгоритмом поиска собственных значений симметричной матрицы, разработанным венгерским физиком и математиком XX столетия Корнелием Ланцошем в 1950 году. Алгоритм совмещает в себе два других алгоритма: алгоритм построения подпространства Крылова (который также был создан Ланцошем) и процедуру Рэлея-Ритца приближения собственных значений матрицы. Алгоритм является вариацией степенного метода, позволяющего найти собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-го порядка. Однако в алгоритме число итераций ограничено некоторым &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;. Несмотря на заявленную вычислительную эффективность, алгоритм не получил широкого применения в своём первоначальном виде, ввиду его неустойчивости. 20 лет спустя, в 1970 году ученые Ojalvo и Newman показали доработанный алгоритм Ланцоша, который теперь стал устойчивым а также предложили способ выбора вектора начального приближения &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt;. Полученный последователями Ланцоша алгоритм получил название &amp;quot;Алгоритм Ланцоша с полной переортогонализацией&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма===&lt;br /&gt;
Алгоритм Ланцоша работает с вещественной симметричной матрицей &amp;lt;math&amp;gt;A=A^T&amp;lt;/math&amp;gt;, таким образом в памяти достаточно хранить лишь немногим более половины элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Прежде чем переходить к описанию алгоритма, следует упомянуть следующие понятия: подпространство Крылова и процесс Рэлея-Ритца, о которых уже было сказано в исторической справке выше. &lt;br /&gt;
Подпространством Крылова называется набор векторов&amp;lt;math&amp;gt;K_n =[b,Ab,A^2b,...,A^{n-1}b]&amp;lt;/math&amp;gt;. Начав свою работу с произвольного вектора &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, степенной метод вычисляет вектора &amp;lt;math&amp;gt;Ab, A^2b,...,A^{n-1}b&amp;lt;/math&amp;gt; итерационно сохраняя полученный результат в вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Полученная последовательность векторов сходится к собственному вектору, отвечающему максимальному собственному значению &amp;lt;math&amp;gt;\lambda_{max}&amp;lt;/math&amp;gt;. Однако, использование лишь последнего полученного вектора и потеря всех предшествующих посчитанных величин не всегда является наилучшим выбором. Поэтому сохранив все вектора и объединив их в одну матрицу мы получим так называемую &#039;&#039;&#039;матрицу Крылова&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K_j = [b,Ab,A^2b,...,A^{j-1}b]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Столбцы получившейся матрицы не ортогональны, однако их можно ортогонализовать, применив процесс Грамма-Шмидта. Получившиеся вектора будут составлять базис подпространства Крылова &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt;. Можно ожидать, что вектора полученного базиса будут достаточно хорошо приближать &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; собственных векторов, отвечающих &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; наибольшим собственным значения.&lt;br /&gt;
&lt;br /&gt;
Затем с использованием полученной матрицы из ортогональных векторов &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt; мы получим трехдиагональную матрицу &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; на основе исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
Наконец, к полученной матрице &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; будет применяться &#039;&#039;&#039;процесс Рэлея-Ритца&#039;&#039;&#039;, который найдет собственные значения трехдиагональной матрицы. В последствии эти значения и будут приближениями искомых собственных значений исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма Ланцоша, то есть наиболее ресурсно-затратной частью алгоритма, является шаг на котором на каждой итерации происходит перемножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;, полученный на предыдущей итерации. Полученный в результате умножения вектор обозначается &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; z=Aq_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;Q_j=[q_1,q_2,...q_j]&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортонормированных вектров Ланцоша и последующее формирование трехдиагональной матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;. Число таких векторов и, следовательно, размер матрицы растет с каждой итерацией. Итерационный процесс завершается при &amp;lt;math&amp;gt;j=k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На долю второй части алгоритма приходится поиск собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;, полученной в первой части.&lt;br /&gt;
&lt;br /&gt;
=== Схема последовательной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ланцош_Схема реализации.png|800px]]&lt;br /&gt;
&lt;br /&gt;
На рисунке выше представлен псевдокод, отражающий последовательность действий в алгоритме метода. Перечислим основные ступени в данном методе:&lt;br /&gt;
* Прежде чем войти в цикл, происходит инициализация констант &amp;lt;math&amp;gt;\Beta_0,q_0&amp;lt;/math&amp;gt;, вычисление нормы вектора начального приближения &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и нормализация этого вектора.&lt;br /&gt;
* Затем, в цикле, происходит: &lt;br /&gt;
**поиск вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, являющегося результатом применения матричного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;; &lt;br /&gt;
**скалярное произведение двух векторов &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**вычисляется линейная комбинация векторов; &lt;br /&gt;
**вычисляется норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**проверяется условие выхода из цикла (равенство нулю нормы вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;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;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Посчитаем количество операций, необходимых для поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений и векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; действий для умножения матрицы на вектор&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; действия для перемножения двух векторов&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  операций для поэлементного сложения или вычитания двух векторов&lt;br /&gt;
* для отыскания нормы вектора помимо &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  сложений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  умножений требуется 1 операция извлечения корня&lt;br /&gt;
* для поиска собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; требуется &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарно для одной итерации алгоритма требуется совершить  &amp;lt;math&amp;gt;O(n^2)+O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
В данном разделе приведен информационный граф одной итерации алгоритма Ланцоша. Для простоты на схеме подразумевается матрица размерности 5x5, однако это не нарушает общности данной схемы.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Информационный_граф_1.png|1000px|thumb|center|Круглые элементы символизируют операции с элементами векторов и матриц: сложение и умножение (черные), операции составления линейной комбинации (зеленые) и операции деления вектора на его норму. В квадратных элементах изображены операции, которые невозможно выполнить параллельно: нахождение суммы элементов вектора (синий) и вычисление нормы вектора (красный). ]]&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;n\times n&amp;lt;/math&amp;gt; на вектор размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
В свою очередь ресурс параллелизма операции поиска собственных значений зависит от выбранного способа и не рассматривается в данной статье.&lt;br /&gt;
&lt;br /&gt;
Таким образом, с точки зрения ресурса параллелизма, алгоритм Ланцоша обладает линейной сложностью по ширине ЯПФ и квадратичной сложностью по высоте ЯПФ. Основное время работы алгоритма будет уделено операции умножения матрицы на вектор, имеющей ширину яруса &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;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;A&amp;lt;/math&amp;gt;, следовательно на вход данный алгоритм во всяком случае получает 1 число и 1 матрицу размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;. Помимо этого для начала работы алгоритму нужен некоторый вектор &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; начального приближения размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, который тоже является входными данными.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После окончания работы алгоритма мы получаем набор собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, состоящий из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; элементов. Если помимо собственных значений выводятся еще и полученные собственные векторы, то суммарный объём всех таких векторов составляет &amp;lt;math&amp;gt;k\times n&amp;lt;/math&amp;gt; элементов. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, совокупный объём входных данных составляет: &amp;lt;math&amp;gt;n^2+n+1&amp;lt;/math&amp;gt; элемент, а на выходе получаем &amp;lt;math&amp;gt;k(n+1)&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;lt;math&amp;gt;A&amp;lt;/math&amp;gt;) начиная с максимального в абсолютном смысле значения. Это выгодно отличает данный алгоритм с точки зрения поиска собственных значений матрицы, находящихся по краям её спектра.&lt;br /&gt;
&lt;br /&gt;
Не является полностью детерминированным, т.к. может досрочно завершить работу, если будут найдены все ненулевые собственные значения.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма (то есть отношение числа операций к суммарному объему входных и выходных данных) равна &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+2n+1}&amp;lt;/math&amp;gt;. Следовательно порядок мощности алгоритма примерно равен &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;, при &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В случае использования метода вычисления собственных значений с линейной сложностью, соотношение последовательной и параллельной сложностей будет равно &amp;lt;math&amp;gt;(k ^ 2 + n ^ 2) / (k  + n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша может быть модифицирован так, чтобы быть пригодным для применения к несимметричным системам.&lt;br /&gt;
&lt;br /&gt;
Существует усложнение алгоритма, которое позволяет сократить объём хранимых на каждой итерации векторов с 3-ух до 2-ух.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма=== &lt;br /&gt;
=== Локальность данных и вычислений=== &lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма=== &lt;br /&gt;
===  Масштабируемость алгоритма и его реализации===&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма=== &lt;br /&gt;
=== Выводы для классов архитектур=== &lt;br /&gt;
=== Существующие реализации алгоритма===&lt;br /&gt;
&lt;br /&gt;
В настоящее время алгоритм Ланцоша поиска собственных значений квадратной симметричной матрицы включён в несколько библиотек и реализован на различных языках, среди которых такие наиболее распространенные как &#039;&#039;&#039;C&#039;&#039;&#039;, &#039;&#039;&#039;C++&#039;&#039;&#039;, &#039;&#039;&#039;FORTRAN77/90&#039;&#039;&#039;, &#039;&#039;&#039;MathLab&#039;&#039;&#039;.&lt;br /&gt;
Так, например, в языке &#039;&#039;&#039;MathLab&#039;&#039;&#039; во встроенном пакете &#039;&#039;&#039;ARPACK&#039;&#039;&#039; найти собственные значения методом Ланцоша можно при помощи вызова функции &#039;&#039;eigs()&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
На языке &#039;&#039;&#039;С&#039;&#039;&#039; существует библиотека &#039;&#039;&#039;[http://www.cs.wm.edu/~andreas/software/ PRIMME]&#039;&#039;&#039;, название которой расшифровывается как PReconditioned Iterative MultiMethod Eigensolver (итерационные методы поиска собственных значений с предусловием).&lt;br /&gt;
&lt;br /&gt;
Библиотека &#039;&#039;&#039;[http://www.nag.co.uk NAG] Numerical Library&#039;&#039;&#039; также содержит обширный набор функций, позволяющих проводить математический анализ, среди которых есть и реализация алгоритма Ланцоша. Библиотека доступна в трех пакетах: NAG C Library, NAG Fortran Library и NAG Library for .NET, совместна со многими языками и с основными операционными системами (Windows, Linux and OS X, а также Solaris, AIX и HP-UX).&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] Дж. Деммель «Вычислительная линейная алгебра», с 381.&lt;br /&gt;
&lt;br /&gt;
[2] Wikipedia https://en.wikipedia.org/wiki/Lanczos_algorithm&lt;br /&gt;
&lt;br /&gt;
[3] &amp;quot;[https://static.ph.ed.ac.uk/dissertations/hpc-msc/2013-2014/Investigation%20and%20Implementation%20of%20an%20Eigensolver%20Method.pdf Investigation and Implementation of an Eigensolver Method]&amp;quot;, Jorge Moreira, The University of Edinburgh, August 2014&lt;br /&gt;
&lt;br /&gt;
[4] &amp;quot;[http://www.physics.drexel.edu/~bob/Term_Reports/Hoppe_01.pdf Lanczos Vector Procedures]&amp;quot;, Travis Hoppe&lt;br /&gt;
&lt;br /&gt;
[5] Parallel Scientific Computing in C++ and MPI&lt;br /&gt;
A seamless approach to parallel algorithms and their implementation,&lt;br /&gt;
George Em Karniadakis and Robert M. Kirby II,&lt;br /&gt;
Cambridge University Press&lt;/div&gt;</summary>
		<author><name>Alexbashirov</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=15942</id>
		<title>Участник:Alexbashirov/Алгоритм Ланцоша для точной арифметики</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=15942"/>
		<updated>2016-11-05T11:16:13Z</updated>

		<summary type="html">&lt;p&gt;Alexbashirov: /* Литература */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[Участник: Alexbashirov|Баширов А.Д.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name             = Алгоритм Ланцоша для точной арифметики&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;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;
Алгоритм Ланцоша является прямым алгоритмом поиска собственных значений симметричной матрицы, разработанным венгерским физиком и математиком XX столетия Корнелием Ланцошем в 1950 году. Алгоритм совмещает в себе два других алгоритма: алгоритм построения подпространства Крылова (который также был создан Ланцошем) и процедуру Рэлея-Ритца приближения собственных значений матрицы. Алгоритм является вариацией степенного метода, позволяющего найти собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-го порядка. Однако в алгоритме число итераций ограничено некоторым &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;. Несмотря на заявленную вычислительную эффективность, алгоритм не получил широкого применения в своём первоначальном виде, ввиду его неустойчивости. 20 лет спустя, в 1970 году ученые Ojalvo и Newman показали доработанный алгоритм Ланцоша, который теперь стал устойчивым а также предложили способ выбора вектора начального приближения &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt;. Полученный последователями Ланцоша алгоритм получил название &amp;quot;Алгоритм Ланцоша с полной переортогонализацией&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма===&lt;br /&gt;
Алгоритм Ланцоша работает с вещественной симметричной матрицей &amp;lt;math&amp;gt;A=A^T&amp;lt;/math&amp;gt;, таким образом в памяти достаточно хранить лишь немногим более половины элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Прежде чем переходить к описанию алгоритма, следует упомянуть следующие понятия: подпространство Крылова и процесс Рэлея-Ритца, о которых уже было сказано в исторической справке выше. &lt;br /&gt;
Подпространством Крылова называется набор векторов&amp;lt;math&amp;gt;K_n =[b,Ab,A^2b,...,A^{n-1}b]&amp;lt;/math&amp;gt;. Начав свою работу с произвольного вектора &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, степенной метод вычисляет вектора &amp;lt;math&amp;gt;Ab, A^2b,...,A^{n-1}b&amp;lt;/math&amp;gt; итерационно сохраняя полученный результат в вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Полученная последовательность векторов сходится к собственному вектору, отвечающему максимальному собственному значению &amp;lt;math&amp;gt;\lambda_{max}&amp;lt;/math&amp;gt;. Однако, использование лишь последнего полученного вектора и потеря всех предшествующих посчитанных величин не всегда является наилучшим выбором. Поэтому сохранив все вектора и объединив их в одну матрицу мы получим так называемую &#039;&#039;&#039;матрицу Крылова&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K_j = [b,Ab,A^2b,...,A^{j-1}b]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Столбцы получившейся матрицы не ортогональны, однако их можно ортогонализовать, применив процесс Грамма-Шмидта. Получившиеся вектора будут составлять базис подпространства Крылова &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt;. Можно ожидать, что вектора полученного базиса будут достаточно хорошо приближать &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; собственных векторов, отвечающих &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; наибольшим собственным значения.&lt;br /&gt;
&lt;br /&gt;
Затем с использованием полученной матрицы из ортогональных векторов &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt; мы получим трехдиагональную матрицу &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; на основе исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
Наконец, к полученной матрице &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; будет применяться &#039;&#039;&#039;процесс Рэлея-Ритца&#039;&#039;&#039;, который найдет собственные значения трехдиагональной матрицы. В последствии эти значения и будут приближениями искомых собственных значений исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма Ланцоша, то есть наиболее ресурсно-затратной частью алгоритма, является шаг на котором на каждой итерации происходит перемножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;, полученный на предыдущей итерации. Полученный в результате умножения вектор обозначается &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; z=Aq_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;Q_j=[q_1,q_2,...q_j]&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортонормированных вектров Ланцоша и последующее формирование трехдиагональной матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;. Число таких векторов и, следовательно, размер матрицы растет с каждой итерацией. Итерационный процесс завершается при &amp;lt;math&amp;gt;j=k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На долю второй части алгоритма приходится поиск собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;, полученной в первой части.&lt;br /&gt;
&lt;br /&gt;
=== Схема последовательной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ланцош_Схема реализации.png|800px]]&lt;br /&gt;
&lt;br /&gt;
На рисунке выше представлен псевдокод, отражающий последовательность действий в алгоритме метода. Перечислим основные ступени в данном методе:&lt;br /&gt;
* Прежде чем войти в цикл, происходит инициализация констант &amp;lt;math&amp;gt;\Beta_0,q_0&amp;lt;/math&amp;gt;, вычисление нормы вектора начального приближения &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и нормализация этого вектора.&lt;br /&gt;
* Затем, в цикле, происходит: &lt;br /&gt;
**поиск вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, являющегося результатом применения матричного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;; &lt;br /&gt;
**скалярное произведение двух векторов &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**вычисляется линейная комбинация векторов; &lt;br /&gt;
**вычисляется норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**проверяется условие выхода из цикла (равенство нулю нормы вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;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;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Посчитаем количество операций, необходимых для поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений и векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; действий для умножения матрицы на вектор&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; действия для перемножения двух векторов&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  операций для поэлементного сложения или вычитания двух векторов&lt;br /&gt;
* для отыскания нормы вектора помимо &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  сложений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  умножений требуется 1 операция извлечения корня&lt;br /&gt;
* для поиска собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; требуется &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарно для одной итерации алгоритма требуется совершить  &amp;lt;math&amp;gt;O(n^2)+O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
В данном разделе приведен информационный граф одной итерации алгоритма Ланцоша. Для простоты на схеме подразумевается матрица размерности 5x5, однако это не нарушает общности данной схемы.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Информационный_граф.png|1000px|thumb|center|Круглые элементы символизируют операции с элементами векторов и матриц: сложение и умножение (черные), операции составления линейной комбинации (зеленые) и операции деления вектора на его норму. В квадратных элементах изображены операции, которые невозможно выполнить параллельно: нахождение суммы элементов вектора (синий) и вычисление нормы вектора (красный). ]]&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;n\times n&amp;lt;/math&amp;gt; на вектор размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
В свою очередь ресурс параллелизма операции поиска собственных значений зависит от выбранного способа и не рассматривается в данной статье.&lt;br /&gt;
&lt;br /&gt;
Таким образом, с точки зрения ресурса параллелизма, алгоритм Ланцоша обладает линейной сложностью по ширине ЯПФ и квадратичной сложностью по высоте ЯПФ. Основное время работы алгоритма будет уделено операции умножения матрицы на вектор, имеющей ширину яруса &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;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;A&amp;lt;/math&amp;gt;, следовательно на вход данный алгоритм во всяком случае получает 1 число и 1 матрицу размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;. Помимо этого для начала работы алгоритму нужен некоторый вектор &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; начального приближения размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, который тоже является входными данными.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После окончания работы алгоритма мы получаем набор собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, состоящий из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; элементов. Если помимо собственных значений выводятся еще и полученные собственные векторы, то суммарный объём всех таких векторов составляет &amp;lt;math&amp;gt;k\times n&amp;lt;/math&amp;gt; элементов. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, совокупный объём входных данных составляет: &amp;lt;math&amp;gt;n^2+n+1&amp;lt;/math&amp;gt; элемент, а на выходе получаем &amp;lt;math&amp;gt;k(n+1)&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;lt;math&amp;gt;A&amp;lt;/math&amp;gt;) начиная с максимального в абсолютном смысле значения. Это выгодно отличает данный алгоритм с точки зрения поиска собственных значений матрицы, находящихся по краям её спектра.&lt;br /&gt;
&lt;br /&gt;
Не является полностью детерминированным, т.к. может досрочно завершить работу, если будут найдены все ненулевые собственные значения.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма (то есть отношение числа операций к суммарному объему входных и выходных данных) равна &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+2n+1}&amp;lt;/math&amp;gt;. Следовательно порядок мощности алгоритма примерно равен &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;, при &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В случае использования метода вычисления собственных значений с линейной сложностью, соотношение последовательной и параллельной сложностей будет равно &amp;lt;math&amp;gt;(k ^ 2 + n ^ 2) / (k  + n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша может быть модифицирован так, чтобы быть пригодным для применения к несимметричным системам.&lt;br /&gt;
&lt;br /&gt;
Существует усложнение алгоритма, которое позволяет сократить объём хранимых на каждой итерации векторов с 3-ух до 2-ух.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма=== &lt;br /&gt;
=== Локальность данных и вычислений=== &lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма=== &lt;br /&gt;
===  Масштабируемость алгоритма и его реализации===&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма=== &lt;br /&gt;
=== Выводы для классов архитектур=== &lt;br /&gt;
=== Существующие реализации алгоритма===&lt;br /&gt;
&lt;br /&gt;
В настоящее время алгоритм Ланцоша поиска собственных значений квадратной симметричной матрицы включён в несколько библиотек и реализован на различных языках, среди которых такие наиболее распространенные как &#039;&#039;&#039;C&#039;&#039;&#039;, &#039;&#039;&#039;C++&#039;&#039;&#039;, &#039;&#039;&#039;FORTRAN77/90&#039;&#039;&#039;, &#039;&#039;&#039;MathLab&#039;&#039;&#039;.&lt;br /&gt;
Так, например, в языке &#039;&#039;&#039;MathLab&#039;&#039;&#039; во встроенном пакете &#039;&#039;&#039;ARPACK&#039;&#039;&#039; найти собственные значения методом Ланцоша можно при помощи вызова функции &#039;&#039;eigs()&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
На языке &#039;&#039;&#039;С&#039;&#039;&#039; существует библиотека &#039;&#039;&#039;[http://www.cs.wm.edu/~andreas/software/ PRIMME]&#039;&#039;&#039;, название которой расшифровывается как PReconditioned Iterative MultiMethod Eigensolver (итерационные методы поиска собственных значений с предусловием).&lt;br /&gt;
&lt;br /&gt;
Библиотека &#039;&#039;&#039;[http://www.nag.co.uk NAG] Numerical Library&#039;&#039;&#039; также содержит обширный набор функций, позволяющих проводить математический анализ, среди которых есть и реализация алгоритма Ланцоша. Библиотека доступна в трех пакетах: NAG C Library, NAG Fortran Library и NAG Library for .NET, совместна со многими языками и с основными операционными системами (Windows, Linux and OS X, а также Solaris, AIX и HP-UX).&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] Дж. Деммель «Вычислительная линейная алгебра», с 381.&lt;br /&gt;
&lt;br /&gt;
[2] Wikipedia https://en.wikipedia.org/wiki/Lanczos_algorithm&lt;br /&gt;
&lt;br /&gt;
[3] &amp;quot;[https://static.ph.ed.ac.uk/dissertations/hpc-msc/2013-2014/Investigation%20and%20Implementation%20of%20an%20Eigensolver%20Method.pdf Investigation and Implementation of an Eigensolver Method]&amp;quot;, Jorge Moreira, The University of Edinburgh, August 2014&lt;br /&gt;
&lt;br /&gt;
[4] &amp;quot;[http://www.physics.drexel.edu/~bob/Term_Reports/Hoppe_01.pdf Lanczos Vector Procedures]&amp;quot;, Travis Hoppe&lt;br /&gt;
&lt;br /&gt;
[5] Parallel Scientific Computing in C++ and MPI&lt;br /&gt;
A seamless approach to parallel algorithms and their implementation,&lt;br /&gt;
George Em Karniadakis and Robert M. Kirby II,&lt;br /&gt;
Cambridge University Press&lt;/div&gt;</summary>
		<author><name>Alexbashirov</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=15941</id>
		<title>Участник:Alexbashirov/Алгоритм Ланцоша для точной арифметики</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=15941"/>
		<updated>2016-11-05T11:14:44Z</updated>

		<summary type="html">&lt;p&gt;Alexbashirov: /* Литература */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[Участник: Alexbashirov|Баширов А.Д.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name             = Алгоритм Ланцоша для точной арифметики&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;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;
Алгоритм Ланцоша является прямым алгоритмом поиска собственных значений симметричной матрицы, разработанным венгерским физиком и математиком XX столетия Корнелием Ланцошем в 1950 году. Алгоритм совмещает в себе два других алгоритма: алгоритм построения подпространства Крылова (который также был создан Ланцошем) и процедуру Рэлея-Ритца приближения собственных значений матрицы. Алгоритм является вариацией степенного метода, позволяющего найти собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-го порядка. Однако в алгоритме число итераций ограничено некоторым &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;. Несмотря на заявленную вычислительную эффективность, алгоритм не получил широкого применения в своём первоначальном виде, ввиду его неустойчивости. 20 лет спустя, в 1970 году ученые Ojalvo и Newman показали доработанный алгоритм Ланцоша, который теперь стал устойчивым а также предложили способ выбора вектора начального приближения &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt;. Полученный последователями Ланцоша алгоритм получил название &amp;quot;Алгоритм Ланцоша с полной переортогонализацией&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма===&lt;br /&gt;
Алгоритм Ланцоша работает с вещественной симметричной матрицей &amp;lt;math&amp;gt;A=A^T&amp;lt;/math&amp;gt;, таким образом в памяти достаточно хранить лишь немногим более половины элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Прежде чем переходить к описанию алгоритма, следует упомянуть следующие понятия: подпространство Крылова и процесс Рэлея-Ритца, о которых уже было сказано в исторической справке выше. &lt;br /&gt;
Подпространством Крылова называется набор векторов&amp;lt;math&amp;gt;K_n =[b,Ab,A^2b,...,A^{n-1}b]&amp;lt;/math&amp;gt;. Начав свою работу с произвольного вектора &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, степенной метод вычисляет вектора &amp;lt;math&amp;gt;Ab, A^2b,...,A^{n-1}b&amp;lt;/math&amp;gt; итерационно сохраняя полученный результат в вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Полученная последовательность векторов сходится к собственному вектору, отвечающему максимальному собственному значению &amp;lt;math&amp;gt;\lambda_{max}&amp;lt;/math&amp;gt;. Однако, использование лишь последнего полученного вектора и потеря всех предшествующих посчитанных величин не всегда является наилучшим выбором. Поэтому сохранив все вектора и объединив их в одну матрицу мы получим так называемую &#039;&#039;&#039;матрицу Крылова&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K_j = [b,Ab,A^2b,...,A^{j-1}b]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Столбцы получившейся матрицы не ортогональны, однако их можно ортогонализовать, применив процесс Грамма-Шмидта. Получившиеся вектора будут составлять базис подпространства Крылова &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt;. Можно ожидать, что вектора полученного базиса будут достаточно хорошо приближать &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; собственных векторов, отвечающих &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; наибольшим собственным значения.&lt;br /&gt;
&lt;br /&gt;
Затем с использованием полученной матрицы из ортогональных векторов &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt; мы получим трехдиагональную матрицу &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; на основе исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
Наконец, к полученной матрице &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; будет применяться &#039;&#039;&#039;процесс Рэлея-Ритца&#039;&#039;&#039;, который найдет собственные значения трехдиагональной матрицы. В последствии эти значения и будут приближениями искомых собственных значений исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма Ланцоша, то есть наиболее ресурсно-затратной частью алгоритма, является шаг на котором на каждой итерации происходит перемножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;, полученный на предыдущей итерации. Полученный в результате умножения вектор обозначается &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; z=Aq_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;Q_j=[q_1,q_2,...q_j]&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортонормированных вектров Ланцоша и последующее формирование трехдиагональной матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;. Число таких векторов и, следовательно, размер матрицы растет с каждой итерацией. Итерационный процесс завершается при &amp;lt;math&amp;gt;j=k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На долю второй части алгоритма приходится поиск собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;, полученной в первой части.&lt;br /&gt;
&lt;br /&gt;
=== Схема последовательной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ланцош_Схема реализации.png|800px]]&lt;br /&gt;
&lt;br /&gt;
На рисунке выше представлен псевдокод, отражающий последовательность действий в алгоритме метода. Перечислим основные ступени в данном методе:&lt;br /&gt;
* Прежде чем войти в цикл, происходит инициализация констант &amp;lt;math&amp;gt;\Beta_0,q_0&amp;lt;/math&amp;gt;, вычисление нормы вектора начального приближения &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и нормализация этого вектора.&lt;br /&gt;
* Затем, в цикле, происходит: &lt;br /&gt;
**поиск вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, являющегося результатом применения матричного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;; &lt;br /&gt;
**скалярное произведение двух векторов &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**вычисляется линейная комбинация векторов; &lt;br /&gt;
**вычисляется норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**проверяется условие выхода из цикла (равенство нулю нормы вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;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;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Посчитаем количество операций, необходимых для поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений и векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; действий для умножения матрицы на вектор&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; действия для перемножения двух векторов&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  операций для поэлементного сложения или вычитания двух векторов&lt;br /&gt;
* для отыскания нормы вектора помимо &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  сложений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  умножений требуется 1 операция извлечения корня&lt;br /&gt;
* для поиска собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; требуется &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарно для одной итерации алгоритма требуется совершить  &amp;lt;math&amp;gt;O(n^2)+O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
В данном разделе приведен информационный граф одной итерации алгоритма Ланцоша. Для простоты на схеме подразумевается матрица размерности 5x5, однако это не нарушает общности данной схемы.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Информационный_граф.png|1000px|thumb|center|Круглые элементы символизируют операции с элементами векторов и матриц: сложение и умножение (черные), операции составления линейной комбинации (зеленые) и операции деления вектора на его норму. В квадратных элементах изображены операции, которые невозможно выполнить параллельно: нахождение суммы элементов вектора (синий) и вычисление нормы вектора (красный). ]]&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;n\times n&amp;lt;/math&amp;gt; на вектор размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
В свою очередь ресурс параллелизма операции поиска собственных значений зависит от выбранного способа и не рассматривается в данной статье.&lt;br /&gt;
&lt;br /&gt;
Таким образом, с точки зрения ресурса параллелизма, алгоритм Ланцоша обладает линейной сложностью по ширине ЯПФ и квадратичной сложностью по высоте ЯПФ. Основное время работы алгоритма будет уделено операции умножения матрицы на вектор, имеющей ширину яруса &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;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;A&amp;lt;/math&amp;gt;, следовательно на вход данный алгоритм во всяком случае получает 1 число и 1 матрицу размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;. Помимо этого для начала работы алгоритму нужен некоторый вектор &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; начального приближения размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, который тоже является входными данными.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После окончания работы алгоритма мы получаем набор собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, состоящий из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; элементов. Если помимо собственных значений выводятся еще и полученные собственные векторы, то суммарный объём всех таких векторов составляет &amp;lt;math&amp;gt;k\times n&amp;lt;/math&amp;gt; элементов. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, совокупный объём входных данных составляет: &amp;lt;math&amp;gt;n^2+n+1&amp;lt;/math&amp;gt; элемент, а на выходе получаем &amp;lt;math&amp;gt;k(n+1)&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;lt;math&amp;gt;A&amp;lt;/math&amp;gt;) начиная с максимального в абсолютном смысле значения. Это выгодно отличает данный алгоритм с точки зрения поиска собственных значений матрицы, находящихся по краям её спектра.&lt;br /&gt;
&lt;br /&gt;
Не является полностью детерминированным, т.к. может досрочно завершить работу, если будут найдены все ненулевые собственные значения.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма (то есть отношение числа операций к суммарному объему входных и выходных данных) равна &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+2n+1}&amp;lt;/math&amp;gt;. Следовательно порядок мощности алгоритма примерно равен &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;, при &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В случае использования метода вычисления собственных значений с линейной сложностью, соотношение последовательной и параллельной сложностей будет равно &amp;lt;math&amp;gt;(k ^ 2 + n ^ 2) / (k  + n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша может быть модифицирован так, чтобы быть пригодным для применения к несимметричным системам.&lt;br /&gt;
&lt;br /&gt;
Существует усложнение алгоритма, которое позволяет сократить объём хранимых на каждой итерации векторов с 3-ух до 2-ух.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма=== &lt;br /&gt;
=== Локальность данных и вычислений=== &lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма=== &lt;br /&gt;
===  Масштабируемость алгоритма и его реализации===&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма=== &lt;br /&gt;
=== Выводы для классов архитектур=== &lt;br /&gt;
=== Существующие реализации алгоритма===&lt;br /&gt;
&lt;br /&gt;
В настоящее время алгоритм Ланцоша поиска собственных значений квадратной симметричной матрицы включён в несколько библиотек и реализован на различных языках, среди которых такие наиболее распространенные как &#039;&#039;&#039;C&#039;&#039;&#039;, &#039;&#039;&#039;C++&#039;&#039;&#039;, &#039;&#039;&#039;FORTRAN77/90&#039;&#039;&#039;, &#039;&#039;&#039;MathLab&#039;&#039;&#039;.&lt;br /&gt;
Так, например, в языке &#039;&#039;&#039;MathLab&#039;&#039;&#039; во встроенном пакете &#039;&#039;&#039;ARPACK&#039;&#039;&#039; найти собственные значения методом Ланцоша можно при помощи вызова функции &#039;&#039;eigs()&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
На языке &#039;&#039;&#039;С&#039;&#039;&#039; существует библиотека &#039;&#039;&#039;[http://www.cs.wm.edu/~andreas/software/ PRIMME]&#039;&#039;&#039;, название которой расшифровывается как PReconditioned Iterative MultiMethod Eigensolver (итерационные методы поиска собственных значений с предусловием).&lt;br /&gt;
&lt;br /&gt;
Библиотека &#039;&#039;&#039;[http://www.nag.co.uk NAG] Numerical Library&#039;&#039;&#039; также содержит обширный набор функций, позволяющих проводить математический анализ, среди которых есть и реализация алгоритма Ланцоша. Библиотека доступна в трех пакетах: NAG C Library, NAG Fortran Library и NAG Library for .NET, совместна со многими языками и с основными операционными системами (Windows, Linux and OS X, а также Solaris, AIX и HP-UX).&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] Дж. Деммель «Вычислительная линейная алгебра», с 381.&lt;br /&gt;
&lt;br /&gt;
[2] Wikipedia https://en.wikipedia.org/wiki/Lanczos_algorithm&lt;br /&gt;
&lt;br /&gt;
[3] &amp;quot;[https://static.ph.ed.ac.uk/dissertations/hpc-msc/2013-2014/Investigation%20and%20Implementation%20of%20an%20Eigensolver%20Method.pdf Investigation and Implementation of an Eigensolver Method]&amp;quot;, Jorge Moreira, The University of Edinburgh, August 2014&lt;br /&gt;
&lt;br /&gt;
[4] &amp;quot;[http://www.physics.drexel.edu/~bob/Term_Reports/Hoppe_01.pdf Lanczos Vector Procedures]&amp;quot;, Travis Hoppe&lt;br /&gt;
&lt;br /&gt;
[5] Parallel Scientific Computing in C++ and MPI&lt;br /&gt;
A seamless approach to parallel algorithms and their implementation&lt;br /&gt;
George Em Karniadakis and Robert M. Kirby II&lt;br /&gt;
Cambridge University Press&lt;/div&gt;</summary>
		<author><name>Alexbashirov</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=15940</id>
		<title>Участник:Alexbashirov/Алгоритм Ланцоша для точной арифметики</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=15940"/>
		<updated>2016-11-05T11:14:09Z</updated>

		<summary type="html">&lt;p&gt;Alexbashirov: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[Участник: Alexbashirov|Баширов А.Д.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name             = Алгоритм Ланцоша для точной арифметики&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;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;
Алгоритм Ланцоша является прямым алгоритмом поиска собственных значений симметричной матрицы, разработанным венгерским физиком и математиком XX столетия Корнелием Ланцошем в 1950 году. Алгоритм совмещает в себе два других алгоритма: алгоритм построения подпространства Крылова (который также был создан Ланцошем) и процедуру Рэлея-Ритца приближения собственных значений матрицы. Алгоритм является вариацией степенного метода, позволяющего найти собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-го порядка. Однако в алгоритме число итераций ограничено некоторым &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;. Несмотря на заявленную вычислительную эффективность, алгоритм не получил широкого применения в своём первоначальном виде, ввиду его неустойчивости. 20 лет спустя, в 1970 году ученые Ojalvo и Newman показали доработанный алгоритм Ланцоша, который теперь стал устойчивым а также предложили способ выбора вектора начального приближения &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt;. Полученный последователями Ланцоша алгоритм получил название &amp;quot;Алгоритм Ланцоша с полной переортогонализацией&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма===&lt;br /&gt;
Алгоритм Ланцоша работает с вещественной симметричной матрицей &amp;lt;math&amp;gt;A=A^T&amp;lt;/math&amp;gt;, таким образом в памяти достаточно хранить лишь немногим более половины элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Прежде чем переходить к описанию алгоритма, следует упомянуть следующие понятия: подпространство Крылова и процесс Рэлея-Ритца, о которых уже было сказано в исторической справке выше. &lt;br /&gt;
Подпространством Крылова называется набор векторов&amp;lt;math&amp;gt;K_n =[b,Ab,A^2b,...,A^{n-1}b]&amp;lt;/math&amp;gt;. Начав свою работу с произвольного вектора &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, степенной метод вычисляет вектора &amp;lt;math&amp;gt;Ab, A^2b,...,A^{n-1}b&amp;lt;/math&amp;gt; итерационно сохраняя полученный результат в вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Полученная последовательность векторов сходится к собственному вектору, отвечающему максимальному собственному значению &amp;lt;math&amp;gt;\lambda_{max}&amp;lt;/math&amp;gt;. Однако, использование лишь последнего полученного вектора и потеря всех предшествующих посчитанных величин не всегда является наилучшим выбором. Поэтому сохранив все вектора и объединив их в одну матрицу мы получим так называемую &#039;&#039;&#039;матрицу Крылова&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K_j = [b,Ab,A^2b,...,A^{j-1}b]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Столбцы получившейся матрицы не ортогональны, однако их можно ортогонализовать, применив процесс Грамма-Шмидта. Получившиеся вектора будут составлять базис подпространства Крылова &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt;. Можно ожидать, что вектора полученного базиса будут достаточно хорошо приближать &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; собственных векторов, отвечающих &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; наибольшим собственным значения.&lt;br /&gt;
&lt;br /&gt;
Затем с использованием полученной матрицы из ортогональных векторов &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt; мы получим трехдиагональную матрицу &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; на основе исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
Наконец, к полученной матрице &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; будет применяться &#039;&#039;&#039;процесс Рэлея-Ритца&#039;&#039;&#039;, который найдет собственные значения трехдиагональной матрицы. В последствии эти значения и будут приближениями искомых собственных значений исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма Ланцоша, то есть наиболее ресурсно-затратной частью алгоритма, является шаг на котором на каждой итерации происходит перемножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;, полученный на предыдущей итерации. Полученный в результате умножения вектор обозначается &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; z=Aq_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;Q_j=[q_1,q_2,...q_j]&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортонормированных вектров Ланцоша и последующее формирование трехдиагональной матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;. Число таких векторов и, следовательно, размер матрицы растет с каждой итерацией. Итерационный процесс завершается при &amp;lt;math&amp;gt;j=k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На долю второй части алгоритма приходится поиск собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;, полученной в первой части.&lt;br /&gt;
&lt;br /&gt;
=== Схема последовательной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ланцош_Схема реализации.png|800px]]&lt;br /&gt;
&lt;br /&gt;
На рисунке выше представлен псевдокод, отражающий последовательность действий в алгоритме метода. Перечислим основные ступени в данном методе:&lt;br /&gt;
* Прежде чем войти в цикл, происходит инициализация констант &amp;lt;math&amp;gt;\Beta_0,q_0&amp;lt;/math&amp;gt;, вычисление нормы вектора начального приближения &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и нормализация этого вектора.&lt;br /&gt;
* Затем, в цикле, происходит: &lt;br /&gt;
**поиск вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, являющегося результатом применения матричного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;; &lt;br /&gt;
**скалярное произведение двух векторов &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**вычисляется линейная комбинация векторов; &lt;br /&gt;
**вычисляется норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**проверяется условие выхода из цикла (равенство нулю нормы вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;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;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Посчитаем количество операций, необходимых для поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений и векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; действий для умножения матрицы на вектор&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; действия для перемножения двух векторов&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  операций для поэлементного сложения или вычитания двух векторов&lt;br /&gt;
* для отыскания нормы вектора помимо &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  сложений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  умножений требуется 1 операция извлечения корня&lt;br /&gt;
* для поиска собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; требуется &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарно для одной итерации алгоритма требуется совершить  &amp;lt;math&amp;gt;O(n^2)+O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
В данном разделе приведен информационный граф одной итерации алгоритма Ланцоша. Для простоты на схеме подразумевается матрица размерности 5x5, однако это не нарушает общности данной схемы.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Информационный_граф.png|1000px|thumb|center|Круглые элементы символизируют операции с элементами векторов и матриц: сложение и умножение (черные), операции составления линейной комбинации (зеленые) и операции деления вектора на его норму. В квадратных элементах изображены операции, которые невозможно выполнить параллельно: нахождение суммы элементов вектора (синий) и вычисление нормы вектора (красный). ]]&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;n\times n&amp;lt;/math&amp;gt; на вектор размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
В свою очередь ресурс параллелизма операции поиска собственных значений зависит от выбранного способа и не рассматривается в данной статье.&lt;br /&gt;
&lt;br /&gt;
Таким образом, с точки зрения ресурса параллелизма, алгоритм Ланцоша обладает линейной сложностью по ширине ЯПФ и квадратичной сложностью по высоте ЯПФ. Основное время работы алгоритма будет уделено операции умножения матрицы на вектор, имеющей ширину яруса &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;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;A&amp;lt;/math&amp;gt;, следовательно на вход данный алгоритм во всяком случае получает 1 число и 1 матрицу размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;. Помимо этого для начала работы алгоритму нужен некоторый вектор &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; начального приближения размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, который тоже является входными данными.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После окончания работы алгоритма мы получаем набор собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, состоящий из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; элементов. Если помимо собственных значений выводятся еще и полученные собственные векторы, то суммарный объём всех таких векторов составляет &amp;lt;math&amp;gt;k\times n&amp;lt;/math&amp;gt; элементов. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, совокупный объём входных данных составляет: &amp;lt;math&amp;gt;n^2+n+1&amp;lt;/math&amp;gt; элемент, а на выходе получаем &amp;lt;math&amp;gt;k(n+1)&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;lt;math&amp;gt;A&amp;lt;/math&amp;gt;) начиная с максимального в абсолютном смысле значения. Это выгодно отличает данный алгоритм с точки зрения поиска собственных значений матрицы, находящихся по краям её спектра.&lt;br /&gt;
&lt;br /&gt;
Не является полностью детерминированным, т.к. может досрочно завершить работу, если будут найдены все ненулевые собственные значения.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма (то есть отношение числа операций к суммарному объему входных и выходных данных) равна &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+2n+1}&amp;lt;/math&amp;gt;. Следовательно порядок мощности алгоритма примерно равен &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;, при &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В случае использования метода вычисления собственных значений с линейной сложностью, соотношение последовательной и параллельной сложностей будет равно &amp;lt;math&amp;gt;(k ^ 2 + n ^ 2) / (k  + n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша может быть модифицирован так, чтобы быть пригодным для применения к несимметричным системам.&lt;br /&gt;
&lt;br /&gt;
Существует усложнение алгоритма, которое позволяет сократить объём хранимых на каждой итерации векторов с 3-ух до 2-ух.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма=== &lt;br /&gt;
=== Локальность данных и вычислений=== &lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма=== &lt;br /&gt;
===  Масштабируемость алгоритма и его реализации===&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма=== &lt;br /&gt;
=== Выводы для классов архитектур=== &lt;br /&gt;
=== Существующие реализации алгоритма===&lt;br /&gt;
&lt;br /&gt;
В настоящее время алгоритм Ланцоша поиска собственных значений квадратной симметричной матрицы включён в несколько библиотек и реализован на различных языках, среди которых такие наиболее распространенные как &#039;&#039;&#039;C&#039;&#039;&#039;, &#039;&#039;&#039;C++&#039;&#039;&#039;, &#039;&#039;&#039;FORTRAN77/90&#039;&#039;&#039;, &#039;&#039;&#039;MathLab&#039;&#039;&#039;.&lt;br /&gt;
Так, например, в языке &#039;&#039;&#039;MathLab&#039;&#039;&#039; во встроенном пакете &#039;&#039;&#039;ARPACK&#039;&#039;&#039; найти собственные значения методом Ланцоша можно при помощи вызова функции &#039;&#039;eigs()&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
На языке &#039;&#039;&#039;С&#039;&#039;&#039; существует библиотека &#039;&#039;&#039;[http://www.cs.wm.edu/~andreas/software/ PRIMME]&#039;&#039;&#039;, название которой расшифровывается как PReconditioned Iterative MultiMethod Eigensolver (итерационные методы поиска собственных значений с предусловием).&lt;br /&gt;
&lt;br /&gt;
Библиотека &#039;&#039;&#039;[http://www.nag.co.uk NAG] Numerical Library&#039;&#039;&#039; также содержит обширный набор функций, позволяющих проводить математический анализ, среди которых есть и реализация алгоритма Ланцоша. Библиотека доступна в трех пакетах: NAG C Library, NAG Fortran Library и NAG Library for .NET, совместна со многими языками и с основными операционными системами (Windows, Linux and OS X, а также Solaris, AIX и HP-UX).&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] Дж. Деммель «Вычислительная линейная алгебра», с 381.&lt;br /&gt;
&lt;br /&gt;
[2] Wikipedia https://en.wikipedia.org/wiki/Lanczos_algorithm&lt;br /&gt;
&lt;br /&gt;
[3] &amp;quot;[https://static.ph.ed.ac.uk/dissertations/hpc-msc/2013-2014/Investigation%20and%20Implementation%20of%20an%20Eigensolver%20Method.pdf Investigation and Implementation of an Eigensolver Method]&amp;quot;, Jorge Moreira, The University of Edinburgh, August 2014&lt;br /&gt;
&lt;br /&gt;
[4] &amp;quot;[http://www.physics.drexel.edu/~bob/Term_Reports/Hoppe_01.pdf Lanczos Vector Procedures]&amp;quot;, Travis Hoppe&lt;/div&gt;</summary>
		<author><name>Alexbashirov</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=15939</id>
		<title>Участник:Alexbashirov/Алгоритм Ланцоша для точной арифметики</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=15939"/>
		<updated>2016-11-05T11:12:48Z</updated>

		<summary type="html">&lt;p&gt;Alexbashirov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[Участник: Alexbashirov|Баширов А.Д.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name             = Алгоритм Ланцоша для точной арифметики&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;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;
Алгоритм Ланцоша является прямым алгоритмом поиска собственных значений симметричной матрицы, разработанным венгерским физиком и математиком XX столетия Корнелием Ланцошем в 1950 году. Алгоритм совмещает в себе два других алгоритма: алгоритм построения подпространства Крылова (который также был создан Ланцошем) и процедуру Рэлея-Ритца приближения собственных значений матрицы. Алгоритм является вариацией степенного метода, позволяющего найти собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-го порядка. Однако в алгоритме число итераций ограничено некоторым &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;. Несмотря на заявленную вычислительную эффективность, алгоритм не получил широкого применения в своём первоначальном виде, ввиду его неустойчивости. 20 лет спустя, в 1970 году ученые Ojalvo и Newman показали доработанный алгоритм Ланцоша, который теперь стал устойчивым а также предложили способ выбора вектора начального приближения &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt;. Полученный последователями Ланцоша алгоритм получил название &amp;quot;Алгоритм Ланцоша с полной переортогонализацией&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма===&lt;br /&gt;
Алгоритм Ланцоша работает с вещественной симметричной матрицей &amp;lt;math&amp;gt;A=A^T&amp;lt;/math&amp;gt;, таким образом в памяти достаточно хранить лишь немногим более половины элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Прежде чем переходить к описанию алгоритма, следует упомянуть следующие понятия: подпространство Крылова и процесс Рэлея-Ритца, о которых уже было сказано в исторической справке выше. &lt;br /&gt;
Подпространством Крылова называется набор векторов&amp;lt;math&amp;gt;K_n =[b,Ab,A^2b,...,A^{n-1}b]&amp;lt;/math&amp;gt;. Начав свою работу с произвольного вектора &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, степенной метод вычисляет вектора &amp;lt;math&amp;gt;Ab, A^2b,...,A^{n-1}b&amp;lt;/math&amp;gt; итерационно сохраняя полученный результат в вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Полученная последовательность векторов сходится к собственному вектору, отвечающему максимальному собственному значению &amp;lt;math&amp;gt;\lambda_{max}&amp;lt;/math&amp;gt;. Однако, использование лишь последнего полученного вектора и потеря всех предшествующих посчитанных величин не всегда является наилучшим выбором. Поэтому сохранив все вектора и объединив их в одну матрицу мы получим так называемую &#039;&#039;&#039;матрицу Крылова&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K_j = [b,Ab,A^2b,...,A^{j-1}b]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Столбцы получившейся матрицы не ортогональны, однако их можно ортогонализовать, применив процесс Грамма-Шмидта. Получившиеся вектора будут составлять базис подпространства Крылова &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt;. Можно ожидать, что вектора полученного базиса будут достаточно хорошо приближать &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; собственных векторов, отвечающих &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; наибольшим собственным значения.&lt;br /&gt;
&lt;br /&gt;
Затем с использованием полученной матрицы из ортогональных векторов &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt; мы получим трехдиагональную матрицу &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; на основе исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
Наконец, к полученной матрице &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; будет применяться &#039;&#039;&#039;процесс Рэлея-Ритца&#039;&#039;&#039;, который найдет собственные значения трехдиагональной матрицы. В последствии эти значения и будут приближениями искомых собственных значений исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма Ланцоша, то есть наиболее ресурсно-затратной частью алгоритма, является шаг на котором на каждой итерации происходит перемножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;, полученный на предыдущей итерации. Полученный в результате умножения вектор обозначается &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; z=Aq_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;Q_j=[q_1,q_2,...q_j]&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортонормированных вектров Ланцоша и последующее формирование трехдиагональной матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;. Число таких векторов и, следовательно, размер матрицы растет с каждой итерацией. Итерационный процесс завершается при &amp;lt;math&amp;gt;j=k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На долю второй части алгоритма приходится поиск собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;, полученной в первой части.&lt;br /&gt;
&lt;br /&gt;
=== Схема последовательной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ланцош_Схема реализации.png|800px]]&lt;br /&gt;
&lt;br /&gt;
На рисунке выше представлен псевдокод, отражающий последовательность действий в алгоритме метода. Перечислим основные ступени в данном методе:&lt;br /&gt;
* Прежде чем войти в цикл, происходит инициализация констант &amp;lt;math&amp;gt;\Beta_0,q_0&amp;lt;/math&amp;gt;, вычисление нормы вектора начального приближения &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и нормализация этого вектора.&lt;br /&gt;
* Затем, в цикле, происходит: &lt;br /&gt;
**поиск вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, являющегося результатом применения матричного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;; &lt;br /&gt;
**скалярное произведение двух векторов &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**вычисляется линейная комбинация векторов; &lt;br /&gt;
**вычисляется норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**проверяется условие выхода из цикла (равенство нулю нормы вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;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;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Посчитаем количество операций, необходимых для поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений и векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; действий для умножения матрицы на вектор&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; действия для перемножения двух векторов&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  операций для поэлементного сложения или вычитания двух векторов&lt;br /&gt;
* для отыскания нормы вектора помимо &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  сложений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  умножений требуется 1 операция извлечения корня&lt;br /&gt;
* для поиска собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; требуется &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарно для одной итерации алгоритма требуется совершить  &amp;lt;math&amp;gt;O(n^2)+O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
В данном разделе приведен информационный граф одной итерации алгоритма Ланцоша. Для простоты на схеме подразумевается матрица размерности 5x5, однако это не нарушает общности данной схемы.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Информационный_граф.png|1000px|thumb|center|Круглые элементы символизируют операции с элементами векторов и матриц: сложение и умножение (черные), операции составления линейной комбинации (зеленые) и операции деления вектора на его норму. В квадратных элементах изображены операции, которые невозможно выполнить параллельно: нахождение суммы элементов вектора (синий) и вычисление нормы вектора (красный). ]]&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;n\times n&amp;lt;/math&amp;gt; на вектор размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
В свою очередь ресурс параллелизма операции поиска собственных значений зависит от выбранного способа и не рассматривается в данной статье.&lt;br /&gt;
&lt;br /&gt;
Таким образом, с точки зрения ресурса параллелизма, алгоритм Ланцоша обладает линейной сложностью по ширине ЯПФ и квадратичной сложностью по высоте ЯПФ. Основное время работы алгоритма будет уделено операции умножения матрицы на вектор, имеющей ширину яруса &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;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;A&amp;lt;/math&amp;gt;, следовательно на вход данный алгоритм во всяком случае получает 1 число и 1 матрицу размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;. Помимо этого для начала работы алгоритму нужен некоторый вектор &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; начального приближения размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, который тоже является входными данными.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После окончания работы алгоритма мы получаем набор собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, состоящий из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; элементов. Если помимо собственных значений выводятся еще и полученные собственные векторы, то суммарный объём всех таких векторов составляет &amp;lt;math&amp;gt;k\times n&amp;lt;/math&amp;gt; элементов. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, совокупный объём входных данных составляет: &amp;lt;math&amp;gt;n^2+n+1&amp;lt;/math&amp;gt; элемент, а на выходе получаем &amp;lt;math&amp;gt;k(n+1)&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;lt;math&amp;gt;A&amp;lt;/math&amp;gt;) начиная с максимального в абсолютном смысле значения. Это выгодно отличает данный алгоритм с точки зрения поиска собственных значений матрицы, находящихся по краям её спектра.&lt;br /&gt;
&lt;br /&gt;
Не является полностью детерминированным, т.к. может досрочно завершить работу, если будут найдены все ненулевые собственные значения.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма (то есть отношение числа операций к суммарному объему входных и выходных данных) равна &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+2n+1}&amp;lt;/math&amp;gt;. Следовательно порядок мощности алгоритма примерно равен &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;, при &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В случае использования метода вычисления собственных значений с линейной сложностью, соотношение последовательной и параллельной сложностей будет равно &amp;lt;math&amp;gt;(k ^ 2 + n ^ 2) / (k  + 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;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма=== &lt;br /&gt;
=== Выводы для классов архитектур=== &lt;br /&gt;
=== Существующие реализации алгоритма===&lt;br /&gt;
&lt;br /&gt;
В настоящее время алгоритм Ланцоша поиска собственных значений квадратной симметричной матрицы включён в несколько библиотек и реализован на различных языках, среди которых такие наиболее распространенные как &#039;&#039;&#039;C&#039;&#039;&#039;, &#039;&#039;&#039;C++&#039;&#039;&#039;, &#039;&#039;&#039;FORTRAN77/90&#039;&#039;&#039;, &#039;&#039;&#039;MathLab&#039;&#039;&#039;.&lt;br /&gt;
Так, например, в языке &#039;&#039;&#039;MathLab&#039;&#039;&#039; во встроенном пакете &#039;&#039;&#039;ARPACK&#039;&#039;&#039; найти собственные значения методом Ланцоша можно при помощи вызова функции &#039;&#039;eigs()&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
На языке &#039;&#039;&#039;С&#039;&#039;&#039; существует библиотека &#039;&#039;&#039;[http://www.cs.wm.edu/~andreas/software/ PRIMME]&#039;&#039;&#039;, название которой расшифровывается как PReconditioned Iterative MultiMethod Eigensolver (итерационные методы поиска собственных значений с предусловием).&lt;br /&gt;
&lt;br /&gt;
Библиотека &#039;&#039;&#039;[http://www.nag.co.uk NAG] Numerical Library&#039;&#039;&#039; также содержит обширный набор функций, позволяющих проводить математический анализ, среди которых есть и реализация алгоритма Ланцоша. Библиотека доступна в трех пакетах: NAG C Library, NAG Fortran Library и NAG Library for .NET, совместна со многими языками и с основными операционными системами (Windows, Linux and OS X, а также Solaris, AIX и HP-UX).&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] Дж. Деммель «Вычислительная линейная алгебра», с 381.&lt;br /&gt;
&lt;br /&gt;
[2] Wikipedia https://en.wikipedia.org/wiki/Lanczos_algorithm&lt;br /&gt;
&lt;br /&gt;
[3] &amp;quot;[https://static.ph.ed.ac.uk/dissertations/hpc-msc/2013-2014/Investigation%20and%20Implementation%20of%20an%20Eigensolver%20Method.pdf Investigation and Implementation of an Eigensolver Method]&amp;quot;, Jorge Moreira, The University of Edinburgh, August 2014&lt;br /&gt;
&lt;br /&gt;
[4] &amp;quot;[http://www.physics.drexel.edu/~bob/Term_Reports/Hoppe_01.pdf Lanczos Vector Procedures]&amp;quot;, Travis Hoppe&lt;/div&gt;</summary>
		<author><name>Alexbashirov</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=14928</id>
		<title>Участник:Alexbashirov/Алгоритм Ланцоша для точной арифметики</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=14928"/>
		<updated>2016-10-30T19:55:25Z</updated>

		<summary type="html">&lt;p&gt;Alexbashirov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
Авторы: [[Участник: Alexbashirov|Баширов А.Д.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name             = Алгоритм Ланцоша для точной арифметики&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;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;
Алгоритм Ланцоша является прямым алгоритмом поиска собственных значений симметричной матрицы, разработанным венгерским физиком и математиком XX столетия Корнелием Ланцошем в 1950 году. Алгоритм совмещает в себе два других алгоритма: алгоритм построения подпространства Крылова (который также был создан Ланцошем) и процедуру Рэлея-Ритца приближения собственных значений матрицы. Алгоритм является вариацией степенного метода, позволяющего найти собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-го порядка. Однако в алгоритме число итераций ограничено некоторым &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;. Несмотря на заявленную вычислительную эффективность, алгоритм не получил широкого применения в своём первоначальном виде, ввиду его неустойчивости. 20 лет спустя, в 1970 году ученые Ojalvo и Newman показали доработанный алгоритм Ланцоша, который теперь стал устойчивым а также предложили способ выбора вектора начального приближения &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt;. Полученный последователями Ланцоша алгоритм получил название &amp;quot;Алгоритм Ланцоша с полной переортогонализацией&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма===&lt;br /&gt;
Алгоритм Ланцоша работает с вещественной симметричной матрицей &amp;lt;math&amp;gt;A=A^T&amp;lt;/math&amp;gt;, таким образом в памяти достаточно хранить лишь немногим более половины элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Прежде чем переходить к описанию алгоритма, следует упомянуть следующие понятия: подпространство Крылова и процесс Рэлея-Ритца, о которых уже было сказано в исторической справке выше. &lt;br /&gt;
Подпространством Крылова называется набор векторов&amp;lt;math&amp;gt;K_n =[b,Ab,A^2b,...,A^{n-1}b]&amp;lt;/math&amp;gt;. Начав свою работу с произвольного вектора &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, степенной метод вычисляет вектора &amp;lt;math&amp;gt;Ab, A^2b,...,A^{n-1}b&amp;lt;/math&amp;gt; итерационно сохраняя полученный результат в вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Полученная последовательность векторов сходится к собственному вектору, отвечающему максимальному собственному значению &amp;lt;math&amp;gt;\lambda_{max}&amp;lt;/math&amp;gt;. Однако, использование лишь последнего полученного вектора и потеря всех предшествующих посчитанных величин не всегда является наилучшим выбором. Поэтому сохранив все вектора и объединив их в одну матрицу мы получим так называемую &#039;&#039;&#039;матрицу Крылова&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K_j = [b,Ab,A^2b,...,A^{j-1}b]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Столбцы получившейся матрицы не ортогональны, однако их можно ортогонализовать, применив процесс Грамма-Шмидта. Получившиеся вектора будут составлять базис подпространства Крылова &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt;. Можно ожидать, что вектора полученного базиса будут достаточно хорошо приближать &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; собственных векторов, отвечающих &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; наибольшим собственным значения.&lt;br /&gt;
&lt;br /&gt;
Затем с использованием полученной матрицы из ортогональных векторов &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt; мы получим трехдиагональную матрицу &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; на основе исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
Наконец, к полученной матрице &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; будет применяться &#039;&#039;&#039;процесс Рэлея-Ритца&#039;&#039;&#039;, который найдет собственные значения трехдиагональной матрицы. В последствии эти значения и будут приближениями искомых собственных значений исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма Ланцоша, то есть наиболее ресурсно-затратной частью алгоритма, является шаг на котором на каждой итерации происходит перемножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;, полученный на предыдущей итерации. Полученный в результате умножения вектор обозначается &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; z=Aq_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;Q_j=[q_1,q_2,...q_j]&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортонормированных вектров Ланцоша и последующее формирование трехдиагональной матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;. Число таких векторов и, следовательно, размер матрицы растет с каждой итерацией. Итерационный процесс завершается при &amp;lt;math&amp;gt;j=k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На долю второй части алгоритма приходится поиск собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;, полученной в первой части.&lt;br /&gt;
&lt;br /&gt;
=== Схема последовательной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ланцош_Схема реализации.png|800px]]&lt;br /&gt;
&lt;br /&gt;
На рисунке выше представлен псевдокод, отражающий последовательность действий в алгоритме метода. Перечислим основные ступени в данном методе:&lt;br /&gt;
* Прежде чем войти в цикл, происходит инициализация констант &amp;lt;math&amp;gt;\Beta_0,q_0&amp;lt;/math&amp;gt;, вычисление нормы вектора начального приближения &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и нормализация этого вектора.&lt;br /&gt;
* Затем, в цикле, происходит: &lt;br /&gt;
**поиск вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, являющегося результатом применения матричного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;; &lt;br /&gt;
**скалярное произведение двух векторов &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**вычисляется линейная комбинация векторов; &lt;br /&gt;
**вычисляется норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**проверяется условие выхода из цикла (равенство нулю нормы вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;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;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Посчитаем количество операций, необходимых для поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений и векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; действий для умножения матрицы на вектор&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; действия для перемножения двух векторов&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  операций для поэлементного сложения или вычитания двух векторов&lt;br /&gt;
* для отыскания нормы вектора помимо &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  сложений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  умножений требуется 1 операция извлечения корня&lt;br /&gt;
* для поиска собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; требуется &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарно для одной итерации алгоритма требуется совершить  &amp;lt;math&amp;gt;O(n^2)+O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
В данном разделе приведен информационный граф одной итерации алгоритма Ланцоша. Для простоты на схеме подразумевается матрица размерности 5x5, однако это не нарушает общности данной схемы.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Информационный_граф.png|1000px|thumb|center|Круглые элементы символизируют операции с элементами векторов и матриц: сложение и умножение (черные), операции составления линейной комбинации (зеленые) и операции деления вектора на его норму. В квадратных элементах изображены операции, которые невозможно выполнить параллельно: нахождение суммы элементов вектора (синий) и вычисление нормы вектора (красный). ]]&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;n\times n&amp;lt;/math&amp;gt; на вектор размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
В свою очередь ресурс параллелизма операции поиска собственных значений зависит от выбранного способа и не рассматривается в данной статье.&lt;br /&gt;
&lt;br /&gt;
Таким образом, с точки зрения ресурса параллелизма, алгоритм Ланцоша обладает линейной сложностью по ширине ЯПФ и квадратичной сложностью по высоте ЯПФ. Основное время работы алгоритма будет уделено операции умножения матрицы на вектор, имеющей ширину яруса &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;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;A&amp;lt;/math&amp;gt;, следовательно на вход данный алгоритм во всяком случае получает 1 число и 1 матрицу размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;. Помимо этого для начала работы алгоритму нужен некоторый вектор &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; начального приближения размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, который тоже является входными данными.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После окончания работы алгоритма мы получаем набор собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, состоящий из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; элементов. Если помимо собственных значений выводятся еще и полученные собственные векторы, то суммарный объём всех таких векторов составляет &amp;lt;math&amp;gt;k\times n&amp;lt;/math&amp;gt; элементов. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, совокупный объём входных данных составляет: &amp;lt;math&amp;gt;n^2+n+1&amp;lt;/math&amp;gt; элемент, а на выходе получаем &amp;lt;math&amp;gt;k(n+1)&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;lt;math&amp;gt;A&amp;lt;/math&amp;gt;) начиная с максимального в абсолютном смысле значения. Это выгодно отличает данный алгоритм с точки зрения поиска собственных значений матрицы, находящихся по краям её спектра.&lt;br /&gt;
&lt;br /&gt;
Не является полностью детерминированным, т.к. может досрочно завершить работу, если будут найдены все ненулевые собственные значения.&lt;br /&gt;
&lt;br /&gt;
В случае использования метода вычисления собственных значений с линейной сложностью, соотношение последовательной и параллельной сложностей будет равно &amp;lt;math&amp;gt;(k ^ 2 + n ^ 2) / (k  + 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;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма=== &lt;br /&gt;
=== Выводы для классов архитектур=== &lt;br /&gt;
=== Существующие реализации алгоритма===&lt;br /&gt;
&lt;br /&gt;
В настоящее время алгоритм Ланцоша поиска собственных значений квадратной симметричной матрицы включён в несколько библиотек и реализован на различных языках, среди которых такие наиболее распространенные как &#039;&#039;&#039;C&#039;&#039;&#039;, &#039;&#039;&#039;C++&#039;&#039;&#039;, &#039;&#039;&#039;FORTRAN77/90&#039;&#039;&#039;, &#039;&#039;&#039;MathLab&#039;&#039;&#039;.&lt;br /&gt;
Так, например, в языке &#039;&#039;&#039;MathLab&#039;&#039;&#039; во встроенном пакете &#039;&#039;&#039;ARPACK&#039;&#039;&#039; найти собственные значения методом Ланцоша можно при помощи вызова функции &#039;&#039;eigs()&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
На языке &#039;&#039;&#039;С&#039;&#039;&#039; существует библиотека &#039;&#039;&#039;[http://www.cs.wm.edu/~andreas/software/ PRIMME]&#039;&#039;&#039;, название которой расшифровывается как PReconditioned Iterative MultiMethod Eigensolver (итерационные методы поиска собственных значений с предусловием).&lt;br /&gt;
&lt;br /&gt;
Библиотека &#039;&#039;&#039;[http://www.nag.co.uk NAG] Numerical Library&#039;&#039;&#039; также содержит обширный набор функций, позволяющих проводить математический анализ, среди которых есть и реализация алгоритма Ланцоша. Библиотека доступна в трех пакетах: NAG C Library, NAG Fortran Library и NAG Library for .NET, совместна со многими языками и с основными операционными системами (Windows, Linux and OS X, а также Solaris, AIX и HP-UX).&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] Дж. Деммель «Вычислительная линейная алгебра», с 381.&lt;br /&gt;
&lt;br /&gt;
[2] Wikipedia https://en.wikipedia.org/wiki/Lanczos_algorithm&lt;br /&gt;
&lt;br /&gt;
[3] &amp;quot;[https://static.ph.ed.ac.uk/dissertations/hpc-msc/2013-2014/Investigation%20and%20Implementation%20of%20an%20Eigensolver%20Method.pdf Investigation and Implementation of an Eigensolver Method]&amp;quot;, Jorge Moreira, The University of Edinburgh, August 2014&lt;br /&gt;
&lt;br /&gt;
[4] &amp;quot;[http://www.physics.drexel.edu/~bob/Term_Reports/Hoppe_01.pdf Lanczos Vector Procedures]&amp;quot;, Travis Hoppe&lt;/div&gt;</summary>
		<author><name>Alexbashirov</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=14894</id>
		<title>Участник:Alexbashirov/Алгоритм Ланцоша для точной арифметики</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=14894"/>
		<updated>2016-10-30T17:13:06Z</updated>

		<summary type="html">&lt;p&gt;Alexbashirov: /* Схема последовательной реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[Участник: Alexbashirov|Баширов А.Д.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name             = Алгоритм Ланцоша для точной арифметики&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;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;
Алгоритм Ланцоша является прямым алгоритмом поиска собственных значений симметричной матрицы, разработанным венгерским физиком и математиком XX столетия Корнелием Ланцошем в 1950 году. Алгоритм совмещает в себе два других алгоритма: алгоритм построения подпространства Крылова (который также был создан Ланцошем) и процедуру Рэлея-Ритца приближения собственных значений матрицы. Алгоритм является вариацией степенного метода, позволяющего найти собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-го порядка. Однако в алгоритме число итераций ограничено некоторым &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;. Несмотря на заявленную вычислительную эффективность, алгоритм не получил широкого применения в своём первоначальном виде, ввиду его неустойчивости. 20 лет спустя, в 1970 году ученые Ojalvo и Newman показали доработанный алгоритм Ланцоша, который теперь стал устойчивым а также предложили способ выбора вектора начального приближения &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt;. Полученный последователями Ланцоша алгоритм получил название &amp;quot;Алгоритм Ланцоша с полной переортогонализацией&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма===&lt;br /&gt;
Алгоритм Ланцоша работает с вещественной симметричной матрицей &amp;lt;math&amp;gt;A=A^T&amp;lt;/math&amp;gt;, таким образом в памяти достаточно хранить лишь немногим более половины элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Прежде чем переходить к описанию алгоритма, следует упомянуть следующие понятия: подпространство Крылова и процесс Рэлея-Ритца, о которых уже было сказано в исторической справке выше. &lt;br /&gt;
Подпространством Крылова называется набор векторов&amp;lt;math&amp;gt;K_n =[b,Ab,A^2b,...,A^{n-1}b]&amp;lt;/math&amp;gt;. Начав свою работу с произвольного вектора &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, степенной метод вычисляет вектора &amp;lt;math&amp;gt;Ab, A^2b,...,A^{n-1}b&amp;lt;/math&amp;gt; итерационно сохраняя полученный результат в вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Полученная последовательность векторов сходится к собственному вектору, отвечающему максимальному собственному значению &amp;lt;math&amp;gt;\lambda_{max}&amp;lt;/math&amp;gt;. Однако, использование лишь последнего полученного вектора и потеря всех предшествующих посчитанных величин не всегда является наилучшим выбором. Поэтому сохранив все вектора и объединив их в одну матрицу мы получим так называемую &#039;&#039;&#039;матрицу Крылова&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K_j = [b,Ab,A^2b,...,A^{j-1}b]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Столбцы получившейся матрицы не ортогональны, однако их можно ортогонализовать, применив процесс Грамма-Шмидта. Получившиеся вектора будут составлять базис подпространства Крылова &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt;. Можно ожидать, что вектора полученного базиса будут достаточно хорошо приближать &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; собственных векторов, отвечающих &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; наибольшим собственным значения.&lt;br /&gt;
&lt;br /&gt;
Затем с использованием полученной матрицы из ортогональных векторов &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt; мы получим трехдиагональную матрицу &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; на основе исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
Наконец, к полученной матрице &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; будет применяться &#039;&#039;&#039;процесс Рэлея-Ритца&#039;&#039;&#039;, который найдет собственные значения трехдиагональной матрицы. В последствии эти значения и будут приближениями искомых собственных значений исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма Ланцоша, то есть наиболее ресурсно-затратной частью алгоритма, является шаг на котором на каждой итерации происходит перемножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;, полученный на предыдущей итерации. Полученный в результате умножения вектор обозначается &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; z=Aq_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;Q_j=[q_1,q_2,...q_j]&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортонормированных вектров Ланцоша и последующее формирование трехдиагональной матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;. Число таких векторов и, следовательно, размер матрицы растет с каждой итерацией. Итерационный процесс завершается при &amp;lt;math&amp;gt;j=k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На долю второй части алгоритма приходится поиск собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;, полученной в первой части.&lt;br /&gt;
&lt;br /&gt;
=== Схема последовательной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ланцош_Схема реализации.png|800px]]&lt;br /&gt;
&lt;br /&gt;
На рисунке выше представлен псевдокод, отражающий последовательность действий в алгоритме метода. Перечислим основные ступени в данном методе:&lt;br /&gt;
* Прежде чем войти в цикл, происходит инициализация констант &amp;lt;math&amp;gt;\Beta_0,q_0&amp;lt;/math&amp;gt;, вычисление нормы вектора начального приближения &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и нормализация этого вектора.&lt;br /&gt;
* Затем, в цикле, происходит: &lt;br /&gt;
**поиск вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, являющегося результатом применения матричного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;; &lt;br /&gt;
**скалярное произведение двух векторов &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**вычисляется линейная комбинация векторов; &lt;br /&gt;
**вычисляется норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; &lt;br /&gt;
**проверяется условие выхода из цикла (равенство нулю нормы вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;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;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Посчитаем количество операций, необходимых для поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; собственных значений и векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; действий для умножения матрицы на вектор&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; действия для перемножения двух векторов&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  операций для поэлементного сложения или вычитания двух векторов&lt;br /&gt;
* для отыскания нормы вектора помимо &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  сложений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  умножений требуется 1 операция извлечения корня&lt;br /&gt;
* для поиска собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; требуется &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарно для одной итерации алгоритма требуется совершить  &amp;lt;math&amp;gt;O(n^2)+O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
В данном разделе приведен информационный граф одной итерации алгоритма Ланцоша. Для простоты на схеме подразумевается матрица размерности 5x5, однако это не нарушает общности данной схемы.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Информационный_граф.png|1000px|thumb|center|Круглые элементы символизируют операции с элементами векторов и матриц: сложение и умножение (черные), операции составления линейной комбинации (зеленые) и операции деления вектора на его норму. В квадратных элементах изображены операции, которые невозможно выполнить параллельно: нахождение суммы элементов вектора (синий) и вычисление нормы вектора (красный). ]]&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;n\times n&amp;lt;/math&amp;gt; на вектор размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
В свою очередь ресурс параллелизма операции поиска собственных значений зависит от выбранного способа и не рассматривается в данной статье.&lt;br /&gt;
&lt;br /&gt;
Таким образом, с точки зрения ресурса параллелизма, алгоритм Ланцоша обладает линейной сложностью по ширине ЯПФ и квадратичной сложностью по высоте ЯПФ. Основное время работы алгоритма будет уделено операции умножения матрицы на вектор, имеющей ширину яруса &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;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;A&amp;lt;/math&amp;gt;, следовательно на вход данный алгоритм во всяком случае получает 1 число и 1 матрицу размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;. Помимо этого для начала работы алгоритму нужен некоторый вектор &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; начального приближения размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, который тоже является входными данными.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После окончания работы алгоритма мы получаем набор собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, состоящий из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; элементов. Если помимо собственных значений выводятся еще и полученные собственные векторы, то суммарный объём всех таких векторов составляет &amp;lt;math&amp;gt;k\times n&amp;lt;/math&amp;gt; элементов. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, совокупный объём входных данных составляет: &amp;lt;math&amp;gt;n^2+n+1&amp;lt;/math&amp;gt; элемент, а на выходе получаем &amp;lt;math&amp;gt;k(n+1)&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;lt;math&amp;gt;A&amp;lt;/math&amp;gt;) начиная с максимального в абсолютном смысле значения. Это выгодно отличает данный алгоритм с точки зрения поиска собственных значений матрицы, находящихся по краям её спектра.&lt;br /&gt;
&lt;br /&gt;
Не является полностью детерминированным, т.к. может досрочно завершить работу, если будут найдены все ненулевые собственные значения.&lt;br /&gt;
&lt;br /&gt;
В случае использования метода вычисления собственных значений с линейной сложностью, соотношение последовательной и параллельной сложностей будет равно &amp;lt;math&amp;gt;(k ^ 2 + n ^ 2) / (k  + 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;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма=== &lt;br /&gt;
=== Выводы для классов архитектур=== &lt;br /&gt;
=== Существующие реализации алгоритма===&lt;br /&gt;
&lt;br /&gt;
В настоящее время алгоритм Ланцоша поиска собственных значений квадратной симметричной матрицы включён в несколько библиотек и реализован на различных языках, среди которых такие наиболее распространенные как &#039;&#039;&#039;C&#039;&#039;&#039;, &#039;&#039;&#039;C++&#039;&#039;&#039;, &#039;&#039;&#039;FORTRAN77/90&#039;&#039;&#039;, &#039;&#039;&#039;MathLab&#039;&#039;&#039;.&lt;br /&gt;
Так, например, в языке &#039;&#039;&#039;MathLab&#039;&#039;&#039; во встроенном пакете &#039;&#039;&#039;ARPACK&#039;&#039;&#039; найти собственные значения методом Ланцоша можно при помощи вызова функции &#039;&#039;eigs()&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
На языке &#039;&#039;&#039;С&#039;&#039;&#039; существует библиотека &#039;&#039;&#039;[http://www.cs.wm.edu/~andreas/software/ PRIMME]&#039;&#039;&#039;, название которой расшифровывается как PReconditioned Iterative MultiMethod Eigensolver (итерационные методы поиска собственных значений с предусловием).&lt;br /&gt;
&lt;br /&gt;
Библиотека &#039;&#039;&#039;[http://www.nag.co.uk NAG] Numerical Library&#039;&#039;&#039; также содержит обширный набор функций, позволяющих проводить математический анализ, среди которых есть и реализация алгоритма Ланцоша. Библиотека доступна в трех пакетах: NAG C Library, NAG Fortran Library и NAG Library for .NET, совместна со многими языками и с основными операционными системами (Windows, Linux and OS X, а также Solaris, AIX и HP-UX).&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] Дж. Деммель «Вычислительная линейная алгебра», с 381.&lt;br /&gt;
&lt;br /&gt;
[2] Wikipedia https://en.wikipedia.org/wiki/Lanczos_algorithm&lt;br /&gt;
&lt;br /&gt;
[3] &amp;quot;[https://static.ph.ed.ac.uk/dissertations/hpc-msc/2013-2014/Investigation%20and%20Implementation%20of%20an%20Eigensolver%20Method.pdf Investigation and Implementation of an Eigensolver Method]&amp;quot;, Jorge Moreira, The University of Edinburgh, August 2014&lt;br /&gt;
&lt;br /&gt;
[4] &amp;quot;[http://www.physics.drexel.edu/~bob/Term_Reports/Hoppe_01.pdf Lanczos Vector Procedures]&amp;quot;, Travis Hoppe&lt;/div&gt;</summary>
		<author><name>Alexbashirov</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=14893</id>
		<title>Участник:Alexbashirov/Алгоритм Ланцоша для точной арифметики</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=14893"/>
		<updated>2016-10-30T17:11:57Z</updated>

		<summary type="html">&lt;p&gt;Alexbashirov: /* Схема последовательной реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[Участник: Alexbashirov|Баширов А.Д.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name             = Алгоритм Ланцоша для точной арифметики&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;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;
Алгоритм Ланцоша является прямым алгоритмом поиска собственных значений симметричной матрицы, разработанным венгерским физиком и математиком XX столетия Корнелием Ланцошем в 1950 году. Алгоритм совмещает в себе два других алгоритма: алгоритм построения подпространства Крылова (который также был создан Ланцошем) и процедуру Рэлея-Ритца приближения собственных значений матрицы. Алгоритм является вариацией степенного метода, позволяющего найти собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-го порядка. Однако в алгоритме число итераций ограничено некоторым &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;. Несмотря на заявленную вычислительную эффективность, алгоритм не получил широкого применения в своём первоначальном виде, ввиду его неустойчивости. 20 лет спустя, в 1970 году ученые Ojalvo и Newman показали доработанный алгоритм Ланцоша, который теперь стал устойчивым а также предложили способ выбора вектора начального приближения &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt;. Полученный последователями Ланцоша алгоритм получил название &amp;quot;Алгоритм Ланцоша с полной переортогонализацией&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма===&lt;br /&gt;
Алгоритм Ланцоша работает с вещественной симметричной матрицей &amp;lt;math&amp;gt;A=A^T&amp;lt;/math&amp;gt;, таким образом в памяти достаточно хранить лишь немногим более половины элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Прежде чем переходить к описанию алгоритма, следует упомянуть следующие понятия: подпространство Крылова и процесс Рэлея-Ритца, о которых уже было сказано в исторической справке выше. &lt;br /&gt;
Подпространством Крылова называется набор векторов&amp;lt;math&amp;gt;K_n =[b,Ab,A^2b,...,A^{n-1}b]&amp;lt;/math&amp;gt;. Начав свою работу с произвольного вектора &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, степенной метод вычисляет вектора &amp;lt;math&amp;gt;Ab, A^2b,...,A^{n-1}b&amp;lt;/math&amp;gt; итерационно сохраняя полученный результат в вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Полученная последовательность векторов сходится к собственному вектору, отвечающему максимальному собственному значению &amp;lt;math&amp;gt;\lambda_{max}&amp;lt;/math&amp;gt;. Однако, использование лишь последнего полученного вектора и потеря всех предшествующих посчитанных величин не всегда является наилучшим выбором. Поэтому сохранив все вектора и объединив их в одну матрицу мы получим так называемую &#039;&#039;&#039;матрицу Крылова&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K_j = [b,Ab,A^2b,...,A^{j-1}b]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Столбцы получившейся матрицы не ортогональны, однако их можно ортогонализовать, применив процесс Грамма-Шмидта. Получившиеся вектора будут составлять базис подпространства Крылова &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt;. Можно ожидать, что вектора полученного базиса будут достаточно хорошо приближать &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; собственных векторов, отвечающих &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; наибольшим собственным значения.&lt;br /&gt;
&lt;br /&gt;
Затем с использованием полученной матрицы из ортогональных векторов &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt; мы получим трехдиагональную матрицу &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; на основе исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
Наконец, к полученной матрице &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; будет применяться &#039;&#039;&#039;процесс Рэлея-Ритца&#039;&#039;&#039;, который найдет собственные значения трехдиагональной матрицы. В последствии эти значения и будут приближениями искомых собственных значений исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма Ланцоша, то есть наиболее ресурсно-затратной частью алгоритма, является шаг на котором на каждой итерации происходит перемножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;, полученный на предыдущей итерации. Полученный в результате умножения вектор обозначается &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; z=Aq_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;Q_j=[q_1,q_2,...q_j]&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортонормированных вектров Ланцоша и последующее формирование трехдиагональной матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;. Число таких векторов и, следовательно, размер матрицы растет с каждой итерацией. Итерационный процесс завершается при &amp;lt;math&amp;gt;j=k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На долю второй части алгоритма приходится поиск собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;, полученной в первой части.&lt;br /&gt;
&lt;br /&gt;
=== Схема последовательной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ланцош_Схема реализации.png|800px]]&lt;br /&gt;
&lt;br /&gt;
На рисунке выше представлен псевдокод, отражающий последовательность действий в алгоритме метода. Перечислим основные ступени в данном методе:&lt;br /&gt;
* Прежде чем войти в цикл, происходит инициализация констант &amp;lt;math&amp;gt;\Beta_0,q_0&amp;lt;/math&amp;gt;, вычисление нормы вектора начального приближения &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и нормализация этого вектора.&lt;br /&gt;
* Затем, в цикле, происходит: &lt;br /&gt;
**поиск вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, являющегося результатом применения матричного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;; скалярное произведение двух векторов &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; вычисляется линейная комбинация векторов; вычисляется норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; проверяется условие выхода из цикла (равенство нулю нормы вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;); в случае если норма не нулевая, то производим нормировку вектора; затем происходит процедура поиска собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;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;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; действий для умножения матрицы на вектор&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; действия для перемножения двух векторов&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  операций для поэлементного сложения или вычитания двух векторов&lt;br /&gt;
* для отыскания нормы вектора помимо &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  сложений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  умножений требуется 1 операция извлечения корня&lt;br /&gt;
* для поиска собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; требуется &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарно для одной итерации алгоритма требуется совершить  &amp;lt;math&amp;gt;O(n^2)+O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
В данном разделе приведен информационный граф одной итерации алгоритма Ланцоша. Для простоты на схеме подразумевается матрица размерности 5x5, однако это не нарушает общности данной схемы.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Информационный_граф.png|1000px|thumb|center|Круглые элементы символизируют операции с элементами векторов и матриц: сложение и умножение (черные), операции составления линейной комбинации (зеленые) и операции деления вектора на его норму. В квадратных элементах изображены операции, которые невозможно выполнить параллельно: нахождение суммы элементов вектора (синий) и вычисление нормы вектора (красный). ]]&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;n\times n&amp;lt;/math&amp;gt; на вектор размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
В свою очередь ресурс параллелизма операции поиска собственных значений зависит от выбранного способа и не рассматривается в данной статье.&lt;br /&gt;
&lt;br /&gt;
Таким образом, с точки зрения ресурса параллелизма, алгоритм Ланцоша обладает линейной сложностью по ширине ЯПФ и квадратичной сложностью по высоте ЯПФ. Основное время работы алгоритма будет уделено операции умножения матрицы на вектор, имеющей ширину яруса &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;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;A&amp;lt;/math&amp;gt;, следовательно на вход данный алгоритм во всяком случае получает 1 число и 1 матрицу размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;. Помимо этого для начала работы алгоритму нужен некоторый вектор &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; начального приближения размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, который тоже является входными данными.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После окончания работы алгоритма мы получаем набор собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, состоящий из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; элементов. Если помимо собственных значений выводятся еще и полученные собственные векторы, то суммарный объём всех таких векторов составляет &amp;lt;math&amp;gt;k\times n&amp;lt;/math&amp;gt; элементов. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, совокупный объём входных данных составляет: &amp;lt;math&amp;gt;n^2+n+1&amp;lt;/math&amp;gt; элемент, а на выходе получаем &amp;lt;math&amp;gt;k(n+1)&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;lt;math&amp;gt;A&amp;lt;/math&amp;gt;) начиная с максимального в абсолютном смысле значения. Это выгодно отличает данный алгоритм с точки зрения поиска собственных значений матрицы, находящихся по краям её спектра.&lt;br /&gt;
&lt;br /&gt;
Не является полностью детерминированным, т.к. может досрочно завершить работу, если будут найдены все ненулевые собственные значения.&lt;br /&gt;
&lt;br /&gt;
В случае использования метода вычисления собственных значений с линейной сложностью, соотношение последовательной и параллельной сложностей будет равно &amp;lt;math&amp;gt;(k ^ 2 + n ^ 2) / (k  + 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;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма=== &lt;br /&gt;
=== Выводы для классов архитектур=== &lt;br /&gt;
=== Существующие реализации алгоритма===&lt;br /&gt;
&lt;br /&gt;
В настоящее время алгоритм Ланцоша поиска собственных значений квадратной симметричной матрицы включён в несколько библиотек и реализован на различных языках, среди которых такие наиболее распространенные как &#039;&#039;&#039;C&#039;&#039;&#039;, &#039;&#039;&#039;C++&#039;&#039;&#039;, &#039;&#039;&#039;FORTRAN77/90&#039;&#039;&#039;, &#039;&#039;&#039;MathLab&#039;&#039;&#039;.&lt;br /&gt;
Так, например, в языке &#039;&#039;&#039;MathLab&#039;&#039;&#039; во встроенном пакете &#039;&#039;&#039;ARPACK&#039;&#039;&#039; найти собственные значения методом Ланцоша можно при помощи вызова функции &#039;&#039;eigs()&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
На языке &#039;&#039;&#039;С&#039;&#039;&#039; существует библиотека &#039;&#039;&#039;[http://www.cs.wm.edu/~andreas/software/ PRIMME]&#039;&#039;&#039;, название которой расшифровывается как PReconditioned Iterative MultiMethod Eigensolver (итерационные методы поиска собственных значений с предусловием).&lt;br /&gt;
&lt;br /&gt;
Библиотека &#039;&#039;&#039;[http://www.nag.co.uk NAG] Numerical Library&#039;&#039;&#039; также содержит обширный набор функций, позволяющих проводить математический анализ, среди которых есть и реализация алгоритма Ланцоша. Библиотека доступна в трех пакетах: NAG C Library, NAG Fortran Library и NAG Library for .NET, совместна со многими языками и с основными операционными системами (Windows, Linux and OS X, а также Solaris, AIX и HP-UX).&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] Дж. Деммель «Вычислительная линейная алгебра», с 381.&lt;br /&gt;
&lt;br /&gt;
[2] Wikipedia https://en.wikipedia.org/wiki/Lanczos_algorithm&lt;br /&gt;
&lt;br /&gt;
[3] &amp;quot;[https://static.ph.ed.ac.uk/dissertations/hpc-msc/2013-2014/Investigation%20and%20Implementation%20of%20an%20Eigensolver%20Method.pdf Investigation and Implementation of an Eigensolver Method]&amp;quot;, Jorge Moreira, The University of Edinburgh, August 2014&lt;br /&gt;
&lt;br /&gt;
[4] &amp;quot;[http://www.physics.drexel.edu/~bob/Term_Reports/Hoppe_01.pdf Lanczos Vector Procedures]&amp;quot;, Travis Hoppe&lt;/div&gt;</summary>
		<author><name>Alexbashirov</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=14891</id>
		<title>Участник:Alexbashirov/Алгоритм Ланцоша для точной арифметики</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=14891"/>
		<updated>2016-10-30T17:10:15Z</updated>

		<summary type="html">&lt;p&gt;Alexbashirov: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[Участник: Alexbashirov|Баширов А.Д.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name             = Алгоритм Ланцоша для точной арифметики&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;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;
Алгоритм Ланцоша является прямым алгоритмом поиска собственных значений симметричной матрицы, разработанным венгерским физиком и математиком XX столетия Корнелием Ланцошем в 1950 году. Алгоритм совмещает в себе два других алгоритма: алгоритм построения подпространства Крылова (который также был создан Ланцошем) и процедуру Рэлея-Ритца приближения собственных значений матрицы. Алгоритм является вариацией степенного метода, позволяющего найти собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-го порядка. Однако в алгоритме число итераций ограничено некоторым &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;. Несмотря на заявленную вычислительную эффективность, алгоритм не получил широкого применения в своём первоначальном виде, ввиду его неустойчивости. 20 лет спустя, в 1970 году ученые Ojalvo и Newman показали доработанный алгоритм Ланцоша, который теперь стал устойчивым а также предложили способ выбора вектора начального приближения &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt;. Полученный последователями Ланцоша алгоритм получил название &amp;quot;Алгоритм Ланцоша с полной переортогонализацией&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма===&lt;br /&gt;
Алгоритм Ланцоша работает с вещественной симметричной матрицей &amp;lt;math&amp;gt;A=A^T&amp;lt;/math&amp;gt;, таким образом в памяти достаточно хранить лишь немногим более половины элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Прежде чем переходить к описанию алгоритма, следует упомянуть следующие понятия: подпространство Крылова и процесс Рэлея-Ритца, о которых уже было сказано в исторической справке выше. &lt;br /&gt;
Подпространством Крылова называется набор векторов&amp;lt;math&amp;gt;K_n =[b,Ab,A^2b,...,A^{n-1}b]&amp;lt;/math&amp;gt;. Начав свою работу с произвольного вектора &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, степенной метод вычисляет вектора &amp;lt;math&amp;gt;Ab, A^2b,...,A^{n-1}b&amp;lt;/math&amp;gt; итерационно сохраняя полученный результат в вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Полученная последовательность векторов сходится к собственному вектору, отвечающему максимальному собственному значению &amp;lt;math&amp;gt;\lambda_{max}&amp;lt;/math&amp;gt;. Однако, использование лишь последнего полученного вектора и потеря всех предшествующих посчитанных величин не всегда является наилучшим выбором. Поэтому сохранив все вектора и объединив их в одну матрицу мы получим так называемую &#039;&#039;&#039;матрицу Крылова&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K_j = [b,Ab,A^2b,...,A^{j-1}b]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Столбцы получившейся матрицы не ортогональны, однако их можно ортогонализовать, применив процесс Грамма-Шмидта. Получившиеся вектора будут составлять базис подпространства Крылова &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt;. Можно ожидать, что вектора полученного базиса будут достаточно хорошо приближать &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; собственных векторов, отвечающих &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; наибольшим собственным значения.&lt;br /&gt;
&lt;br /&gt;
Затем с использованием полученной матрицы из ортогональных векторов &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt; мы получим трехдиагональную матрицу &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; на основе исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
Наконец, к полученной матрице &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; будет применяться &#039;&#039;&#039;процесс Рэлея-Ритца&#039;&#039;&#039;, который найдет собственные значения трехдиагональной матрицы. В последствии эти значения и будут приближениями искомых собственных значений исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма Ланцоша, то есть наиболее ресурсно-затратной частью алгоритма, является шаг на котором на каждой итерации происходит перемножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;, полученный на предыдущей итерации. Полученный в результате умножения вектор обозначается &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; z=Aq_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;Q_j=[q_1,q_2,...q_j]&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортонормированных вектров Ланцоша и последующее формирование трехдиагональной матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;. Число таких векторов и, следовательно, размер матрицы растет с каждой итерацией. Итерационный процесс завершается при &amp;lt;math&amp;gt;j=k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На долю второй части алгоритма приходится поиск собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;, полученной в первой части.&lt;br /&gt;
&lt;br /&gt;
=== Схема последовательной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ланцош_Схема реализации.png|800px]]&lt;br /&gt;
&lt;br /&gt;
На рисунке выше представлен псевдокод, отражающий последовательность действий в алгоритме метода. Перечислим основные ступени в данном методе:&lt;br /&gt;
* Прежде чем войти в цикл, происходит инициализация констант &amp;lt;math&amp;gt;\Beta_0,q_0&amp;lt;/math&amp;gt;, вычисление нормы вектора начального приближения &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и нормализация этого вектора.&lt;br /&gt;
* Затем, в цикле, происходит: поиск вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, являющегося результатом применения матричного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;; скалярное произведение двух векторов &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; вычисляется линейная комбинация векторов; вычисляется норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; проверяется условие выхода из цикла (равенство нулю нормы вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;); в случае если норма не нулевая, то производим нормировку вектора; затем происходит процедура поиска собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;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;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; действий для умножения матрицы на вектор&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; действия для перемножения двух векторов&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  операций для поэлементного сложения или вычитания двух векторов&lt;br /&gt;
* для отыскания нормы вектора помимо &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  сложений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  умножений требуется 1 операция извлечения корня&lt;br /&gt;
* для поиска собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; требуется &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарно для одной итерации алгоритма требуется совершить  &amp;lt;math&amp;gt;O(n^2)+O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
В данном разделе приведен информационный граф одной итерации алгоритма Ланцоша. Для простоты на схеме подразумевается матрица размерности 5x5, однако это не нарушает общности данной схемы.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Информационный_граф.png|1000px|thumb|center|Круглые элементы символизируют операции с элементами векторов и матриц: сложение и умножение (черные), операции составления линейной комбинации (зеленые) и операции деления вектора на его норму. В квадратных элементах изображены операции, которые невозможно выполнить параллельно: нахождение суммы элементов вектора (синий) и вычисление нормы вектора (красный). ]]&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;n\times n&amp;lt;/math&amp;gt; на вектор размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
В свою очередь ресурс параллелизма операции поиска собственных значений зависит от выбранного способа и не рассматривается в данной статье.&lt;br /&gt;
&lt;br /&gt;
Таким образом, с точки зрения ресурса параллелизма, алгоритм Ланцоша обладает линейной сложностью по ширине ЯПФ и квадратичной сложностью по высоте ЯПФ. Основное время работы алгоритма будет уделено операции умножения матрицы на вектор, имеющей ширину яруса &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;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;A&amp;lt;/math&amp;gt;, следовательно на вход данный алгоритм во всяком случае получает 1 число и 1 матрицу размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;. Помимо этого для начала работы алгоритму нужен некоторый вектор &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; начального приближения размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, который тоже является входными данными.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После окончания работы алгоритма мы получаем набор собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, состоящий из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; элементов. Если помимо собственных значений выводятся еще и полученные собственные векторы, то суммарный объём всех таких векторов составляет &amp;lt;math&amp;gt;k\times n&amp;lt;/math&amp;gt; элементов. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, совокупный объём входных данных составляет: &amp;lt;math&amp;gt;n^2+n+1&amp;lt;/math&amp;gt; элемент, а на выходе получаем &amp;lt;math&amp;gt;k(n+1)&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;lt;math&amp;gt;A&amp;lt;/math&amp;gt;) начиная с максимального в абсолютном смысле значения. Это выгодно отличает данный алгоритм с точки зрения поиска собственных значений матрицы, находящихся по краям её спектра.&lt;br /&gt;
&lt;br /&gt;
Не является полностью детерминированным, т.к. может досрочно завершить работу, если будут найдены все ненулевые собственные значения.&lt;br /&gt;
&lt;br /&gt;
В случае использования метода вычисления собственных значений с линейной сложностью, соотношение последовательной и параллельной сложностей будет равно &amp;lt;math&amp;gt;(k ^ 2 + n ^ 2) / (k  + 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;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма=== &lt;br /&gt;
=== Выводы для классов архитектур=== &lt;br /&gt;
=== Существующие реализации алгоритма===&lt;br /&gt;
&lt;br /&gt;
В настоящее время алгоритм Ланцоша поиска собственных значений квадратной симметричной матрицы включён в несколько библиотек и реализован на различных языках, среди которых такие наиболее распространенные как &#039;&#039;&#039;C&#039;&#039;&#039;, &#039;&#039;&#039;C++&#039;&#039;&#039;, &#039;&#039;&#039;FORTRAN77/90&#039;&#039;&#039;, &#039;&#039;&#039;MathLab&#039;&#039;&#039;.&lt;br /&gt;
Так, например, в языке &#039;&#039;&#039;MathLab&#039;&#039;&#039; во встроенном пакете &#039;&#039;&#039;ARPACK&#039;&#039;&#039; найти собственные значения методом Ланцоша можно при помощи вызова функции &#039;&#039;eigs()&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
На языке &#039;&#039;&#039;С&#039;&#039;&#039; существует библиотека &#039;&#039;&#039;[http://www.cs.wm.edu/~andreas/software/ PRIMME]&#039;&#039;&#039;, название которой расшифровывается как PReconditioned Iterative MultiMethod Eigensolver (итерационные методы поиска собственных значений с предусловием).&lt;br /&gt;
&lt;br /&gt;
Библиотека &#039;&#039;&#039;[http://www.nag.co.uk NAG] Numerical Library&#039;&#039;&#039; также содержит обширный набор функций, позволяющих проводить математический анализ, среди которых есть и реализация алгоритма Ланцоша. Библиотека доступна в трех пакетах: NAG C Library, NAG Fortran Library и NAG Library for .NET, совместна со многими языками и с основными операционными системами (Windows, Linux and OS X, а также Solaris, AIX и HP-UX).&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] Дж. Деммель «Вычислительная линейная алгебра», с 381.&lt;br /&gt;
&lt;br /&gt;
[2] Wikipedia https://en.wikipedia.org/wiki/Lanczos_algorithm&lt;br /&gt;
&lt;br /&gt;
[3] &amp;quot;[https://static.ph.ed.ac.uk/dissertations/hpc-msc/2013-2014/Investigation%20and%20Implementation%20of%20an%20Eigensolver%20Method.pdf Investigation and Implementation of an Eigensolver Method]&amp;quot;, Jorge Moreira, The University of Edinburgh, August 2014&lt;br /&gt;
&lt;br /&gt;
[4] &amp;quot;[http://www.physics.drexel.edu/~bob/Term_Reports/Hoppe_01.pdf Lanczos Vector Procedures]&amp;quot;, Travis Hoppe&lt;/div&gt;</summary>
		<author><name>Alexbashirov</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=14885</id>
		<title>Участник:Alexbashirov/Алгоритм Ланцоша для точной арифметики</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=14885"/>
		<updated>2016-10-30T17:07:36Z</updated>

		<summary type="html">&lt;p&gt;Alexbashirov: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[Участник: Alexbashirov|Баширов А.Д.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name             = Алгоритм Ланцоша для точной арифметики&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;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;
Алгоритм Ланцоша является прямым алгоритмом поиска собственных значений симметричной матрицы, разработанным венгерским физиком и математиком XX столетия Корнелием Ланцошем в 1950 году. Алгоритм совмещает в себе два других алгоритма: алгоритм построения подпространства Крылова (который также был создан Ланцошем) и процедуру Рэлея-Ритца приближения собственных значений матрицы. Алгоритм является вариацией степенного метода, позволяющего найти собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-го порядка. Однако в алгоритме число итераций ограничено некоторым &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;. Несмотря на заявленную вычислительную эффективность, алгоритм не получил широкого применения в своём первоначальном виде, ввиду его неустойчивости. 20 лет спустя, в 1970 году ученые Ojalvo и Newman показали доработанный алгоритм Ланцоша, который теперь стал устойчивым а также предложили способ выбора вектора начального приближения &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt;. Полученный последователями Ланцоша алгоритм получил название &amp;quot;Алгоритм Ланцоша с полной переортогонализацией&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма===&lt;br /&gt;
Алгоритм Ланцоша работает с вещественной симметричной матрицей &amp;lt;math&amp;gt;A=A^T&amp;lt;/math&amp;gt;, таким образом в памяти достаточно хранить лишь немногим более половины элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Прежде чем переходить к описанию алгоритма, следует упомянуть следующие понятия: подпространство Крылова и процесс Рэлея-Ритца, о которых уже было сказано в исторической справке выше. &lt;br /&gt;
Подпространством Крылова называется набор векторов&amp;lt;math&amp;gt;K_n =[b,Ab,A^2b,...,A^{n-1}b]&amp;lt;/math&amp;gt;. Начав свою работу с произвольного вектора &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, степенной метод вычисляет вектора &amp;lt;math&amp;gt;Ab, A^2b,...,A^{n-1}b&amp;lt;/math&amp;gt; итерационно сохраняя полученный результат в вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Полученная последовательность векторов сходится к собственному вектору, отвечающему максимальному собственному значению &amp;lt;math&amp;gt;\lambda_{max}&amp;lt;/math&amp;gt;. Однако, использование лишь последнего полученного вектора и потеря всех предшествующих посчитанных величин не всегда является наилучшим выбором. Поэтому сохранив все вектора и объединив их в одну матрицу мы получим так называемую &#039;&#039;&#039;матрицу Крылова&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K_j = [b,Ab,A^2b,...,A^{j-1}b]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Столбцы получившейся матрицы не ортогональны, однако их можно ортогонализовать, применив процесс Грамма-Шмидта. Получившиеся вектора будут составлять базис подпространства Крылова &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt;. Можно ожидать, что вектора полученного базиса будут достаточно хорошо приближать &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; собственных векторов, отвечающих &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; наибольшим собственным значения.&lt;br /&gt;
&lt;br /&gt;
Затем с использованием полученной матрицы из ортогональных векторов &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt; мы получим трехдиагональную матрицу &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; на основе исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
Наконец, к полученной матрице &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; будет применяться &#039;&#039;&#039;процесс Рэлея-Ритца&#039;&#039;&#039;, который найдет собственные значения трехдиагональной матрицы. В последствии эти значения и будут приближениями искомых собственных значений исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма Ланцоша, то есть наиболее ресурсно-затратной частью алгоритма, является шаг на котором на каждой итерации происходит перемножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;, полученный на предыдущей итерации. Полученный в результате умножения вектор обозначается &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; z=Aq_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;Q_j=[q_1,q_2,...q_j]&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортонормированных вектров Ланцоша и последующее формирование трехдиагональной матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;. Число таких векторов и, следовательно, размер матрицы растет с каждой итерацией. Итерационный процесс завершается при &amp;lt;math&amp;gt;j=k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На долю второй части алгоритма приходится поиск собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;, полученной в первой части.&lt;br /&gt;
&lt;br /&gt;
=== Схема последовательной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ланцош_Схема реализации.png|800px]]&lt;br /&gt;
&lt;br /&gt;
На рисунке выше представлен псевдокод, отражающий последовательность действий в алгоритме метода. Перечислим основные ступени в данном методе:&lt;br /&gt;
* Прежде чем войти в цикл, происходит инициализация констант &amp;lt;math&amp;gt;\Beta_0,q_0&amp;lt;/math&amp;gt;, вычисление нормы вектора начального приближения &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и нормализация этого вектора.&lt;br /&gt;
* Затем, в цикле, происходит: поиск вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, являющегося результатом применения матричного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;; скалярное произведение двух векторов &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; вычисляется линейная комбинация векторов; вычисляется норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; проверяется условие выхода из цикла (равенство нулю нормы вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;); в случае если норма не нулевая, то производим нормировку вектора; затем происходит процедура поиска собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;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;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; действий для умножения матрицы на вектор&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; действия для перемножения двух векторов&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  операций для поэлементного сложения или вычитания двух векторов&lt;br /&gt;
* для отыскания нормы вектора помимо &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  сложений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  умножений требуется 1 операция извлечения корня&lt;br /&gt;
* для поиска собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; требуется &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарно для одной итерации алгоритма требуется совершить  &amp;lt;math&amp;gt;O(n^2)+O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
В данном разделе приведен информационный граф одной итерации алгоритма Ланцоша. Для простоты на схеме подразумевается матрица размерности 5x5, однако это не нарушает общности данной схемы.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Информационный_граф.png|1000px|thumb|center|Круглые элементы символизируют операции с элементами векторов и матриц: сложение и умножение (черные), операции составления линейной комбинации (зеленые) и операции деления]]&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;n\times n&amp;lt;/math&amp;gt; на вектор размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
В свою очередь ресурс параллелизма операции поиска собственных значений зависит от выбранного способа и не рассматривается в данной статье.&lt;br /&gt;
&lt;br /&gt;
Таким образом, с точки зрения ресурса параллелизма, алгоритм Ланцоша обладает линейной сложностью по ширине ЯПФ и квадратичной сложностью по высоте ЯПФ. Основное время работы алгоритма будет уделено операции умножения матрицы на вектор, имеющей ширину яруса &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;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;A&amp;lt;/math&amp;gt;, следовательно на вход данный алгоритм во всяком случае получает 1 число и 1 матрицу размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;. Помимо этого для начала работы алгоритму нужен некоторый вектор &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; начального приближения размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, который тоже является входными данными.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После окончания работы алгоритма мы получаем набор собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, состоящий из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; элементов. Если помимо собственных значений выводятся еще и полученные собственные векторы, то суммарный объём всех таких векторов составляет &amp;lt;math&amp;gt;k\times n&amp;lt;/math&amp;gt; элементов. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, совокупный объём входных данных составляет: &amp;lt;math&amp;gt;n^2+n+1&amp;lt;/math&amp;gt; элемент, а на выходе получаем &amp;lt;math&amp;gt;k(n+1)&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;lt;math&amp;gt;A&amp;lt;/math&amp;gt;) начиная с максимального в абсолютном смысле значения. Это выгодно отличает данный алгоритм с точки зрения поиска собственных значений матрицы, находящихся по краям её спектра.&lt;br /&gt;
&lt;br /&gt;
Не является полностью детерминированным, т.к. может досрочно завершить работу, если будут найдены все ненулевые собственные значения.&lt;br /&gt;
&lt;br /&gt;
В случае использования метода вычисления собственных значений с линейной сложностью, соотношение последовательной и параллельной сложностей будет равно &amp;lt;math&amp;gt;(k ^ 2 + n ^ 2) / (k  + 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;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма=== &lt;br /&gt;
=== Выводы для классов архитектур=== &lt;br /&gt;
=== Существующие реализации алгоритма===&lt;br /&gt;
&lt;br /&gt;
В настоящее время алгоритм Ланцоша поиска собственных значений квадратной симметричной матрицы включён в несколько библиотек и реализован на различных языках, среди которых такие наиболее распространенные как &#039;&#039;&#039;C&#039;&#039;&#039;, &#039;&#039;&#039;C++&#039;&#039;&#039;, &#039;&#039;&#039;FORTRAN77/90&#039;&#039;&#039;, &#039;&#039;&#039;MathLab&#039;&#039;&#039;.&lt;br /&gt;
Так, например, в языке &#039;&#039;&#039;MathLab&#039;&#039;&#039; во встроенном пакете &#039;&#039;&#039;ARPACK&#039;&#039;&#039; найти собственные значения методом Ланцоша можно при помощи вызова функции &#039;&#039;eigs()&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
На языке &#039;&#039;&#039;С&#039;&#039;&#039; существует библиотека &#039;&#039;&#039;[http://www.cs.wm.edu/~andreas/software/ PRIMME]&#039;&#039;&#039;, название которой расшифровывается как PReconditioned Iterative MultiMethod Eigensolver (итерационные методы поиска собственных значений с предусловием).&lt;br /&gt;
&lt;br /&gt;
Библиотека &#039;&#039;&#039;[http://www.nag.co.uk NAG] Numerical Library&#039;&#039;&#039; также содержит обширный набор функций, позволяющих проводить математический анализ, среди которых есть и реализация алгоритма Ланцоша. Библиотека доступна в трех пакетах: NAG C Library, NAG Fortran Library и NAG Library for .NET, совместна со многими языками и с основными операционными системами (Windows, Linux and OS X, а также Solaris, AIX и HP-UX).&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] Дж. Деммель «Вычислительная линейная алгебра», с 381.&lt;br /&gt;
&lt;br /&gt;
[2] Wikipedia https://en.wikipedia.org/wiki/Lanczos_algorithm&lt;br /&gt;
&lt;br /&gt;
[3] &amp;quot;[https://static.ph.ed.ac.uk/dissertations/hpc-msc/2013-2014/Investigation%20and%20Implementation%20of%20an%20Eigensolver%20Method.pdf Investigation and Implementation of an Eigensolver Method]&amp;quot;, Jorge Moreira, The University of Edinburgh, August 2014&lt;br /&gt;
&lt;br /&gt;
[4] &amp;quot;[http://www.physics.drexel.edu/~bob/Term_Reports/Hoppe_01.pdf Lanczos Vector Procedures]&amp;quot;, Travis Hoppe&lt;/div&gt;</summary>
		<author><name>Alexbashirov</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=14884</id>
		<title>Участник:Alexbashirov/Алгоритм Ланцоша для точной арифметики</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=14884"/>
		<updated>2016-10-30T17:07:13Z</updated>

		<summary type="html">&lt;p&gt;Alexbashirov: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[Участник: Alexbashirov|Баширов А.Д.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name             = Алгоритм Ланцоша для точной арифметики&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;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;
Алгоритм Ланцоша является прямым алгоритмом поиска собственных значений симметричной матрицы, разработанным венгерским физиком и математиком XX столетия Корнелием Ланцошем в 1950 году. Алгоритм совмещает в себе два других алгоритма: алгоритм построения подпространства Крылова (который также был создан Ланцошем) и процедуру Рэлея-Ритца приближения собственных значений матрицы. Алгоритм является вариацией степенного метода, позволяющего найти собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-го порядка. Однако в алгоритме число итераций ограничено некоторым &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;. Несмотря на заявленную вычислительную эффективность, алгоритм не получил широкого применения в своём первоначальном виде, ввиду его неустойчивости. 20 лет спустя, в 1970 году ученые Ojalvo и Newman показали доработанный алгоритм Ланцоша, который теперь стал устойчивым а также предложили способ выбора вектора начального приближения &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt;. Полученный последователями Ланцоша алгоритм получил название &amp;quot;Алгоритм Ланцоша с полной переортогонализацией&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма===&lt;br /&gt;
Алгоритм Ланцоша работает с вещественной симметричной матрицей &amp;lt;math&amp;gt;A=A^T&amp;lt;/math&amp;gt;, таким образом в памяти достаточно хранить лишь немногим более половины элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Прежде чем переходить к описанию алгоритма, следует упомянуть следующие понятия: подпространство Крылова и процесс Рэлея-Ритца, о которых уже было сказано в исторической справке выше. &lt;br /&gt;
Подпространством Крылова называется набор векторов&amp;lt;math&amp;gt;K_n =[b,Ab,A^2b,...,A^{n-1}b]&amp;lt;/math&amp;gt;. Начав свою работу с произвольного вектора &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, степенной метод вычисляет вектора &amp;lt;math&amp;gt;Ab, A^2b,...,A^{n-1}b&amp;lt;/math&amp;gt; итерационно сохраняя полученный результат в вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Полученная последовательность векторов сходится к собственному вектору, отвечающему максимальному собственному значению &amp;lt;math&amp;gt;\lambda_{max}&amp;lt;/math&amp;gt;. Однако, использование лишь последнего полученного вектора и потеря всех предшествующих посчитанных величин не всегда является наилучшим выбором. Поэтому сохранив все вектора и объединив их в одну матрицу мы получим так называемую &#039;&#039;&#039;матрицу Крылова&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K_j = [b,Ab,A^2b,...,A^{j-1}b]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Столбцы получившейся матрицы не ортогональны, однако их можно ортогонализовать, применив процесс Грамма-Шмидта. Получившиеся вектора будут составлять базис подпространства Крылова &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt;. Можно ожидать, что вектора полученного базиса будут достаточно хорошо приближать &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; собственных векторов, отвечающих &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; наибольшим собственным значения.&lt;br /&gt;
&lt;br /&gt;
Затем с использованием полученной матрицы из ортогональных векторов &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt; мы получим трехдиагональную матрицу &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; на основе исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
Наконец, к полученной матрице &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; будет применяться &#039;&#039;&#039;процесс Рэлея-Ритца&#039;&#039;&#039;, который найдет собственные значения трехдиагональной матрицы. В последствии эти значения и будут приближениями искомых собственных значений исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма Ланцоша, то есть наиболее ресурсно-затратной частью алгоритма, является шаг на котором на каждой итерации происходит перемножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;, полученный на предыдущей итерации. Полученный в результате умножения вектор обозначается &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; z=Aq_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;Q_j=[q_1,q_2,...q_j]&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортонормированных вектров Ланцоша и последующее формирование трехдиагональной матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;. Число таких векторов и, следовательно, размер матрицы растет с каждой итерацией. Итерационный процесс завершается при &amp;lt;math&amp;gt;j=k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На долю второй части алгоритма приходится поиск собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;, полученной в первой части.&lt;br /&gt;
&lt;br /&gt;
=== Схема последовательной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ланцош_Схема реализации.png|800px]]&lt;br /&gt;
&lt;br /&gt;
На рисунке выше представлен псевдокод, отражающий последовательность действий в алгоритме метода. Перечислим основные ступени в данном методе:&lt;br /&gt;
* Прежде чем войти в цикл, происходит инициализация констант &amp;lt;math&amp;gt;\Beta_0,q_0&amp;lt;/math&amp;gt;, вычисление нормы вектора начального приближения &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и нормализация этого вектора.&lt;br /&gt;
* Затем, в цикле, происходит: поиск вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, являющегося результатом применения матричного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;; скалярное произведение двух векторов &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; вычисляется линейная комбинация векторов; вычисляется норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; проверяется условие выхода из цикла (равенство нулю нормы вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;); в случае если норма не нулевая, то производим нормировку вектора; затем происходит процедура поиска собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;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;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; действий для умножения матрицы на вектор&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; действия для перемножения двух векторов&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  операций для поэлементного сложения или вычитания двух векторов&lt;br /&gt;
* для отыскания нормы вектора помимо &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  сложений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  умножений требуется 1 операция извлечения корня&lt;br /&gt;
* для поиска собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; требуется &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарно для одной итерации алгоритма требуется совершить  &amp;lt;math&amp;gt;O(n^2)+O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
В данном разделе приведен информационный граф одной итерации алгоритма Ланцоша. Для простоты на схеме подразумевается матрица размерности 5x5, однако это не нарушает общности данной схемы.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Информационный_граф.png|1000px|Круглые элементы символизируют операции с элементами векторов и матриц: сложение и умножение (черные), операции составления линейной комбинации (зеленые) и операции деления]]&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;n\times n&amp;lt;/math&amp;gt; на вектор размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
В свою очередь ресурс параллелизма операции поиска собственных значений зависит от выбранного способа и не рассматривается в данной статье.&lt;br /&gt;
&lt;br /&gt;
Таким образом, с точки зрения ресурса параллелизма, алгоритм Ланцоша обладает линейной сложностью по ширине ЯПФ и квадратичной сложностью по высоте ЯПФ. Основное время работы алгоритма будет уделено операции умножения матрицы на вектор, имеющей ширину яруса &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;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;A&amp;lt;/math&amp;gt;, следовательно на вход данный алгоритм во всяком случае получает 1 число и 1 матрицу размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;. Помимо этого для начала работы алгоритму нужен некоторый вектор &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; начального приближения размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, который тоже является входными данными.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После окончания работы алгоритма мы получаем набор собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, состоящий из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; элементов. Если помимо собственных значений выводятся еще и полученные собственные векторы, то суммарный объём всех таких векторов составляет &amp;lt;math&amp;gt;k\times n&amp;lt;/math&amp;gt; элементов. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, совокупный объём входных данных составляет: &amp;lt;math&amp;gt;n^2+n+1&amp;lt;/math&amp;gt; элемент, а на выходе получаем &amp;lt;math&amp;gt;k(n+1)&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;lt;math&amp;gt;A&amp;lt;/math&amp;gt;) начиная с максимального в абсолютном смысле значения. Это выгодно отличает данный алгоритм с точки зрения поиска собственных значений матрицы, находящихся по краям её спектра.&lt;br /&gt;
&lt;br /&gt;
Не является полностью детерминированным, т.к. может досрочно завершить работу, если будут найдены все ненулевые собственные значения.&lt;br /&gt;
&lt;br /&gt;
В случае использования метода вычисления собственных значений с линейной сложностью, соотношение последовательной и параллельной сложностей будет равно &amp;lt;math&amp;gt;(k ^ 2 + n ^ 2) / (k  + 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;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма=== &lt;br /&gt;
=== Выводы для классов архитектур=== &lt;br /&gt;
=== Существующие реализации алгоритма===&lt;br /&gt;
&lt;br /&gt;
В настоящее время алгоритм Ланцоша поиска собственных значений квадратной симметричной матрицы включён в несколько библиотек и реализован на различных языках, среди которых такие наиболее распространенные как &#039;&#039;&#039;C&#039;&#039;&#039;, &#039;&#039;&#039;C++&#039;&#039;&#039;, &#039;&#039;&#039;FORTRAN77/90&#039;&#039;&#039;, &#039;&#039;&#039;MathLab&#039;&#039;&#039;.&lt;br /&gt;
Так, например, в языке &#039;&#039;&#039;MathLab&#039;&#039;&#039; во встроенном пакете &#039;&#039;&#039;ARPACK&#039;&#039;&#039; найти собственные значения методом Ланцоша можно при помощи вызова функции &#039;&#039;eigs()&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
На языке &#039;&#039;&#039;С&#039;&#039;&#039; существует библиотека &#039;&#039;&#039;[http://www.cs.wm.edu/~andreas/software/ PRIMME]&#039;&#039;&#039;, название которой расшифровывается как PReconditioned Iterative MultiMethod Eigensolver (итерационные методы поиска собственных значений с предусловием).&lt;br /&gt;
&lt;br /&gt;
Библиотека &#039;&#039;&#039;[http://www.nag.co.uk NAG] Numerical Library&#039;&#039;&#039; также содержит обширный набор функций, позволяющих проводить математический анализ, среди которых есть и реализация алгоритма Ланцоша. Библиотека доступна в трех пакетах: NAG C Library, NAG Fortran Library и NAG Library for .NET, совместна со многими языками и с основными операционными системами (Windows, Linux and OS X, а также Solaris, AIX и HP-UX).&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] Дж. Деммель «Вычислительная линейная алгебра», с 381.&lt;br /&gt;
&lt;br /&gt;
[2] Wikipedia https://en.wikipedia.org/wiki/Lanczos_algorithm&lt;br /&gt;
&lt;br /&gt;
[3] &amp;quot;[https://static.ph.ed.ac.uk/dissertations/hpc-msc/2013-2014/Investigation%20and%20Implementation%20of%20an%20Eigensolver%20Method.pdf Investigation and Implementation of an Eigensolver Method]&amp;quot;, Jorge Moreira, The University of Edinburgh, August 2014&lt;br /&gt;
&lt;br /&gt;
[4] &amp;quot;[http://www.physics.drexel.edu/~bob/Term_Reports/Hoppe_01.pdf Lanczos Vector Procedures]&amp;quot;, Travis Hoppe&lt;/div&gt;</summary>
		<author><name>Alexbashirov</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=14880</id>
		<title>Участник:Alexbashirov/Алгоритм Ланцоша для точной арифметики</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=14880"/>
		<updated>2016-10-30T17:04:38Z</updated>

		<summary type="html">&lt;p&gt;Alexbashirov: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[Участник: Alexbashirov|Баширов А.Д.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name             = Алгоритм Ланцоша для точной арифметики&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;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;
Алгоритм Ланцоша является прямым алгоритмом поиска собственных значений симметричной матрицы, разработанным венгерским физиком и математиком XX столетия Корнелием Ланцошем в 1950 году. Алгоритм совмещает в себе два других алгоритма: алгоритм построения подпространства Крылова (который также был создан Ланцошем) и процедуру Рэлея-Ритца приближения собственных значений матрицы. Алгоритм является вариацией степенного метода, позволяющего найти собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-го порядка. Однако в алгоритме число итераций ограничено некоторым &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;. Несмотря на заявленную вычислительную эффективность, алгоритм не получил широкого применения в своём первоначальном виде, ввиду его неустойчивости. 20 лет спустя, в 1970 году ученые Ojalvo и Newman показали доработанный алгоритм Ланцоша, который теперь стал устойчивым а также предложили способ выбора вектора начального приближения &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt;. Полученный последователями Ланцоша алгоритм получил название &amp;quot;Алгоритм Ланцоша с полной переортогонализацией&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма===&lt;br /&gt;
Алгоритм Ланцоша работает с вещественной симметричной матрицей &amp;lt;math&amp;gt;A=A^T&amp;lt;/math&amp;gt;, таким образом в памяти достаточно хранить лишь немногим более половины элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Прежде чем переходить к описанию алгоритма, следует упомянуть следующие понятия: подпространство Крылова и процесс Рэлея-Ритца, о которых уже было сказано в исторической справке выше. &lt;br /&gt;
Подпространством Крылова называется набор векторов&amp;lt;math&amp;gt;K_n =[b,Ab,A^2b,...,A^{n-1}b]&amp;lt;/math&amp;gt;. Начав свою работу с произвольного вектора &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, степенной метод вычисляет вектора &amp;lt;math&amp;gt;Ab, A^2b,...,A^{n-1}b&amp;lt;/math&amp;gt; итерационно сохраняя полученный результат в вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Полученная последовательность векторов сходится к собственному вектору, отвечающему максимальному собственному значению &amp;lt;math&amp;gt;\lambda_{max}&amp;lt;/math&amp;gt;. Однако, использование лишь последнего полученного вектора и потеря всех предшествующих посчитанных величин не всегда является наилучшим выбором. Поэтому сохранив все вектора и объединив их в одну матрицу мы получим так называемую &#039;&#039;&#039;матрицу Крылова&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K_j = [b,Ab,A^2b,...,A^{j-1}b]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Столбцы получившейся матрицы не ортогональны, однако их можно ортогонализовать, применив процесс Грамма-Шмидта. Получившиеся вектора будут составлять базис подпространства Крылова &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt;. Можно ожидать, что вектора полученного базиса будут достаточно хорошо приближать &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; собственных векторов, отвечающих &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; наибольшим собственным значения.&lt;br /&gt;
&lt;br /&gt;
Затем с использованием полученной матрицы из ортогональных векторов &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt; мы получим трехдиагональную матрицу &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; на основе исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
Наконец, к полученной матрице &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; будет применяться &#039;&#039;&#039;процесс Рэлея-Ритца&#039;&#039;&#039;, который найдет собственные значения трехдиагональной матрицы. В последствии эти значения и будут приближениями искомых собственных значений исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма Ланцоша, то есть наиболее ресурсно-затратной частью алгоритма, является шаг на котором на каждой итерации происходит перемножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;, полученный на предыдущей итерации. Полученный в результате умножения вектор обозначается &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; z=Aq_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;Q_j=[q_1,q_2,...q_j]&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортонормированных вектров Ланцоша и последующее формирование трехдиагональной матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;. Число таких векторов и, следовательно, размер матрицы растет с каждой итерацией. Итерационный процесс завершается при &amp;lt;math&amp;gt;j=k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На долю второй части алгоритма приходится поиск собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;, полученной в первой части.&lt;br /&gt;
&lt;br /&gt;
=== Схема последовательной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ланцош_Схема реализации.png|800px]]&lt;br /&gt;
&lt;br /&gt;
На рисунке выше представлен псевдокод, отражающий последовательность действий в алгоритме метода. Перечислим основные ступени в данном методе:&lt;br /&gt;
* Прежде чем войти в цикл, происходит инициализация констант &amp;lt;math&amp;gt;\Beta_0,q_0&amp;lt;/math&amp;gt;, вычисление нормы вектора начального приближения &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и нормализация этого вектора.&lt;br /&gt;
* Затем, в цикле, происходит: поиск вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, являющегося результатом применения матричного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;; скалярное произведение двух векторов &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; вычисляется линейная комбинация векторов; вычисляется норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; проверяется условие выхода из цикла (равенство нулю нормы вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;); в случае если норма не нулевая, то производим нормировку вектора; затем происходит процедура поиска собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;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;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; действий для умножения матрицы на вектор&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; действия для перемножения двух векторов&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  операций для поэлементного сложения или вычитания двух векторов&lt;br /&gt;
* для отыскания нормы вектора помимо &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  сложений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  умножений требуется 1 операция извлечения корня&lt;br /&gt;
* для поиска собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; требуется &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарно для одной итерации алгоритма требуется совершить  &amp;lt;math&amp;gt;O(n^2)+O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
В данном разделе приведен информационный граф одной итерации алгоритма Ланцоша. Для простоты на схеме подразумевается матрица размерности 5x5, однако это не нарушает общности данной схемы.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Информационный_граф.png|1000px]]&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;n\times n&amp;lt;/math&amp;gt; на вектор размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
В свою очередь ресурс параллелизма операции поиска собственных значений зависит от выбранного способа и не рассматривается в данной статье.&lt;br /&gt;
&lt;br /&gt;
Таким образом, с точки зрения ресурса параллелизма, алгоритм Ланцоша обладает линейной сложностью по ширине ЯПФ и квадратичной сложностью по высоте ЯПФ. Основное время работы алгоритма будет уделено операции умножения матрицы на вектор, имеющей ширину яруса &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;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;A&amp;lt;/math&amp;gt;, следовательно на вход данный алгоритм во всяком случае получает 1 число и 1 матрицу размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;. Помимо этого для начала работы алгоритму нужен некоторый вектор &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; начального приближения размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, который тоже является входными данными.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После окончания работы алгоритма мы получаем набор собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, состоящий из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; элементов. Если помимо собственных значений выводятся еще и полученные собственные векторы, то суммарный объём всех таких векторов составляет &amp;lt;math&amp;gt;k\times n&amp;lt;/math&amp;gt; элементов. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, совокупный объём входных данных составляет: &amp;lt;math&amp;gt;n^2+n+1&amp;lt;/math&amp;gt; элемент, а на выходе получаем &amp;lt;math&amp;gt;k(n+1)&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;lt;math&amp;gt;A&amp;lt;/math&amp;gt;) начиная с максимального в абсолютном смысле значения. Это выгодно отличает данный алгоритм с точки зрения поиска собственных значений матрицы, находящихся по краям её спектра.&lt;br /&gt;
&lt;br /&gt;
Не является полностью детерминированным, т.к. может досрочно завершить работу, если будут найдены все ненулевые собственные значения.&lt;br /&gt;
&lt;br /&gt;
В случае использования метода вычисления собственных значений с линейной сложностью, соотношение последовательной и параллельной сложностей будет равно &amp;lt;math&amp;gt;(k ^ 2 + n ^ 2) / (k  + 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;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма=== &lt;br /&gt;
=== Выводы для классов архитектур=== &lt;br /&gt;
=== Существующие реализации алгоритма===&lt;br /&gt;
&lt;br /&gt;
В настоящее время алгоритм Ланцоша поиска собственных значений квадратной симметричной матрицы включён в несколько библиотек и реализован на различных языках, среди которых такие наиболее распространенные как &#039;&#039;&#039;C&#039;&#039;&#039;, &#039;&#039;&#039;C++&#039;&#039;&#039;, &#039;&#039;&#039;FORTRAN77/90&#039;&#039;&#039;, &#039;&#039;&#039;MathLab&#039;&#039;&#039;.&lt;br /&gt;
Так, например, в языке &#039;&#039;&#039;MathLab&#039;&#039;&#039; во встроенном пакете &#039;&#039;&#039;ARPACK&#039;&#039;&#039; найти собственные значения методом Ланцоша можно при помощи вызова функции &#039;&#039;eigs()&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
На языке &#039;&#039;&#039;С&#039;&#039;&#039; существует библиотека &#039;&#039;&#039;[http://www.cs.wm.edu/~andreas/software/ PRIMME]&#039;&#039;&#039;, название которой расшифровывается как PReconditioned Iterative MultiMethod Eigensolver (итерационные методы поиска собственных значений с предусловием).&lt;br /&gt;
&lt;br /&gt;
Библиотека &#039;&#039;&#039;[http://www.nag.co.uk NAG] Numerical Library&#039;&#039;&#039; также содержит обширный набор функций, позволяющих проводить математический анализ, среди которых есть и реализация алгоритма Ланцоша. Библиотека доступна в трех пакетах: NAG C Library, NAG Fortran Library и NAG Library for .NET, совместна со многими языками и с основными операционными системами (Windows, Linux and OS X, а также Solaris, AIX и HP-UX).&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] Дж. Деммель «Вычислительная линейная алгебра», с 381.&lt;br /&gt;
&lt;br /&gt;
[2] Wikipedia https://en.wikipedia.org/wiki/Lanczos_algorithm&lt;br /&gt;
&lt;br /&gt;
[3] &amp;quot;[https://static.ph.ed.ac.uk/dissertations/hpc-msc/2013-2014/Investigation%20and%20Implementation%20of%20an%20Eigensolver%20Method.pdf Investigation and Implementation of an Eigensolver Method]&amp;quot;, Jorge Moreira, The University of Edinburgh, August 2014&lt;br /&gt;
&lt;br /&gt;
[4] &amp;quot;[http://www.physics.drexel.edu/~bob/Term_Reports/Hoppe_01.pdf Lanczos Vector Procedures]&amp;quot;, Travis Hoppe&lt;/div&gt;</summary>
		<author><name>Alexbashirov</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=14865</id>
		<title>Участник:Alexbashirov/Алгоритм Ланцоша для точной арифметики</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=14865"/>
		<updated>2016-10-30T16:48:55Z</updated>

		<summary type="html">&lt;p&gt;Alexbashirov: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[Участник: Alexbashirov|Баширов А.Д.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name             = Алгоритм Ланцоша для точной арифметики&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;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;
Алгоритм Ланцоша является прямым алгоритмом поиска собственных значений симметричной матрицы, разработанным венгерским физиком и математиком XX столетия Корнелием Ланцошем в 1950 году. Алгоритм совмещает в себе два других алгоритма: алгоритм построения подпространства Крылова (который также был создан Ланцошем) и процедуру Рэлея-Ритца приближения собственных значений матрицы. Алгоритм является вариацией степенного метода, позволяющего найти собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-го порядка. Однако в алгоритме число итераций ограничено некоторым &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;. Несмотря на заявленную вычислительную эффективность, алгоритм не получил широкого применения в своём первоначальном виде, ввиду его неустойчивости. 20 лет спустя, в 1970 году ученые Ojalvo и Newman показали доработанный алгоритм Ланцоша, который теперь стал устойчивым а также предложили способ выбора вектора начального приближения &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt;. Полученный последователями Ланцоша алгоритм получил название &amp;quot;Алгоритм Ланцоша с полной переортогонализацией&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма===&lt;br /&gt;
Алгоритм Ланцоша работает с вещественной симметричной матрицей &amp;lt;math&amp;gt;A=A^T&amp;lt;/math&amp;gt;, таким образом в памяти достаточно хранить лишь немногим более половины элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Прежде чем переходить к описанию алгоритма, следует упомянуть следующие понятия: подпространство Крылова и процесс Рэлея-Ритца, о которых уже было сказано в исторической справке выше. &lt;br /&gt;
Подпространством Крылова называется набор векторов&amp;lt;math&amp;gt;K_n =[b,Ab,A^2b,...,A^{n-1}b]&amp;lt;/math&amp;gt;. Начав свою работу с произвольного вектора &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, степенной метод вычисляет вектора &amp;lt;math&amp;gt;Ab, A^2b,...,A^{n-1}b&amp;lt;/math&amp;gt; итерационно сохраняя полученный результат в вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Полученная последовательность векторов сходится к собственному вектору, отвечающему максимальному собственному значению &amp;lt;math&amp;gt;\lambda_{max}&amp;lt;/math&amp;gt;. Однако, использование лишь последнего полученного вектора и потеря всех предшествующих посчитанных величин не всегда является наилучшим выбором. Поэтому сохранив все вектора и объединив их в одну матрицу мы получим так называемую &#039;&#039;&#039;матрицу Крылова&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K_j = [b,Ab,A^2b,...,A^{j-1}b]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Столбцы получившейся матрицы не ортогональны, однако их можно ортогонализовать, применив процесс Грамма-Шмидта. Получившиеся вектора будут составлять базис подпространства Крылова &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt;. Можно ожидать, что вектора полученного базиса будут достаточно хорошо приближать &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; собственных векторов, отвечающих &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; наибольшим собственным значения.&lt;br /&gt;
&lt;br /&gt;
Затем с использованием полученной матрицы из ортогональных векторов &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt; мы получим трехдиагональную матрицу &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; на основе исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
Наконец, к полученной матрице &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; будет применяться &#039;&#039;&#039;процесс Рэлея-Ритца&#039;&#039;&#039;, который найдет собственные значения трехдиагональной матрицы. В последствии эти значения и будут приближениями искомых собственных значений исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма Ланцоша, то есть наиболее ресурсно-затратной частью алгоритма, является шаг на котором на каждой итерации происходит перемножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;, полученный на предыдущей итерации. Полученный в результате умножения вектор обозначается &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; z=Aq_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;Q_j=[q_1,q_2,...q_j]&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортонормированных вектров Ланцоша и последующее формирование трехдиагональной матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;. Число таких векторов и, следовательно, размер матрицы растет с каждой итерацией. Итерационный процесс завершается при &amp;lt;math&amp;gt;j=k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На долю второй части алгоритма приходится поиск собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;, полученной в первой части.&lt;br /&gt;
&lt;br /&gt;
=== Схема последовательной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ланцош_Схема реализации.png|800px]]&lt;br /&gt;
&lt;br /&gt;
На рисунке выше представлен псевдокод, отражающий последовательность действий в алгоритме метода. Перечислим основные ступени в данном методе:&lt;br /&gt;
* Прежде чем войти в цикл, происходит инициализация констант &amp;lt;math&amp;gt;\Beta_0,q_0&amp;lt;/math&amp;gt;, вычисление нормы вектора начального приближения &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и нормализация этого вектора.&lt;br /&gt;
* Затем, в цикле, происходит: поиск вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, являющегося результатом применения матричного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;; скалярное произведение двух векторов &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; вычисляется линейная комбинация векторов; вычисляется норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; проверяется условие выхода из цикла (равенство нулю нормы вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;); в случае если норма не нулевая, то производим нормировку вектора; затем происходит процедура поиска собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;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;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; действий для умножения матрицы на вектор&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; действия для перемножения двух векторов&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  операций для поэлементного сложения или вычитания двух векторов&lt;br /&gt;
* для отыскания нормы вектора помимо &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  сложений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  умножений требуется 1 операция извлечения корня&lt;br /&gt;
* для поиска собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; требуется &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарно для одной итерации алгоритма требуется совершить  &amp;lt;math&amp;gt;O(n^2)+O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Информационный_граф.png|1000px]]&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;n\times n&amp;lt;/math&amp;gt; на вектор размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
В свою очередь ресурс параллелизма операции поиска собственных значений зависит от выбранного способа и не рассматривается в данной статье.&lt;br /&gt;
&lt;br /&gt;
Таким образом, с точки зрения ресурса параллелизма, алгоритм Ланцоша обладает линейной сложностью по ширине ЯПФ и квадратичной сложностью по высоте ЯПФ. Основное время работы алгоритма будет уделено операции умножения матрицы на вектор, имеющей ширину яруса &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;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;A&amp;lt;/math&amp;gt;, следовательно на вход данный алгоритм во всяком случае получает 1 число и 1 матрицу размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;. Помимо этого для начала работы алгоритму нужен некоторый вектор &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; начального приближения размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, который тоже является входными данными.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После окончания работы алгоритма мы получаем набор собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, состоящий из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; элементов. Если помимо собственных значений выводятся еще и полученные собственные векторы, то суммарный объём всех таких векторов составляет &amp;lt;math&amp;gt;k\times n&amp;lt;/math&amp;gt; элементов. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, совокупный объём входных данных составляет: &amp;lt;math&amp;gt;n^2+n+1&amp;lt;/math&amp;gt; элемент, а на выходе получаем &amp;lt;math&amp;gt;k(n+1)&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;lt;math&amp;gt;A&amp;lt;/math&amp;gt;) начиная с максимального в абсолютном смысле значения. Это выгодно отличает данный алгоритм с точки зрения поиска собственных значений матрицы, находящихся по краям её спектра.&lt;br /&gt;
&lt;br /&gt;
Не является полностью детерминированным, т.к. может досрочно завершить работу, если будут найдены все ненулевые собственные значения.&lt;br /&gt;
&lt;br /&gt;
В случае использования метода вычисления собственных значений с линейной сложностью, соотношение последовательной и параллельной сложностей будет равно &amp;lt;math&amp;gt;(k ^ 2 + n ^ 2) / (k  + 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;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма=== &lt;br /&gt;
=== Выводы для классов архитектур=== &lt;br /&gt;
=== Существующие реализации алгоритма===&lt;br /&gt;
&lt;br /&gt;
В настоящее время алгоритм Ланцоша поиска собственных значений квадратной симметричной матрицы включён в несколько библиотек и реализован на различных языках, среди которых такие наиболее распространенные как &#039;&#039;&#039;C&#039;&#039;&#039;, &#039;&#039;&#039;C++&#039;&#039;&#039;, &#039;&#039;&#039;FORTRAN77/90&#039;&#039;&#039;, &#039;&#039;&#039;MathLab&#039;&#039;&#039;.&lt;br /&gt;
Так, например, в языке &#039;&#039;&#039;MathLab&#039;&#039;&#039; во встроенном пакете &#039;&#039;&#039;ARPACK&#039;&#039;&#039; найти собственные значения методом Ланцоша можно при помощи вызова функции &#039;&#039;eigs()&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
На языке &#039;&#039;&#039;С&#039;&#039;&#039; существует библиотека &#039;&#039;&#039;[http://www.cs.wm.edu/~andreas/software/ PRIMME]&#039;&#039;&#039;, название которой расшифровывается как PReconditioned Iterative MultiMethod Eigensolver (итерационные методы поиска собственных значений с предусловием).&lt;br /&gt;
&lt;br /&gt;
Библиотека &#039;&#039;&#039;[http://www.nag.co.uk NAG] Numerical Library&#039;&#039;&#039; также содержит обширный набор функций, позволяющих проводить математический анализ, среди которых есть и реализация алгоритма Ланцоша. Библиотека доступна в трех пакетах: NAG C Library, NAG Fortran Library и NAG Library for .NET, совместна со многими языками и с основными операционными системами (Windows, Linux and OS X, а также Solaris, AIX и HP-UX).&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] Дж. Деммель «Вычислительная линейная алгебра», с 381.&lt;br /&gt;
&lt;br /&gt;
[2] Wikipedia https://en.wikipedia.org/wiki/Lanczos_algorithm&lt;br /&gt;
&lt;br /&gt;
[3] &amp;quot;[https://static.ph.ed.ac.uk/dissertations/hpc-msc/2013-2014/Investigation%20and%20Implementation%20of%20an%20Eigensolver%20Method.pdf Investigation and Implementation of an Eigensolver Method]&amp;quot;, Jorge Moreira, The University of Edinburgh, August 2014&lt;br /&gt;
&lt;br /&gt;
[4] &amp;quot;[http://www.physics.drexel.edu/~bob/Term_Reports/Hoppe_01.pdf Lanczos Vector Procedures]&amp;quot;, Travis Hoppe&lt;/div&gt;</summary>
		<author><name>Alexbashirov</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=14864</id>
		<title>Участник:Alexbashirov/Алгоритм Ланцоша для точной арифметики</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=14864"/>
		<updated>2016-10-30T16:48:43Z</updated>

		<summary type="html">&lt;p&gt;Alexbashirov: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[Участник: Alexbashirov|Баширов А.Д.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name             = Алгоритм Ланцоша для точной арифметики&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;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;
Алгоритм Ланцоша является прямым алгоритмом поиска собственных значений симметричной матрицы, разработанным венгерским физиком и математиком XX столетия Корнелием Ланцошем в 1950 году. Алгоритм совмещает в себе два других алгоритма: алгоритм построения подпространства Крылова (который также был создан Ланцошем) и процедуру Рэлея-Ритца приближения собственных значений матрицы. Алгоритм является вариацией степенного метода, позволяющего найти собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-го порядка. Однако в алгоритме число итераций ограничено некоторым &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;. Несмотря на заявленную вычислительную эффективность, алгоритм не получил широкого применения в своём первоначальном виде, ввиду его неустойчивости. 20 лет спустя, в 1970 году ученые Ojalvo и Newman показали доработанный алгоритм Ланцоша, который теперь стал устойчивым а также предложили способ выбора вектора начального приближения &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt;. Полученный последователями Ланцоша алгоритм получил название &amp;quot;Алгоритм Ланцоша с полной переортогонализацией&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма===&lt;br /&gt;
Алгоритм Ланцоша работает с вещественной симметричной матрицей &amp;lt;math&amp;gt;A=A^T&amp;lt;/math&amp;gt;, таким образом в памяти достаточно хранить лишь немногим более половины элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Прежде чем переходить к описанию алгоритма, следует упомянуть следующие понятия: подпространство Крылова и процесс Рэлея-Ритца, о которых уже было сказано в исторической справке выше. &lt;br /&gt;
Подпространством Крылова называется набор векторов&amp;lt;math&amp;gt;K_n =[b,Ab,A^2b,...,A^{n-1}b]&amp;lt;/math&amp;gt;. Начав свою работу с произвольного вектора &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, степенной метод вычисляет вектора &amp;lt;math&amp;gt;Ab, A^2b,...,A^{n-1}b&amp;lt;/math&amp;gt; итерационно сохраняя полученный результат в вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Полученная последовательность векторов сходится к собственному вектору, отвечающему максимальному собственному значению &amp;lt;math&amp;gt;\lambda_{max}&amp;lt;/math&amp;gt;. Однако, использование лишь последнего полученного вектора и потеря всех предшествующих посчитанных величин не всегда является наилучшим выбором. Поэтому сохранив все вектора и объединив их в одну матрицу мы получим так называемую &#039;&#039;&#039;матрицу Крылова&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K_j = [b,Ab,A^2b,...,A^{j-1}b]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Столбцы получившейся матрицы не ортогональны, однако их можно ортогонализовать, применив процесс Грамма-Шмидта. Получившиеся вектора будут составлять базис подпространства Крылова &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt;. Можно ожидать, что вектора полученного базиса будут достаточно хорошо приближать &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; собственных векторов, отвечающих &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; наибольшим собственным значения.&lt;br /&gt;
&lt;br /&gt;
Затем с использованием полученной матрицы из ортогональных векторов &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt; мы получим трехдиагональную матрицу &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; на основе исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
Наконец, к полученной матрице &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; будет применяться &#039;&#039;&#039;процесс Рэлея-Ритца&#039;&#039;&#039;, который найдет собственные значения трехдиагональной матрицы. В последствии эти значения и будут приближениями искомых собственных значений исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма Ланцоша, то есть наиболее ресурсно-затратной частью алгоритма, является шаг на котором на каждой итерации происходит перемножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;, полученный на предыдущей итерации. Полученный в результате умножения вектор обозначается &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; z=Aq_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;Q_j=[q_1,q_2,...q_j]&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортонормированных вектров Ланцоша и последующее формирование трехдиагональной матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;. Число таких векторов и, следовательно, размер матрицы растет с каждой итерацией. Итерационный процесс завершается при &amp;lt;math&amp;gt;j=k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На долю второй части алгоритма приходится поиск собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;, полученной в первой части.&lt;br /&gt;
&lt;br /&gt;
=== Схема последовательной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ланцош_Схема реализации.png|800px]]&lt;br /&gt;
&lt;br /&gt;
На рисунке выше представлен псевдокод, отражающий последовательность действий в алгоритме метода. Перечислим основные ступени в данном методе:&lt;br /&gt;
* Прежде чем войти в цикл, происходит инициализация констант &amp;lt;math&amp;gt;\Beta_0,q_0&amp;lt;/math&amp;gt;, вычисление нормы вектора начального приближения &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и нормализация этого вектора.&lt;br /&gt;
* Затем, в цикле, происходит: поиск вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, являющегося результатом применения матричного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;; скалярное произведение двух векторов &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; вычисляется линейная комбинация векторов; вычисляется норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; проверяется условие выхода из цикла (равенство нулю нормы вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;); в случае если норма не нулевая, то производим нормировку вектора; затем происходит процедура поиска собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;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;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; действий для умножения матрицы на вектор&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; действия для перемножения двух векторов&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  операций для поэлементного сложения или вычитания двух векторов&lt;br /&gt;
* для отыскания нормы вектора помимо &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  сложений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  умножений требуется 1 операция извлечения корня&lt;br /&gt;
* для поиска собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; требуется &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарно для одной итерации алгоритма требуется совершить  &amp;lt;math&amp;gt;O(n^2)+O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Информационный_граф.png|800px]]&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;n\times n&amp;lt;/math&amp;gt; на вектор размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
В свою очередь ресурс параллелизма операции поиска собственных значений зависит от выбранного способа и не рассматривается в данной статье.&lt;br /&gt;
&lt;br /&gt;
Таким образом, с точки зрения ресурса параллелизма, алгоритм Ланцоша обладает линейной сложностью по ширине ЯПФ и квадратичной сложностью по высоте ЯПФ. Основное время работы алгоритма будет уделено операции умножения матрицы на вектор, имеющей ширину яруса &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;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;A&amp;lt;/math&amp;gt;, следовательно на вход данный алгоритм во всяком случае получает 1 число и 1 матрицу размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;. Помимо этого для начала работы алгоритму нужен некоторый вектор &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; начального приближения размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, который тоже является входными данными.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После окончания работы алгоритма мы получаем набор собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, состоящий из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; элементов. Если помимо собственных значений выводятся еще и полученные собственные векторы, то суммарный объём всех таких векторов составляет &amp;lt;math&amp;gt;k\times n&amp;lt;/math&amp;gt; элементов. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, совокупный объём входных данных составляет: &amp;lt;math&amp;gt;n^2+n+1&amp;lt;/math&amp;gt; элемент, а на выходе получаем &amp;lt;math&amp;gt;k(n+1)&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;lt;math&amp;gt;A&amp;lt;/math&amp;gt;) начиная с максимального в абсолютном смысле значения. Это выгодно отличает данный алгоритм с точки зрения поиска собственных значений матрицы, находящихся по краям её спектра.&lt;br /&gt;
&lt;br /&gt;
Не является полностью детерминированным, т.к. может досрочно завершить работу, если будут найдены все ненулевые собственные значения.&lt;br /&gt;
&lt;br /&gt;
В случае использования метода вычисления собственных значений с линейной сложностью, соотношение последовательной и параллельной сложностей будет равно &amp;lt;math&amp;gt;(k ^ 2 + n ^ 2) / (k  + 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;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма=== &lt;br /&gt;
=== Выводы для классов архитектур=== &lt;br /&gt;
=== Существующие реализации алгоритма===&lt;br /&gt;
&lt;br /&gt;
В настоящее время алгоритм Ланцоша поиска собственных значений квадратной симметричной матрицы включён в несколько библиотек и реализован на различных языках, среди которых такие наиболее распространенные как &#039;&#039;&#039;C&#039;&#039;&#039;, &#039;&#039;&#039;C++&#039;&#039;&#039;, &#039;&#039;&#039;FORTRAN77/90&#039;&#039;&#039;, &#039;&#039;&#039;MathLab&#039;&#039;&#039;.&lt;br /&gt;
Так, например, в языке &#039;&#039;&#039;MathLab&#039;&#039;&#039; во встроенном пакете &#039;&#039;&#039;ARPACK&#039;&#039;&#039; найти собственные значения методом Ланцоша можно при помощи вызова функции &#039;&#039;eigs()&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
На языке &#039;&#039;&#039;С&#039;&#039;&#039; существует библиотека &#039;&#039;&#039;[http://www.cs.wm.edu/~andreas/software/ PRIMME]&#039;&#039;&#039;, название которой расшифровывается как PReconditioned Iterative MultiMethod Eigensolver (итерационные методы поиска собственных значений с предусловием).&lt;br /&gt;
&lt;br /&gt;
Библиотека &#039;&#039;&#039;[http://www.nag.co.uk NAG] Numerical Library&#039;&#039;&#039; также содержит обширный набор функций, позволяющих проводить математический анализ, среди которых есть и реализация алгоритма Ланцоша. Библиотека доступна в трех пакетах: NAG C Library, NAG Fortran Library и NAG Library for .NET, совместна со многими языками и с основными операционными системами (Windows, Linux and OS X, а также Solaris, AIX и HP-UX).&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] Дж. Деммель «Вычислительная линейная алгебра», с 381.&lt;br /&gt;
&lt;br /&gt;
[2] Wikipedia https://en.wikipedia.org/wiki/Lanczos_algorithm&lt;br /&gt;
&lt;br /&gt;
[3] &amp;quot;[https://static.ph.ed.ac.uk/dissertations/hpc-msc/2013-2014/Investigation%20and%20Implementation%20of%20an%20Eigensolver%20Method.pdf Investigation and Implementation of an Eigensolver Method]&amp;quot;, Jorge Moreira, The University of Edinburgh, August 2014&lt;br /&gt;
&lt;br /&gt;
[4] &amp;quot;[http://www.physics.drexel.edu/~bob/Term_Reports/Hoppe_01.pdf Lanczos Vector Procedures]&amp;quot;, Travis Hoppe&lt;/div&gt;</summary>
		<author><name>Alexbashirov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%98%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B3%D1%80%D0%B0%D1%84.png&amp;diff=14863</id>
		<title>Файл:Информационный граф.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%98%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B3%D1%80%D0%B0%D1%84.png&amp;diff=14863"/>
		<updated>2016-10-30T16:47:39Z</updated>

		<summary type="html">&lt;p&gt;Alexbashirov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Alexbashirov</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=14837</id>
		<title>Участник:Alexbashirov/Алгоритм Ланцоша для точной арифметики</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:Alexbashirov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=14837"/>
		<updated>2016-10-30T15:44:38Z</updated>

		<summary type="html">&lt;p&gt;Alexbashirov: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[Участник: Alexbashirov|Баширов А.Д.]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name             = Алгоритм Ланцоша для точной арифметики&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;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;
Алгоритм Ланцоша является прямым алгоритмом поиска собственных значений симметричной матрицы, разработанным венгерским физиком и математиком XX столетия Корнелием Ланцошем в 1950 году. Алгоритм совмещает в себе два других алгоритма: алгоритм построения подпространства Крылова (который также был создан Ланцошем) и процедуру Рэлея-Ритца приближения собственных значений матрицы. Алгоритм является вариацией степенного метода, позволяющего найти собственные значения и собственные вектора матрицы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-го порядка. Однако в алгоритме число итераций ограничено некоторым &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;. Несмотря на заявленную вычислительную эффективность, алгоритм не получил широкого применения в своём первоначальном виде, ввиду его неустойчивости. 20 лет спустя, в 1970 году ученые Ojalvo и Newman показали доработанный алгоритм Ланцоша, который теперь стал устойчивым а также предложили способ выбора вектора начального приближения &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt;. Полученный последователями Ланцоша алгоритм получил название &amp;quot;Алгоритм Ланцоша с полной переортогонализацией&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма===&lt;br /&gt;
Алгоритм Ланцоша работает с вещественной симметричной матрицей &amp;lt;math&amp;gt;A=A^T&amp;lt;/math&amp;gt;, таким образом в памяти достаточно хранить лишь немногим более половины элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Прежде чем переходить к описанию алгоритма, следует упомянуть следующие понятия: подпространство Крылова и процесс Рэлея-Ритца, о которых уже было сказано в исторической справке выше. &lt;br /&gt;
Подпространством Крылова называется набор векторов&amp;lt;math&amp;gt;K_n =[b,Ab,A^2b,...,A^{n-1}b]&amp;lt;/math&amp;gt;. Начав свою работу с произвольного вектора &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, степенной метод вычисляет вектора &amp;lt;math&amp;gt;Ab, A^2b,...,A^{n-1}b&amp;lt;/math&amp;gt; итерационно сохраняя полученный результат в вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Полученная последовательность векторов сходится к собственному вектору, отвечающему максимальному собственному значению &amp;lt;math&amp;gt;\lambda_{max}&amp;lt;/math&amp;gt;. Однако, использование лишь последнего полученного вектора и потеря всех предшествующих посчитанных величин не всегда является наилучшим выбором. Поэтому сохранив все вектора и объединив их в одну матрицу мы получим так называемую &#039;&#039;&#039;матрицу Крылова&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K_j = [b,Ab,A^2b,...,A^{j-1}b]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Столбцы получившейся матрицы не ортогональны, однако их можно ортогонализовать, применив процесс Грамма-Шмидта. Получившиеся вектора будут составлять базис подпространства Крылова &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt;. Можно ожидать, что вектора полученного базиса будут достаточно хорошо приближать &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; собственных векторов, отвечающих &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; наибольшим собственным значения.&lt;br /&gt;
&lt;br /&gt;
Затем с использованием полученной матрицы из ортогональных векторов &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt; мы получим трехдиагональную матрицу &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; на основе исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
Наконец, к полученной матрице &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; будет применяться &#039;&#039;&#039;процесс Рэлея-Ритца&#039;&#039;&#039;, который найдет собственные значения трехдиагональной матрицы. В последствии эти значения и будут приближениями искомых собственных значений исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма Ланцоша, то есть наиболее ресурсно-затратной частью алгоритма, является шаг на котором на каждой итерации происходит перемножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;, полученный на предыдущей итерации. Полученный в результате умножения вектор обозначается &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; z=Aq_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;Q_j=[q_1,q_2,...q_j]&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортонормированных вектров Ланцоша и последующее формирование трехдиагональной матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;. Число таких векторов и, следовательно, размер матрицы растет с каждой итерацией. Итерационный процесс завершается при &amp;lt;math&amp;gt;j=k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На долю второй части алгоритма приходится поиск собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;T_j=Q_j^TAQ_j&amp;lt;/math&amp;gt;, полученной в первой части.&lt;br /&gt;
&lt;br /&gt;
=== Схема последовательной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ланцош_Схема реализации.png|800px]]&lt;br /&gt;
&lt;br /&gt;
На рисунке выше представлен псевдокод, отражающий последовательность действий в алгоритме метода. Перечислим основные ступени в данном методе:&lt;br /&gt;
* Прежде чем войти в цикл, происходит инициализация констант &amp;lt;math&amp;gt;\Beta_0,q_0&amp;lt;/math&amp;gt;, вычисление нормы вектора начального приближения &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и нормализация этого вектора.&lt;br /&gt;
* Затем, в цикле, происходит: поиск вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, являющегося результатом применения матричного оператора &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к вектору &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;; скалярное произведение двух векторов &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; вычисляется линейная комбинация векторов; вычисляется норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;; проверяется условие выхода из цикла (равенство нулю нормы вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;); в случае если норма не нулевая, то производим нормировку вектора; затем происходит процедура поиска собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;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;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; действий для умножения матрицы на вектор&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; действия для перемножения двух векторов&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  операций для поэлементного сложения или вычитания двух векторов&lt;br /&gt;
* для отыскания нормы вектора помимо &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  сложений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  умножений требуется 1 операция извлечения корня&lt;br /&gt;
* для поиска собственных значений и векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; требуется &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарно для одной итерации алгоритма требуется совершить  &amp;lt;math&amp;gt;O(n^2)+O(k^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Поскольку алгоритм является итерационным, то выполнять параллельные операции возможно только внутри каждой итерации алгоритма. Сами итерации выполняются в строгой последовательности и не могут быть параллелизованны. Однако внутри каждой итерации происходят два процесса, которые могут быть параллелизованны:&lt;br /&gt;
* умножение матрицы на вектор,&lt;br /&gt;
* процесс поиска собственных значений.&lt;br /&gt;
&lt;br /&gt;
Умножение квадратной матрицы размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt; на вектор размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
В свою очередь ресурс параллелизма операции поиска собственных значений зависит от выбранного способа и не рассматривается в данной статье.&lt;br /&gt;
&lt;br /&gt;
Таким образом, с точки зрения ресурса параллелизма, алгоритм Ланцоша обладает линейной сложностью по ширине ЯПФ и квадратичной сложностью по высоте ЯПФ. Основное время работы алгоритма будет уделено операции умножения матрицы на вектор, имеющей ширину яруса &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;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;A&amp;lt;/math&amp;gt;, следовательно на вход данный алгоритм во всяком случае получает 1 число и 1 матрицу размерности &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;. Помимо этого для начала работы алгоритму нужен некоторый вектор &amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; начального приближения размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, который тоже является входными данными.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После окончания работы алгоритма мы получаем набор собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, состоящий из &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; элементов. Если помимо собственных значений выводятся еще и полученные собственные векторы, то суммарный объём всех таких векторов составляет &amp;lt;math&amp;gt;k\times n&amp;lt;/math&amp;gt; элементов. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом, совокупный объём входных данных составляет: &amp;lt;math&amp;gt;n^2+n+1&amp;lt;/math&amp;gt; элемент, а на выходе получаем &amp;lt;math&amp;gt;k(n+1)&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;lt;math&amp;gt;A&amp;lt;/math&amp;gt;) начиная с максимального в абсолютном смысле значения. Это выгодно отличает данный алгоритм с точки зрения поиска собственных значений матрицы, находящихся по краям её спектра.&lt;br /&gt;
&lt;br /&gt;
Не является полностью детерминированным, т.к. может досрочно завершить работу, если будут найдены все ненулевые собственные значения.&lt;br /&gt;
&lt;br /&gt;
В случае использования метода вычисления собственных значений с линейной сложностью, соотношение последовательной и параллельной сложностей будет равно &amp;lt;math&amp;gt;(k ^ 2 + n ^ 2) / (k  + 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;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма=== &lt;br /&gt;
=== Выводы для классов архитектур=== &lt;br /&gt;
=== Существующие реализации алгоритма===&lt;br /&gt;
&lt;br /&gt;
В настоящее время алгоритм Ланцоша поиска собственных значений квадратной симметричной матрицы включён в несколько библиотек и реализован на различных языках, среди которых такие наиболее распространенные как &#039;&#039;&#039;C&#039;&#039;&#039;, &#039;&#039;&#039;C++&#039;&#039;&#039;, &#039;&#039;&#039;FORTRAN77/90&#039;&#039;&#039;, &#039;&#039;&#039;MathLab&#039;&#039;&#039;.&lt;br /&gt;
Так, например, в языке &#039;&#039;&#039;MathLab&#039;&#039;&#039; во встроенном пакете &#039;&#039;&#039;ARPACK&#039;&#039;&#039; найти собственные значения методом Ланцоша можно при помощи вызова функции &#039;&#039;eigs()&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
На языке &#039;&#039;&#039;С&#039;&#039;&#039; существует библиотека &#039;&#039;&#039;[http://www.cs.wm.edu/~andreas/software/ PRIMME]&#039;&#039;&#039;, название которой расшифровывается как PReconditioned Iterative MultiMethod Eigensolver (итерационные методы поиска собственных значений с предусловием).&lt;br /&gt;
&lt;br /&gt;
Библиотека &#039;&#039;&#039;[http://www.nag.co.uk NAG] Numerical Library&#039;&#039;&#039; также содержит обширный набор функций, позволяющих проводить математический анализ, среди которых есть и реализация алгоритма Ланцоша. Библиотека доступна в трех пакетах: NAG C Library, NAG Fortran Library и NAG Library for .NET, совместна со многими языками и с основными операционными системами (Windows, Linux and OS X, а также Solaris, AIX и HP-UX).&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] Дж. Деммель «Вычислительная линейная алгебра», с 381.&lt;br /&gt;
&lt;br /&gt;
[2] Wikipedia https://en.wikipedia.org/wiki/Lanczos_algorithm&lt;br /&gt;
&lt;br /&gt;
[3] &amp;quot;[https://static.ph.ed.ac.uk/dissertations/hpc-msc/2013-2014/Investigation%20and%20Implementation%20of%20an%20Eigensolver%20Method.pdf Investigation and Implementation of an Eigensolver Method]&amp;quot;, Jorge Moreira, The University of Edinburgh, August 2014&lt;br /&gt;
&lt;br /&gt;
[4] &amp;quot;[http://www.physics.drexel.edu/~bob/Term_Reports/Hoppe_01.pdf Lanczos Vector Procedures]&amp;quot;, Travis Hoppe&lt;/div&gt;</summary>
		<author><name>Alexbashirov</name></author>
	</entry>
</feed>