<?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=Valeriya+Shervarly</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=Valeriya+Shervarly"/>
	<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/Valeriya_Shervarly"/>
	<updated>2026-10-22T20:38:48Z</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:Valeriya_Shervarly/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=16455</id>
		<title>Участник:Valeriya Shervarly/Ортогонализация Грама-Шмидта</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:Valeriya_Shervarly/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=16455"/>
		<updated>2016-11-11T19:01:33Z</updated>

		<summary type="html">&lt;p&gt;Valeriya Shervarly: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|ASA}}&lt;br /&gt;
&lt;br /&gt;
Авторы описания: Шерварлы В.Г.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Процесс Грама-Шмидта - это алгоритм построения множества ортогональных (или ортонормированных) линейно-независимых векторов по исходному множеству векторов, при этом линейные оболочки получившегося и исходного множеств векторов совпадают. Иными словами, построение ортогонального базиса из векторов, образующих произвольный базис.&lt;br /&gt;
&lt;br /&gt;
Процесс Грама-Шмидта также можно рассматривать как разложение невырожденной квадратной матрицы в произведение унитарной (ортогональной) и верхнетреугольной матрицы с положительными диагональными элементами (QR-разложение).&lt;br /&gt;
&lt;br /&gt;
Задача построения или вычисления ортогонального базиса некоторого линейного подпространства или пространства часто является подзадачей более крупных широко используемых задач, так что ортогонализация Грама-Шмидта является важным и часто используемым алгоритмом в линейной алгебре.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Процесс ортогонализации описывается следующей последовательностью формул:&lt;br /&gt;
&lt;br /&gt;
:: &amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
b_1 &amp;amp; = a_1 \\&lt;br /&gt;
b_2 &amp;amp; = a_2 - \frac{&amp;lt;a_2, b_1&amp;gt;}{\|b_1\|^2} * b_1 \\&lt;br /&gt;
b_3 &amp;amp; = a_3 - \frac{&amp;lt;a_3, b_1&amp;gt;}{\|b_1\|^2} * b_1 - \frac{&amp;lt;a_3, b_2&amp;gt;}{\|b_2\|^2} * b_2 \\&lt;br /&gt;
... \\&lt;br /&gt;
b_n &amp;amp; = a_n - \frac{&amp;lt;a_n, b_1&amp;gt;}{\|b_1\|^2} * b_1 - ... - \frac{&amp;lt;a_n, b_{n-1}&amp;gt;}{\|b_{n-1}\|^2} * b_{n-1} \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где:&lt;br /&gt;
&amp;lt;math&amp;gt;a_1, ..., a_n &amp;lt;/math&amp;gt; - исходное множество линейно-независимых векторов &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;b_1, ..., b_n&amp;lt;/math&amp;gt; - множество искомых векторов&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;a,b&amp;gt;&amp;lt;/math&amp;gt; - скалярное произведение векторов&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\|b\| = \sqrt{&amp;lt;b,b&amp;gt;}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром алгоритма является вычисление оператора проекции &amp;lt;math&amp;gt;proj_{b}a = \frac{&amp;lt;a, b&amp;gt;}{\|b\|^2} * b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На уровне макроструктуры будем рассматривать &amp;lt;math&amp;gt;\frac{&amp;lt;a, b&amp;gt;}{\|b\|^2} * b&amp;lt;/math&amp;gt; как отдельную макрооперацию &amp;lt;math&amp;gt;proj_{b}a&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, на верхнем уровне алгоритм можно описать так (на каждом шаге выполняем вычисление очередного вектора итогового множества векторов):&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1&#039;&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;b_1 = a_1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг i&#039;&#039;&#039; (i = 2, ..., n, где n - количество векторов):&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;b_i = a_i - \sum^{i-1}_{k=1}{proj_{b_k}a_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Определим входные и выходные данные (два множества векторов, n - количество векторов в множестве):&lt;br /&gt;
&lt;br /&gt;
 input: a = (a[1], ..., a[n])&lt;br /&gt;
 output: b = (b[1], ..., b[n])&lt;br /&gt;
&lt;br /&gt;
И далее последовательно находим каждый из векторов &amp;lt;math&amp;gt;b_i&amp;lt;/math&amp;gt;, используя полученные на предыдущих итерациях цикла векторы &amp;lt;math&amp;gt;b_1, ..., b_{i-1}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 b[1] = a[1]&lt;br /&gt;
 for i = 2,...,n&lt;br /&gt;
     b[i] = a[i]&lt;br /&gt;
     Comment: во вложенном цикле вычисляем &amp;lt;math&amp;gt;b_i = a_i - \sum^{i-1}_{k=1}{proj_{b_k}a_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
     for k = 1,...,i-1&lt;br /&gt;
         b[i] = b[i] - &amp;lt;a[i],b[k]&amp;gt;/&amp;lt;b[k],b[k]&amp;gt;*b[k]     &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Последовательная сложность алгоритма выражается следующими формулами&lt;br /&gt;
(&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - количество векторов,&lt;br /&gt;
&amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество компонент вектора):&lt;br /&gt;
&lt;br /&gt;
* количество умножений: &amp;lt;math&amp;gt;\frac{3mn(n-1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* количество делений: &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* количество сложений и вычитаний: &amp;lt;math&amp;gt;\frac{n(n-1)(2m - 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Общая сложность алгоритма - &amp;lt;math&amp;gt;O(mn^2)&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_i, i=1, ..., n&amp;lt;/math&amp;gt; - операции присваивания &amp;lt;math&amp;gt;b_i = a_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;s_{ij} = b_i - proj_{b_j}a_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;a_i^{(*)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;f_{ij}&amp;lt;/math&amp;gt; отличаются от &amp;lt;math&amp;gt;a_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s_{ij}&amp;lt;/math&amp;gt; соответственно тем, что в этот момент завершается вычисление вектора &amp;lt;math&amp;gt;b_i&amp;lt;/math&amp;gt;, являющегося и частью выходных данных, и необходимой информацией для последующего этапа. Так же в этих вершинах можно вычислять величину &amp;lt;math&amp;gt;\|b_i\|^2&amp;lt;/math&amp;gt;, необходимую для вычисления соответствующих &amp;lt;math&amp;gt;proj_{b}a&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;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:CGS--infograph.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Возможно параллельное вычисление всех &amp;lt;math&amp;gt;proj_{b_j}a_i, i=1,...n&amp;lt;/math&amp;gt; для уже найденных &amp;lt;math&amp;gt;b_j&amp;lt;/math&amp;gt; вместо вычисления каждого вектора &amp;lt;math&amp;gt;b_j&amp;lt;/math&amp;gt; по очереди. Таким образом после каждой итерации будет получен один посчитанный вектор, необходимый для расчетов на следующей итерации. Однако степень распараллеливания будет падать на каждой итерации, что вместе с необходимостью синхронизации и многочисленными обменами информации может снизить эффективность распараллеливания.&lt;br /&gt;
&lt;br /&gt;
Сложность параллельного варианта равна &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - количество векторов, &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество компонент вектора. Можно сократить эту величину до &amp;lt;math&amp;gt;O(n\log{m})&amp;lt;/math&amp;gt;, если еще параллельно проводить вычисление каждой макрооперации &amp;lt;math&amp;gt;proj_{b}a&amp;lt;/math&amp;gt;, однако, опять же, не стоит забывать о расходах на синхронизацию и обмен информацией.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
N линейно независимых векторов (процесс Грама — Шмидта может применяться также к бесконечной последовательности линейно независимых векторов, а также к линейно зависимым векторам. В последнем случае вектор &amp;lt;math&amp;gt;a_j&amp;lt;/math&amp;gt; получится нулевым, если он зависит от векторов &amp;lt;math&amp;gt;a_1, ..., a_{j-1}&amp;lt;/math&amp;gt;, и алгоритм должен сразу отбрасывать нулевые векторы). Объем входных данных: &amp;lt;math&amp;gt;mN&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - количество векторов, &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество компонент вектора&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039;&lt;br /&gt;
N ортогональных векторов, линейная оболочка которых совпадает с линейной оболочкой входного множества векторов, объем выходных данных: &amp;lt;math&amp;gt;mN&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма: &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;. Отношение последовательной сложности к параллельной - &amp;lt;math&amp;gt;\frac{mn^2}{mn}&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;(&amp;lt;/math&amp;gt;или &amp;lt;math&amp;gt;\frac{mn^2}{n\log{m}})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Классический алгоритм (CGS) является численно-неустойчивым из-за частой потери ортогональности, вызванной ошибками округления в процессе вычислений.&lt;br /&gt;
&lt;br /&gt;
Существует модификации алгоритма Грама-Шмидта, которые являются более устойчивыми, например, модифицированный алгоритм Грама-Шмидта (MGS), блочные и итеративные варианты CGS и MGS. MGS численно эквивалентен методу Хаусхолдера QR-разложения, примененного к матрице, полученной из исходной путем добавления к ней сверху прямоугольной матрицы из нулевых элементов.&lt;br /&gt;
&lt;br /&gt;
Как можно видеть на изображении информационного графа алгоритма, существуют вершины с большой степенью исхода. Эти вершины соответствуют (в том числе) вычислению вектора &amp;lt;math&amp;gt;b_i&amp;lt;/math&amp;gt; и результат этого вычисления должен быть сообщен всем вершинам, вычисляющим &amp;lt;math&amp;gt;proj_{b_i}a_j&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;j=1,..., n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* реализация для системы компьютерной алгебры [http://maxima.sourceforge.net/ maxima] (GNU GPL)&lt;br /&gt;
&lt;br /&gt;
 load(eigen);&lt;br /&gt;
 x: matrix ([-2,1,0],[-2,0,1],[-0.5,-1,1]);&lt;br /&gt;
 y: gramschmidt(x);&lt;br /&gt;
&lt;br /&gt;
* пример реализации для системы компьютерной алгебры [http://www.wolfram.com/mathematica/ mathematica] (проприетарное программное обеспечение)&lt;br /&gt;
&lt;br /&gt;
 Projection[v1_, v2_] := (v1.v2*v2)/v2.v2&lt;br /&gt;
 MultipleProjection[v1_, vecs_] := Plus @@ (Projection[v1, #1] &amp;amp;) /@ vecs&lt;br /&gt;
 GramSchmidt[mat_] := Fold[Join[#1, {Normalize[#2 - MultipleProjection[#2, #1]]}] &amp;amp;, {}, mat]&lt;br /&gt;
 GramSchmidt[{{-2, 1, 0}, {-2, 0, 1}, {-0.5, -1, 1}}]&lt;br /&gt;
&lt;br /&gt;
* библиотека [https://github.com/fplll/fplll fplll] &lt;br /&gt;
&lt;br /&gt;
* [http://numerics.mathdotnet.com/ Math.NET Numerics] &lt;br /&gt;
&lt;br /&gt;
* библиотека [https://www.nag.co.uk/ NAG] &lt;br /&gt;
&lt;br /&gt;
* библиотека [https://www.mcs.anl.gov/petsc/documentation/index.html PETSc] &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
# https://ru.wikipedia.org/wiki/Процесс_Грама_―_Шмидта&lt;br /&gt;
# Канатников А.Н., Крищенко А.П. &amp;quot;Линейная алгебра.&amp;quot;&lt;br /&gt;
# Å. Björck. &amp;quot;Numerics of Gram-Schmidt orthogonalization&amp;quot;&lt;br /&gt;
# B. Milde, M. Schneider. &amp;quot;Parallel Implementation of Classical Gram-Schmidt Orthogonalization on CUDA Graphics Cards&amp;quot;&lt;/div&gt;</summary>
		<author><name>Valeriya Shervarly</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:Valeriya_Shervarly/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=15111</id>
		<title>Участник:Valeriya Shervarly/Ортогонализация Грама-Шмидта</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:Valeriya_Shervarly/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=15111"/>
		<updated>2016-10-31T14:09:39Z</updated>

		<summary type="html">&lt;p&gt;Valeriya Shervarly: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
Авторы описания: Шерварлы В.Г.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Процесс Грама-Шмидта - это алгоритм построения множества ортогональных (или ортонормированных) линейно-независимых векторов по исходному множеству векторов, при этом линейные оболочки получившегося и исходного множеств векторов совпадают. Иными словами, построение ортогонального базиса из векторов, образующих произвольный базис.&lt;br /&gt;
&lt;br /&gt;
Процесс Грама-Шмидта также можно рассматривать как разложение невырожденной квадратной матрицы в произведение унитарной (ортогональной) и верхнетреугольной матрицы с положительными диагональными элементами (QR-разложение).&lt;br /&gt;
&lt;br /&gt;
Задача построения или вычисления ортогонального базиса некоторого линейного подпространства или пространства часто является подзадачей более крупных широко используемых задач, так что ортогонализация Грама-Шмидта является важным и часто используемым алгоритмом в линейной алгебре.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Процесс ортогонализации описывается следующей последовательностью формул:&lt;br /&gt;
&lt;br /&gt;
:: &amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
b_1 &amp;amp; = a_1 \\&lt;br /&gt;
b_2 &amp;amp; = a_2 - \frac{&amp;lt;a_2, b_1&amp;gt;}{\|b_1\|^2} * b_1 \\&lt;br /&gt;
b_3 &amp;amp; = a_3 - \frac{&amp;lt;a_3, b_1&amp;gt;}{\|b_1\|^2} * b_1 - \frac{&amp;lt;a_3, b_2&amp;gt;}{\|b_2\|^2} * b_2 \\&lt;br /&gt;
... \\&lt;br /&gt;
b_n &amp;amp; = a_n - \frac{&amp;lt;a_n, b_1&amp;gt;}{\|b_1\|^2} * b_1 - ... - \frac{&amp;lt;a_n, b_{n-1}&amp;gt;}{\|b_{n-1}\|^2} * b_{n-1} \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где:&lt;br /&gt;
&amp;lt;math&amp;gt;a_1, ..., a_n &amp;lt;/math&amp;gt; - исходное множество линейно-независимых векторов &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;b_1, ..., b_n&amp;lt;/math&amp;gt; - множество искомых векторов&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;a,b&amp;gt;&amp;lt;/math&amp;gt; - скалярное произведение векторов&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\|b\| = \sqrt{&amp;lt;b,b&amp;gt;}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром алгоритма является вычисление оператора проекции &amp;lt;math&amp;gt;proj_{b}a = \frac{&amp;lt;a, b&amp;gt;}{\|b\|^2} * b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На уровне макроструктуры будем рассматривать &amp;lt;math&amp;gt;\frac{&amp;lt;a, b&amp;gt;}{\|b\|^2} * b&amp;lt;/math&amp;gt; как отдельную макрооперацию &amp;lt;math&amp;gt;proj_{b}a&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, на верхнем уровне алгоритм можно описать так (на каждом шаге выполняем вычисление очередного вектора итогового множества векторов):&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1&#039;&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;b_1 = a_1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг i&#039;&#039;&#039; (i = 2, ..., n, где n - количество векторов):&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;b_i = a_i - \sum^{i-1}_{k=1}{proj_{b_k}a_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Определим входные и выходные данные (два множества векторов, n - количество векторов в множестве):&lt;br /&gt;
&lt;br /&gt;
 input: a = (a[1], ..., a[n])&lt;br /&gt;
 output: b = (b[1], ..., b[n])&lt;br /&gt;
&lt;br /&gt;
И далее последовательно находим каждый из векторов &amp;lt;math&amp;gt;b_i&amp;lt;/math&amp;gt;, используя полученные на предыдущих итерациях цикла векторы &amp;lt;math&amp;gt;b_1, ..., b_{i-1}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 b[1] = a[1]&lt;br /&gt;
 for i = 2,...,n&lt;br /&gt;
     b[i] = a[i]&lt;br /&gt;
     Comment: во вложенном цикле вычисляем &amp;lt;math&amp;gt;b_i = a_i - \sum^{i-1}_{k=1}{proj_{b_k}a_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
     for k = 1,...,i-1&lt;br /&gt;
         b[i] = b[i] - &amp;lt;a[i],b[k]&amp;gt;/&amp;lt;b[k],b[k]&amp;gt;*b[k]     &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Последовательная сложность алгоритма выражается следующими формулами&lt;br /&gt;
(&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - количество векторов,&lt;br /&gt;
&amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество компонент вектора):&lt;br /&gt;
&lt;br /&gt;
* количество умножений: &amp;lt;math&amp;gt;\frac{3mn(n-1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* количество делений: &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* количество сложений и вычитаний: &amp;lt;math&amp;gt;\frac{n(n-1)(2m - 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Общая сложность алгоритма - &amp;lt;math&amp;gt;O(mn^2)&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_i, i=1, ..., n&amp;lt;/math&amp;gt; - операции присваивания &amp;lt;math&amp;gt;b_i = a_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;s_{ij} = b_i - proj_{b_j}a_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;a_i^{(*)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;f_{ij}&amp;lt;/math&amp;gt; отличаются от &amp;lt;math&amp;gt;a_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s_{ij}&amp;lt;/math&amp;gt; соответственно тем, что в этот момент завершается вычисление вектора &amp;lt;math&amp;gt;b_i&amp;lt;/math&amp;gt;, являющегося и частью выходных данных, и необходимой информацией для последующего этапа. Так же в этих вершинах можно вычислять величину &amp;lt;math&amp;gt;\|b_i\|^2&amp;lt;/math&amp;gt;, необходимую для вычисления соответствующих &amp;lt;math&amp;gt;proj_{b}a&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;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:CGS--infograph.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Возможно параллельное вычисление всех &amp;lt;math&amp;gt;proj_{b_j}a_i, i=1,...n&amp;lt;/math&amp;gt; для уже найденных &amp;lt;math&amp;gt;b_j&amp;lt;/math&amp;gt; вместо вычисления каждого вектора &amp;lt;math&amp;gt;b_j&amp;lt;/math&amp;gt; по очереди. Таким образом после каждой итерации будет получен один посчитанный вектор, необходимый для расчетов на следующей итерации. Однако степень распараллеливания будет падать на каждой итерации, что вместе с необходимостью синхронизации и многочисленными обменами информации может снизить эффективность распараллеливания.&lt;br /&gt;
&lt;br /&gt;
Сложность параллельного варианта равна &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - количество векторов, &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество компонент вектора. Можно сократить эту величину до &amp;lt;math&amp;gt;O(n\log{m})&amp;lt;/math&amp;gt;, если еще параллельно проводить вычисление каждой макрооперации &amp;lt;math&amp;gt;proj_{b}a&amp;lt;/math&amp;gt;, однако, опять же, не стоит забывать о расходах на синхронизацию и обмен информацией.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
N линейно независимых векторов (процесс Грама — Шмидта может применяться также к бесконечной последовательности линейно независимых векторов, а также к линейно зависимым векторам. В последнем случае вектор &amp;lt;math&amp;gt;a_j&amp;lt;/math&amp;gt; получится нулевым, если он зависит от векторов &amp;lt;math&amp;gt;a_1, ..., a_{j-1}&amp;lt;/math&amp;gt;, и алгоритм должен сразу отбрасывать нулевые векторы). Объем входных данных: &amp;lt;math&amp;gt;mN&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - количество векторов, &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество компонент вектора&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039;&lt;br /&gt;
N ортогональных векторов, линейная оболочка которых совпадает с линейной оболочкой входного множества векторов, объем выходных данных: &amp;lt;math&amp;gt;mN&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма: &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;. Отношение последовательной сложности к параллельной - &amp;lt;math&amp;gt;\frac{mn^2}{mn}&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;(&amp;lt;/math&amp;gt;или &amp;lt;math&amp;gt;\frac{mn^2}{n\log{m}})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Классический алгоритм (CGS) является численно-неустойчивым из-за частой потери ортогональности, вызванной ошибками округления в процессе вычислений.&lt;br /&gt;
&lt;br /&gt;
Существует модификации алгоритма Грама-Шмидта, которые являются более устойчивами, например, модифицированный алгоритм Грама-Шмидта (MGS), блочные и итеративные варианты CGS и MGS. MGS численно эквивалентен методу Хаусхолдера QR-разложения, примененного к матрице, полученной из исходной путем добавления к ней сверху прямоугольной матрицы из нулевых элементов.&lt;br /&gt;
&lt;br /&gt;
Как можно видеть на изображении информационного графа алгоритма, существуют вершины с большой степенью исхода. Эти вершины соответствуют (в том числе) вычислению вектора &amp;lt;math&amp;gt;b_i&amp;lt;/math&amp;gt; и результат этого вычисления должен быть сообщен всем вершинам, вычисляющим &amp;lt;math&amp;gt;proj_{b_i}a_j&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;j=1,..., n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* реализация для системы компьютерной алгебры [http://maxima.sourceforge.net/ maxima] (GNU GPL)&lt;br /&gt;
&lt;br /&gt;
 load(eigen);&lt;br /&gt;
 x: matrix ([-2,1,0],[-2,0,1],[-0.5,-1,1]);&lt;br /&gt;
 y: gramschmidt(x);&lt;br /&gt;
&lt;br /&gt;
* пример реализации для системы компьютерной алгебры [http://www.wolfram.com/mathematica/ mathematica] (проприетарное программное обеспечение)&lt;br /&gt;
&lt;br /&gt;
 Projection[v1_, v2_] := (v1.v2*v2)/v2.v2&lt;br /&gt;
 MultipleProjection[v1_, vecs_] := Plus @@ (Projection[v1, #1] &amp;amp;) /@ vecs&lt;br /&gt;
 GramSchmidt[mat_] := Fold[Join[#1, {Normalize[#2 - MultipleProjection[#2, #1]]}] &amp;amp;, {}, mat]&lt;br /&gt;
 GramSchmidt[{{-2, 1, 0}, {-2, 0, 1}, {-0.5, -1, 1}}]&lt;br /&gt;
&lt;br /&gt;
* библиотека [https://github.com/fplll/fplll fplll] &lt;br /&gt;
&lt;br /&gt;
* [http://numerics.mathdotnet.com/ Math.NET Numerics] &lt;br /&gt;
&lt;br /&gt;
* библиотека [https://www.nag.co.uk/ NAG] &lt;br /&gt;
&lt;br /&gt;
* библиотека [https://www.mcs.anl.gov/petsc/documentation/index.html PETSc] &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
# https://ru.wikipedia.org/wiki/Процесс_Грама_―_Шмидта&lt;br /&gt;
# Канатников А.Н., Крищенко А.П. &amp;quot;Линейная алгебра.&amp;quot;&lt;br /&gt;
# Å. Björck. &amp;quot;Numerics of Gram-Schmidt orthogonalization&amp;quot;&lt;br /&gt;
# B. Milde, M. Schneider. &amp;quot;Parallel Implementation of Classical Gram-Schmidt Orthogonalization on CUDA Graphics Cards&amp;quot;&lt;/div&gt;</summary>
		<author><name>Valeriya Shervarly</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:Valeriya_Shervarly/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=15110</id>
		<title>Участник:Valeriya Shervarly/Ортогонализация Грама-Шмидта</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:Valeriya_Shervarly/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=15110"/>
		<updated>2016-10-31T14:08:07Z</updated>

		<summary type="html">&lt;p&gt;Valeriya Shervarly: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
Авторы описания: Шерварлы В.Г.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Процесс Грама-Шмидта - это алгоритм построения множества ортогональных (или ортонормированных) линейно-независимых векторов по исходному множеству векторов, при этом линейные оболочки получившегося и исходного множеств векторов совпадают. Иными словами, построение ортогонального базиса из векторов, образующих произвольный базис.&lt;br /&gt;
&lt;br /&gt;
Процесс Грама-Шмидта также можно рассматривать как разложение невырожденной квадратной матрицы в произведение унитарной (ортогональной) и верхнетреугольной матрицы с положительными диагональными элементами (QR-разложение).&lt;br /&gt;
&lt;br /&gt;
Задача построения или вычисления ортогонального базиса некоторого линейного подпространства или пространства часто является подзадачей более крупных широко используемых задач, так что ортогонализация Грама-Шмидта является важным и часто используемым алгоритмом в линейной алгебре.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Процесс ортогонализации описывается следующей последовательностью формул:&lt;br /&gt;
&lt;br /&gt;
:: &amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
b_1 &amp;amp; = a_1 \\&lt;br /&gt;
b_2 &amp;amp; = a_2 - \frac{&amp;lt;a_2, b_1&amp;gt;}{\|b_1\|^2} * b_1 \\&lt;br /&gt;
b_3 &amp;amp; = a_3 - \frac{&amp;lt;a_3, b_1&amp;gt;}{\|b_1\|^2} * b_1 - \frac{&amp;lt;a_3, b_2&amp;gt;}{\|b_2\|^2} * b_2 \\&lt;br /&gt;
... \\&lt;br /&gt;
b_n &amp;amp; = a_n - \frac{&amp;lt;a_n, b_1&amp;gt;}{\|b_1\|^2} * b_1 - ... - \frac{&amp;lt;a_n, b_{n-1}&amp;gt;}{\|b_{n-1}\|^2} * b_{n-1} \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где:&lt;br /&gt;
&amp;lt;math&amp;gt;a_1, ..., a_n &amp;lt;/math&amp;gt; - исходное множество линейно-независимых векторов &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;b_1, ..., b_n&amp;lt;/math&amp;gt; - множество искомых векторов&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;a,b&amp;gt;&amp;lt;/math&amp;gt; - скалярное произведение векторов&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\|b\| = \sqrt{&amp;lt;b,b&amp;gt;}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром алгоритма является вычисление оператора проекции &amp;lt;math&amp;gt;proj_{b}a = \frac{&amp;lt;a, b&amp;gt;}{\|b\|^2} * b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На уровне макроструктуры будем рассматривать &amp;lt;math&amp;gt;\frac{&amp;lt;a, b&amp;gt;}{\|b\|^2} * b&amp;lt;/math&amp;gt; как отдельную макрооперацию &amp;lt;math&amp;gt;proj_{b}a&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, на верхнем уровне алгоритм можно описать так (на каждом шаге выполняем вычисление очередного вектора итогового множества векторов):&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг 1&#039;&#039;&#039;: &lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;b_1 = a_1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Шаг i&#039;&#039;&#039; (i = 2, ..., n, где n - количество векторов):&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;b_i = a_i - \sum^{i-1}_{k=1}{proj_{b_k}a_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Определим входные и выходные данные (два множества векторов):&lt;br /&gt;
&lt;br /&gt;
 input: a = (a[1], ..., a[n])&lt;br /&gt;
 output: b = (b[1], ..., b[n])&lt;br /&gt;
&lt;br /&gt;
И далее последовательно находим каждый из векторов &amp;lt;math&amp;gt;b_i&amp;lt;/math&amp;gt;, используя полученные на предыдущих итерациях цикла векторы &amp;lt;math&amp;gt;b_1, ..., b_{i-1}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 b[1] = a[1]&lt;br /&gt;
 for i = 2,...,n&lt;br /&gt;
     b[i] = a[i]&lt;br /&gt;
     Comment: во вложенном цикле вычисляем &amp;lt;math&amp;gt;b_i = a_i - \sum^{i-1}_{k=1}{proj_{b_k}a_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
     for k = 1,...,i-1&lt;br /&gt;
         b[i] = b[i] - &amp;lt;a[i],b[k]&amp;gt;/&amp;lt;b[k],b[k]&amp;gt;*b[k]     &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Последовательная сложность алгоритма выражается следующими формулами&lt;br /&gt;
(&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - количество векторов,&lt;br /&gt;
&amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество компонент вектора):&lt;br /&gt;
&lt;br /&gt;
* количество умножений: &amp;lt;math&amp;gt;\frac{3mn(n-1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* количество делений: &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* количество сложений и вычитаний: &amp;lt;math&amp;gt;\frac{n(n-1)(2m - 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Общая сложность алгоритма - &amp;lt;math&amp;gt;O(mn^2)&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_i, i=1, ..., n&amp;lt;/math&amp;gt; - операции присваивания &amp;lt;math&amp;gt;b_i = a_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;s_{ij} = b_i - proj_{b_j}a_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;a_i^{(*)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;f_{ij}&amp;lt;/math&amp;gt; отличаются от &amp;lt;math&amp;gt;a_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s_{ij}&amp;lt;/math&amp;gt; соответственно тем, что в этот момент завершается вычисление вектора &amp;lt;math&amp;gt;b_i&amp;lt;/math&amp;gt;, являющегося и частью выходных данных, и необходимой информацией для последующего этапа. Так же в этих вершинах можно вычислять величину &amp;lt;math&amp;gt;\|b_i\|^2&amp;lt;/math&amp;gt;, необходимую для вычисления соответствующих &amp;lt;math&amp;gt;proj_{b}a&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;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:CGS--infograph.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Возможно параллельное вычисление всех &amp;lt;math&amp;gt;proj_{b_j}a_i, i=1,...n&amp;lt;/math&amp;gt; для уже найденных &amp;lt;math&amp;gt;b_j&amp;lt;/math&amp;gt; вместо вычисления каждого вектора &amp;lt;math&amp;gt;b_j&amp;lt;/math&amp;gt; по очереди. Таким образом после каждой итерации будет получен один посчитанный вектор, необходимый для расчетов на следующей итерации. Однако степень распараллеливания будет падать на каждой итерации, что вместе с необходимостью синхронизации и многочисленными обменами информации может снизить эффективность распараллеливания.&lt;br /&gt;
&lt;br /&gt;
Сложность параллельного варианта равна &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - количество векторов, &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество компонент вектора. Можно сократить эту величину до &amp;lt;math&amp;gt;O(n\log{m})&amp;lt;/math&amp;gt;, если еще параллельно проводить вычисление каждой макрооперации &amp;lt;math&amp;gt;proj_{b}a&amp;lt;/math&amp;gt;, однако, опять же, не стоит забывать о расходах на синхронизацию и обмен информацией.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
N линейно независимых векторов (процесс Грама — Шмидта может применяться также к бесконечной последовательности линейно независимых векторов, а также к линейно зависимым векторам. В последнем случае вектор &amp;lt;math&amp;gt;a_j&amp;lt;/math&amp;gt; получится нулевым, если он зависит от векторов &amp;lt;math&amp;gt;a_1, ..., a_{j-1}&amp;lt;/math&amp;gt;, и алгоритм должен сразу отбрасывать нулевые векторы). Объем входных данных: &amp;lt;math&amp;gt;mN&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - количество векторов, &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество компонент вектора&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039;&lt;br /&gt;
N ортогональных векторов, линейная оболочка которых совпадает с линейной оболочкой входного множества векторов, объем выходных данных: &amp;lt;math&amp;gt;mN&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма: &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;. Отношение последовательной сложности к параллельной - &amp;lt;math&amp;gt;\frac{mn^2}{mn}&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;(&amp;lt;/math&amp;gt;или &amp;lt;math&amp;gt;\frac{mn^2}{n\log{m}})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Классический алгоритм (CGS) является численно-неустойчивым из-за частой потери ортогональности, вызванной ошибками округления в процессе вычислений.&lt;br /&gt;
&lt;br /&gt;
Существует модификации алгоритма Грама-Шмидта, которые являются более устойчивами, например, модифицированный алгоритм Грама-Шмидта (MGS), блочные и итеративные варианты CGS и MGS. MGS численно эквивалентен методу Хаусхолдера QR-разложения, примененного к матрице, полученной из исходной путем добавления к ней сверху прямоугольной матрицы из нулевых элементов.&lt;br /&gt;
&lt;br /&gt;
Как можно видеть на изображении информационного графа алгоритма, существуют вершины с большой степенью исхода. Эти вершины соответствуют (в том числе) вычислению вектора &amp;lt;math&amp;gt;b_i&amp;lt;/math&amp;gt; и результат этого вычисления должен быть сообщен всем вершинам, вычисляющим &amp;lt;math&amp;gt;proj_{b_i}a_j&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;j=1,..., n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* реализация для системы компьютерной алгебры [http://maxima.sourceforge.net/ maxima] (GNU GPL)&lt;br /&gt;
&lt;br /&gt;
 load(eigen);&lt;br /&gt;
 x: matrix ([-2,1,0],[-2,0,1],[-0.5,-1,1]);&lt;br /&gt;
 y: gramschmidt(x);&lt;br /&gt;
&lt;br /&gt;
* пример реализации для системы компьютерной алгебры [http://www.wolfram.com/mathematica/ mathematica] (проприетарное программное обеспечение)&lt;br /&gt;
&lt;br /&gt;
 Projection[v1_, v2_] := (v1.v2*v2)/v2.v2&lt;br /&gt;
 MultipleProjection[v1_, vecs_] := Plus @@ (Projection[v1, #1] &amp;amp;) /@ vecs&lt;br /&gt;
 GramSchmidt[mat_] := Fold[Join[#1, {Normalize[#2 - MultipleProjection[#2, #1]]}] &amp;amp;, {}, mat]&lt;br /&gt;
 GramSchmidt[{{-2, 1, 0}, {-2, 0, 1}, {-0.5, -1, 1}}]&lt;br /&gt;
&lt;br /&gt;
* библиотека [https://github.com/fplll/fplll fplll] &lt;br /&gt;
&lt;br /&gt;
* [http://numerics.mathdotnet.com/ Math.NET Numerics] &lt;br /&gt;
&lt;br /&gt;
* библиотека [https://www.nag.co.uk/ NAG] &lt;br /&gt;
&lt;br /&gt;
* библиотека [https://www.mcs.anl.gov/petsc/documentation/index.html PETSc] &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
# https://ru.wikipedia.org/wiki/Процесс_Грама_―_Шмидта&lt;br /&gt;
# Канатников А.Н., Крищенко А.П. &amp;quot;Линейная алгебра.&amp;quot;&lt;br /&gt;
# Å. Björck. &amp;quot;Numerics of Gram-Schmidt orthogonalization&amp;quot;&lt;br /&gt;
# B. Milde, M. Schneider. &amp;quot;Parallel Implementation of Classical Gram-Schmidt Orthogonalization on CUDA Graphics Cards&amp;quot;&lt;/div&gt;</summary>
		<author><name>Valeriya Shervarly</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:Valeriya_Shervarly/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=13591</id>
		<title>Участник:Valeriya Shervarly/Ортогонализация Грама-Шмидта</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:Valeriya_Shervarly/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=13591"/>
		<updated>2016-10-23T22:48:20Z</updated>

		<summary type="html">&lt;p&gt;Valeriya Shervarly: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
Авторы описания: Шерварлы В.Г.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Процесс Грама-Шмидта - это алгоритм построения множества ортогональных (или ортонормированных) линейно-независимых векторов по исходному множеству векторов, при этом линейные оболочки получившегося и исходного множеств векторов совпадают. Иными словами, построение ортогонального базиса из векторов, образующих произвольный базис.&lt;br /&gt;
&lt;br /&gt;
Процесс Грама-Шмидта также можно рассматривать как разложение невырожденной квадратной матрицы в произведение унитарной (ортогональной) и верхнетреугольной матрицы с положительными диагональными элементами (QR-разложение).&lt;br /&gt;
&lt;br /&gt;
Задача построения или вычисления ортогонального базиса некоторого линейного подпространства или пространства часто является подзадачей более крупных широко используемых задач, так что ортогонализация Грама-Шмидта является важным и часто используемым алгоритмом в линейной алгебре.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Процесс ортогонализации описывается следующей последовательностью формул:&lt;br /&gt;
&lt;br /&gt;
:: &amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
b_1 &amp;amp; = a_1 \\&lt;br /&gt;
b_2 &amp;amp; = a_2 - \frac{&amp;lt;a_2, b_1&amp;gt;}{\|b_1\|^2} * b_1 \\&lt;br /&gt;
b_3 &amp;amp; = a_3 - \frac{&amp;lt;a_3, b_1&amp;gt;}{\|b_1\|^2} * b_1 - \frac{&amp;lt;a_3, b_2&amp;gt;}{\|b_2\|^2} * b_2 \\&lt;br /&gt;
... \\&lt;br /&gt;
b_n &amp;amp; = a_n - \frac{&amp;lt;a_n, b_1&amp;gt;}{\|b_1\|^2} * b_1 - ... - \frac{&amp;lt;a_n, b_{n-1}&amp;gt;}{\|b_{n-1}\|^2} * b_{n-1} \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где:&lt;br /&gt;
&amp;lt;math&amp;gt;a_1, ..., a_n &amp;lt;/math&amp;gt; - исходное множество линейно-независимых векторов &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;b_1, ..., b_n&amp;lt;/math&amp;gt; - множество искомых векторов&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;a,b&amp;gt;&amp;lt;/math&amp;gt; - скалярное произведение векторов&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\|b\| = \sqrt{&amp;lt;b,b&amp;gt;}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На уровне макроструктуры будем рассматривать &amp;lt;math&amp;gt;\frac{&amp;lt;a, b&amp;gt;}{\|b\|^2} * b&amp;lt;/math&amp;gt; как отдельную макрооперацию &amp;lt;math&amp;gt;proj_{b}a&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;proj_{b}a&amp;lt;/math&amp;gt;, определенных выше.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
 input: a = (a[1], ..., a[n])&lt;br /&gt;
 output: b = (b[1], ..., b[n])&lt;br /&gt;
&lt;br /&gt;
 b[1] = a[1]&lt;br /&gt;
 for j = 2,...,n&lt;br /&gt;
     b[j] = a[j]&lt;br /&gt;
     for k = 1,...,j-1&lt;br /&gt;
         b[j] = b[j] - &amp;lt;a[j],b[k]&amp;gt;/&amp;lt;b[k],b[k]&amp;gt;*b[k]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Последовательная сложность алгоритма выражается следующими формулами&lt;br /&gt;
(&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - количество векторов,&lt;br /&gt;
&amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество компонент вектора):&lt;br /&gt;
&lt;br /&gt;
* количество умножений: &amp;lt;math&amp;gt;\frac{3mn(n-1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* количество делений: &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* количество сложений и вычитаний: &amp;lt;math&amp;gt;\frac{n(n-1)(2m - 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Общая сложность алгоритма - &amp;lt;math&amp;gt;O(mn^2)&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_i, i=1, ..., n&amp;lt;/math&amp;gt; - операции присваивания &amp;lt;math&amp;gt;b_i = a_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;s_{ij} = b_i - proj_{b_j}a_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;a_i^{(*)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;f_{ij}&amp;lt;/math&amp;gt; отличаются от &amp;lt;math&amp;gt;a_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s_{ij}&amp;lt;/math&amp;gt; соответственно тем, что в этот момент завершается вычисление вектора &amp;lt;math&amp;gt;b_i&amp;lt;/math&amp;gt;, являющегося и частью выходных данных, и необходимой информацией для последующего этапа. Так же в этих вершинах можно вычислять величину &amp;lt;math&amp;gt;\|b_i\|^2&amp;lt;/math&amp;gt;, необходимую для вычисления соответствующих &amp;lt;math&amp;gt;proj_{b}a&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;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:CGS--infograph.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Возможно параллельное вычисление всех &amp;lt;math&amp;gt;proj_{b_j}a_i, i=1,...n&amp;lt;/math&amp;gt; для уже найденных &amp;lt;math&amp;gt;b_j&amp;lt;/math&amp;gt; вместо вычисления каждого вектора &amp;lt;math&amp;gt;b_j&amp;lt;/math&amp;gt; по очереди. Таким образом после каждой итерации будет получен один посчитанный вектор, необходимый для расчетов на следующей итерации. Однако степень распараллеливания будет падать на каждой итерации, что вместе с необходимостью синхронизации и многочисленными обменами информации может снизить эффективность распараллеливания.&lt;br /&gt;
&lt;br /&gt;
Сложность параллельного варианта равна &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - количество векторов, &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество компонент вектора. Можно сократить эту величину до &amp;lt;math&amp;gt;O(n\log{m})&amp;lt;/math&amp;gt;, если еще параллельно проводить вычисление каждой макрооперации &amp;lt;math&amp;gt;proj_{b}a&amp;lt;/math&amp;gt;, однако, опять же, не стоит забывать о расходах на синхронизацию и обмен информацией.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
N линейно независимых векторов (процесс Грама — Шмидта может применяться также к бесконечной последовательности линейно независимых векторов, а также к линейно зависимым векторам. В последнем случае вектор &amp;lt;math&amp;gt;a_j&amp;lt;/math&amp;gt; получится нулевым, если он зависит от векторов &amp;lt;math&amp;gt;a_1, ..., a_{j-1}&amp;lt;/math&amp;gt;, и алгоритм должен сразу отбрасывать нулевые векторы). Объем входных данных: &amp;lt;math&amp;gt;mN&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - количество векторов, &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество компонент вектора&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039;&lt;br /&gt;
N ортогональных векторов, линейная оболочка которых совпадает с линейной оболочкой входного множества векторов, объем выходных данных: &amp;lt;math&amp;gt;mN&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма: &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;. Отношение последовательной сложности к параллельной - &amp;lt;math&amp;gt;\frac{mn^2}{mn}&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;(&amp;lt;/math&amp;gt;или &amp;lt;math&amp;gt;\frac{mn^2}{n\log{m}})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Классический алгоритм (CGS) является численно-неустойчивым из-за частой потери ортогональности, вызванной ошибками округления в процессе вычислений.&lt;br /&gt;
&lt;br /&gt;
Существует модификации алгоритма Грама-Шмидта, которые являются более устойчивами, например, модифицированный алгоритм Грама-Шмидта (MGS), блочные и итеративные варианты CGS и MGS. MGS численно эквивалентен методу Хаусхолдера QR-разложения, примененного к матрице, полученной из исходной путем добавления к ней сверху прямоугольной матрицы из нулевых элементов.&lt;br /&gt;
&lt;br /&gt;
Как можно видеть на изображении информационного графа алгоритма, существуют вершины с большой степенью исхода. Эти вершины соответствуют (в том числе) вычислению вектора &amp;lt;math&amp;gt;b_i&amp;lt;/math&amp;gt; и результат этого вычисления должен быть сообщен всем вершинам, вычисляющим &amp;lt;math&amp;gt;proj_{b_i}a_j&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;j=1,..., n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* реализация для системы компьютерной алгебры [http://maxima.sourceforge.net/ maxima] (GNU GPL)&lt;br /&gt;
&lt;br /&gt;
 load(eigen);&lt;br /&gt;
 x: matrix ([-2,1,0],[-2,0,1],[-0.5,-1,1]);&lt;br /&gt;
 y: gramschmidt(x);&lt;br /&gt;
&lt;br /&gt;
* пример реализации для системы компьютерной алгебры [http://www.wolfram.com/mathematica/ mathematica] (проприетарное программное обеспечение)&lt;br /&gt;
&lt;br /&gt;
 Projection[v1_, v2_] := (v1.v2*v2)/v2.v2&lt;br /&gt;
 MultipleProjection[v1_, vecs_] := Plus @@ (Projection[v1, #1] &amp;amp;) /@ vecs&lt;br /&gt;
 GramSchmidt[mat_] := Fold[Join[#1, {Normalize[#2 - MultipleProjection[#2, #1]]}] &amp;amp;, {}, mat]&lt;br /&gt;
 GramSchmidt[{{-2, 1, 0}, {-2, 0, 1}, {-0.5, -1, 1}}]&lt;br /&gt;
&lt;br /&gt;
* библиотека [https://github.com/fplll/fplll fplll] &lt;br /&gt;
&lt;br /&gt;
* [http://numerics.mathdotnet.com/ Math.NET Numerics] &lt;br /&gt;
&lt;br /&gt;
* библиотека [https://www.nag.co.uk/ NAG] &lt;br /&gt;
&lt;br /&gt;
* библиотека [https://www.mcs.anl.gov/petsc/documentation/index.html PETSc] &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
# https://ru.wikipedia.org/wiki/Процесс_Грама_―_Шмидта&lt;br /&gt;
# Канатников А.Н., Крищенко А.П. &amp;quot;Линейная алгебра.&amp;quot;&lt;br /&gt;
# Å. Björck. &amp;quot;Numerics of Gram-Schmidt orthogonalization&amp;quot;&lt;br /&gt;
# B. Milde, M. Schneider. &amp;quot;Parallel Implementation of Classical Gram-Schmidt Orthogonalization on CUDA Graphics Cards&amp;quot;&lt;/div&gt;</summary>
		<author><name>Valeriya Shervarly</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:Valeriya_Shervarly/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=13479</id>
		<title>Участник:Valeriya Shervarly/Ортогонализация Грама-Шмидта</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:Valeriya_Shervarly/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=13479"/>
		<updated>2016-10-22T23:42:25Z</updated>

		<summary type="html">&lt;p&gt;Valeriya Shervarly: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Процесс Грама-Шмидта - это алгоритм построения множества ортогональных (или ортонормированных) линейно-независимых векторов по исходному множеству векторов, при этом линейные оболочки получившегося и исходного множеств векторов совпадают. Иными словами, построение ортогонального базиса из векторов, образующих произвольный базис.&lt;br /&gt;
&lt;br /&gt;
Процесс Грама-Шмидта также можно рассматривать как разложение невырожденной квадратной матрицы в произведение унитарной (ортогональной) и верхнетреугольной матрицы с положительными диагональными элементами (QR-разложение).&lt;br /&gt;
&lt;br /&gt;
Задача построения или вычисления ортогонального базиса некоторого линейного подпространства или пространства часто является подзадачей более крупных широко используемых задач, так что ортогонализация Грама-Шмидта является важным и часто используемым алгоритмом в линейной алгебре.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Процесс ортогонализации описывается следующей последовательностью формул:&lt;br /&gt;
&lt;br /&gt;
:: &amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
b_1 &amp;amp; = a_1 \\&lt;br /&gt;
b_2 &amp;amp; = a_2 - \frac{&amp;lt;a_2, b_1&amp;gt;}{\|b_1\|^2} * b_1 \\&lt;br /&gt;
b_3 &amp;amp; = a_3 - \frac{&amp;lt;a_3, b_1&amp;gt;}{\|b_1\|^2} * b_1 - \frac{&amp;lt;a_3, b_2&amp;gt;}{\|b_2\|^2} * b_2 \\&lt;br /&gt;
... \\&lt;br /&gt;
b_n &amp;amp; = a_n - \frac{&amp;lt;a_n, b_1&amp;gt;}{\|b_1\|^2} * b_1 - ... - \frac{&amp;lt;a_n, b_{n-1}&amp;gt;}{\|b_{n-1}\|^2} * b_{n-1} \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где:&lt;br /&gt;
&amp;lt;math&amp;gt;a_1, ..., a_n &amp;lt;/math&amp;gt; - исходное множество линейно-независимых векторов &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;b_1, ..., b_n&amp;lt;/math&amp;gt; - множество искомых векторов&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;a,b&amp;gt;&amp;lt;/math&amp;gt; - скалярное произведение векторов&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\|b\| = \sqrt{&amp;lt;b,b&amp;gt;}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На уровне макроструктуры будем рассматривать &amp;lt;math&amp;gt;\frac{&amp;lt;a, b&amp;gt;}{\|b\|^2} * b&amp;lt;/math&amp;gt; как отдельную макрооперацию &amp;lt;math&amp;gt;proj_{b}a&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;proj_{b}a&amp;lt;/math&amp;gt;, определенных выше.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
 input: a = (a[1], ..., a[n])&lt;br /&gt;
 output: b = (b[1], ..., b[n])&lt;br /&gt;
&lt;br /&gt;
 b[1] = a[1]&lt;br /&gt;
 for j = 2,...,n&lt;br /&gt;
     b[j] = a[j]&lt;br /&gt;
     for k = 1,...,j-1&lt;br /&gt;
         b[j] = b[j] - &amp;lt;a[j],b[k]&amp;gt;/&amp;lt;b[k],b[k]&amp;gt;*b[k]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Последовательная сложность выражается следующими формулами&lt;br /&gt;
(&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - количество векторов,&lt;br /&gt;
&amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество компонент вектора):&lt;br /&gt;
&lt;br /&gt;
* количество умножений: &amp;lt;math&amp;gt;\frac{3mn(n-1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* количество делений: &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* количество сложений и вычитаний: &amp;lt;math&amp;gt;\frac{n(n-1)(2m - 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Общая сложность алгоритма - &amp;lt;math&amp;gt;O(mn^2)&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_i, i=1, ..., n&amp;lt;/math&amp;gt; - операции присваивания &amp;lt;math&amp;gt;b_i = a_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;s_{ij} = b_i - proj_{b_j}a_i&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;a_i^{(*)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;f_{ij}&amp;lt;/math&amp;gt; отличаются от &amp;lt;math&amp;gt;a_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s_{ij}&amp;lt;/math&amp;gt; соответственно тем, что в этот момент завершается вычисление вектора &amp;lt;math&amp;gt;b_i&amp;lt;/math&amp;gt;, являющегося и частью выходных данных, и необходимой информацией для последующего этапа. Так же в этих вершинах можно вычислять величину &amp;lt;math&amp;gt;\|b_i\|^2&amp;lt;/math&amp;gt;, необходимую для вычисления соответствующих &amp;lt;math&amp;gt;proj_{b}a&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;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:CGS--infograph.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Возможно параллельное вычисление всех &amp;lt;math&amp;gt;proj_{b_j}a_i, i=1,...n&amp;lt;/math&amp;gt; для уже найденных &amp;lt;math&amp;gt;b_j&amp;lt;/math&amp;gt; вместо вычисления каждого вектора &amp;lt;math&amp;gt;b_j&amp;lt;/math&amp;gt; по очереди. Таким образом после каждой итерации будет получен один посчитанный вектор, необходимый для расчетов на следующей итерации. Однако степень распараллеливания будет падать на каждой итерации, что вместе с необходимостью синхронизации и многочисленными обменами информации может снизить эффективность распараллеливания.&lt;br /&gt;
&lt;br /&gt;
Сложность параллельного варианта равна &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - количество векторов, &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество компонент вектора. Можно сократить эту величину до &amp;lt;math&amp;gt;O(n\log{m})&amp;lt;/math&amp;gt;, если еще параллельно проводить вычисление каждой макрооперации &amp;lt;math&amp;gt;proj_{b}a&amp;lt;/math&amp;gt;, однако, опять же, не стоит забывать о расходах на синхронизацию и обмен информацией.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
N линейно независимых векторов (процесс Грама — Шмидта может применяться также к бесконечной последовательности линейно независимых векторов, а также к линейно зависимым векторам. В последнем случае вектор &amp;lt;math&amp;gt;a_j&amp;lt;/math&amp;gt; получится нулевым, если он зависит от векторов &amp;lt;math&amp;gt;a_1, ..., a_{j-1}&amp;lt;/math&amp;gt;, и алгоритм должен сразу отбрасывать нулевые векторы). Объем входных данных: &amp;lt;math&amp;gt;mN&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - количество векторов, &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество компонент вектора&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039;&lt;br /&gt;
N ортогональных векторов, линейная оболочка которых совпадает с линейной оболочкой входного множества векторов, объем выходных данных: &amp;lt;math&amp;gt;mN&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма: &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;. Отношение последовательной сложности к параллельной - &amp;lt;math&amp;gt;\frac{mn^2}{mn}&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;(&amp;lt;/math&amp;gt;или &amp;lt;math&amp;gt;\frac{mn^2}{n\log{m}})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Классический алгоритм (CGS) является численно-неустойчивым из-за частой потери ортогональности, вызванной ошибками округления в процессе вычислений.&lt;br /&gt;
&lt;br /&gt;
Существует модификации алгоритма Грама-Шмидта, которые являются более устойчивами, например, модифицированный алгоритм Грама-Шмидта (MGS), блочные и итеративные варианты CGS и MGS. MGS численно эквивалентен методу Хаусхолдера QR-разложения, примененного к матрице, полученной из исходной путем добавления к ней сверху прямоугольной матрицы из нулевых элементов.&lt;br /&gt;
&lt;br /&gt;
Как можно видеть на изображении информационного графа алгоритма, существуют вершины с большой степенью исхода. Эти вершины соответствуют (в том числе) вычислению вектора &amp;lt;math&amp;gt;b_i&amp;lt;/math&amp;gt; и результат этого вычисления должен быть сообщен всем вершинам, вычисляющим &amp;lt;math&amp;gt;proj_{b_i}a_j&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;j=1,..., n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* реализация для системы компьютерной алгебры [http://maxima.sourceforge.net/ maxima] (GNU GPL)&lt;br /&gt;
&lt;br /&gt;
 load(eigen);&lt;br /&gt;
 x: matrix ([-2,1,0],[-2,0,1],[-0.5,-1,1]);&lt;br /&gt;
 y: gramschmidt(x);&lt;br /&gt;
&lt;br /&gt;
* пример реализации для системы компьютерной алгебры [http://www.wolfram.com/mathematica/ mathematica] (проприетарное программное обеспечение)&lt;br /&gt;
&lt;br /&gt;
 Projection[v1_, v2_] := (v1.v2*v2)/v2.v2&lt;br /&gt;
 MultipleProjection[v1_, vecs_] := Plus @@ (Projection[v1, #1] &amp;amp;) /@ vecs&lt;br /&gt;
 GramSchmidt[mat_] := Fold[Join[#1, {Normalize[#2 - MultipleProjection[#2, #1]]}] &amp;amp;, {}, mat]&lt;br /&gt;
 GramSchmidt[{{-2, 1, 0}, {-2, 0, 1}, {-0.5, -1, 1}}]&lt;br /&gt;
&lt;br /&gt;
* библиотека [https://github.com/fplll/fplll fplll] &lt;br /&gt;
&lt;br /&gt;
* [http://numerics.mathdotnet.com/ Math.NET Numerics] &lt;br /&gt;
&lt;br /&gt;
* библиотека [https://www.nag.co.uk/ NAG] &lt;br /&gt;
&lt;br /&gt;
* библиотека [https://www.mcs.anl.gov/petsc/documentation/index.html PETSc] &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
# https://ru.wikipedia.org/wiki/Процесс_Грама_―_Шмидта&lt;br /&gt;
# Канатников А.Н., Крищенко А.П. &amp;quot;Линейная алгебра.&amp;quot;&lt;br /&gt;
# Å. Björck. &amp;quot;Numerics of Gram-Schmidt orthogonalization&amp;quot;&lt;/div&gt;</summary>
		<author><name>Valeriya Shervarly</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:Valeriya_Shervarly/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=13403</id>
		<title>Участник:Valeriya Shervarly/Ортогонализация Грама-Шмидта</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:Valeriya_Shervarly/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=13403"/>
		<updated>2016-10-22T00:15:33Z</updated>

		<summary type="html">&lt;p&gt;Valeriya Shervarly: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Процесс Грама-Шмидта - это алгоритм построения множества ортогональных (или ортонормированных) линейно-независимых векторов по исходному множеству векторов, при этом линейные оболочки получившегося и исходного множеств векторов совпадают. Иными словами, построение ортогонального базиса из векторов, образующих произвольный базис.&lt;br /&gt;
&lt;br /&gt;
Процесс Грама-Шмидта также можно рассматривать как разложение невырожденной квадратной матрицы в произведение унитарной (ортогональной) и верхнетреугольной матрицы с положительными диагональными элементами (QR-разложение).&lt;br /&gt;
&lt;br /&gt;
Задача построения или вычисления ортогонального базиса некоторого линейного подпространства или пространства часто является подзадачей более крупных широко используемых задач, так что ортогонализация Грама-Шмидта является важным и часто используемым алгоритмом в линейной алгебре.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Процесс ортогонализации описывается следующей последовательностью формул:&lt;br /&gt;
&lt;br /&gt;
:: &amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
b_1 &amp;amp; = a_1 \\&lt;br /&gt;
b_2 &amp;amp; = a_2 - \frac{&amp;lt;a_2, b_1&amp;gt;}{\|b_1\|^2} * b_1 \\&lt;br /&gt;
b_3 &amp;amp; = a_3 - \frac{&amp;lt;a_3, b_1&amp;gt;}{\|b_1\|^2} * b_1 - \frac{&amp;lt;a_3, b_2&amp;gt;}{\|b_2\|^2} * b_2 \\&lt;br /&gt;
... \\&lt;br /&gt;
b_n &amp;amp; = a_n - \frac{&amp;lt;a_n, b_1&amp;gt;}{\|b_1\|^2} * b_1 - ... - \frac{&amp;lt;a_n, b_{n-1}&amp;gt;}{\|b_{n-1}\|^2} * b_{n-1} \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где:&lt;br /&gt;
&amp;lt;math&amp;gt;a_1, ..., a_n &amp;lt;/math&amp;gt; - исходное множество линейно-независимых векторов &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;b_1, ..., b_n&amp;lt;/math&amp;gt; - множество искомых векторов&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;a,b&amp;gt;&amp;lt;/math&amp;gt; - скалярное произведение векторов&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\|b\| = \sqrt{&amp;lt;b,b&amp;gt;}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На уровне макроструктуры будем рассматривать &amp;lt;math&amp;gt;\frac{&amp;lt;a, b&amp;gt;}{\|b\|^2} * b&amp;lt;/math&amp;gt; как отдельную макрооперацию &amp;lt;math&amp;gt;proj_{b}a&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;proj_{b}a&amp;lt;/math&amp;gt;, определенных выше.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
 input: a = (a[1], ..., a[n])&lt;br /&gt;
 output: b = (b[1], ..., b[n])&lt;br /&gt;
&lt;br /&gt;
 b[1] = a[1]&lt;br /&gt;
 for j = 2,...,n&lt;br /&gt;
     b[j] = a[j]&lt;br /&gt;
     for k = 1,...,j-1&lt;br /&gt;
         b[j] = b[j] - &amp;lt;a[j],b[k]&amp;gt;/&amp;lt;b[k],b[k]&amp;gt;*b[k]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Последовательная сложность выражается следующими формулами&lt;br /&gt;
(&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - количество векторов,&lt;br /&gt;
&amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество компонент вектора):&lt;br /&gt;
&lt;br /&gt;
* количество умножений: &amp;lt;math&amp;gt;\frac{3mn(n-1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* количество делений: &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* количество сложений и вычитаний: &amp;lt;math&amp;gt;\frac{n(n-1)(2m - 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Общая сложность алгоритма - &amp;lt;math&amp;gt;O(mn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Возможно параллельное вычисление всех &amp;lt;math&amp;gt;proj_{b_j}a_i, i=1,...n&amp;lt;/math&amp;gt; для уже найденных &amp;lt;math&amp;gt;b_j&amp;lt;/math&amp;gt; вместо вычисления каждого вектора &amp;lt;math&amp;gt;b_j&amp;lt;/math&amp;gt; по очереди. Таким образом после каждой итерации будет получен один посчитанный вектор, необходимый для расчетов на следующей итерации. Однако степень распараллеливания будет падать на каждой итерации, что вместе с необходимостью синхронизации и многочисленными обменами информации может снизить эффективность распараллеливания.&lt;br /&gt;
&lt;br /&gt;
Сложность параллельного варианта равна &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - количество векторов, &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество компонент вектора. Можно сократить эту величину до &amp;lt;math&amp;gt;O(n\log{m})&amp;lt;/math&amp;gt;, если еще параллельно проводить вычисление каждой макрооперации &amp;lt;math&amp;gt;proj_{b}a&amp;lt;/math&amp;gt;, однако, опять же, не стоит забывать о расходах на синхронизацию и обмен информацией.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
N линейно независимых векторов (процесс Грама — Шмидта может применяться также к бесконечной последовательности линейно независимых векторов, а также к линейно зависимым векторам. В последнем случае вектор &amp;lt;math&amp;gt;a_j&amp;lt;/math&amp;gt; получится нулевым, если он зависит от векторов &amp;lt;math&amp;gt;a_1, ..., a_{j-1}&amp;lt;/math&amp;gt;, и алгоритм должен сразу отбрасывать нулевые векторы). Объем входных данных: &amp;lt;math&amp;gt;mN&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - количество векторов, &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество компонент вектора&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039;&lt;br /&gt;
N ортогональных векторов, линейная оболочка которых совпадает с линейной оболочкой входного множества векторов, объем выходных данных: &amp;lt;math&amp;gt;mN&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма: &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;. Отношение последовательной сложности к параллельной - &amp;lt;math&amp;gt;\frac{mn^2}{mn}&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;(&amp;lt;/math&amp;gt;или &amp;lt;math&amp;gt;\frac{mn^2}{n\log{m}})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Классический алгоритм (CGS) является численно-неустойчивым из-за частой потери ортогональности, вызванной ошибками округления в процессе вычислений.&lt;br /&gt;
&lt;br /&gt;
Существует модификации алгоритма Грама-Шмидта, которые являются более устойчивами, например, модифицированный алгоритм Грама-Шмидта (MGS), блочные и итеративные варианты CGS и MGS. MGS численно эквивалентен методу Хаусхолдера QR-разложения, примененного к матрице, полученной из исходной путем добавления к ней сверху прямоугольной матрицы из нулевых элементов.&lt;br /&gt;
&lt;br /&gt;
Как можно видеть на изображении информационного графа алгоритма, существуют вершины с большой степенью исхода. Эти вершины соответствуют (в том числе) вычислению вектора &amp;lt;math&amp;gt;b_i&amp;lt;/math&amp;gt; и результат этого вычисления должен быть сообщен всем вершинам, вычисляющим &amp;lt;math&amp;gt;proj_{b_i}a_j&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;j=1,..., n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* реализация для системы компьютерной алгебры [http://maxima.sourceforge.net/ maxima] (GNU GPL)&lt;br /&gt;
&lt;br /&gt;
 load(eigen);&lt;br /&gt;
 x: matrix ([-2,1,0],[-2,0,1],[-0.5,-1,1]);&lt;br /&gt;
 y: gramschmidt(x);&lt;br /&gt;
&lt;br /&gt;
* пример реализации для системы компьютерной алгебры [http://www.wolfram.com/mathematica/ mathematica] (проприетарное программное обеспечение)&lt;br /&gt;
&lt;br /&gt;
 Projection[v1_, v2_] := (v1.v2*v2)/v2.v2&lt;br /&gt;
 MultipleProjection[v1_, vecs_] := Plus @@ (Projection[v1, #1] &amp;amp;) /@ vecs&lt;br /&gt;
 GramSchmidt[mat_] := Fold[Join[#1, {Normalize[#2 - MultipleProjection[#2, #1]]}] &amp;amp;, {}, mat]&lt;br /&gt;
 GramSchmidt[{{-2, 1, 0}, {-2, 0, 1}, {-0.5, -1, 1}}]&lt;br /&gt;
&lt;br /&gt;
* библиотека [https://github.com/fplll/fplll fplll] &lt;br /&gt;
&lt;br /&gt;
* [http://numerics.mathdotnet.com/ Math.NET Numerics] &lt;br /&gt;
&lt;br /&gt;
* библиотека [https://www.nag.co.uk/ NAG] &lt;br /&gt;
&lt;br /&gt;
* библиотека [https://www.mcs.anl.gov/petsc/documentation/index.html PETSc] &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
# https://ru.wikipedia.org/wiki/Процесс_Грама_―_Шмидта&lt;br /&gt;
#&lt;/div&gt;</summary>
		<author><name>Valeriya Shervarly</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:Valeriya_Shervarly/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=13320</id>
		<title>Участник:Valeriya Shervarly/Ортогонализация Грама-Шмидта</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:Valeriya_Shervarly/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=13320"/>
		<updated>2016-10-21T12:29:00Z</updated>

		<summary type="html">&lt;p&gt;Valeriya Shervarly: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Процесс Грама-Шмидта - это алгоритм построения множества ортогональных (или ортонормированных) линейно-независимых векторов по исходному множеству векторов, при этом линейные оболочки получившегося и исходного множеств векторов совпадают. Иными словами, построение ортогонального базиса из векторов, образующих произвольный базис.&lt;br /&gt;
&lt;br /&gt;
Процесс Грама-Шмидта также можно рассматривать как разложение невырожденной квадратной матрицы в произведение унитарной (ортогональной) и верхнетреугольной матрицы с положительными диагональными элементами (QR-разложение).&lt;br /&gt;
&lt;br /&gt;
Задача построения или вычисления ортогонального базиса некоторого линейного подпространства или пространства часто является подзадачей более крупных широко используемых задач, так что ортогонализация Грама-Шмидта является важным и часто используемым алгоритмом в линейной алгебре.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Процесс ортогонализации описывается следующей последовательностью формул:&lt;br /&gt;
&lt;br /&gt;
:: &amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
b_1 &amp;amp; = a_1 \\&lt;br /&gt;
b_2 &amp;amp; = a_2 - \frac{&amp;lt;a_2, b_1&amp;gt;}{\|b_1\|^2} * b_1 \\&lt;br /&gt;
b_3 &amp;amp; = a_3 - \frac{&amp;lt;a_3, b_1&amp;gt;}{\|b_1\|^2} * b_1 - \frac{&amp;lt;a_3, b_2&amp;gt;}{\|b_2\|^2} * b_2 \\&lt;br /&gt;
... \\&lt;br /&gt;
b_n &amp;amp; = a_n - \frac{&amp;lt;a_n, b_1&amp;gt;}{\|b_1\|^2} * b_1 - ... - \frac{&amp;lt;a_n, b_{n-1}&amp;gt;}{\|b_{n-1}\|^2} * b_{n-1} \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где:&lt;br /&gt;
&amp;lt;math&amp;gt;a_1, ..., a_n &amp;lt;/math&amp;gt; - исходное множество линейно-независимых векторов &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;b_1, ..., b_n&amp;lt;/math&amp;gt; - множество искомых векторов&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;a,b&amp;gt;&amp;lt;/math&amp;gt; - скалярное произведение векторов&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\|b\| = \sqrt{&amp;lt;b,b&amp;gt;}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На уровне макроструктуры будем рассматривать &amp;lt;math&amp;gt;\frac{&amp;lt;a, b&amp;gt;}{\|b\|^2} * b&amp;lt;/math&amp;gt; как отдельную макрооперацию &amp;lt;math&amp;gt;proj_{b}a&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;proj_{b}a&amp;lt;/math&amp;gt;, определенных выше.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
 input: a = (a[1], ..., a[n])&lt;br /&gt;
 output: b = (b[1], ..., b[n])&lt;br /&gt;
&lt;br /&gt;
 b[1] = a[1]&lt;br /&gt;
 for j = 2,...,n&lt;br /&gt;
     b[j] = a[j]&lt;br /&gt;
     for k = 1,...,j-1&lt;br /&gt;
         b[j] = b[j] - &amp;lt;a[j],b[k]&amp;gt;/&amp;lt;b[k],b[k]&amp;gt;*b[k]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Последовательная сложность выражается следующими формулами&lt;br /&gt;
(&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - количество векторов,&lt;br /&gt;
&amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; - количество компонент вектора):&lt;br /&gt;
&lt;br /&gt;
* количество умножений: &amp;lt;math&amp;gt;\frac{3mn(n-1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* количество делений: &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* количество сложений и вычитаний: &amp;lt;math&amp;gt;\frac{n(n-1)(2m - 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Общая сложность алгоритма - &amp;lt;math&amp;gt;O(mn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Возможно параллельное вычисление всех &amp;lt;math&amp;gt;proj_{b_j}a_i, i=1,...n&amp;lt;/math&amp;gt; для уже найденных &amp;lt;math&amp;gt;b_j&amp;lt;/math&amp;gt; вместо вычисления каждого вектора &amp;lt;math&amp;gt;b_j&amp;lt;/math&amp;gt; по очереди. Таким образом после каждой итерации будет получен один посчитанный вектор, необходимый для расчетов на следующей итерации. Однако степень распараллеливания будет падать на каждой итерации, что вместе с необходимостью синхронизации и многочисленными обменами информации может снизить эффективность распараллеливания.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
N линейно независимых векторов (процесс Грама — Шмидта может применяться также к бесконечной последовательности линейно независимых векторов, а также к линейно зависимым векторам. В последнем случае вектор &amp;lt;math&amp;gt;a_j&amp;lt;/math&amp;gt; получится нулевым, если он зависит от векторов &amp;lt;math&amp;gt;a_1, ..., a_{j-1}&amp;lt;/math&amp;gt;, и алгоритм должен сразу отбрасывать нулевые векторы)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039;&lt;br /&gt;
N ортогональных векторов, линейная оболочка которых совпадает с линейной оболочкой входного множества векторов.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Классический алгоритм (CGS) является численно-неустойчивым из-за частой потери ортогональности, вызванной ошибками округления в процессе вычислений.&lt;br /&gt;
&lt;br /&gt;
Существует модификации алгоритма Грама-Шмидта, которые являются более устойчивами, например, модифицированный алгоритм Грама-Шмидта (MGS), блочные и итеративные варианты CGS и MGS. MGS численно эквивалентен методу Хаусхолдера QR-разложения, примененного к матрице, полученной из исходной путем добавления к ней сверху прямоугольной матрицы из нулевых элементов.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* реализация для системы компьютерной алгебры [http://maxima.sourceforge.net/ maxima] (GNU GPL)&lt;br /&gt;
&lt;br /&gt;
 load(eigen);&lt;br /&gt;
 x: matrix ([-2,1,0],[-2,0,1],[-0.5,-1,1]);&lt;br /&gt;
 y: gramschmidt(x);&lt;br /&gt;
&lt;br /&gt;
* пример реализации для системы компьютерной алгебры [http://www.wolfram.com/mathematica/ mathematica] (проприетарное программное обеспечение)&lt;br /&gt;
&lt;br /&gt;
 Projection[v1_, v2_] := (v1.v2*v2)/v2.v2&lt;br /&gt;
 MultipleProjection[v1_, vecs_] := Plus @@ (Projection[v1, #1] &amp;amp;) /@ vecs&lt;br /&gt;
 GramSchmidt[mat_] := Fold[Join[#1, {Normalize[#2 - MultipleProjection[#2, #1]]}] &amp;amp;, {}, mat]&lt;br /&gt;
 GramSchmidt[{{-2, 1, 0}, {-2, 0, 1}, {-0.5, -1, 1}}]&lt;br /&gt;
&lt;br /&gt;
* библиотека [https://github.com/fplll/fplll fplll] (функция GSO) (GNU LESSER GENERAL PUBLIC LICENSE)&lt;br /&gt;
&lt;br /&gt;
* [http://numerics.mathdotnet.com/ Math.NET Numerics] (функция MathNet.Numerics.LinearAlgebra.Factorization.GramSchmidt&amp;lt;T&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
* библиотека [https://www.nag.co.uk/ NAG] ([http://www.nag.co.uk/numeric/Fl/manual/pdf/F05/f05aaf.pdf F05AAF])&lt;br /&gt;
&lt;br /&gt;
* библиотека [https://www.mcs.anl.gov/petsc/documentation/index.html PETSc] (KSPGMRESClassicalGramSchmidtOrthogonalization)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
# https://ru.wikipedia.org/wiki/Процесс_Грама_―_Шмидта&lt;br /&gt;
#&lt;/div&gt;</summary>
		<author><name>Valeriya Shervarly</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:Valeriya_Shervarly/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=13158</id>
		<title>Участник:Valeriya Shervarly/Ортогонализация Грама-Шмидта</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:Valeriya_Shervarly/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=13158"/>
		<updated>2016-10-19T03:40:14Z</updated>

		<summary type="html">&lt;p&gt;Valeriya Shervarly: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Процесс Грама-Шмидта - это алгоритм построения множества ортогональных (или ортонормированных) линейно-независимых векторов по исходному множеству векторов, при этом линейные оболочки получившегося и исходного множеств векторов совпадают. Иными словами, построение ортогонального базиса из векторов, образующих произвольный базис.&lt;br /&gt;
&lt;br /&gt;
Процесс Грама-Шмидта также можно рассматривать как разложение невырожденной квадратной матрицы в произведение унитарной (ортогональной) и верхнетреугольной матрицы с положительными диагональными элементами (QR-разложение).&lt;br /&gt;
&lt;br /&gt;
Задача построения или вычисления ортогонального базиса некоторого линейного подпространства или пространства часто является подзадачей более крупных широко используемых задач, так что ортогонализация Грама-Шмидта является важным и часто используемым алгоритмом в линейной алгебре.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Процесс ортогонализации описывается следующей последовательностью формул:&lt;br /&gt;
&lt;br /&gt;
:: &amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
b_1 &amp;amp; = a_1 \\&lt;br /&gt;
b_2 &amp;amp; = a_2 - \frac{&amp;lt;a_2, b_1&amp;gt;}{\|b_1\|^2} * b_1 \\&lt;br /&gt;
b_3 &amp;amp; = a_3 - \frac{&amp;lt;a_3, b_1&amp;gt;}{\|b_1\|^2} * b_1 - \frac{&amp;lt;a_3, b_2&amp;gt;}{\|b_2\|^2} * b_2 \\&lt;br /&gt;
... \\&lt;br /&gt;
b_n &amp;amp; = a_n - \frac{&amp;lt;a_n, b_1&amp;gt;}{\|b_1\|^2} * b_1 - ... - \frac{&amp;lt;a_n, b_{n-1}&amp;gt;}{\|b_{n-1}\|^2} * b_{n-1} \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где:&lt;br /&gt;
&amp;lt;math&amp;gt;a_1, ..., a_n &amp;lt;/math&amp;gt; - исходное множество линейно-независимых векторов &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;b_1, ..., b_n&amp;lt;/math&amp;gt; - множество искомых векторов&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;a,b&amp;gt;&amp;lt;/math&amp;gt; - скалярное произведение векторов&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\|b\| = \sqrt{&amp;lt;b,b&amp;gt;}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром алгоритма является весь алгоритм (за исключением инициализации первого вектора ортогонального базиса &amp;lt;math&amp;gt;b_1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На уровне макроструктуры будем рассматривать &amp;lt;math&amp;gt;\frac{&amp;lt;a, b&amp;gt;}{\|b\|^2} * b&amp;lt;/math&amp;gt; как отдельную макрооперацию &amp;lt;math&amp;gt;proj_{b}a&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
 input: a = (a[1], ..., a[n])&lt;br /&gt;
 output: b = (b[1], ..., b[n])&lt;br /&gt;
&lt;br /&gt;
 b[1] = a[1]&lt;br /&gt;
 for j = 2,...,n&lt;br /&gt;
     b[j] = a[j]&lt;br /&gt;
     for k = 1,...,j-1&lt;br /&gt;
         b[j] = b[j] - &amp;lt;a[j],b[k]&amp;gt;/&amp;lt;b[k],b[k]&amp;gt;*b[k]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Сложность алгоритма - &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Возможно параллельное вычисление всех &amp;lt;math&amp;gt;proj_{b_j}a_i, i=1,...n&amp;lt;/math&amp;gt; для уже найденных &amp;lt;math&amp;gt;b_j&amp;lt;/math&amp;gt; вместо вычисления каждого вектора &amp;lt;math&amp;gt;b_j&amp;lt;/math&amp;gt; по очереди. Таким образом после каждой итерации будет получен один посчитанный вектор, необходимый для расчетов на следующей итерации. Однако степень распараллеливания будет падать на каждой итерации, что вместе с необходимостью синхронизации и многочисленными обменами информации может снизить эффективность распараллеливания.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
N линейно независимых векторов (процесс Грама — Шмидта может применяться также к бесконечной последовательности линейно независимых векторов, а также к линейно зависимым векторам. В последнем случае вектор &amp;lt;math&amp;gt;a_j&amp;lt;/math&amp;gt; получится нулевым, если он зависит от векторов &amp;lt;math&amp;gt;a_1, ..., a_{j-1}&amp;lt;/math&amp;gt;, и алгоритм должен сразу отбрасывать нулевые векторы)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039;&lt;br /&gt;
N ортогональных векторов, линейная оболочка которых совпадает с линейной оболочкой входного множества векторов.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Классический алгоритм (CGS) является численно-неустойчивым из-за частой потери ортогональности, вызванной ошибками округления в процессе вычислений.&lt;br /&gt;
&lt;br /&gt;
Существует модификации алгоритма Грама-Шмидта, которые являются более устойчивами, например, модифицированный алгоритм Грама-Шмидта (MGS), блочные и итеративные варианты CGS и MGS. MGS численно эквивалентен методу Хаусхолдера QR-разложения, примененного к матрице, полученной из исходной путем добавления к ней сверху прямоугольной матрицы из нулевых элементов.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Алгоритм является детерминированным.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* реализация для системы компьютерной алгебры [http://maxima.sourceforge.net/ maxima] (GNU GPL)&lt;br /&gt;
&lt;br /&gt;
 load(eigen);&lt;br /&gt;
 x: matrix ([-2,1,0],[-2,0,1],[-0.5,-1,1]);&lt;br /&gt;
 y: gramschmidt(x);&lt;br /&gt;
&lt;br /&gt;
* пример реализации для системы компьютерной алгебры [http://www.wolfram.com/mathematica/ mathematica] (проприетарное программное обеспечение)&lt;br /&gt;
&lt;br /&gt;
 Projection[v1_, v2_] := (v1.v2*v2)/v2.v2&lt;br /&gt;
 MultipleProjection[v1_, vecs_] := Plus @@ (Projection[v1, #1] &amp;amp;) /@ vecs&lt;br /&gt;
 GramSchmidt[mat_] := Fold[Join[#1, {Normalize[#2 - MultipleProjection[#2, #1]]}] &amp;amp;, {}, mat]&lt;br /&gt;
 GramSchmidt[{{-2, 1, 0}, {-2, 0, 1}, {-0.5, -1, 1}}]&lt;br /&gt;
&lt;br /&gt;
* библиотека [https://github.com/fplll/fplll fplll] (функция GSO) (GNU LESSER GENERAL PUBLIC LICENSE)&lt;br /&gt;
&lt;br /&gt;
* [http://numerics.mathdotnet.com/ Math.NET Numerics] (функция MathNet.Numerics.LinearAlgebra.Factorization.GramSchmidt&amp;lt;T&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
* библиотека [https://www.nag.co.uk/ NAG] ([http://www.nag.co.uk/numeric/Fl/manual/pdf/F05/f05aaf.pdf F05AAF])&lt;br /&gt;
&lt;br /&gt;
* библиотека [https://www.mcs.anl.gov/petsc/documentation/index.html PETSc] (KSPGMRESClassicalGramSchmidtOrthogonalization)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
# https://ru.wikipedia.org/wiki/Процесс_Грама_―_Шмидта&lt;br /&gt;
#&lt;/div&gt;</summary>
		<author><name>Valeriya Shervarly</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:Valeriya_Shervarly/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=12866</id>
		<title>Участник:Valeriya Shervarly/Ортогонализация Грама-Шмидта</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:Valeriya_Shervarly/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=12866"/>
		<updated>2016-10-16T21:18:08Z</updated>

		<summary type="html">&lt;p&gt;Valeriya Shervarly: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Процесс Грама-Шмидта - это алгоритм построения множества ортогональных (или ортонормированных) линейно-независимых векторов по исходному множеству векторов, при этом линейные оболочки получившегося и исходного множеств векторов совпадают.&lt;br /&gt;
&lt;br /&gt;
Процесс Грама ― Шмидта также можно рассматривать как разложение невырожденной квадратной матрицы в произведение ортогональной и верхнетреугольной матрицы с положительными диагональными элементами (QR-разложение).&lt;br /&gt;
&lt;br /&gt;
Задача построения или вычисления ортогонального базиса некоторого линейного подпространства или пространства часто является подзадачей более крупных широко используемых задач, так что ортогонализация Грама-Шмидта является важным алгоритмом в линейной алгебре.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
:: &amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
b_1 &amp;amp; = a_1 \\&lt;br /&gt;
b_2 &amp;amp; = a_2 - \frac{&amp;lt;a_2, b_1&amp;gt;}{\|b_1\|^2} * b_1 \\&lt;br /&gt;
b_3 &amp;amp; = a_3 - \frac{&amp;lt;a_3, b_1&amp;gt;}{\|b_1\|^2} * b_1 - \frac{&amp;lt;a_3, b_2&amp;gt;}{\|b_2\|^2} * b_2 \\&lt;br /&gt;
... \\&lt;br /&gt;
b_n &amp;amp; = a_n - \frac{&amp;lt;a_n, b_1&amp;gt;}{\|b_1\|^2} * b_1 - ... - \frac{&amp;lt;a_n, b_{n-1}&amp;gt;}{\|b_{n-1}\|^2} * b_{n-1} \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где:&lt;br /&gt;
&amp;lt;math&amp;gt;a_1, ..., a_n &amp;lt;/math&amp;gt; - множество исходных векторов &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;b_1, ..., b_n&amp;lt;/math&amp;gt; - множество искомых векторов&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&amp;lt;a,b&amp;gt;&amp;lt;/math&amp;gt; - скалярное произведение векторов&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\|b\| = \sqrt{&amp;lt;b,b&amp;gt;}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром алгоритма является весь алгоритм (за исключением инициализации первого вектора ортогонального базиса &amp;lt;math&amp;gt;b_1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На уровне макроструктуры будем рассматривать &amp;lt;math&amp;gt;\frac{&amp;lt;a, b&amp;gt;}{\|b\|^2} * b&amp;lt;/math&amp;gt; как отдельную макрооперацию &amp;lt;math&amp;gt;proj_{b}a&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
 input: a&lt;br /&gt;
 output: b&lt;br /&gt;
&lt;br /&gt;
 for j = 1,...,n&lt;br /&gt;
     b[j] = a[j]&lt;br /&gt;
     for k = 1,...,j-1&lt;br /&gt;
         b[j] = b[j] - &amp;lt;a[j],b[k]&amp;gt;/&amp;lt;b[k],b[k]&amp;gt;*b[k]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Сложность алгоритма - &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Возможно параллельное вычисление всех &amp;lt;math&amp;gt;proj_{b_j}a_i, i=1,...n&amp;lt;/math&amp;gt; для уже найденных &amp;lt;math&amp;gt;b_j&amp;lt;/math&amp;gt; вместо вычисления каждого вектора &amp;lt;math&amp;gt;b_j&amp;lt;/math&amp;gt; по очереди. Таким образом после каждой итерации будет получен один посчитанный вектор, необходимый для расчетов на следующей итерации. Однако степень распараллеливания будет падать на каждой итерации, что вместе с необходимостью синхронизации и многочисленными обменами информации может снизить эффективность распараллеливания.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
N линейно независимых векторов (процесс Грама — Шмидта может применяться также к бесконечной последовательности линейно независимых векторов, а также к линейно зависимым векторам. В последнем случае вектор &amp;lt;math&amp;gt;a_j&amp;lt;/math&amp;gt; получится нулевым, если он зависит от векторов &amp;lt;math&amp;gt;a_1, ..., a_{j-1}&amp;lt;/math&amp;gt;, и алгоритм должен сразу отбрасывать нулевые векторы)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039;&lt;br /&gt;
N ортогональных векторов, линейная оболочка которых совпадает с линейной оболочкой входного множества векторов.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм является численно-неустойчивым из-за частой потери ортогональности, вызванной ошибками округления в процессе вычислений.&lt;br /&gt;
Существует модификация алгоритма Грама-Шмидта, которая является более устойчивой (MGS).&lt;br /&gt;
&lt;br /&gt;
Алгоритм является детерминированным.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* реализация для системы компьютерной алгебры [http://maxima.sourceforge.net/ maxima] (GNU GPL)&lt;br /&gt;
&lt;br /&gt;
 load(eigen);&lt;br /&gt;
 x: matrix ([-2,1,0],[-2,0,1],[-0.5,-1,1]);&lt;br /&gt;
 y: gramschmidt(x);&lt;br /&gt;
&lt;br /&gt;
* пример реализации для системы компьютерной алгебры [http://www.wolfram.com/mathematica/ mathematica] (проприетарное программное обеспечение)&lt;br /&gt;
&lt;br /&gt;
 Projection[v1_, v2_] := (v1.v2*v2)/v2.v2&lt;br /&gt;
 MultipleProjection[v1_, vecs_] := Plus @@ (Projection[v1, #1] &amp;amp;) /@ vecs&lt;br /&gt;
 GramSchmidt[mat_] := Fold[Join[#1, {Normalize[#2 - MultipleProjection[#2, #1]]}] &amp;amp;, {}, mat]&lt;br /&gt;
 GramSchmidt[{{-2, 1, 0}, {-2, 0, 1}, {-0.5, -1, 1}}]&lt;br /&gt;
&lt;br /&gt;
* библиотека [https://github.com/fplll/fplll fplll] (функция GSO) (GNU LESSER GENERAL PUBLIC LICENSE)&lt;br /&gt;
&lt;br /&gt;
* [http://numerics.mathdotnet.com/ Math.NET Numerics] (функция MathNet.Numerics.LinearAlgebra.Factorization.GramSchmidt&amp;lt;T&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
* библиотека [https://www.nag.co.uk/ NAG] ([http://www.nag.co.uk/numeric/Fl/manual/pdf/F05/f05aaf.pdf F05AAF])&lt;br /&gt;
&lt;br /&gt;
* библиотека [https://www.mcs.anl.gov/petsc/documentation/index.html PETSc] (KSPGMRESClassicalGramSchmidtOrthogonalization)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
# https://ru.wikipedia.org/wiki/Процесс_Грама_―_Шмидта&lt;br /&gt;
#&lt;/div&gt;</summary>
		<author><name>Valeriya Shervarly</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:Valeriya_Shervarly&amp;diff=7853</id>
		<title>Участник:Valeriya Shervarly</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:Valeriya_Shervarly&amp;diff=7853"/>
		<updated>2016-10-14T17:50:38Z</updated>

		<summary type="html">&lt;p&gt;Valeriya Shervarly: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Участник:Valeriya_Shervarly/Ортогонализация_Грама-Шмидта|Ортогонализация Грама-Шмидта]]&lt;/div&gt;</summary>
		<author><name>Valeriya Shervarly</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:Valeriya_Shervarly/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=7847</id>
		<title>Участник:Valeriya Shervarly/Ортогонализация Грама-Шмидта</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:Valeriya_Shervarly/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=7847"/>
		<updated>2016-10-14T17:48:09Z</updated>

		<summary type="html">&lt;p&gt;Valeriya Shervarly: Новая страница: «Ортогонализация Грама-Шмидта»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ортогонализация Грама-Шмидта&lt;/div&gt;</summary>
		<author><name>Valeriya Shervarly</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:Valeriya_Shervarly&amp;diff=7840</id>
		<title>Участник:Valeriya Shervarly</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:Valeriya_Shervarly&amp;diff=7840"/>
		<updated>2016-10-14T17:45:56Z</updated>

		<summary type="html">&lt;p&gt;Valeriya Shervarly: Полностью удалено содержимое страницы&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Valeriya Shervarly</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:Valeriya_Shervarly&amp;diff=7837</id>
		<title>Участник:Valeriya Shervarly</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:Valeriya_Shervarly&amp;diff=7837"/>
		<updated>2016-10-14T17:43:19Z</updated>

		<summary type="html">&lt;p&gt;Valeriya Shervarly: Новая страница: «Ортогонализация Грама-Шмидта»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Ортогонализация Грама-Шмидта]]&lt;/div&gt;</summary>
		<author><name>Valeriya Shervarly</name></author>
	</entry>
</feed>