<?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=Lonalone</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=Lonalone"/>
	<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/Lonalone"/>
	<updated>2026-10-22T22:08:27Z</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26783</id>
		<title>Участник:Lonalone/Генерация гауссовского вектора методом линейных преобразований</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26783"/>
		<updated>2018-12-08T06:54:40Z</updated>

		<summary type="html">&lt;p&gt;Lonalone: /* Генерация случайного вектора Y */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор описания: &#039;&#039;Меньших И. М.&#039;&#039;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из многомерных распределений особый интерес представляет нормальное. Этому закону подчиняются все результаты воздействия большого числа случайных факторов, среди которых нет превалирующих.&lt;br /&gt;
&lt;br /&gt;
В статье приведен алгоритм генерации n-мерного гауссовского случайного вектора с помощью &#039;&#039;метода линейных преобразований&#039;&#039;&amp;lt;ref name=&amp;quot;V&amp;quot;&amp;gt;Михайлов Г.А., Войтишек А.В. Численное статистическое моделирование. Методы Монте-Карло — М.: Академия, 2006. — 368 с.&amp;lt;/ref&amp;gt;. Известно, что случае нормально распределенного случайного вектора, ковариационная матрица вместе с математическим ожиданием этого вектора полностью определяют его распределение. Поэтому для полного статистического соответствия моделируемого и теоретического распределения гауссовского вектора достаточно обеспечить требуемые значения указанных параметров&amp;lt;ref name=&amp;quot;VV&amp;quot;&amp;gt; https://ru.wikipedia.org/wiki/Многомерное_нормальное_распределение&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея алгоритма заключается в линейном преобразовании n-мерного случайного вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, компоненты которого независимы и одинаково распределены по нормальному закону со стандартными параметрами, в случайный вектор &amp;lt;math&amp;gt;X&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;\Sigma&amp;lt;/math&amp;gt; и вектор математических ожиданий &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Sigma = \|\sigma_{ij}\| = \| \mathbb{E}[(X_{i} - m_{x_{i}})(X_{j} - m_{x_{j}})]\|, \\&lt;br /&gt;
M = (m_{x_{1}}, m_{x_{2}}, ..., m_{x_{n}})^T.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Требуется найти такую матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, которая позволяла бы получить искомый вектор &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; с требуемыми характеристиками в результате линейного преобразования &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — n-мерный случайный вектор с независимыми нормально распределенными компонентами со стандартными параметрами.&lt;br /&gt;
&lt;br /&gt;
Будем искать матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в виде нижней треугольной матрицы. Перейдем от матричной записи к системе алгебраических уравнений:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} X_{1} \\&lt;br /&gt;
 X_{2} \\ \vdots \\ X_{n} \end{pmatrix} =&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} b_{11} &amp;amp; 0 &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\b_{21} &amp;amp; b_{22} &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\ \vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \vdots&lt;br /&gt;
\\ b_{n1} &amp;amp; b_{n2} &amp;amp; \cdots &amp;amp; b_{nn}&lt;br /&gt;
\end{pmatrix} \times&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} Y_{1} \\&lt;br /&gt;
 Y_{2} \\ \vdots \\ Y_{n} \end{pmatrix} +&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} m_{x_{1}} \\&lt;br /&gt;
 m_{x_{2}} \\ \vdots \\ m_{x_{n}} \end{pmatrix} \Rightarrow&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}X_{1} - m_{x_{1}} = b_{11}Y_{1}&lt;br /&gt;
\\X_{2} - m_{x_{2}} = b_{21}Y_{1} + b_{22}Y_{2}&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\\X_{n} - m_{x_{n}} = b_{n1}Y_{1} + b_{n2}Y_{2} + \cdots + b_{nn}Y_{n}&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Поскольку компоненты вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; независимы и имеют стандартные параметры, справедливо выражение:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\mathbb{E}[Y_{i}Y_{j}] =&lt;br /&gt;
\left\{\begin{matrix} &lt;br /&gt;
1, &amp;amp;i = j, \\&lt;br /&gt;
0, &amp;amp;i \not= j.&lt;br /&gt;
\end{matrix}\right.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Почленно перемножив сами на себя и между собой соответственно левые и правые части уравнений системы и взяв от результатов перемножения математическое ожидание, получаем систему уравнений вида:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\mathbb{E}[(X_{1} - m_{x_{1}})(X_{1} - m_{x_{1}})] = \mathbb{E}[b_{11}Y_{1}b_{11}Y_{1}],&lt;br /&gt;
\\ \mathbb{E}[(X_{1} - m_{x_{1}})(X_{2} - m_{x_{2}})] = \mathbb{E}[(b_{21}Y_{1} + b_{22}Y_{2})b_{11}Y_{1}],&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, в левых частях полученной системы уравнений располагаются элементы заданной ковариационной матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;, а в правых — элементы искомой матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;. Последовательно решая эту систему, получаем формулы для расчета элементов &amp;lt;math&amp;gt;\sigma_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
b_{11}=\sqrt{\sigma_{11}}; b_{21}=\frac{\sigma_{12}}{\sqrt{\sigma_{11}}}; b_{22} = \sqrt{\sigma_{22} - \frac{\sigma_{12}}{\sigma_{11}}}, \cdots&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рекуррентная формула для расчета любого элемента матрицы преобразования &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b_{ij} = \frac {\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}} {\sqrt{\sigma_{jj} - \sum_{k=1}^{j-1} b_{jk}^2}}, \quad 1 \leqslant j \leqslant i \leqslant n&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(суммы с верхним нулевым пределом считаются равными нулю)&lt;br /&gt;
&lt;br /&gt;
Таким образом, матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; получается с помощью [[Разложение_Холецкого_(метод_квадратного_корня)|разложения Холецкого]] матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Генерация случайного вектора Y ====&lt;br /&gt;
&lt;br /&gt;
Пусть имеется генератор псевдослучайных чисел (ГПСЧ, PRNG), с помощью которого можно получить реализацию случайной величины &amp;lt;math&amp;gt;u \sim U(0,1) &amp;lt;/math&amp;gt;. Описанный выше случайный вектор &amp;lt;math&amp;gt;Y=(y_1, \dots, y_n)&amp;lt;/math&amp;gt; с независимыми компонентами составим из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; реализаций случайной величины &amp;lt;math&amp;gt;\eta \sim N(0,1)&amp;lt;/math&amp;gt;. Каждую такую реализацию &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;, в свою очередь, получим с помощью приближения по ЦПТ &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; случайными величинами, распределенными равномерно на отрезке [0,1]:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right), \quad i = \overline{1, n} \\&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;u_j^i - &amp;lt;/math&amp;gt; реализации случайной величины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;\kappa - &amp;lt;/math&amp;gt; параметр, обеспечивающий качество приближения.&lt;br /&gt;
&lt;br /&gt;
Как правило, &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; берут равным &amp;lt;math&amp;gt;12&amp;lt;/math&amp;gt; и считают, что для подавляющего числа практических задач обеспечивается должная точность вычислений&amp;lt;ref name = &amp;quot;VVV&amp;quot;&amp;gt;Балдин К.В., Уткин В.Б. Информационные системы в экономике. — М.:Дашков и Кo, 2008. — 395 с.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&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;\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}, \quad 1 \leqslant j \leqslant i \leqslant n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;&lt;br /&gt;
* Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1) Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;b_{11}= \sqrt{\sigma_{11}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;b_{k1}= \frac{\sigma_{k1}}{l_{11}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad k = \overline{2,n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{2,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (c) &amp;lt;math&amp;gt;b_{ii} = \sqrt{\sigma_{ii} - \sum_{p = 1}^{i - 1} b_{ip}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (d) &amp;lt;math&amp;gt;b_{ji} = \frac{\sigma_{ji} - \sum_{p = 1}^{i - 1} b_{ip} b_{jp}} {l_{ii}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad i \neq n, j = \overline{i+1,n}&amp;lt;/math&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;u_j^i \leftarrow PRNG,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\quad j = \overline{1,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3) Вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i = m_{x_i} + \sum_{k = 1}^{i} b_{ik} y_{k}, \quad i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для генерации гауссовского случайного вектора порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; в последовательном варианте требуется:&lt;br /&gt;
* &amp;lt;math&amp;gt; n(n+1) + \frac {n(n-1)(n-2)}{6} &amp;lt;/math&amp;gt; (умножений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac {n(n+1)}{2} + \frac {n(n-1)(n-2)}{6} &amp;lt;/math&amp;gt; (вычитаний)&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac {n(n-1+2\kappa)}{2} &amp;lt;/math&amp;gt; (сложений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac {n(n+3)}{2} &amp;lt;/math&amp;gt; (делений)&lt;br /&gt;
* &amp;lt;math&amp;gt; 2n &amp;lt;/math&amp;gt; (вычислений квадратного корня)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{n}{6}\left(2n^2+9n+31+6\kappa\right) &amp;lt;/math&amp;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;
==== Заполнение матрицы B====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 1 макроструктуры алгоритма ([[Разложение_Холецкого_(метод_квадратного_корня)|&#039;&#039;разложения Холецкого&#039;&#039;]]) состоит из трёх групп вершин, расположенных в целочисленных узлах трёх областей разной размерности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин расположена в одномерной области, соответствующая ей операция вычисляет функцию SQRT. &lt;br /&gt;
Единственная координата каждой из вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргумент этой функции &lt;br /&gt;
	&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{11}&amp;lt;/math&amp;gt;; &lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ii}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин расположена в двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a / b&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;: &lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{j1}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1, j, i - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ji}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин расположена в трёхмерной области, соответствующая ей операция  &amp;lt;math&amp;gt;a - b * c&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; — меняется в диапазоне  от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;p = 1&amp;lt;/math&amp;gt; элемент входных данных &amp;lt;math&amp;gt;\sigma_{ji}&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;p &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i, j, p - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, i&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, j&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.1, выполненном для случая &amp;lt;math&amp;gt;n = 4&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
[[file:Cholesky full_in_out.png|thumb|center|1400px|Рисунок 1. Граф этапа 1 макроструктуры алгоритма. SQ — вычисление квадратного корня, F — операция a-bc, Div — деление, In — входные данные, Out — выходные.]]&lt;br /&gt;
&lt;br /&gt;
====Генерация вектора Y====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 2 макроструктуры алгоритма состоит из двух групп вершин, расположенных в целочисленных узлах двумерной области.&lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин. Соответствующая ей операция вычисляет функцию &amp;lt;math&amp;gt;S = a+b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a:&amp;lt;/math&amp;gt;&lt;br /&gt;
** при &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; — константа &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;j&amp;gt;1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатами &amp;lt;math&amp;gt;i,j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; — значение, поступающее с &amp;lt;math&amp;gt;PRNG&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин. Соответствующая ей операция вычисляет функцию &amp;lt;math&amp;gt;F = \left(a-\frac{\kappa}{2}\right)\sqrt{\frac{12}{\kappa}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; —  результат срабатывания операции, соответствующей вершине из первой группы, с координатами &amp;lt;math&amp;gt;i,\kappa&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; этапа &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.2, выполненном для случая &amp;lt;math&amp;gt;n = 2, \kappa = 2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf2.png|550px|thumb|center|Рисунок 2. Граф этапа 2 макроструктуры алгоритма]]&lt;br /&gt;
&lt;br /&gt;
====Вычисление вектора X====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 3 макроструктуры алгоритма (&#039;&#039;умножение нижней треугольной матрицы на вектор и сложение результата с другим вектором&#039;&#039;) состоит из одной группы вершин, расположенной в целочисленных узлах двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a+bc&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;j = 1&amp;lt;/math&amp;gt; — компонента &amp;lt;math&amp;gt;m_{x_i}&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;j &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине с координатами &amp;lt;math&amp;gt;i, j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;b_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;y_{j}&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является:&lt;br /&gt;
* при &amp;lt;math&amp;gt;j &amp;lt; i&amp;lt;/math&amp;gt; — &#039;&#039;промежуточным данным&#039;&#039; этапа;&lt;br /&gt;
* при &amp;lt;math&amp;gt;j = i&amp;lt;/math&amp;gt; — &#039;&#039;выходным данным&#039;&#039; алгоритма &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.3, выполненном для случая &amp;lt;math&amp;gt; n = 4&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf3.png|650px|thumb|center|Рисунок 3. Граф этапа 3 макроструктуры алгоритма,  F — операция a+bc]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для разложения Холецкого &amp;lt;math&amp;gt;(n \times n)&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; в параллельном варианте требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов с вычислением квадратного корня (единичные вычисления в каждом из ярусов),&lt;br /&gt;
* &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; ярус делений (в каждом из ярусов — линейное количество операций, в зависимости от яруса — от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt;),&lt;br /&gt;
* по &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; ярусов умножений и сложений/вычитаний (в каждом из ярусов — квадратичное количество операций, от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;\frac{n^2 - n}{2}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Для генерации &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; в параллельном варианте требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; ярусов сложений (&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций в каждом из ярусов),&lt;br /&gt;
* &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; ярус вычитаний, делений, умножений, вычислений квадратного корня (&amp;lt;math&amp;gt;n, 2n, n, n&amp;lt;/math&amp;gt; операций соответственно),&lt;br /&gt;
&lt;br /&gt;
Для вычисления &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; в параллельном варианте требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений (в каждом из ярусов — линейное количество операций, в зависимости от яруса — от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Учитывая &amp;lt;math&amp;gt;n \gg \kappa&amp;lt;/math&amp;gt;, можно заключить: при классификации по высоте ЯПФ алгоритм имеет сложность &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, при классификации по ширине — &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: вещественная всюду плотная положительно определенная симметрическая  &amp;lt;math&amp;gt;(n \times n)&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;\Sigma&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;
* Выходные данные: вещественный &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектор &amp;lt;math&amp;gt;X&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;syntaxhighlight lang = c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// compute matrix B (core)&lt;br /&gt;
for (int j = 0; j &amp;lt; n; j++){&lt;br /&gt;
    double sum_down = matrix_cov[j][j];&lt;br /&gt;
    for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
        double cur = matrix_cov[j][k];&lt;br /&gt;
        sum_down -= cur * cur;&lt;br /&gt;
    }&lt;br /&gt;
    matrix_cov[j][j] = sqrt(sum_down);&lt;br /&gt;
    for (int i = j + 1; i &amp;lt; n; i++){&lt;br /&gt;
        double sum_up = matrix_cov[i][j];&lt;br /&gt;
        for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
            sum_up -= matrix_cov[i][k] * matrix_cov[j][k];&lt;br /&gt;
        }&lt;br /&gt;
        matrix_cov[i][j] = sum_up / matrix_cov[j][j];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
// generate vector Y&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){&lt;br /&gt;
    double sum = generate_uniform(n);&lt;br /&gt;
    for (int j = 0; j &amp;lt; CLT_NUM - 1; j++){&lt;br /&gt;
        sum += generate_uniform(n);&lt;br /&gt;
    }&lt;br /&gt;
    vec_Y[i] = (sum - CLT_NUM / 2) * sqrt(12.0 / CLT_NUM);&lt;br /&gt;
}&lt;br /&gt;
// linear transformation&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){  &lt;br /&gt;
    vec_X[i] = vec_exp[i];&lt;br /&gt;
    for (int k = 0; k &amp;lt;= i; k++){&lt;br /&gt;
        vec_X[i] += matrix_cov[i][k] * vec_Y[k];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В данной реализации алгоритма весь ресурс параллелизма использован в следующих этапах:&lt;br /&gt;
* вычисление элементов матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в рамках столбца (под диагональю),&lt;br /&gt;
* генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;,&lt;br /&gt;
* вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (умножение матрицы на вектор, сложение векторов).&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Алгоритм был реализован на языке C++ с использованием Intel MPI Library и запущен на кластере regular4.&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add impi/5.0.1&lt;br /&gt;
 mpicxx -std=c++0x task.c -o _scratch/task&lt;br /&gt;
 sbatch -n256 impi ./task &amp;lt;matrix_size&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
* размер матрицы [1024 : 4864] с шагом 256,&lt;br /&gt;
* число ядер [2 : 256] с шагом по степеням 2.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:Ops_2.png|thumb|center|700px|Рисунок 4. Изменение производительности в зависимости от числа ядер и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
[[file:Eff_2.png|thumb|center|700px|Рисунок 5. Изменение эффективности реализации в зависимости от числа ядер и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
[[file:Eff_2_up.png|thumb|center|700px|Рисунок 6. Изменение эффективности реализации, вид сверху.]]&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;По размеру задачи&#039;&#039;&#039; — при увеличении размерности матрицы эффективность реализации постепенно увеличивается, при этом тем быстрее, чем большее число ядер задействовано.&lt;br /&gt;
* &#039;&#039;&#039;По числу ядер&#039;&#039;&#039; — при увеличении числа mpi-процессов эффективность реализации снижается. Это объясняется ростом накладных расходов на организацию параллельного выполнения. При этом с ростом размерности матрицы эффективность снижается с такой же скоростью, но уже при больших значениях числа mpi-процессов.&lt;br /&gt;
* &#039;&#039;&#039;По двум направлениям&#039;&#039;&#039; — эффективность реализации возрастает (на рассматриваемой области значений параметров), но крайне медленно.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/mensigo/skipod/blob/master/mpi_gauss_vec_gen.c Параллельная реализация на C++]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
MS Excel и распространённые статистические пакеты (напр., SPSS, Statistica) позволяют моделировать только одномерные статистические распределения. Имеется возможность &amp;quot;собрать&amp;quot; многомерное распределение из нескольких одномерных при условии, что компоненты независимы. Однако если необходимо исследовать данные с зависящими друг от друга переменными, то приходится писать собственную программу. При этом удобно воспользоваться готовой реализацией разложения Холецкого (точечного метода), представленной в таких прикладных пакетах, как LINPACK, LAPACK, SCALAPACK.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Lonalone</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26782</id>
		<title>Участник:Lonalone/Генерация гауссовского вектора методом линейных преобразований</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26782"/>
		<updated>2018-12-08T06:51:26Z</updated>

		<summary type="html">&lt;p&gt;Lonalone: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор описания: &#039;&#039;Меньших И. М.&#039;&#039;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из многомерных распределений особый интерес представляет нормальное. Этому закону подчиняются все результаты воздействия большого числа случайных факторов, среди которых нет превалирующих.&lt;br /&gt;
&lt;br /&gt;
В статье приведен алгоритм генерации n-мерного гауссовского случайного вектора с помощью &#039;&#039;метода линейных преобразований&#039;&#039;&amp;lt;ref name=&amp;quot;V&amp;quot;&amp;gt;Михайлов Г.А., Войтишек А.В. Численное статистическое моделирование. Методы Монте-Карло — М.: Академия, 2006. — 368 с.&amp;lt;/ref&amp;gt;. Известно, что случае нормально распределенного случайного вектора, ковариационная матрица вместе с математическим ожиданием этого вектора полностью определяют его распределение. Поэтому для полного статистического соответствия моделируемого и теоретического распределения гауссовского вектора достаточно обеспечить требуемые значения указанных параметров&amp;lt;ref name=&amp;quot;VV&amp;quot;&amp;gt; https://ru.wikipedia.org/wiki/Многомерное_нормальное_распределение&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея алгоритма заключается в линейном преобразовании n-мерного случайного вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, компоненты которого независимы и одинаково распределены по нормальному закону со стандартными параметрами, в случайный вектор &amp;lt;math&amp;gt;X&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;\Sigma&amp;lt;/math&amp;gt; и вектор математических ожиданий &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Sigma = \|\sigma_{ij}\| = \| \mathbb{E}[(X_{i} - m_{x_{i}})(X_{j} - m_{x_{j}})]\|, \\&lt;br /&gt;
M = (m_{x_{1}}, m_{x_{2}}, ..., m_{x_{n}})^T.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Требуется найти такую матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, которая позволяла бы получить искомый вектор &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; с требуемыми характеристиками в результате линейного преобразования &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — n-мерный случайный вектор с независимыми нормально распределенными компонентами со стандартными параметрами.&lt;br /&gt;
&lt;br /&gt;
Будем искать матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в виде нижней треугольной матрицы. Перейдем от матричной записи к системе алгебраических уравнений:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} X_{1} \\&lt;br /&gt;
 X_{2} \\ \vdots \\ X_{n} \end{pmatrix} =&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} b_{11} &amp;amp; 0 &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\b_{21} &amp;amp; b_{22} &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\ \vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \vdots&lt;br /&gt;
\\ b_{n1} &amp;amp; b_{n2} &amp;amp; \cdots &amp;amp; b_{nn}&lt;br /&gt;
\end{pmatrix} \times&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} Y_{1} \\&lt;br /&gt;
 Y_{2} \\ \vdots \\ Y_{n} \end{pmatrix} +&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} m_{x_{1}} \\&lt;br /&gt;
 m_{x_{2}} \\ \vdots \\ m_{x_{n}} \end{pmatrix} \Rightarrow&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}X_{1} - m_{x_{1}} = b_{11}Y_{1}&lt;br /&gt;
\\X_{2} - m_{x_{2}} = b_{21}Y_{1} + b_{22}Y_{2}&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\\X_{n} - m_{x_{n}} = b_{n1}Y_{1} + b_{n2}Y_{2} + \cdots + b_{nn}Y_{n}&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Поскольку компоненты вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; независимы и имеют стандартные параметры, справедливо выражение:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\mathbb{E}[Y_{i}Y_{j}] =&lt;br /&gt;
\left\{\begin{matrix} &lt;br /&gt;
1, &amp;amp;i = j, \\&lt;br /&gt;
0, &amp;amp;i \not= j.&lt;br /&gt;
\end{matrix}\right.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Почленно перемножив сами на себя и между собой соответственно левые и правые части уравнений системы и взяв от результатов перемножения математическое ожидание, получаем систему уравнений вида:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\mathbb{E}[(X_{1} - m_{x_{1}})(X_{1} - m_{x_{1}})] = \mathbb{E}[b_{11}Y_{1}b_{11}Y_{1}],&lt;br /&gt;
\\ \mathbb{E}[(X_{1} - m_{x_{1}})(X_{2} - m_{x_{2}})] = \mathbb{E}[(b_{21}Y_{1} + b_{22}Y_{2})b_{11}Y_{1}],&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, в левых частях полученной системы уравнений располагаются элементы заданной ковариационной матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;, а в правых — элементы искомой матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;. Последовательно решая эту систему, получаем формулы для расчета элементов &amp;lt;math&amp;gt;\sigma_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
b_{11}=\sqrt{\sigma_{11}}; b_{21}=\frac{\sigma_{12}}{\sqrt{\sigma_{11}}}; b_{22} = \sqrt{\sigma_{22} - \frac{\sigma_{12}}{\sigma_{11}}}, \cdots&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рекуррентная формула для расчета любого элемента матрицы преобразования &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b_{ij} = \frac {\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}} {\sqrt{\sigma_{jj} - \sum_{k=1}^{j-1} b_{jk}^2}}, \quad 1 \leqslant j \leqslant i \leqslant n&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(суммы с верхним нулевым пределом считаются равными нулю)&lt;br /&gt;
&lt;br /&gt;
Таким образом, матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; получается с помощью [[Разложение_Холецкого_(метод_квадратного_корня)|разложения Холецкого]] матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Генерация случайного вектора Y ====&lt;br /&gt;
&lt;br /&gt;
Пусть имеется генератор псевдослучайных чисел (ГПСЧ, PRNG), с помощью которого можно получить реализацию случайной величины &amp;lt;math&amp;gt;u \sim U(0,1) &amp;lt;/math&amp;gt;. Описанный выше случайный вектор &amp;lt;math&amp;gt;Y=(y_1, \dots, y_n)&amp;lt;/math&amp;gt; с независимыми компонентами составим из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; реализаций случайной величины &amp;lt;math&amp;gt;\eta \sim N(0,1)&amp;lt;/math&amp;gt;. Каждую такую реализацию &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;, в свою очередь, получим с помощью приближения по ЦПТ &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; случайными величинами, распределенными равномерно на отрезке [0,1]:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right), \quad i = \overline{1, n} \\&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;u_j^i - &amp;lt;/math&amp;gt; реализации случайной величины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;\kappa - &amp;lt;/math&amp;gt; параметр, обеспечивающий качество приближения.&lt;br /&gt;
&lt;br /&gt;
Как правило, &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; берут равным 12 и считают, что для подавляющего числа практических задач обеспечивается должная точность вычислений&amp;lt;ref name = &amp;quot;VVV&amp;quot;&amp;gt;Балдин К.В., Уткин В.Б. Информационные системы в экономике. — М.:Дашков и Кo, 2008. — 395 с.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&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;\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}, \quad 1 \leqslant j \leqslant i \leqslant n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;&lt;br /&gt;
* Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1) Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;b_{11}= \sqrt{\sigma_{11}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;b_{k1}= \frac{\sigma_{k1}}{l_{11}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad k = \overline{2,n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{2,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (c) &amp;lt;math&amp;gt;b_{ii} = \sqrt{\sigma_{ii} - \sum_{p = 1}^{i - 1} b_{ip}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (d) &amp;lt;math&amp;gt;b_{ji} = \frac{\sigma_{ji} - \sum_{p = 1}^{i - 1} b_{ip} b_{jp}} {l_{ii}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad i \neq n, j = \overline{i+1,n}&amp;lt;/math&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;u_j^i \leftarrow PRNG,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\quad j = \overline{1,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3) Вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i = m_{x_i} + \sum_{k = 1}^{i} b_{ik} y_{k}, \quad i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для генерации гауссовского случайного вектора порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; в последовательном варианте требуется:&lt;br /&gt;
* &amp;lt;math&amp;gt; n(n+1) + \frac {n(n-1)(n-2)}{6} &amp;lt;/math&amp;gt; (умножений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac {n(n+1)}{2} + \frac {n(n-1)(n-2)}{6} &amp;lt;/math&amp;gt; (вычитаний)&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac {n(n-1+2\kappa)}{2} &amp;lt;/math&amp;gt; (сложений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac {n(n+3)}{2} &amp;lt;/math&amp;gt; (делений)&lt;br /&gt;
* &amp;lt;math&amp;gt; 2n &amp;lt;/math&amp;gt; (вычислений квадратного корня)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{n}{6}\left(2n^2+9n+31+6\kappa\right) &amp;lt;/math&amp;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;
==== Заполнение матрицы B====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 1 макроструктуры алгоритма ([[Разложение_Холецкого_(метод_квадратного_корня)|&#039;&#039;разложения Холецкого&#039;&#039;]]) состоит из трёх групп вершин, расположенных в целочисленных узлах трёх областей разной размерности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин расположена в одномерной области, соответствующая ей операция вычисляет функцию SQRT. &lt;br /&gt;
Единственная координата каждой из вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргумент этой функции &lt;br /&gt;
	&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{11}&amp;lt;/math&amp;gt;; &lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ii}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин расположена в двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a / b&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;: &lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{j1}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1, j, i - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ji}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин расположена в трёхмерной области, соответствующая ей операция  &amp;lt;math&amp;gt;a - b * c&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; — меняется в диапазоне  от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;p = 1&amp;lt;/math&amp;gt; элемент входных данных &amp;lt;math&amp;gt;\sigma_{ji}&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;p &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i, j, p - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, i&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, j&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.1, выполненном для случая &amp;lt;math&amp;gt;n = 4&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
[[file:Cholesky full_in_out.png|thumb|center|1400px|Рисунок 1. Граф этапа 1 макроструктуры алгоритма. SQ — вычисление квадратного корня, F — операция a-bc, Div — деление, In — входные данные, Out — выходные.]]&lt;br /&gt;
&lt;br /&gt;
====Генерация вектора Y====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 2 макроструктуры алгоритма состоит из двух групп вершин, расположенных в целочисленных узлах двумерной области.&lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин. Соответствующая ей операция вычисляет функцию &amp;lt;math&amp;gt;S = a+b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a:&amp;lt;/math&amp;gt;&lt;br /&gt;
** при &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; — константа &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;j&amp;gt;1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатами &amp;lt;math&amp;gt;i,j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; — значение, поступающее с &amp;lt;math&amp;gt;PRNG&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин. Соответствующая ей операция вычисляет функцию &amp;lt;math&amp;gt;F = \left(a-\frac{\kappa}{2}\right)\sqrt{\frac{12}{\kappa}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; —  результат срабатывания операции, соответствующей вершине из первой группы, с координатами &amp;lt;math&amp;gt;i,\kappa&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; этапа &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.2, выполненном для случая &amp;lt;math&amp;gt;n = 2, \kappa = 2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf2.png|550px|thumb|center|Рисунок 2. Граф этапа 2 макроструктуры алгоритма]]&lt;br /&gt;
&lt;br /&gt;
====Вычисление вектора X====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 3 макроструктуры алгоритма (&#039;&#039;умножение нижней треугольной матрицы на вектор и сложение результата с другим вектором&#039;&#039;) состоит из одной группы вершин, расположенной в целочисленных узлах двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a+bc&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;j = 1&amp;lt;/math&amp;gt; — компонента &amp;lt;math&amp;gt;m_{x_i}&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;j &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине с координатами &amp;lt;math&amp;gt;i, j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;b_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;y_{j}&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является:&lt;br /&gt;
* при &amp;lt;math&amp;gt;j &amp;lt; i&amp;lt;/math&amp;gt; — &#039;&#039;промежуточным данным&#039;&#039; этапа;&lt;br /&gt;
* при &amp;lt;math&amp;gt;j = i&amp;lt;/math&amp;gt; — &#039;&#039;выходным данным&#039;&#039; алгоритма &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.3, выполненном для случая &amp;lt;math&amp;gt; n = 4&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf3.png|650px|thumb|center|Рисунок 3. Граф этапа 3 макроструктуры алгоритма,  F — операция a+bc]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для разложения Холецкого &amp;lt;math&amp;gt;(n \times n)&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; в параллельном варианте требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов с вычислением квадратного корня (единичные вычисления в каждом из ярусов),&lt;br /&gt;
* &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; ярус делений (в каждом из ярусов — линейное количество операций, в зависимости от яруса — от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt;),&lt;br /&gt;
* по &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; ярусов умножений и сложений/вычитаний (в каждом из ярусов — квадратичное количество операций, от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;\frac{n^2 - n}{2}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Для генерации &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; в параллельном варианте требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; ярусов сложений (&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций в каждом из ярусов),&lt;br /&gt;
* &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; ярус вычитаний, делений, умножений, вычислений квадратного корня (&amp;lt;math&amp;gt;n, 2n, n, n&amp;lt;/math&amp;gt; операций соответственно),&lt;br /&gt;
&lt;br /&gt;
Для вычисления &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; в параллельном варианте требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений (в каждом из ярусов — линейное количество операций, в зависимости от яруса — от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Учитывая &amp;lt;math&amp;gt;n \gg \kappa&amp;lt;/math&amp;gt;, можно заключить: при классификации по высоте ЯПФ алгоритм имеет сложность &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, при классификации по ширине — &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: вещественная всюду плотная положительно определенная симметрическая  &amp;lt;math&amp;gt;(n \times n)&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;\Sigma&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;
* Выходные данные: вещественный &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектор &amp;lt;math&amp;gt;X&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;syntaxhighlight lang = c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// compute matrix B (core)&lt;br /&gt;
for (int j = 0; j &amp;lt; n; j++){&lt;br /&gt;
    double sum_down = matrix_cov[j][j];&lt;br /&gt;
    for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
        double cur = matrix_cov[j][k];&lt;br /&gt;
        sum_down -= cur * cur;&lt;br /&gt;
    }&lt;br /&gt;
    matrix_cov[j][j] = sqrt(sum_down);&lt;br /&gt;
    for (int i = j + 1; i &amp;lt; n; i++){&lt;br /&gt;
        double sum_up = matrix_cov[i][j];&lt;br /&gt;
        for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
            sum_up -= matrix_cov[i][k] * matrix_cov[j][k];&lt;br /&gt;
        }&lt;br /&gt;
        matrix_cov[i][j] = sum_up / matrix_cov[j][j];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
// generate vector Y&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){&lt;br /&gt;
    double sum = generate_uniform(n);&lt;br /&gt;
    for (int j = 0; j &amp;lt; CLT_NUM - 1; j++){&lt;br /&gt;
        sum += generate_uniform(n);&lt;br /&gt;
    }&lt;br /&gt;
    vec_Y[i] = (sum - CLT_NUM / 2) * sqrt(12.0 / CLT_NUM);&lt;br /&gt;
}&lt;br /&gt;
// linear transformation&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){  &lt;br /&gt;
    vec_X[i] = vec_exp[i];&lt;br /&gt;
    for (int k = 0; k &amp;lt;= i; k++){&lt;br /&gt;
        vec_X[i] += matrix_cov[i][k] * vec_Y[k];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В данной реализации алгоритма весь ресурс параллелизма использован в следующих этапах:&lt;br /&gt;
* вычисление элементов матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в рамках столбца (под диагональю),&lt;br /&gt;
* генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;,&lt;br /&gt;
* вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (умножение матрицы на вектор, сложение векторов).&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Алгоритм был реализован на языке C++ с использованием Intel MPI Library и запущен на кластере regular4.&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add impi/5.0.1&lt;br /&gt;
 mpicxx -std=c++0x task.c -o _scratch/task&lt;br /&gt;
 sbatch -n256 impi ./task &amp;lt;matrix_size&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
* размер матрицы [1024 : 4864] с шагом 256,&lt;br /&gt;
* число ядер [2 : 256] с шагом по степеням 2.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:Ops_2.png|thumb|center|700px|Рисунок 4. Изменение производительности в зависимости от числа ядер и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
[[file:Eff_2.png|thumb|center|700px|Рисунок 5. Изменение эффективности реализации в зависимости от числа ядер и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
[[file:Eff_2_up.png|thumb|center|700px|Рисунок 6. Изменение эффективности реализации, вид сверху.]]&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;По размеру задачи&#039;&#039;&#039; — при увеличении размерности матрицы эффективность реализации постепенно увеличивается, при этом тем быстрее, чем большее число ядер задействовано.&lt;br /&gt;
* &#039;&#039;&#039;По числу ядер&#039;&#039;&#039; — при увеличении числа mpi-процессов эффективность реализации снижается. Это объясняется ростом накладных расходов на организацию параллельного выполнения. При этом с ростом размерности матрицы эффективность снижается с такой же скоростью, но уже при больших значениях числа mpi-процессов.&lt;br /&gt;
* &#039;&#039;&#039;По двум направлениям&#039;&#039;&#039; — эффективность реализации возрастает (на рассматриваемой области значений параметров), но крайне медленно.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/mensigo/skipod/blob/master/mpi_gauss_vec_gen.c Параллельная реализация на C++]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
MS Excel и распространённые статистические пакеты (напр., SPSS, Statistica) позволяют моделировать только одномерные статистические распределения. Имеется возможность &amp;quot;собрать&amp;quot; многомерное распределение из нескольких одномерных при условии, что компоненты независимы. Однако если необходимо исследовать данные с зависящими друг от друга переменными, то приходится писать собственную программу. При этом удобно воспользоваться готовой реализацией разложения Холецкого (точечного метода), представленной в таких прикладных пакетах, как LINPACK, LAPACK, SCALAPACK.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Lonalone</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26781</id>
		<title>Участник:Lonalone/Генерация гауссовского вектора методом линейных преобразований</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26781"/>
		<updated>2018-12-08T06:48:50Z</updated>

		<summary type="html">&lt;p&gt;Lonalone: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор описания: &#039;&#039;Меньших И. М.&#039;&#039;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из многомерных распределений особый интерес представляет нормальное. Этому закону подчиняются все результаты воздействия большого числа случайных факторов, среди которых нет превалирующих.&lt;br /&gt;
&lt;br /&gt;
В статье приведен алгоритм генерации n-мерного гауссовского случайного вектора с помощью &#039;&#039;метода линейных преобразований&#039;&#039;&amp;lt;ref name=&amp;quot;V&amp;quot;&amp;gt;Михайлов Г.А., Войтишек А.В. Численное статистическое моделирование. Методы Монте-Карло — М.: Академия, 2006. — 368 с.&amp;lt;/ref&amp;gt;. Известно, что случае нормально распределенного случайного вектора, ковариационная матрица вместе с математическим ожиданием этого вектора полностью определяют его распределение. Поэтому для полного статистического соответствия моделируемого и теоретического распределения гауссовского вектора достаточно обеспечить требуемые значения указанных параметров&amp;lt;ref name=&amp;quot;VV&amp;quot;&amp;gt; https://ru.wikipedia.org/wiki/Многомерное_нормальное_распределение&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея алгоритма заключается в линейном преобразовании n-мерного случайного вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, компоненты которого независимы и одинаково распределены по нормальному закону со стандартными параметрами, в случайный вектор &amp;lt;math&amp;gt;X&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;\Sigma&amp;lt;/math&amp;gt; и вектор математических ожиданий &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Sigma = \|\sigma_{ij}\| = \| \mathbb{E}[(X_{i} - m_{x_{i}})(X_{j} - m_{x_{j}})]\|, \\&lt;br /&gt;
M = (m_{x_{1}}, m_{x_{2}}, ..., m_{x_{n}})^T.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Требуется найти такую матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, которая позволяла бы получить искомый вектор &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; с требуемыми характеристиками в результате линейного преобразования &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — n-мерный случайный вектор с независимыми нормально распределенными компонентами со стандартными параметрами.&lt;br /&gt;
&lt;br /&gt;
Будем искать матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в виде нижней треугольной матрицы. Перейдем от матричной записи к системе алгебраических уравнений:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} X_{1} \\&lt;br /&gt;
 X_{2} \\ \vdots \\ X_{n} \end{pmatrix} =&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} b_{11} &amp;amp; 0 &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\b_{21} &amp;amp; b_{22} &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\ \vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \vdots&lt;br /&gt;
\\ b_{n1} &amp;amp; b_{n2} &amp;amp; \cdots &amp;amp; b_{nn}&lt;br /&gt;
\end{pmatrix} \times&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} Y_{1} \\&lt;br /&gt;
 Y_{2} \\ \vdots \\ Y_{n} \end{pmatrix} +&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} m_{x_{1}} \\&lt;br /&gt;
 m_{x_{2}} \\ \vdots \\ m_{x_{n}} \end{pmatrix} \Rightarrow&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}X_{1} - m_{x_{1}} = b_{11}Y_{1}&lt;br /&gt;
\\X_{2} - m_{x_{2}} = b_{21}Y_{1} + b_{22}Y_{2}&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\\X_{n} - m_{x_{n}} = b_{n1}Y_{1} + b_{n2}Y_{2} + \cdots + b_{nn}Y_{n}&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Поскольку компоненты вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; независимы и имеют стандартные параметры, справедливо выражение:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\mathbb{E}[Y_{i}Y_{j}] =&lt;br /&gt;
\left\{\begin{matrix} &lt;br /&gt;
1, &amp;amp;i = j, \\&lt;br /&gt;
0, &amp;amp;i \not= j.&lt;br /&gt;
\end{matrix}\right.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Почленно перемножив сами на себя и между собой соответственно левые и правые части уравнений системы и взяв от результатов перемножения математическое ожидание, получаем систему уравнений вида:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\mathbb{E}[(X_{1} - m_{x_{1}})(X_{1} - m_{x_{1}})] = \mathbb{E}[b_{11}Y_{1}b_{11}Y_{1}],&lt;br /&gt;
\\ \mathbb{E}[(X_{1} - m_{x_{1}})(X_{2} - m_{x_{2}})] = \mathbb{E}[(b_{21}Y_{1} + b_{22}Y_{2})b_{11}Y_{1}],&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, в левых частях полученной системы уравнений располагаются элементы заданной ковариационной матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;, а в правых — элементы искомой матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;. Последовательно решая эту систему, получаем формулы для расчета элементов &amp;lt;math&amp;gt;\sigma_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
b_{11}=\sqrt{\sigma_{11}}; b_{21}=\frac{\sigma_{12}}{\sqrt{\sigma_{11}}}; b_{22} = \sqrt{\sigma_{22} - \frac{\sigma_{12}}{\sigma_{11}}}, \cdots&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рекуррентная формула для расчета любого элемента матрицы преобразования &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b_{ij} = \frac {\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}} {\sqrt{\sigma_{jj} - \sum_{k=1}^{j-1} b_{jk}^2}}, \quad 1 \leqslant j \leqslant i \leqslant n&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(суммы с верхним нулевым пределом считаются равными нулю)&lt;br /&gt;
&lt;br /&gt;
Таким образом, матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; получается с помощью [[Разложение_Холецкого_(метод_квадратного_корня)|разложения Холецкого]] матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Генерация случайного вектора Y ====&lt;br /&gt;
&lt;br /&gt;
Пусть имеется генератор псевдослучайных чисел (ГПСЧ, PRNG), с помощью которого можно получить реализацию случайной величины &amp;lt;math&amp;gt;u \sim U(0,1) &amp;lt;/math&amp;gt;. Описанный выше случайный вектор &amp;lt;math&amp;gt;Y=(y_1, \dots, y_n)&amp;lt;/math&amp;gt; с независимыми компонентами составим из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; реализаций случайной величины &amp;lt;math&amp;gt;\eta \sim N(0,1)&amp;lt;/math&amp;gt;. Каждую такую реализацию &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;, в свою очередь, получим с помощью приближения по ЦПТ &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; случайными величинами, распределенными равномерно на отрезке [0,1]:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right), \quad i = \overline{1, n} \\&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;u_j^i - &amp;lt;/math&amp;gt; реализации случайной величины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;\kappa - &amp;lt;/math&amp;gt; параметр, обеспечивающий качество приближения.&lt;br /&gt;
&lt;br /&gt;
Как правило, &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; берут равным 12 и считают, что для подавляющего числа практических задач обеспечивается должная точность вычислений&amp;lt;ref name = &amp;quot;VVV&amp;quot;&amp;gt;Балдин К.В., Уткин В.Б. Информационные системы в экономике. — М.:Дашков и Кo, 2008. — 395 с.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&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;\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}, \quad 1 \leqslant j \leqslant i \leqslant n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;&lt;br /&gt;
* Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1) Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;b_{11}= \sqrt{\sigma_{11}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;b_{k1}= \frac{\sigma_{k1}}{l_{11}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad k = \overline{2,n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{2,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (c) &amp;lt;math&amp;gt;b_{ii} = \sqrt{\sigma_{ii} - \sum_{p = 1}^{i - 1} b_{ip}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (d) &amp;lt;math&amp;gt;b_{ji} = \frac{\sigma_{ji} - \sum_{p = 1}^{i - 1} b_{ip} b_{jp}} {l_{ii}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad i \neq n, j = \overline{i+1,n}&amp;lt;/math&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;u_j^i \leftarrow PRNG,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\quad j = \overline{1,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3) Вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i = m_{x_i} + \sum_{k = 1}^{i} b_{ik} y_{k}, \quad i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для генерации гауссовского случайного вектора порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; в последовательном варианте требуется:&lt;br /&gt;
* &amp;lt;math&amp;gt; n(n+1) + \frac {n(n-1)(n-2)}{6} &amp;lt;/math&amp;gt; (умножений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac {n(n+1)}{2} + \frac {n(n-1)(n-2)}{6} &amp;lt;/math&amp;gt; (вычитаний)&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac {n(n-1+2\kappa)}{2} &amp;lt;/math&amp;gt; (сложений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac {n(n+3)}{2} &amp;lt;/math&amp;gt; (делений)&lt;br /&gt;
* &amp;lt;math&amp;gt; 2n &amp;lt;/math&amp;gt; (вычислений квадратного корня)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{n}{6}\left(2n^2+9n+31+6\kappa\right) &amp;lt;/math&amp;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;
==== Заполнение матрицы B====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 1 макроструктуры алгоритма ([[Разложение_Холецкого_(метод_квадратного_корня)|&#039;&#039;разложения Холецкого&#039;&#039;]]) состоит из трёх групп вершин, расположенных в целочисленных узлах трёх областей разной размерности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин расположена в одномерной области, соответствующая ей операция вычисляет функцию SQRT. &lt;br /&gt;
Единственная координата каждой из вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргумент этой функции &lt;br /&gt;
	&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{11}&amp;lt;/math&amp;gt;; &lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ii}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин расположена в двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a / b&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;: &lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{j1}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1, j, i - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ji}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин расположена в трёхмерной области, соответствующая ей операция  &amp;lt;math&amp;gt;a - b * c&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; — меняется в диапазоне  от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;p = 1&amp;lt;/math&amp;gt; элемент входных данных &amp;lt;math&amp;gt;\sigma_{ji}&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;p &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i, j, p - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, i&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, j&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.1, выполненном для случая &amp;lt;math&amp;gt;n = 4&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
[[file:Cholesky full_in_out.png|thumb|center|1400px|Рисунок 1. Граф этапа 1 макроструктуры алгоритма. SQ — вычисление квадратного корня, F — операция a-bc, Div — деление, In — входные данные, Out — выходные.]]&lt;br /&gt;
&lt;br /&gt;
====Генерация вектора Y====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 2 макроструктуры алгоритма состоит из двух групп вершин, расположенных в целочисленных узлах двумерной области.&lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин. Соответствующая ей операция вычисляет функцию &amp;lt;math&amp;gt;S = a+b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a:&amp;lt;/math&amp;gt;&lt;br /&gt;
** при &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; — константа &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;j&amp;gt;1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатами &amp;lt;math&amp;gt;i,j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; — значение, поступающее с &amp;lt;math&amp;gt;PRNG&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин. Соответствующая ей операция вычисляет функцию &amp;lt;math&amp;gt;F = \left(a-\frac{\kappa}{2}\right)\sqrt{\frac{12}{\kappa}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; —  результат срабатывания операции, соответствующей вершине из первой группы, с координатами &amp;lt;math&amp;gt;i,\kappa&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; этапа &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.2, выполненном для случая &amp;lt;math&amp;gt;n = 2, \kappa = 2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf2.png|550px|thumb|center|Рисунок 2. Граф этапа 2 макроструктуры алгоритма]]&lt;br /&gt;
&lt;br /&gt;
====Вычисление вектора X====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 3 макроструктуры алгоритма (&#039;&#039;умножение нижней треугольной матрицы на вектор и сложение результата с другим вектором&#039;&#039;) состоит из одной группы вершин, расположенной в целочисленных узлах двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a+bc&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;j = 1&amp;lt;/math&amp;gt; — компонента &amp;lt;math&amp;gt;m_{x_i}&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;j &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине с координатами &amp;lt;math&amp;gt;i, j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;b_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;y_{j}&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является:&lt;br /&gt;
* при &amp;lt;math&amp;gt;j &amp;lt; i&amp;lt;/math&amp;gt; — &#039;&#039;промежуточным данным&#039;&#039; этапа;&lt;br /&gt;
* при &amp;lt;math&amp;gt;j = i&amp;lt;/math&amp;gt; — &#039;&#039;выходным данным&#039;&#039; алгоритма &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.3, выполненном для случая &amp;lt;math&amp;gt; n = 4&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf3.png|650px|thumb|center|Рисунок 3. Граф этапа 3 макроструктуры алгоритма,  F — операция a+bc]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для разложения Холецкого &amp;lt;math&amp;gt;(n \times n)&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; в параллельном варианте требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов с вычислением квадратного корня (единичные вычисления в каждом из ярусов),&lt;br /&gt;
* &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; ярус делений (в каждом из ярусов — линейное количество операций, в зависимости от яруса — от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt;),&lt;br /&gt;
* по &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; ярусов умножений и сложений/вычитаний (в каждом из ярусов — квадратичное количество операций, от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;\frac{n^2 - n}{2}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Для генерации &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; в параллельном варианте требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; ярусов сложений (&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций в каждом из ярусов),&lt;br /&gt;
* &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; ярус вычитаний, делений, умножений, вычислений квадратного корня (&amp;lt;math&amp;gt;n, 2n, n, n&amp;lt;/math&amp;gt; операций соответственно),&lt;br /&gt;
&lt;br /&gt;
Для вычисления &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; в параллельном варианте требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений (в каждом из ярусов — линейное количество операций, в зависимости от яруса — от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Учитывая &amp;lt;math&amp;gt;n \gg \kappa&amp;lt;/math&amp;gt;, можно заключить: при классификации по высоте ЯПФ алгоритм имеет сложность &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, а при классификации по ширине — &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: вещественная всюду плотная положительно определенная симметрическая  &amp;lt;math&amp;gt;(n \times n)&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;\Sigma&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;
* Выходные данные: вещественный &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектор &amp;lt;math&amp;gt;X&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;syntaxhighlight lang = c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// compute matrix B (core)&lt;br /&gt;
for (int j = 0; j &amp;lt; n; j++){&lt;br /&gt;
    double sum_down = matrix_cov[j][j];&lt;br /&gt;
    for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
        double cur = matrix_cov[j][k];&lt;br /&gt;
        sum_down -= cur * cur;&lt;br /&gt;
    }&lt;br /&gt;
    matrix_cov[j][j] = sqrt(sum_down);&lt;br /&gt;
    for (int i = j + 1; i &amp;lt; n; i++){&lt;br /&gt;
        double sum_up = matrix_cov[i][j];&lt;br /&gt;
        for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
            sum_up -= matrix_cov[i][k] * matrix_cov[j][k];&lt;br /&gt;
        }&lt;br /&gt;
        matrix_cov[i][j] = sum_up / matrix_cov[j][j];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
// generate vector Y&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){&lt;br /&gt;
    double sum = generate_uniform(n);&lt;br /&gt;
    for (int j = 0; j &amp;lt; CLT_NUM - 1; j++){&lt;br /&gt;
        sum += generate_uniform(n);&lt;br /&gt;
    }&lt;br /&gt;
    vec_Y[i] = (sum - CLT_NUM / 2) * sqrt(12.0 / CLT_NUM);&lt;br /&gt;
}&lt;br /&gt;
// linear transformation&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){  &lt;br /&gt;
    vec_X[i] = vec_exp[i];&lt;br /&gt;
    for (int k = 0; k &amp;lt;= i; k++){&lt;br /&gt;
        vec_X[i] += matrix_cov[i][k] * vec_Y[k];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В данной реализации алгоритма весь ресурс параллелизма использован в следующих этапах:&lt;br /&gt;
* вычисление элементов матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в рамках столбца (под диагональю),&lt;br /&gt;
* генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;,&lt;br /&gt;
* вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (умножение матрицы на вектор, сложение векторов).&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Алгоритм был реализован на языке C++ с использованием Intel MPI Library и запущен на кластере regular4.&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add impi/5.0.1&lt;br /&gt;
 mpicxx -std=c++0x task.c -o _scratch/task&lt;br /&gt;
 sbatch -n256 impi ./task &amp;lt;matrix_size&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
* размер матрицы [1024 : 4864] с шагом 256,&lt;br /&gt;
* число ядер [2 : 256] с шагом по степеням 2.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:Ops_2.png|thumb|center|700px|Рисунок 4. Изменение производительности в зависимости от числа ядер и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
[[file:Eff_2.png|thumb|center|700px|Рисунок 5. Изменение эффективности реализации в зависимости от числа ядер и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
[[file:Eff_2_up.png|thumb|center|700px|Рисунок 6. Изменение эффективности реализации, вид сверху.]]&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;По размеру задачи&#039;&#039;&#039; — при увеличении размерности матрицы эффективность реализации постепенно увеличивается, при этом тем быстрее, чем большее число ядер задействовано.&lt;br /&gt;
* &#039;&#039;&#039;По числу ядер&#039;&#039;&#039; — при увеличении числа mpi-процессов эффективность реализации снижается. Это объясняется ростом накладных расходов на организацию параллельного выполнения. При этом с ростом размерности матрицы эффективность снижается с такой же скоростью, но уже при больших значениях числа mpi-процессов.&lt;br /&gt;
* &#039;&#039;&#039;По двум направлениям&#039;&#039;&#039; — эффективность реализации возрастает (на рассматриваемой области значений параметров), но крайне медленно.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/mensigo/skipod/blob/master/mpi_gauss_vec_gen.c Параллельная реализация на C++]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
MS Excel и распространённые статистические пакеты (напр., SPSS, Statistica) позволяют моделировать только одномерные статистические распределения. Имеется возможность &amp;quot;собрать&amp;quot; многомерное распределение из нескольких одномерных при условии, что компоненты независимы. Однако если необходимо исследовать данные с зависящими друг от друга переменными, то приходится писать собственную программу. При этом удобно воспользоваться готовой реализацией разложения Холецкого (точечного метода), представленной в таких прикладных пакетах, как LINPACK, LAPACK, SCALAPACK.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Lonalone</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26780</id>
		<title>Участник:Lonalone/Генерация гауссовского вектора методом линейных преобразований</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26780"/>
		<updated>2018-12-08T06:41:57Z</updated>

		<summary type="html">&lt;p&gt;Lonalone: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор описания: &#039;&#039;Меньших И. М.&#039;&#039;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из многомерных распределений особый интерес представляет нормальное. Этому закону подчиняются все результаты воздействия большого числа случайных факторов, среди которых нет превалирующих.&lt;br /&gt;
&lt;br /&gt;
В статье приведен алгоритм генерации n-мерного гауссовского случайного вектора с помощью &#039;&#039;метода линейных преобразований&#039;&#039;&amp;lt;ref name=&amp;quot;V&amp;quot;&amp;gt;Михайлов Г.А., Войтишек А.В. Численное статистическое моделирование. Методы Монте-Карло — М.: Академия, 2006. — 368 с.&amp;lt;/ref&amp;gt;. Известно, что случае нормально распределенного случайного вектора, ковариационная матрица вместе с математическим ожиданием этого вектора полностью определяют его распределение. Поэтому для полного статистического соответствия моделируемого и теоретического распределения гауссовского вектора достаточно обеспечить требуемые значения указанных параметров&amp;lt;ref name=&amp;quot;VV&amp;quot;&amp;gt; https://ru.wikipedia.org/wiki/Многомерное_нормальное_распределение&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея алгоритма заключается в линейном преобразовании n-мерного случайного вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, компоненты которого независимы и одинаково распределены по нормальному закону со стандартными параметрами, в случайный вектор &amp;lt;math&amp;gt;X&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;\Sigma&amp;lt;/math&amp;gt; и вектор математических ожиданий &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Sigma = \|\sigma_{ij}\| = \| \mathbb{E}[(X_{i} - m_{x_{i}})(X_{j} - m_{x_{j}})]\|, \\&lt;br /&gt;
M = (m_{x_{1}}, m_{x_{2}}, ..., m_{x_{n}})^T.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Требуется найти такую матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, которая позволяла бы получить искомый вектор &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; с требуемыми характеристиками в результате линейного преобразования &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — n-мерный случайный вектор с независимыми нормально распределенными компонентами со стандартными параметрами.&lt;br /&gt;
&lt;br /&gt;
Будем искать матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в виде нижней треугольной матрицы. Перейдем от матричной записи к системе алгебраических уравнений:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} X_{1} \\&lt;br /&gt;
 X_{2} \\ \vdots \\ X_{n} \end{pmatrix} =&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} b_{11} &amp;amp; 0 &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\b_{21} &amp;amp; b_{22} &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\ \vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \vdots&lt;br /&gt;
\\ b_{n1} &amp;amp; b_{n2} &amp;amp; \cdots &amp;amp; b_{nn}&lt;br /&gt;
\end{pmatrix} \times&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} Y_{1} \\&lt;br /&gt;
 Y_{2} \\ \vdots \\ Y_{n} \end{pmatrix} +&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} m_{x_{1}} \\&lt;br /&gt;
 m_{x_{2}} \\ \vdots \\ m_{x_{n}} \end{pmatrix} \Rightarrow&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}X_{1} - m_{x_{1}} = b_{11}Y_{1}&lt;br /&gt;
\\X_{2} - m_{x_{2}} = b_{21}Y_{1} + b_{22}Y_{2}&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\\X_{n} - m_{x_{n}} = b_{n1}Y_{1} + b_{n2}Y_{2} + \cdots + b_{nn}Y_{n}&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Поскольку компоненты вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; независимы и имеют стандартные параметры, справедливо выражение:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\mathbb{E}[Y_{i}Y_{j}] =&lt;br /&gt;
\left\{\begin{matrix} &lt;br /&gt;
1, &amp;amp;i = j, \\&lt;br /&gt;
0, &amp;amp;i \not= j.&lt;br /&gt;
\end{matrix}\right.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Почленно перемножив сами на себя и между собой соответственно левые и правые части уравнений системы и взяв от результатов перемножения математическое ожидание, получаем систему уравнений вида:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\mathbb{E}[(X_{1} - m_{x_{1}})(X_{1} - m_{x_{1}})] = \mathbb{E}[b_{11}Y_{1}b_{11}Y_{1}],&lt;br /&gt;
\\ \mathbb{E}[(X_{1} - m_{x_{1}})(X_{2} - m_{x_{2}})] = \mathbb{E}[(b_{21}Y_{1} + b_{22}Y_{2})b_{11}Y_{1}],&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, в левых частях полученной системы уравнений располагаются элементы заданной ковариационной матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;, а в правых — элементы искомой матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;. Последовательно решая эту систему, получаем формулы для расчета элементов &amp;lt;math&amp;gt;\sigma_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
b_{11}=\sqrt{\sigma_{11}}; b_{21}=\frac{\sigma_{12}}{\sqrt{\sigma_{11}}}; b_{22} = \sqrt{\sigma_{22} - \frac{\sigma_{12}}{\sigma_{11}}}, \cdots&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рекуррентная формула для расчета любого элемента матрицы преобразования &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b_{ij} = \frac {\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}} {\sqrt{\sigma_{jj} - \sum_{k=1}^{j-1} b_{jk}^2}}, \quad 1 \leqslant j \leqslant i \leqslant n&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(суммы с верхним нулевым пределом считаются равными нулю)&lt;br /&gt;
&lt;br /&gt;
Таким образом, матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; получается с помощью [[Разложение_Холецкого_(метод_квадратного_корня)|разложения Холецкого]] матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Генерация случайного вектора Y ====&lt;br /&gt;
&lt;br /&gt;
Пусть имеется генератор псевдослучайных чисел (ГПСЧ, PRNG), с помощью которого можно получить реализацию случайной величины &amp;lt;math&amp;gt;u \sim U(0,1) &amp;lt;/math&amp;gt;. Описанный выше случайный вектор &amp;lt;math&amp;gt;Y=(y_1, \dots, y_n)&amp;lt;/math&amp;gt; с независимыми компонентами составим из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; реализаций случайной величины &amp;lt;math&amp;gt;\eta \sim N(0,1)&amp;lt;/math&amp;gt;. Каждую такую реализацию &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;, в свою очередь, получим с помощью приближения по ЦПТ &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; случайными величинами, распределенными равномерно на отрезке [0,1]:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right), \quad i = \overline{1, n} \\&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;u_j^i - &amp;lt;/math&amp;gt; реализации случайной величины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;\kappa - &amp;lt;/math&amp;gt; параметр, обеспечивающий качество приближения.&lt;br /&gt;
&lt;br /&gt;
Как правило, &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; берут равным 12 и считают, что для подавляющего числа практических задач обеспечивается должная точность вычислений&amp;lt;ref name = &amp;quot;VVV&amp;quot;&amp;gt;Балдин К.В., Уткин В.Б. Информационные системы в экономике. — М.:Дашков и Кo, 2008. — 395 с.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&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;\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}, \quad 1 \leqslant j \leqslant i \leqslant n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;&lt;br /&gt;
* Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1) Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;b_{11}= \sqrt{\sigma_{11}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;b_{k1}= \frac{\sigma_{k1}}{l_{11}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad k = \overline{2,n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{2,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (c) &amp;lt;math&amp;gt;b_{ii} = \sqrt{\sigma_{ii} - \sum_{p = 1}^{i - 1} b_{ip}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (d) &amp;lt;math&amp;gt;b_{ji} = \frac{\sigma_{ji} - \sum_{p = 1}^{i - 1} b_{ip} b_{jp}} {l_{ii}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad i \neq n, j = \overline{i+1,n}&amp;lt;/math&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;u_j^i \leftarrow PRNG,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\quad j = \overline{1,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3) Вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i = m_{x_i} + \sum_{k = 1}^{i} b_{ik} y_{k}, \quad i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для генерации гауссовского случайного вектора порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; в последовательном варианте требуется:&lt;br /&gt;
* &amp;lt;math&amp;gt; n(n+1) + \frac {n(n-1)(n-2)}{6} &amp;lt;/math&amp;gt; (умножений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac {n(n+1)}{2} + \frac {n(n-1)(n-2)}{6} &amp;lt;/math&amp;gt; (вычитаний)&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac {n(n-1+2\kappa)}{2} &amp;lt;/math&amp;gt; (сложений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac {n(n+3)}{2} &amp;lt;/math&amp;gt; (делений)&lt;br /&gt;
* &amp;lt;math&amp;gt; 2n &amp;lt;/math&amp;gt; (вычислений квадратного корня)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{n}{6}\left(2n^2+9n+31+6\kappa\right) &amp;lt;/math&amp;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;
==== Заполнение матрицы B====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 1 макроструктуры алгоритма ([[Разложение_Холецкого_(метод_квадратного_корня)|&#039;&#039;разложения Холецкого&#039;&#039;]]) состоит из трёх групп вершин, расположенных в целочисленных узлах трёх областей разной размерности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин расположена в одномерной области, соответствующая ей операция вычисляет функцию SQRT. &lt;br /&gt;
Единственная координата каждой из вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргумент этой функции &lt;br /&gt;
	&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{11}&amp;lt;/math&amp;gt;; &lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ii}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин расположена в двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a / b&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;: &lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{j1}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1, j, i - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ji}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин расположена в трёхмерной области, соответствующая ей операция  &amp;lt;math&amp;gt;a - b * c&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; — меняется в диапазоне  от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;p = 1&amp;lt;/math&amp;gt; элемент входных данных &amp;lt;math&amp;gt;\sigma_{ji}&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;p &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i, j, p - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, i&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, j&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.1, выполненном для случая &amp;lt;math&amp;gt;n = 4&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
[[file:Cholesky full_in_out.png|thumb|center|1400px|Рисунок 1. Граф этапа 1 макроструктуры алгоритма. SQ — вычисление квадратного корня, F — операция a-bc, Div — деление, In — входные данные, Out — выходные.]]&lt;br /&gt;
&lt;br /&gt;
====Генерация вектора Y====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 2 макроструктуры алгоритма состоит из двух групп вершин, расположенных в целочисленных узлах двумерной области.&lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин. Соответствующая ей операция вычисляет функцию &amp;lt;math&amp;gt;S = a+b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a:&amp;lt;/math&amp;gt;&lt;br /&gt;
** при &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; — константа &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;j&amp;gt;1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатами &amp;lt;math&amp;gt;i,j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; — значение, поступающее с &amp;lt;math&amp;gt;PRNG&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин. Соответствующая ей операция вычисляет функцию &amp;lt;math&amp;gt;F = \left(a-\frac{\kappa}{2}\right)\sqrt{\frac{12}{\kappa}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; —  результат срабатывания операции, соответствующей вершине из первой группы, с координатами &amp;lt;math&amp;gt;i,\kappa&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; этапа &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.2, выполненном для случая &amp;lt;math&amp;gt;n = 2, \kappa = 2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf2.png|550px|thumb|center|Рисунок 2. Граф этапа 2 макроструктуры алгоритма]]&lt;br /&gt;
&lt;br /&gt;
====Вычисление вектора X====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 3 макроструктуры алгоритма (&#039;&#039;умножение нижней треугольной матрицы на вектор и сложение результата с другим вектором&#039;&#039;) состоит из одной группы вершин, расположенной в целочисленных узлах двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a+bc&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;j = 1&amp;lt;/math&amp;gt; — компонента &amp;lt;math&amp;gt;m_{x_i}&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;j &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине с координатами &amp;lt;math&amp;gt;i, j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;b_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;y_{j}&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является:&lt;br /&gt;
* при &amp;lt;math&amp;gt;j &amp;lt; i&amp;lt;/math&amp;gt; — &#039;&#039;промежуточным данным&#039;&#039; этапа;&lt;br /&gt;
* при &amp;lt;math&amp;gt;j = i&amp;lt;/math&amp;gt; — &#039;&#039;выходным данным&#039;&#039; алгоритма &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.3, выполненном для случая &amp;lt;math&amp;gt; n = 4&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf3.png|650px|thumb|center|Рисунок 3. Граф этапа 3 макроструктуры алгоритма,  F — операция a+bc]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для разложения Холецкого &amp;lt;math&amp;gt;(n \times n)&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; в параллельном варианте требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов с вычислением квадратного корня (единичные вычисления в каждом из ярусов),&lt;br /&gt;
* &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; ярус делений (в каждом из ярусов — линейное количество операций, в зависимости от яруса — от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt;),&lt;br /&gt;
* по &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; ярусов умножений и сложений/вычитаний (в каждом из ярусов — квадратичное количество операций, от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;\frac{n^2 - n}{2}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Для генерации &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; в параллельном варианте требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; ярусов сложений (&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций в каждом из ярусов),&lt;br /&gt;
* &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; ярус вычитаний, делений, умножений, вычислений квадратного корня (&amp;lt;math&amp;gt;n, 2n, n, n&amp;lt;/math&amp;gt; операций соответственно),&lt;br /&gt;
&lt;br /&gt;
Для вычисления &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; в параллельном варианте требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений (в каждом из ярусов — линейное количество операций, в зависимости от яруса — от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ алгоритм имеет сложность &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, а при классификации по ширине ЯПФ — &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: вещественная всюду плотная положительно определенная симметрическая  &amp;lt;math&amp;gt;(n \times n)&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;\Sigma&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;
* Выходные данные: вещественный &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектор &amp;lt;math&amp;gt;X&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;syntaxhighlight lang = c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// compute matrix B (core)&lt;br /&gt;
for (int j = 0; j &amp;lt; n; j++){&lt;br /&gt;
    double sum_down = matrix_cov[j][j];&lt;br /&gt;
    for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
        double cur = matrix_cov[j][k];&lt;br /&gt;
        sum_down -= cur * cur;&lt;br /&gt;
    }&lt;br /&gt;
    matrix_cov[j][j] = sqrt(sum_down);&lt;br /&gt;
    for (int i = j + 1; i &amp;lt; n; i++){&lt;br /&gt;
        double sum_up = matrix_cov[i][j];&lt;br /&gt;
        for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
            sum_up -= matrix_cov[i][k] * matrix_cov[j][k];&lt;br /&gt;
        }&lt;br /&gt;
        matrix_cov[i][j] = sum_up / matrix_cov[j][j];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
// generate vector Y&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){&lt;br /&gt;
    double sum = generate_uniform(n);&lt;br /&gt;
    for (int j = 0; j &amp;lt; CLT_NUM - 1; j++){&lt;br /&gt;
        sum += generate_uniform(n);&lt;br /&gt;
    }&lt;br /&gt;
    vec_Y[i] = (sum - CLT_NUM / 2) * sqrt(12.0 / CLT_NUM);&lt;br /&gt;
}&lt;br /&gt;
// linear transformation&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){  &lt;br /&gt;
    vec_X[i] = vec_exp[i];&lt;br /&gt;
    for (int k = 0; k &amp;lt;= i; k++){&lt;br /&gt;
        vec_X[i] += matrix_cov[i][k] * vec_Y[k];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В данной реализации алгоритма весь ресурс параллелизма использован в следующих этапах:&lt;br /&gt;
* вычисление элементов матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в рамках столбца (под диагональю),&lt;br /&gt;
* генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;,&lt;br /&gt;
* вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (умножение матрицы на вектор, сложение векторов).&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Алгоритм был реализован на языке C++ с использованием Intel MPI Library и запущен на кластере regular4.&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add impi/5.0.1&lt;br /&gt;
 mpicxx -std=c++0x task.c -o _scratch/task&lt;br /&gt;
 sbatch -n256 impi ./task &amp;lt;matrix_size&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
* размер матрицы [1024 : 4864] с шагом 256,&lt;br /&gt;
* число ядер [2 : 256] с шагом по степеням 2.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:Ops_2.png|thumb|center|700px|Рисунок 4. Изменение производительности в зависимости от числа ядер и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
[[file:Eff_2.png|thumb|center|700px|Рисунок 5. Изменение эффективности реализации в зависимости от числа ядер и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
[[file:Eff_2_up.png|thumb|center|700px|Рисунок 6. Изменение эффективности реализации, вид сверху.]]&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;По размеру задачи&#039;&#039;&#039; — при увеличении размерности матрицы эффективность реализации постепенно увеличивается, при этом тем быстрее, чем большее число ядер задействовано.&lt;br /&gt;
* &#039;&#039;&#039;По числу ядер&#039;&#039;&#039; — при увеличении числа mpi-процессов эффективность реализации снижается. Это объясняется ростом накладных расходов на организацию параллельного выполнения. При этом с ростом размерности матрицы эффективность снижается с такой же скоростью, но уже при больших значениях числа mpi-процессов.&lt;br /&gt;
* &#039;&#039;&#039;По двум направлениям&#039;&#039;&#039; — эффективность реализации возрастает (на рассматриваемой области значений параметров), но крайне медленно.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/mensigo/skipod/blob/master/mpi_gauss_vec_gen.c Параллельная реализация на C++]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
MS Excel и распространённые статистические пакеты (напр., SPSS, Statistica) позволяют моделировать только одномерные статистические распределения. Имеется возможность &amp;quot;собрать&amp;quot; многомерное распределение из нескольких одномерных при условии, что компоненты независимы. Однако если необходимо исследовать данные с зависящими друг от друга переменными, то приходится писать собственную программу. При этом удобно воспользоваться готовой реализацией разложения Холецкого (точечного метода), представленной в таких прикладных пакетах, как LINPACK, LAPACK, SCALAPACK.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Lonalone</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26779</id>
		<title>Участник:Lonalone/Генерация гауссовского вектора методом линейных преобразований</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26779"/>
		<updated>2018-12-08T06:37:40Z</updated>

		<summary type="html">&lt;p&gt;Lonalone: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор описания: &#039;&#039;Меньших И. М.&#039;&#039;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из многомерных распределений особый интерес представляет нормальное. Этому закону подчиняются все результаты воздействия большого числа случайных факторов, среди которых нет превалирующих.&lt;br /&gt;
&lt;br /&gt;
В статье приведен алгоритм генерации n-мерного гауссовского случайного вектора с помощью &#039;&#039;метода линейных преобразований&#039;&#039;&amp;lt;ref name=&amp;quot;V&amp;quot;&amp;gt;Михайлов Г.А., Войтишек А.В. Численное статистическое моделирование. Методы Монте-Карло — М.: Академия, 2006. — 368 с.&amp;lt;/ref&amp;gt;. Известно, что случае нормально распределенного случайного вектора, ковариационная матрица вместе с математическим ожиданием этого вектора полностью определяют его распределение. Поэтому для полного статистического соответствия моделируемого и теоретического распределения гауссовского вектора достаточно обеспечить требуемые значения указанных параметров&amp;lt;ref name=&amp;quot;VV&amp;quot;&amp;gt; https://ru.wikipedia.org/wiki/Многомерное_нормальное_распределение&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея алгоритма заключается в линейном преобразовании n-мерного случайного вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, компоненты которого независимы и одинаково распределены по нормальному закону со стандартными параметрами, в случайный вектор &amp;lt;math&amp;gt;X&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;\Sigma&amp;lt;/math&amp;gt; и вектор математических ожиданий &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Sigma = \|\sigma_{ij}\| = \| \mathbb{E}[(X_{i} - m_{x_{i}})(X_{j} - m_{x_{j}})]\|, \\&lt;br /&gt;
M = (m_{x_{1}}, m_{x_{2}}, ..., m_{x_{n}})^T.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Требуется найти такую матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, которая позволяла бы получить искомый вектор &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; с требуемыми характеристиками в результате линейного преобразования &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — n-мерный случайный вектор с независимыми нормально распределенными компонентами со стандартными параметрами.&lt;br /&gt;
&lt;br /&gt;
Будем искать матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в виде нижней треугольной матрицы. Перейдем от матричной записи к системе алгебраических уравнений:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} X_{1} \\&lt;br /&gt;
 X_{2} \\ \vdots \\ X_{n} \end{pmatrix} =&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} b_{11} &amp;amp; 0 &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\b_{21} &amp;amp; b_{22} &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\ \vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \vdots&lt;br /&gt;
\\ b_{n1} &amp;amp; b_{n2} &amp;amp; \cdots &amp;amp; b_{nn}&lt;br /&gt;
\end{pmatrix} \times&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} Y_{1} \\&lt;br /&gt;
 Y_{2} \\ \vdots \\ Y_{n} \end{pmatrix} +&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} m_{x_{1}} \\&lt;br /&gt;
 m_{x_{2}} \\ \vdots \\ m_{x_{n}} \end{pmatrix} \Rightarrow&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}X_{1} - m_{x_{1}} = b_{11}Y_{1}&lt;br /&gt;
\\X_{2} - m_{x_{2}} = b_{21}Y_{1} + b_{22}Y_{2}&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\\X_{n} - m_{x_{n}} = b_{n1}Y_{1} + b_{n2}Y_{2} + \cdots + b_{nn}Y_{n}&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Поскольку компоненты вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; независимы и имеют стандартные параметры, справедливо выражение:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\mathbb{E}[Y_{i}Y_{j}] =&lt;br /&gt;
\left\{\begin{matrix} &lt;br /&gt;
1, &amp;amp;i = j, \\&lt;br /&gt;
0, &amp;amp;i \not= j.&lt;br /&gt;
\end{matrix}\right.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Почленно перемножив сами на себя и между собой соответственно левые и правые части уравнений системы и взяв от результатов перемножения математическое ожидание, получаем систему уравнений вида:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\mathbb{E}[(X_{1} - m_{x_{1}})(X_{1} - m_{x_{1}})] = \mathbb{E}[b_{11}Y_{1}b_{11}Y_{1}],&lt;br /&gt;
\\ \mathbb{E}[(X_{1} - m_{x_{1}})(X_{2} - m_{x_{2}})] = \mathbb{E}[(b_{21}Y_{1} + b_{22}Y_{2})b_{11}Y_{1}],&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, в левых частях полученной системы уравнений располагаются элементы заданной ковариационной матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;, а в правых — элементы искомой матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;. Последовательно решая эту систему, получаем формулы для расчета элементов &amp;lt;math&amp;gt;\sigma_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
b_{11}=\sqrt{\sigma_{11}}; b_{21}=\frac{\sigma_{12}}{\sqrt{\sigma_{11}}}; b_{22} = \sqrt{\sigma_{22} - \frac{\sigma_{12}}{\sigma_{11}}}, \cdots&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рекуррентная формула для расчета любого элемента матрицы преобразования &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b_{ij} = \frac {\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}} {\sqrt{\sigma_{jj} - \sum_{k=1}^{j-1} b_{jk}^2}}, \quad 1 \leqslant j \leqslant i \leqslant n&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(суммы с верхним нулевым пределом считаются равными нулю)&lt;br /&gt;
&lt;br /&gt;
Таким образом, матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; получается с помощью [[Разложение_Холецкого_(метод_квадратного_корня)|разложения Холецкого]] матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Генерация случайного вектора Y ====&lt;br /&gt;
&lt;br /&gt;
Пусть имеется генератор псевдослучайных чисел (ГПСЧ, PRNG), с помощью которого можно получить реализацию случайной величины &amp;lt;math&amp;gt;u \sim U(0,1) &amp;lt;/math&amp;gt;. Описанный выше случайный вектор &amp;lt;math&amp;gt;Y=(y_1, \dots, y_n)&amp;lt;/math&amp;gt; с независимыми компонентами составим из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; реализаций случайной величины &amp;lt;math&amp;gt;\eta \sim N(0,1)&amp;lt;/math&amp;gt;. Каждую такую реализацию &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;, в свою очередь, получим с помощью приближения по ЦПТ &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; случайными величинами, распределенными равномерно на отрезке [0,1]:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right), \quad i = \overline{1, n} \\&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;u_j^i - &amp;lt;/math&amp;gt; реализации случайной величины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;\kappa - &amp;lt;/math&amp;gt; параметр, обеспечивающий качество приближения.&lt;br /&gt;
&lt;br /&gt;
Как правило, &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; берут равным 12 и считают, что для подавляющего числа практических задач обеспечивается должная точность вычислений&amp;lt;ref name = &amp;quot;VVV&amp;quot;&amp;gt;Балдин К.В., Уткин В.Б. Информационные системы в экономике. — М.:Дашков и Кo, 2008. — 395 с.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&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;\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}, \quad 1 \leqslant j \leqslant i \leqslant n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;&lt;br /&gt;
* Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1) Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;b_{11}= \sqrt{\sigma_{11}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;b_{k1}= \frac{\sigma_{k1}}{l_{11}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad k = \overline{2,n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{2,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (c) &amp;lt;math&amp;gt;b_{ii} = \sqrt{\sigma_{ii} - \sum_{p = 1}^{i - 1} b_{ip}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (d) &amp;lt;math&amp;gt;b_{ji} = \frac{\sigma_{ji} - \sum_{p = 1}^{i - 1} b_{ip} b_{jp}} {l_{ii}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad i \neq n, j = \overline{i+1,n}&amp;lt;/math&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;u_j^i \leftarrow PRNG,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\quad j = \overline{1,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3) Вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i = m_{x_i} + \sum_{k = 1}^{i} b_{ik} y_{k}, \quad i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt; n(n+1) + \frac {n(n-1)(n-2)}{6} &amp;lt;/math&amp;gt; (умножений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac {n(n+1)}{2} + \frac {n(n-1)(n-2)}{6} &amp;lt;/math&amp;gt; (вычитаний)&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac {n(n-1+2\kappa)}{2} &amp;lt;/math&amp;gt; (сложений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac {n(n+3)}{2} &amp;lt;/math&amp;gt; (делений)&lt;br /&gt;
* &amp;lt;math&amp;gt; 2n &amp;lt;/math&amp;gt; (взятия квадратного корня)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{n}{6}\left(2n^2+9n+31+6\kappa\right) &amp;lt;/math&amp;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;
==== Заполнение матрицы B====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 1 макроструктуры алгоритма ([[Разложение_Холецкого_(метод_квадратного_корня)|&#039;&#039;разложения Холецкого&#039;&#039;]]) состоит из трёх групп вершин, расположенных в целочисленных узлах трёх областей разной размерности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин расположена в одномерной области, соответствующая ей операция вычисляет функцию SQRT. &lt;br /&gt;
Единственная координата каждой из вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргумент этой функции &lt;br /&gt;
	&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{11}&amp;lt;/math&amp;gt;; &lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ii}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин расположена в двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a / b&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;: &lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{j1}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1, j, i - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ji}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин расположена в трёхмерной области, соответствующая ей операция  &amp;lt;math&amp;gt;a - b * c&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; — меняется в диапазоне  от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;p = 1&amp;lt;/math&amp;gt; элемент входных данных &amp;lt;math&amp;gt;\sigma_{ji}&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;p &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i, j, p - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, i&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, j&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.1, выполненном для случая &amp;lt;math&amp;gt;n = 4&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
[[file:Cholesky full_in_out.png|thumb|center|1400px|Рисунок 1. Граф этапа 1 макроструктуры алгоритма. SQ — вычисление квадратного корня, F — операция a-bc, Div — деление, In — входные данные, Out — выходные.]]&lt;br /&gt;
&lt;br /&gt;
====Генерация вектора Y====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 2 макроструктуры алгоритма состоит из двух групп вершин, расположенных в целочисленных узлах двумерной области.&lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин. Соответствующая ей операция вычисляет функцию &amp;lt;math&amp;gt;S = a+b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a:&amp;lt;/math&amp;gt;&lt;br /&gt;
** при &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; — константа &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;j&amp;gt;1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатами &amp;lt;math&amp;gt;i,j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; — значение, поступающее с &amp;lt;math&amp;gt;PRNG&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин. Соответствующая ей операция вычисляет функцию &amp;lt;math&amp;gt;F = \left(a-\frac{\kappa}{2}\right)\sqrt{\frac{12}{\kappa}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; —  результат срабатывания операции, соответствующей вершине из первой группы, с координатами &amp;lt;math&amp;gt;i,\kappa&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; этапа &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.2, выполненном для случая &amp;lt;math&amp;gt;n = 2, \kappa = 2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf2.png|550px|thumb|center|Рисунок 2. Граф этапа 2 макроструктуры алгоритма]]&lt;br /&gt;
&lt;br /&gt;
====Вычисление вектора X====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 3 макроструктуры алгоритма (&#039;&#039;умножение нижней треугольной матрицы на вектор и сложение результата с другим вектором&#039;&#039;) состоит из одной группы вершин, расположенной в целочисленных узлах двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a+bc&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;j = 1&amp;lt;/math&amp;gt; — компонента &amp;lt;math&amp;gt;m_{x_i}&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;j &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине с координатами &amp;lt;math&amp;gt;i, j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;b_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;y_{j}&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является:&lt;br /&gt;
* при &amp;lt;math&amp;gt;j &amp;lt; i&amp;lt;/math&amp;gt; — &#039;&#039;промежуточным данным&#039;&#039; этапа;&lt;br /&gt;
* при &amp;lt;math&amp;gt;j = i&amp;lt;/math&amp;gt; — &#039;&#039;выходным данным&#039;&#039; алгоритма &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.3, выполненном для случая &amp;lt;math&amp;gt; n = 4&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf3.png|650px|thumb|center|Рисунок 3. Граф этапа 3 макроструктуры алгоритма,  F — операция a+bc]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для разложения Холецкого &amp;lt;math&amp;gt;(n \times n)&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; в параллельном варианте требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов с вычислением квадратного корня (единичные вычисления в каждом из ярусов),&lt;br /&gt;
* &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; ярус делений (в каждом из ярусов — линейное количество операций, в зависимости от яруса — от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt;),&lt;br /&gt;
* по &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; ярусов умножений и сложений/вычитаний (в каждом из ярусов — квадратичное количество операций, от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;\frac{n^2 - n}{2}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Для генерации &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; в параллельном варианте требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; ярусов сложений (&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций в каждом из ярусов),&lt;br /&gt;
* &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; ярус вычитаний, делений, умножений, вычислений квадратного корня (&amp;lt;math&amp;gt;n, 2n, n, n&amp;lt;/math&amp;gt; операций соответственно),&lt;br /&gt;
&lt;br /&gt;
Для вычисления &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; в параллельном варианте требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений (в каждом из ярусов — линейное количество операций, в зависимости от яруса — от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ алгоритм имеет сложность &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, а при классификации по ширине ЯПФ — &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: вещественная всюду плотная положительно определенная симметрическая  &amp;lt;math&amp;gt;(n \times n)&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;\Sigma&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;
* Выходные данные: вещественный &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектор &amp;lt;math&amp;gt;X&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;syntaxhighlight lang = c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// compute matrix B (core)&lt;br /&gt;
for (int j = 0; j &amp;lt; n; j++){&lt;br /&gt;
    double sum_down = matrix_cov[j][j];&lt;br /&gt;
    for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
        double cur = matrix_cov[j][k];&lt;br /&gt;
        sum_down -= cur * cur;&lt;br /&gt;
    }&lt;br /&gt;
    matrix_cov[j][j] = sqrt(sum_down);&lt;br /&gt;
    for (int i = j + 1; i &amp;lt; n; i++){&lt;br /&gt;
        double sum_up = matrix_cov[i][j];&lt;br /&gt;
        for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
            sum_up -= matrix_cov[i][k] * matrix_cov[j][k];&lt;br /&gt;
        }&lt;br /&gt;
        matrix_cov[i][j] = sum_up / matrix_cov[j][j];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
// generate vector Y&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){&lt;br /&gt;
    double sum = generate_uniform(n);&lt;br /&gt;
    for (int j = 0; j &amp;lt; CLT_NUM - 1; j++){&lt;br /&gt;
        sum += generate_uniform(n);&lt;br /&gt;
    }&lt;br /&gt;
    vec_Y[i] = (sum - CLT_NUM / 2) * sqrt(12.0 / CLT_NUM);&lt;br /&gt;
}&lt;br /&gt;
// linear transformation&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){  &lt;br /&gt;
    vec_X[i] = vec_exp[i];&lt;br /&gt;
    for (int k = 0; k &amp;lt;= i; k++){&lt;br /&gt;
        vec_X[i] += matrix_cov[i][k] * vec_Y[k];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В данной реализации алгоритма весь ресурс параллелизма использован в следующих этапах:&lt;br /&gt;
* вычисление элементов матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в рамках столбца (под диагональю),&lt;br /&gt;
* генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;,&lt;br /&gt;
* вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (умножение матрицы на вектор, сложение векторов).&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Алгоритм был реализован на языке C++ с использованием Intel MPI Library и запущен на кластере regular4.&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add impi/5.0.1&lt;br /&gt;
 mpicxx -std=c++0x task.c -o _scratch/task&lt;br /&gt;
 sbatch -n256 impi ./task &amp;lt;matrix_size&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
* размер матрицы [1024 : 4864] с шагом 256,&lt;br /&gt;
* число ядер [2 : 256] с шагом по степеням 2.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:Ops_2.png|thumb|center|700px|Рисунок 4. Изменение производительности в зависимости от числа ядер и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
[[file:Eff_2.png|thumb|center|700px|Рисунок 5. Изменение эффективности реализации в зависимости от числа ядер и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
[[file:Eff_2_up.png|thumb|center|700px|Рисунок 6. Изменение эффективности реализации, вид сверху.]]&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;По размеру задачи&#039;&#039;&#039; — при увеличении размерности матрицы эффективность реализации постепенно увеличивается, при этом тем быстрее, чем большее число ядер задействовано.&lt;br /&gt;
* &#039;&#039;&#039;По числу ядер&#039;&#039;&#039; — при увеличении числа mpi-процессов эффективность реализации снижается. Это объясняется ростом накладных расходов на организацию параллельного выполнения. При этом с ростом размерности матрицы эффективность снижается с такой же скоростью, но уже при больших значениях числа mpi-процессов.&lt;br /&gt;
* &#039;&#039;&#039;По двум направлениям&#039;&#039;&#039; — эффективность реализации возрастает (на рассматриваемой области значений параметров), но крайне медленно.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/mensigo/skipod/blob/master/mpi_gauss_vec_gen.c Параллельная реализация на C++]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
MS Excel и распространённые статистические пакеты (напр., SPSS, Statistica) позволяют моделировать только одномерные статистические распределения. Имеется возможность &amp;quot;собрать&amp;quot; многомерное распределение из нескольких одномерных при условии, что компоненты независимы. Однако если необходимо исследовать данные с зависящими друг от друга переменными, то приходится писать собственную программу. При этом удобно воспользоваться готовой реализацией разложения Холецкого (точечного метода), представленной в таких прикладных пакетах, как LINPACK, LAPACK, SCALAPACK.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Lonalone</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26778</id>
		<title>Участник:Lonalone/Генерация гауссовского вектора методом линейных преобразований</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26778"/>
		<updated>2018-12-08T06:20:54Z</updated>

		<summary type="html">&lt;p&gt;Lonalone: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор описания: &#039;&#039;Меньших И. М.&#039;&#039;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из многомерных распределений особый интерес представляет нормальное. Этому закону подчиняются все результаты воздействия большого числа случайных факторов, среди которых нет превалирующих.&lt;br /&gt;
&lt;br /&gt;
В статье приведен алгоритм генерации n-мерного гауссовского случайного вектора с помощью &#039;&#039;метода линейных преобразований&#039;&#039;&amp;lt;ref name=&amp;quot;V&amp;quot;&amp;gt;Михайлов Г.А., Войтишек А.В. Численное статистическое моделирование. Методы Монте-Карло — М.: Академия, 2006. — 368 с.&amp;lt;/ref&amp;gt;. Известно, что случае нормально распределенного случайного вектора, ковариационная матрица вместе с математическим ожиданием этого вектора полностью определяют его распределение. Поэтому для полного статистического соответствия моделируемого и теоретического распределения гауссовского вектора достаточно обеспечить требуемые значения указанных параметров&amp;lt;ref name=&amp;quot;VV&amp;quot;&amp;gt; https://ru.wikipedia.org/wiki/Многомерное_нормальное_распределение&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея алгоритма заключается в линейном преобразовании n-мерного случайного вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, компоненты которого независимы и одинаково распределены по нормальному закону со стандартными параметрами, в случайный вектор &amp;lt;math&amp;gt;X&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;\Sigma&amp;lt;/math&amp;gt; и вектор математических ожиданий &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Sigma = \|\sigma_{ij}\| = \| \mathbb{E}[(X_{i} - m_{x_{i}})(X_{j} - m_{x_{j}})]\|, \\&lt;br /&gt;
M = (m_{x_{1}}, m_{x_{2}}, ..., m_{x_{n}})^T.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Требуется найти такую матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, которая позволяла бы получить искомый вектор &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; с требуемыми характеристиками в результате линейного преобразования &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — n-мерный случайный вектор с независимыми нормально распределенными компонентами со стандартными параметрами.&lt;br /&gt;
&lt;br /&gt;
Будем искать матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в виде нижней треугольной матрицы. Перейдем от матричной записи к системе алгебраических уравнений:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} X_{1} \\&lt;br /&gt;
 X_{2} \\ \vdots \\ X_{n} \end{pmatrix} =&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} b_{11} &amp;amp; 0 &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\b_{21} &amp;amp; b_{22} &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\ \vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \vdots&lt;br /&gt;
\\ b_{n1} &amp;amp; b_{n2} &amp;amp; \cdots &amp;amp; b_{nn}&lt;br /&gt;
\end{pmatrix} \times&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} Y_{1} \\&lt;br /&gt;
 Y_{2} \\ \vdots \\ Y_{n} \end{pmatrix} +&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} m_{x_{1}} \\&lt;br /&gt;
 m_{x_{2}} \\ \vdots \\ m_{x_{n}} \end{pmatrix} \Rightarrow&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}X_{1} - m_{x_{1}} = b_{11}Y_{1}&lt;br /&gt;
\\X_{2} - m_{x_{2}} = b_{21}Y_{1} + b_{22}Y_{2}&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\\X_{n} - m_{x_{n}} = b_{n1}Y_{1} + b_{n2}Y_{2} + \cdots + b_{nn}Y_{n}&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Поскольку компоненты вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; независимы и имеют стандартные параметры, справедливо выражение:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\mathbb{E}[Y_{i}Y_{j}] =&lt;br /&gt;
\left\{\begin{matrix} &lt;br /&gt;
1, &amp;amp;i = j, \\&lt;br /&gt;
0, &amp;amp;i \not= j.&lt;br /&gt;
\end{matrix}\right.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Почленно перемножив сами на себя и между собой соответственно левые и правые части уравнений системы и взяв от результатов перемножения математическое ожидание, получаем систему уравнений вида:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\mathbb{E}[(X_{1} - m_{x_{1}})(X_{1} - m_{x_{1}})] = \mathbb{E}[b_{11}Y_{1}b_{11}Y_{1}],&lt;br /&gt;
\\ \mathbb{E}[(X_{1} - m_{x_{1}})(X_{2} - m_{x_{2}})] = \mathbb{E}[(b_{21}Y_{1} + b_{22}Y_{2})b_{11}Y_{1}],&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, в левых частях полученной системы уравнений располагаются элементы заданной ковариационной матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;, а в правых — элементы искомой матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;. Последовательно решая эту систему, получаем формулы для расчета элементов &amp;lt;math&amp;gt;\sigma_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
b_{11}=\sqrt{\sigma_{11}}; b_{21}=\frac{\sigma_{12}}{\sqrt{\sigma_{11}}}; b_{22} = \sqrt{\sigma_{22} - \frac{\sigma_{12}}{\sigma_{11}}}, \cdots&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рекуррентная формула для расчета любого элемента матрицы преобразования &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b_{ij} = \frac {\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}} {\sqrt{\sigma_{jj} - \sum_{k=1}^{j-1} b_{jk}^2}}, \quad 1 \leqslant j \leqslant i \leqslant n&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(суммы с верхним нулевым пределом считаются равными нулю)&lt;br /&gt;
&lt;br /&gt;
Таким образом, матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; получается с помощью [[Разложение_Холецкого_(метод_квадратного_корня)|разложения Холецкого]] матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Генерация случайного вектора Y ====&lt;br /&gt;
&lt;br /&gt;
Пусть имеется генератор псевдослучайных чисел (ГПСЧ, PRNG), с помощью которого можно получить реализацию случайной величины &amp;lt;math&amp;gt;u \sim U(0,1) &amp;lt;/math&amp;gt;. Описанный выше случайный вектор &amp;lt;math&amp;gt;Y=(y_1, \dots, y_n)&amp;lt;/math&amp;gt; с независимыми компонентами составим из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; реализаций случайной величины &amp;lt;math&amp;gt;\eta \sim N(0,1)&amp;lt;/math&amp;gt;. Каждую такую реализацию &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;, в свою очередь, получим с помощью приближения по ЦПТ &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; случайными величинами, распределенными равномерно на отрезке [0,1]:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right), \quad i = \overline{1, n} \\&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;u_j^i - &amp;lt;/math&amp;gt; реализации случайной величины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;\kappa - &amp;lt;/math&amp;gt; параметр, обеспечивающий качество приближения.&lt;br /&gt;
&lt;br /&gt;
Как правило, &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; берут равным 12 и считают, что для подавляющего числа практических задач обеспечивается должная точность вычислений&amp;lt;ref name = &amp;quot;VVV&amp;quot;&amp;gt;Балдин К.В., Уткин В.Б. Информационные системы в экономике. — М.:Дашков и Кo, 2008. — 395 с.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&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;\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}, \quad 1 \leqslant j \leqslant i \leqslant n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;&lt;br /&gt;
* Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1) Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;b_{11}= \sqrt{\sigma_{11}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;b_{k1}= \frac{\sigma_{k1}}{l_{11}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad k = \overline{2,n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{2,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (c) &amp;lt;math&amp;gt;b_{ii} = \sqrt{\sigma_{ii} - \sum_{p = 1}^{i - 1} b_{ip}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (d) &amp;lt;math&amp;gt;b_{ji} = \frac{\sigma_{ji} - \sum_{p = 1}^{i - 1} b_{ip} b_{jp}} {l_{ii}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad i \neq n, j = \overline{i+1,n}&amp;lt;/math&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;u_j^i \leftarrow PRNG,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\quad j = \overline{1,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3) Вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i = m_{x_i} + \sum_{k = 1}^{i} b_{ik} y_{k}, \quad i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt; n(n+1) + \frac {n(n-1)(n-2)}{6} &amp;lt;/math&amp;gt; (умножений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac {n(n+1)}{2} + \frac {n(n-1)(n-2)}{6} &amp;lt;/math&amp;gt; (вычитаний)&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac {n(n-1+2\kappa)}{2} &amp;lt;/math&amp;gt; (сложений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac {n(n+3)}{2} &amp;lt;/math&amp;gt; (делений)&lt;br /&gt;
* &amp;lt;math&amp;gt; 2n &amp;lt;/math&amp;gt; (взятия квадратного корня)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{n}{6}\left(2n^2+9n+31+6\kappa\right) &amp;lt;/math&amp;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;
==== Заполнение матрицы B====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 1 макроструктуры алгоритма ([[Разложение_Холецкого_(метод_квадратного_корня)|&#039;&#039;разложения Холецкого&#039;&#039;]]) состоит из трёх групп вершин, расположенных в целочисленных узлах трёх областей разной размерности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин расположена в одномерной области, соответствующая ей операция вычисляет функцию SQRT. &lt;br /&gt;
Единственная координата каждой из вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргумент этой функции &lt;br /&gt;
	&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{11}&amp;lt;/math&amp;gt;; &lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ii}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин расположена в двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a / b&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;: &lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{j1}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1, j, i - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ji}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин расположена в трёхмерной области, соответствующая ей операция  &amp;lt;math&amp;gt;a - b * c&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; — меняется в диапазоне  от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;p = 1&amp;lt;/math&amp;gt; элемент входных данных &amp;lt;math&amp;gt;\sigma_{ji}&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;p &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i, j, p - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, i&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, j&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.1, выполненном для случая &amp;lt;math&amp;gt;n = 4&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
[[file:Cholesky full_in_out.png|thumb|center|1400px|Рисунок 1. Граф этапа 1 макроструктуры алгоритма. SQ — вычисление квадратного корня, F — операция a-bc, Div — деление, In — входные данные, Out — выходные.]]&lt;br /&gt;
&lt;br /&gt;
====Генерация вектора Y====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 2 макроструктуры алгоритма состоит из двух групп вершин, расположенных в целочисленных узлах двумерной области.&lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин. Соответствующая ей операция вычисляет функцию &amp;lt;math&amp;gt;S = a+b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a:&amp;lt;/math&amp;gt;&lt;br /&gt;
** при &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; — константа &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;j&amp;gt;1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатами &amp;lt;math&amp;gt;i,j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; — значение, поступающее с &amp;lt;math&amp;gt;PRNG&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин. Соответствующая ей операция вычисляет функцию &amp;lt;math&amp;gt;F = \left(a-\frac{\kappa}{2}\right)\sqrt{\frac{12}{\kappa}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; —  результат срабатывания операции, соответствующей вершине из первой группы, с координатами &amp;lt;math&amp;gt;i,\kappa&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; этапа &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.2, выполненном для случая &amp;lt;math&amp;gt;n = 2, \kappa = 2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf2.png|550px|thumb|center|Рисунок 2. Граф этапа 2 макроструктуры алгоритма]]&lt;br /&gt;
&lt;br /&gt;
====Вычисление вектора X====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 3 макроструктуры алгоритма (&#039;&#039;умножение нижней треугольной матрицы на вектор и сложение результата с другим вектором&#039;&#039;) состоит из одной группы вершин, расположенной в целочисленных узлах двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a+bc&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;j = 1&amp;lt;/math&amp;gt; — компонента &amp;lt;math&amp;gt;m_{x_i}&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;j &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине с координатами &amp;lt;math&amp;gt;i, j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;b_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;y_{j}&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является:&lt;br /&gt;
* при &amp;lt;math&amp;gt;j &amp;lt; i&amp;lt;/math&amp;gt; — &#039;&#039;промежуточным данным&#039;&#039; этапа;&lt;br /&gt;
* при &amp;lt;math&amp;gt;j = i&amp;lt;/math&amp;gt; — &#039;&#039;выходным данным&#039;&#039; алгоритма &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.3, выполненном для случая &amp;lt;math&amp;gt; n = 4&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf3.png|650px|thumb|center|Рисунок 3. Граф этапа 3 макроструктуры алгоритма,  F — операция a+bc]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для разложения Холецкого &amp;lt;math&amp;gt;(n \times n)&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; в параллельном варианте требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов с вычислением квадратного корня (единичные вычисления в каждом из ярусов),&lt;br /&gt;
* &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; ярус делений (в каждом из ярусов — линейное количество операций, в зависимости от яруса — от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt;),&lt;br /&gt;
* по &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; ярусов умножений и сложений/вычитаний (в каждом из ярусов — квадратичное количество операций, от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;\frac{n^2 - n}{2}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Для генерации &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; в параллельном варианте требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; ярусов сложений (&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; вычислений в каждом из ярусов),&lt;br /&gt;
* &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; ярус вычитаний, делений, умножений, вычислений квадратного корня (&amp;lt;math&amp;gt;n, 2n, n, n&amp;lt;/math&amp;gt; операций соответственно),&lt;br /&gt;
&lt;br /&gt;
Для вычисления &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; в параллельном варианте требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений (в каждом из ярусов — линейное количество операций, в зависимости от яруса — от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ алгоритм имеет сложность &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, а при классификации по ширине ЯПФ — &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: вещественная всюду плотная положительно определенная симметрическая  &amp;lt;math&amp;gt;(n \times n)&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;\Sigma&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;
* Выходные данные: вещественный &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектор &amp;lt;math&amp;gt;X&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;syntaxhighlight lang = c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// compute matrix B (core)&lt;br /&gt;
for (int j = 0; j &amp;lt; n; j++){&lt;br /&gt;
    double sum_down = matrix_cov[j][j];&lt;br /&gt;
    for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
        double cur = matrix_cov[j][k];&lt;br /&gt;
        sum_down -= cur * cur;&lt;br /&gt;
    }&lt;br /&gt;
    matrix_cov[j][j] = sqrt(sum_down);&lt;br /&gt;
    for (int i = j + 1; i &amp;lt; n; i++){&lt;br /&gt;
        double sum_up = matrix_cov[i][j];&lt;br /&gt;
        for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
            sum_up -= matrix_cov[i][k] * matrix_cov[j][k];&lt;br /&gt;
        }&lt;br /&gt;
        matrix_cov[i][j] = sum_up / matrix_cov[j][j];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
// generate vector Y&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){&lt;br /&gt;
    double sum = generate_uniform(n);&lt;br /&gt;
    for (int j = 0; j &amp;lt; CLT_NUM - 1; j++){&lt;br /&gt;
        sum += generate_uniform(n);&lt;br /&gt;
    }&lt;br /&gt;
    vec_Y[i] = (sum - CLT_NUM / 2) * sqrt(12.0 / CLT_NUM);&lt;br /&gt;
}&lt;br /&gt;
// linear transformation&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){  &lt;br /&gt;
    vec_X[i] = vec_exp[i];&lt;br /&gt;
    for (int k = 0; k &amp;lt;= i; k++){&lt;br /&gt;
        vec_X[i] += matrix_cov[i][k] * vec_Y[k];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В данной реализации алгоритма весь ресурс параллелизма использован в следующих этапах:&lt;br /&gt;
* вычисление элементов матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в рамках столбца (под диагональю),&lt;br /&gt;
* генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;,&lt;br /&gt;
* вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (умножение матрицы на вектор, сложение векторов).&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Алгоритм был реализован на языке C++ с использованием Intel MPI Library и запущен на кластере regular4.&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add impi/5.0.1&lt;br /&gt;
 mpicxx -std=c++0x task.c -o _scratch/task&lt;br /&gt;
 sbatch -n256 impi ./task &amp;lt;matrix_size&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
* размер матрицы [1024 : 4864] с шагом 256,&lt;br /&gt;
* число ядер [2 : 256] с шагом по степеням 2.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:Ops_2.png|thumb|center|700px|Рисунок 4. Изменение производительности в зависимости от числа ядер и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
[[file:Eff_2.png|thumb|center|700px|Рисунок 5. Изменение эффективности реализации в зависимости от числа ядер и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
[[file:Eff_2_up.png|thumb|center|700px|Рисунок 6. Изменение эффективности реализации, вид сверху.]]&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;По размеру задачи&#039;&#039;&#039; — при увеличении размерности матрицы эффективность реализации постепенно увеличивается, при этом тем быстрее, чем большее число ядер задействовано.&lt;br /&gt;
* &#039;&#039;&#039;По числу ядер&#039;&#039;&#039; — при увеличении числа mpi-процессов эффективность реализации снижается. Это объясняется ростом накладных расходов на организацию параллельного выполнения. При этом с ростом размерности матрицы эффективность снижается с такой же скоростью, но уже при больших значениях числа mpi-процессов.&lt;br /&gt;
* &#039;&#039;&#039;По двум направлениям&#039;&#039;&#039; — эффективность реализации возрастает (на рассматриваемой области значений параметров), но крайне медленно.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/mensigo/skipod/blob/master/mpi_gauss_vec_gen.c Параллельная реализация на C++]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
MS Excel и распространённые статистические пакеты (напр., SPSS, Statistica) позволяют моделировать только одномерные статистические распределения. Имеется возможность &amp;quot;собрать&amp;quot; многомерное распределение из нескольких одномерных при условии, что компоненты независимы. Однако если необходимо исследовать данные с зависящими друг от друга переменными, то приходится писать собственную программу. При этом удобно воспользоваться готовой реализацией разложения Холецкого (точечного метода), представленной в таких прикладных пакетах, как LINPACK, LAPACK, SCALAPACK.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Lonalone</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26777</id>
		<title>Участник:Lonalone/Генерация гауссовского вектора методом линейных преобразований</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26777"/>
		<updated>2018-12-08T06:14:23Z</updated>

		<summary type="html">&lt;p&gt;Lonalone: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор описания: &#039;&#039;Меньших И. М.&#039;&#039;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из многомерных распределений особый интерес представляет нормальное. Этому закону подчиняются все результаты воздействия большого числа случайных факторов, среди которых нет превалирующих.&lt;br /&gt;
&lt;br /&gt;
В статье приведен алгоритм генерации n-мерного гауссовского случайного вектора с помощью &#039;&#039;метода линейных преобразований&#039;&#039;&amp;lt;ref name=&amp;quot;V&amp;quot;&amp;gt;Михайлов Г.А., Войтишек А.В. Численное статистическое моделирование. Методы Монте-Карло — М.: Академия, 2006. — 368 с.&amp;lt;/ref&amp;gt;. Известно, что случае нормально распределенного случайного вектора, ковариационная матрица вместе с математическим ожиданием этого вектора полностью определяют его распределение. Поэтому для полного статистического соответствия моделируемого и теоретического распределения гауссовского вектора достаточно обеспечить требуемые значения указанных параметров&amp;lt;ref name=&amp;quot;VV&amp;quot;&amp;gt; https://ru.wikipedia.org/wiki/Многомерное_нормальное_распределение&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея алгоритма заключается в линейном преобразовании n-мерного случайного вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, компоненты которого независимы и одинаково распределены по нормальному закону со стандартными параметрами, в случайный вектор &amp;lt;math&amp;gt;X&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;\Sigma&amp;lt;/math&amp;gt; и вектор математических ожиданий &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Sigma = \|\sigma_{ij}\| = \| \mathbb{E}[(X_{i} - m_{x_{i}})(X_{j} - m_{x_{j}})]\|, \\&lt;br /&gt;
M = (m_{x_{1}}, m_{x_{2}}, ..., m_{x_{n}})^T.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Требуется найти такую матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, которая позволяла бы получить искомый вектор &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; с требуемыми характеристиками в результате линейного преобразования &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — n-мерный случайный вектор с независимыми нормально распределенными компонентами со стандартными параметрами.&lt;br /&gt;
&lt;br /&gt;
Будем искать матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в виде нижней треугольной матрицы. Перейдем от матричной записи к системе алгебраических уравнений:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} X_{1} \\&lt;br /&gt;
 X_{2} \\ \vdots \\ X_{n} \end{pmatrix} =&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} b_{11} &amp;amp; 0 &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\b_{21} &amp;amp; b_{22} &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\ \vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \vdots&lt;br /&gt;
\\ b_{n1} &amp;amp; b_{n2} &amp;amp; \cdots &amp;amp; b_{nn}&lt;br /&gt;
\end{pmatrix} \times&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} Y_{1} \\&lt;br /&gt;
 Y_{2} \\ \vdots \\ Y_{n} \end{pmatrix} +&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} m_{x_{1}} \\&lt;br /&gt;
 m_{x_{2}} \\ \vdots \\ m_{x_{n}} \end{pmatrix} \Rightarrow&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}X_{1} - m_{x_{1}} = b_{11}Y_{1}&lt;br /&gt;
\\X_{2} - m_{x_{2}} = b_{21}Y_{1} + b_{22}Y_{2}&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\\X_{n} - m_{x_{n}} = b_{n1}Y_{1} + b_{n2}Y_{2} + \cdots + b_{nn}Y_{n}&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Поскольку компоненты вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; независимы и имеют стандартные параметры, справедливо выражение:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\mathbb{E}[Y_{i}Y_{j}] =&lt;br /&gt;
\left\{\begin{matrix} &lt;br /&gt;
1, &amp;amp;i = j, \\&lt;br /&gt;
0, &amp;amp;i \not= j.&lt;br /&gt;
\end{matrix}\right.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Почленно перемножив сами на себя и между собой соответственно левые и правые части уравнений системы и взяв от результатов перемножения математическое ожидание, получаем систему уравнений вида:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\mathbb{E}[(X_{1} - m_{x_{1}})(X_{1} - m_{x_{1}})] = \mathbb{E}[b_{11}Y_{1}b_{11}Y_{1}],&lt;br /&gt;
\\ \mathbb{E}[(X_{1} - m_{x_{1}})(X_{2} - m_{x_{2}})] = \mathbb{E}[(b_{21}Y_{1} + b_{22}Y_{2})b_{11}Y_{1}],&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, в левых частях полученной системы уравнений располагаются элементы заданной ковариационной матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;, а в правых — элементы искомой матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;. Последовательно решая эту систему, получаем формулы для расчета элементов &amp;lt;math&amp;gt;\sigma_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
b_{11}=\sqrt{\sigma_{11}}; b_{21}=\frac{\sigma_{12}}{\sqrt{\sigma_{11}}}; b_{22} = \sqrt{\sigma_{22} - \frac{\sigma_{12}}{\sigma_{11}}}, \cdots&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рекуррентная формула для расчета любого элемента матрицы преобразования &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b_{ij} = \frac {\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}} {\sqrt{\sigma_{jj} - \sum_{k=1}^{j-1} b_{jk}^2}}, \quad 1 \leqslant j \leqslant i \leqslant n&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(суммы с верхним нулевым пределом считаются равными нулю)&lt;br /&gt;
&lt;br /&gt;
Таким образом, матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; получается с помощью [[Разложение_Холецкого_(метод_квадратного_корня)|разложения Холецкого]] матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Генерация случайного вектора Y ====&lt;br /&gt;
&lt;br /&gt;
Пусть имеется генератор псевдослучайных чисел (ГПСЧ, PRNG), с помощью которого можно получить реализацию случайной величины &amp;lt;math&amp;gt;u \sim U(0,1) &amp;lt;/math&amp;gt;. Описанный выше случайный вектор &amp;lt;math&amp;gt;Y=(y_1, \dots, y_n)&amp;lt;/math&amp;gt; с независимыми компонентами составим из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; реализаций случайной величины &amp;lt;math&amp;gt;\eta \sim N(0,1)&amp;lt;/math&amp;gt;. Каждую такую реализацию &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;, в свою очередь, получим с помощью приближения по ЦПТ &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; случайными величинами, распределенными равномерно на отрезке [0,1]:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right), \quad i = \overline{1, n} \\&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;u_j^i - &amp;lt;/math&amp;gt; реализации случайной величины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;\kappa - &amp;lt;/math&amp;gt; параметр, обеспечивающий качество приближения.&lt;br /&gt;
&lt;br /&gt;
Как правило, &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; берут равным 12 и считают, что для подавляющего числа практических задач обеспечивается должная точность вычислений&amp;lt;ref name = &amp;quot;VVV&amp;quot;&amp;gt;Балдин К.В., Уткин В.Б. Информационные системы в экономике. — М.:Дашков и Кo, 2008. — 395 с.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&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;\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}, \quad 1 \leqslant j \leqslant i \leqslant n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;&lt;br /&gt;
* Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1) Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;b_{11}= \sqrt{\sigma_{11}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;b_{k1}= \frac{\sigma_{k1}}{l_{11}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad k = \overline{2,n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{2,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (c) &amp;lt;math&amp;gt;b_{ii} = \sqrt{\sigma_{ii} - \sum_{p = 1}^{i - 1} b_{ip}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (d) &amp;lt;math&amp;gt;b_{ji} = \frac{\sigma_{ji} - \sum_{p = 1}^{i - 1} b_{ip} b_{jp}} {l_{ii}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad i \neq n, j = \overline{i+1,n}&amp;lt;/math&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;u_j^i \leftarrow PRNG,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\quad j = \overline{1,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3) Вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i = m_{x_i} + \sum_{k = 1}^{i} b_{ik} y_{k}, \quad i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt; n(n+1) + \frac {n(n-1)(n-2)}{6} &amp;lt;/math&amp;gt; (умножений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac {n(n+1)}{2} + \frac {n(n-1)(n-2)}{6} &amp;lt;/math&amp;gt; (вычитаний)&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac {n(n-1+2\kappa)}{2} &amp;lt;/math&amp;gt; (сложений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac {n(n+3)}{2} &amp;lt;/math&amp;gt; (делений)&lt;br /&gt;
* &amp;lt;math&amp;gt; 2n &amp;lt;/math&amp;gt; (взятия квадратного корня)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{n}{6}\left(2n^2+9n+31+6\kappa\right) &amp;lt;/math&amp;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;
==== Заполнение матрицы B====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 1 макроструктуры алгоритма ([[Разложение_Холецкого_(метод_квадратного_корня)|&#039;&#039;разложения Холецкого&#039;&#039;]]) состоит из трёх групп вершин, расположенных в целочисленных узлах трёх областей разной размерности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин расположена в одномерной области, соответствующая ей операция вычисляет функцию SQRT. &lt;br /&gt;
Единственная координата каждой из вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргумент этой функции &lt;br /&gt;
	&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{11}&amp;lt;/math&amp;gt;; &lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ii}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин расположена в двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a / b&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;: &lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{j1}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1, j, i - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ji}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин расположена в трёхмерной области, соответствующая ей операция  &amp;lt;math&amp;gt;a - b * c&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; — меняется в диапазоне  от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;p = 1&amp;lt;/math&amp;gt; элемент входных данных &amp;lt;math&amp;gt;\sigma_{ji}&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;p &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i, j, p - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, i&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, j&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.1, выполненном для случая &amp;lt;math&amp;gt;n = 4&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
[[file:Cholesky full_in_out.png|thumb|center|1400px|Рисунок 1. Граф этапа 1 макроструктуры алгоритма. SQ — вычисление квадратного корня, F — операция a-bc, Div — деление, In — входные данные, Out — выходные.]]&lt;br /&gt;
&lt;br /&gt;
====Генерация вектора Y====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 2 макроструктуры алгоритма состоит из двух групп вершин, расположенных в целочисленных узлах двумерной области.&lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин. Соответствующая ей операция вычисляет функцию &amp;lt;math&amp;gt;S = a+b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a:&amp;lt;/math&amp;gt;&lt;br /&gt;
** при &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; — константа &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;j&amp;gt;1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатами &amp;lt;math&amp;gt;i,j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; — значение, поступающее с &amp;lt;math&amp;gt;PRNG&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин. Соответствующая ей операция вычисляет функцию &amp;lt;math&amp;gt;F = \left(a-\frac{\kappa}{2}\right)\sqrt{\frac{12}{\kappa}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; —  результат срабатывания операции, соответствующей вершине из первой группы, с координатами &amp;lt;math&amp;gt;i,\kappa&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; этапа &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.2, выполненном для случая &amp;lt;math&amp;gt;n = 2, \kappa = 2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf2.png|550px|thumb|center|Рисунок 2. Граф этапа 2 макроструктуры алгоритма]]&lt;br /&gt;
&lt;br /&gt;
====Вычисление вектора X====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 3 макроструктуры алгоритма (&#039;&#039;умножение нижней треугольной матрицы на вектор и сложение результата с другим вектором&#039;&#039;) состоит из одной группы вершин, расположенной в целочисленных узлах двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a+bc&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;j = 1&amp;lt;/math&amp;gt; — компонента &amp;lt;math&amp;gt;m_{x_i}&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;j &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине с координатами &amp;lt;math&amp;gt;i, j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;b_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;y_{j}&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является:&lt;br /&gt;
* при &amp;lt;math&amp;gt;j &amp;lt; i&amp;lt;/math&amp;gt; — &#039;&#039;промежуточным данным&#039;&#039; этапа;&lt;br /&gt;
* при &amp;lt;math&amp;gt;j = i&amp;lt;/math&amp;gt; — &#039;&#039;выходным данным&#039;&#039; алгоритма &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.3, выполненном для случая &amp;lt;math&amp;gt; n = 4&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf3.png|650px|thumb|center|Рисунок 3. Граф этапа 3 макроструктуры алгоритма,  F — операция a+bc]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для разложения Холецкого &amp;lt;math&amp;gt;(n \times n)&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; в параллельном варианте требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов с вычислением квадратного корня (единичные вычисления в каждом из ярусов),&lt;br /&gt;
* &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; ярус делений (в каждом из ярусов — линейное количество операций, в зависимости от яруса — от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt;),&lt;br /&gt;
* по &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; ярусов умножений и сложений/вычитаний (в каждом из ярусов — квадратичное количество операций, от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;\frac{n^2 - n}{2}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Для генерации &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; в параллельном варианте требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; ярусов сложений (&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; вычислений в каждом из ярусов),&lt;br /&gt;
* &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; ярус вычитаний, делений, умножений, вычислений квадратного корня (&amp;lt;math&amp;gt;1, 2, 1, 1&amp;lt;/math&amp;gt; операций соответственно),&lt;br /&gt;
&lt;br /&gt;
Для вычисления &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; в параллельном варианте требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений (в каждом из ярусов — линейное количество операций, в зависимости от яруса — от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ алгоритм имеет сложность &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, а при классификации по ширине ЯПФ — &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: вещественная всюду плотная положительно определенная симметрическая  &amp;lt;math&amp;gt;(n \times n)&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;\Sigma&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;
* Выходные данные: вещественный &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектор &amp;lt;math&amp;gt;X&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;syntaxhighlight lang = c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// compute matrix B (core)&lt;br /&gt;
for (int j = 0; j &amp;lt; n; j++){&lt;br /&gt;
    double sum_down = matrix_cov[j][j];&lt;br /&gt;
    for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
        double cur = matrix_cov[j][k];&lt;br /&gt;
        sum_down -= cur * cur;&lt;br /&gt;
    }&lt;br /&gt;
    matrix_cov[j][j] = sqrt(sum_down);&lt;br /&gt;
    for (int i = j + 1; i &amp;lt; n; i++){&lt;br /&gt;
        double sum_up = matrix_cov[i][j];&lt;br /&gt;
        for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
            sum_up -= matrix_cov[i][k] * matrix_cov[j][k];&lt;br /&gt;
        }&lt;br /&gt;
        matrix_cov[i][j] = sum_up / matrix_cov[j][j];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
// generate vector Y&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){&lt;br /&gt;
    double sum = generate_uniform(n);&lt;br /&gt;
    for (int j = 0; j &amp;lt; CLT_NUM - 1; j++){&lt;br /&gt;
        sum += generate_uniform(n);&lt;br /&gt;
    }&lt;br /&gt;
    vec_Y[i] = (sum - CLT_NUM / 2) * sqrt(12.0 / CLT_NUM);&lt;br /&gt;
}&lt;br /&gt;
// linear transformation&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){  &lt;br /&gt;
    vec_X[i] = vec_exp[i];&lt;br /&gt;
    for (int k = 0; k &amp;lt;= i; k++){&lt;br /&gt;
        vec_X[i] += matrix_cov[i][k] * vec_Y[k];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В данной реализации алгоритма весь ресурс параллелизма использован в следующих этапах:&lt;br /&gt;
* вычисление элементов матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в рамках столбца (под диагональю),&lt;br /&gt;
* генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;,&lt;br /&gt;
* вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (умножение матрицы на вектор, сложение векторов).&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Алгоритм был реализован на языке C++ с использованием Intel MPI Library и запущен на кластере regular4.&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add impi/5.0.1&lt;br /&gt;
 mpicxx -std=c++0x task.c -o _scratch/task&lt;br /&gt;
 sbatch -n256 impi ./task &amp;lt;matrix_size&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
* размер матрицы [1024 : 4864] с шагом 256,&lt;br /&gt;
* число ядер [2 : 256] с шагом по степеням 2.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:Ops_2.png|thumb|center|700px|Рисунок 4. Изменение производительности в зависимости от числа ядер и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
[[file:Eff_2.png|thumb|center|700px|Рисунок 5. Изменение эффективности реализации в зависимости от числа ядер и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
[[file:Eff_2_up.png|thumb|center|700px|Рисунок 6. Изменение эффективности реализации, вид сверху.]]&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;По размеру задачи&#039;&#039;&#039; — при увеличении размерности матрицы эффективность реализации постепенно увеличивается, при этом тем быстрее, чем большее число ядер задействовано.&lt;br /&gt;
* &#039;&#039;&#039;По числу ядер&#039;&#039;&#039; — при увеличении числа mpi-процессов эффективность реализации снижается. Это объясняется ростом накладных расходов на организацию параллельного выполнения. При этом с ростом размерности матрицы эффективность снижается с такой же скоростью, но уже при больших значениях числа mpi-процессов.&lt;br /&gt;
* &#039;&#039;&#039;По двум направлениям&#039;&#039;&#039; — эффективность реализации возрастает (на рассматриваемой области значений параметров), но крайне медленно.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/mensigo/skipod/blob/master/mpi_gauss_vec_gen.c Параллельная реализация на C++]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
MS Excel и распространённые статистические пакеты (напр., SPSS, Statistica) позволяют моделировать только одномерные статистические распределения. Имеется возможность &amp;quot;собрать&amp;quot; многомерное распределение из нескольких одномерных при условии, что компоненты независимы. Однако если необходимо исследовать данные с зависящими друг от друга переменными, то приходится писать собственную программу. При этом удобно воспользоваться готовой реализацией разложения Холецкого (точечного метода), представленной в таких прикладных пакетах, как LINPACK, LAPACK, SCALAPACK.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Lonalone</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26776</id>
		<title>Участник:Lonalone/Генерация гауссовского вектора методом линейных преобразований</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26776"/>
		<updated>2018-12-07T22:45:49Z</updated>

		<summary type="html">&lt;p&gt;Lonalone: /* Возможные способы и особенности параллельной реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор описания: &#039;&#039;Меньших И. М.&#039;&#039;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из многомерных распределений особый интерес представляет нормальное. Этому закону подчиняются все результаты воздействия большого числа случайных факторов, среди которых нет превалирующих.&lt;br /&gt;
&lt;br /&gt;
В статье приведен алгоритм генерации n-мерного гауссовского случайного вектора с помощью &#039;&#039;метода линейных преобразований&#039;&#039;&amp;lt;ref name=&amp;quot;V&amp;quot;&amp;gt;Михайлов Г.А., Войтишек А.В. Численное статистическое моделирование. Методы Монте-Карло — М.: Академия, 2006. — 368 с.&amp;lt;/ref&amp;gt;. Известно, что случае нормально распределенного случайного вектора, ковариационная матрица вместе с математическим ожиданием этого вектора полностью определяют его распределение. Поэтому для полного статистического соответствия моделируемого и теоретического распределения гауссовского вектора достаточно обеспечить требуемые значения указанных параметров&amp;lt;ref name=&amp;quot;VV&amp;quot;&amp;gt; https://ru.wikipedia.org/wiki/Многомерное_нормальное_распределение&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея алгоритма заключается в линейном преобразовании n-мерного случайного вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, компоненты которого независимы и одинаково распределены по нормальному закону со стандартными параметрами, в случайный вектор &amp;lt;math&amp;gt;X&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;\Sigma&amp;lt;/math&amp;gt; и вектор математических ожиданий &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Sigma = \|\sigma_{ij}\| = \| \mathbb{E}[(X_{i} - m_{x_{i}})(X_{j} - m_{x_{j}})]\|, \\&lt;br /&gt;
M = (m_{x_{1}}, m_{x_{2}}, ..., m_{x_{n}})^T.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Требуется найти такую матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, которая позволяла бы получить искомый вектор &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; с требуемыми характеристиками в результате линейного преобразования &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — n-мерный случайный вектор с независимыми нормально распределенными компонентами со стандартными параметрами.&lt;br /&gt;
&lt;br /&gt;
Будем искать матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в виде нижней треугольной матрицы. Перейдем от матричной записи к системе алгебраических уравнений:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} X_{1} \\&lt;br /&gt;
 X_{2} \\ \vdots \\ X_{n} \end{pmatrix} =&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} b_{11} &amp;amp; 0 &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\b_{21} &amp;amp; b_{22} &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\ \vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \vdots&lt;br /&gt;
\\ b_{n1} &amp;amp; b_{n2} &amp;amp; \cdots &amp;amp; b_{nn}&lt;br /&gt;
\end{pmatrix} \times&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} Y_{1} \\&lt;br /&gt;
 Y_{2} \\ \vdots \\ Y_{n} \end{pmatrix} +&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} m_{x_{1}} \\&lt;br /&gt;
 m_{x_{2}} \\ \vdots \\ m_{x_{n}} \end{pmatrix} \Rightarrow&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}X_{1} - m_{x_{1}} = b_{11}Y_{1}&lt;br /&gt;
\\X_{2} - m_{x_{2}} = b_{21}Y_{1} + b_{22}Y_{2}&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\\X_{n} - m_{x_{n}} = b_{n1}Y_{1} + b_{n2}Y_{2} + \cdots + b_{nn}Y_{n}&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Поскольку компоненты вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; независимы и имеют стандартные параметры, справедливо выражение:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\mathbb{E}[Y_{i}Y_{j}] =&lt;br /&gt;
\left\{\begin{matrix} &lt;br /&gt;
1, &amp;amp;i = j, \\&lt;br /&gt;
0, &amp;amp;i \not= j.&lt;br /&gt;
\end{matrix}\right.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Почленно перемножив сами на себя и между собой соответственно левые и правые части уравнений системы и взяв от результатов перемножения математическое ожидание, получаем систему уравнений вида:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\mathbb{E}[(X_{1} - m_{x_{1}})(X_{1} - m_{x_{1}})] = \mathbb{E}[b_{11}Y_{1}b_{11}Y_{1}],&lt;br /&gt;
\\ \mathbb{E}[(X_{1} - m_{x_{1}})(X_{2} - m_{x_{2}})] = \mathbb{E}[(b_{21}Y_{1} + b_{22}Y_{2})b_{11}Y_{1}],&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, в левых частях полученной системы уравнений располагаются элементы заданной ковариационной матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;, а в правых — элементы искомой матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;. Последовательно решая эту систему, получаем формулы для расчета элементов &amp;lt;math&amp;gt;\sigma_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
b_{11}=\sqrt{\sigma_{11}}; b_{21}=\frac{\sigma_{12}}{\sqrt{\sigma_{11}}}; b_{22} = \sqrt{\sigma_{22} - \frac{\sigma_{12}}{\sigma_{11}}}, \cdots&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рекуррентная формула для расчета любого элемента матрицы преобразования &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b_{ij} = \frac {\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}} {\sqrt{\sigma_{jj} - \sum_{k=1}^{j-1} b_{jk}^2}}, \quad 1 \leqslant j \leqslant i \leqslant n&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(суммы с верхним нулевым пределом считаются равными нулю)&lt;br /&gt;
&lt;br /&gt;
Таким образом, матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; получается с помощью [[Разложение_Холецкого_(метод_квадратного_корня)|разложения Холецкого]] матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Генерация случайного вектора Y ====&lt;br /&gt;
&lt;br /&gt;
Пусть имеется генератор псевдослучайных чисел (ГПСЧ, PRNG), с помощью которого можно получить реализацию случайной величины &amp;lt;math&amp;gt;u \sim U(0,1) &amp;lt;/math&amp;gt;. Описанный выше случайный вектор &amp;lt;math&amp;gt;Y=(y_1, \dots, y_n)&amp;lt;/math&amp;gt; с независимыми компонентами составим из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; реализаций случайной величины &amp;lt;math&amp;gt;\eta \sim N(0,1)&amp;lt;/math&amp;gt;. Каждую такую реализацию &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;, в свою очередь, получим с помощью приближения по ЦПТ &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; случайными величинами, распределенными равномерно на отрезке [0,1]:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right), \quad i = \overline{1, n} \\&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;u_j^i - &amp;lt;/math&amp;gt; реализации случайной величины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;\kappa - &amp;lt;/math&amp;gt; параметр, обеспечивающий качество приближения.&lt;br /&gt;
&lt;br /&gt;
Как правило, &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; берут равным 12 и считают, что для подавляющего числа практических задач обеспечивается должная точность вычислений&amp;lt;ref name = &amp;quot;VVV&amp;quot;&amp;gt;Балдин К.В., Уткин В.Б. Информационные системы в экономике. — М.:Дашков и Кo, 2008. — 395 с.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&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;\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}, \quad 1 \leqslant j \leqslant i \leqslant n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;&lt;br /&gt;
* Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1) Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;b_{11}= \sqrt{\sigma_{11}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;b_{k1}= \frac{\sigma_{k1}}{l_{11}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad k = \overline{2,n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{2,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (c) &amp;lt;math&amp;gt;b_{ii} = \sqrt{\sigma_{ii} - \sum_{p = 1}^{i - 1} b_{ip}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (d) &amp;lt;math&amp;gt;b_{ji} = \frac{\sigma_{ji} - \sum_{p = 1}^{i - 1} b_{ip} b_{jp}} {l_{ii}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad i \neq n, j = \overline{i+1,n}&amp;lt;/math&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;u_j^i \leftarrow PRNG,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\quad j = \overline{1,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3) Вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i = m_{x_i} + \sum_{k = 1}^{i} b_{ik} y_{k}, \quad i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt; n(n+1) + \frac {n(n-1)(n-2)}{6} &amp;lt;/math&amp;gt; (умножений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac {n(n+1)}{2} + \frac {n(n-1)(n-2)}{6} &amp;lt;/math&amp;gt; (вычитаний)&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac {n(n-1+2\kappa)}{2} &amp;lt;/math&amp;gt; (сложений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac {n(n+3)}{2} &amp;lt;/math&amp;gt; (делений)&lt;br /&gt;
* &amp;lt;math&amp;gt; 2n &amp;lt;/math&amp;gt; (взятия квадратного корня)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{n}{6}\left(2n^2+9n+31+6\kappa\right) &amp;lt;/math&amp;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;
==== Заполнение матрицы B====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 1 макроструктуры алгоритма ([[Разложение_Холецкого_(метод_квадратного_корня)|&#039;&#039;разложения Холецкого&#039;&#039;]]) состоит из трёх групп вершин, расположенных в целочисленных узлах трёх областей разной размерности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин расположена в одномерной области, соответствующая ей операция вычисляет функцию SQRT. &lt;br /&gt;
Единственная координата каждой из вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргумент этой функции &lt;br /&gt;
	&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{11}&amp;lt;/math&amp;gt;; &lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ii}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин расположена в двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a / b&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;: &lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{j1}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1, j, i - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ji}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин расположена в трёхмерной области, соответствующая ей операция  &amp;lt;math&amp;gt;a - b * c&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; — меняется в диапазоне  от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;p = 1&amp;lt;/math&amp;gt; элемент входных данных &amp;lt;math&amp;gt;\sigma_{ji}&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;p &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i, j, p - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, i&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, j&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.1, выполненном для случая &amp;lt;math&amp;gt;n = 4&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
[[file:Cholesky full_in_out.png|thumb|center|1400px|Рисунок 1. Граф этапа 1 макроструктуры алгоритма. SQ — вычисление квадратного корня, F — операция a-bc, Div — деление, In — входные данные, Out — выходные.]]&lt;br /&gt;
&lt;br /&gt;
====Генерация вектора Y====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 2 макроструктуры алгоритма состоит из двух групп вершин, расположенных в целочисленных узлах двумерной области.&lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин. Соответствующая ей операция вычисляет функцию &amp;lt;math&amp;gt;S = a+b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a:&amp;lt;/math&amp;gt;&lt;br /&gt;
** при &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; — константа &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;j&amp;gt;1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатами &amp;lt;math&amp;gt;i,j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; — значение, поступающее с &amp;lt;math&amp;gt;PRNG&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин. Соответствующая ей операция вычисляет функцию &amp;lt;math&amp;gt;F = \left(a-\frac{\kappa}{2}\right)\sqrt{\frac{12}{\kappa}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; —  результат срабатывания операции, соответствующей вершине из первой группы, с координатами &amp;lt;math&amp;gt;i,\kappa&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; этапа &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.2, выполненном для случая &amp;lt;math&amp;gt;n = 2, \kappa = 2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf2.png|550px|thumb|center|Рисунок 2. Граф этапа 2 макроструктуры алгоритма]]&lt;br /&gt;
&lt;br /&gt;
====Вычисление вектора X====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 3 макроструктуры алгоритма (&#039;&#039;умножение нижней треугольной матрицы на вектор и сложение результата с другим вектором&#039;&#039;) состоит из одной группы вершин, расположенной в целочисленных узлах двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a+bc&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;j = 1&amp;lt;/math&amp;gt; — компонента &amp;lt;math&amp;gt;m_{x_i}&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;j &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине с координатами &amp;lt;math&amp;gt;i, j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;b_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;y_{j}&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является:&lt;br /&gt;
* при &amp;lt;math&amp;gt;j &amp;lt; i&amp;lt;/math&amp;gt; — &#039;&#039;промежуточным данным&#039;&#039; этапа;&lt;br /&gt;
* при &amp;lt;math&amp;gt;j = i&amp;lt;/math&amp;gt; — &#039;&#039;выходным данным&#039;&#039; алгоритма &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.3, выполненном для случая &amp;lt;math&amp;gt; n = 4&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf3.png|650px|thumb|center|Рисунок 3. Граф этапа 3 макроструктуры алгоритма,  F — операция a+bc]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для разложения Холецкого &amp;lt;math&amp;gt;(n \times n)&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; в параллельном варианте требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов с вычислением квадратного корня (единичные вычисления в каждом из ярусов),&lt;br /&gt;
* &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; ярус делений (в каждом из ярусов — линейное количество операций, в зависимости от яруса — от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt;),&lt;br /&gt;
* по &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; ярусов умножений и сложений/вычитаний (в каждом из ярусов — квадратичное количество операций, от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;\frac{n^2 - n}{2}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Для генерации &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; в параллельном варианте требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; ярусов сложений (&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; вычислений в каждом из ярусов),&lt;br /&gt;
* &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; ярус вычитаний, делений, умножений, вычислений квадратного корня (&amp;lt;math&amp;gt;1, 2, 1, 1&amp;lt;/math&amp;gt; операций соответственно),&lt;br /&gt;
&lt;br /&gt;
Для вычисления &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; в параллельном варианте требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений (в каждом из ярусов — линейное количество операций, в зависимости от яруса — от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ алгоритм имеет сложность &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, а при классификации по ширине ЯПФ — &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: вещественная всюду плотная положительно определенная симметрическая  &amp;lt;math&amp;gt;(n \times n)&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;\Sigma&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;
* Выходные данные: вещественный &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектор &amp;lt;math&amp;gt;X&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;syntaxhighlight lang = c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// compute matrix B (core)&lt;br /&gt;
for (int j = 0; j &amp;lt; n; j++){&lt;br /&gt;
    double sum_down = matrix_cov[j][j];&lt;br /&gt;
    for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
        double cur = matrix_cov[j][k];&lt;br /&gt;
        sum_down -= cur * cur;&lt;br /&gt;
    }&lt;br /&gt;
    matrix_cov[j][j] = sqrt(sum_down);&lt;br /&gt;
    for (int i = j + 1; i &amp;lt; n; i++){&lt;br /&gt;
        double sum_up = matrix_cov[i][j];&lt;br /&gt;
        for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
            sum_up -= matrix_cov[i][k] * matrix_cov[j][k];&lt;br /&gt;
        }&lt;br /&gt;
        matrix_cov[i][j] = sum_up / matrix_cov[j][j];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
// generate vector Y&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){&lt;br /&gt;
    double sum = generate_uniform(n);&lt;br /&gt;
    for (int j = 0; j &amp;lt; CLT_NUM - 1; j++){&lt;br /&gt;
        sum += generate_uniform(n);&lt;br /&gt;
    }&lt;br /&gt;
    vec_Y[i] = (sum - CLT_NUM / 2) * sqrt(12.0 / CLT_NUM);&lt;br /&gt;
}&lt;br /&gt;
// linear transformation&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){  &lt;br /&gt;
    vec_X[i] = vec_exp[i];&lt;br /&gt;
    for (int k = 0; k &amp;lt;= i; k++){&lt;br /&gt;
        vec_X[i] += matrix_cov[i][k] * vec_Y[k];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В данной реализации алгоритма весь ресурс параллелизма использован в следующих этапах:&lt;br /&gt;
* вычисление элементов матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в рамках столбца (под диагональю),&lt;br /&gt;
* генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;,&lt;br /&gt;
* вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (умножение матрицы на вектор, сложение векторов).&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Алгоритм был реализован на языке C++ с использованием Intel MPI Library и запущен на кластере regular4.&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add impi/5.0.1&lt;br /&gt;
 mpicxx -std=c++0x task.c -o _scratch/task&lt;br /&gt;
 sbatch -n256 impi ./task &amp;lt;matrix_size&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
* размер матрицы [1024 : 4864] с шагом 256,&lt;br /&gt;
* число ядер [2 : 256] с шагом по степеням 2.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:Ops_2.png|thumb|center|700px|Рисунок 4. Изменение производительности в зависимости от числа ядер и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
[[file:Eff_2.png|thumb|center|700px|Рисунок 5. Изменение эффективности реализации в зависимости от числа ядер и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
[[file:Eff_2_up.png|thumb|center|700px|Рисунок 6. Изменение эффективности реализации, вид сверху.]]&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;По размеру задачи&#039;&#039;&#039; — при увеличении размерности матрицы эффективность реализации постепенно увеличивается, при этом тем быстрее, чем большее число ядер задействовано.&lt;br /&gt;
* &#039;&#039;&#039;По числу ядер&#039;&#039;&#039; — при увеличении числа mpi-процессов эффективность реализации снижается. Это объясняется ростом накладных расходов на организацию параллельного выполнения. При этом с ростом размерности матрицы эффективность снижается с такой же скоростью, но уже при больших значениях числа mpi-процессов.&lt;br /&gt;
* &#039;&#039;&#039;По двум направлениям&#039;&#039;&#039; — эффективность реализации возрастает (на рассматриваемой области значений параметров), но крайне медленно.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/mensigo/skipod/blob/master/mpi_gauss_vec_gen.c Параллельная реализация на C++]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
MS Excel и распространённые статистические пакеты (напр., SPSS, Statistica) позволяют моделировать только одномерные статистические распределения. Имеется возможность &amp;quot;собрать&amp;quot; многомерное распределение из нескольких одномерных при условии, что компоненты независимы. Однако если необходимо исследовать данные с зависящими друг от друга переменными, то приходится писать собственную программу. При этом удобно воспользоваться готовой реализацией разложения Холецкого (точечного метода), представленной в таких прикладных пакетах, как LINPACK, LAPACK, SCALAPACK.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Lonalone</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26775</id>
		<title>Участник:Lonalone/Генерация гауссовского вектора методом линейных преобразований</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26775"/>
		<updated>2018-12-07T22:36:32Z</updated>

		<summary type="html">&lt;p&gt;Lonalone: /* Возможные способы и особенности параллельной реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор описания: &#039;&#039;Меньших И. М.&#039;&#039;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из многомерных распределений особый интерес представляет нормальное. Этому закону подчиняются все результаты воздействия большого числа случайных факторов, среди которых нет превалирующих.&lt;br /&gt;
&lt;br /&gt;
В статье приведен алгоритм генерации n-мерного гауссовского случайного вектора с помощью &#039;&#039;метода линейных преобразований&#039;&#039;&amp;lt;ref name=&amp;quot;V&amp;quot;&amp;gt;Михайлов Г.А., Войтишек А.В. Численное статистическое моделирование. Методы Монте-Карло — М.: Академия, 2006. — 368 с.&amp;lt;/ref&amp;gt;. Известно, что случае нормально распределенного случайного вектора, ковариационная матрица вместе с математическим ожиданием этого вектора полностью определяют его распределение. Поэтому для полного статистического соответствия моделируемого и теоретического распределения гауссовского вектора достаточно обеспечить требуемые значения указанных параметров&amp;lt;ref name=&amp;quot;VV&amp;quot;&amp;gt; https://ru.wikipedia.org/wiki/Многомерное_нормальное_распределение&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея алгоритма заключается в линейном преобразовании n-мерного случайного вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, компоненты которого независимы и одинаково распределены по нормальному закону со стандартными параметрами, в случайный вектор &amp;lt;math&amp;gt;X&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;\Sigma&amp;lt;/math&amp;gt; и вектор математических ожиданий &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Sigma = \|\sigma_{ij}\| = \| \mathbb{E}[(X_{i} - m_{x_{i}})(X_{j} - m_{x_{j}})]\|, \\&lt;br /&gt;
M = (m_{x_{1}}, m_{x_{2}}, ..., m_{x_{n}})^T.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Требуется найти такую матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, которая позволяла бы получить искомый вектор &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; с требуемыми характеристиками в результате линейного преобразования &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — n-мерный случайный вектор с независимыми нормально распределенными компонентами со стандартными параметрами.&lt;br /&gt;
&lt;br /&gt;
Будем искать матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в виде нижней треугольной матрицы. Перейдем от матричной записи к системе алгебраических уравнений:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} X_{1} \\&lt;br /&gt;
 X_{2} \\ \vdots \\ X_{n} \end{pmatrix} =&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} b_{11} &amp;amp; 0 &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\b_{21} &amp;amp; b_{22} &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\ \vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \vdots&lt;br /&gt;
\\ b_{n1} &amp;amp; b_{n2} &amp;amp; \cdots &amp;amp; b_{nn}&lt;br /&gt;
\end{pmatrix} \times&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} Y_{1} \\&lt;br /&gt;
 Y_{2} \\ \vdots \\ Y_{n} \end{pmatrix} +&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} m_{x_{1}} \\&lt;br /&gt;
 m_{x_{2}} \\ \vdots \\ m_{x_{n}} \end{pmatrix} \Rightarrow&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}X_{1} - m_{x_{1}} = b_{11}Y_{1}&lt;br /&gt;
\\X_{2} - m_{x_{2}} = b_{21}Y_{1} + b_{22}Y_{2}&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\\X_{n} - m_{x_{n}} = b_{n1}Y_{1} + b_{n2}Y_{2} + \cdots + b_{nn}Y_{n}&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Поскольку компоненты вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; независимы и имеют стандартные параметры, справедливо выражение:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\mathbb{E}[Y_{i}Y_{j}] =&lt;br /&gt;
\left\{\begin{matrix} &lt;br /&gt;
1, &amp;amp;i = j, \\&lt;br /&gt;
0, &amp;amp;i \not= j.&lt;br /&gt;
\end{matrix}\right.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Почленно перемножив сами на себя и между собой соответственно левые и правые части уравнений системы и взяв от результатов перемножения математическое ожидание, получаем систему уравнений вида:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\mathbb{E}[(X_{1} - m_{x_{1}})(X_{1} - m_{x_{1}})] = \mathbb{E}[b_{11}Y_{1}b_{11}Y_{1}],&lt;br /&gt;
\\ \mathbb{E}[(X_{1} - m_{x_{1}})(X_{2} - m_{x_{2}})] = \mathbb{E}[(b_{21}Y_{1} + b_{22}Y_{2})b_{11}Y_{1}],&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, в левых частях полученной системы уравнений располагаются элементы заданной ковариационной матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;, а в правых — элементы искомой матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;. Последовательно решая эту систему, получаем формулы для расчета элементов &amp;lt;math&amp;gt;\sigma_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
b_{11}=\sqrt{\sigma_{11}}; b_{21}=\frac{\sigma_{12}}{\sqrt{\sigma_{11}}}; b_{22} = \sqrt{\sigma_{22} - \frac{\sigma_{12}}{\sigma_{11}}}, \cdots&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рекуррентная формула для расчета любого элемента матрицы преобразования &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b_{ij} = \frac {\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}} {\sqrt{\sigma_{jj} - \sum_{k=1}^{j-1} b_{jk}^2}}, \quad 1 \leqslant j \leqslant i \leqslant n&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(суммы с верхним нулевым пределом считаются равными нулю)&lt;br /&gt;
&lt;br /&gt;
Таким образом, матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; получается с помощью [[Разложение_Холецкого_(метод_квадратного_корня)|разложения Холецкого]] матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Генерация случайного вектора Y ====&lt;br /&gt;
&lt;br /&gt;
Пусть имеется генератор псевдослучайных чисел (ГПСЧ, PRNG), с помощью которого можно получить реализацию случайной величины &amp;lt;math&amp;gt;u \sim U(0,1) &amp;lt;/math&amp;gt;. Описанный выше случайный вектор &amp;lt;math&amp;gt;Y=(y_1, \dots, y_n)&amp;lt;/math&amp;gt; с независимыми компонентами составим из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; реализаций случайной величины &amp;lt;math&amp;gt;\eta \sim N(0,1)&amp;lt;/math&amp;gt;. Каждую такую реализацию &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;, в свою очередь, получим с помощью приближения по ЦПТ &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; случайными величинами, распределенными равномерно на отрезке [0,1]:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right), \quad i = \overline{1, n} \\&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;u_j^i - &amp;lt;/math&amp;gt; реализации случайной величины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;\kappa - &amp;lt;/math&amp;gt; параметр, обеспечивающий качество приближения.&lt;br /&gt;
&lt;br /&gt;
Как правило, &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; берут равным 12 и считают, что для подавляющего числа практических задач обеспечивается должная точность вычислений&amp;lt;ref name = &amp;quot;VVV&amp;quot;&amp;gt;Балдин К.В., Уткин В.Б. Информационные системы в экономике. — М.:Дашков и Кo, 2008. — 395 с.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&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;\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}, \quad 1 \leqslant j \leqslant i \leqslant n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;&lt;br /&gt;
* Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1) Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;b_{11}= \sqrt{\sigma_{11}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;b_{k1}= \frac{\sigma_{k1}}{l_{11}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad k = \overline{2,n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{2,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (c) &amp;lt;math&amp;gt;b_{ii} = \sqrt{\sigma_{ii} - \sum_{p = 1}^{i - 1} b_{ip}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (d) &amp;lt;math&amp;gt;b_{ji} = \frac{\sigma_{ji} - \sum_{p = 1}^{i - 1} b_{ip} b_{jp}} {l_{ii}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad i \neq n, j = \overline{i+1,n}&amp;lt;/math&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;u_j^i \leftarrow PRNG,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\quad j = \overline{1,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3) Вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i = m_{x_i} + \sum_{k = 1}^{i} b_{ik} y_{k}, \quad i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt; n(n+1) + \frac {n(n-1)(n-2)}{6} &amp;lt;/math&amp;gt; (умножений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac {n(n+1)}{2} + \frac {n(n-1)(n-2)}{6} &amp;lt;/math&amp;gt; (вычитаний)&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac {n(n-1+2\kappa)}{2} &amp;lt;/math&amp;gt; (сложений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac {n(n+3)}{2} &amp;lt;/math&amp;gt; (делений)&lt;br /&gt;
* &amp;lt;math&amp;gt; 2n &amp;lt;/math&amp;gt; (взятия квадратного корня)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{n}{6}\left(2n^2+9n+31+6\kappa\right) &amp;lt;/math&amp;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;
==== Заполнение матрицы B====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 1 макроструктуры алгоритма ([[Разложение_Холецкого_(метод_квадратного_корня)|&#039;&#039;разложения Холецкого&#039;&#039;]]) состоит из трёх групп вершин, расположенных в целочисленных узлах трёх областей разной размерности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин расположена в одномерной области, соответствующая ей операция вычисляет функцию SQRT. &lt;br /&gt;
Единственная координата каждой из вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргумент этой функции &lt;br /&gt;
	&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{11}&amp;lt;/math&amp;gt;; &lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ii}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин расположена в двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a / b&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;: &lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{j1}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1, j, i - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ji}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин расположена в трёхмерной области, соответствующая ей операция  &amp;lt;math&amp;gt;a - b * c&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; — меняется в диапазоне  от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;p = 1&amp;lt;/math&amp;gt; элемент входных данных &amp;lt;math&amp;gt;\sigma_{ji}&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;p &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i, j, p - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, i&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, j&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.1, выполненном для случая &amp;lt;math&amp;gt;n = 4&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
[[file:Cholesky full_in_out.png|thumb|center|1400px|Рисунок 1. Граф этапа 1 макроструктуры алгоритма. SQ — вычисление квадратного корня, F — операция a-bc, Div — деление, In — входные данные, Out — выходные.]]&lt;br /&gt;
&lt;br /&gt;
====Генерация вектора Y====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 2 макроструктуры алгоритма состоит из двух групп вершин, расположенных в целочисленных узлах двумерной области.&lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин. Соответствующая ей операция вычисляет функцию &amp;lt;math&amp;gt;S = a+b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a:&amp;lt;/math&amp;gt;&lt;br /&gt;
** при &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; — константа &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;j&amp;gt;1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатами &amp;lt;math&amp;gt;i,j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; — значение, поступающее с &amp;lt;math&amp;gt;PRNG&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин. Соответствующая ей операция вычисляет функцию &amp;lt;math&amp;gt;F = \left(a-\frac{\kappa}{2}\right)\sqrt{\frac{12}{\kappa}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; —  результат срабатывания операции, соответствующей вершине из первой группы, с координатами &amp;lt;math&amp;gt;i,\kappa&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; этапа &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.2, выполненном для случая &amp;lt;math&amp;gt;n = 2, \kappa = 2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf2.png|550px|thumb|center|Рисунок 2. Граф этапа 2 макроструктуры алгоритма]]&lt;br /&gt;
&lt;br /&gt;
====Вычисление вектора X====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 3 макроструктуры алгоритма (&#039;&#039;умножение нижней треугольной матрицы на вектор и сложение результата с другим вектором&#039;&#039;) состоит из одной группы вершин, расположенной в целочисленных узлах двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a+bc&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;j = 1&amp;lt;/math&amp;gt; — компонента &amp;lt;math&amp;gt;m_{x_i}&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;j &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине с координатами &amp;lt;math&amp;gt;i, j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;b_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;y_{j}&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является:&lt;br /&gt;
* при &amp;lt;math&amp;gt;j &amp;lt; i&amp;lt;/math&amp;gt; — &#039;&#039;промежуточным данным&#039;&#039; этапа;&lt;br /&gt;
* при &amp;lt;math&amp;gt;j = i&amp;lt;/math&amp;gt; — &#039;&#039;выходным данным&#039;&#039; алгоритма &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.3, выполненном для случая &amp;lt;math&amp;gt; n = 4&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf3.png|650px|thumb|center|Рисунок 3. Граф этапа 3 макроструктуры алгоритма,  F — операция a+bc]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для разложения Холецкого &amp;lt;math&amp;gt;(n \times n)&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; в параллельном варианте требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов с вычислением квадратного корня (единичные вычисления в каждом из ярусов),&lt;br /&gt;
* &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; ярус делений (в каждом из ярусов — линейное количество операций, в зависимости от яруса — от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt;),&lt;br /&gt;
* по &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; ярусов умножений и сложений/вычитаний (в каждом из ярусов — квадратичное количество операций, от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;\frac{n^2 - n}{2}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Для генерации &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; в параллельном варианте требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; ярусов сложений (&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; вычислений в каждом из ярусов),&lt;br /&gt;
* &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; ярус вычитаний, делений, умножений, вычислений квадратного корня (&amp;lt;math&amp;gt;1, 2, 1, 1&amp;lt;/math&amp;gt; операций соответственно),&lt;br /&gt;
&lt;br /&gt;
Для вычисления &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; в параллельном варианте требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений (в каждом из ярусов — линейное количество операций, в зависимости от яруса — от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ алгоритм имеет сложность &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, а при классификации по ширине ЯПФ — &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: вещественная всюду плотная положительно определенная симметрическая  &amp;lt;math&amp;gt;(n \times n)&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;\Sigma&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;
* Выходные данные: вещественный &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектор &amp;lt;math&amp;gt;X&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;syntaxhighlight lang = c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// compute matrix B (core)&lt;br /&gt;
for (int j = 0; j &amp;lt; n; j++){&lt;br /&gt;
    double sum_down = matrix_cov[j][j];&lt;br /&gt;
    for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
        double cur = matrix_cov[j][k];&lt;br /&gt;
        sum_down -= cur * cur;&lt;br /&gt;
    }&lt;br /&gt;
    matrix_cov[j][j] = sqrt(sum_down);&lt;br /&gt;
    for (int i = j + 1; i &amp;lt; n; i++){&lt;br /&gt;
        double sum_up = matrix_cov[i][j];&lt;br /&gt;
        for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
            sum_up -= matrix_cov[i][k] * matrix_cov[j][k];&lt;br /&gt;
        }&lt;br /&gt;
        matrix_cov[i][j] = sum_up / matrix_cov[j][j];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
// generate vector Y&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){&lt;br /&gt;
    double sum = generate_uniform(n);&lt;br /&gt;
    for (int j = 0; j &amp;lt; CLT_NUM - 1; j++){&lt;br /&gt;
        sum += generate_uniform(n);&lt;br /&gt;
    }&lt;br /&gt;
    vec_Y[i] = (sum - CLT_NUM / 2) * sqrt(12.0 / CLT_NUM);&lt;br /&gt;
}&lt;br /&gt;
// linear transformation&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){  &lt;br /&gt;
    vec_X[i] = vec_exp[i];&lt;br /&gt;
    for (int k = 0; k &amp;lt;= i; k++){&lt;br /&gt;
        vec_X[i] += matrix_cov[i][k] * vec_Y[k];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В данной реализации алгоритма использованы все ресурсы параллелизма в следующих этапах:&lt;br /&gt;
* вычисление элементов матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в рамках столбца (под диагональю),&lt;br /&gt;
* генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;,&lt;br /&gt;
* вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (умножение матрицы на вектор, сложение векторов).&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Алгоритм был реализован на языке C++ с использованием Intel MPI Library и запущен на кластере regular4.&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add impi/5.0.1&lt;br /&gt;
 mpicxx -std=c++0x task.c -o _scratch/task&lt;br /&gt;
 sbatch -n256 impi ./task &amp;lt;matrix_size&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
* размер матрицы [1024 : 4864] с шагом 256,&lt;br /&gt;
* число ядер [2 : 256] с шагом по степеням 2.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:Ops_2.png|thumb|center|700px|Рисунок 4. Изменение производительности в зависимости от числа ядер и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
[[file:Eff_2.png|thumb|center|700px|Рисунок 5. Изменение эффективности реализации в зависимости от числа ядер и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
[[file:Eff_2_up.png|thumb|center|700px|Рисунок 6. Изменение эффективности реализации, вид сверху.]]&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;По размеру задачи&#039;&#039;&#039; — при увеличении размерности матрицы эффективность реализации постепенно увеличивается, при этом тем быстрее, чем большее число ядер задействовано.&lt;br /&gt;
* &#039;&#039;&#039;По числу ядер&#039;&#039;&#039; — при увеличении числа mpi-процессов эффективность реализации снижается. Это объясняется ростом накладных расходов на организацию параллельного выполнения. При этом с ростом размерности матрицы эффективность снижается с такой же скоростью, но уже при больших значениях числа mpi-процессов.&lt;br /&gt;
* &#039;&#039;&#039;По двум направлениям&#039;&#039;&#039; — эффективность реализации возрастает (на рассматриваемой области значений параметров), но крайне медленно.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/mensigo/skipod/blob/master/mpi_gauss_vec_gen.c Параллельная реализация на C++]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
MS Excel и распространённые статистические пакеты (напр., SPSS, Statistica) позволяют моделировать только одномерные статистические распределения. Имеется возможность &amp;quot;собрать&amp;quot; многомерное распределение из нескольких одномерных при условии, что компоненты независимы. Однако если необходимо исследовать данные с зависящими друг от друга переменными, то приходится писать собственную программу. При этом удобно воспользоваться готовой реализацией разложения Холецкого (точечного метода), представленной в таких прикладных пакетах, как LINPACK, LAPACK, SCALAPACK.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Lonalone</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26774</id>
		<title>Участник:Lonalone/Генерация гауссовского вектора методом линейных преобразований</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26774"/>
		<updated>2018-12-07T22:25:47Z</updated>

		<summary type="html">&lt;p&gt;Lonalone: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор описания: &#039;&#039;Меньших И. М.&#039;&#039;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из многомерных распределений особый интерес представляет нормальное. Этому закону подчиняются все результаты воздействия большого числа случайных факторов, среди которых нет превалирующих.&lt;br /&gt;
&lt;br /&gt;
В статье приведен алгоритм генерации n-мерного гауссовского случайного вектора с помощью &#039;&#039;метода линейных преобразований&#039;&#039;&amp;lt;ref name=&amp;quot;V&amp;quot;&amp;gt;Михайлов Г.А., Войтишек А.В. Численное статистическое моделирование. Методы Монте-Карло — М.: Академия, 2006. — 368 с.&amp;lt;/ref&amp;gt;. Известно, что случае нормально распределенного случайного вектора, ковариационная матрица вместе с математическим ожиданием этого вектора полностью определяют его распределение. Поэтому для полного статистического соответствия моделируемого и теоретического распределения гауссовского вектора достаточно обеспечить требуемые значения указанных параметров&amp;lt;ref name=&amp;quot;VV&amp;quot;&amp;gt; https://ru.wikipedia.org/wiki/Многомерное_нормальное_распределение&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея алгоритма заключается в линейном преобразовании n-мерного случайного вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, компоненты которого независимы и одинаково распределены по нормальному закону со стандартными параметрами, в случайный вектор &amp;lt;math&amp;gt;X&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;\Sigma&amp;lt;/math&amp;gt; и вектор математических ожиданий &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Sigma = \|\sigma_{ij}\| = \| \mathbb{E}[(X_{i} - m_{x_{i}})(X_{j} - m_{x_{j}})]\|, \\&lt;br /&gt;
M = (m_{x_{1}}, m_{x_{2}}, ..., m_{x_{n}})^T.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Требуется найти такую матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, которая позволяла бы получить искомый вектор &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; с требуемыми характеристиками в результате линейного преобразования &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — n-мерный случайный вектор с независимыми нормально распределенными компонентами со стандартными параметрами.&lt;br /&gt;
&lt;br /&gt;
Будем искать матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в виде нижней треугольной матрицы. Перейдем от матричной записи к системе алгебраических уравнений:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} X_{1} \\&lt;br /&gt;
 X_{2} \\ \vdots \\ X_{n} \end{pmatrix} =&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} b_{11} &amp;amp; 0 &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\b_{21} &amp;amp; b_{22} &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\ \vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \vdots&lt;br /&gt;
\\ b_{n1} &amp;amp; b_{n2} &amp;amp; \cdots &amp;amp; b_{nn}&lt;br /&gt;
\end{pmatrix} \times&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} Y_{1} \\&lt;br /&gt;
 Y_{2} \\ \vdots \\ Y_{n} \end{pmatrix} +&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} m_{x_{1}} \\&lt;br /&gt;
 m_{x_{2}} \\ \vdots \\ m_{x_{n}} \end{pmatrix} \Rightarrow&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}X_{1} - m_{x_{1}} = b_{11}Y_{1}&lt;br /&gt;
\\X_{2} - m_{x_{2}} = b_{21}Y_{1} + b_{22}Y_{2}&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\\X_{n} - m_{x_{n}} = b_{n1}Y_{1} + b_{n2}Y_{2} + \cdots + b_{nn}Y_{n}&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Поскольку компоненты вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; независимы и имеют стандартные параметры, справедливо выражение:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\mathbb{E}[Y_{i}Y_{j}] =&lt;br /&gt;
\left\{\begin{matrix} &lt;br /&gt;
1, &amp;amp;i = j, \\&lt;br /&gt;
0, &amp;amp;i \not= j.&lt;br /&gt;
\end{matrix}\right.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Почленно перемножив сами на себя и между собой соответственно левые и правые части уравнений системы и взяв от результатов перемножения математическое ожидание, получаем систему уравнений вида:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\mathbb{E}[(X_{1} - m_{x_{1}})(X_{1} - m_{x_{1}})] = \mathbb{E}[b_{11}Y_{1}b_{11}Y_{1}],&lt;br /&gt;
\\ \mathbb{E}[(X_{1} - m_{x_{1}})(X_{2} - m_{x_{2}})] = \mathbb{E}[(b_{21}Y_{1} + b_{22}Y_{2})b_{11}Y_{1}],&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, в левых частях полученной системы уравнений располагаются элементы заданной ковариационной матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;, а в правых — элементы искомой матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;. Последовательно решая эту систему, получаем формулы для расчета элементов &amp;lt;math&amp;gt;\sigma_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
b_{11}=\sqrt{\sigma_{11}}; b_{21}=\frac{\sigma_{12}}{\sqrt{\sigma_{11}}}; b_{22} = \sqrt{\sigma_{22} - \frac{\sigma_{12}}{\sigma_{11}}}, \cdots&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рекуррентная формула для расчета любого элемента матрицы преобразования &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b_{ij} = \frac {\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}} {\sqrt{\sigma_{jj} - \sum_{k=1}^{j-1} b_{jk}^2}}, \quad 1 \leqslant j \leqslant i \leqslant n&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(суммы с верхним нулевым пределом считаются равными нулю)&lt;br /&gt;
&lt;br /&gt;
Таким образом, матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; получается с помощью [[Разложение_Холецкого_(метод_квадратного_корня)|разложения Холецкого]] матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Генерация случайного вектора Y ====&lt;br /&gt;
&lt;br /&gt;
Пусть имеется генератор псевдослучайных чисел (ГПСЧ, PRNG), с помощью которого можно получить реализацию случайной величины &amp;lt;math&amp;gt;u \sim U(0,1) &amp;lt;/math&amp;gt;. Описанный выше случайный вектор &amp;lt;math&amp;gt;Y=(y_1, \dots, y_n)&amp;lt;/math&amp;gt; с независимыми компонентами составим из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; реализаций случайной величины &amp;lt;math&amp;gt;\eta \sim N(0,1)&amp;lt;/math&amp;gt;. Каждую такую реализацию &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;, в свою очередь, получим с помощью приближения по ЦПТ &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; случайными величинами, распределенными равномерно на отрезке [0,1]:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right), \quad i = \overline{1, n} \\&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;u_j^i - &amp;lt;/math&amp;gt; реализации случайной величины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;\kappa - &amp;lt;/math&amp;gt; параметр, обеспечивающий качество приближения.&lt;br /&gt;
&lt;br /&gt;
Как правило, &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; берут равным 12 и считают, что для подавляющего числа практических задач обеспечивается должная точность вычислений&amp;lt;ref name = &amp;quot;VVV&amp;quot;&amp;gt;Балдин К.В., Уткин В.Б. Информационные системы в экономике. — М.:Дашков и Кo, 2008. — 395 с.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&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;\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}, \quad 1 \leqslant j \leqslant i \leqslant n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;&lt;br /&gt;
* Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1) Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;b_{11}= \sqrt{\sigma_{11}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;b_{k1}= \frac{\sigma_{k1}}{l_{11}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad k = \overline{2,n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{2,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (c) &amp;lt;math&amp;gt;b_{ii} = \sqrt{\sigma_{ii} - \sum_{p = 1}^{i - 1} b_{ip}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (d) &amp;lt;math&amp;gt;b_{ji} = \frac{\sigma_{ji} - \sum_{p = 1}^{i - 1} b_{ip} b_{jp}} {l_{ii}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad i \neq n, j = \overline{i+1,n}&amp;lt;/math&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;u_j^i \leftarrow PRNG,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\quad j = \overline{1,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3) Вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i = m_{x_i} + \sum_{k = 1}^{i} b_{ik} y_{k}, \quad i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt; n(n+1) + \frac {n(n-1)(n-2)}{6} &amp;lt;/math&amp;gt; (умножений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac {n(n+1)}{2} + \frac {n(n-1)(n-2)}{6} &amp;lt;/math&amp;gt; (вычитаний)&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac {n(n-1+2\kappa)}{2} &amp;lt;/math&amp;gt; (сложений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac {n(n+3)}{2} &amp;lt;/math&amp;gt; (делений)&lt;br /&gt;
* &amp;lt;math&amp;gt; 2n &amp;lt;/math&amp;gt; (взятия квадратного корня)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{n}{6}\left(2n^2+9n+31+6\kappa\right) &amp;lt;/math&amp;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;
==== Заполнение матрицы B====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 1 макроструктуры алгоритма ([[Разложение_Холецкого_(метод_квадратного_корня)|&#039;&#039;разложения Холецкого&#039;&#039;]]) состоит из трёх групп вершин, расположенных в целочисленных узлах трёх областей разной размерности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин расположена в одномерной области, соответствующая ей операция вычисляет функцию SQRT. &lt;br /&gt;
Единственная координата каждой из вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргумент этой функции &lt;br /&gt;
	&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{11}&amp;lt;/math&amp;gt;; &lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ii}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин расположена в двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a / b&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;: &lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{j1}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1, j, i - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ji}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин расположена в трёхмерной области, соответствующая ей операция  &amp;lt;math&amp;gt;a - b * c&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; — меняется в диапазоне  от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;p = 1&amp;lt;/math&amp;gt; элемент входных данных &amp;lt;math&amp;gt;\sigma_{ji}&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;p &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i, j, p - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, i&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, j&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.1, выполненном для случая &amp;lt;math&amp;gt;n = 4&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
[[file:Cholesky full_in_out.png|thumb|center|1400px|Рисунок 1. Граф этапа 1 макроструктуры алгоритма. SQ — вычисление квадратного корня, F — операция a-bc, Div — деление, In — входные данные, Out — выходные.]]&lt;br /&gt;
&lt;br /&gt;
====Генерация вектора Y====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 2 макроструктуры алгоритма состоит из двух групп вершин, расположенных в целочисленных узлах двумерной области.&lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин. Соответствующая ей операция вычисляет функцию &amp;lt;math&amp;gt;S = a+b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a:&amp;lt;/math&amp;gt;&lt;br /&gt;
** при &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; — константа &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;j&amp;gt;1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатами &amp;lt;math&amp;gt;i,j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; — значение, поступающее с &amp;lt;math&amp;gt;PRNG&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин. Соответствующая ей операция вычисляет функцию &amp;lt;math&amp;gt;F = \left(a-\frac{\kappa}{2}\right)\sqrt{\frac{12}{\kappa}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; —  результат срабатывания операции, соответствующей вершине из первой группы, с координатами &amp;lt;math&amp;gt;i,\kappa&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; этапа &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.2, выполненном для случая &amp;lt;math&amp;gt;n = 2, \kappa = 2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf2.png|550px|thumb|center|Рисунок 2. Граф этапа 2 макроструктуры алгоритма]]&lt;br /&gt;
&lt;br /&gt;
====Вычисление вектора X====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 3 макроструктуры алгоритма (&#039;&#039;умножение нижней треугольной матрицы на вектор и сложение результата с другим вектором&#039;&#039;) состоит из одной группы вершин, расположенной в целочисленных узлах двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a+bc&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;j = 1&amp;lt;/math&amp;gt; — компонента &amp;lt;math&amp;gt;m_{x_i}&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;j &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине с координатами &amp;lt;math&amp;gt;i, j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;b_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;y_{j}&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является:&lt;br /&gt;
* при &amp;lt;math&amp;gt;j &amp;lt; i&amp;lt;/math&amp;gt; — &#039;&#039;промежуточным данным&#039;&#039; этапа;&lt;br /&gt;
* при &amp;lt;math&amp;gt;j = i&amp;lt;/math&amp;gt; — &#039;&#039;выходным данным&#039;&#039; алгоритма &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.3, выполненном для случая &amp;lt;math&amp;gt; n = 4&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf3.png|650px|thumb|center|Рисунок 3. Граф этапа 3 макроструктуры алгоритма,  F — операция a+bc]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для разложения Холецкого &amp;lt;math&amp;gt;(n \times n)&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; в параллельном варианте требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов с вычислением квадратного корня (единичные вычисления в каждом из ярусов),&lt;br /&gt;
* &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; ярус делений (в каждом из ярусов — линейное количество операций, в зависимости от яруса — от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt;),&lt;br /&gt;
* по &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; ярусов умножений и сложений/вычитаний (в каждом из ярусов — квадратичное количество операций, от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;\frac{n^2 - n}{2}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Для генерации &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; в параллельном варианте требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; ярусов сложений (&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; вычислений в каждом из ярусов),&lt;br /&gt;
* &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; ярус вычитаний, делений, умножений, вычислений квадратного корня (&amp;lt;math&amp;gt;1, 2, 1, 1&amp;lt;/math&amp;gt; операций соответственно),&lt;br /&gt;
&lt;br /&gt;
Для вычисления &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; в параллельном варианте требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений (в каждом из ярусов — линейное количество операций, в зависимости от яруса — от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ алгоритм имеет сложность &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, а при классификации по ширине ЯПФ — &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: вещественная всюду плотная положительно определенная симметрическая  &amp;lt;math&amp;gt;(n \times n)&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;\Sigma&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;
* Выходные данные: вещественный &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектор &amp;lt;math&amp;gt;X&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;syntaxhighlight lang = c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// compute matrix B (core)&lt;br /&gt;
for (int j = 0; j &amp;lt; n; j++){&lt;br /&gt;
    double sum_down = matrix_cov[j][j];&lt;br /&gt;
    for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
        double cur = matrix_cov[j][k];&lt;br /&gt;
        sum_down -= cur * cur;&lt;br /&gt;
    }&lt;br /&gt;
    matrix_cov[j][j] = sqrt(sum_down);&lt;br /&gt;
    for (int i = j + 1; i &amp;lt; n; i++){&lt;br /&gt;
        double sum_up = matrix_cov[i][j];&lt;br /&gt;
        for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
            sum_up -= matrix_cov[i][k] * matrix_cov[j][k];&lt;br /&gt;
        }&lt;br /&gt;
        matrix_cov[i][j] = sum_up / matrix_cov[j][j];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
// generate vector Y&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){&lt;br /&gt;
    double sum = generate_uniform(n);&lt;br /&gt;
    for (int j = 0; j &amp;lt; CLT_NUM - 1; j++){&lt;br /&gt;
        sum += generate_uniform(n);&lt;br /&gt;
    }&lt;br /&gt;
    vec_Y[i] = (sum - CLT_NUM / 2) * sqrt(12.0 / CLT_NUM);&lt;br /&gt;
}&lt;br /&gt;
// linear transformation&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){  &lt;br /&gt;
    vec_X[i] = vec_exp[i];&lt;br /&gt;
    for (int k = 0; k &amp;lt;= i; k++){&lt;br /&gt;
        vec_X[i] += matrix_cov[i][k] * vec_Y[k];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Алгоритм был реализован на языке C++ с использованием Intel MPI Library и запущен на кластере regular4.&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add impi/5.0.1&lt;br /&gt;
 mpicxx -std=c++0x task.c -o _scratch/task&lt;br /&gt;
 sbatch -n256 impi ./task &amp;lt;matrix_size&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
* размер матрицы [1024 : 4864] с шагом 256,&lt;br /&gt;
* число ядер [2 : 256] с шагом по степеням 2.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:Ops_2.png|thumb|center|700px|Рисунок 4. Изменение производительности в зависимости от числа ядер и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
[[file:Eff_2.png|thumb|center|700px|Рисунок 5. Изменение эффективности реализации в зависимости от числа ядер и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
[[file:Eff_2_up.png|thumb|center|700px|Рисунок 6. Изменение эффективности реализации, вид сверху.]]&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;По размеру задачи&#039;&#039;&#039; — при увеличении размерности матрицы эффективность реализации постепенно увеличивается, при этом тем быстрее, чем большее число ядер задействовано.&lt;br /&gt;
* &#039;&#039;&#039;По числу ядер&#039;&#039;&#039; — при увеличении числа mpi-процессов эффективность реализации снижается. Это объясняется ростом накладных расходов на организацию параллельного выполнения. При этом с ростом размерности матрицы эффективность снижается с такой же скоростью, но уже при больших значениях числа mpi-процессов.&lt;br /&gt;
* &#039;&#039;&#039;По двум направлениям&#039;&#039;&#039; — эффективность реализации возрастает (на рассматриваемой области значений параметров), но крайне медленно.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/mensigo/skipod/blob/master/mpi_gauss_vec_gen.c Параллельная реализация на C++]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
MS Excel и распространённые статистические пакеты (напр., SPSS, Statistica) позволяют моделировать только одномерные статистические распределения. Имеется возможность &amp;quot;собрать&amp;quot; многомерное распределение из нескольких одномерных при условии, что компоненты независимы. Однако если необходимо исследовать данные с зависящими друг от друга переменными, то приходится писать собственную программу. При этом удобно воспользоваться готовой реализацией разложения Холецкого (точечного метода), представленной в таких прикладных пакетах, как LINPACK, LAPACK, SCALAPACK.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Lonalone</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26773</id>
		<title>Участник:Lonalone/Генерация гауссовского вектора методом линейных преобразований</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26773"/>
		<updated>2018-12-07T22:11:19Z</updated>

		<summary type="html">&lt;p&gt;Lonalone: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор описания: &#039;&#039;Меньших И. М.&#039;&#039;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из многомерных распределений особый интерес представляет нормальное. Этому закону подчиняются все результаты воздействия большого числа случайных факторов, среди которых нет превалирующих.&lt;br /&gt;
&lt;br /&gt;
В статье приведен алгоритм генерации n-мерного гауссовского случайного вектора с помощью &#039;&#039;метода линейных преобразований&#039;&#039;&amp;lt;ref name=&amp;quot;V&amp;quot;&amp;gt;Михайлов Г.А., Войтишек А.В. Численное статистическое моделирование. Методы Монте-Карло — М.: Академия, 2006. — 368 с.&amp;lt;/ref&amp;gt;. Известно, что случае нормально распределенного случайного вектора, ковариационная матрица вместе с математическим ожиданием этого вектора полностью определяют его распределение. Поэтому для полного статистического соответствия моделируемого и теоретического распределения гауссовского вектора достаточно обеспечить требуемые значения указанных параметров&amp;lt;ref name=&amp;quot;VV&amp;quot;&amp;gt; https://ru.wikipedia.org/wiki/Многомерное_нормальное_распределение&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея алгоритма заключается в линейном преобразовании n-мерного случайного вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, компоненты которого независимы и одинаково распределены по нормальному закону со стандартными параметрами, в случайный вектор &amp;lt;math&amp;gt;X&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;\Sigma&amp;lt;/math&amp;gt; и вектор математических ожиданий &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Sigma = \|\sigma_{ij}\| = \| \mathbb{E}[(X_{i} - m_{x_{i}})(X_{j} - m_{x_{j}})]\|, \\&lt;br /&gt;
M = (m_{x_{1}}, m_{x_{2}}, ..., m_{x_{n}})^T.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Требуется найти такую матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, которая позволяла бы получить искомый вектор &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; с требуемыми характеристиками в результате линейного преобразования &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — n-мерный случайный вектор с независимыми нормально распределенными компонентами со стандартными параметрами.&lt;br /&gt;
&lt;br /&gt;
Будем искать матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в виде нижней треугольной матрицы. Перейдем от матричной записи к системе алгебраических уравнений:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} X_{1} \\&lt;br /&gt;
 X_{2} \\ \vdots \\ X_{n} \end{pmatrix} =&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} b_{11} &amp;amp; 0 &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\b_{21} &amp;amp; b_{22} &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\ \vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \vdots&lt;br /&gt;
\\ b_{n1} &amp;amp; b_{n2} &amp;amp; \cdots &amp;amp; b_{nn}&lt;br /&gt;
\end{pmatrix} \times&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} Y_{1} \\&lt;br /&gt;
 Y_{2} \\ \vdots \\ Y_{n} \end{pmatrix} +&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} m_{x_{1}} \\&lt;br /&gt;
 m_{x_{2}} \\ \vdots \\ m_{x_{n}} \end{pmatrix} \Rightarrow&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}X_{1} - m_{x_{1}} = b_{11}Y_{1}&lt;br /&gt;
\\X_{2} - m_{x_{2}} = b_{21}Y_{1} + b_{22}Y_{2}&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\\X_{n} - m_{x_{n}} = b_{n1}Y_{1} + b_{n2}Y_{2} + \cdots + b_{nn}Y_{n}&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Поскольку компоненты вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; независимы и имеют стандартные параметры, справедливо выражение:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\mathbb{E}[Y_{i}Y_{j}] =&lt;br /&gt;
\left\{\begin{matrix} &lt;br /&gt;
1, &amp;amp;i = j, \\&lt;br /&gt;
0, &amp;amp;i \not= j.&lt;br /&gt;
\end{matrix}\right.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Почленно перемножив сами на себя и между собой соответственно левые и правые части уравнений системы и взяв от результатов перемножения математическое ожидание, получаем систему уравнений вида:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\mathbb{E}[(X_{1} - m_{x_{1}})(X_{1} - m_{x_{1}})] = \mathbb{E}[b_{11}Y_{1}b_{11}Y_{1}],&lt;br /&gt;
\\ \mathbb{E}[(X_{1} - m_{x_{1}})(X_{2} - m_{x_{2}})] = \mathbb{E}[(b_{21}Y_{1} + b_{22}Y_{2})b_{11}Y_{1}],&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, в левых частях полученной системы уравнений располагаются элементы заданной ковариационной матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;, а в правых — элементы искомой матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;. Последовательно решая эту систему, получаем формулы для расчета элементов &amp;lt;math&amp;gt;\sigma_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
b_{11}=\sqrt{\sigma_{11}}; b_{21}=\frac{\sigma_{12}}{\sqrt{\sigma_{11}}}; b_{22} = \sqrt{\sigma_{22} - \frac{\sigma_{12}}{\sigma_{11}}}, \cdots&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рекуррентная формула для расчета любого элемента матрицы преобразования &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b_{ij} = \frac {\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}} {\sqrt{\sigma_{jj} - \sum_{k=1}^{j-1} b_{jk}^2}}, \quad 1 \leqslant j \leqslant i \leqslant n&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(суммы с верхним нулевым пределом считаются равными нулю)&lt;br /&gt;
&lt;br /&gt;
Таким образом, матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; получается с помощью [[Разложение_Холецкого_(метод_квадратного_корня)|разложения Холецкого]] матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Генерация случайного вектора Y ====&lt;br /&gt;
&lt;br /&gt;
Пусть имеется генератор псевдослучайных чисел (ГПСЧ, PRNG), с помощью которого можно получить реализацию случайной величины &amp;lt;math&amp;gt;u \sim U(0,1) &amp;lt;/math&amp;gt;. Описанный выше случайный вектор &amp;lt;math&amp;gt;Y=(y_1, \dots, y_n)&amp;lt;/math&amp;gt; с независимыми компонентами составим из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; реализаций случайной величины &amp;lt;math&amp;gt;\eta \sim N(0,1)&amp;lt;/math&amp;gt;. Каждую такую реализацию &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;, в свою очередь, получим с помощью приближения по ЦПТ &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; случайными величинами, распределенными равномерно на отрезке [0,1]:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right), \quad i = \overline{1, n} \\&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;u_j^i - &amp;lt;/math&amp;gt; реализации случайной величины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;\kappa - &amp;lt;/math&amp;gt; параметр, обеспечивающий качество приближения.&lt;br /&gt;
&lt;br /&gt;
Как правило, &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; берут равным 12 и считают, что для подавляющего числа практических задач обеспечивается должная точность вычислений&amp;lt;ref name = &amp;quot;VVV&amp;quot;&amp;gt;Балдин К.В., Уткин В.Б. Информационные системы в экономике. — М.:Дашков и Кo, 2008. — 395 с.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&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;\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}, \quad 1 \leqslant j \leqslant i \leqslant n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;&lt;br /&gt;
* Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1) Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;b_{11}= \sqrt{\sigma_{11}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;b_{k1}= \frac{\sigma_{k1}}{l_{11}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad k = \overline{2,n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{2,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (c) &amp;lt;math&amp;gt;b_{ii} = \sqrt{\sigma_{ii} - \sum_{p = 1}^{i - 1} b_{ip}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (d) &amp;lt;math&amp;gt;b_{ji} = \frac{\sigma_{ji} - \sum_{p = 1}^{i - 1} b_{ip} b_{jp}} {l_{ii}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad i \neq n, j = \overline{i+1,n}&amp;lt;/math&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;u_j^i \leftarrow PRNG,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\quad j = \overline{1,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3) Вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i = m_{x_i} + \sum_{k = 1}^{i} b_{ik} y_{k}, \quad i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt; n(n+1) + \frac {n(n-1)(n-2)}{6} &amp;lt;/math&amp;gt; (умножений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac {n(n+1)}{2} + \frac {n(n-1)(n-2)}{6} &amp;lt;/math&amp;gt; (вычитаний)&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac {n(n-1+2\kappa)}{2} &amp;lt;/math&amp;gt; (сложений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac {n(n+3)}{2} &amp;lt;/math&amp;gt; (делений)&lt;br /&gt;
* &amp;lt;math&amp;gt; 2n &amp;lt;/math&amp;gt; (взятия квадратного корня)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{n}{6}\left(2n^2+9n+31+6\kappa\right) &amp;lt;/math&amp;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;
==== Заполнение матрицы B====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 1 макроструктуры алгоритма ([[Разложение_Холецкого_(метод_квадратного_корня)|&#039;&#039;разложения Холецкого&#039;&#039;]]) состоит из трёх групп вершин, расположенных в целочисленных узлах трёх областей разной размерности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин расположена в одномерной области, соответствующая ей операция вычисляет функцию SQRT. &lt;br /&gt;
Единственная координата каждой из вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргумент этой функции &lt;br /&gt;
	&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{11}&amp;lt;/math&amp;gt;; &lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ii}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин расположена в двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a / b&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;: &lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{j1}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1, j, i - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ji}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин расположена в трёхмерной области, соответствующая ей операция  &amp;lt;math&amp;gt;a - b * c&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; — меняется в диапазоне  от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;p = 1&amp;lt;/math&amp;gt; элемент входных данных &amp;lt;math&amp;gt;\sigma_{ji}&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;p &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i, j, p - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, i&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, j&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.1, выполненном для случая &amp;lt;math&amp;gt;n = 4&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
[[file:Cholesky full_in_out.png|thumb|center|1400px|Рисунок 1. Граф этапа 1 макроструктуры алгоритма. SQ — вычисление квадратного корня, F — операция a-bc, Div — деление, In — входные данные, Out — выходные.]]&lt;br /&gt;
&lt;br /&gt;
====Генерация вектора Y====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 2 макроструктуры алгоритма состоит из двух групп вершин, расположенных в целочисленных узлах двумерной области.&lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин. Соответствующая ей операция вычисляет функцию &amp;lt;math&amp;gt;S = a+b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a:&amp;lt;/math&amp;gt;&lt;br /&gt;
** при &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; — константа &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;j&amp;gt;1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатами &amp;lt;math&amp;gt;i,j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; — значение, поступающее с &amp;lt;math&amp;gt;PRNG&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин. Соответствующая ей операция вычисляет функцию &amp;lt;math&amp;gt;F = \left(a-\frac{\kappa}{2}\right)\sqrt{\frac{12}{\kappa}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; —  результат срабатывания операции, соответствующей вершине из первой группы, с координатами &amp;lt;math&amp;gt;i,\kappa&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; этапа &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.2, выполненном для случая &amp;lt;math&amp;gt;n = 2, \kappa = 2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf2.png|550px|thumb|center|Рисунок 2. Граф этапа 2 макроструктуры алгоритма]]&lt;br /&gt;
&lt;br /&gt;
====Вычисление вектора X====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 3 макроструктуры алгоритма (&#039;&#039;умножение нижней треугольной матрицы на вектор и сложение результата с другим вектором&#039;&#039;) состоит из одной группы вершин, расположенной в целочисленных узлах двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a+bc&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;j = 1&amp;lt;/math&amp;gt; — компонента &amp;lt;math&amp;gt;m_{x_i}&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;j &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине с координатами &amp;lt;math&amp;gt;i, j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;b_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;y_{j}&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является:&lt;br /&gt;
* при &amp;lt;math&amp;gt;j &amp;lt; i&amp;lt;/math&amp;gt; — &#039;&#039;промежуточным данным&#039;&#039; этапа;&lt;br /&gt;
* при &amp;lt;math&amp;gt;j = i&amp;lt;/math&amp;gt; — &#039;&#039;выходным данным&#039;&#039; алгоритма &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.3, выполненном для случая &amp;lt;math&amp;gt; n = 4&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf3.png|650px|thumb|center|Рисунок 3. Граф этапа 3 макроструктуры алгоритма,  F — операция a+bc]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для разложения Холецкого &amp;lt;math&amp;gt;(n \times n)&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; в параллельном варианте требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов с вычислением квадратного корня (единичные вычисления в каждом из ярусов),&lt;br /&gt;
* &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; ярус делений (в каждом из ярусов — линейное количество операций, в зависимости от яруса — от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt;),&lt;br /&gt;
* по &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; ярусов умножений и сложений/вычитаний (в каждом из ярусов — квадратичное количество операций, от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;\frac{n^2 - n}{2}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Для генерации &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; в параллельном варианте требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; ярусов сложений (&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; вычислений в каждом из ярусов),&lt;br /&gt;
* &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; ярус вычитаний, делений, умножений, вычислений квадратного корня (&amp;lt;math&amp;gt;1, 2, 1, 1&amp;lt;/math&amp;gt; операций соответственно),&lt;br /&gt;
&lt;br /&gt;
Для вычисления &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; в параллельном варианте требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений (в каждом из ярусов — линейное количество операций, в зависимости от яруса — от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: вещественная всюду плотная положительно определенная симметрическая  &amp;lt;math&amp;gt;(n \times n)&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;\Sigma&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;
* Выходные данные: вещественный &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектор &amp;lt;math&amp;gt;X&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;syntaxhighlight lang = c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// compute matrix B (core)&lt;br /&gt;
for (int j = 0; j &amp;lt; n; j++){&lt;br /&gt;
    double sum_down = matrix_cov[j][j];&lt;br /&gt;
    for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
        double cur = matrix_cov[j][k];&lt;br /&gt;
        sum_down -= cur * cur;&lt;br /&gt;
    }&lt;br /&gt;
    matrix_cov[j][j] = sqrt(sum_down);&lt;br /&gt;
    for (int i = j + 1; i &amp;lt; n; i++){&lt;br /&gt;
        double sum_up = matrix_cov[i][j];&lt;br /&gt;
        for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
            sum_up -= matrix_cov[i][k] * matrix_cov[j][k];&lt;br /&gt;
        }&lt;br /&gt;
        matrix_cov[i][j] = sum_up / matrix_cov[j][j];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
// generate vector Y&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){&lt;br /&gt;
    double sum = generate_uniform(n);&lt;br /&gt;
    for (int j = 0; j &amp;lt; CLT_NUM - 1; j++){&lt;br /&gt;
        sum += generate_uniform(n);&lt;br /&gt;
    }&lt;br /&gt;
    vec_Y[i] = (sum - CLT_NUM / 2) * sqrt(12.0 / CLT_NUM);&lt;br /&gt;
}&lt;br /&gt;
// linear transformation&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){  &lt;br /&gt;
    vec_X[i] = vec_exp[i];&lt;br /&gt;
    for (int k = 0; k &amp;lt;= i; k++){&lt;br /&gt;
        vec_X[i] += matrix_cov[i][k] * vec_Y[k];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Алгоритм был реализован на языке C++ с использованием Intel MPI Library и запущен на кластере regular4.&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add impi/5.0.1&lt;br /&gt;
 mpicxx -std=c++0x task.c -o _scratch/task&lt;br /&gt;
 sbatch -n256 impi ./task &amp;lt;matrix_size&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
* размер матрицы [1024 : 4864] с шагом 256,&lt;br /&gt;
* число ядер [2 : 256] с шагом по степеням 2.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:Ops_2.png|thumb|center|700px|Рисунок 4. Изменение производительности в зависимости от числа ядер и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
[[file:Eff_2.png|thumb|center|700px|Рисунок 5. Изменение эффективности реализации в зависимости от числа ядер и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
[[file:Eff_2_up.png|thumb|center|700px|Рисунок 6. Изменение эффективности реализации, вид сверху.]]&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;По размеру задачи&#039;&#039;&#039; — при увеличении размерности матрицы эффективность реализации постепенно увеличивается, при этом тем быстрее, чем большее число ядер задействовано.&lt;br /&gt;
* &#039;&#039;&#039;По числу ядер&#039;&#039;&#039; — при увеличении числа mpi-процессов эффективность реализации снижается. Это объясняется ростом накладных расходов на организацию параллельного выполнения. При этом с ростом размерности матрицы эффективность снижается с такой же скоростью, но уже при больших значениях числа mpi-процессов.&lt;br /&gt;
* &#039;&#039;&#039;По двум направлениям&#039;&#039;&#039; — эффективность реализации возрастает (на рассматриваемой области значений параметров), но крайне медленно.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/mensigo/skipod/blob/master/mpi_gauss_vec_gen.c Параллельная реализация на C++]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
MS Excel и распространённые статистические пакеты (напр., SPSS, Statistica) позволяют моделировать только одномерные статистические распределения. Имеется возможность &amp;quot;собрать&amp;quot; многомерное распределение из нескольких одномерных при условии, что компоненты независимы. Однако если необходимо исследовать данные с зависящими друг от друга переменными, то приходится писать собственную программу. При этом удобно воспользоваться готовой реализацией разложения Холецкого (точечного метода), представленной в таких прикладных пакетах, как LINPACK, LAPACK, SCALAPACK.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Lonalone</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26772</id>
		<title>Участник:Lonalone/Генерация гауссовского вектора методом линейных преобразований</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26772"/>
		<updated>2018-12-07T21:26:24Z</updated>

		<summary type="html">&lt;p&gt;Lonalone: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор описания: &#039;&#039;Меньших И. М.&#039;&#039;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из многомерных распределений особый интерес представляет нормальное. Этому закону подчиняются все результаты воздействия большого числа случайных факторов, среди которых нет превалирующих.&lt;br /&gt;
&lt;br /&gt;
В статье приведен алгоритм генерации n-мерного гауссовского случайного вектора с помощью &#039;&#039;метода линейных преобразований&#039;&#039;&amp;lt;ref name=&amp;quot;V&amp;quot;&amp;gt;Михайлов Г.А., Войтишек А.В. Численное статистическое моделирование. Методы Монте-Карло — М.: Академия, 2006. — 368 с.&amp;lt;/ref&amp;gt;. Известно, что случае нормально распределенного случайного вектора, ковариационная матрица вместе с математическим ожиданием этого вектора полностью определяют его распределение. Поэтому для полного статистического соответствия моделируемого и теоретического распределения гауссовского вектора достаточно обеспечить требуемые значения указанных параметров&amp;lt;ref name=&amp;quot;VV&amp;quot;&amp;gt; https://ru.wikipedia.org/wiki/Многомерное_нормальное_распределение&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея алгоритма заключается в линейном преобразовании n-мерного случайного вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, компоненты которого независимы и одинаково распределены по нормальному закону со стандартными параметрами, в случайный вектор &amp;lt;math&amp;gt;X&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;\Sigma&amp;lt;/math&amp;gt; и вектор математических ожиданий &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Sigma = \|\sigma_{ij}\| = \| \mathbb{E}[(X_{i} - m_{x_{i}})(X_{j} - m_{x_{j}})]\|, \\&lt;br /&gt;
M = (m_{x_{1}}, m_{x_{2}}, ..., m_{x_{n}})^T.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Требуется найти такую матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, которая позволяла бы получить искомый вектор &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; с требуемыми характеристиками в результате линейного преобразования &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — n-мерный случайный вектор с независимыми нормально распределенными компонентами со стандартными параметрами.&lt;br /&gt;
&lt;br /&gt;
Будем искать матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в виде нижней треугольной матрицы. Перейдем от матричной записи к системе алгебраических уравнений:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} X_{1} \\&lt;br /&gt;
 X_{2} \\ \vdots \\ X_{n} \end{pmatrix} =&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} b_{11} &amp;amp; 0 &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\b_{21} &amp;amp; b_{22} &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\ \vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \vdots&lt;br /&gt;
\\ b_{n1} &amp;amp; b_{n2} &amp;amp; \cdots &amp;amp; b_{nn}&lt;br /&gt;
\end{pmatrix} \times&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} Y_{1} \\&lt;br /&gt;
 Y_{2} \\ \vdots \\ Y_{n} \end{pmatrix} +&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} m_{x_{1}} \\&lt;br /&gt;
 m_{x_{2}} \\ \vdots \\ m_{x_{n}} \end{pmatrix} \Rightarrow&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}X_{1} - m_{x_{1}} = b_{11}Y_{1}&lt;br /&gt;
\\X_{2} - m_{x_{2}} = b_{21}Y_{1} + b_{22}Y_{2}&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\\X_{n} - m_{x_{n}} = b_{n1}Y_{1} + b_{n2}Y_{2} + \cdots + b_{nn}Y_{n}&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Поскольку компоненты вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; независимы и имеют стандартные параметры, справедливо выражение:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\mathbb{E}[Y_{i}Y_{j}] =&lt;br /&gt;
\left\{\begin{matrix} &lt;br /&gt;
1, &amp;amp;i = j, \\&lt;br /&gt;
0, &amp;amp;i \not= j.&lt;br /&gt;
\end{matrix}\right.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Почленно перемножив сами на себя и между собой соответственно левые и правые части уравнений системы и взяв от результатов перемножения математическое ожидание, получаем систему уравнений вида:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\mathbb{E}[(X_{1} - m_{x_{1}})(X_{1} - m_{x_{1}})] = \mathbb{E}[b_{11}Y_{1}b_{11}Y_{1}],&lt;br /&gt;
\\ \mathbb{E}[(X_{1} - m_{x_{1}})(X_{2} - m_{x_{2}})] = \mathbb{E}[(b_{21}Y_{1} + b_{22}Y_{2})b_{11}Y_{1}],&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, в левых частях полученной системы уравнений располагаются элементы заданной ковариационной матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;, а в правых — элементы искомой матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;. Последовательно решая эту систему, получаем формулы для расчета элементов &amp;lt;math&amp;gt;\sigma_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
b_{11}=\sqrt{\sigma_{11}}; b_{21}=\frac{\sigma_{12}}{\sqrt{\sigma_{11}}}; b_{22} = \sqrt{\sigma_{22} - \frac{\sigma_{12}}{\sigma_{11}}}, \cdots&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рекуррентная формула для расчета любого элемента матрицы преобразования &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b_{ij} = \frac {\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}} {\sqrt{\sigma_{jj} - \sum_{k=1}^{j-1} b_{jk}^2}}, \quad 1 \leqslant j \leqslant i \leqslant n&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(суммы с верхним нулевым пределом считаются равными нулю)&lt;br /&gt;
&lt;br /&gt;
Таким образом, матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; получается с помощью [[Разложение_Холецкого_(метод_квадратного_корня)|разложения Холецкого]] матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Генерация случайного вектора Y ====&lt;br /&gt;
&lt;br /&gt;
Пусть имеется генератор псевдослучайных чисел (ГПСЧ, PRNG), с помощью которого можно получить реализацию случайной величины &amp;lt;math&amp;gt;u \sim U(0,1) &amp;lt;/math&amp;gt;. Описанный выше случайный вектор &amp;lt;math&amp;gt;Y=(y_1, \dots, y_n)&amp;lt;/math&amp;gt; с независимыми компонентами составим из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; реализаций случайной величины &amp;lt;math&amp;gt;\eta \sim N(0,1)&amp;lt;/math&amp;gt;. Каждую такую реализацию &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;, в свою очередь, получим с помощью приближения по ЦПТ &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; случайными величинами, распределенными равномерно на отрезке [0,1]:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right), \quad i = \overline{1, n} \\&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;u_j^i - &amp;lt;/math&amp;gt; реализации случайной величины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;\kappa - &amp;lt;/math&amp;gt; параметр, обеспечивающий качество приближения.&lt;br /&gt;
&lt;br /&gt;
Как правило, &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; берут равным 12 и считают, что для подавляющего числа практических задач обеспечивается должная точность вычислений&amp;lt;ref name = &amp;quot;VVV&amp;quot;&amp;gt;Балдин К.В., Уткин В.Б. Информационные системы в экономике. — М.:Дашков и Кo, 2008. — 395 с.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&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;\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}, \quad 1 \leqslant j \leqslant i \leqslant n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;&lt;br /&gt;
* Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1) Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;b_{11}= \sqrt{\sigma_{11}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;b_{k1}= \frac{\sigma_{k1}}{l_{11}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad k = \overline{2,n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{2,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (c) &amp;lt;math&amp;gt;b_{ii} = \sqrt{\sigma_{ii} - \sum_{p = 1}^{i - 1} b_{ip}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (d) &amp;lt;math&amp;gt;b_{ji} = \frac{\sigma_{ji} - \sum_{p = 1}^{i - 1} b_{ip} b_{jp}} {l_{ii}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad i \neq n, j = \overline{i+1,n}&amp;lt;/math&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;u_j^i \leftarrow PRNG,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\quad j = \overline{1,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3) Вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i = m_{x_i} + \sum_{k = 1}^{i} b_{ik} y_{k}, \quad i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt; n(n+1) + \frac {n(n-1)(n-2)}{6} &amp;lt;/math&amp;gt; (умножений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac {n(n+1)}{2} + \frac {n(n-1)(n-2)}{6} &amp;lt;/math&amp;gt; (вычитаний)&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac {n(n-1+2\kappa)}{2} &amp;lt;/math&amp;gt; (сложений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac {n(n+3)}{2} &amp;lt;/math&amp;gt; (делений)&lt;br /&gt;
* &amp;lt;math&amp;gt; 2n &amp;lt;/math&amp;gt; (взятия квадратного корня)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{n}{6}\left(2n^2+9n+31+6\kappa\right) &amp;lt;/math&amp;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;
==== Заполнение матрицы B====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 1 макроструктуры алгоритма ([[Разложение_Холецкого_(метод_квадратного_корня)|&#039;&#039;разложения Холецкого&#039;&#039;]]) состоит из трёх групп вершин, расположенных в целочисленных узлах трёх областей разной размерности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин расположена в одномерной области, соответствующая ей операция вычисляет функцию SQRT. &lt;br /&gt;
Единственная координата каждой из вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргумент этой функции &lt;br /&gt;
	&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{11}&amp;lt;/math&amp;gt;; &lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ii}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин расположена в двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a / b&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;: &lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{j1}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1, j, i - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ji}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин расположена в трёхмерной области, соответствующая ей операция  &amp;lt;math&amp;gt;a - b * c&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; — меняется в диапазоне  от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;p = 1&amp;lt;/math&amp;gt; элемент входных данных &amp;lt;math&amp;gt;\sigma_{ji}&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;p &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i, j, p - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, i&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, j&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.1, выполненном для случая &amp;lt;math&amp;gt;n = 4&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
[[file:Cholesky full_in_out.png|thumb|center|1400px|Рисунок 1. Граф этапа 1 макроструктуры алгоритма. SQ — вычисление квадратного корня, F — операция a-bc, Div — деление, In — входные данные, Out — выходные.]]&lt;br /&gt;
&lt;br /&gt;
====Генерация вектора Y====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 2 макроструктуры алгоритма состоит из двух групп вершин, расположенных в целочисленных узлах двумерной области.&lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин. Соответствующая ей операция вычисляет функцию &amp;lt;math&amp;gt;S = a+b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a:&amp;lt;/math&amp;gt;&lt;br /&gt;
** при &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; — константа &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;j&amp;gt;1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатами &amp;lt;math&amp;gt;i,j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; — значение, поступающее с &amp;lt;math&amp;gt;PRNG&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин. Соответствующая ей операция вычисляет функцию &amp;lt;math&amp;gt;F = \left(a-\frac{\kappa}{2}\right)\sqrt{\frac{12}{\kappa}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; —  результат срабатывания операции, соответствующей вершине из первой группы, с координатами &amp;lt;math&amp;gt;i,\kappa&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; этапа &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.2, выполненном для случая &amp;lt;math&amp;gt;n = 2, \kappa = 2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf2.png|550px|thumb|center|Рисунок 2. Граф этапа 2 макроструктуры алгоритма]]&lt;br /&gt;
&lt;br /&gt;
====Вычисление вектора X====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 3 макроструктуры алгоритма (&#039;&#039;умножение нижней треугольной матрицы на вектор и сложение результата с другим вектором&#039;&#039;) состоит из одной группы вершин, расположенной в целочисленных узлах двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a+bc&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;j = 1&amp;lt;/math&amp;gt; — компонента &amp;lt;math&amp;gt;m_{x_i}&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;j &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине с координатами &amp;lt;math&amp;gt;i, j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;b_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;y_{j}&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является:&lt;br /&gt;
* при &amp;lt;math&amp;gt;j &amp;lt; i&amp;lt;/math&amp;gt; — &#039;&#039;промежуточным данным&#039;&#039; этапа;&lt;br /&gt;
* при &amp;lt;math&amp;gt;j = i&amp;lt;/math&amp;gt; — &#039;&#039;выходным данным&#039;&#039; алгоритма &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.3, выполненном для случая &amp;lt;math&amp;gt; n = 4&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf3.png|650px|thumb|center|Рисунок 3. Граф этапа 3 макроструктуры алгоритма,  F — операция a+bc]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для распараллеливания доступны следующие опции:&lt;br /&gt;
* вычисление элементов матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в рамках столбца (под диагональю),&lt;br /&gt;
* генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;,&lt;br /&gt;
* вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (умножение матрицы на вектор, сложение векторов).&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: вещественная всюду плотная положительно определенная симметрическая  &amp;lt;math&amp;gt;(n \times n)&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;\Sigma&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;
* Выходные данные: вещественный &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектор &amp;lt;math&amp;gt;X&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;syntaxhighlight lang = c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// compute matrix B (core)&lt;br /&gt;
for (int j = 0; j &amp;lt; n; j++){&lt;br /&gt;
    double sum_down = matrix_cov[j][j];&lt;br /&gt;
    for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
        double cur = matrix_cov[j][k];&lt;br /&gt;
        sum_down -= cur * cur;&lt;br /&gt;
    }&lt;br /&gt;
    matrix_cov[j][j] = sqrt(sum_down);&lt;br /&gt;
    for (int i = j + 1; i &amp;lt; n; i++){&lt;br /&gt;
        double sum_up = matrix_cov[i][j];&lt;br /&gt;
        for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
            sum_up -= matrix_cov[i][k] * matrix_cov[j][k];&lt;br /&gt;
        }&lt;br /&gt;
        matrix_cov[i][j] = sum_up / matrix_cov[j][j];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
// generate vector Y&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){&lt;br /&gt;
    double sum = generate_uniform(n);&lt;br /&gt;
    for (int j = 0; j &amp;lt; CLT_NUM - 1; j++){&lt;br /&gt;
        sum += generate_uniform(n);&lt;br /&gt;
    }&lt;br /&gt;
    vec_Y[i] = (sum - CLT_NUM / 2) * sqrt(12.0 / CLT_NUM);&lt;br /&gt;
}&lt;br /&gt;
// linear transformation&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){  &lt;br /&gt;
    vec_X[i] = vec_exp[i];&lt;br /&gt;
    for (int k = 0; k &amp;lt;= i; k++){&lt;br /&gt;
        vec_X[i] += matrix_cov[i][k] * vec_Y[k];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Алгоритм был реализован на языке C++ с использованием Intel MPI Library и запущен на кластере regular4.&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add impi/5.0.1&lt;br /&gt;
 mpicxx -std=c++0x task.c -o _scratch/task&lt;br /&gt;
 sbatch -n256 impi ./task &amp;lt;matrix_size&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
* размер матрицы [1024 : 4864] с шагом 256,&lt;br /&gt;
* число ядер [2 : 256] с шагом по степеням 2.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:Ops_2.png|thumb|center|700px|Рисунок 4. Изменение производительности в зависимости от числа ядер и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
[[file:Eff_2.png|thumb|center|700px|Рисунок 5. Изменение эффективности реализации в зависимости от числа ядер и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
[[file:Eff_2_up.png|thumb|center|700px|Рисунок 6. Изменение эффективности реализации, вид сверху.]]&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;По размеру задачи&#039;&#039;&#039; — при увеличении размерности матрицы эффективность реализации постепенно увеличивается, при этом тем быстрее, чем большее число ядер задействовано.&lt;br /&gt;
* &#039;&#039;&#039;По числу ядер&#039;&#039;&#039; — при увеличении числа mpi-процессов эффективность реализации снижается. Это объясняется ростом накладных расходов на организацию параллельного выполнения. При этом с ростом размерности матрицы эффективность снижается с такой же скоростью, но уже при больших значениях числа mpi-процессов.&lt;br /&gt;
* &#039;&#039;&#039;По двум направлениям&#039;&#039;&#039; — эффективность реализации возрастает (на рассматриваемой области значений параметров), но крайне медленно.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/mensigo/skipod/blob/master/mpi_gauss_vec_gen.c Параллельная реализация на C++]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
MS Excel и распространённые статистические пакеты (напр., SPSS, Statistica) позволяют моделировать только одномерные статистические распределения. Имеется возможность &amp;quot;собрать&amp;quot; многомерное распределение из нескольких одномерных при условии, что компоненты независимы. Однако если необходимо исследовать данные с зависящими друг от друга переменными, то приходится писать собственную программу. При этом удобно воспользоваться готовой реализацией разложения Холецкого (точечного метода), представленной в таких прикладных пакетах, как LINPACK, LAPACK, SCALAPACK.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Lonalone</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26771</id>
		<title>Участник:Lonalone/Генерация гауссовского вектора методом линейных преобразований</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26771"/>
		<updated>2018-12-07T21:20:00Z</updated>

		<summary type="html">&lt;p&gt;Lonalone: /* Метод линейных преобразований */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор описания: &#039;&#039;Меньших И. М.&#039;&#039;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из многомерных распределений особый интерес представляет нормальное. Этому закону подчиняются все результаты воздействия большого числа случайных факторов, среди которых нет превалирующих.&lt;br /&gt;
&lt;br /&gt;
В статье приведен алгоритм генерации n-мерного гауссовского случайного вектора с помощью &#039;&#039;метода линейных преобразований&#039;&#039;&amp;lt;ref name=&amp;quot;V&amp;quot;&amp;gt;Михайлов Г.А., Войтишек А.В. Численное статистическое моделирование. Методы Монте-Карло — М.: Академия, 2006. — 368 с.&amp;lt;/ref&amp;gt;. Известно, что случае нормально распределенного случайного вектора, ковариационная матрица вместе с математическим ожиданием этого вектора полностью определяют его распределение. Поэтому для полного статистического соответствия моделируемого и теоретического распределения гауссовского вектора достаточно обеспечить требуемые значения указанных параметров&amp;lt;ref name=&amp;quot;VV&amp;quot;&amp;gt; https://ru.wikipedia.org/wiki/Многомерное_нормальное_распределение&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея алгоритма заключается в линейном преобразовании n-мерного случайного вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, компоненты которого независимы и одинаково распределены по нормальному закону со стандартными параметрами, в случайный вектор &amp;lt;math&amp;gt;X&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;\Sigma&amp;lt;/math&amp;gt; и вектор математических ожиданий &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Sigma = \|\sigma_{ij}\| = \| \mathbb{E}[(X_{i} - m_{x_{i}})(X_{j} - m_{x_{j}})]\|, \\&lt;br /&gt;
M = (m_{x_{1}}, m_{x_{2}}, ..., m_{x_{n}})^T.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Требуется найти такую матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, которая позволяла бы получить искомый вектор &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; с требуемыми характеристиками в результате линейного преобразования &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — n-мерный случайный вектор с независимыми нормально распределенными компонентами со стандартными параметрами.&lt;br /&gt;
&lt;br /&gt;
Будем искать матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в виде нижней треугольной матрицы. Перейдем от матричной записи к системе алгебраических уравнений:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} X_{1} \\&lt;br /&gt;
 X_{2} \\ \vdots \\ X_{n} \end{pmatrix} =&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} b_{11} &amp;amp; 0 &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\b_{21} &amp;amp; b_{22} &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\ \vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \vdots&lt;br /&gt;
\\ b_{n1} &amp;amp; b_{n2} &amp;amp; \cdots &amp;amp; b_{nn}&lt;br /&gt;
\end{pmatrix} \times&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} Y_{1} \\&lt;br /&gt;
 Y_{2} \\ \vdots \\ Y_{n} \end{pmatrix} +&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} m_{x_{1}} \\&lt;br /&gt;
 m_{x_{2}} \\ \vdots \\ m_{x_{n}} \end{pmatrix} \Rightarrow&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}X_{1} - m_{x_{1}} = b_{11}Y_{1}&lt;br /&gt;
\\X_{2} - m_{x_{2}} = b_{21}Y_{1} + b_{22}Y_{2}&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\\X_{n} - m_{x_{n}} = b_{n1}Y_{1} + b_{n2}Y_{2} + \cdots + b_{nn}Y_{n}&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Поскольку компоненты вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; независимы и имеют стандартные параметры, справедливо выражение:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\mathbb{E}[Y_{i}Y_{j}] =&lt;br /&gt;
\left\{\begin{matrix} &lt;br /&gt;
1, &amp;amp;i = j, \\&lt;br /&gt;
0, &amp;amp;i \not= j.&lt;br /&gt;
\end{matrix}\right.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Почленно перемножив сами на себя и между собой соответственно левые и правые части уравнений системы и взяв от результатов перемножения математическое ожидание, получаем систему уравнений вида:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\mathbb{E}[(X_{1} - m_{x_{1}})(X_{1} - m_{x_{1}})] = \mathbb{E}[b_{11}Y_{1}b_{11}Y_{1}],&lt;br /&gt;
\\ \mathbb{E}[(X_{1} - m_{x_{1}})(X_{2} - m_{x_{2}})] = \mathbb{E}[(b_{21}Y_{1} + b_{22}Y_{2})b_{11}Y_{1}],&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, в левых частях полученной системы уравнений располагаются элементы заданной ковариационной матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;, а в правых — элементы искомой матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;. Последовательно решая эту систему, получаем формулы для расчета элементов &amp;lt;math&amp;gt;\sigma_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
b_{11}=\sqrt{\sigma_{11}}; b_{21}=\frac{\sigma_{12}}{\sqrt{\sigma_{11}}}; b_{22} = \sqrt{\sigma_{22} - \frac{\sigma_{12}}{\sigma_{11}}}, \cdots&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рекуррентная формула для расчета любого элемента матрицы преобразования &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b_{ij} = \frac {\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}} {\sqrt{\sigma_{jj} - \sum_{k=1}^{j-1} b_{jk}^2}}, \quad 1 \leqslant j \leqslant i \leqslant n&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(суммы с верхним нулевым пределом считаются равными нулю)&lt;br /&gt;
&lt;br /&gt;
Таким образом, матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; получается с помощью [[Разложение_Холецкого_(метод_квадратного_корня)|разложения Холецкого]] матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Генерация случайного вектора Y ====&lt;br /&gt;
&lt;br /&gt;
Пусть имеется генератор псевдослучайных чисел (ГПСЧ, PRNG), с помощью которого можно получить реализацию случайной величины &amp;lt;math&amp;gt;u \sim U(0,1) &amp;lt;/math&amp;gt;. Описанный выше случайный вектор &amp;lt;math&amp;gt;Y=(y_1, \dots, y_n)&amp;lt;/math&amp;gt; с независимыми компонентами составим из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; реализаций случайной величины &amp;lt;math&amp;gt;\eta \sim N(0,1)&amp;lt;/math&amp;gt;. Каждую такую реализацию &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;, в свою очередь, получим с помощью приближения по ЦПТ &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; случайными величинами, распределенными равномерно на отрезке [0,1]:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right), \quad i = \overline{1, n} \\&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;u_j^i - &amp;lt;/math&amp;gt; реализации случайной величины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;\kappa - &amp;lt;/math&amp;gt; параметр, обеспечивающий качество приближения.&lt;br /&gt;
&lt;br /&gt;
Как правило, &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; берут равным 12 и считают, что для подавляющего числа практических задач обеспечивается должная точность вычислений&amp;lt;ref name = &amp;quot;VVV&amp;quot;&amp;gt;Балдин К.В., Уткин В.Б. Информационные системы в экономике. — М.:Дашков и Кo, 2008. — 395 с.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&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;\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}, \quad 1 \leqslant j \leqslant i \leqslant n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;&lt;br /&gt;
* Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1) Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;b_{11}= \sqrt{\sigma_{11}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;b_{k1}= \frac{\sigma_{k1}}{l_{11}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad k = \overline{2,n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{2,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (c) &amp;lt;math&amp;gt;b_{ii} = \sqrt{\sigma_{ii} - \sum_{p = 1}^{i - 1} b_{ip}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (d) &amp;lt;math&amp;gt;b_{ji} = \frac{\sigma_{ji} - \sum_{p = 1}^{i - 1} b_{ip} b_{jp}} {l_{ii}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad i \neq n, j = \overline{i+1,n}&amp;lt;/math&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;u_j^i \leftarrow PRNG,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\quad j = \overline{1,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3) Вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i = m_{x_i} + \sum_{k = 1}^{i} b_{ik} y_{k}, \quad i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt; n(n+1) + \frac {n(n-1)(n-2)}{6} &amp;lt;/math&amp;gt; (умножений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac {n(n+1)}{2} + \frac {n(n-1)(n-2)}{6} &amp;lt;/math&amp;gt; (вычитаний)&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac {n(n-1+2\kappa)}{2} &amp;lt;/math&amp;gt; (сложений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac {n(n+3)}{2} &amp;lt;/math&amp;gt; (делений)&lt;br /&gt;
* &amp;lt;math&amp;gt; 2n &amp;lt;/math&amp;gt; (взятия квадратного корня)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{n}{6}\left(2n^2+9n+31+6\kappa\right) &amp;lt;/math&amp;gt; - итого операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
==== Заполнение матрицы B====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 1 макроструктуры алгоритма ([[Разложение_Холецкого_(метод_квадратного_корня)|&#039;&#039;разложения Холецкого&#039;&#039;]]) состоит из трёх групп вершин, расположенных в целочисленных узлах трёх областей разной размерности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин расположена в одномерной области, соответствующая ей операция вычисляет функцию SQRT. &lt;br /&gt;
Единственная координата каждой из вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргумент этой функции &lt;br /&gt;
	&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{11}&amp;lt;/math&amp;gt;; &lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ii}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин расположена в двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a / b&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;: &lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{j1}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1, j, i - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ji}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин расположена в трёхмерной области, соответствующая ей операция  &amp;lt;math&amp;gt;a - b * c&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; — меняется в диапазоне  от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;p = 1&amp;lt;/math&amp;gt; элемент входных данных &amp;lt;math&amp;gt;\sigma_{ji}&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;p &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i, j, p - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, i&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, j&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.1, выполненном для случая &amp;lt;math&amp;gt;n = 4&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
[[file:Cholesky full_in_out.png|thumb|center|1400px|Рисунок 1. Граф этапа 1 макроструктуры алгоритма. SQ — вычисление квадратного корня, F — операция a-bc, Div — деление, In — входные данные, Out — выходные.]]&lt;br /&gt;
&lt;br /&gt;
====Генерация вектора Y====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 2 макроструктуры алгоритма состоит из двух групп вершин, расположенных в целочисленных узлах двумерной области.&lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин. Соответствующая ей операция вычисляет функцию &amp;lt;math&amp;gt;S = a+b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a:&amp;lt;/math&amp;gt;&lt;br /&gt;
** при &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; — константа &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;j&amp;gt;1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатами &amp;lt;math&amp;gt;i,j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; — значение, поступающее с &amp;lt;math&amp;gt;PRNG&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин. Соответствующая ей операция вычисляет функцию &amp;lt;math&amp;gt;F = \left(a-\frac{\kappa}{2}\right)\sqrt{\frac{12}{\kappa}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; —  результат срабатывания операции, соответствующей вершине из первой группы, с координатами &amp;lt;math&amp;gt;i,\kappa&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; этапа &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.2, выполненном для случая &amp;lt;math&amp;gt;n = 2, \kappa = 2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf2.png|550px|thumb|center|Рисунок 2. Граф этапа 2 макроструктуры алгоритма]]&lt;br /&gt;
&lt;br /&gt;
====Вычисление вектора X====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 3 макроструктуры алгоритма (&#039;&#039;умножение нижней треугольной матрицы на вектор и сложение результата с другим вектором&#039;&#039;) состоит из одной группы вершин, расположенной в целочисленных узлах двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a+bc&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;j = 1&amp;lt;/math&amp;gt; — компонента &amp;lt;math&amp;gt;m_{x_i}&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;j &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине с координатами &amp;lt;math&amp;gt;i, j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;b_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;y_{j}&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является:&lt;br /&gt;
* при &amp;lt;math&amp;gt;j &amp;lt; i&amp;lt;/math&amp;gt; — &#039;&#039;промежуточным данным&#039;&#039; этапа;&lt;br /&gt;
* при &amp;lt;math&amp;gt;j = i&amp;lt;/math&amp;gt; — &#039;&#039;выходным данным&#039;&#039; алгоритма &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.3, выполненном для случая &amp;lt;math&amp;gt; n = 4&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf3.png|650px|thumb|center|Рисунок 3. Граф этапа 3 макроструктуры алгоритма,  F — операция a+bc]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для распараллеливания доступны следующие опции:&lt;br /&gt;
* вычисление элементов матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в рамках столбца (под диагональю),&lt;br /&gt;
* генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;,&lt;br /&gt;
* вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (умножение матрицы на вектор, сложение векторов).&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: вещественная всюду плотная положительно определенная симметрическая  &amp;lt;math&amp;gt;(n \times n)&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;\Sigma&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;
* Выходные данные: вещественный &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектор &amp;lt;math&amp;gt;X&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;syntaxhighlight lang = c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// compute matrix B (core)&lt;br /&gt;
for (int j = 0; j &amp;lt; n; j++){&lt;br /&gt;
    double sum_down = matrix_cov[j][j];&lt;br /&gt;
    for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
        double cur = matrix_cov[j][k];&lt;br /&gt;
        sum_down -= cur * cur;&lt;br /&gt;
    }&lt;br /&gt;
    matrix_cov[j][j] = sqrt(sum_down);&lt;br /&gt;
    for (int i = j + 1; i &amp;lt; n; i++){&lt;br /&gt;
        double sum_up = matrix_cov[i][j];&lt;br /&gt;
        for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
            sum_up -= matrix_cov[i][k] * matrix_cov[j][k];&lt;br /&gt;
        }&lt;br /&gt;
        matrix_cov[i][j] = sum_up / matrix_cov[j][j];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
// generate vector Y&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){&lt;br /&gt;
    double sum = generate_uniform(n);&lt;br /&gt;
    for (int j = 0; j &amp;lt; CLT_NUM - 1; j++){&lt;br /&gt;
        sum += generate_uniform(n);&lt;br /&gt;
    }&lt;br /&gt;
    vec_Y[i] = (sum - CLT_NUM / 2) * sqrt(12.0 / CLT_NUM);&lt;br /&gt;
}&lt;br /&gt;
// linear transformation&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){  &lt;br /&gt;
    vec_X[i] = vec_exp[i];&lt;br /&gt;
    for (int k = 0; k &amp;lt;= i; k++){&lt;br /&gt;
        vec_X[i] += matrix_cov[i][k] * vec_Y[k];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Алгоритм был реализован на языке C++ с использованием Intel MPI Library и запущен на кластере regular4.&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add impi/5.0.1&lt;br /&gt;
 mpicxx -std=c++0x task.c -o _scratch/task&lt;br /&gt;
 sbatch -n256 impi ./task &amp;lt;matrix_size&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
* размер матрицы [1024 : 4864] с шагом 256,&lt;br /&gt;
* число ядер [2 : 256] с шагом по степеням 2.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:Ops_2.png|thumb|center|700px|Рисунок 4. Изменение производительности в зависимости от числа ядер и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
[[file:Eff_2.png|thumb|center|700px|Рисунок 5. Изменение эффективности реализации в зависимости от числа ядер и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
[[file:Eff_2_up.png|thumb|center|700px|Рисунок 6. Изменение эффективности реализации, вид сверху.]]&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;По размеру задачи&#039;&#039;&#039; — при увеличении размерности матрицы эффективность реализации постепенно увеличивается, при этом тем быстрее, чем большее число ядер задействовано.&lt;br /&gt;
* &#039;&#039;&#039;По числу ядер&#039;&#039;&#039; — при увеличении числа mpi-процессов эффективность реализации снижается. Это объясняется ростом накладных расходов на организацию параллельного выполнения. При этом с ростом размерности матрицы эффективность снижается с такой же скоростью, но уже при больших значениях числа mpi-процессов.&lt;br /&gt;
* &#039;&#039;&#039;По двум направлениям&#039;&#039;&#039; — эффективность реализации возрастает (на рассматриваемой области значений параметров), но крайне медленно.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/mensigo/skipod/blob/master/mpi_gauss_vec_gen.c Параллельная реализация на C++]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
MS Excel и распространённые статистические пакеты (напр., SPSS, Statistica) позволяют моделировать только одномерные статистические распределения. Имеется возможность &amp;quot;собрать&amp;quot; многомерное распределение из нескольких одномерных при условии, что компоненты независимы. Однако если необходимо исследовать данные с зависящими друг от друга переменными, то приходится писать собственную программу. При этом удобно воспользоваться готовой реализацией разложения Холецкого (точечного метода), представленной в таких прикладных пакетах, как LINPACK, LAPACK, SCALAPACK.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Lonalone</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26770</id>
		<title>Участник:Lonalone/Генерация гауссовского вектора методом линейных преобразований</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26770"/>
		<updated>2018-12-07T21:18:19Z</updated>

		<summary type="html">&lt;p&gt;Lonalone: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор описания: &#039;&#039;Меньших И. М.&#039;&#039;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из многомерных распределений особый интерес представляет нормальное. Этому закону подчиняются все результаты воздействия большого числа случайных факторов, среди которых нет превалирующих.&lt;br /&gt;
&lt;br /&gt;
В статье приведен алгоритм генерации n-мерного гауссовского случайного вектора с помощью &#039;&#039;метода линейных преобразований&#039;&#039;&amp;lt;ref name=&amp;quot;V&amp;quot;&amp;gt;Михайлов Г.А., Войтишек А.В. Численное статистическое моделирование. Методы Монте-Карло — М.: Академия, 2006. — 368 с.&amp;lt;/ref&amp;gt;. Известно, что случае нормально распределенного случайного вектора, ковариационная матрица вместе с математическим ожиданием этого вектора полностью определяют его распределение. Поэтому для полного статистического соответствия моделируемого и теоретического распределения гауссовского вектора достаточно обеспечить требуемые значения указанных параметров&amp;lt;ref name=&amp;quot;VV&amp;quot;&amp;gt; https://ru.wikipedia.org/wiki/Многомерное_нормальное_распределение&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея алгоритма заключается в линейном преобразовании n-мерного случайного вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, компоненты которого независимы и одинаково распределены по нормальному закону со стандартными параметрами, в случайный вектор &amp;lt;math&amp;gt;X&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;\Sigma&amp;lt;/math&amp;gt; и вектор математических ожиданий &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Sigma = \|\sigma_{ij}\| = \| \mathbb{E}[(X_{i} - m_{x_{i}})(X_{j} - m_{x_{j}})]\|, \\&lt;br /&gt;
M = (m_{x_{1}}, m_{x_{2}}, ..., m_{x_{n}})^T.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Требуется найти такую матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, которая позволяла бы получить искомый вектор &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; с требуемыми характеристиками в результате линейного преобразования &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — n-мерный случайный вектор с независимыми нормально распределенными компонентами со стандартными параметрами.&lt;br /&gt;
&lt;br /&gt;
Будем искать матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в виде нижней треугольной матрицы. Перейдем от матричной записи к системе алгебраических уравнений:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} X_{1} \\&lt;br /&gt;
 X_{2} \\ \vdots \\ X_{n} \end{pmatrix} =&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} b_{11} &amp;amp; 0 &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\b_{21} &amp;amp; b_{22} &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\ \vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \vdots&lt;br /&gt;
\\ b_{n1} &amp;amp; b_{n2} &amp;amp; \cdots &amp;amp; b_{nn}&lt;br /&gt;
\end{pmatrix} \times&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} Y_{1} \\&lt;br /&gt;
 Y_{2} \\ \vdots \\ Y_{n} \end{pmatrix} +&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} m_{x_{1}} \\&lt;br /&gt;
 m_{x_{2}} \\ \vdots \\ m_{x_{n}} \end{pmatrix} \Rightarrow&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}X_{1} - m_{x_{1}} = b_{11}Y_{1}&lt;br /&gt;
\\X_{2} - m_{x_{2}} = b_{21}Y_{1} + b_{22}Y_{2}&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\\X_{n} - m_{x_{n}} = b_{n1}Y_{1} + b_{n2}Y_{2} + \cdots + b_{nn}Y_{n}&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Поскольку компоненты вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; независимы и имеют стандартные параметры, справедливо выражение:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\mathbb{E}[Y_{i}Y_{j}] =&lt;br /&gt;
\left\{\begin{matrix} &lt;br /&gt;
1, &amp;amp;i = j, \\&lt;br /&gt;
0, &amp;amp;i \not= j.&lt;br /&gt;
\end{matrix}\right.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Почленно перемножив сами на себя и между собой соответственно левые и правые части уравнений системы и взяв от результатов перемножения математическое ожидание, получаем систему уравнений вида:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\mathbb{E}[(X_{1} - m_{x_{1}})(X_{1} - m_{x_{1}})] = \mathbb{E}[b_{11}Y_{1}b_{11}Y_{1}],&lt;br /&gt;
\\ \mathbb{E}[(X_{1} - m_{x_{1}})(X_{2} - m_{x_{2}})] = \mathbb{E}[(b_{21}Y_{1} + b_{22}Y_{2})b_{11}Y_{1}],&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, в левых частях полученной системы уравнений располагаются элементы заданной ковариационной матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;, а в правых — элементы искомой матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;. Последовательно решая эту систему, получаем формулы для расчета элементов &amp;lt;math&amp;gt;\sigma_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
b_{11}=\sqrt{\sigma_{11}}; b_{21}=\frac{\sigma_{12}}{\sqrt{\sigma_{11}}}; b_{22} = \sqrt{\sigma_{22} - \frac{\sigma_{12}}{\sigma_{11}}}, \cdots&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рекуррентная формула для расчета любого элемента матрицы преобразования &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b_{ij} = \frac {\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}} {\sqrt{\sigma_{ij} - \sum_{k=1}^{j-1} b_{jk}^2}}, \quad 1 \leqslant j \leqslant i \leqslant n&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(суммы с верхним нулевым пределом считаются равными нулю)&lt;br /&gt;
&lt;br /&gt;
Таким образом, матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; получается с помощью [[Разложение_Холецкого_(метод_квадратного_корня)|разложения Холецкого]] матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Генерация случайного вектора Y ====&lt;br /&gt;
&lt;br /&gt;
Пусть имеется генератор псевдослучайных чисел (ГПСЧ, PRNG), с помощью которого можно получить реализацию случайной величины &amp;lt;math&amp;gt;u \sim U(0,1) &amp;lt;/math&amp;gt;. Описанный выше случайный вектор &amp;lt;math&amp;gt;Y=(y_1, \dots, y_n)&amp;lt;/math&amp;gt; с независимыми компонентами составим из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; реализаций случайной величины &amp;lt;math&amp;gt;\eta \sim N(0,1)&amp;lt;/math&amp;gt;. Каждую такую реализацию &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;, в свою очередь, получим с помощью приближения по ЦПТ &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; случайными величинами, распределенными равномерно на отрезке [0,1]:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right), \quad i = \overline{1, n} \\&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;u_j^i - &amp;lt;/math&amp;gt; реализации случайной величины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;\kappa - &amp;lt;/math&amp;gt; параметр, обеспечивающий качество приближения.&lt;br /&gt;
&lt;br /&gt;
Как правило, &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; берут равным 12 и считают, что для подавляющего числа практических задач обеспечивается должная точность вычислений&amp;lt;ref name = &amp;quot;VVV&amp;quot;&amp;gt;Балдин К.В., Уткин В.Б. Информационные системы в экономике. — М.:Дашков и Кo, 2008. — 395 с.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&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;\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}, \quad 1 \leqslant j \leqslant i \leqslant n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;&lt;br /&gt;
* Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1) Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;b_{11}= \sqrt{\sigma_{11}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;b_{k1}= \frac{\sigma_{k1}}{l_{11}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad k = \overline{2,n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{2,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (c) &amp;lt;math&amp;gt;b_{ii} = \sqrt{\sigma_{ii} - \sum_{p = 1}^{i - 1} b_{ip}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (d) &amp;lt;math&amp;gt;b_{ji} = \frac{\sigma_{ji} - \sum_{p = 1}^{i - 1} b_{ip} b_{jp}} {l_{ii}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad i \neq n, j = \overline{i+1,n}&amp;lt;/math&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;u_j^i \leftarrow PRNG,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\quad j = \overline{1,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3) Вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i = m_{x_i} + \sum_{k = 1}^{i} b_{ik} y_{k}, \quad i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt; n(n+1) + \frac {n(n-1)(n-2)}{6} &amp;lt;/math&amp;gt; (умножений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac {n(n+1)}{2} + \frac {n(n-1)(n-2)}{6} &amp;lt;/math&amp;gt; (вычитаний)&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac {n(n-1+2\kappa)}{2} &amp;lt;/math&amp;gt; (сложений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac {n(n+3)}{2} &amp;lt;/math&amp;gt; (делений)&lt;br /&gt;
* &amp;lt;math&amp;gt; 2n &amp;lt;/math&amp;gt; (взятия квадратного корня)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{n}{6}\left(2n^2+9n+31+6\kappa\right) &amp;lt;/math&amp;gt; - итого операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
==== Заполнение матрицы B====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 1 макроструктуры алгоритма ([[Разложение_Холецкого_(метод_квадратного_корня)|&#039;&#039;разложения Холецкого&#039;&#039;]]) состоит из трёх групп вершин, расположенных в целочисленных узлах трёх областей разной размерности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин расположена в одномерной области, соответствующая ей операция вычисляет функцию SQRT. &lt;br /&gt;
Единственная координата каждой из вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргумент этой функции &lt;br /&gt;
	&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{11}&amp;lt;/math&amp;gt;; &lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ii}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин расположена в двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a / b&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;: &lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{j1}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1, j, i - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ji}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин расположена в трёхмерной области, соответствующая ей операция  &amp;lt;math&amp;gt;a - b * c&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; — меняется в диапазоне  от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;p = 1&amp;lt;/math&amp;gt; элемент входных данных &amp;lt;math&amp;gt;\sigma_{ji}&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;p &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i, j, p - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, i&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, j&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.1, выполненном для случая &amp;lt;math&amp;gt;n = 4&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
[[file:Cholesky full_in_out.png|thumb|center|1400px|Рисунок 1. Граф этапа 1 макроструктуры алгоритма. SQ — вычисление квадратного корня, F — операция a-bc, Div — деление, In — входные данные, Out — выходные.]]&lt;br /&gt;
&lt;br /&gt;
====Генерация вектора Y====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 2 макроструктуры алгоритма состоит из двух групп вершин, расположенных в целочисленных узлах двумерной области.&lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин. Соответствующая ей операция вычисляет функцию &amp;lt;math&amp;gt;S = a+b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a:&amp;lt;/math&amp;gt;&lt;br /&gt;
** при &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; — константа &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;j&amp;gt;1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатами &amp;lt;math&amp;gt;i,j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; — значение, поступающее с &amp;lt;math&amp;gt;PRNG&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин. Соответствующая ей операция вычисляет функцию &amp;lt;math&amp;gt;F = \left(a-\frac{\kappa}{2}\right)\sqrt{\frac{12}{\kappa}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; —  результат срабатывания операции, соответствующей вершине из первой группы, с координатами &amp;lt;math&amp;gt;i,\kappa&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; этапа &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.2, выполненном для случая &amp;lt;math&amp;gt;n = 2, \kappa = 2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf2.png|550px|thumb|center|Рисунок 2. Граф этапа 2 макроструктуры алгоритма]]&lt;br /&gt;
&lt;br /&gt;
====Вычисление вектора X====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 3 макроструктуры алгоритма (&#039;&#039;умножение нижней треугольной матрицы на вектор и сложение результата с другим вектором&#039;&#039;) состоит из одной группы вершин, расположенной в целочисленных узлах двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a+bc&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;j = 1&amp;lt;/math&amp;gt; — компонента &amp;lt;math&amp;gt;m_{x_i}&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;j &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине с координатами &amp;lt;math&amp;gt;i, j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;b_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;y_{j}&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является:&lt;br /&gt;
* при &amp;lt;math&amp;gt;j &amp;lt; i&amp;lt;/math&amp;gt; — &#039;&#039;промежуточным данным&#039;&#039; этапа;&lt;br /&gt;
* при &amp;lt;math&amp;gt;j = i&amp;lt;/math&amp;gt; — &#039;&#039;выходным данным&#039;&#039; алгоритма &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.3, выполненном для случая &amp;lt;math&amp;gt; n = 4&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf3.png|650px|thumb|center|Рисунок 3. Граф этапа 3 макроструктуры алгоритма,  F — операция a+bc]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для распараллеливания доступны следующие опции:&lt;br /&gt;
* вычисление элементов матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в рамках столбца (под диагональю),&lt;br /&gt;
* генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;,&lt;br /&gt;
* вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (умножение матрицы на вектор, сложение векторов).&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: вещественная всюду плотная положительно определенная симметрическая  &amp;lt;math&amp;gt;(n \times n)&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;\Sigma&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;
* Выходные данные: вещественный &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектор &amp;lt;math&amp;gt;X&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;syntaxhighlight lang = c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// compute matrix B (core)&lt;br /&gt;
for (int j = 0; j &amp;lt; n; j++){&lt;br /&gt;
    double sum_down = matrix_cov[j][j];&lt;br /&gt;
    for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
        double cur = matrix_cov[j][k];&lt;br /&gt;
        sum_down -= cur * cur;&lt;br /&gt;
    }&lt;br /&gt;
    matrix_cov[j][j] = sqrt(sum_down);&lt;br /&gt;
    for (int i = j + 1; i &amp;lt; n; i++){&lt;br /&gt;
        double sum_up = matrix_cov[i][j];&lt;br /&gt;
        for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
            sum_up -= matrix_cov[i][k] * matrix_cov[j][k];&lt;br /&gt;
        }&lt;br /&gt;
        matrix_cov[i][j] = sum_up / matrix_cov[j][j];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
// generate vector Y&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){&lt;br /&gt;
    double sum = generate_uniform(n);&lt;br /&gt;
    for (int j = 0; j &amp;lt; CLT_NUM - 1; j++){&lt;br /&gt;
        sum += generate_uniform(n);&lt;br /&gt;
    }&lt;br /&gt;
    vec_Y[i] = (sum - CLT_NUM / 2) * sqrt(12.0 / CLT_NUM);&lt;br /&gt;
}&lt;br /&gt;
// linear transformation&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){  &lt;br /&gt;
    vec_X[i] = vec_exp[i];&lt;br /&gt;
    for (int k = 0; k &amp;lt;= i; k++){&lt;br /&gt;
        vec_X[i] += matrix_cov[i][k] * vec_Y[k];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Алгоритм был реализован на языке C++ с использованием Intel MPI Library и запущен на кластере regular4.&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add impi/5.0.1&lt;br /&gt;
 mpicxx -std=c++0x task.c -o _scratch/task&lt;br /&gt;
 sbatch -n256 impi ./task &amp;lt;matrix_size&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
* размер матрицы [1024 : 4864] с шагом 256,&lt;br /&gt;
* число ядер [2 : 256] с шагом по степеням 2.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:Ops_2.png|thumb|center|700px|Рисунок 4. Изменение производительности в зависимости от числа ядер и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
[[file:Eff_2.png|thumb|center|700px|Рисунок 5. Изменение эффективности реализации в зависимости от числа ядер и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
[[file:Eff_2_up.png|thumb|center|700px|Рисунок 6. Изменение эффективности реализации, вид сверху.]]&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;По размеру задачи&#039;&#039;&#039; — при увеличении размерности матрицы эффективность реализации постепенно увеличивается, при этом тем быстрее, чем большее число ядер задействовано.&lt;br /&gt;
* &#039;&#039;&#039;По числу ядер&#039;&#039;&#039; — при увеличении числа mpi-процессов эффективность реализации снижается. Это объясняется ростом накладных расходов на организацию параллельного выполнения. При этом с ростом размерности матрицы эффективность снижается с такой же скоростью, но уже при больших значениях числа mpi-процессов.&lt;br /&gt;
* &#039;&#039;&#039;По двум направлениям&#039;&#039;&#039; — эффективность реализации возрастает (на рассматриваемой области значений параметров), но крайне медленно.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/mensigo/skipod/blob/master/mpi_gauss_vec_gen.c Параллельная реализация на C++]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
MS Excel и распространённые статистические пакеты (напр., SPSS, Statistica) позволяют моделировать только одномерные статистические распределения. Имеется возможность &amp;quot;собрать&amp;quot; многомерное распределение из нескольких одномерных при условии, что компоненты независимы. Однако если необходимо исследовать данные с зависящими друг от друга переменными, то приходится писать собственную программу. При этом удобно воспользоваться готовой реализацией разложения Холецкого (точечного метода), представленной в таких прикладных пакетах, как LINPACK, LAPACK, SCALAPACK.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Lonalone</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26763</id>
		<title>Участник:Lonalone/Генерация гауссовского вектора методом линейных преобразований</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26763"/>
		<updated>2018-12-03T06:05:35Z</updated>

		<summary type="html">&lt;p&gt;Lonalone: /* Генерация вектора Y */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор описания: &#039;&#039;Меньших И. М.&#039;&#039;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из многомерных распределений особый интерес представляет нормальное. Этому закону подчиняются все результаты воздействия большого числа случайных факторов, среди которых нет превалирующих.&lt;br /&gt;
&lt;br /&gt;
В статье приведен алгоритм генерации n-мерного гауссовского случайного вектора с помощью &#039;&#039;метода линейных преобразований&#039;&#039;&amp;lt;ref name=&amp;quot;V&amp;quot;&amp;gt;Михайлов Г.А., Войтишек А.В. Численное статистическое моделирование. Методы Монте-Карло — М.: Академия, 2006. — 368 с.&amp;lt;/ref&amp;gt;. Известно, что случае нормально распределенного случайного вектора, ковариационная матрица вместе с математическим ожиданием этого вектора полностью определяют его распределение. Поэтому для полного статистического соответствия моделируемого и теоретического распределения гауссовского вектора достаточно обеспечить требуемые значения указанных параметров&amp;lt;ref name=&amp;quot;VV&amp;quot;&amp;gt; https://ru.wikipedia.org/wiki/Многомерное_нормальное_распределение&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея алгоритма заключается в линейном преобразовании n-мерного случайного вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, компоненты которого независимы и одинаково распределены по нормальному закону со стандартными параметрами, в случайный вектор &amp;lt;math&amp;gt;X&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;\Sigma&amp;lt;/math&amp;gt; и вектор математических ожиданий &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Sigma = \|\sigma_{ij}\| = \| \mathbb{E}[(X_{i} - m_{x_{i}})(X_{j} - m_{x_{j}})]\|, \\&lt;br /&gt;
M = (m_{x_{1}}, m_{x_{2}}, ..., m_{x_{n}})^T.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Требуется найти такую матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, которая позволяла бы получить искомый вектор &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; с требуемыми характеристиками в результате линейного преобразования &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — n-мерный случайный вектор с независимыми нормально распределенными компонентами со стандартными параметрами.&lt;br /&gt;
&lt;br /&gt;
Будем искать матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в виде нижней треугольной матрицы. Перейдем от матричной записи к системе алгебраических уравнений:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} X_{1} \\&lt;br /&gt;
 X_{2} \\ \vdots \\ X_{n} \end{pmatrix} =&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} b_{11} &amp;amp; 0 &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\b_{21} &amp;amp; b_{22} &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\ \vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \vdots&lt;br /&gt;
\\ b_{n1} &amp;amp; b_{n2} &amp;amp; \cdots &amp;amp; b_{nn}&lt;br /&gt;
\end{pmatrix} \times&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} Y_{1} \\&lt;br /&gt;
 Y_{2} \\ \vdots \\ Y_{n} \end{pmatrix} +&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} m_{x_{1}} \\&lt;br /&gt;
 m_{x_{2}} \\ \vdots \\ m_{x_{n}} \end{pmatrix} \Rightarrow&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}X_{1} - m_{x_{1}} = b_{11}Y_{1}&lt;br /&gt;
\\X_{2} - m_{x_{2}} = b_{21}Y_{1} + b_{22}Y_{2}&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\\X_{n} - m_{x_{n}} = b_{n1}Y_{1} + b_{n2}Y_{2} + \cdots + b_{nn}Y_{n}&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Поскольку компоненты вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; независимы и имеют стандартные параметры, справедливо выражение:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\mathbb{E}[Y_{i}Y_{j}] =&lt;br /&gt;
\left\{\begin{matrix} &lt;br /&gt;
1, &amp;amp;i = j, \\&lt;br /&gt;
0, &amp;amp;i \not= j.&lt;br /&gt;
\end{matrix}\right.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Почленно перемножив сами на себя и между собой соответственно левые и правые части уравнений системы и взяв от результатов перемножения математическое ожидание, получаем систему уравнений вида:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\mathbb{E}[(X_{1} - m_{x_{1}})(X_{1} - m_{x_{1}})] = \mathbb{E}[b_{11}Y_{1}b_{11}Y_{1}],&lt;br /&gt;
\\ \mathbb{E}[(X_{1} - m_{x_{1}})(X_{2} - m_{x_{2}})] = \mathbb{E}[(b_{21}Y_{1} + b_{22}Y_{2})b_{11}Y_{1}],&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, в левых частях полученной системы уравнений располагаются элементы заданной ковариационной матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;, а в правых — элементы искомой матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;. Последовательно решая эту систему, получаем формулы для расчета элементов &amp;lt;math&amp;gt;\sigma_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
b_{11}=\sqrt{\sigma_{11}}; b_{21}=\frac{\sigma_{12}}{\sqrt{\sigma_{11}}}; b_{22} = \sqrt{\sigma_{22} - \frac{\sigma_{12}}{\sigma_{11}}}, \cdots&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рекуррентная формула для расчета любого элемента матрицы преобразования &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b_{ij} = \frac {\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}} {\sqrt{\sigma_{ij} - \sum_{k=1}^{j-1} b_{jk}^2}}, \quad 1 \leqslant j \leqslant i \leqslant n&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(суммы с верхним нулевым пределом считаются равными нулю)&lt;br /&gt;
&lt;br /&gt;
Таким образом, матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; получается с помощью [[Разложение_Холецкого_(метод_квадратного_корня)|разложения Холецкого]] матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Генерация случайного вектора Y ====&lt;br /&gt;
&lt;br /&gt;
Пусть имеется генератор псевдослучайных чисел (ГПСЧ, PRNG), с помощью которого можно получить реализацию случайной величины &amp;lt;math&amp;gt;u \sim U(0,1) &amp;lt;/math&amp;gt;. Описанный выше случайный вектор &amp;lt;math&amp;gt;Y=(y_1, \dots, y_n)&amp;lt;/math&amp;gt; с независимыми компонентами составим из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; реализаций случайной величины &amp;lt;math&amp;gt;\eta \sim N(0,1)&amp;lt;/math&amp;gt;. Каждую такую реализацию &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;, в свою очередь, получим с помощью приближения по ЦПТ &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; случайными величинами, распределенными равномерно на отрезке [0,1]:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right), \quad i = \overline{1, n} \\&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;u_j^i - &amp;lt;/math&amp;gt; реализации случайной величины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;\kappa - &amp;lt;/math&amp;gt; параметр, обеспечивающий качество приближения.&lt;br /&gt;
&lt;br /&gt;
Как правило, &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; берут равным 12 и считают, что для подавляющего числа практических задач обеспечивается должная точность вычислений&amp;lt;ref name = &amp;quot;VVV&amp;quot;&amp;gt;Балдин К.В., Уткин В.Б. Информационные системы в экономике. — М.:Дашков и Кo, 2008. — 395 с.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}, \quad 1 \leqslant j \leqslant i \leqslant n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;&lt;br /&gt;
* Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1) Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;b_{11}= \sqrt{\sigma_{11}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;b_{k1}= \frac{\sigma_{k1}}{l_{11}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad k = \overline{2,n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{2,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (c) &amp;lt;math&amp;gt;b_{ii} = \sqrt{\sigma_{ii} - \sum_{p = 1}^{i - 1} b_{ip}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (d) &amp;lt;math&amp;gt;b_{ji} = \frac{\sigma_{ji} - \sum_{p = 1}^{i - 1} b_{ip} b_{jp}} {l_{ii}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad i \neq n, j = \overline{i+1,n}&amp;lt;/math&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;u_j^i \leftarrow PRNG,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\quad j = \overline{1,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3) Вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i = m_{x_i} + \sum_{k = 1}^{i} b_{ik} y_{k}, \quad i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt; n(n+1) + \frac {n(n-1)(n-2)}{6} &amp;lt;/math&amp;gt; (умножений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac {n(n+1)}{2} + \frac {n(n-1)(n-2)}{6} &amp;lt;/math&amp;gt; (вычитаний)&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac {n(n-1+2\kappa)}{2} &amp;lt;/math&amp;gt; (сложений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac {n(n+3)}{2} &amp;lt;/math&amp;gt; (делений)&lt;br /&gt;
* &amp;lt;math&amp;gt; 2n &amp;lt;/math&amp;gt; (взятия квадратного корня)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{n}{6}\left(2n^2+9n+31+6\kappa\right) &amp;lt;/math&amp;gt; - итого операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
==== Заполнение матрицы B====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 1 макроструктуры алгоритма ([[Разложение_Холецкого_(метод_квадратного_корня)|&#039;&#039;разложения Холецкого&#039;&#039;]]) состоит из трёх групп вершин, расположенных в целочисленных узлах трёх областей разной размерности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин расположена в одномерной области, соответствующая ей операция вычисляет функцию SQRT. &lt;br /&gt;
Единственная координата каждой из вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргумент этой функции &lt;br /&gt;
	&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{11}&amp;lt;/math&amp;gt;; &lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ii}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин расположена в двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a / b&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;: &lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{j1}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1, j, i - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ji}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин расположена в трёхмерной области, соответствующая ей операция  &amp;lt;math&amp;gt;a - b * c&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; — меняется в диапазоне  от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;p = 1&amp;lt;/math&amp;gt; элемент входных данных &amp;lt;math&amp;gt;\sigma_{ji}&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;p &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i, j, p - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, i&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, j&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.1, выполненном для случая &amp;lt;math&amp;gt;n = 4&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
[[file:Cholesky full_in_out.png|thumb|center|1400px|Рисунок 1. Граф этапа 1 макроструктуры алгоритма. SQ — вычисление квадратного корня, F — операция a-bc, Div — деление, In — входные данные, Out — выходные.]]&lt;br /&gt;
&lt;br /&gt;
====Генерация вектора Y====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 2 макроструктуры алгоритма состоит из двух групп вершин, расположенных в целочисленных узлах двумерной области.&lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин. Соответствующая ей операция вычисляет функцию &amp;lt;math&amp;gt;S = a+b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a:&amp;lt;/math&amp;gt;&lt;br /&gt;
** при &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; — константа &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;j&amp;gt;1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатами &amp;lt;math&amp;gt;i,j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; — значение, поступающее с &amp;lt;math&amp;gt;PRNG&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин. Соответствующая ей операция вычисляет функцию &amp;lt;math&amp;gt;F = \left(a-\frac{\kappa}{2}\right)\sqrt{\frac{12}{\kappa}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; —  результат срабатывания операции, соответствующей вершине из первой группы, с координатами &amp;lt;math&amp;gt;i,\kappa&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; этапа &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.2, выполненном для случая &amp;lt;math&amp;gt;n = 2, \kappa = 2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf2.png|550px|thumb|center|Рисунок 2. Граф этапа 2 макроструктуры алгоритма]]&lt;br /&gt;
&lt;br /&gt;
====Вычисление вектора X====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 3 макроструктуры алгоритма (&#039;&#039;умножение нижней треугольной матрицы на вектор и сложение результата с другим вектором&#039;&#039;) состоит из одной группы вершин, расположенной в целочисленных узлах двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a+bc&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;j = 1&amp;lt;/math&amp;gt; — компонента &amp;lt;math&amp;gt;m_{x_i}&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;j &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине с координатами &amp;lt;math&amp;gt;i, j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;b_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;y_{j}&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является:&lt;br /&gt;
* при &amp;lt;math&amp;gt;j &amp;lt; i&amp;lt;/math&amp;gt; — &#039;&#039;промежуточным данным&#039;&#039; этапа;&lt;br /&gt;
* при &amp;lt;math&amp;gt;j = i&amp;lt;/math&amp;gt; — &#039;&#039;выходным данным&#039;&#039; алгоритма &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.3, выполненном для случая &amp;lt;math&amp;gt; n = 4&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf3.png|650px|thumb|center|Рисунок 3. Граф этапа 3 макроструктуры алгоритма,  F — операция a+bc]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для распараллеливания доступны следующие опции:&lt;br /&gt;
* вычисление элементов матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в рамках столбца (под диагональю),&lt;br /&gt;
* генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;,&lt;br /&gt;
* вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (умножение матрицы на вектор, сложение векторов).&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: вещественная всюду плотная положительно определенная симметрическая  &amp;lt;math&amp;gt;(n \times n)&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;\Sigma&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;
* Выходные данные: вещественный &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектор &amp;lt;math&amp;gt;X&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;syntaxhighlight lang = c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// compute matrix B (core)&lt;br /&gt;
for (int j = 0; j &amp;lt; n; j++){&lt;br /&gt;
    double sum_down = matrix_cov[j][j];&lt;br /&gt;
    for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
        double cur = matrix_cov[j][k];&lt;br /&gt;
        sum_down -= cur * cur;&lt;br /&gt;
    }&lt;br /&gt;
    matrix_cov[j][j] = sqrt(sum_down);&lt;br /&gt;
    for (int i = j + 1; i &amp;lt; n; i++){&lt;br /&gt;
        double sum_up = matrix_cov[i][j];&lt;br /&gt;
        for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
            sum_up -= matrix_cov[i][k] * matrix_cov[j][k];&lt;br /&gt;
        }&lt;br /&gt;
        matrix_cov[i][j] = sum_up / matrix_cov[j][j];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
// generate vector Y&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){&lt;br /&gt;
    double sum = generate_uniform(n);&lt;br /&gt;
    for (int j = 0; j &amp;lt; CLT_NUM - 1; j++){&lt;br /&gt;
        sum += generate_uniform(n);&lt;br /&gt;
    }&lt;br /&gt;
    vec_Y[i] = (sum - CLT_NUM / 2) * sqrt(12.0 / CLT_NUM);&lt;br /&gt;
}&lt;br /&gt;
// linear transformation&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){  &lt;br /&gt;
    vec_X[i] = vec_exp[i];&lt;br /&gt;
    for (int k = 0; k &amp;lt;= i; k++){&lt;br /&gt;
        vec_X[i] += matrix_cov[i][k] * vec_Y[k];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Алгоритм был реализован на языке C++ с использованием Intel MPI Library и запущен на кластере regular4.&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add impi/5.0.1&lt;br /&gt;
 mpicxx -std=c++0x task.c -o _scratch/task&lt;br /&gt;
 sbatch -n256 impi ./task &amp;lt;matrix_size&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
* размер матрицы [1024 : 4864] с шагом 256,&lt;br /&gt;
* число ядер [2 : 256] с шагом по степеням 2.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:Ops_2.png|thumb|center|700px|Рисунок 4. Изменение производительности в зависимости от числа ядер и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
[[file:Eff_2.png|thumb|center|700px|Рисунок 5. Изменение эффективности реализации в зависимости от числа ядер и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
[[file:Eff_2_up.png|thumb|center|700px|Рисунок 6. Изменение эффективности реализации, вид сверху.]]&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;По размеру задачи&#039;&#039;&#039; — при увеличении размерности матрицы эффективность реализации постепенно увеличивается, при этом тем быстрее, чем большее число ядер задействовано.&lt;br /&gt;
* &#039;&#039;&#039;По числу ядер&#039;&#039;&#039; — при увеличении числа mpi-процессов эффективность реализации снижается. Это объясняется ростом накладных расходов на организацию параллельного выполнения. При этом с ростом размерности матрицы эффективность снижается с такой же скоростью, но уже при больших значениях числа mpi-процессов.&lt;br /&gt;
* &#039;&#039;&#039;По двум направлениям&#039;&#039;&#039; — эффективность реализации возрастает (на рассматриваемой области значений параметров), но крайне медленно.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/mensigo/skipod/blob/master/mpi_gauss_vec_gen.c Параллельная реализация на C++]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
MS Excel и распространённые статистические пакеты (напр., SPSS, Statistica) позволяют моделировать только одномерные статистические распределения. Имеется возможность &amp;quot;собрать&amp;quot; многомерное распределение из нескольких одномерных при условии, что компоненты независимы. Однако если необходимо исследовать данные с зависящими друг от друга переменными, то приходится писать собственную программу. При этом удобно воспользоваться готовой реализацией разложения Холецкого (точечного метода), представленной в таких прикладных пакетах, как LINPACK, LAPACK, SCALAPACK.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Lonalone</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26762</id>
		<title>Участник:Lonalone/Генерация гауссовского вектора методом линейных преобразований</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26762"/>
		<updated>2018-12-02T15:41:37Z</updated>

		<summary type="html">&lt;p&gt;Lonalone: /* Масштабируемость реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор описания: &#039;&#039;Меньших И. М.&#039;&#039;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из многомерных распределений особый интерес представляет нормальное. Этому закону подчиняются все результаты воздействия большого числа случайных факторов, среди которых нет превалирующих.&lt;br /&gt;
&lt;br /&gt;
В статье приведен алгоритм генерации n-мерного гауссовского случайного вектора с помощью &#039;&#039;метода линейных преобразований&#039;&#039;&amp;lt;ref name=&amp;quot;V&amp;quot;&amp;gt;Михайлов Г.А., Войтишек А.В. Численное статистическое моделирование. Методы Монте-Карло — М.: Академия, 2006. — 368 с.&amp;lt;/ref&amp;gt;. Известно, что случае нормально распределенного случайного вектора, ковариационная матрица вместе с математическим ожиданием этого вектора полностью определяют его распределение. Поэтому для полного статистического соответствия моделируемого и теоретического распределения гауссовского вектора достаточно обеспечить требуемые значения указанных параметров&amp;lt;ref name=&amp;quot;VV&amp;quot;&amp;gt; https://ru.wikipedia.org/wiki/Многомерное_нормальное_распределение&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея алгоритма заключается в линейном преобразовании n-мерного случайного вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, компоненты которого независимы и одинаково распределены по нормальному закону со стандартными параметрами, в случайный вектор &amp;lt;math&amp;gt;X&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;\Sigma&amp;lt;/math&amp;gt; и вектор математических ожиданий &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Sigma = \|\sigma_{ij}\| = \| \mathbb{E}[(X_{i} - m_{x_{i}})(X_{j} - m_{x_{j}})]\|, \\&lt;br /&gt;
M = (m_{x_{1}}, m_{x_{2}}, ..., m_{x_{n}})^T.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Требуется найти такую матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, которая позволяла бы получить искомый вектор &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; с требуемыми характеристиками в результате линейного преобразования &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — n-мерный случайный вектор с независимыми нормально распределенными компонентами со стандартными параметрами.&lt;br /&gt;
&lt;br /&gt;
Будем искать матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в виде нижней треугольной матрицы. Перейдем от матричной записи к системе алгебраических уравнений:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} X_{1} \\&lt;br /&gt;
 X_{2} \\ \vdots \\ X_{n} \end{pmatrix} =&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} b_{11} &amp;amp; 0 &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\b_{21} &amp;amp; b_{22} &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\ \vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \vdots&lt;br /&gt;
\\ b_{n1} &amp;amp; b_{n2} &amp;amp; \cdots &amp;amp; b_{nn}&lt;br /&gt;
\end{pmatrix} \times&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} Y_{1} \\&lt;br /&gt;
 Y_{2} \\ \vdots \\ Y_{n} \end{pmatrix} +&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} m_{x_{1}} \\&lt;br /&gt;
 m_{x_{2}} \\ \vdots \\ m_{x_{n}} \end{pmatrix} \Rightarrow&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}X_{1} - m_{x_{1}} = b_{11}Y_{1}&lt;br /&gt;
\\X_{2} - m_{x_{2}} = b_{21}Y_{1} + b_{22}Y_{2}&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\\X_{n} - m_{x_{n}} = b_{n1}Y_{1} + b_{n2}Y_{2} + \cdots + b_{nn}Y_{n}&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Поскольку компоненты вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; независимы и имеют стандартные параметры, справедливо выражение:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\mathbb{E}[Y_{i}Y_{j}] =&lt;br /&gt;
\left\{\begin{matrix} &lt;br /&gt;
1, &amp;amp;i = j, \\&lt;br /&gt;
0, &amp;amp;i \not= j.&lt;br /&gt;
\end{matrix}\right.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Почленно перемножив сами на себя и между собой соответственно левые и правые части уравнений системы и взяв от результатов перемножения математическое ожидание, получаем систему уравнений вида:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\mathbb{E}[(X_{1} - m_{x_{1}})(X_{1} - m_{x_{1}})] = \mathbb{E}[b_{11}Y_{1}b_{11}Y_{1}],&lt;br /&gt;
\\ \mathbb{E}[(X_{1} - m_{x_{1}})(X_{2} - m_{x_{2}})] = \mathbb{E}[(b_{21}Y_{1} + b_{22}Y_{2})b_{11}Y_{1}],&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, в левых частях полученной системы уравнений располагаются элементы заданной ковариационной матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;, а в правых — элементы искомой матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;. Последовательно решая эту систему, получаем формулы для расчета элементов &amp;lt;math&amp;gt;\sigma_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
b_{11}=\sqrt{\sigma_{11}}; b_{21}=\frac{\sigma_{12}}{\sqrt{\sigma_{11}}}; b_{22} = \sqrt{\sigma_{22} - \frac{\sigma_{12}}{\sigma_{11}}}, \cdots&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рекуррентная формула для расчета любого элемента матрицы преобразования &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b_{ij} = \frac {\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}} {\sqrt{\sigma_{ij} - \sum_{k=1}^{j-1} b_{jk}^2}}, \quad 1 \leqslant j \leqslant i \leqslant n&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(суммы с верхним нулевым пределом считаются равными нулю)&lt;br /&gt;
&lt;br /&gt;
Таким образом, матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; получается с помощью [[Разложение_Холецкого_(метод_квадратного_корня)|разложения Холецкого]] матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Генерация случайного вектора Y ====&lt;br /&gt;
&lt;br /&gt;
Пусть имеется генератор псевдослучайных чисел (ГПСЧ, PRNG), с помощью которого можно получить реализацию случайной величины &amp;lt;math&amp;gt;u \sim U(0,1) &amp;lt;/math&amp;gt;. Описанный выше случайный вектор &amp;lt;math&amp;gt;Y=(y_1, \dots, y_n)&amp;lt;/math&amp;gt; с независимыми компонентами составим из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; реализаций случайной величины &amp;lt;math&amp;gt;\eta \sim N(0,1)&amp;lt;/math&amp;gt;. Каждую такую реализацию &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;, в свою очередь, получим с помощью приближения по ЦПТ &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; случайными величинами, распределенными равномерно на отрезке [0,1]:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right), \quad i = \overline{1, n} \\&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;u_j^i - &amp;lt;/math&amp;gt; реализации случайной величины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;\kappa - &amp;lt;/math&amp;gt; параметр, обеспечивающий качество приближения.&lt;br /&gt;
&lt;br /&gt;
Как правило, &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; берут равным 12 и считают, что для подавляющего числа практических задач обеспечивается должная точность вычислений&amp;lt;ref name = &amp;quot;VVV&amp;quot;&amp;gt;Балдин К.В., Уткин В.Б. Информационные системы в экономике. — М.:Дашков и Кo, 2008. — 395 с.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}, \quad 1 \leqslant j \leqslant i \leqslant n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;&lt;br /&gt;
* Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1) Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;b_{11}= \sqrt{\sigma_{11}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;b_{k1}= \frac{\sigma_{k1}}{l_{11}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad k = \overline{2,n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{2,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (c) &amp;lt;math&amp;gt;b_{ii} = \sqrt{\sigma_{ii} - \sum_{p = 1}^{i - 1} b_{ip}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (d) &amp;lt;math&amp;gt;b_{ji} = \frac{\sigma_{ji} - \sum_{p = 1}^{i - 1} b_{ip} b_{jp}} {l_{ii}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad i \neq n, j = \overline{i+1,n}&amp;lt;/math&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;u_j^i \leftarrow PRNG,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\quad j = \overline{1,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3) Вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i = m_{x_i} + \sum_{k = 1}^{i} b_{ik} y_{k}, \quad i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt; n(n+1) + \frac {n(n-1)(n-2)}{6} &amp;lt;/math&amp;gt; (умножений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac {n(n+1)}{2} + \frac {n(n-1)(n-2)}{6} &amp;lt;/math&amp;gt; (вычитаний)&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac {n(n-1+2\kappa)}{2} &amp;lt;/math&amp;gt; (сложений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac {n(n+3)}{2} &amp;lt;/math&amp;gt; (делений)&lt;br /&gt;
* &amp;lt;math&amp;gt; 2n &amp;lt;/math&amp;gt; (взятия квадратного корня)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{n}{6}\left(2n^2+9n+31+6\kappa\right) &amp;lt;/math&amp;gt; - итого операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
==== Заполнение матрицы B====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 1 макроструктуры алгоритма ([[Разложение_Холецкого_(метод_квадратного_корня)|&#039;&#039;разложения Холецкого&#039;&#039;]]) состоит из трёх групп вершин, расположенных в целочисленных узлах трёх областей разной размерности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин расположена в одномерной области, соответствующая ей операция вычисляет функцию SQRT. &lt;br /&gt;
Единственная координата каждой из вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргумент этой функции &lt;br /&gt;
	&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{11}&amp;lt;/math&amp;gt;; &lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ii}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин расположена в двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a / b&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;: &lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{j1}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1, j, i - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ji}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин расположена в трёхмерной области, соответствующая ей операция  &amp;lt;math&amp;gt;a - b * c&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; — меняется в диапазоне  от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;p = 1&amp;lt;/math&amp;gt; элемент входных данных &amp;lt;math&amp;gt;\sigma_{ji}&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;p &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i, j, p - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, i&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, j&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.1, выполненном для случая &amp;lt;math&amp;gt;n = 4&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
[[file:Cholesky full_in_out.png|thumb|center|1400px|Рисунок 1. Граф этапа 1 макроструктуры алгоритма. SQ — вычисление квадратного корня, F — операция a-bc, Div — деление, In — входные данные, Out — выходные.]]&lt;br /&gt;
&lt;br /&gt;
====Генерация вектора Y====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 2 макроструктуры алгоритма состоит из двух групп вершин, расположенных в целочисленных узлах двумерной области.&lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин. Соответствующая ей операция вычисляет функцию &amp;lt;math&amp;gt;S = a+b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a:&amp;lt;/math&amp;gt;&lt;br /&gt;
** при &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; — константа &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;j&amp;gt;1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатами &amp;lt;math&amp;gt;i,j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; — значение, поступающее с &amp;lt;math&amp;gt;PRNG&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин. Соответствующая ей операция вычисляет функцию &amp;lt;math&amp;gt;F = \left(a-\frac{\kappa}{2}\right)\sqrt{\frac{12}{\kappa}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; —  результат срабатывания операции, соответствующей вершине из первой группы, с координатами &amp;lt;math&amp;gt;i,\kappa&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; этапа &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.2, выполненном для случая &amp;lt;math&amp;gt;n = 2, \kappa = 2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf2.png|550px|thumb|center|Рисунок 2. Граф этапа 3 макроструктуры алгоритма]]&lt;br /&gt;
&lt;br /&gt;
====Вычисление вектора X====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 3 макроструктуры алгоритма (&#039;&#039;умножение нижней треугольной матрицы на вектор и сложение результата с другим вектором&#039;&#039;) состоит из одной группы вершин, расположенной в целочисленных узлах двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a+bc&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;j = 1&amp;lt;/math&amp;gt; — компонента &amp;lt;math&amp;gt;m_{x_i}&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;j &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине с координатами &amp;lt;math&amp;gt;i, j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;b_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;y_{j}&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является:&lt;br /&gt;
* при &amp;lt;math&amp;gt;j &amp;lt; i&amp;lt;/math&amp;gt; — &#039;&#039;промежуточным данным&#039;&#039; этапа;&lt;br /&gt;
* при &amp;lt;math&amp;gt;j = i&amp;lt;/math&amp;gt; — &#039;&#039;выходным данным&#039;&#039; алгоритма &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.3, выполненном для случая &amp;lt;math&amp;gt; n = 4&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf3.png|650px|thumb|center|Рисунок 3. Граф этапа 3 макроструктуры алгоритма,  F — операция a+bc]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для распараллеливания доступны следующие опции:&lt;br /&gt;
* вычисление элементов матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в рамках столбца (под диагональю),&lt;br /&gt;
* генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;,&lt;br /&gt;
* вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (умножение матрицы на вектор, сложение векторов).&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: вещественная всюду плотная положительно определенная симметрическая  &amp;lt;math&amp;gt;(n \times n)&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;\Sigma&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;
* Выходные данные: вещественный &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектор &amp;lt;math&amp;gt;X&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;syntaxhighlight lang = c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// compute matrix B (core)&lt;br /&gt;
for (int j = 0; j &amp;lt; n; j++){&lt;br /&gt;
    double sum_down = matrix_cov[j][j];&lt;br /&gt;
    for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
        double cur = matrix_cov[j][k];&lt;br /&gt;
        sum_down -= cur * cur;&lt;br /&gt;
    }&lt;br /&gt;
    matrix_cov[j][j] = sqrt(sum_down);&lt;br /&gt;
    for (int i = j + 1; i &amp;lt; n; i++){&lt;br /&gt;
        double sum_up = matrix_cov[i][j];&lt;br /&gt;
        for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
            sum_up -= matrix_cov[i][k] * matrix_cov[j][k];&lt;br /&gt;
        }&lt;br /&gt;
        matrix_cov[i][j] = sum_up / matrix_cov[j][j];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
// generate vector Y&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){&lt;br /&gt;
    double sum = generate_uniform(n);&lt;br /&gt;
    for (int j = 0; j &amp;lt; CLT_NUM - 1; j++){&lt;br /&gt;
        sum += generate_uniform(n);&lt;br /&gt;
    }&lt;br /&gt;
    vec_Y[i] = (sum - CLT_NUM / 2) * sqrt(12.0 / CLT_NUM);&lt;br /&gt;
}&lt;br /&gt;
// linear transformation&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){  &lt;br /&gt;
    vec_X[i] = vec_exp[i];&lt;br /&gt;
    for (int k = 0; k &amp;lt;= i; k++){&lt;br /&gt;
        vec_X[i] += matrix_cov[i][k] * vec_Y[k];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Алгоритм был реализован на языке C++ с использованием Intel MPI Library и запущен на кластере regular4.&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add impi/5.0.1&lt;br /&gt;
 mpicxx -std=c++0x task.c -o _scratch/task&lt;br /&gt;
 sbatch -n256 impi ./task &amp;lt;matrix_size&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
* размер матрицы [1024 : 4864] с шагом 256,&lt;br /&gt;
* число ядер [2 : 256] с шагом по степеням 2.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:Ops_2.png|thumb|center|700px|Рисунок 4. Изменение производительности в зависимости от числа ядер и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
[[file:Eff_2.png|thumb|center|700px|Рисунок 5. Изменение эффективности реализации в зависимости от числа ядер и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
[[file:Eff_2_up.png|thumb|center|700px|Рисунок 6. Изменение эффективности реализации, вид сверху.]]&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;По размеру задачи&#039;&#039;&#039; — при увеличении размерности матрицы эффективность реализации постепенно увеличивается, при этом тем быстрее, чем большее число ядер задействовано.&lt;br /&gt;
* &#039;&#039;&#039;По числу ядер&#039;&#039;&#039; — при увеличении числа mpi-процессов эффективность реализации снижается. Это объясняется ростом накладных расходов на организацию параллельного выполнения. При этом с ростом размерности матрицы эффективность снижается с такой же скоростью, но уже при больших значениях числа mpi-процессов.&lt;br /&gt;
* &#039;&#039;&#039;По двум направлениям&#039;&#039;&#039; — эффективность реализации возрастает (на рассматриваемой области значений параметров), но крайне медленно.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/mensigo/skipod/blob/master/mpi_gauss_vec_gen.c Параллельная реализация на C++]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
MS Excel и распространённые статистические пакеты (напр., SPSS, Statistica) позволяют моделировать только одномерные статистические распределения. Имеется возможность &amp;quot;собрать&amp;quot; многомерное распределение из нескольких одномерных при условии, что компоненты независимы. Однако если необходимо исследовать данные с зависящими друг от друга переменными, то приходится писать собственную программу. При этом удобно воспользоваться готовой реализацией разложения Холецкого (точечного метода), представленной в таких прикладных пакетах, как LINPACK, LAPACK, SCALAPACK.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Lonalone</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26761</id>
		<title>Участник:Lonalone/Генерация гауссовского вектора методом линейных преобразований</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26761"/>
		<updated>2018-12-02T14:40:51Z</updated>

		<summary type="html">&lt;p&gt;Lonalone: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор описания: &#039;&#039;Меньших И. М.&#039;&#039;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из многомерных распределений особый интерес представляет нормальное. Этому закону подчиняются все результаты воздействия большого числа случайных факторов, среди которых нет превалирующих.&lt;br /&gt;
&lt;br /&gt;
В статье приведен алгоритм генерации n-мерного гауссовского случайного вектора с помощью &#039;&#039;метода линейных преобразований&#039;&#039;&amp;lt;ref name=&amp;quot;V&amp;quot;&amp;gt;Михайлов Г.А., Войтишек А.В. Численное статистическое моделирование. Методы Монте-Карло — М.: Академия, 2006. — 368 с.&amp;lt;/ref&amp;gt;. Известно, что случае нормально распределенного случайного вектора, ковариационная матрица вместе с математическим ожиданием этого вектора полностью определяют его распределение. Поэтому для полного статистического соответствия моделируемого и теоретического распределения гауссовского вектора достаточно обеспечить требуемые значения указанных параметров&amp;lt;ref name=&amp;quot;VV&amp;quot;&amp;gt; https://ru.wikipedia.org/wiki/Многомерное_нормальное_распределение&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея алгоритма заключается в линейном преобразовании n-мерного случайного вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, компоненты которого независимы и одинаково распределены по нормальному закону со стандартными параметрами, в случайный вектор &amp;lt;math&amp;gt;X&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;\Sigma&amp;lt;/math&amp;gt; и вектор математических ожиданий &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Sigma = \|\sigma_{ij}\| = \| \mathbb{E}[(X_{i} - m_{x_{i}})(X_{j} - m_{x_{j}})]\|, \\&lt;br /&gt;
M = (m_{x_{1}}, m_{x_{2}}, ..., m_{x_{n}})^T.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Требуется найти такую матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, которая позволяла бы получить искомый вектор &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; с требуемыми характеристиками в результате линейного преобразования &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — n-мерный случайный вектор с независимыми нормально распределенными компонентами со стандартными параметрами.&lt;br /&gt;
&lt;br /&gt;
Будем искать матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в виде нижней треугольной матрицы. Перейдем от матричной записи к системе алгебраических уравнений:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} X_{1} \\&lt;br /&gt;
 X_{2} \\ \vdots \\ X_{n} \end{pmatrix} =&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} b_{11} &amp;amp; 0 &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\b_{21} &amp;amp; b_{22} &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\ \vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \vdots&lt;br /&gt;
\\ b_{n1} &amp;amp; b_{n2} &amp;amp; \cdots &amp;amp; b_{nn}&lt;br /&gt;
\end{pmatrix} \times&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} Y_{1} \\&lt;br /&gt;
 Y_{2} \\ \vdots \\ Y_{n} \end{pmatrix} +&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} m_{x_{1}} \\&lt;br /&gt;
 m_{x_{2}} \\ \vdots \\ m_{x_{n}} \end{pmatrix} \Rightarrow&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}X_{1} - m_{x_{1}} = b_{11}Y_{1}&lt;br /&gt;
\\X_{2} - m_{x_{2}} = b_{21}Y_{1} + b_{22}Y_{2}&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\\X_{n} - m_{x_{n}} = b_{n1}Y_{1} + b_{n2}Y_{2} + \cdots + b_{nn}Y_{n}&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Поскольку компоненты вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; независимы и имеют стандартные параметры, справедливо выражение:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\mathbb{E}[Y_{i}Y_{j}] =&lt;br /&gt;
\left\{\begin{matrix} &lt;br /&gt;
1, &amp;amp;i = j, \\&lt;br /&gt;
0, &amp;amp;i \not= j.&lt;br /&gt;
\end{matrix}\right.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Почленно перемножив сами на себя и между собой соответственно левые и правые части уравнений системы и взяв от результатов перемножения математическое ожидание, получаем систему уравнений вида:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\mathbb{E}[(X_{1} - m_{x_{1}})(X_{1} - m_{x_{1}})] = \mathbb{E}[b_{11}Y_{1}b_{11}Y_{1}],&lt;br /&gt;
\\ \mathbb{E}[(X_{1} - m_{x_{1}})(X_{2} - m_{x_{2}})] = \mathbb{E}[(b_{21}Y_{1} + b_{22}Y_{2})b_{11}Y_{1}],&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, в левых частях полученной системы уравнений располагаются элементы заданной ковариационной матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;, а в правых — элементы искомой матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;. Последовательно решая эту систему, получаем формулы для расчета элементов &amp;lt;math&amp;gt;\sigma_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
b_{11}=\sqrt{\sigma_{11}}; b_{21}=\frac{\sigma_{12}}{\sqrt{\sigma_{11}}}; b_{22} = \sqrt{\sigma_{22} - \frac{\sigma_{12}}{\sigma_{11}}}, \cdots&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рекуррентная формула для расчета любого элемента матрицы преобразования &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b_{ij} = \frac {\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}} {\sqrt{\sigma_{ij} - \sum_{k=1}^{j-1} b_{jk}^2}}, \quad 1 \leqslant j \leqslant i \leqslant n&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(суммы с верхним нулевым пределом считаются равными нулю)&lt;br /&gt;
&lt;br /&gt;
Таким образом, матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; получается с помощью [[Разложение_Холецкого_(метод_квадратного_корня)|разложения Холецкого]] матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Генерация случайного вектора Y ====&lt;br /&gt;
&lt;br /&gt;
Пусть имеется генератор псевдослучайных чисел (ГПСЧ, PRNG), с помощью которого можно получить реализацию случайной величины &amp;lt;math&amp;gt;u \sim U(0,1) &amp;lt;/math&amp;gt;. Описанный выше случайный вектор &amp;lt;math&amp;gt;Y=(y_1, \dots, y_n)&amp;lt;/math&amp;gt; с независимыми компонентами составим из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; реализаций случайной величины &amp;lt;math&amp;gt;\eta \sim N(0,1)&amp;lt;/math&amp;gt;. Каждую такую реализацию &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;, в свою очередь, получим с помощью приближения по ЦПТ &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; случайными величинами, распределенными равномерно на отрезке [0,1]:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right), \quad i = \overline{1, n} \\&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;u_j^i - &amp;lt;/math&amp;gt; реализации случайной величины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;\kappa - &amp;lt;/math&amp;gt; параметр, обеспечивающий качество приближения.&lt;br /&gt;
&lt;br /&gt;
Как правило, &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; берут равным 12 и считают, что для подавляющего числа практических задач обеспечивается должная точность вычислений&amp;lt;ref name = &amp;quot;VVV&amp;quot;&amp;gt;Балдин К.В., Уткин В.Б. Информационные системы в экономике. — М.:Дашков и Кo, 2008. — 395 с.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}, \quad 1 \leqslant j \leqslant i \leqslant n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;&lt;br /&gt;
* Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1) Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;b_{11}= \sqrt{\sigma_{11}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;b_{k1}= \frac{\sigma_{k1}}{l_{11}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad k = \overline{2,n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{2,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (c) &amp;lt;math&amp;gt;b_{ii} = \sqrt{\sigma_{ii} - \sum_{p = 1}^{i - 1} b_{ip}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (d) &amp;lt;math&amp;gt;b_{ji} = \frac{\sigma_{ji} - \sum_{p = 1}^{i - 1} b_{ip} b_{jp}} {l_{ii}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad i \neq n, j = \overline{i+1,n}&amp;lt;/math&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;u_j^i \leftarrow PRNG,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\quad j = \overline{1,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3) Вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i = m_{x_i} + \sum_{k = 1}^{i} b_{ik} y_{k}, \quad i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt; n(n+1) + \frac {n(n-1)(n-2)}{6} &amp;lt;/math&amp;gt; (умножений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac {n(n+1)}{2} + \frac {n(n-1)(n-2)}{6} &amp;lt;/math&amp;gt; (вычитаний)&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac {n(n-1+2\kappa)}{2} &amp;lt;/math&amp;gt; (сложений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac {n(n+3)}{2} &amp;lt;/math&amp;gt; (делений)&lt;br /&gt;
* &amp;lt;math&amp;gt; 2n &amp;lt;/math&amp;gt; (взятия квадратного корня)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{n}{6}\left(2n^2+9n+31+6\kappa\right) &amp;lt;/math&amp;gt; - итого операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
==== Заполнение матрицы B====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 1 макроструктуры алгоритма ([[Разложение_Холецкого_(метод_квадратного_корня)|&#039;&#039;разложения Холецкого&#039;&#039;]]) состоит из трёх групп вершин, расположенных в целочисленных узлах трёх областей разной размерности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин расположена в одномерной области, соответствующая ей операция вычисляет функцию SQRT. &lt;br /&gt;
Единственная координата каждой из вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргумент этой функции &lt;br /&gt;
	&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{11}&amp;lt;/math&amp;gt;; &lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ii}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин расположена в двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a / b&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;: &lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{j1}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1, j, i - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ji}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин расположена в трёхмерной области, соответствующая ей операция  &amp;lt;math&amp;gt;a - b * c&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; — меняется в диапазоне  от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;p = 1&amp;lt;/math&amp;gt; элемент входных данных &amp;lt;math&amp;gt;\sigma_{ji}&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;p &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i, j, p - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, i&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, j&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.1, выполненном для случая &amp;lt;math&amp;gt;n = 4&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
[[file:Cholesky full_in_out.png|thumb|center|1400px|Рисунок 1. Граф этапа 1 макроструктуры алгоритма. SQ — вычисление квадратного корня, F — операция a-bc, Div — деление, In — входные данные, Out — выходные.]]&lt;br /&gt;
&lt;br /&gt;
====Генерация вектора Y====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 2 макроструктуры алгоритма состоит из двух групп вершин, расположенных в целочисленных узлах двумерной области.&lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин. Соответствующая ей операция вычисляет функцию &amp;lt;math&amp;gt;S = a+b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a:&amp;lt;/math&amp;gt;&lt;br /&gt;
** при &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; — константа &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;j&amp;gt;1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатами &amp;lt;math&amp;gt;i,j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; — значение, поступающее с &amp;lt;math&amp;gt;PRNG&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин. Соответствующая ей операция вычисляет функцию &amp;lt;math&amp;gt;F = \left(a-\frac{\kappa}{2}\right)\sqrt{\frac{12}{\kappa}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; —  результат срабатывания операции, соответствующей вершине из первой группы, с координатами &amp;lt;math&amp;gt;i,\kappa&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; этапа &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.2, выполненном для случая &amp;lt;math&amp;gt;n = 2, \kappa = 2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf2.png|550px|thumb|center|Рисунок 2. Граф этапа 3 макроструктуры алгоритма]]&lt;br /&gt;
&lt;br /&gt;
====Вычисление вектора X====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 3 макроструктуры алгоритма (&#039;&#039;умножение нижней треугольной матрицы на вектор и сложение результата с другим вектором&#039;&#039;) состоит из одной группы вершин, расположенной в целочисленных узлах двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a+bc&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;j = 1&amp;lt;/math&amp;gt; — компонента &amp;lt;math&amp;gt;m_{x_i}&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;j &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине с координатами &amp;lt;math&amp;gt;i, j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;b_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;y_{j}&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является:&lt;br /&gt;
* при &amp;lt;math&amp;gt;j &amp;lt; i&amp;lt;/math&amp;gt; — &#039;&#039;промежуточным данным&#039;&#039; этапа;&lt;br /&gt;
* при &amp;lt;math&amp;gt;j = i&amp;lt;/math&amp;gt; — &#039;&#039;выходным данным&#039;&#039; алгоритма &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.3, выполненном для случая &amp;lt;math&amp;gt; n = 4&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf3.png|650px|thumb|center|Рисунок 3. Граф этапа 3 макроструктуры алгоритма,  F — операция a+bc]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для распараллеливания доступны следующие опции:&lt;br /&gt;
* вычисление элементов матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в рамках столбца (под диагональю),&lt;br /&gt;
* генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;,&lt;br /&gt;
* вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (умножение матрицы на вектор, сложение векторов).&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: вещественная всюду плотная положительно определенная симметрическая  &amp;lt;math&amp;gt;(n \times n)&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;\Sigma&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;
* Выходные данные: вещественный &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектор &amp;lt;math&amp;gt;X&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;syntaxhighlight lang = c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// compute matrix B (core)&lt;br /&gt;
for (int j = 0; j &amp;lt; n; j++){&lt;br /&gt;
    double sum_down = matrix_cov[j][j];&lt;br /&gt;
    for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
        double cur = matrix_cov[j][k];&lt;br /&gt;
        sum_down -= cur * cur;&lt;br /&gt;
    }&lt;br /&gt;
    matrix_cov[j][j] = sqrt(sum_down);&lt;br /&gt;
    for (int i = j + 1; i &amp;lt; n; i++){&lt;br /&gt;
        double sum_up = matrix_cov[i][j];&lt;br /&gt;
        for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
            sum_up -= matrix_cov[i][k] * matrix_cov[j][k];&lt;br /&gt;
        }&lt;br /&gt;
        matrix_cov[i][j] = sum_up / matrix_cov[j][j];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
// generate vector Y&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){&lt;br /&gt;
    double sum = generate_uniform(n);&lt;br /&gt;
    for (int j = 0; j &amp;lt; CLT_NUM - 1; j++){&lt;br /&gt;
        sum += generate_uniform(n);&lt;br /&gt;
    }&lt;br /&gt;
    vec_Y[i] = (sum - CLT_NUM / 2) * sqrt(12.0 / CLT_NUM);&lt;br /&gt;
}&lt;br /&gt;
// linear transformation&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){  &lt;br /&gt;
    vec_X[i] = vec_exp[i];&lt;br /&gt;
    for (int k = 0; k &amp;lt;= i; k++){&lt;br /&gt;
        vec_X[i] += matrix_cov[i][k] * vec_Y[k];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Алгоритм был реализован на языке C++ с использованием Intel MPI Library и запущен на кластере regular4.&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add impi/5.0.1&lt;br /&gt;
 mpicxx -std=c++0x task.c -o _scratch/task&lt;br /&gt;
 sbatch -n256 impi ./task &amp;lt;matrix_size&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
* размер матрицы [1024 : 4864] с шагом 256,&lt;br /&gt;
* число ядер [2 : 256] с шагом по степеням 2.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:Ops_2.png|thumb|center|700px|Рисунок 4. Изменение производительности в зависимости от числа ядер и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
[[file:Eff_2.png|thumb|center|700px|Рисунок 5. Изменение эффективности реализации в зависимости от числа ядер и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
[[file:Eff_2_up.png|thumb|center|700px|Рисунок 6. Изменение эффективности реализации, вид сверху.]]&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;По размеру задачи&#039;&#039;&#039; — при увеличении размерности матрицы эффективность реализации постепенно увеличивается, при этом тем быстрее, чем большее число ядер задействовано.&lt;br /&gt;
* &#039;&#039;&#039;По числу ядер&#039;&#039;&#039; — при увеличении числа mpi-процессов эффективность реализации снижается. Это объясняется ростом накладных расходов на организацию параллельного выполнения. При этом с ростом размерности матрицы эффективность снижается с такой же скоростью, но уже при больших значениях числа mpi-процессов.&lt;br /&gt;
* &#039;&#039;&#039;По двум направлениям&#039;&#039;&#039; — эффективность реализации возрастает, но крайне медленно.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/mensigo/skipod/blob/master/mpi_gauss_vec_gen.c Параллельная реализация на C++]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
MS Excel и распространённые статистические пакеты (напр., SPSS, Statistica) позволяют моделировать только одномерные статистические распределения. Имеется возможность &amp;quot;собрать&amp;quot; многомерное распределение из нескольких одномерных при условии, что компоненты независимы. Однако если необходимо исследовать данные с зависящими друг от друга переменными, то приходится писать собственную программу. При этом удобно воспользоваться готовой реализацией разложения Холецкого (точечного метода), представленной в таких прикладных пакетах, как LINPACK, LAPACK, SCALAPACK.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Lonalone</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26760</id>
		<title>Участник:Lonalone/Генерация гауссовского вектора методом линейных преобразований</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26760"/>
		<updated>2018-12-02T14:33:41Z</updated>

		<summary type="html">&lt;p&gt;Lonalone: /* Генерация вектора Y */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор описания: &#039;&#039;Меньших И. М.&#039;&#039;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из многомерных распределений особый интерес представляет нормальное. Этому закону подчиняются все результаты воздействия большого числа случайных факторов, среди которых нет превалирующих.&lt;br /&gt;
&lt;br /&gt;
В статье приведен алгоритм генерации n-мерного гауссовского случайного вектора с помощью &#039;&#039;метода линейных преобразований&#039;&#039;&amp;lt;ref name=&amp;quot;V&amp;quot;&amp;gt;(п. 1.10.4) Михайлов Г.А., Войтишек А.В. Численное статистическое моделирование. Методы Монте-Карло — М.: Академия, 2006. — 368 с.&amp;lt;/ref&amp;gt;. Известно, что случае нормально распределенного случайного вектора, ковариационная матрица вместе с математическим ожиданием этого вектора полностью определяют его распределение. Поэтому для полного статистического соответствия моделируемого и теоретического распределения гауссовского вектора достаточно обеспечить требуемые значения указанных параметров&amp;lt;ref name=&amp;quot;VV&amp;quot;&amp;gt; https://ru.wikipedia.org/wiki/Многомерное_нормальное_распределение&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея алгоритма заключается в линейном преобразовании n-мерного случайного вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, компоненты которого независимы и одинаково распределены по нормальному закону со стандартными параметрами, в случайный вектор &amp;lt;math&amp;gt;X&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;\Sigma&amp;lt;/math&amp;gt; и вектор математических ожиданий &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Sigma = \|\sigma_{ij}\| = \| \mathbb{E}[(X_{i} - m_{x_{i}})(X_{j} - m_{x_{j}})]\|, \\&lt;br /&gt;
M = (m_{x_{1}}, m_{x_{2}}, ..., m_{x_{n}})^T.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Требуется найти такую матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, которая позволяла бы получить искомый вектор &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; с требуемыми характеристиками в результате линейного преобразования &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — n-мерный случайный вектор с независимыми нормально распределенными компонентами со стандартными параметрами.&lt;br /&gt;
&lt;br /&gt;
Будем искать матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в виде нижней треугольной матрицы. Перейдем от матричной записи к системе алгебраических уравнений:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} X_{1} \\&lt;br /&gt;
 X_{2} \\ \vdots \\ X_{n} \end{pmatrix} =&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} b_{11} &amp;amp; 0 &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\b_{21} &amp;amp; b_{22} &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\ \vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \vdots&lt;br /&gt;
\\ b_{n1} &amp;amp; b_{n2} &amp;amp; \cdots &amp;amp; b_{nn}&lt;br /&gt;
\end{pmatrix} \times&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} Y_{1} \\&lt;br /&gt;
 Y_{2} \\ \vdots \\ Y_{n} \end{pmatrix} +&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} m_{x_{1}} \\&lt;br /&gt;
 m_{x_{2}} \\ \vdots \\ m_{x_{n}} \end{pmatrix} \Rightarrow&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}X_{1} - m_{x_{1}} = b_{11}Y_{1}&lt;br /&gt;
\\X_{2} - m_{x_{2}} = b_{21}Y_{1} + b_{22}Y_{2}&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\\X_{n} - m_{x_{n}} = b_{n1}Y_{1} + b_{n2}Y_{2} + \cdots + b_{nn}Y_{n}&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Поскольку компоненты вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; независимы и имеют стандартные параметры, справедливо выражение:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\mathbb{E}[Y_{i}Y_{j}] =&lt;br /&gt;
\left\{\begin{matrix} &lt;br /&gt;
1, &amp;amp;i = j, \\&lt;br /&gt;
0, &amp;amp;i \not= j.&lt;br /&gt;
\end{matrix}\right.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Почленно перемножив сами на себя и между собой соответственно левые и правые части уравнений системы и взяв от результатов перемножения математическое ожидание, получаем систему уравнений вида:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\mathbb{E}[(X_{1} - m_{x_{1}})(X_{1} - m_{x_{1}})] = \mathbb{E}[b_{11}Y_{1}b_{11}Y_{1}],&lt;br /&gt;
\\ \mathbb{E}[(X_{1} - m_{x_{1}})(X_{2} - m_{x_{2}})] = \mathbb{E}[(b_{21}Y_{1} + b_{22}Y_{2})b_{11}Y_{1}],&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, в левых частях полученной системы уравнений располагаются элементы заданной ковариационной матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;, а в правых — элементы искомой матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;. Последовательно решая эту систему, получаем формулы для расчета элементов &amp;lt;math&amp;gt;\sigma_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
b_{11}=\sqrt{\sigma_{11}}; b_{21}=\frac{\sigma_{12}}{\sqrt{\sigma_{11}}}; b_{22} = \sqrt{\sigma_{22} - \frac{\sigma_{12}}{\sigma_{11}}}, \cdots&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рекуррентная формула для расчета любого элемента матрицы преобразования &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b_{ij} = \frac {\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}} {\sqrt{\sigma_{ij} - \sum_{k=1}^{j-1} b_{jk}^2}}, \quad 1 \leqslant j \leqslant i \leqslant n&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(суммы с верхним нулевым пределом считаются равными нулю)&lt;br /&gt;
&lt;br /&gt;
Таким образом, матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; получается с помощью [[Разложение_Холецкого_(метод_квадратного_корня)|разложения Холецкого]] матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Генерация случайного вектора Y ====&lt;br /&gt;
&lt;br /&gt;
Пусть имеется генератор псевдослучайных чисел (ГПСЧ, PRNG), с помощью которого можно получить реализацию случайной величины &amp;lt;math&amp;gt;u \sim U(0,1) &amp;lt;/math&amp;gt;. Описанный выше случайный вектор &amp;lt;math&amp;gt;Y=(y_1, \dots, y_n)&amp;lt;/math&amp;gt; с независимыми компонентами составим из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; реализаций случайной величины &amp;lt;math&amp;gt;\eta \sim N(0,1)&amp;lt;/math&amp;gt;. Каждую такую реализацию &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;, в свою очередь, получим с помощью приближения по ЦПТ &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; случайными величинами, распределенными равномерно на отрезке [0,1]:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right), \quad i = \overline{1, n} \\&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;u_j^i - &amp;lt;/math&amp;gt; реализации случайной величины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;\kappa - &amp;lt;/math&amp;gt; параметр, обеспечивающий качество приближения.&lt;br /&gt;
&lt;br /&gt;
Как правило, &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; берут равным 12 и считают, что для подавляющего числа практических задач обеспечивается должная точность вычислений&amp;lt;ref name = &amp;quot;VVV&amp;quot;&amp;gt;Балдин К.В., Уткин В.Б. Информационные системы в экономике. — М.:Дашков и Кo, 2008. — 395 с.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}, \quad 1 \leqslant j \leqslant i \leqslant n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;&lt;br /&gt;
* Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1) Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;b_{11}= \sqrt{\sigma_{11}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;b_{k1}= \frac{\sigma_{k1}}{l_{11}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad k = \overline{2,n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{2,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (c) &amp;lt;math&amp;gt;b_{ii} = \sqrt{\sigma_{ii} - \sum_{p = 1}^{i - 1} b_{ip}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (d) &amp;lt;math&amp;gt;b_{ji} = \frac{\sigma_{ji} - \sum_{p = 1}^{i - 1} b_{ip} b_{jp}} {l_{ii}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad i \neq n, j = \overline{i+1,n}&amp;lt;/math&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;u_j^i \leftarrow PRNG,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\quad j = \overline{1,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3) Вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i = m_{x_i} + \sum_{k = 1}^{i} b_{ik} y_{k}, \quad i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt; n(n+1) + \frac {n(n-1)(n-2)}{6} &amp;lt;/math&amp;gt; (умножений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac {n(n+1)}{2} + \frac {n(n-1)(n-2)}{6} &amp;lt;/math&amp;gt; (вычитаний)&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac {n(n-1+2\kappa)}{2} &amp;lt;/math&amp;gt; (сложений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac {n(n+3)}{2} &amp;lt;/math&amp;gt; (делений)&lt;br /&gt;
* &amp;lt;math&amp;gt; 2n &amp;lt;/math&amp;gt; (взятия квадратного корня)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{n}{6}\left(2n^2+9n+31+6\kappa\right) &amp;lt;/math&amp;gt; - итого операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
==== Заполнение матрицы B====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 1 макроструктуры алгоритма ([[Разложение_Холецкого_(метод_квадратного_корня)|&#039;&#039;разложения Холецкого&#039;&#039;]]) состоит из трёх групп вершин, расположенных в целочисленных узлах трёх областей разной размерности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин расположена в одномерной области, соответствующая ей операция вычисляет функцию SQRT. &lt;br /&gt;
Единственная координата каждой из вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргумент этой функции &lt;br /&gt;
	&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{11}&amp;lt;/math&amp;gt;; &lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ii}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин расположена в двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a / b&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;: &lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{j1}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1, j, i - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ji}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин расположена в трёхмерной области, соответствующая ей операция  &amp;lt;math&amp;gt;a - b * c&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; — меняется в диапазоне  от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;p = 1&amp;lt;/math&amp;gt; элемент входных данных &amp;lt;math&amp;gt;\sigma_{ji}&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;p &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i, j, p - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, i&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, j&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.1, выполненном для случая &amp;lt;math&amp;gt;n = 4&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
[[file:Cholesky full_in_out.png|thumb|center|1400px|Рисунок 1. Граф этапа 1 макроструктуры алгоритма. SQ — вычисление квадратного корня, F — операция a-bc, Div — деление, In — входные данные, Out — выходные.]]&lt;br /&gt;
&lt;br /&gt;
====Генерация вектора Y====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 2 макроструктуры алгоритма состоит из двух групп вершин, расположенных в целочисленных узлах двумерной области.&lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин. Соответствующая ей операция вычисляет функцию &amp;lt;math&amp;gt;S = a+b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a:&amp;lt;/math&amp;gt;&lt;br /&gt;
** при &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; — константа &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;j&amp;gt;1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатами &amp;lt;math&amp;gt;i,j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; — значение, поступающее с &amp;lt;math&amp;gt;PRNG&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин. Соответствующая ей операция вычисляет функцию &amp;lt;math&amp;gt;F = \left(a-\frac{\kappa}{2}\right)\sqrt{\frac{12}{\kappa}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; —  результат срабатывания операции, соответствующей вершине из первой группы, с координатами &amp;lt;math&amp;gt;i,\kappa&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; этапа &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.2, выполненном для случая &amp;lt;math&amp;gt;n = 2, \kappa = 2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf2.png|550px|thumb|center|Рисунок 2. Граф этапа 3 макроструктуры алгоритма]]&lt;br /&gt;
&lt;br /&gt;
====Вычисление вектора X====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 3 макроструктуры алгоритма (&#039;&#039;умножение нижней треугольной матрицы на вектор и сложение результата с другим вектором&#039;&#039;) состоит из одной группы вершин, расположенной в целочисленных узлах двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a+bc&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;j = 1&amp;lt;/math&amp;gt; — компонента &amp;lt;math&amp;gt;m_{x_i}&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;j &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине с координатами &amp;lt;math&amp;gt;i, j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;b_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;y_{j}&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является:&lt;br /&gt;
* при &amp;lt;math&amp;gt;j &amp;lt; i&amp;lt;/math&amp;gt; — &#039;&#039;промежуточным данным&#039;&#039; этапа;&lt;br /&gt;
* при &amp;lt;math&amp;gt;j = i&amp;lt;/math&amp;gt; — &#039;&#039;выходным данным&#039;&#039; алгоритма &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.3, выполненном для случая &amp;lt;math&amp;gt; n = 4&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf3.png|650px|thumb|center|Рисунок 3. Граф этапа 3 макроструктуры алгоритма,  F — операция a+bc]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для распараллеливания доступны следующие опции:&lt;br /&gt;
* вычисление элементов матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в рамках столбца (под диагональю),&lt;br /&gt;
* генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;,&lt;br /&gt;
* вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (умножение матрицы на вектор, сложение векторов).&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: вещественная всюду плотная положительно определенная симметрическая  &amp;lt;math&amp;gt;(n \times n)&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;\Sigma&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;
* Выходные данные: вещественный &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектор &amp;lt;math&amp;gt;X&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;syntaxhighlight lang = c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// compute matrix B (core)&lt;br /&gt;
for (int j = 0; j &amp;lt; n; j++){&lt;br /&gt;
    double sum_down = matrix_cov[j][j];&lt;br /&gt;
    for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
        double cur = matrix_cov[j][k];&lt;br /&gt;
        sum_down -= cur * cur;&lt;br /&gt;
    }&lt;br /&gt;
    matrix_cov[j][j] = sqrt(sum_down);&lt;br /&gt;
    for (int i = j + 1; i &amp;lt; n; i++){&lt;br /&gt;
        double sum_up = matrix_cov[i][j];&lt;br /&gt;
        for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
            sum_up -= matrix_cov[i][k] * matrix_cov[j][k];&lt;br /&gt;
        }&lt;br /&gt;
        matrix_cov[i][j] = sum_up / matrix_cov[j][j];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
// generate vector Y&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){&lt;br /&gt;
    double sum = generate_uniform(n);&lt;br /&gt;
    for (int j = 0; j &amp;lt; CLT_NUM - 1; j++){&lt;br /&gt;
        sum += generate_uniform(n);&lt;br /&gt;
    }&lt;br /&gt;
    vec_Y[i] = (sum - CLT_NUM / 2) * sqrt(12.0 / CLT_NUM);&lt;br /&gt;
}&lt;br /&gt;
// linear transformation&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){  &lt;br /&gt;
    vec_X[i] = vec_exp[i];&lt;br /&gt;
    for (int k = 0; k &amp;lt;= i; k++){&lt;br /&gt;
        vec_X[i] += matrix_cov[i][k] * vec_Y[k];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Алгоритм был реализован на языке C++ с использованием Intel MPI Library и запущен на кластере regular4.&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add impi/5.0.1&lt;br /&gt;
 mpicxx -std=c++0x task.c -o _scratch/task&lt;br /&gt;
 sbatch -n256 impi ./task &amp;lt;matrix_size&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
* размер матрицы [1024 : 4864] с шагом 256,&lt;br /&gt;
* число ядер [2 : 256] с шагом по степеням 2.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:Ops_2.png|thumb|center|700px|Рисунок 4. Изменение производительности в зависимости от числа ядер и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
[[file:Eff_2.png|thumb|center|700px|Рисунок 5. Изменение эффективности реализации в зависимости от числа ядер и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
[[file:Eff_2_up.png|thumb|center|700px|Рисунок 6. Изменение эффективности реализации, вид сверху.]]&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;По размеру задачи&#039;&#039;&#039; — при увеличении размерности матрицы эффективность реализации постепенно увеличивается, при этом тем быстрее, чем большее число ядер задействовано.&lt;br /&gt;
* &#039;&#039;&#039;По числу ядер&#039;&#039;&#039; — при увеличении числа mpi-процессов эффективность реализации снижается. Это объясняется ростом накладных расходов на организацию параллельного выполнения. При этом с ростом размерности матрицы эффективность снижается с такой же скоростью, но уже при больших значениях числа mpi-процессов.&lt;br /&gt;
* &#039;&#039;&#039;По двум направлениям&#039;&#039;&#039; — эффективность реализации возрастает, но крайне медленно.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/mensigo/skipod/blob/master/mpi_gauss_vec_gen.c Параллельная реализация на C++]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
MS Excel и распространённые статистические пакеты (напр., SPSS, Statistica) позволяют моделировать только одномерные статистические распределения. Имеется возможность &amp;quot;собрать&amp;quot; многомерное распределение из нескольких одномерных при условии, что компоненты независимы. Однако если необходимо исследовать данные с зависящими друг от друга переменными, то приходится писать собственную программу. При этом удобно воспользоваться готовой реализацией разложения Холецкого (точечного метода), представленной в таких прикладных пакетах, как LINPACK, LAPACK, SCALAPACK.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Lonalone</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26759</id>
		<title>Участник:Lonalone/Генерация гауссовского вектора методом линейных преобразований</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26759"/>
		<updated>2018-12-02T14:28:17Z</updated>

		<summary type="html">&lt;p&gt;Lonalone: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор описания: &#039;&#039;Меньших И. М.&#039;&#039;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из многомерных распределений особый интерес представляет нормальное. Этому закону подчиняются все результаты воздействия большого числа случайных факторов, среди которых нет превалирующих.&lt;br /&gt;
&lt;br /&gt;
В статье приведен алгоритм генерации n-мерного гауссовского случайного вектора с помощью &#039;&#039;метода линейных преобразований&#039;&#039;&amp;lt;ref name=&amp;quot;V&amp;quot;&amp;gt;(п. 1.10.4) Михайлов Г.А., Войтишек А.В. Численное статистическое моделирование. Методы Монте-Карло — М.: Академия, 2006. — 368 с.&amp;lt;/ref&amp;gt;. Известно, что случае нормально распределенного случайного вектора, ковариационная матрица вместе с математическим ожиданием этого вектора полностью определяют его распределение. Поэтому для полного статистического соответствия моделируемого и теоретического распределения гауссовского вектора достаточно обеспечить требуемые значения указанных параметров&amp;lt;ref name=&amp;quot;VV&amp;quot;&amp;gt; https://ru.wikipedia.org/wiki/Многомерное_нормальное_распределение&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея алгоритма заключается в линейном преобразовании n-мерного случайного вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, компоненты которого независимы и одинаково распределены по нормальному закону со стандартными параметрами, в случайный вектор &amp;lt;math&amp;gt;X&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;\Sigma&amp;lt;/math&amp;gt; и вектор математических ожиданий &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Sigma = \|\sigma_{ij}\| = \| \mathbb{E}[(X_{i} - m_{x_{i}})(X_{j} - m_{x_{j}})]\|, \\&lt;br /&gt;
M = (m_{x_{1}}, m_{x_{2}}, ..., m_{x_{n}})^T.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Требуется найти такую матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, которая позволяла бы получить искомый вектор &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; с требуемыми характеристиками в результате линейного преобразования &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — n-мерный случайный вектор с независимыми нормально распределенными компонентами со стандартными параметрами.&lt;br /&gt;
&lt;br /&gt;
Будем искать матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в виде нижней треугольной матрицы. Перейдем от матричной записи к системе алгебраических уравнений:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} X_{1} \\&lt;br /&gt;
 X_{2} \\ \vdots \\ X_{n} \end{pmatrix} =&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} b_{11} &amp;amp; 0 &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\b_{21} &amp;amp; b_{22} &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\ \vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \vdots&lt;br /&gt;
\\ b_{n1} &amp;amp; b_{n2} &amp;amp; \cdots &amp;amp; b_{nn}&lt;br /&gt;
\end{pmatrix} \times&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} Y_{1} \\&lt;br /&gt;
 Y_{2} \\ \vdots \\ Y_{n} \end{pmatrix} +&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} m_{x_{1}} \\&lt;br /&gt;
 m_{x_{2}} \\ \vdots \\ m_{x_{n}} \end{pmatrix} \Rightarrow&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}X_{1} - m_{x_{1}} = b_{11}Y_{1}&lt;br /&gt;
\\X_{2} - m_{x_{2}} = b_{21}Y_{1} + b_{22}Y_{2}&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\\X_{n} - m_{x_{n}} = b_{n1}Y_{1} + b_{n2}Y_{2} + \cdots + b_{nn}Y_{n}&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Поскольку компоненты вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; независимы и имеют стандартные параметры, справедливо выражение:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\mathbb{E}[Y_{i}Y_{j}] =&lt;br /&gt;
\left\{\begin{matrix} &lt;br /&gt;
1, &amp;amp;i = j, \\&lt;br /&gt;
0, &amp;amp;i \not= j.&lt;br /&gt;
\end{matrix}\right.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Почленно перемножив сами на себя и между собой соответственно левые и правые части уравнений системы и взяв от результатов перемножения математическое ожидание, получаем систему уравнений вида:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\mathbb{E}[(X_{1} - m_{x_{1}})(X_{1} - m_{x_{1}})] = \mathbb{E}[b_{11}Y_{1}b_{11}Y_{1}],&lt;br /&gt;
\\ \mathbb{E}[(X_{1} - m_{x_{1}})(X_{2} - m_{x_{2}})] = \mathbb{E}[(b_{21}Y_{1} + b_{22}Y_{2})b_{11}Y_{1}],&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, в левых частях полученной системы уравнений располагаются элементы заданной ковариационной матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;, а в правых — элементы искомой матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;. Последовательно решая эту систему, получаем формулы для расчета элементов &amp;lt;math&amp;gt;\sigma_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
b_{11}=\sqrt{\sigma_{11}}; b_{21}=\frac{\sigma_{12}}{\sqrt{\sigma_{11}}}; b_{22} = \sqrt{\sigma_{22} - \frac{\sigma_{12}}{\sigma_{11}}}, \cdots&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рекуррентная формула для расчета любого элемента матрицы преобразования &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b_{ij} = \frac {\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}} {\sqrt{\sigma_{ij} - \sum_{k=1}^{j-1} b_{jk}^2}}, \quad 1 \leqslant j \leqslant i \leqslant n&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(суммы с верхним нулевым пределом считаются равными нулю)&lt;br /&gt;
&lt;br /&gt;
Таким образом, матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; получается с помощью [[Разложение_Холецкого_(метод_квадратного_корня)|разложения Холецкого]] матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Генерация случайного вектора Y ====&lt;br /&gt;
&lt;br /&gt;
Пусть имеется генератор псевдослучайных чисел (ГПСЧ, PRNG), с помощью которого можно получить реализацию случайной величины &amp;lt;math&amp;gt;u \sim U(0,1) &amp;lt;/math&amp;gt;. Описанный выше случайный вектор &amp;lt;math&amp;gt;Y=(y_1, \dots, y_n)&amp;lt;/math&amp;gt; с независимыми компонентами составим из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; реализаций случайной величины &amp;lt;math&amp;gt;\eta \sim N(0,1)&amp;lt;/math&amp;gt;. Каждую такую реализацию &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;, в свою очередь, получим с помощью приближения по ЦПТ &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; случайными величинами, распределенными равномерно на отрезке [0,1]:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right), \quad i = \overline{1, n} \\&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;u_j^i - &amp;lt;/math&amp;gt; реализации случайной величины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;\kappa - &amp;lt;/math&amp;gt; параметр, обеспечивающий качество приближения.&lt;br /&gt;
&lt;br /&gt;
Как правило, &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; берут равным 12 и считают, что для подавляющего числа практических задач обеспечивается должная точность вычислений&amp;lt;ref name = &amp;quot;VVV&amp;quot;&amp;gt;Балдин К.В., Уткин В.Б. Информационные системы в экономике. — М.:Дашков и Кo, 2008. — 395 с.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}, \quad 1 \leqslant j \leqslant i \leqslant n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;&lt;br /&gt;
* Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1) Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;b_{11}= \sqrt{\sigma_{11}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;b_{k1}= \frac{\sigma_{k1}}{l_{11}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad k = \overline{2,n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{2,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (c) &amp;lt;math&amp;gt;b_{ii} = \sqrt{\sigma_{ii} - \sum_{p = 1}^{i - 1} b_{ip}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (d) &amp;lt;math&amp;gt;b_{ji} = \frac{\sigma_{ji} - \sum_{p = 1}^{i - 1} b_{ip} b_{jp}} {l_{ii}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad i \neq n, j = \overline{i+1,n}&amp;lt;/math&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;u_j^i \leftarrow PRNG,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\quad j = \overline{1,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3) Вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i = m_{x_i} + \sum_{k = 1}^{i} b_{ik} y_{k}, \quad i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt; n(n+1) + \frac {n(n-1)(n-2)}{6} &amp;lt;/math&amp;gt; (умножений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac {n(n+1)}{2} + \frac {n(n-1)(n-2)}{6} &amp;lt;/math&amp;gt; (вычитаний)&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac {n(n-1+2\kappa)}{2} &amp;lt;/math&amp;gt; (сложений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac {n(n+3)}{2} &amp;lt;/math&amp;gt; (делений)&lt;br /&gt;
* &amp;lt;math&amp;gt; 2n &amp;lt;/math&amp;gt; (взятия квадратного корня)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{n}{6}\left(2n^2+9n+31+6\kappa\right) &amp;lt;/math&amp;gt; - итого операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
==== Заполнение матрицы B====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 1 макроструктуры алгоритма ([[Разложение_Холецкого_(метод_квадратного_корня)|&#039;&#039;разложения Холецкого&#039;&#039;]]) состоит из трёх групп вершин, расположенных в целочисленных узлах трёх областей разной размерности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин расположена в одномерной области, соответствующая ей операция вычисляет функцию SQRT. &lt;br /&gt;
Единственная координата каждой из вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргумент этой функции &lt;br /&gt;
	&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{11}&amp;lt;/math&amp;gt;; &lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ii}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин расположена в двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a / b&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;: &lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{j1}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1, j, i - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ji}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин расположена в трёхмерной области, соответствующая ей операция  &amp;lt;math&amp;gt;a - b * c&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; — меняется в диапазоне  от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;p = 1&amp;lt;/math&amp;gt; элемент входных данных &amp;lt;math&amp;gt;\sigma_{ji}&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;p &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i, j, p - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, i&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, j&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.1, выполненном для случая &amp;lt;math&amp;gt;n = 4&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
[[file:Cholesky full_in_out.png|thumb|center|1400px|Рисунок 1. Граф этапа 1 макроструктуры алгоритма. SQ — вычисление квадратного корня, F — операция a-bc, Div — деление, In — входные данные, Out — выходные.]]&lt;br /&gt;
&lt;br /&gt;
====Генерация вектора Y====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 2 макроструктуры алгоритма состоит из двух групп вершин, расположенных в целочисленных узлах двумерной области.&lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин. Соответствующая ей операция вычисляет функцию &amp;lt;math&amp;gt;S = a+b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a:&amp;lt;/math&amp;gt;&lt;br /&gt;
** при &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; — константа &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;j&amp;gt;1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатами &amp;lt;math&amp;gt;i,j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; — значение, поступающее с &amp;lt;math&amp;gt;PRNG&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин. Соответствующая ей операция вычисляет функцию &amp;lt;math&amp;gt;F = \left(a-\frac{\kappa}{2}\right)\sqrt{\frac{12}{\kappa}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; —  результат срабатывания операции, соответствующей вершине из первой группы, с координатами &amp;lt;math&amp;gt;i,\kappa&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; этапа &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.3, выполненном для случая &amp;lt;math&amp;gt;n = 2, \kappa = 2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf2.png|550px|thumb|center|Рисунок 3. Граф этапа 3 макроструктуры алгоритма]]&lt;br /&gt;
&lt;br /&gt;
====Вычисление вектора X====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 3 макроструктуры алгоритма (&#039;&#039;умножение нижней треугольной матрицы на вектор и сложение результата с другим вектором&#039;&#039;) состоит из одной группы вершин, расположенной в целочисленных узлах двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a+bc&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;j = 1&amp;lt;/math&amp;gt; — компонента &amp;lt;math&amp;gt;m_{x_i}&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;j &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине с координатами &amp;lt;math&amp;gt;i, j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;b_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;y_{j}&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является:&lt;br /&gt;
* при &amp;lt;math&amp;gt;j &amp;lt; i&amp;lt;/math&amp;gt; — &#039;&#039;промежуточным данным&#039;&#039; этапа;&lt;br /&gt;
* при &amp;lt;math&amp;gt;j = i&amp;lt;/math&amp;gt; — &#039;&#039;выходным данным&#039;&#039; алгоритма &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.3, выполненном для случая &amp;lt;math&amp;gt; n = 4&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf3.png|650px|thumb|center|Рисунок 3. Граф этапа 3 макроструктуры алгоритма,  F — операция a+bc]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для распараллеливания доступны следующие опции:&lt;br /&gt;
* вычисление элементов матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в рамках столбца (под диагональю),&lt;br /&gt;
* генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;,&lt;br /&gt;
* вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (умножение матрицы на вектор, сложение векторов).&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: вещественная всюду плотная положительно определенная симметрическая  &amp;lt;math&amp;gt;(n \times n)&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;\Sigma&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;
* Выходные данные: вещественный &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектор &amp;lt;math&amp;gt;X&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;syntaxhighlight lang = c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// compute matrix B (core)&lt;br /&gt;
for (int j = 0; j &amp;lt; n; j++){&lt;br /&gt;
    double sum_down = matrix_cov[j][j];&lt;br /&gt;
    for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
        double cur = matrix_cov[j][k];&lt;br /&gt;
        sum_down -= cur * cur;&lt;br /&gt;
    }&lt;br /&gt;
    matrix_cov[j][j] = sqrt(sum_down);&lt;br /&gt;
    for (int i = j + 1; i &amp;lt; n; i++){&lt;br /&gt;
        double sum_up = matrix_cov[i][j];&lt;br /&gt;
        for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
            sum_up -= matrix_cov[i][k] * matrix_cov[j][k];&lt;br /&gt;
        }&lt;br /&gt;
        matrix_cov[i][j] = sum_up / matrix_cov[j][j];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
// generate vector Y&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){&lt;br /&gt;
    double sum = generate_uniform(n);&lt;br /&gt;
    for (int j = 0; j &amp;lt; CLT_NUM - 1; j++){&lt;br /&gt;
        sum += generate_uniform(n);&lt;br /&gt;
    }&lt;br /&gt;
    vec_Y[i] = (sum - CLT_NUM / 2) * sqrt(12.0 / CLT_NUM);&lt;br /&gt;
}&lt;br /&gt;
// linear transformation&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){  &lt;br /&gt;
    vec_X[i] = vec_exp[i];&lt;br /&gt;
    for (int k = 0; k &amp;lt;= i; k++){&lt;br /&gt;
        vec_X[i] += matrix_cov[i][k] * vec_Y[k];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Алгоритм был реализован на языке C++ с использованием Intel MPI Library и запущен на кластере regular4.&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add impi/5.0.1&lt;br /&gt;
 mpicxx -std=c++0x task.c -o _scratch/task&lt;br /&gt;
 sbatch -n256 impi ./task &amp;lt;matrix_size&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
* размер матрицы [1024 : 4864] с шагом 256,&lt;br /&gt;
* число ядер [2 : 256] с шагом по степеням 2.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:Ops_2.png|thumb|center|700px|Рисунок 4. Изменение производительности в зависимости от числа ядер и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
[[file:Eff_2.png|thumb|center|700px|Рисунок 5. Изменение эффективности реализации в зависимости от числа ядер и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
[[file:Eff_2_up.png|thumb|center|700px|Рисунок 6. Изменение эффективности реализации, вид сверху.]]&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;По размеру задачи&#039;&#039;&#039; — при увеличении размерности матрицы эффективность реализации постепенно увеличивается, при этом тем быстрее, чем большее число ядер задействовано.&lt;br /&gt;
* &#039;&#039;&#039;По числу ядер&#039;&#039;&#039; — при увеличении числа mpi-процессов эффективность реализации снижается. Это объясняется ростом накладных расходов на организацию параллельного выполнения. При этом с ростом размерности матрицы эффективность снижается с такой же скоростью, но уже при больших значениях числа mpi-процессов.&lt;br /&gt;
* &#039;&#039;&#039;По двум направлениям&#039;&#039;&#039; — эффективность реализации возрастает, но крайне медленно.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/mensigo/skipod/blob/master/mpi_gauss_vec_gen.c Параллельная реализация на C++]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
MS Excel и распространённые статистические пакеты (напр., SPSS, Statistica) позволяют моделировать только одномерные статистические распределения. Имеется возможность &amp;quot;собрать&amp;quot; многомерное распределение из нескольких одномерных при условии, что компоненты независимы. Однако если необходимо исследовать данные с зависящими друг от друга переменными, то приходится писать собственную программу. При этом удобно воспользоваться готовой реализацией разложения Холецкого (точечного метода), представленной в таких прикладных пакетах, как LINPACK, LAPACK, SCALAPACK.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Lonalone</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26758</id>
		<title>Участник:Lonalone/Генерация гауссовского вектора методом линейных преобразований</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26758"/>
		<updated>2018-12-02T14:23:55Z</updated>

		<summary type="html">&lt;p&gt;Lonalone: /* Генерация случайного вектора Y */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор описания: &#039;&#039;Меньших И. М.&#039;&#039;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из многомерных распределений особый интерес представляет нормальное. Этому закону подчиняются все результаты воздействия большого числа случайных факторов, среди которых нет превалирующих.&lt;br /&gt;
&lt;br /&gt;
В статье приведен алгоритм генерации n-мерного гауссовского случайного вектора с помощью &#039;&#039;метода линейных преобразований&#039;&#039;&amp;lt;ref name=&amp;quot;V&amp;quot;&amp;gt;(п. 1.10.4) Михайлов Г.А., Войтишек А.В. Численное статистическое моделирование. Методы Монте-Карло — М.: Академия, 2006. — 368 с.&amp;lt;/ref&amp;gt;. Известно, что случае нормально распределенного случайного вектора, ковариационная матрица вместе с математическим ожиданием этого вектора полностью определяют его распределение. Поэтому для полного статистического соответствия моделируемого и теоретического распределения гауссовского вектора достаточно обеспечить требуемые значения указанных параметров&amp;lt;ref name=&amp;quot;VV&amp;quot;&amp;gt; https://ru.wikipedia.org/wiki/Многомерное_нормальное_распределение&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея алгоритма заключается в линейном преобразовании n-мерного случайного вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, компоненты которого независимы и одинаково распределены по нормальному закону со стандартными параметрами, в случайный вектор &amp;lt;math&amp;gt;X&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;\Sigma&amp;lt;/math&amp;gt; и вектор математических ожиданий &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Sigma = \|\sigma_{ij}\| = \| \mathbb{E}[(X_{i} - m_{x_{i}})(X_{j} - m_{x_{j}})]\|, \\&lt;br /&gt;
M = (m_{x_{1}}, m_{x_{2}}, ..., m_{x_{n}})^T.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Требуется найти такую матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, которая позволяла бы получить искомый вектор &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; с требуемыми характеристиками в результате линейного преобразования &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — n-мерный случайный вектор с независимыми нормально распределенными компонентами со стандартными параметрами.&lt;br /&gt;
&lt;br /&gt;
Будем искать матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в виде нижней треугольной матрицы. Перейдем от матричной записи к системе алгебраических уравнений:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} X_{1} \\&lt;br /&gt;
 X_{2} \\ \vdots \\ X_{n} \end{pmatrix} =&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} b_{11} &amp;amp; 0 &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\b_{21} &amp;amp; b_{22} &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\ \vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \vdots&lt;br /&gt;
\\ b_{n1} &amp;amp; b_{n2} &amp;amp; \cdots &amp;amp; b_{nn}&lt;br /&gt;
\end{pmatrix} \times&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} Y_{1} \\&lt;br /&gt;
 Y_{2} \\ \vdots \\ Y_{n} \end{pmatrix} +&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} m_{x_{1}} \\&lt;br /&gt;
 m_{x_{2}} \\ \vdots \\ m_{x_{n}} \end{pmatrix} \Rightarrow&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}X_{1} - m_{x_{1}} = b_{11}Y_{1}&lt;br /&gt;
\\X_{2} - m_{x_{2}} = b_{21}Y_{1} + b_{22}Y_{2}&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\\X_{n} - m_{x_{n}} = b_{n1}Y_{1} + b_{n2}Y_{2} + \cdots + b_{nn}Y_{n}&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Поскольку компоненты вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; независимы и имеют стандартные параметры, справедливо выражение:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\mathbb{E}[Y_{i}Y_{j}] =&lt;br /&gt;
\left\{\begin{matrix} &lt;br /&gt;
1, &amp;amp;i = j, \\&lt;br /&gt;
0, &amp;amp;i \not= j.&lt;br /&gt;
\end{matrix}\right.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Почленно перемножив сами на себя и между собой соответственно левые и правые части уравнений системы и взяв от результатов перемножения математическое ожидание, получаем систему уравнений вида:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\mathbb{E}[(X_{1} - m_{x_{1}})(X_{1} - m_{x_{1}})] = \mathbb{E}[b_{11}Y_{1}b_{11}Y_{1}],&lt;br /&gt;
\\ \mathbb{E}[(X_{1} - m_{x_{1}})(X_{2} - m_{x_{2}})] = \mathbb{E}[(b_{21}Y_{1} + b_{22}Y_{2})b_{11}Y_{1}],&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, в левых частях полученной системы уравнений располагаются элементы заданной ковариационной матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;, а в правых — элементы искомой матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;. Последовательно решая эту систему, получаем формулы для расчета элементов &amp;lt;math&amp;gt;\sigma_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
b_{11}=\sqrt{\sigma_{11}}; b_{21}=\frac{\sigma_{12}}{\sqrt{\sigma_{11}}}; b_{22} = \sqrt{\sigma_{22} - \frac{\sigma_{12}}{\sigma_{11}}}, \cdots&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рекуррентная формула для расчета любого элемента матрицы преобразования &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b_{ij} = \frac {\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}} {\sqrt{\sigma_{ij} - \sum_{k=1}^{j-1} b_{jk}^2}}, \quad 1 \leqslant j \leqslant i \leqslant n&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(суммы с верхним нулевым пределом считаются равными нулю)&lt;br /&gt;
&lt;br /&gt;
Таким образом, матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; получается с помощью [[Разложение_Холецкого_(метод_квадратного_корня)|разложения Холецкого]] матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Генерация случайного вектора Y ====&lt;br /&gt;
&lt;br /&gt;
Пусть имеется генератор псевдослучайных чисел (ГПСЧ, PRNG), с помощью которого можно получить реализацию случайной величины &amp;lt;math&amp;gt;u \sim U(0,1) &amp;lt;/math&amp;gt;. Описанный выше случайный вектор &amp;lt;math&amp;gt;Y=(y_1, \dots, y_n)&amp;lt;/math&amp;gt; с независимыми компонентами составим из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; реализаций случайной величины &amp;lt;math&amp;gt;\eta \sim N(0,1)&amp;lt;/math&amp;gt;. Каждую такую реализацию &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;, в свою очередь, получим с помощью приближения по ЦПТ &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; случайными величинами, распределенными равномерно на отрезке [0,1]:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right), \quad i = \overline{1, n} \\&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;u_j^i - &amp;lt;/math&amp;gt; реализации случайной величины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;\kappa - &amp;lt;/math&amp;gt; параметр, обеспечивающий качество приближения.&lt;br /&gt;
&lt;br /&gt;
Как правило, &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; берут равным 12 и считают, что для подавляющего числа практических задач обеспечивается должная точность вычислений&amp;lt;ref name = &amp;quot;VVV&amp;quot;&amp;gt;Балдин К.В., Уткин В.Б. Информационные системы в экономике. — М.:Дашков и Кo, 2008. — 395 с.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}, \quad 1 \leqslant j \leqslant i \leqslant n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;&lt;br /&gt;
* Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1) Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;b_{11}= \sqrt{\sigma_{11}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;b_{k1}= \frac{\sigma_{k1}}{l_{11}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad k = \overline{2,n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{2,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (c) &amp;lt;math&amp;gt;b_{ii} = \sqrt{\sigma_{ii} - \sum_{p = 1}^{i - 1} b_{ip}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (d) &amp;lt;math&amp;gt;b_{ji} = \frac{\sigma_{ji} - \sum_{p = 1}^{i - 1} b_{ip} b_{jp}} {l_{ii}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad i \neq n, j = \overline{i+1,n}&amp;lt;/math&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;u_j^i \leftarrow PRNG,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\quad j = \overline{1,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3) Вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i = m_{x_i} + \sum_{k = 1}^{i} b_{ik} y_{k}, \quad i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + \sum_{j=1}^{n-2}j(n-j-1) + n + \frac {n(n+1)}{2} =&lt;br /&gt;
  n(n+1) + \frac {n(n-1)(n-2)}{6}&amp;lt;/math&amp;gt; (умножений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + \sum_{j=1}^{n-2}j(n-j-1) + n =&lt;br /&gt;
  \frac {n(n+1)}{2} + \frac {n(n-1)(n-2)}{6}&amp;lt;/math&amp;gt; (вычитаний)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad (\kappa-1)n + \frac {n(n+1)}{2} = \frac {n(n-1+2\kappa)}{2}&amp;lt;/math&amp;gt; (сложений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + 2n = \frac {n(n+3)}{2}&amp;lt;/math&amp;gt; (делений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad n + n  = 2n &amp;lt;/math&amp;gt; (взятия квадратного корня)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{n}{6}\left(2n^2+9n+31+6\kappa\right) &amp;lt;/math&amp;gt; - итого операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
==== Заполнение матрицы B====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 1 макроструктуры алгоритма ([[Разложение_Холецкого_(метод_квадратного_корня)|&#039;&#039;разложения Холецкого&#039;&#039;]]) состоит из трёх групп вершин, расположенных в целочисленных узлах трёх областей разной размерности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин расположена в одномерной области, соответствующая ей операция вычисляет функцию SQRT. &lt;br /&gt;
Единственная координата каждой из вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргумент этой функции &lt;br /&gt;
	&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{11}&amp;lt;/math&amp;gt;; &lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ii}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин расположена в двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a / b&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;: &lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{j1}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1, j, i - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ji}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин расположена в трёхмерной области, соответствующая ей операция  &amp;lt;math&amp;gt;a - b * c&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; — меняется в диапазоне  от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;p = 1&amp;lt;/math&amp;gt; элемент входных данных &amp;lt;math&amp;gt;\sigma_{ji}&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;p &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i, j, p - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, i&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, j&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.1, выполненном для случая &amp;lt;math&amp;gt;n = 4&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
[[file:Cholesky full_in_out.png|thumb|center|1400px|Рисунок 1. Граф этапа 1 макроструктуры алгоритма. SQ — вычисление квадратного корня, F — операция a-bc, Div — деление, In — входные данные, Out — выходные.]]&lt;br /&gt;
&lt;br /&gt;
====Генерация вектора Y====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 2 макроструктуры алгоритма состоит из двух групп вершин, расположенных в целочисленных узлах двумерной области.&lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин. Соответствующая ей операция вычисляет функцию &amp;lt;math&amp;gt;S = a+b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a:&amp;lt;/math&amp;gt;&lt;br /&gt;
** при &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; — константа &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;j&amp;gt;1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатами &amp;lt;math&amp;gt;i,j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; — значение, поступающее с &amp;lt;math&amp;gt;PRNG&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин. Соответствующая ей операция вычисляет функцию &amp;lt;math&amp;gt;F = \left(a-\frac{\kappa}{2}\right)\sqrt{\frac{12}{\kappa}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; —  результат срабатывания операции, соответствующей вершине из первой группы, с координатами &amp;lt;math&amp;gt;i,\kappa&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; этапа &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.3, выполненном для случая &amp;lt;math&amp;gt;n = 2, \kappa = 2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf2.png|550px|thumb|center|Рисунок 3. Граф этапа 3 макроструктуры алгоритма]]&lt;br /&gt;
&lt;br /&gt;
====Вычисление вектора X====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 3 макроструктуры алгоритма (&#039;&#039;умножение нижней треугольной матрицы на вектор и сложение результата с другим вектором&#039;&#039;) состоит из одной группы вершин, расположенной в целочисленных узлах двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a+bc&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;j = 1&amp;lt;/math&amp;gt; — компонента &amp;lt;math&amp;gt;m_{x_i}&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;j &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине с координатами &amp;lt;math&amp;gt;i, j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;b_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;y_{j}&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является:&lt;br /&gt;
* при &amp;lt;math&amp;gt;j &amp;lt; i&amp;lt;/math&amp;gt; — &#039;&#039;промежуточным данным&#039;&#039; этапа;&lt;br /&gt;
* при &amp;lt;math&amp;gt;j = i&amp;lt;/math&amp;gt; — &#039;&#039;выходным данным&#039;&#039; алгоритма &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.3, выполненном для случая &amp;lt;math&amp;gt; n = 4&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf3.png|650px|thumb|center|Рисунок 3. Граф этапа 3 макроструктуры алгоритма,  F — операция a+bc]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для распараллеливания доступны следующие опции:&lt;br /&gt;
* вычисление элементов матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в рамках столбца (под диагональю),&lt;br /&gt;
* генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;,&lt;br /&gt;
* вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (умножение матрицы на вектор, сложение векторов).&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: вещественная всюду плотная положительно определенная симметрическая  &amp;lt;math&amp;gt;(n \times n)&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;\Sigma&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;
* Выходные данные: вещественный &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектор &amp;lt;math&amp;gt;X&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;syntaxhighlight lang = c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// compute matrix B (core)&lt;br /&gt;
for (int j = 0; j &amp;lt; n; j++){&lt;br /&gt;
    double sum_down = matrix_cov[j][j];&lt;br /&gt;
    for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
        double cur = matrix_cov[j][k];&lt;br /&gt;
        sum_down -= cur * cur;&lt;br /&gt;
    }&lt;br /&gt;
    matrix_cov[j][j] = sqrt(sum_down);&lt;br /&gt;
    for (int i = j + 1; i &amp;lt; n; i++){&lt;br /&gt;
        double sum_up = matrix_cov[i][j];&lt;br /&gt;
        for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
            sum_up -= matrix_cov[i][k] * matrix_cov[j][k];&lt;br /&gt;
        }&lt;br /&gt;
        matrix_cov[i][j] = sum_up / matrix_cov[j][j];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
// generate vector Y&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){&lt;br /&gt;
    double sum = generate_uniform(n);&lt;br /&gt;
    for (int j = 0; j &amp;lt; CLT_NUM - 1; j++){&lt;br /&gt;
        sum += generate_uniform(n);&lt;br /&gt;
    }&lt;br /&gt;
    vec_Y[i] = (sum - CLT_NUM / 2) * sqrt(12.0 / CLT_NUM);&lt;br /&gt;
}&lt;br /&gt;
// linear transformation&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){  &lt;br /&gt;
    vec_X[i] = vec_exp[i];&lt;br /&gt;
    for (int k = 0; k &amp;lt;= i; k++){&lt;br /&gt;
        vec_X[i] += matrix_cov[i][k] * vec_Y[k];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Алгоритм был реализован на языке C++ с использованием Intel MPI Library и запущен на кластере regular4.&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add impi/5.0.1&lt;br /&gt;
 mpicxx -std=c++0x task.c -o _scratch/task&lt;br /&gt;
 sbatch -n256 impi ./task &amp;lt;matrix_size&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
* размер матрицы [1024 : 4864] с шагом 256,&lt;br /&gt;
* число ядер [2 : 256] с шагом по степеням 2.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:Ops_2.png|thumb|center|700px|Рисунок 4. Изменение производительности в зависимости от числа ядер и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
[[file:Eff_2.png|thumb|center|700px|Рисунок 5. Изменение эффективности реализации в зависимости от числа ядер и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
[[file:Eff_2_up.png|thumb|center|700px|Рисунок 6. Изменение эффективности реализации, вид сверху.]]&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;По размеру задачи&#039;&#039;&#039; — при увеличении размерности матрицы эффективность реализации постепенно увеличивается, при этом тем быстрее, чем большее число ядер задействовано.&lt;br /&gt;
* &#039;&#039;&#039;По числу ядер&#039;&#039;&#039; — при увеличении числа mpi-процессов эффективность реализации снижается. Это объясняется ростом накладных расходов на организацию параллельного выполнения. При этом с ростом размерности матрицы эффективность снижается с такой же скоростью, но уже при больших значениях числа mpi-процессов.&lt;br /&gt;
* &#039;&#039;&#039;По двум направлениям&#039;&#039;&#039; — эффективность реализации возрастает, но крайне медленно.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/mensigo/skipod/blob/master/mpi_gauss_vec_gen.c Параллельная реализация на C++]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
MS Excel и распространённые статистические пакеты (напр., SPSS, Statistica) позволяют моделировать только одномерные статистические распределения. Имеется возможность &amp;quot;собрать&amp;quot; многомерное распределение из нескольких одномерных при условии, что компоненты независимы. Однако если необходимо исследовать данные с зависящими друг от друга переменными, то приходится писать собственную программу. При этом удобно воспользоваться готовой реализацией разложения Холецкого (точечного метода), представленной в таких прикладных пакетах, как LINPACK, LAPACK, SCALAPACK.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Lonalone</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26757</id>
		<title>Участник:Lonalone/Генерация гауссовского вектора методом линейных преобразований</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26757"/>
		<updated>2018-12-02T14:18:10Z</updated>

		<summary type="html">&lt;p&gt;Lonalone: /* Масштабируемость реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор описания: &#039;&#039;Меньших И. М.&#039;&#039;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из многомерных распределений особый интерес представляет нормальное. Этому закону подчиняются все результаты воздействия большого числа случайных факторов, среди которых нет превалирующих.&lt;br /&gt;
&lt;br /&gt;
В статье приведен алгоритм генерации n-мерного гауссовского случайного вектора с помощью &#039;&#039;метода линейных преобразований&#039;&#039;&amp;lt;ref name=&amp;quot;V&amp;quot;&amp;gt;(п. 1.10.4) Михайлов Г.А., Войтишек А.В. Численное статистическое моделирование. Методы Монте-Карло — М.: Академия, 2006. — 368 с.&amp;lt;/ref&amp;gt;. Известно, что случае нормально распределенного случайного вектора, ковариационная матрица вместе с математическим ожиданием этого вектора полностью определяют его распределение. Поэтому для полного статистического соответствия моделируемого и теоретического распределения гауссовского вектора достаточно обеспечить требуемые значения указанных параметров&amp;lt;ref name=&amp;quot;VV&amp;quot;&amp;gt; https://ru.wikipedia.org/wiki/Многомерное_нормальное_распределение&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея алгоритма заключается в линейном преобразовании n-мерного случайного вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, компоненты которого независимы и одинаково распределены по нормальному закону со стандартными параметрами, в случайный вектор &amp;lt;math&amp;gt;X&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;\Sigma&amp;lt;/math&amp;gt; и вектор математических ожиданий &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Sigma = \|\sigma_{ij}\| = \| \mathbb{E}[(X_{i} - m_{x_{i}})(X_{j} - m_{x_{j}})]\|, \\&lt;br /&gt;
M = (m_{x_{1}}, m_{x_{2}}, ..., m_{x_{n}})^T.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Требуется найти такую матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, которая позволяла бы получить искомый вектор &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; с требуемыми характеристиками в результате линейного преобразования &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — n-мерный случайный вектор с независимыми нормально распределенными компонентами со стандартными параметрами.&lt;br /&gt;
&lt;br /&gt;
Будем искать матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в виде нижней треугольной матрицы. Перейдем от матричной записи к системе алгебраических уравнений:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} X_{1} \\&lt;br /&gt;
 X_{2} \\ \vdots \\ X_{n} \end{pmatrix} =&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} b_{11} &amp;amp; 0 &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\b_{21} &amp;amp; b_{22} &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\ \vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \vdots&lt;br /&gt;
\\ b_{n1} &amp;amp; b_{n2} &amp;amp; \cdots &amp;amp; b_{nn}&lt;br /&gt;
\end{pmatrix} \times&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} Y_{1} \\&lt;br /&gt;
 Y_{2} \\ \vdots \\ Y_{n} \end{pmatrix} +&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} m_{x_{1}} \\&lt;br /&gt;
 m_{x_{2}} \\ \vdots \\ m_{x_{n}} \end{pmatrix} \Rightarrow&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}X_{1} - m_{x_{1}} = b_{11}Y_{1}&lt;br /&gt;
\\X_{2} - m_{x_{2}} = b_{21}Y_{1} + b_{22}Y_{2}&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\\X_{n} - m_{x_{n}} = b_{n1}Y_{1} + b_{n2}Y_{2} + \cdots + b_{nn}Y_{n}&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Поскольку компоненты вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; независимы и имеют стандартные параметры, справедливо выражение:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\mathbb{E}[Y_{i}Y_{j}] =&lt;br /&gt;
\left\{\begin{matrix} &lt;br /&gt;
1, &amp;amp;i = j, \\&lt;br /&gt;
0, &amp;amp;i \not= j.&lt;br /&gt;
\end{matrix}\right.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Почленно перемножив сами на себя и между собой соответственно левые и правые части уравнений системы и взяв от результатов перемножения математическое ожидание, получаем систему уравнений вида:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\mathbb{E}[(X_{1} - m_{x_{1}})(X_{1} - m_{x_{1}})] = \mathbb{E}[b_{11}Y_{1}b_{11}Y_{1}],&lt;br /&gt;
\\ \mathbb{E}[(X_{1} - m_{x_{1}})(X_{2} - m_{x_{2}})] = \mathbb{E}[(b_{21}Y_{1} + b_{22}Y_{2})b_{11}Y_{1}],&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, в левых частях полученной системы уравнений располагаются элементы заданной ковариационной матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;, а в правых — элементы искомой матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;. Последовательно решая эту систему, получаем формулы для расчета элементов &amp;lt;math&amp;gt;\sigma_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
b_{11}=\sqrt{\sigma_{11}}; b_{21}=\frac{\sigma_{12}}{\sqrt{\sigma_{11}}}; b_{22} = \sqrt{\sigma_{22} - \frac{\sigma_{12}}{\sigma_{11}}}, \cdots&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рекуррентная формула для расчета любого элемента матрицы преобразования &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b_{ij} = \frac {\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}} {\sqrt{\sigma_{ij} - \sum_{k=1}^{j-1} b_{jk}^2}}, \quad 1 \leqslant j \leqslant i \leqslant n&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(суммы с верхним нулевым пределом считаются равными нулю)&lt;br /&gt;
&lt;br /&gt;
Таким образом, матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; получается с помощью [[Разложение_Холецкого_(метод_квадратного_корня)|разложения Холецкого]] матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Генерация случайного вектора Y ====&lt;br /&gt;
&lt;br /&gt;
Пусть имеется генератор псевдослучайных чисел (ГПСЧ, PRNG), с помощью которого можно получить реализацию случайной величины &amp;lt;math&amp;gt;u \sim U(0,1) &amp;lt;/math&amp;gt;. Описанный выше случайный вектор &amp;lt;math&amp;gt;Y=(y_1, \cdots, y_n)&amp;lt;/math&amp;gt; с независимыми компонентами составим из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; реализаций случайной величины &amp;lt;math&amp;gt;\eta \sim N(0,1)&amp;lt;/math&amp;gt;. Каждую такую реализацию &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;, в свою очередь, получим с помощью приближения по ЦПТ &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; случайными величинами, распределенными равномерно на отрезке [0,1]:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right), \quad i = \overline{1, n} \\&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;u_j^i - &amp;lt;/math&amp;gt; реализации случайной величины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;\kappa - &amp;lt;/math&amp;gt; параметр, обеспечивающий качество приближения.&lt;br /&gt;
&lt;br /&gt;
Как правило, &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; берут равным 12 и считают, что для подавляющего числа практических задач обеспечивается должная точность вычислений&amp;lt;ref name = &amp;quot;VVV&amp;quot;&amp;gt;Балдин К.В., Уткин В.Б. Информационные системы в экономике. — М.:Дашков и Кo, 2008. — 395 с.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}, \quad 1 \leqslant j \leqslant i \leqslant n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;&lt;br /&gt;
* Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1) Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;b_{11}= \sqrt{\sigma_{11}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;b_{k1}= \frac{\sigma_{k1}}{l_{11}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad k = \overline{2,n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{2,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (c) &amp;lt;math&amp;gt;b_{ii} = \sqrt{\sigma_{ii} - \sum_{p = 1}^{i - 1} b_{ip}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (d) &amp;lt;math&amp;gt;b_{ji} = \frac{\sigma_{ji} - \sum_{p = 1}^{i - 1} b_{ip} b_{jp}} {l_{ii}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad i \neq n, j = \overline{i+1,n}&amp;lt;/math&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;u_j^i \leftarrow PRNG,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\quad j = \overline{1,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3) Вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i = m_{x_i} + \sum_{k = 1}^{i} b_{ik} y_{k}, \quad i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + \sum_{j=1}^{n-2}j(n-j-1) + n + \frac {n(n+1)}{2} =&lt;br /&gt;
  n(n+1) + \frac {n(n-1)(n-2)}{6}&amp;lt;/math&amp;gt; (умножений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + \sum_{j=1}^{n-2}j(n-j-1) + n =&lt;br /&gt;
  \frac {n(n+1)}{2} + \frac {n(n-1)(n-2)}{6}&amp;lt;/math&amp;gt; (вычитаний)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad (\kappa-1)n + \frac {n(n+1)}{2} = \frac {n(n-1+2\kappa)}{2}&amp;lt;/math&amp;gt; (сложений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + 2n = \frac {n(n+3)}{2}&amp;lt;/math&amp;gt; (делений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad n + n  = 2n &amp;lt;/math&amp;gt; (взятия квадратного корня)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{n}{6}\left(2n^2+9n+31+6\kappa\right) &amp;lt;/math&amp;gt; - итого операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
==== Заполнение матрицы B====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 1 макроструктуры алгоритма ([[Разложение_Холецкого_(метод_квадратного_корня)|&#039;&#039;разложения Холецкого&#039;&#039;]]) состоит из трёх групп вершин, расположенных в целочисленных узлах трёх областей разной размерности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин расположена в одномерной области, соответствующая ей операция вычисляет функцию SQRT. &lt;br /&gt;
Единственная координата каждой из вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргумент этой функции &lt;br /&gt;
	&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{11}&amp;lt;/math&amp;gt;; &lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ii}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин расположена в двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a / b&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;: &lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{j1}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1, j, i - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ji}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин расположена в трёхмерной области, соответствующая ей операция  &amp;lt;math&amp;gt;a - b * c&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; — меняется в диапазоне  от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;p = 1&amp;lt;/math&amp;gt; элемент входных данных &amp;lt;math&amp;gt;\sigma_{ji}&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;p &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i, j, p - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, i&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, j&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.1, выполненном для случая &amp;lt;math&amp;gt;n = 4&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
[[file:Cholesky full_in_out.png|thumb|center|1400px|Рисунок 1. Граф этапа 1 макроструктуры алгоритма. SQ — вычисление квадратного корня, F — операция a-bc, Div — деление, In — входные данные, Out — выходные.]]&lt;br /&gt;
&lt;br /&gt;
====Генерация вектора Y====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 2 макроструктуры алгоритма состоит из двух групп вершин, расположенных в целочисленных узлах двумерной области.&lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин. Соответствующая ей операция вычисляет функцию &amp;lt;math&amp;gt;S = a+b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a:&amp;lt;/math&amp;gt;&lt;br /&gt;
** при &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; — константа &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;j&amp;gt;1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатами &amp;lt;math&amp;gt;i,j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; — значение, поступающее с &amp;lt;math&amp;gt;PRNG&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин. Соответствующая ей операция вычисляет функцию &amp;lt;math&amp;gt;F = \left(a-\frac{\kappa}{2}\right)\sqrt{\frac{12}{\kappa}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; —  результат срабатывания операции, соответствующей вершине из первой группы, с координатами &amp;lt;math&amp;gt;i,\kappa&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; этапа &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.3, выполненном для случая &amp;lt;math&amp;gt;n = 2, \kappa = 2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf2.png|550px|thumb|center|Рисунок 3. Граф этапа 3 макроструктуры алгоритма]]&lt;br /&gt;
&lt;br /&gt;
====Вычисление вектора X====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 3 макроструктуры алгоритма (&#039;&#039;умножение нижней треугольной матрицы на вектор и сложение результата с другим вектором&#039;&#039;) состоит из одной группы вершин, расположенной в целочисленных узлах двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a+bc&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;j = 1&amp;lt;/math&amp;gt; — компонента &amp;lt;math&amp;gt;m_{x_i}&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;j &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине с координатами &amp;lt;math&amp;gt;i, j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;b_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;y_{j}&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является:&lt;br /&gt;
* при &amp;lt;math&amp;gt;j &amp;lt; i&amp;lt;/math&amp;gt; — &#039;&#039;промежуточным данным&#039;&#039; этапа;&lt;br /&gt;
* при &amp;lt;math&amp;gt;j = i&amp;lt;/math&amp;gt; — &#039;&#039;выходным данным&#039;&#039; алгоритма &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.3, выполненном для случая &amp;lt;math&amp;gt; n = 4&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf3.png|650px|thumb|center|Рисунок 3. Граф этапа 3 макроструктуры алгоритма,  F — операция a+bc]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для распараллеливания доступны следующие опции:&lt;br /&gt;
* вычисление элементов матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в рамках столбца (под диагональю),&lt;br /&gt;
* генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;,&lt;br /&gt;
* вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (умножение матрицы на вектор, сложение векторов).&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: вещественная всюду плотная положительно определенная симметрическая  &amp;lt;math&amp;gt;(n \times n)&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;\Sigma&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;
* Выходные данные: вещественный &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектор &amp;lt;math&amp;gt;X&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;syntaxhighlight lang = c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// compute matrix B (core)&lt;br /&gt;
for (int j = 0; j &amp;lt; n; j++){&lt;br /&gt;
    double sum_down = matrix_cov[j][j];&lt;br /&gt;
    for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
        double cur = matrix_cov[j][k];&lt;br /&gt;
        sum_down -= cur * cur;&lt;br /&gt;
    }&lt;br /&gt;
    matrix_cov[j][j] = sqrt(sum_down);&lt;br /&gt;
    for (int i = j + 1; i &amp;lt; n; i++){&lt;br /&gt;
        double sum_up = matrix_cov[i][j];&lt;br /&gt;
        for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
            sum_up -= matrix_cov[i][k] * matrix_cov[j][k];&lt;br /&gt;
        }&lt;br /&gt;
        matrix_cov[i][j] = sum_up / matrix_cov[j][j];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
// generate vector Y&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){&lt;br /&gt;
    double sum = generate_uniform(n);&lt;br /&gt;
    for (int j = 0; j &amp;lt; CLT_NUM - 1; j++){&lt;br /&gt;
        sum += generate_uniform(n);&lt;br /&gt;
    }&lt;br /&gt;
    vec_Y[i] = (sum - CLT_NUM / 2) * sqrt(12.0 / CLT_NUM);&lt;br /&gt;
}&lt;br /&gt;
// linear transformation&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){  &lt;br /&gt;
    vec_X[i] = vec_exp[i];&lt;br /&gt;
    for (int k = 0; k &amp;lt;= i; k++){&lt;br /&gt;
        vec_X[i] += matrix_cov[i][k] * vec_Y[k];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Алгоритм был реализован на языке C++ с использованием Intel MPI Library и запущен на кластере regular4.&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add impi/5.0.1&lt;br /&gt;
 mpicxx -std=c++0x task.c -o _scratch/task&lt;br /&gt;
 sbatch -n256 impi ./task &amp;lt;matrix_size&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
* размер матрицы [1024 : 4864] с шагом 256,&lt;br /&gt;
* число ядер [2 : 256] с шагом по степеням 2.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:Ops_2.png|thumb|center|700px|Рисунок 4. Изменение производительности в зависимости от числа ядер и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
[[file:Eff_2.png|thumb|center|700px|Рисунок 5. Изменение эффективности реализации в зависимости от числа ядер и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
[[file:Eff_2_up.png|thumb|center|700px|Рисунок 6. Изменение эффективности реализации, вид сверху.]]&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;По размеру задачи&#039;&#039;&#039; — при увеличении размерности матрицы эффективность реализации постепенно увеличивается, при этом тем быстрее, чем большее число ядер задействовано.&lt;br /&gt;
* &#039;&#039;&#039;По числу ядер&#039;&#039;&#039; — при увеличении числа mpi-процессов эффективность реализации снижается. Это объясняется ростом накладных расходов на организацию параллельного выполнения. При этом с ростом размерности матрицы эффективность снижается с такой же скоростью, но уже при больших значениях числа mpi-процессов.&lt;br /&gt;
* &#039;&#039;&#039;По двум направлениям&#039;&#039;&#039; — эффективность реализации возрастает, но крайне медленно.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/mensigo/skipod/blob/master/mpi_gauss_vec_gen.c Параллельная реализация на C++]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
MS Excel и распространённые статистические пакеты (напр., SPSS, Statistica) позволяют моделировать только одномерные статистические распределения. Имеется возможность &amp;quot;собрать&amp;quot; многомерное распределение из нескольких одномерных при условии, что компоненты независимы. Однако если необходимо исследовать данные с зависящими друг от друга переменными, то приходится писать собственную программу. При этом удобно воспользоваться готовой реализацией разложения Холецкого (точечного метода), представленной в таких прикладных пакетах, как LINPACK, LAPACK, SCALAPACK.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Lonalone</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26756</id>
		<title>Участник:Lonalone/Генерация гауссовского вектора методом линейных преобразований</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26756"/>
		<updated>2018-12-02T13:00:42Z</updated>

		<summary type="html">&lt;p&gt;Lonalone: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор описания: &#039;&#039;Меньших И. М.&#039;&#039;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из многомерных распределений особый интерес представляет нормальное. Этому закону подчиняются все результаты воздействия большого числа случайных факторов, среди которых нет превалирующих.&lt;br /&gt;
&lt;br /&gt;
В статье приведен алгоритм генерации n-мерного гауссовского случайного вектора с помощью &#039;&#039;метода линейных преобразований&#039;&#039;&amp;lt;ref name=&amp;quot;V&amp;quot;&amp;gt;(п. 1.10.4) Михайлов Г.А., Войтишек А.В. Численное статистическое моделирование. Методы Монте-Карло — М.: Академия, 2006. — 368 с.&amp;lt;/ref&amp;gt;. Известно, что случае нормально распределенного случайного вектора, ковариационная матрица вместе с математическим ожиданием этого вектора полностью определяют его распределение. Поэтому для полного статистического соответствия моделируемого и теоретического распределения гауссовского вектора достаточно обеспечить требуемые значения указанных параметров&amp;lt;ref name=&amp;quot;VV&amp;quot;&amp;gt; https://ru.wikipedia.org/wiki/Многомерное_нормальное_распределение&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея алгоритма заключается в линейном преобразовании n-мерного случайного вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, компоненты которого независимы и одинаково распределены по нормальному закону со стандартными параметрами, в случайный вектор &amp;lt;math&amp;gt;X&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;\Sigma&amp;lt;/math&amp;gt; и вектор математических ожиданий &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Sigma = \|\sigma_{ij}\| = \| \mathbb{E}[(X_{i} - m_{x_{i}})(X_{j} - m_{x_{j}})]\|, \\&lt;br /&gt;
M = (m_{x_{1}}, m_{x_{2}}, ..., m_{x_{n}})^T.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Требуется найти такую матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, которая позволяла бы получить искомый вектор &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; с требуемыми характеристиками в результате линейного преобразования &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — n-мерный случайный вектор с независимыми нормально распределенными компонентами со стандартными параметрами.&lt;br /&gt;
&lt;br /&gt;
Будем искать матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в виде нижней треугольной матрицы. Перейдем от матричной записи к системе алгебраических уравнений:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} X_{1} \\&lt;br /&gt;
 X_{2} \\ \vdots \\ X_{n} \end{pmatrix} =&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} b_{11} &amp;amp; 0 &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\b_{21} &amp;amp; b_{22} &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\ \vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \vdots&lt;br /&gt;
\\ b_{n1} &amp;amp; b_{n2} &amp;amp; \cdots &amp;amp; b_{nn}&lt;br /&gt;
\end{pmatrix} \times&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} Y_{1} \\&lt;br /&gt;
 Y_{2} \\ \vdots \\ Y_{n} \end{pmatrix} +&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} m_{x_{1}} \\&lt;br /&gt;
 m_{x_{2}} \\ \vdots \\ m_{x_{n}} \end{pmatrix} \Rightarrow&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}X_{1} - m_{x_{1}} = b_{11}Y_{1}&lt;br /&gt;
\\X_{2} - m_{x_{2}} = b_{21}Y_{1} + b_{22}Y_{2}&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\\X_{n} - m_{x_{n}} = b_{n1}Y_{1} + b_{n2}Y_{2} + \cdots + b_{nn}Y_{n}&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Поскольку компоненты вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; независимы и имеют стандартные параметры, справедливо выражение:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\mathbb{E}[Y_{i}Y_{j}] =&lt;br /&gt;
\left\{\begin{matrix} &lt;br /&gt;
1, &amp;amp;i = j, \\&lt;br /&gt;
0, &amp;amp;i \not= j.&lt;br /&gt;
\end{matrix}\right.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Почленно перемножив сами на себя и между собой соответственно левые и правые части уравнений системы и взяв от результатов перемножения математическое ожидание, получаем систему уравнений вида:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\mathbb{E}[(X_{1} - m_{x_{1}})(X_{1} - m_{x_{1}})] = \mathbb{E}[b_{11}Y_{1}b_{11}Y_{1}],&lt;br /&gt;
\\ \mathbb{E}[(X_{1} - m_{x_{1}})(X_{2} - m_{x_{2}})] = \mathbb{E}[(b_{21}Y_{1} + b_{22}Y_{2})b_{11}Y_{1}],&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, в левых частях полученной системы уравнений располагаются элементы заданной ковариационной матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;, а в правых — элементы искомой матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;. Последовательно решая эту систему, получаем формулы для расчета элементов &amp;lt;math&amp;gt;\sigma_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
b_{11}=\sqrt{\sigma_{11}}; b_{21}=\frac{\sigma_{12}}{\sqrt{\sigma_{11}}}; b_{22} = \sqrt{\sigma_{22} - \frac{\sigma_{12}}{\sigma_{11}}}, \cdots&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рекуррентная формула для расчета любого элемента матрицы преобразования &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b_{ij} = \frac {\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}} {\sqrt{\sigma_{ij} - \sum_{k=1}^{j-1} b_{jk}^2}}, \quad 1 \leqslant j \leqslant i \leqslant n&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(суммы с верхним нулевым пределом считаются равными нулю)&lt;br /&gt;
&lt;br /&gt;
Таким образом, матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; получается с помощью [[Разложение_Холецкого_(метод_квадратного_корня)|разложения Холецкого]] матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Генерация случайного вектора Y ====&lt;br /&gt;
&lt;br /&gt;
Пусть имеется генератор псевдослучайных чисел (ГПСЧ, PRNG), с помощью которого можно получить реализацию случайной величины &amp;lt;math&amp;gt;u \sim U(0,1) &amp;lt;/math&amp;gt;. Описанный выше случайный вектор &amp;lt;math&amp;gt;Y=(y_1, \cdots, y_n)&amp;lt;/math&amp;gt; с независимыми компонентами составим из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; реализаций случайной величины &amp;lt;math&amp;gt;\eta \sim N(0,1)&amp;lt;/math&amp;gt;. Каждую такую реализацию &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;, в свою очередь, получим с помощью приближения по ЦПТ &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; случайными величинами, распределенными равномерно на отрезке [0,1]:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right), \quad i = \overline{1, n} \\&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;u_j^i - &amp;lt;/math&amp;gt; реализации случайной величины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;\kappa - &amp;lt;/math&amp;gt; параметр, обеспечивающий качество приближения.&lt;br /&gt;
&lt;br /&gt;
Как правило, &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; берут равным 12 и считают, что для подавляющего числа практических задач обеспечивается должная точность вычислений&amp;lt;ref name = &amp;quot;VVV&amp;quot;&amp;gt;Балдин К.В., Уткин В.Б. Информационные системы в экономике. — М.:Дашков и Кo, 2008. — 395 с.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}, \quad 1 \leqslant j \leqslant i \leqslant n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;&lt;br /&gt;
* Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1) Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;b_{11}= \sqrt{\sigma_{11}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;b_{k1}= \frac{\sigma_{k1}}{l_{11}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad k = \overline{2,n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{2,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (c) &amp;lt;math&amp;gt;b_{ii} = \sqrt{\sigma_{ii} - \sum_{p = 1}^{i - 1} b_{ip}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (d) &amp;lt;math&amp;gt;b_{ji} = \frac{\sigma_{ji} - \sum_{p = 1}^{i - 1} b_{ip} b_{jp}} {l_{ii}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad i \neq n, j = \overline{i+1,n}&amp;lt;/math&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;u_j^i \leftarrow PRNG,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\quad j = \overline{1,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3) Вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i = m_{x_i} + \sum_{k = 1}^{i} b_{ik} y_{k}, \quad i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + \sum_{j=1}^{n-2}j(n-j-1) + n + \frac {n(n+1)}{2} =&lt;br /&gt;
  n(n+1) + \frac {n(n-1)(n-2)}{6}&amp;lt;/math&amp;gt; (умножений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + \sum_{j=1}^{n-2}j(n-j-1) + n =&lt;br /&gt;
  \frac {n(n+1)}{2} + \frac {n(n-1)(n-2)}{6}&amp;lt;/math&amp;gt; (вычитаний)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad (\kappa-1)n + \frac {n(n+1)}{2} = \frac {n(n-1+2\kappa)}{2}&amp;lt;/math&amp;gt; (сложений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + 2n = \frac {n(n+3)}{2}&amp;lt;/math&amp;gt; (делений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad n + n  = 2n &amp;lt;/math&amp;gt; (взятия квадратного корня)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{n}{6}\left(2n^2+9n+31+6\kappa\right) &amp;lt;/math&amp;gt; - итого операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
==== Заполнение матрицы B====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 1 макроструктуры алгоритма ([[Разложение_Холецкого_(метод_квадратного_корня)|&#039;&#039;разложения Холецкого&#039;&#039;]]) состоит из трёх групп вершин, расположенных в целочисленных узлах трёх областей разной размерности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин расположена в одномерной области, соответствующая ей операция вычисляет функцию SQRT. &lt;br /&gt;
Единственная координата каждой из вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргумент этой функции &lt;br /&gt;
	&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{11}&amp;lt;/math&amp;gt;; &lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ii}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин расположена в двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a / b&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;: &lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{j1}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1, j, i - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ji}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин расположена в трёхмерной области, соответствующая ей операция  &amp;lt;math&amp;gt;a - b * c&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; — меняется в диапазоне  от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;p = 1&amp;lt;/math&amp;gt; элемент входных данных &amp;lt;math&amp;gt;\sigma_{ji}&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;p &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i, j, p - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, i&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, j&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.1, выполненном для случая &amp;lt;math&amp;gt;n = 4&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
[[file:Cholesky full_in_out.png|thumb|center|1400px|Рисунок 1. Граф этапа 1 макроструктуры алгоритма. SQ — вычисление квадратного корня, F — операция a-bc, Div — деление, In — входные данные, Out — выходные.]]&lt;br /&gt;
&lt;br /&gt;
====Генерация вектора Y====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 2 макроструктуры алгоритма состоит из двух групп вершин, расположенных в целочисленных узлах двумерной области.&lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин. Соответствующая ей операция вычисляет функцию &amp;lt;math&amp;gt;S = a+b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a:&amp;lt;/math&amp;gt;&lt;br /&gt;
** при &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; — константа &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;j&amp;gt;1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатами &amp;lt;math&amp;gt;i,j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; — значение, поступающее с &amp;lt;math&amp;gt;PRNG&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин. Соответствующая ей операция вычисляет функцию &amp;lt;math&amp;gt;F = \left(a-\frac{\kappa}{2}\right)\sqrt{\frac{12}{\kappa}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; —  результат срабатывания операции, соответствующей вершине из первой группы, с координатами &amp;lt;math&amp;gt;i,\kappa&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; этапа &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.3, выполненном для случая &amp;lt;math&amp;gt;n = 2, \kappa = 2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf2.png|550px|thumb|center|Рисунок 3. Граф этапа 3 макроструктуры алгоритма]]&lt;br /&gt;
&lt;br /&gt;
====Вычисление вектора X====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 3 макроструктуры алгоритма (&#039;&#039;умножение нижней треугольной матрицы на вектор и сложение результата с другим вектором&#039;&#039;) состоит из одной группы вершин, расположенной в целочисленных узлах двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a+bc&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;j = 1&amp;lt;/math&amp;gt; — компонента &amp;lt;math&amp;gt;m_{x_i}&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;j &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине с координатами &amp;lt;math&amp;gt;i, j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;b_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;y_{j}&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является:&lt;br /&gt;
* при &amp;lt;math&amp;gt;j &amp;lt; i&amp;lt;/math&amp;gt; — &#039;&#039;промежуточным данным&#039;&#039; этапа;&lt;br /&gt;
* при &amp;lt;math&amp;gt;j = i&amp;lt;/math&amp;gt; — &#039;&#039;выходным данным&#039;&#039; алгоритма &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.3, выполненном для случая &amp;lt;math&amp;gt; n = 4&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf3.png|650px|thumb|center|Рисунок 3. Граф этапа 3 макроструктуры алгоритма,  F — операция a+bc]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для распараллеливания доступны следующие опции:&lt;br /&gt;
* вычисление элементов матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в рамках столбца (под диагональю),&lt;br /&gt;
* генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;,&lt;br /&gt;
* вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (умножение матрицы на вектор, сложение векторов).&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: вещественная всюду плотная положительно определенная симметрическая  &amp;lt;math&amp;gt;(n \times n)&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;\Sigma&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;
* Выходные данные: вещественный &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектор &amp;lt;math&amp;gt;X&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;syntaxhighlight lang = c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// compute matrix B (core)&lt;br /&gt;
for (int j = 0; j &amp;lt; n; j++){&lt;br /&gt;
    double sum_down = matrix_cov[j][j];&lt;br /&gt;
    for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
        double cur = matrix_cov[j][k];&lt;br /&gt;
        sum_down -= cur * cur;&lt;br /&gt;
    }&lt;br /&gt;
    matrix_cov[j][j] = sqrt(sum_down);&lt;br /&gt;
    for (int i = j + 1; i &amp;lt; n; i++){&lt;br /&gt;
        double sum_up = matrix_cov[i][j];&lt;br /&gt;
        for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
            sum_up -= matrix_cov[i][k] * matrix_cov[j][k];&lt;br /&gt;
        }&lt;br /&gt;
        matrix_cov[i][j] = sum_up / matrix_cov[j][j];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
// generate vector Y&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){&lt;br /&gt;
    double sum = generate_uniform(n);&lt;br /&gt;
    for (int j = 0; j &amp;lt; CLT_NUM - 1; j++){&lt;br /&gt;
        sum += generate_uniform(n);&lt;br /&gt;
    }&lt;br /&gt;
    vec_Y[i] = (sum - CLT_NUM / 2) * sqrt(12.0 / CLT_NUM);&lt;br /&gt;
}&lt;br /&gt;
// linear transformation&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){  &lt;br /&gt;
    vec_X[i] = vec_exp[i];&lt;br /&gt;
    for (int k = 0; k &amp;lt;= i; k++){&lt;br /&gt;
        vec_X[i] += matrix_cov[i][k] * vec_Y[k];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Алгоритм был реализован на языке C++ с использованием Intel MPI Library и запущен на кластере regular4.&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add impi/5.0.1&lt;br /&gt;
 mpicxx -std=c++0x task.c -o _scratch/task&lt;br /&gt;
 sbatch -n256 impi ./task &amp;lt;matrix_size&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
* размер матрицы [1024 : 4864] с шагом 256,&lt;br /&gt;
* число ядер [2 : 256] с шагом по степеням 2.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:Ops_2.png|thumb|center|700px|Рисунок 4. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
[[file:Eff_2.png|thumb|center|700px|Рисунок 5. Изменение эффективности реализации в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
[[file:Eff_2_up.png|thumb|center|700px|Рисунок 6. Изменение эффективности реализации, вид сверху.]]&lt;br /&gt;
&lt;br /&gt;
[[file:05.png|thumb|center|700px|Рисунок 7. Изменение эффективности распараллеливания в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
Проведем оценки масштабируемости:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;По размеру задачи&#039;&#039;&#039; — при увеличении размерности матрицы эффективность реализации постепенно увеличивается, при этом тем быстрее, чем большее число процессов используется.&lt;br /&gt;
* &#039;&#039;&#039;По числу mpi-процессов&#039;&#039;&#039; — при увеличении числа процессов эффективность реализации падает. Это объясняется ростом накладных расходов на организацию параллельного выполнения. С ростом вычислительной сложности задачи эффективность снижается так же быстро, но при больших значениях числа mpi-процессов.&lt;br /&gt;
* &#039;&#039;&#039;По двум направлениям&#039;&#039;&#039; — эффективность реализации возрастает, но медленно и с небольшими перепадам.&lt;br /&gt;
&lt;br /&gt;
[http://git.algowiki-project.org/Teplov/Scalability/tree/master/abc Параллельная реализация на C++]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
MS Excel и распространённые статистические пакеты (напр., SPSS, Statistica) позволяют моделировать только одномерные статистические распределения. Имеется возможность &amp;quot;собрать&amp;quot; многомерное распределение из нескольких одномерных при условии, что компоненты независимы. Однако если необходимо исследовать данные с зависящими друг от друга переменными, то приходится писать собственную программу. При этом удобно воспользоваться готовой реализацией разложения Холецкого (точечного метода), представленной в таких прикладных пакетах, как LINPACK, LAPACK, SCALAPACK.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Lonalone</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26755</id>
		<title>Участник:Lonalone/Генерация гауссовского вектора методом линейных преобразований</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26755"/>
		<updated>2018-12-01T21:45:55Z</updated>

		<summary type="html">&lt;p&gt;Lonalone: /* Вычисление вектора X */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор описания: &#039;&#039;Меньших И. М.&#039;&#039;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из многомерных распределений особый интерес представляет нормальное. Этому закону подчиняются все результаты воздействия большого числа случайных факторов, среди которых нет превалирующих.&lt;br /&gt;
&lt;br /&gt;
В статье приведен алгоритм генерации n-мерного гауссовского случайного вектора с помощью &#039;&#039;метода линейных преобразований&#039;&#039;&amp;lt;ref name=&amp;quot;V&amp;quot;&amp;gt;(п. 1.10.4) Михайлов Г.А., Войтишек А.В. Численное статистическое моделирование. Методы Монте-Карло — М.: Академия, 2006. — 368 с.&amp;lt;/ref&amp;gt;. Известно, что случае нормально распределенного случайного вектора, ковариационная матрица вместе с математическим ожиданием этого вектора полностью определяют его распределение. Поэтому для полного статистического соответствия моделируемого и теоретического распределения гауссовского вектора достаточно обеспечить требуемые значения указанных параметров&amp;lt;ref name=&amp;quot;VV&amp;quot;&amp;gt; https://ru.wikipedia.org/wiki/Многомерное_нормальное_распределение&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея алгоритма заключается в линейном преобразовании n-мерного случайного вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, компоненты которого независимы и одинаково распределены по нормальному закону со стандартными параметрами, в случайный вектор &amp;lt;math&amp;gt;X&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;\Sigma&amp;lt;/math&amp;gt; и вектор математических ожиданий &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Sigma = \|\sigma_{ij}\| = \| \mathbb{E}[(X_{i} - m_{x_{i}})(X_{j} - m_{x_{j}})]\|, \\&lt;br /&gt;
M = (m_{x_{1}}, m_{x_{2}}, ..., m_{x_{n}})^T.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Требуется найти такую матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, которая позволяла бы получить искомый вектор &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; с требуемыми характеристиками в результате линейного преобразования &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — n-мерный случайный вектор с независимыми нормально распределенными компонентами со стандартными параметрами.&lt;br /&gt;
&lt;br /&gt;
Будем искать матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в виде нижней треугольной матрицы. Перейдем от матричной записи к системе алгебраических уравнений:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} X_{1} \\&lt;br /&gt;
 X_{2} \\ \vdots \\ X_{n} \end{pmatrix} =&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} b_{11} &amp;amp; 0 &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\b_{21} &amp;amp; b_{22} &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\ \vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \vdots&lt;br /&gt;
\\ b_{n1} &amp;amp; b_{n2} &amp;amp; \cdots &amp;amp; b_{nn}&lt;br /&gt;
\end{pmatrix} \times&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} Y_{1} \\&lt;br /&gt;
 Y_{2} \\ \vdots \\ Y_{n} \end{pmatrix} +&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} m_{x_{1}} \\&lt;br /&gt;
 m_{x_{2}} \\ \vdots \\ m_{x_{n}} \end{pmatrix} \Rightarrow&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}X_{1} - m_{x_{1}} = b_{11}Y_{1}&lt;br /&gt;
\\X_{2} - m_{x_{2}} = b_{21}Y_{1} + b_{22}Y_{2}&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\\X_{n} - m_{x_{n}} = b_{n1}Y_{1} + b_{n2}Y_{2} + \cdots + b_{nn}Y_{n}&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Поскольку компоненты вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; независимы и имеют стандартные параметры, справедливо выражение:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\mathbb{E}[Y_{i}Y_{j}] =&lt;br /&gt;
\left\{\begin{matrix} &lt;br /&gt;
1, &amp;amp;i = j, \\&lt;br /&gt;
0, &amp;amp;i \not= j.&lt;br /&gt;
\end{matrix}\right.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Почленно перемножив сами на себя и между собой соответственно левые и правые части уравнений системы и взяв от результатов перемножения математическое ожидание, получаем систему уравнений вида:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\mathbb{E}[(X_{1} - m_{x_{1}})(X_{1} - m_{x_{1}})] = \mathbb{E}[b_{11}Y_{1}b_{11}Y_{1}],&lt;br /&gt;
\\ \mathbb{E}[(X_{1} - m_{x_{1}})(X_{2} - m_{x_{2}})] = \mathbb{E}[(b_{21}Y_{1} + b_{22}Y_{2})b_{11}Y_{1}],&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, в левых частях полученной системы уравнений располагаются элементы заданной ковариационной матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;, а в правых — элементы искомой матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;. Последовательно решая эту систему, получаем формулы для расчета элементов &amp;lt;math&amp;gt;\sigma_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
b_{11}=\sqrt{\sigma_{11}}; b_{21}=\frac{\sigma_{12}}{\sqrt{\sigma_{11}}}; b_{22} = \sqrt{\sigma_{22} - \frac{\sigma_{12}}{\sigma_{11}}}, \cdots&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рекуррентная формула для расчета любого элемента матрицы преобразования &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b_{ij} = \frac {\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}} {\sqrt{\sigma_{ij} - \sum_{k=1}^{j-1} b_{jk}^2}}, \quad 1 \leqslant j \leqslant i \leqslant n&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(суммы с верхним нулевым пределом считаются равными нулю)&lt;br /&gt;
&lt;br /&gt;
Таким образом, матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; получается с помощью [[Разложение_Холецкого_(метод_квадратного_корня)|разложения Холецкого]] матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Генерация случайного вектора Y ====&lt;br /&gt;
&lt;br /&gt;
Пусть имеется генератор псевдослучайных чисел (ГПСЧ, PRNG), с помощью которого можно получить реализацию случайной величины &amp;lt;math&amp;gt;u \sim U(0,1) &amp;lt;/math&amp;gt;. Описанный выше случайный вектор &amp;lt;math&amp;gt;Y=(y_1, \cdots, y_n)&amp;lt;/math&amp;gt; с независимыми компонентами составим из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; реализаций случайной величины &amp;lt;math&amp;gt;\eta \sim N(0,1)&amp;lt;/math&amp;gt;. Каждую такую реализацию &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;, в свою очередь, получим с помощью приближения по ЦПТ &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; случайными величинами, распределенными равномерно на отрезке [0,1]:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right), \quad i = \overline{1, n} \\&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;u_j^i - &amp;lt;/math&amp;gt; реализации случайной величины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;\kappa - &amp;lt;/math&amp;gt; параметр, обеспечивающий качество приближения.&lt;br /&gt;
&lt;br /&gt;
Как правило, &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; берут равным 12 и считают, что для подавляющего числа практических задач обеспечивается должная точность вычислений&amp;lt;ref name = &amp;quot;VVV&amp;quot;&amp;gt;Балдин К.В., Уткин В.Б. Информационные системы в экономике. — М.:Дашков и Кo, 2008. — 395 с.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}, \quad 1 \leqslant j \leqslant i \leqslant n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;&lt;br /&gt;
* Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1) Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;b_{11}= \sqrt{\sigma_{11}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;b_{k1}= \frac{\sigma_{k1}}{l_{11}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad k = \overline{2,n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{2,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (c) &amp;lt;math&amp;gt;b_{ii} = \sqrt{\sigma_{ii} - \sum_{p = 1}^{i - 1} b_{ip}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (d) &amp;lt;math&amp;gt;b_{ji} = \frac{\sigma_{ji} - \sum_{p = 1}^{i - 1} b_{ip} b_{jp}} {l_{ii}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad i \neq n, j = \overline{i+1,n}&amp;lt;/math&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;u_j^i \leftarrow PRNG,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\quad j = \overline{1,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3) Вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i = m_{x_i} + \sum_{k = 1}^{i} b_{ik} y_{k}, \quad i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + \sum_{j=1}^{n-2}j(n-j-1) + n + \frac {n(n+1)}{2} =&lt;br /&gt;
  n(n+1) + \frac {n(n-1)(n-2)}{6}&amp;lt;/math&amp;gt; (умножений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + \sum_{j=1}^{n-2}j(n-j-1) + n =&lt;br /&gt;
  \frac {n(n+1)}{2} + \frac {n(n-1)(n-2)}{6}&amp;lt;/math&amp;gt; (вычитаний)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad (\kappa-1)n + \frac {n(n+1)}{2} = \frac {n(n-1+2\kappa)}{2}&amp;lt;/math&amp;gt; (сложений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + 2n = \frac {n(n+3)}{2}&amp;lt;/math&amp;gt; (делений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad n + n  = 2n &amp;lt;/math&amp;gt; (взятия квадратного корня)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{n}{6}\left(2n^2+9n+31+6\kappa\right) &amp;lt;/math&amp;gt; - итого операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
==== Заполнение матрицы B====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 1 макроструктуры алгоритма ([[Разложение_Холецкого_(метод_квадратного_корня)|&#039;&#039;разложения Холецкого&#039;&#039;]]) состоит из трёх групп вершин, расположенных в целочисленных узлах трёх областей разной размерности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин расположена в одномерной области, соответствующая ей операция вычисляет функцию SQRT. &lt;br /&gt;
Единственная координата каждой из вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргумент этой функции &lt;br /&gt;
	&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{11}&amp;lt;/math&amp;gt;; &lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ii}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин расположена в двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a / b&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;: &lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{j1}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1, j, i - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ji}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин расположена в трёхмерной области, соответствующая ей операция  &amp;lt;math&amp;gt;a - b * c&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; — меняется в диапазоне  от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;p = 1&amp;lt;/math&amp;gt; элемент входных данных &amp;lt;math&amp;gt;\sigma_{ji}&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;p &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i, j, p - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, i&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, j&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.1, выполненном для случая &amp;lt;math&amp;gt;n = 4&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
[[file:Cholesky full_in_out.png|thumb|center|1400px|Рисунок 1. Граф этапа 1 макроструктуры алгоритма. SQ — вычисление квадратного корня, F — операция a-bc, Div — деление, In — входные данные, Out — выходные.]]&lt;br /&gt;
&lt;br /&gt;
====Генерация вектора Y====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 2 макроструктуры алгоритма состоит из двух групп вершин, расположенных в целочисленных узлах двумерной области.&lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин. Соответствующая ей операция вычисляет функцию &amp;lt;math&amp;gt;S = a+b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a:&amp;lt;/math&amp;gt;&lt;br /&gt;
** при &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; — константа &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;j&amp;gt;1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатами &amp;lt;math&amp;gt;i,j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; — значение, поступающее с &amp;lt;math&amp;gt;PRNG&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин. Соответствующая ей операция вычисляет функцию &amp;lt;math&amp;gt;F = \left(a-\frac{\kappa}{2}\right)\sqrt{\frac{12}{\kappa}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; —  результат срабатывания операции, соответствующей вершине из первой группы, с координатами &amp;lt;math&amp;gt;i,\kappa&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; этапа &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.3, выполненном для случая &amp;lt;math&amp;gt;n = 2, \kappa = 2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf2.png|550px|thumb|center|Рисунок 3. Граф этапа 3 макроструктуры алгоритма]]&lt;br /&gt;
&lt;br /&gt;
====Вычисление вектора X====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 3 макроструктуры алгоритма (&#039;&#039;умножение нижней треугольной матрицы на вектор и сложение результата с другим вектором&#039;&#039;) состоит из одной группы вершин, расположенной в целочисленных узлах двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a+bc&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;j = 1&amp;lt;/math&amp;gt; — компонента &amp;lt;math&amp;gt;m_{x_i}&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;j &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине с координатами &amp;lt;math&amp;gt;i, j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;b_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;y_{j}&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является:&lt;br /&gt;
* при &amp;lt;math&amp;gt;j &amp;lt; i&amp;lt;/math&amp;gt; — &#039;&#039;промежуточным данным&#039;&#039; этапа;&lt;br /&gt;
* при &amp;lt;math&amp;gt;j = i&amp;lt;/math&amp;gt; — &#039;&#039;выходным данным&#039;&#039; алгоритма &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.3, выполненном для случая &amp;lt;math&amp;gt; n = 4&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf3.png|650px|thumb|center|Рисунок 3. Граф этапа 3 макроструктуры алгоритма,  F — операция a+bc]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для распараллеливания доступны следующие опции:&lt;br /&gt;
* вычисление элементов матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в рамках столбца (под диагональю),&lt;br /&gt;
* генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;,&lt;br /&gt;
* вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (умножение матрицы на вектор, сложение векторов).&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: вещественная всюду плотная положительно определенная симметрическая  &amp;lt;math&amp;gt;(n \times n)&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;\Sigma&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;
* Выходные данные: вещественный &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектор &amp;lt;math&amp;gt;X&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;syntaxhighlight lang = c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// compute matrix B (core)&lt;br /&gt;
for (int j = 0; j &amp;lt; n; j++){&lt;br /&gt;
    double sum_down = matrix_cov[j][j];&lt;br /&gt;
    for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
        double cur = matrix_cov[j][k];&lt;br /&gt;
        sum_down -= cur * cur;&lt;br /&gt;
    }&lt;br /&gt;
    matrix_cov[j][j] = sqrt(sum_down);&lt;br /&gt;
    for (int i = j + 1; i &amp;lt; n; i++){&lt;br /&gt;
        double sum_up = matrix_cov[i][j];&lt;br /&gt;
        for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
            sum_up -= matrix_cov[i][k] * matrix_cov[j][k];&lt;br /&gt;
        }&lt;br /&gt;
        matrix_cov[i][j] = sum_up / matrix_cov[j][j];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
// generate vector Y&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){&lt;br /&gt;
    double sum = generate_uniform(n);&lt;br /&gt;
    for (int j = 0; j &amp;lt; CLT_NUM - 1; j++){&lt;br /&gt;
        sum += generate_uniform(n);&lt;br /&gt;
    }&lt;br /&gt;
    vec_Y[i] = (sum - CLT_NUM / 2) * sqrt(12.0 / CLT_NUM);&lt;br /&gt;
}&lt;br /&gt;
// linear transformation&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){  &lt;br /&gt;
    vec_X[i] = vec_exp[i];&lt;br /&gt;
    for (int k = 0; k &amp;lt;= i; k++){&lt;br /&gt;
        vec_X[i] += matrix_cov[i][k] * vec_Y[k];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Алгоритм был реализован на языке C++ с использованием Intel MPI Library и запущен на кластере regular4.&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add impi/5.0.1&lt;br /&gt;
 mpicxx -std=c++0x task.c -o _scratch/task&lt;br /&gt;
 sbatch -n256 impi ./task &amp;lt;matrix_size&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
* размер матрицы [1024 : 4864] с шагом 256,&lt;br /&gt;
* число ядер [2 : 256] с шагом-умножением в 2 раза.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:Ops_2.png|thumb|center|700px|Рисунок 4. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
Проведем оценки масштабируемости:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;По размеру задачи&#039;&#039;&#039; — при увеличении размерности матрицы [[Глоссарий#Эффективность реализации|эффективность реализации]] постепенно уменьшается. Это связано с тем, что время чтения и подготовки исходных данных растёт быстрее, чем время работы исследуемого алгоритма.&lt;br /&gt;
* &#039;&#039;&#039;По числу процессов&#039;&#039;&#039; - при увеличении числа процессов [[Глоссарий#Эффективность реализации|эффективность реализации]] увеличивается. Это связано с тем, что время чтения и подготовки исходной матрицы остаётся неизменным, а время работы алгоритма уменьшается, однако рост незначительный.&lt;br /&gt;
* При одновременном увеличении числа процессов и размерности матрицы [[Глоссарий#Эффективность реализации|эффективность реализации]] уменьшается.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
MS Excel и распространённые статистические пакеты (напр., SPSS, Statistica) позволяют моделировать только одномерные статистические распределения. Имеется возможность &amp;quot;собрать&amp;quot; многомерное распределение из нескольких одномерных при условии, что компоненты независимы. Однако если необходимо исследовать данные с зависящими друг от друга переменными, то приходится писать собственную программу. При этом удобно воспользоваться готовой реализацией разложения Холецкого (точечного метода), представленной в таких прикладных пакетах, как LINPACK, LAPACK, SCALAPACK.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Lonalone</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26754</id>
		<title>Участник:Lonalone/Генерация гауссовского вектора методом линейных преобразований</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26754"/>
		<updated>2018-12-01T21:36:32Z</updated>

		<summary type="html">&lt;p&gt;Lonalone: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор описания: &#039;&#039;Меньших И. М.&#039;&#039;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из многомерных распределений особый интерес представляет нормальное. Этому закону подчиняются все результаты воздействия большого числа случайных факторов, среди которых нет превалирующих.&lt;br /&gt;
&lt;br /&gt;
В статье приведен алгоритм генерации n-мерного гауссовского случайного вектора с помощью &#039;&#039;метода линейных преобразований&#039;&#039;&amp;lt;ref name=&amp;quot;V&amp;quot;&amp;gt;(п. 1.10.4) Михайлов Г.А., Войтишек А.В. Численное статистическое моделирование. Методы Монте-Карло — М.: Академия, 2006. — 368 с.&amp;lt;/ref&amp;gt;. Известно, что случае нормально распределенного случайного вектора, ковариационная матрица вместе с математическим ожиданием этого вектора полностью определяют его распределение. Поэтому для полного статистического соответствия моделируемого и теоретического распределения гауссовского вектора достаточно обеспечить требуемые значения указанных параметров&amp;lt;ref name=&amp;quot;VV&amp;quot;&amp;gt; https://ru.wikipedia.org/wiki/Многомерное_нормальное_распределение&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея алгоритма заключается в линейном преобразовании n-мерного случайного вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, компоненты которого независимы и одинаково распределены по нормальному закону со стандартными параметрами, в случайный вектор &amp;lt;math&amp;gt;X&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;\Sigma&amp;lt;/math&amp;gt; и вектор математических ожиданий &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Sigma = \|\sigma_{ij}\| = \| \mathbb{E}[(X_{i} - m_{x_{i}})(X_{j} - m_{x_{j}})]\|, \\&lt;br /&gt;
M = (m_{x_{1}}, m_{x_{2}}, ..., m_{x_{n}})^T.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Требуется найти такую матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, которая позволяла бы получить искомый вектор &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; с требуемыми характеристиками в результате линейного преобразования &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — n-мерный случайный вектор с независимыми нормально распределенными компонентами со стандартными параметрами.&lt;br /&gt;
&lt;br /&gt;
Будем искать матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в виде нижней треугольной матрицы. Перейдем от матричной записи к системе алгебраических уравнений:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} X_{1} \\&lt;br /&gt;
 X_{2} \\ \vdots \\ X_{n} \end{pmatrix} =&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} b_{11} &amp;amp; 0 &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\b_{21} &amp;amp; b_{22} &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\ \vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \vdots&lt;br /&gt;
\\ b_{n1} &amp;amp; b_{n2} &amp;amp; \cdots &amp;amp; b_{nn}&lt;br /&gt;
\end{pmatrix} \times&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} Y_{1} \\&lt;br /&gt;
 Y_{2} \\ \vdots \\ Y_{n} \end{pmatrix} +&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} m_{x_{1}} \\&lt;br /&gt;
 m_{x_{2}} \\ \vdots \\ m_{x_{n}} \end{pmatrix} \Rightarrow&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}X_{1} - m_{x_{1}} = b_{11}Y_{1}&lt;br /&gt;
\\X_{2} - m_{x_{2}} = b_{21}Y_{1} + b_{22}Y_{2}&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\\X_{n} - m_{x_{n}} = b_{n1}Y_{1} + b_{n2}Y_{2} + \cdots + b_{nn}Y_{n}&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Поскольку компоненты вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; независимы и имеют стандартные параметры, справедливо выражение:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\mathbb{E}[Y_{i}Y_{j}] =&lt;br /&gt;
\left\{\begin{matrix} &lt;br /&gt;
1, &amp;amp;i = j, \\&lt;br /&gt;
0, &amp;amp;i \not= j.&lt;br /&gt;
\end{matrix}\right.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Почленно перемножив сами на себя и между собой соответственно левые и правые части уравнений системы и взяв от результатов перемножения математическое ожидание, получаем систему уравнений вида:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\mathbb{E}[(X_{1} - m_{x_{1}})(X_{1} - m_{x_{1}})] = \mathbb{E}[b_{11}Y_{1}b_{11}Y_{1}],&lt;br /&gt;
\\ \mathbb{E}[(X_{1} - m_{x_{1}})(X_{2} - m_{x_{2}})] = \mathbb{E}[(b_{21}Y_{1} + b_{22}Y_{2})b_{11}Y_{1}],&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, в левых частях полученной системы уравнений располагаются элементы заданной ковариационной матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;, а в правых — элементы искомой матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;. Последовательно решая эту систему, получаем формулы для расчета элементов &amp;lt;math&amp;gt;\sigma_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
b_{11}=\sqrt{\sigma_{11}}; b_{21}=\frac{\sigma_{12}}{\sqrt{\sigma_{11}}}; b_{22} = \sqrt{\sigma_{22} - \frac{\sigma_{12}}{\sigma_{11}}}, \cdots&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рекуррентная формула для расчета любого элемента матрицы преобразования &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b_{ij} = \frac {\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}} {\sqrt{\sigma_{ij} - \sum_{k=1}^{j-1} b_{jk}^2}}, \quad 1 \leqslant j \leqslant i \leqslant n&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(суммы с верхним нулевым пределом считаются равными нулю)&lt;br /&gt;
&lt;br /&gt;
Таким образом, матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; получается с помощью [[Разложение_Холецкого_(метод_квадратного_корня)|разложения Холецкого]] матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Генерация случайного вектора Y ====&lt;br /&gt;
&lt;br /&gt;
Пусть имеется генератор псевдослучайных чисел (ГПСЧ, PRNG), с помощью которого можно получить реализацию случайной величины &amp;lt;math&amp;gt;u \sim U(0,1) &amp;lt;/math&amp;gt;. Описанный выше случайный вектор &amp;lt;math&amp;gt;Y=(y_1, \cdots, y_n)&amp;lt;/math&amp;gt; с независимыми компонентами составим из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; реализаций случайной величины &amp;lt;math&amp;gt;\eta \sim N(0,1)&amp;lt;/math&amp;gt;. Каждую такую реализацию &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;, в свою очередь, получим с помощью приближения по ЦПТ &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; случайными величинами, распределенными равномерно на отрезке [0,1]:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right), \quad i = \overline{1, n} \\&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;u_j^i - &amp;lt;/math&amp;gt; реализации случайной величины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;\kappa - &amp;lt;/math&amp;gt; параметр, обеспечивающий качество приближения.&lt;br /&gt;
&lt;br /&gt;
Как правило, &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; берут равным 12 и считают, что для подавляющего числа практических задач обеспечивается должная точность вычислений&amp;lt;ref name = &amp;quot;VVV&amp;quot;&amp;gt;Балдин К.В., Уткин В.Б. Информационные системы в экономике. — М.:Дашков и Кo, 2008. — 395 с.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}, \quad 1 \leqslant j \leqslant i \leqslant n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;&lt;br /&gt;
* Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1) Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;b_{11}= \sqrt{\sigma_{11}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;b_{k1}= \frac{\sigma_{k1}}{l_{11}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad k = \overline{2,n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{2,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (c) &amp;lt;math&amp;gt;b_{ii} = \sqrt{\sigma_{ii} - \sum_{p = 1}^{i - 1} b_{ip}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (d) &amp;lt;math&amp;gt;b_{ji} = \frac{\sigma_{ji} - \sum_{p = 1}^{i - 1} b_{ip} b_{jp}} {l_{ii}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad i \neq n, j = \overline{i+1,n}&amp;lt;/math&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;u_j^i \leftarrow PRNG,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\quad j = \overline{1,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3) Вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i = m_{x_i} + \sum_{k = 1}^{i} b_{ik} y_{k}, \quad i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + \sum_{j=1}^{n-2}j(n-j-1) + n + \frac {n(n+1)}{2} =&lt;br /&gt;
  n(n+1) + \frac {n(n-1)(n-2)}{6}&amp;lt;/math&amp;gt; (умножений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + \sum_{j=1}^{n-2}j(n-j-1) + n =&lt;br /&gt;
  \frac {n(n+1)}{2} + \frac {n(n-1)(n-2)}{6}&amp;lt;/math&amp;gt; (вычитаний)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad (\kappa-1)n + \frac {n(n+1)}{2} = \frac {n(n-1+2\kappa)}{2}&amp;lt;/math&amp;gt; (сложений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + 2n = \frac {n(n+3)}{2}&amp;lt;/math&amp;gt; (делений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad n + n  = 2n &amp;lt;/math&amp;gt; (взятия квадратного корня)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{n}{6}\left(2n^2+9n+31+6\kappa\right) &amp;lt;/math&amp;gt; - итого операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
==== Заполнение матрицы B====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 1 макроструктуры алгоритма ([[Разложение_Холецкого_(метод_квадратного_корня)|&#039;&#039;разложения Холецкого&#039;&#039;]]) состоит из трёх групп вершин, расположенных в целочисленных узлах трёх областей разной размерности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин расположена в одномерной области, соответствующая ей операция вычисляет функцию SQRT. &lt;br /&gt;
Единственная координата каждой из вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргумент этой функции &lt;br /&gt;
	&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{11}&amp;lt;/math&amp;gt;; &lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ii}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин расположена в двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a / b&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;: &lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{j1}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1, j, i - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ji}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин расположена в трёхмерной области, соответствующая ей операция  &amp;lt;math&amp;gt;a - b * c&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; — меняется в диапазоне  от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;p = 1&amp;lt;/math&amp;gt; элемент входных данных &amp;lt;math&amp;gt;\sigma_{ji}&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;p &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i, j, p - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, i&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, j&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.1, выполненном для случая &amp;lt;math&amp;gt;n = 4&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
[[file:Cholesky full_in_out.png|thumb|center|1400px|Рисунок 1. Граф этапа 1 макроструктуры алгоритма. SQ — вычисление квадратного корня, F — операция a-bc, Div — деление, In — входные данные, Out — выходные.]]&lt;br /&gt;
&lt;br /&gt;
====Генерация вектора Y====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 2 макроструктуры алгоритма состоит из двух групп вершин, расположенных в целочисленных узлах двумерной области.&lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин. Соответствующая ей операция вычисляет функцию &amp;lt;math&amp;gt;S = a+b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a:&amp;lt;/math&amp;gt;&lt;br /&gt;
** при &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; — константа &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;j&amp;gt;1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатами &amp;lt;math&amp;gt;i,j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; — значение, поступающее с &amp;lt;math&amp;gt;PRNG&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин. Соответствующая ей операция вычисляет функцию &amp;lt;math&amp;gt;F = \left(a-\frac{\kappa}{2}\right)\sqrt{\frac{12}{\kappa}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; —  результат срабатывания операции, соответствующей вершине из первой группы, с координатами &amp;lt;math&amp;gt;i,\kappa&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; этапа &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.3, выполненном для случая &amp;lt;math&amp;gt;n = 2, \kappa = 2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf2.png|550px|thumb|center|Рисунок 3. Граф этапа 3 макроструктуры алгоритма]]&lt;br /&gt;
&lt;br /&gt;
====Вычисление вектора X====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 3 макроструктуры алгоритма (&#039;&#039;умножение нижней треугольной матрицы на вектор и сложение результата с другим вектором&#039;&#039;) состоит из одной группы вершин, расположенной в целочисленных узлах двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a+bc&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;j = 1&amp;lt;/math&amp;gt; — компонента &amp;lt;math&amp;gt;m_{x_i}&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;j &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине с координатами &amp;lt;math&amp;gt;i, j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;b_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;y_{j}&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является:&lt;br /&gt;
* при &amp;lt;math&amp;gt;j &amp;lt; i&amp;lt;/math&amp;gt; — &#039;&#039;промежуточным данным&#039;&#039; этапа;&lt;br /&gt;
* при &amp;lt;math&amp;gt;j = i&amp;lt;/math&amp;gt; — &#039;&#039;выходным данным&#039;&#039; алгоритма &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.3, выполненном для случая &amp;lt;math&amp;gt; n = 4&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf3.png|750px|thumb|center|Рисунок 3. Граф этапа 3 макроструктуры алгоритма,  F — операция a+bc]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для распараллеливания доступны следующие опции:&lt;br /&gt;
* вычисление элементов матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в рамках столбца (под диагональю),&lt;br /&gt;
* генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;,&lt;br /&gt;
* вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (умножение матрицы на вектор, сложение векторов).&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: вещественная всюду плотная положительно определенная симметрическая  &amp;lt;math&amp;gt;(n \times n)&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;\Sigma&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;
* Выходные данные: вещественный &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектор &amp;lt;math&amp;gt;X&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;syntaxhighlight lang = c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// compute matrix B (core)&lt;br /&gt;
for (int j = 0; j &amp;lt; n; j++){&lt;br /&gt;
    double sum_down = matrix_cov[j][j];&lt;br /&gt;
    for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
        double cur = matrix_cov[j][k];&lt;br /&gt;
        sum_down -= cur * cur;&lt;br /&gt;
    }&lt;br /&gt;
    matrix_cov[j][j] = sqrt(sum_down);&lt;br /&gt;
    for (int i = j + 1; i &amp;lt; n; i++){&lt;br /&gt;
        double sum_up = matrix_cov[i][j];&lt;br /&gt;
        for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
            sum_up -= matrix_cov[i][k] * matrix_cov[j][k];&lt;br /&gt;
        }&lt;br /&gt;
        matrix_cov[i][j] = sum_up / matrix_cov[j][j];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
// generate vector Y&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){&lt;br /&gt;
    double sum = generate_uniform(n);&lt;br /&gt;
    for (int j = 0; j &amp;lt; CLT_NUM - 1; j++){&lt;br /&gt;
        sum += generate_uniform(n);&lt;br /&gt;
    }&lt;br /&gt;
    vec_Y[i] = (sum - CLT_NUM / 2) * sqrt(12.0 / CLT_NUM);&lt;br /&gt;
}&lt;br /&gt;
// linear transformation&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){  &lt;br /&gt;
    vec_X[i] = vec_exp[i];&lt;br /&gt;
    for (int k = 0; k &amp;lt;= i; k++){&lt;br /&gt;
        vec_X[i] += matrix_cov[i][k] * vec_Y[k];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Алгоритм был реализован на языке C++ с использованием Intel MPI Library и запущен на кластере regular4.&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add impi/5.0.1&lt;br /&gt;
 mpicxx -std=c++0x task.c -o _scratch/task&lt;br /&gt;
 sbatch -n256 impi ./task &amp;lt;matrix_size&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
* размер матрицы [1024 : 4864] с шагом 256,&lt;br /&gt;
* число ядер [2 : 256] с шагом-умножением в 2 раза.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:Ops_2.png|thumb|center|700px|Рисунок 4. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
Проведем оценки масштабируемости:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;По размеру задачи&#039;&#039;&#039; — при увеличении размерности матрицы [[Глоссарий#Эффективность реализации|эффективность реализации]] постепенно уменьшается. Это связано с тем, что время чтения и подготовки исходных данных растёт быстрее, чем время работы исследуемого алгоритма.&lt;br /&gt;
* &#039;&#039;&#039;По числу процессов&#039;&#039;&#039; - при увеличении числа процессов [[Глоссарий#Эффективность реализации|эффективность реализации]] увеличивается. Это связано с тем, что время чтения и подготовки исходной матрицы остаётся неизменным, а время работы алгоритма уменьшается, однако рост незначительный.&lt;br /&gt;
* При одновременном увеличении числа процессов и размерности матрицы [[Глоссарий#Эффективность реализации|эффективность реализации]] уменьшается.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
MS Excel и распространённые статистические пакеты (напр., SPSS, Statistica) позволяют моделировать только одномерные статистические распределения. Имеется возможность &amp;quot;собрать&amp;quot; многомерное распределение из нескольких одномерных при условии, что компоненты независимы. Однако если необходимо исследовать данные с зависящими друг от друга переменными, то приходится писать собственную программу. При этом удобно воспользоваться готовой реализацией разложения Холецкого (точечного метода), представленной в таких прикладных пакетах, как LINPACK, LAPACK, SCALAPACK.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Lonalone</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26753</id>
		<title>Участник:Lonalone/Генерация гауссовского вектора методом линейных преобразований</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26753"/>
		<updated>2018-12-01T21:28:11Z</updated>

		<summary type="html">&lt;p&gt;Lonalone: /* Генерация вектора Y */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор описания: &#039;&#039;Меньших И. М.&#039;&#039;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из многомерных распределений особый интерес представляет нормальное. Этому закону подчиняются все результаты воздействия большого числа случайных факторов, среди которых нет превалирующих.&lt;br /&gt;
&lt;br /&gt;
В статье приведен алгоритм генерации n-мерного гауссовского случайного вектора с помощью &#039;&#039;метода линейных преобразований&#039;&#039;&amp;lt;ref name=&amp;quot;V&amp;quot;&amp;gt;(п. 1.10.4) Михайлов Г.А., Войтишек А.В. Численное статистическое моделирование. Методы Монте-Карло — М.: Академия, 2006. — 368 с.&amp;lt;/ref&amp;gt;. Известно, что случае нормально распределенного случайного вектора, ковариационная матрица вместе с математическим ожиданием этого вектора полностью определяют его распределение. Поэтому для полного статистического соответствия моделируемого и теоретического распределения гауссовского вектора достаточно обеспечить требуемые значения указанных параметров&amp;lt;ref name=&amp;quot;VV&amp;quot;&amp;gt; https://ru.wikipedia.org/wiki/Многомерное_нормальное_распределение&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея алгоритма заключается в линейном преобразовании n-мерного случайного вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, компоненты которого независимы и одинаково распределены по нормальному закону со стандартными параметрами, в случайный вектор &amp;lt;math&amp;gt;X&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;\Sigma&amp;lt;/math&amp;gt; и вектор математических ожиданий &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Sigma = \|\sigma_{ij}\| = \| \mathbb{E}[(X_{i} - m_{x_{i}})(X_{j} - m_{x_{j}})]\|, \\&lt;br /&gt;
M = (m_{x_{1}}, m_{x_{2}}, ..., m_{x_{n}})^T.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Требуется найти такую матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, которая позволяла бы получить искомый вектор &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; с требуемыми характеристиками в результате линейного преобразования &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — n-мерный случайный вектор с независимыми нормально распределенными компонентами со стандартными параметрами.&lt;br /&gt;
&lt;br /&gt;
Будем искать матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в виде нижней треугольной матрицы. Перейдем от матричной записи к системе алгебраических уравнений:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} X_{1} \\&lt;br /&gt;
 X_{2} \\ \vdots \\ X_{n} \end{pmatrix} =&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} b_{11} &amp;amp; 0 &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\b_{21} &amp;amp; b_{22} &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\ \vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \vdots&lt;br /&gt;
\\ b_{n1} &amp;amp; b_{n2} &amp;amp; \cdots &amp;amp; b_{nn}&lt;br /&gt;
\end{pmatrix} \times&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} Y_{1} \\&lt;br /&gt;
 Y_{2} \\ \vdots \\ Y_{n} \end{pmatrix} +&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} m_{x_{1}} \\&lt;br /&gt;
 m_{x_{2}} \\ \vdots \\ m_{x_{n}} \end{pmatrix} \Rightarrow&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}X_{1} - m_{x_{1}} = b_{11}Y_{1}&lt;br /&gt;
\\X_{2} - m_{x_{2}} = b_{21}Y_{1} + b_{22}Y_{2}&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\\X_{n} - m_{x_{n}} = b_{n1}Y_{1} + b_{n2}Y_{2} + \cdots + b_{nn}Y_{n}&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Поскольку компоненты вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; независимы и имеют стандартные параметры, справедливо выражение:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\mathbb{E}[Y_{i}Y_{j}] =&lt;br /&gt;
\left\{\begin{matrix} &lt;br /&gt;
1, &amp;amp;i = j, \\&lt;br /&gt;
0, &amp;amp;i \not= j.&lt;br /&gt;
\end{matrix}\right.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Почленно перемножив сами на себя и между собой соответственно левые и правые части уравнений системы и взяв от результатов перемножения математическое ожидание, получаем систему уравнений вида:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\mathbb{E}[(X_{1} - m_{x_{1}})(X_{1} - m_{x_{1}})] = \mathbb{E}[b_{11}Y_{1}b_{11}Y_{1}],&lt;br /&gt;
\\ \mathbb{E}[(X_{1} - m_{x_{1}})(X_{2} - m_{x_{2}})] = \mathbb{E}[(b_{21}Y_{1} + b_{22}Y_{2})b_{11}Y_{1}],&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, в левых частях полученной системы уравнений располагаются элементы заданной ковариационной матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;, а в правых — элементы искомой матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;. Последовательно решая эту систему, получаем формулы для расчета элементов &amp;lt;math&amp;gt;\sigma_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
b_{11}=\sqrt{\sigma_{11}}; b_{21}=\frac{\sigma_{12}}{\sqrt{\sigma_{11}}}; b_{22} = \sqrt{\sigma_{22} - \frac{\sigma_{12}}{\sigma_{11}}}, \cdots&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рекуррентная формула для расчета любого элемента матрицы преобразования &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b_{ij} = \frac {\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}} {\sqrt{\sigma_{ij} - \sum_{k=1}^{j-1} b_{jk}^2}}, \quad 1 \leqslant j \leqslant i \leqslant n&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(суммы с верхним нулевым пределом считаются равными нулю)&lt;br /&gt;
&lt;br /&gt;
Таким образом, матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; получается с помощью [[Разложение_Холецкого_(метод_квадратного_корня)|разложения Холецкого]] матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Генерация случайного вектора Y ====&lt;br /&gt;
&lt;br /&gt;
Пусть имеется генератор псевдослучайных чисел (ГПСЧ, PRNG), с помощью которого можно получить реализацию случайной величины &amp;lt;math&amp;gt;u \sim U(0,1) &amp;lt;/math&amp;gt;. Описанный выше случайный вектор &amp;lt;math&amp;gt;Y=(y_1, \cdots, y_n)&amp;lt;/math&amp;gt; с независимыми компонентами составим из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; реализаций случайной величины &amp;lt;math&amp;gt;\eta \sim N(0,1)&amp;lt;/math&amp;gt;. Каждую такую реализацию &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;, в свою очередь, получим с помощью приближения по ЦПТ &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; случайными величинами, распределенными равномерно на отрезке [0,1]:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right), \quad i = \overline{1, n} \\&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;u_j^i - &amp;lt;/math&amp;gt; реализации случайной величины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;\kappa - &amp;lt;/math&amp;gt; параметр, обеспечивающий качество приближения.&lt;br /&gt;
&lt;br /&gt;
Как правило, &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; берут равным 12 и считают, что для подавляющего числа практических задач обеспечивается должная точность вычислений&amp;lt;ref name = &amp;quot;VVV&amp;quot;&amp;gt;Балдин К.В., Уткин В.Б. Информационные системы в экономике. — М.:Дашков и Кo, 2008. — 395 с.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}, \quad 1 \leqslant j \leqslant i \leqslant n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;&lt;br /&gt;
* Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1) Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;b_{11}= \sqrt{\sigma_{11}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;b_{k1}= \frac{\sigma_{k1}}{l_{11}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad k = \overline{2,n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{2,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (c) &amp;lt;math&amp;gt;b_{ii} = \sqrt{\sigma_{ii} - \sum_{p = 1}^{i - 1} b_{ip}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (d) &amp;lt;math&amp;gt;b_{ji} = \frac{\sigma_{ji} - \sum_{p = 1}^{i - 1} b_{ip} b_{jp}} {l_{ii}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad i \neq n, j = \overline{i+1,n}&amp;lt;/math&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;u_j^i \leftarrow PRNG,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\quad j = \overline{1,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3) Вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i = m_{x_i} + \sum_{k = 1}^{i} b_{ik} y_{k}, \quad i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + \sum_{j=1}^{n-2}j(n-j-1) + n + \frac {n(n+1)}{2} =&lt;br /&gt;
  n(n+1) + \frac {n(n-1)(n-2)}{6}&amp;lt;/math&amp;gt; (умножений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + \sum_{j=1}^{n-2}j(n-j-1) + n =&lt;br /&gt;
  \frac {n(n+1)}{2} + \frac {n(n-1)(n-2)}{6}&amp;lt;/math&amp;gt; (вычитаний)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad (\kappa-1)n + \frac {n(n+1)}{2} = \frac {n(n-1+2\kappa)}{2}&amp;lt;/math&amp;gt; (сложений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + 2n = \frac {n(n+3)}{2}&amp;lt;/math&amp;gt; (делений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad n + n  = 2n &amp;lt;/math&amp;gt; (взятия квадратного корня)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{n}{6}\left(2n^2+9n+31+6\kappa\right) &amp;lt;/math&amp;gt; - итого операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
==== Заполнение матрицы B====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 1 макроструктуры алгоритма ([[Разложение_Холецкого_(метод_квадратного_корня)|&#039;&#039;разложения Холецкого&#039;&#039;]]) состоит из трёх групп вершин, расположенных в целочисленных узлах трёх областей разной размерности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин расположена в одномерной области, соответствующая ей операция вычисляет функцию SQRT. &lt;br /&gt;
Единственная координата каждой из вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргумент этой функции &lt;br /&gt;
	&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{11}&amp;lt;/math&amp;gt;; &lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ii}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин расположена в двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a / b&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;: &lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{j1}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1, j, i - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ji}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин расположена в трёхмерной области, соответствующая ей операция  &amp;lt;math&amp;gt;a - b * c&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; — меняется в диапазоне  от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;p = 1&amp;lt;/math&amp;gt; элемент входных данных &amp;lt;math&amp;gt;\sigma_{ji}&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;p &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i, j, p - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, i&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, j&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.1, выполненном для случая &amp;lt;math&amp;gt;n = 4&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
[[file:Cholesky full_in_out.png|thumb|center|1400px|Рисунок 1. Граф этапа 1 макроструктуры алгоритма. SQ — вычисление квадратного корня, F — операция a-bc, Div — деление, In — входные данные, Out — выходные.]]&lt;br /&gt;
&lt;br /&gt;
====Генерация вектора Y====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 2 макроструктуры алгоритма состоит из двух групп вершин, расположенных в целочисленных узлах двумерной области.&lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин. Соответствующая ей операция вычисляет функцию &amp;lt;math&amp;gt;S = a+b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a:&amp;lt;/math&amp;gt;&lt;br /&gt;
** при &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; — константа &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;j&amp;gt;1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатами &amp;lt;math&amp;gt;i,j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; — значение, поступающее с &amp;lt;math&amp;gt;PRNG&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин. Соответствующая ей операция вычисляет функцию &amp;lt;math&amp;gt;F = \left(a-\frac{\kappa}{2}\right)\sqrt{\frac{12}{\kappa}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; —  результат срабатывания операции, соответствующей вершине из первой группы, с координатами &amp;lt;math&amp;gt;i,\kappa&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; этапа &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.3, выполненном для случая &amp;lt;math&amp;gt;n = 2, \kappa = 2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf2.png|550px|thumb|center|Рисунок 3. Граф этапа 3 макроструктуры алгоритма]]&lt;br /&gt;
&lt;br /&gt;
====Вычисление вектора X====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 3 макроструктуры алгоритма (&#039;&#039;умножение нижней треугольной матрицы на вектор и сложение результата с другим вектором&#039;&#039;) состоит из одной группы вершин, расположенной в целочисленных узлах двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a+bc&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;j = 1&amp;lt;/math&amp;gt; — компонента &amp;lt;math&amp;gt;m_{x_i}&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;j &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине с координатами &amp;lt;math&amp;gt;i, j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;b_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;y_{j}&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является:&lt;br /&gt;
* при &amp;lt;math&amp;gt;j &amp;lt; i&amp;lt;/math&amp;gt; — &#039;&#039;промежуточным данным&#039;&#039; этапа;&lt;br /&gt;
* при &amp;lt;math&amp;gt;j = i&amp;lt;/math&amp;gt; — &#039;&#039;выходным данным&#039;&#039; алгоритма &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.3, выполненном для случая &amp;lt;math&amp;gt; n = 4&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf3.png|750px|thumb|center|Рисунок 3. Граф этапа 3 макроструктуры алгоритма,  F — операция a+bc]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для распараллеливания доступны следующие опции:&lt;br /&gt;
* вычисление элементов матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в рамках столбца (под диагональю),&lt;br /&gt;
* генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;,&lt;br /&gt;
* вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (умножение матрицы на вектор, сложение векторов).&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: вещественная всюду плотная положительно определенная симметрическая  &amp;lt;math&amp;gt;(n \times n)&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;\Sigma&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;
* Выходные данные: вещественный &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектор &amp;lt;math&amp;gt;X&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;syntaxhighlight lang = c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// compute matrix B (core)&lt;br /&gt;
for (int j = 0; j &amp;lt; n; j++){&lt;br /&gt;
    double sum_down = matrix_cov[j][j];&lt;br /&gt;
    for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
        double cur = matrix_cov[j][k];&lt;br /&gt;
        sum_down -= cur * cur;&lt;br /&gt;
    }&lt;br /&gt;
    matrix_cov[j][j] = sqrt(sum_down);&lt;br /&gt;
    for (int i = j + 1; i &amp;lt; n; i++){&lt;br /&gt;
        double sum_up = matrix_cov[i][j];&lt;br /&gt;
        for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
            sum_up -= matrix_cov[i][k] * matrix_cov[j][k];&lt;br /&gt;
        }&lt;br /&gt;
        matrix_cov[i][j] = sum_up / matrix_cov[j][j];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
// generate vector Y&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){&lt;br /&gt;
    double sum = generate_uniform(n);&lt;br /&gt;
    for (int j = 0; j &amp;lt; CLT_NUM - 1; j++){&lt;br /&gt;
        sum += generate_uniform(n);&lt;br /&gt;
    }&lt;br /&gt;
    vec_Y[i] = (sum - CLT_NUM / 2) * sqrt(12.0 / CLT_NUM);&lt;br /&gt;
}&lt;br /&gt;
// linear transformation&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){  &lt;br /&gt;
    vec_X[i] = vec_exp[i];&lt;br /&gt;
    for (int k = 0; k &amp;lt;= i; k++){&lt;br /&gt;
        vec_X[i] += matrix_cov[i][k] * vec_Y[k];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Алгоритм был реализован на языке C++ с использованием Intel MPI Library и запущен на кластере regular4.&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add impi/5.0.1&lt;br /&gt;
 mpicxx -std=c++0x task.c -o _scratch/task&lt;br /&gt;
 sbatch -n256 impi ./task &amp;lt;matrix_size&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
* размер матрицы [1024 : 4864] с шагом 256,&lt;br /&gt;
* число ядер [2 : 256] с шагом-умножением в 2 раза.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:Ops_2.png|thumb|center|700px|Рисунок 4. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
MS Excel и распространённые статистические пакеты (напр., SPSS, Statistica) позволяют моделировать только одномерные статистические распределения. Имеется возможность &amp;quot;собрать&amp;quot; многомерное распределение из нескольких одномерных при условии, что компоненты независимы. Однако если необходимо исследовать данные с зависящими друг от друга переменными, то приходится писать собственную программу. При этом удобно воспользоваться готовой реализацией разложения Холецкого (точечного метода), представленной в таких прикладных пакетах, как LINPACK, LAPACK, SCALAPACK.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Lonalone</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26752</id>
		<title>Участник:Lonalone/Генерация гауссовского вектора методом линейных преобразований</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26752"/>
		<updated>2018-12-01T21:08:14Z</updated>

		<summary type="html">&lt;p&gt;Lonalone: /* Генерация вектора Y */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор описания: &#039;&#039;Меньших И. М.&#039;&#039;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из многомерных распределений особый интерес представляет нормальное. Этому закону подчиняются все результаты воздействия большого числа случайных факторов, среди которых нет превалирующих.&lt;br /&gt;
&lt;br /&gt;
В статье приведен алгоритм генерации n-мерного гауссовского случайного вектора с помощью &#039;&#039;метода линейных преобразований&#039;&#039;&amp;lt;ref name=&amp;quot;V&amp;quot;&amp;gt;(п. 1.10.4) Михайлов Г.А., Войтишек А.В. Численное статистическое моделирование. Методы Монте-Карло — М.: Академия, 2006. — 368 с.&amp;lt;/ref&amp;gt;. Известно, что случае нормально распределенного случайного вектора, ковариационная матрица вместе с математическим ожиданием этого вектора полностью определяют его распределение. Поэтому для полного статистического соответствия моделируемого и теоретического распределения гауссовского вектора достаточно обеспечить требуемые значения указанных параметров&amp;lt;ref name=&amp;quot;VV&amp;quot;&amp;gt; https://ru.wikipedia.org/wiki/Многомерное_нормальное_распределение&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея алгоритма заключается в линейном преобразовании n-мерного случайного вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, компоненты которого независимы и одинаково распределены по нормальному закону со стандартными параметрами, в случайный вектор &amp;lt;math&amp;gt;X&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;\Sigma&amp;lt;/math&amp;gt; и вектор математических ожиданий &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Sigma = \|\sigma_{ij}\| = \| \mathbb{E}[(X_{i} - m_{x_{i}})(X_{j} - m_{x_{j}})]\|, \\&lt;br /&gt;
M = (m_{x_{1}}, m_{x_{2}}, ..., m_{x_{n}})^T.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Требуется найти такую матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, которая позволяла бы получить искомый вектор &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; с требуемыми характеристиками в результате линейного преобразования &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — n-мерный случайный вектор с независимыми нормально распределенными компонентами со стандартными параметрами.&lt;br /&gt;
&lt;br /&gt;
Будем искать матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в виде нижней треугольной матрицы. Перейдем от матричной записи к системе алгебраических уравнений:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} X_{1} \\&lt;br /&gt;
 X_{2} \\ \vdots \\ X_{n} \end{pmatrix} =&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} b_{11} &amp;amp; 0 &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\b_{21} &amp;amp; b_{22} &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\ \vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \vdots&lt;br /&gt;
\\ b_{n1} &amp;amp; b_{n2} &amp;amp; \cdots &amp;amp; b_{nn}&lt;br /&gt;
\end{pmatrix} \times&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} Y_{1} \\&lt;br /&gt;
 Y_{2} \\ \vdots \\ Y_{n} \end{pmatrix} +&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} m_{x_{1}} \\&lt;br /&gt;
 m_{x_{2}} \\ \vdots \\ m_{x_{n}} \end{pmatrix} \Rightarrow&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}X_{1} - m_{x_{1}} = b_{11}Y_{1}&lt;br /&gt;
\\X_{2} - m_{x_{2}} = b_{21}Y_{1} + b_{22}Y_{2}&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\\X_{n} - m_{x_{n}} = b_{n1}Y_{1} + b_{n2}Y_{2} + \cdots + b_{nn}Y_{n}&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Поскольку компоненты вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; независимы и имеют стандартные параметры, справедливо выражение:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\mathbb{E}[Y_{i}Y_{j}] =&lt;br /&gt;
\left\{\begin{matrix} &lt;br /&gt;
1, &amp;amp;i = j, \\&lt;br /&gt;
0, &amp;amp;i \not= j.&lt;br /&gt;
\end{matrix}\right.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Почленно перемножив сами на себя и между собой соответственно левые и правые части уравнений системы и взяв от результатов перемножения математическое ожидание, получаем систему уравнений вида:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\mathbb{E}[(X_{1} - m_{x_{1}})(X_{1} - m_{x_{1}})] = \mathbb{E}[b_{11}Y_{1}b_{11}Y_{1}],&lt;br /&gt;
\\ \mathbb{E}[(X_{1} - m_{x_{1}})(X_{2} - m_{x_{2}})] = \mathbb{E}[(b_{21}Y_{1} + b_{22}Y_{2})b_{11}Y_{1}],&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, в левых частях полученной системы уравнений располагаются элементы заданной ковариационной матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;, а в правых — элементы искомой матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;. Последовательно решая эту систему, получаем формулы для расчета элементов &amp;lt;math&amp;gt;\sigma_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
b_{11}=\sqrt{\sigma_{11}}; b_{21}=\frac{\sigma_{12}}{\sqrt{\sigma_{11}}}; b_{22} = \sqrt{\sigma_{22} - \frac{\sigma_{12}}{\sigma_{11}}}, \cdots&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рекуррентная формула для расчета любого элемента матрицы преобразования &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b_{ij} = \frac {\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}} {\sqrt{\sigma_{ij} - \sum_{k=1}^{j-1} b_{jk}^2}}, \quad 1 \leqslant j \leqslant i \leqslant n&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(суммы с верхним нулевым пределом считаются равными нулю)&lt;br /&gt;
&lt;br /&gt;
Таким образом, матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; получается с помощью [[Разложение_Холецкого_(метод_квадратного_корня)|разложения Холецкого]] матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Генерация случайного вектора Y ====&lt;br /&gt;
&lt;br /&gt;
Пусть имеется генератор псевдослучайных чисел (ГПСЧ, PRNG), с помощью которого можно получить реализацию случайной величины &amp;lt;math&amp;gt;u \sim U(0,1) &amp;lt;/math&amp;gt;. Описанный выше случайный вектор &amp;lt;math&amp;gt;Y=(y_1, \cdots, y_n)&amp;lt;/math&amp;gt; с независимыми компонентами составим из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; реализаций случайной величины &amp;lt;math&amp;gt;\eta \sim N(0,1)&amp;lt;/math&amp;gt;. Каждую такую реализацию &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;, в свою очередь, получим с помощью приближения по ЦПТ &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; случайными величинами, распределенными равномерно на отрезке [0,1]:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right), \quad i = \overline{1, n} \\&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;u_j^i - &amp;lt;/math&amp;gt; реализации случайной величины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;\kappa - &amp;lt;/math&amp;gt; параметр, обеспечивающий качество приближения.&lt;br /&gt;
&lt;br /&gt;
Как правило, &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; берут равным 12 и считают, что для подавляющего числа практических задач обеспечивается должная точность вычислений&amp;lt;ref name = &amp;quot;VVV&amp;quot;&amp;gt;Балдин К.В., Уткин В.Б. Информационные системы в экономике. — М.:Дашков и Кo, 2008. — 395 с.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}, \quad 1 \leqslant j \leqslant i \leqslant n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;&lt;br /&gt;
* Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1) Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;b_{11}= \sqrt{\sigma_{11}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;b_{k1}= \frac{\sigma_{k1}}{l_{11}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad k = \overline{2,n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{2,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (c) &amp;lt;math&amp;gt;b_{ii} = \sqrt{\sigma_{ii} - \sum_{p = 1}^{i - 1} b_{ip}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (d) &amp;lt;math&amp;gt;b_{ji} = \frac{\sigma_{ji} - \sum_{p = 1}^{i - 1} b_{ip} b_{jp}} {l_{ii}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad i \neq n, j = \overline{i+1,n}&amp;lt;/math&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;u_j^i \leftarrow PRNG,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\quad j = \overline{1,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3) Вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i = m_{x_i} + \sum_{k = 1}^{i} b_{ik} y_{k}, \quad i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + \sum_{j=1}^{n-2}j(n-j-1) + n + \frac {n(n+1)}{2} =&lt;br /&gt;
  n(n+1) + \frac {n(n-1)(n-2)}{6}&amp;lt;/math&amp;gt; (умножений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + \sum_{j=1}^{n-2}j(n-j-1) + n =&lt;br /&gt;
  \frac {n(n+1)}{2} + \frac {n(n-1)(n-2)}{6}&amp;lt;/math&amp;gt; (вычитаний)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad (\kappa-1)n + \frac {n(n+1)}{2} = \frac {n(n-1+2\kappa)}{2}&amp;lt;/math&amp;gt; (сложений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + 2n = \frac {n(n+3)}{2}&amp;lt;/math&amp;gt; (делений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad n + n  = 2n &amp;lt;/math&amp;gt; (взятия квадратного корня)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{n}{6}\left(2n^2+9n+31+6\kappa\right) &amp;lt;/math&amp;gt; - итого операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
==== Заполнение матрицы B====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 1 макроструктуры алгоритма ([[Разложение_Холецкого_(метод_квадратного_корня)|&#039;&#039;разложения Холецкого&#039;&#039;]]) состоит из трёх групп вершин, расположенных в целочисленных узлах трёх областей разной размерности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин расположена в одномерной области, соответствующая ей операция вычисляет функцию SQRT. &lt;br /&gt;
Единственная координата каждой из вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргумент этой функции &lt;br /&gt;
	&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{11}&amp;lt;/math&amp;gt;; &lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ii}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин расположена в двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a / b&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;: &lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{j1}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1, j, i - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ji}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин расположена в трёхмерной области, соответствующая ей операция  &amp;lt;math&amp;gt;a - b * c&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; — меняется в диапазоне  от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;p = 1&amp;lt;/math&amp;gt; элемент входных данных &amp;lt;math&amp;gt;\sigma_{ji}&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;p &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i, j, p - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, i&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, j&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.1, выполненном для случая &amp;lt;math&amp;gt;n = 4&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
[[file:Cholesky full_in_out.png|thumb|center|1400px|Рисунок 1. Граф этапа 1 макроструктуры алгоритма. SQ — вычисление квадратного корня, F — операция a-bc, Div — деление, In — входные данные, Out — выходные.]]&lt;br /&gt;
&lt;br /&gt;
====Генерация вектора Y====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 2 макроструктуры алгоритма состоит из двух групп вершин, расположенных в целочисленных узлах двумерной области.&lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Операция &amp;lt;math&amp;gt;S = a+b&amp;lt;/math&amp;gt;.&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a:&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt;: константа &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;;&lt;br /&gt;
** &amp;lt;math&amp;gt;j&amp;gt;1&amp;lt;/math&amp;gt;: значение операции, имеющей координаты &amp;lt;math&amp;gt;i,j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — значение, поступающее с &amp;lt;math&amp;gt;PRNG&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа. &amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Операция &amp;lt;math&amp;gt;F = \left(a-\frac{\kappa}{2}\right)\sqrt{\frac{12}{\kappa}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; — значение вершины первой группы, имеющей координаты &amp;lt;math&amp;gt;i,\kappa&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; этапа &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.3, выполненном для случая &amp;lt;math&amp;gt;n = 2, \kappa = 2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf2.png|550px|thumb|center|Рисунок 3. Граф этапа 3 макроструктуры алгоритма]]&lt;br /&gt;
&lt;br /&gt;
====Вычисление вектора X====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 3 макроструктуры алгоритма (&#039;&#039;умножение нижней треугольной матрицы на вектор и сложение результата с другим вектором&#039;&#039;) состоит из одной группы вершин, расположенной в целочисленных узлах двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a+bc&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;j = 1&amp;lt;/math&amp;gt; — компонента &amp;lt;math&amp;gt;m_{x_i}&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;j &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине с координатами &amp;lt;math&amp;gt;i, j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;b_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;y_{j}&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является:&lt;br /&gt;
* при &amp;lt;math&amp;gt;j &amp;lt; i&amp;lt;/math&amp;gt; — &#039;&#039;промежуточным данным&#039;&#039; этапа;&lt;br /&gt;
* при &amp;lt;math&amp;gt;j = i&amp;lt;/math&amp;gt; — &#039;&#039;выходным данным&#039;&#039; алгоритма &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.3, выполненном для случая &amp;lt;math&amp;gt; n = 4&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf3.png|750px|thumb|center|Рисунок 3. Граф этапа 3 макроструктуры алгоритма,  F — операция a+bc]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для распараллеливания доступны следующие опции:&lt;br /&gt;
* вычисление элементов матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в рамках столбца (под диагональю),&lt;br /&gt;
* генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;,&lt;br /&gt;
* вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (умножение матрицы на вектор, сложение векторов).&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: вещественная всюду плотная положительно определенная симметрическая  &amp;lt;math&amp;gt;(n \times n)&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;\Sigma&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;
* Выходные данные: вещественный &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектор &amp;lt;math&amp;gt;X&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;syntaxhighlight lang = c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// compute matrix B (core)&lt;br /&gt;
for (int j = 0; j &amp;lt; n; j++){&lt;br /&gt;
    double sum_down = matrix_cov[j][j];&lt;br /&gt;
    for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
        double cur = matrix_cov[j][k];&lt;br /&gt;
        sum_down -= cur * cur;&lt;br /&gt;
    }&lt;br /&gt;
    matrix_cov[j][j] = sqrt(sum_down);&lt;br /&gt;
    for (int i = j + 1; i &amp;lt; n; i++){&lt;br /&gt;
        double sum_up = matrix_cov[i][j];&lt;br /&gt;
        for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
            sum_up -= matrix_cov[i][k] * matrix_cov[j][k];&lt;br /&gt;
        }&lt;br /&gt;
        matrix_cov[i][j] = sum_up / matrix_cov[j][j];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
// generate vector Y&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){&lt;br /&gt;
    double sum = generate_uniform(n);&lt;br /&gt;
    for (int j = 0; j &amp;lt; CLT_NUM - 1; j++){&lt;br /&gt;
        sum += generate_uniform(n);&lt;br /&gt;
    }&lt;br /&gt;
    vec_Y[i] = (sum - CLT_NUM / 2) * sqrt(12.0 / CLT_NUM);&lt;br /&gt;
}&lt;br /&gt;
// linear transformation&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){  &lt;br /&gt;
    vec_X[i] = vec_exp[i];&lt;br /&gt;
    for (int k = 0; k &amp;lt;= i; k++){&lt;br /&gt;
        vec_X[i] += matrix_cov[i][k] * vec_Y[k];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Алгоритм был реализован на языке C++ с использованием Intel MPI Library и запущен на кластере regular4.&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add impi/5.0.1&lt;br /&gt;
 mpicxx -std=c++0x task.c -o _scratch/task&lt;br /&gt;
 sbatch -n256 impi ./task &amp;lt;matrix_size&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
* размер матрицы [1024 : 4864] с шагом 256,&lt;br /&gt;
* число ядер [2 : 256] с шагом-умножением в 2 раза.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:Ops_2.png|thumb|center|700px|Рисунок 4. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
MS Excel и распространённые статистические пакеты (напр., SPSS, Statistica) позволяют моделировать только одномерные статистические распределения. Имеется возможность &amp;quot;собрать&amp;quot; многомерное распределение из нескольких одномерных при условии, что компоненты независимы. Однако если необходимо исследовать данные с зависящими друг от друга переменными, то приходится писать собственную программу. При этом удобно воспользоваться готовой реализацией разложения Холецкого (точечного метода), представленной в таких прикладных пакетах, как LINPACK, LAPACK, SCALAPACK.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Lonalone</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26751</id>
		<title>Участник:Lonalone/Генерация гауссовского вектора методом линейных преобразований</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26751"/>
		<updated>2018-12-01T19:21:42Z</updated>

		<summary type="html">&lt;p&gt;Lonalone: /* Генерация вектора Y */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор описания: &#039;&#039;Меньших И. М.&#039;&#039;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из многомерных распределений особый интерес представляет нормальное. Этому закону подчиняются все результаты воздействия большого числа случайных факторов, среди которых нет превалирующих.&lt;br /&gt;
&lt;br /&gt;
В статье приведен алгоритм генерации n-мерного гауссовского случайного вектора с помощью &#039;&#039;метода линейных преобразований&#039;&#039;&amp;lt;ref name=&amp;quot;V&amp;quot;&amp;gt;(п. 1.10.4) Михайлов Г.А., Войтишек А.В. Численное статистическое моделирование. Методы Монте-Карло — М.: Академия, 2006. — 368 с.&amp;lt;/ref&amp;gt;. Известно, что случае нормально распределенного случайного вектора, ковариационная матрица вместе с математическим ожиданием этого вектора полностью определяют его распределение. Поэтому для полного статистического соответствия моделируемого и теоретического распределения гауссовского вектора достаточно обеспечить требуемые значения указанных параметров&amp;lt;ref name=&amp;quot;VV&amp;quot;&amp;gt; https://ru.wikipedia.org/wiki/Многомерное_нормальное_распределение&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея алгоритма заключается в линейном преобразовании n-мерного случайного вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, компоненты которого независимы и одинаково распределены по нормальному закону со стандартными параметрами, в случайный вектор &amp;lt;math&amp;gt;X&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;\Sigma&amp;lt;/math&amp;gt; и вектор математических ожиданий &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Sigma = \|\sigma_{ij}\| = \| \mathbb{E}[(X_{i} - m_{x_{i}})(X_{j} - m_{x_{j}})]\|, \\&lt;br /&gt;
M = (m_{x_{1}}, m_{x_{2}}, ..., m_{x_{n}})^T.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Требуется найти такую матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, которая позволяла бы получить искомый вектор &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; с требуемыми характеристиками в результате линейного преобразования &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — n-мерный случайный вектор с независимыми нормально распределенными компонентами со стандартными параметрами.&lt;br /&gt;
&lt;br /&gt;
Будем искать матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в виде нижней треугольной матрицы. Перейдем от матричной записи к системе алгебраических уравнений:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} X_{1} \\&lt;br /&gt;
 X_{2} \\ \vdots \\ X_{n} \end{pmatrix} =&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} b_{11} &amp;amp; 0 &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\b_{21} &amp;amp; b_{22} &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\ \vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \vdots&lt;br /&gt;
\\ b_{n1} &amp;amp; b_{n2} &amp;amp; \cdots &amp;amp; b_{nn}&lt;br /&gt;
\end{pmatrix} \times&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} Y_{1} \\&lt;br /&gt;
 Y_{2} \\ \vdots \\ Y_{n} \end{pmatrix} +&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} m_{x_{1}} \\&lt;br /&gt;
 m_{x_{2}} \\ \vdots \\ m_{x_{n}} \end{pmatrix} \Rightarrow&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}X_{1} - m_{x_{1}} = b_{11}Y_{1}&lt;br /&gt;
\\X_{2} - m_{x_{2}} = b_{21}Y_{1} + b_{22}Y_{2}&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\\X_{n} - m_{x_{n}} = b_{n1}Y_{1} + b_{n2}Y_{2} + \cdots + b_{nn}Y_{n}&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Поскольку компоненты вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; независимы и имеют стандартные параметры, справедливо выражение:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\mathbb{E}[Y_{i}Y_{j}] =&lt;br /&gt;
\left\{\begin{matrix} &lt;br /&gt;
1, &amp;amp;i = j, \\&lt;br /&gt;
0, &amp;amp;i \not= j.&lt;br /&gt;
\end{matrix}\right.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Почленно перемножив сами на себя и между собой соответственно левые и правые части уравнений системы и взяв от результатов перемножения математическое ожидание, получаем систему уравнений вида:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\mathbb{E}[(X_{1} - m_{x_{1}})(X_{1} - m_{x_{1}})] = \mathbb{E}[b_{11}Y_{1}b_{11}Y_{1}],&lt;br /&gt;
\\ \mathbb{E}[(X_{1} - m_{x_{1}})(X_{2} - m_{x_{2}})] = \mathbb{E}[(b_{21}Y_{1} + b_{22}Y_{2})b_{11}Y_{1}],&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, в левых частях полученной системы уравнений располагаются элементы заданной ковариационной матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;, а в правых — элементы искомой матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;. Последовательно решая эту систему, получаем формулы для расчета элементов &amp;lt;math&amp;gt;\sigma_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
b_{11}=\sqrt{\sigma_{11}}; b_{21}=\frac{\sigma_{12}}{\sqrt{\sigma_{11}}}; b_{22} = \sqrt{\sigma_{22} - \frac{\sigma_{12}}{\sigma_{11}}}, \cdots&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рекуррентная формула для расчета любого элемента матрицы преобразования &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b_{ij} = \frac {\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}} {\sqrt{\sigma_{ij} - \sum_{k=1}^{j-1} b_{jk}^2}}, \quad 1 \leqslant j \leqslant i \leqslant n&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(суммы с верхним нулевым пределом считаются равными нулю)&lt;br /&gt;
&lt;br /&gt;
Таким образом, матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; получается с помощью [[Разложение_Холецкого_(метод_квадратного_корня)|разложения Холецкого]] матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Генерация случайного вектора Y ====&lt;br /&gt;
&lt;br /&gt;
Пусть имеется генератор псевдослучайных чисел (ГПСЧ, PRNG), с помощью которого можно получить реализацию случайной величины &amp;lt;math&amp;gt;u \sim U(0,1) &amp;lt;/math&amp;gt;. Описанный выше случайный вектор &amp;lt;math&amp;gt;Y=(y_1, \cdots, y_n)&amp;lt;/math&amp;gt; с независимыми компонентами составим из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; реализаций случайной величины &amp;lt;math&amp;gt;\eta \sim N(0,1)&amp;lt;/math&amp;gt;. Каждую такую реализацию &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;, в свою очередь, получим с помощью приближения по ЦПТ &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; случайными величинами, распределенными равномерно на отрезке [0,1]:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right), \quad i = \overline{1, n} \\&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;u_j^i - &amp;lt;/math&amp;gt; реализации случайной величины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;\kappa - &amp;lt;/math&amp;gt; параметр, обеспечивающий качество приближения.&lt;br /&gt;
&lt;br /&gt;
Как правило, &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; берут равным 12 и считают, что для подавляющего числа практических задач обеспечивается должная точность вычислений&amp;lt;ref name = &amp;quot;VVV&amp;quot;&amp;gt;Балдин К.В., Уткин В.Б. Информационные системы в экономике. — М.:Дашков и Кo, 2008. — 395 с.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}, \quad 1 \leqslant j \leqslant i \leqslant n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;&lt;br /&gt;
* Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1) Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;b_{11}= \sqrt{\sigma_{11}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;b_{k1}= \frac{\sigma_{k1}}{l_{11}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad k = \overline{2,n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{2,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (c) &amp;lt;math&amp;gt;b_{ii} = \sqrt{\sigma_{ii} - \sum_{p = 1}^{i - 1} b_{ip}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (d) &amp;lt;math&amp;gt;b_{ji} = \frac{\sigma_{ji} - \sum_{p = 1}^{i - 1} b_{ip} b_{jp}} {l_{ii}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad i \neq n, j = \overline{i+1,n}&amp;lt;/math&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;u_j^i \leftarrow PRNG,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\quad j = \overline{1,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3) Вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i = m_{x_i} + \sum_{k = 1}^{i} b_{ik} y_{k}, \quad i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + \sum_{j=1}^{n-2}j(n-j-1) + n + \frac {n(n+1)}{2} =&lt;br /&gt;
  n(n+1) + \frac {n(n-1)(n-2)}{6}&amp;lt;/math&amp;gt; (умножений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + \sum_{j=1}^{n-2}j(n-j-1) + n =&lt;br /&gt;
  \frac {n(n+1)}{2} + \frac {n(n-1)(n-2)}{6}&amp;lt;/math&amp;gt; (вычитаний)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad (\kappa-1)n + \frac {n(n+1)}{2} = \frac {n(n-1+2\kappa)}{2}&amp;lt;/math&amp;gt; (сложений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + 2n = \frac {n(n+3)}{2}&amp;lt;/math&amp;gt; (делений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad n + n  = 2n &amp;lt;/math&amp;gt; (взятия квадратного корня)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{n}{6}\left(2n^2+9n+31+6\kappa\right) &amp;lt;/math&amp;gt; - итого операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
==== Заполнение матрицы B====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 1 макроструктуры алгоритма ([[Разложение_Холецкого_(метод_квадратного_корня)|&#039;&#039;разложения Холецкого&#039;&#039;]]) состоит из трёх групп вершин, расположенных в целочисленных узлах трёх областей разной размерности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин расположена в одномерной области, соответствующая ей операция вычисляет функцию SQRT. &lt;br /&gt;
Единственная координата каждой из вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргумент этой функции &lt;br /&gt;
	&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{11}&amp;lt;/math&amp;gt;; &lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ii}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин расположена в двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a / b&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;: &lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{j1}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1, j, i - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ji}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин расположена в трёхмерной области, соответствующая ей операция  &amp;lt;math&amp;gt;a - b * c&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; — меняется в диапазоне  от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;p = 1&amp;lt;/math&amp;gt; элемент входных данных &amp;lt;math&amp;gt;\sigma_{ji}&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;p &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i, j, p - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, i&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, j&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.1, выполненном для случая &amp;lt;math&amp;gt;n = 4&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
[[file:Cholesky full_in_out.png|thumb|center|1400px|Рисунок 1. Граф этапа 1 макроструктуры алгоритма. SQ — вычисление квадратного корня, F — операция a-bc, Div — деление, In — входные данные, Out — выходные.]]&lt;br /&gt;
&lt;br /&gt;
====Генерация вектора Y====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 2 макроструктуры алгоритма состоит из четырех групп вершин, расположенных в целочисленных узлах одномерной области.&lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Операция  &amp;lt;math&amp;gt;S = a+b&amp;lt;/math&amp;gt;......&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039;, поступающий с &amp;lt;math&amp;gt;PRNG&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039;, заданная положительная целочисленная константа; &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; алгоритма &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.3, выполненном для случая &amp;lt;math&amp;gt;n = 2, \kappa = 2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf2.png|650px|thumb|center|Рисунок 3. Граф этапа 3 макроструктуры алгоритма]]&lt;br /&gt;
&lt;br /&gt;
====Вычисление вектора X====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 3 макроструктуры алгоритма (&#039;&#039;умножение нижней треугольной матрицы на вектор и сложение результата с другим вектором&#039;&#039;) состоит из одной группы вершин, расположенной в целочисленных узлах двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a+bc&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;j = 1&amp;lt;/math&amp;gt; — компонента &amp;lt;math&amp;gt;m_{x_i}&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;j &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине с координатами &amp;lt;math&amp;gt;i, j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;b_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;y_{j}&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является:&lt;br /&gt;
* при &amp;lt;math&amp;gt;j &amp;lt; i&amp;lt;/math&amp;gt; — &#039;&#039;промежуточным данным&#039;&#039; этапа;&lt;br /&gt;
* при &amp;lt;math&amp;gt;j = i&amp;lt;/math&amp;gt; — &#039;&#039;выходным данным&#039;&#039; алгоритма &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.3, выполненном для случая &amp;lt;math&amp;gt; n = 4&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf3.png|750px|thumb|center|Рисунок 3. Граф этапа 3 макроструктуры алгоритма,  F — операция a+bc]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для распараллеливания доступны следующие опции:&lt;br /&gt;
* вычисление элементов матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в рамках столбца (под диагональю),&lt;br /&gt;
* генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;,&lt;br /&gt;
* вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (умножение матрицы на вектор, сложение векторов).&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: вещественная всюду плотная положительно определенная симметрическая  &amp;lt;math&amp;gt;(n \times n)&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;\Sigma&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;
* Выходные данные: вещественный &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектор &amp;lt;math&amp;gt;X&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;syntaxhighlight lang = c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// compute matrix B (core)&lt;br /&gt;
for (int j = 0; j &amp;lt; n; j++){&lt;br /&gt;
    double sum_down = matrix_cov[j][j];&lt;br /&gt;
    for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
        double cur = matrix_cov[j][k];&lt;br /&gt;
        sum_down -= cur * cur;&lt;br /&gt;
    }&lt;br /&gt;
    matrix_cov[j][j] = sqrt(sum_down);&lt;br /&gt;
    for (int i = j + 1; i &amp;lt; n; i++){&lt;br /&gt;
        double sum_up = matrix_cov[i][j];&lt;br /&gt;
        for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
            sum_up -= matrix_cov[i][k] * matrix_cov[j][k];&lt;br /&gt;
        }&lt;br /&gt;
        matrix_cov[i][j] = sum_up / matrix_cov[j][j];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
// generate vector Y&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){&lt;br /&gt;
    double sum = generate_uniform(n);&lt;br /&gt;
    for (int j = 0; j &amp;lt; CLT_NUM - 1; j++){&lt;br /&gt;
        sum += generate_uniform(n);&lt;br /&gt;
    }&lt;br /&gt;
    vec_Y[i] = (sum - CLT_NUM / 2) * sqrt(12.0 / CLT_NUM);&lt;br /&gt;
}&lt;br /&gt;
// linear transformation&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){  &lt;br /&gt;
    vec_X[i] = vec_exp[i];&lt;br /&gt;
    for (int k = 0; k &amp;lt;= i; k++){&lt;br /&gt;
        vec_X[i] += matrix_cov[i][k] * vec_Y[k];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Алгоритм был реализован на языке C++ с использованием Intel MPI Library и запущен на кластере regular4.&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add impi/5.0.1&lt;br /&gt;
 mpicxx -std=c++0x task.c -o _scratch/task&lt;br /&gt;
 sbatch -n256 impi ./task &amp;lt;matrix_size&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
* размер матрицы [1024 : 4864] с шагом 256,&lt;br /&gt;
* число ядер [2 : 256] с шагом-умножением в 2 раза.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:Ops_2.png|thumb|center|700px|Рисунок 4. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
MS Excel и распространённые статистические пакеты (напр., SPSS, Statistica) позволяют моделировать только одномерные статистические распределения. Имеется возможность &amp;quot;собрать&amp;quot; многомерное распределение из нескольких одномерных при условии, что компоненты независимы. Однако если необходимо исследовать данные с зависящими друг от друга переменными, то приходится писать собственную программу. При этом удобно воспользоваться готовой реализацией разложения Холецкого (точечного метода), представленной в таких прикладных пакетах, как LINPACK, LAPACK, SCALAPACK.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Lonalone</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26750</id>
		<title>Участник:Lonalone/Генерация гауссовского вектора методом линейных преобразований</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26750"/>
		<updated>2018-12-01T19:10:37Z</updated>

		<summary type="html">&lt;p&gt;Lonalone: /* Генерация вектора Y */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор описания: &#039;&#039;Меньших И. М.&#039;&#039;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из многомерных распределений особый интерес представляет нормальное. Этому закону подчиняются все результаты воздействия большого числа случайных факторов, среди которых нет превалирующих.&lt;br /&gt;
&lt;br /&gt;
В статье приведен алгоритм генерации n-мерного гауссовского случайного вектора с помощью &#039;&#039;метода линейных преобразований&#039;&#039;&amp;lt;ref name=&amp;quot;V&amp;quot;&amp;gt;(п. 1.10.4) Михайлов Г.А., Войтишек А.В. Численное статистическое моделирование. Методы Монте-Карло — М.: Академия, 2006. — 368 с.&amp;lt;/ref&amp;gt;. Известно, что случае нормально распределенного случайного вектора, ковариационная матрица вместе с математическим ожиданием этого вектора полностью определяют его распределение. Поэтому для полного статистического соответствия моделируемого и теоретического распределения гауссовского вектора достаточно обеспечить требуемые значения указанных параметров&amp;lt;ref name=&amp;quot;VV&amp;quot;&amp;gt; https://ru.wikipedia.org/wiki/Многомерное_нормальное_распределение&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея алгоритма заключается в линейном преобразовании n-мерного случайного вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, компоненты которого независимы и одинаково распределены по нормальному закону со стандартными параметрами, в случайный вектор &amp;lt;math&amp;gt;X&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;\Sigma&amp;lt;/math&amp;gt; и вектор математических ожиданий &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Sigma = \|\sigma_{ij}\| = \| \mathbb{E}[(X_{i} - m_{x_{i}})(X_{j} - m_{x_{j}})]\|, \\&lt;br /&gt;
M = (m_{x_{1}}, m_{x_{2}}, ..., m_{x_{n}})^T.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Требуется найти такую матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, которая позволяла бы получить искомый вектор &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; с требуемыми характеристиками в результате линейного преобразования &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — n-мерный случайный вектор с независимыми нормально распределенными компонентами со стандартными параметрами.&lt;br /&gt;
&lt;br /&gt;
Будем искать матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в виде нижней треугольной матрицы. Перейдем от матричной записи к системе алгебраических уравнений:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} X_{1} \\&lt;br /&gt;
 X_{2} \\ \vdots \\ X_{n} \end{pmatrix} =&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} b_{11} &amp;amp; 0 &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\b_{21} &amp;amp; b_{22} &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\ \vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \vdots&lt;br /&gt;
\\ b_{n1} &amp;amp; b_{n2} &amp;amp; \cdots &amp;amp; b_{nn}&lt;br /&gt;
\end{pmatrix} \times&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} Y_{1} \\&lt;br /&gt;
 Y_{2} \\ \vdots \\ Y_{n} \end{pmatrix} +&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} m_{x_{1}} \\&lt;br /&gt;
 m_{x_{2}} \\ \vdots \\ m_{x_{n}} \end{pmatrix} \Rightarrow&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}X_{1} - m_{x_{1}} = b_{11}Y_{1}&lt;br /&gt;
\\X_{2} - m_{x_{2}} = b_{21}Y_{1} + b_{22}Y_{2}&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\\X_{n} - m_{x_{n}} = b_{n1}Y_{1} + b_{n2}Y_{2} + \cdots + b_{nn}Y_{n}&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Поскольку компоненты вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; независимы и имеют стандартные параметры, справедливо выражение:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\mathbb{E}[Y_{i}Y_{j}] =&lt;br /&gt;
\left\{\begin{matrix} &lt;br /&gt;
1, &amp;amp;i = j, \\&lt;br /&gt;
0, &amp;amp;i \not= j.&lt;br /&gt;
\end{matrix}\right.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Почленно перемножив сами на себя и между собой соответственно левые и правые части уравнений системы и взяв от результатов перемножения математическое ожидание, получаем систему уравнений вида:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\mathbb{E}[(X_{1} - m_{x_{1}})(X_{1} - m_{x_{1}})] = \mathbb{E}[b_{11}Y_{1}b_{11}Y_{1}],&lt;br /&gt;
\\ \mathbb{E}[(X_{1} - m_{x_{1}})(X_{2} - m_{x_{2}})] = \mathbb{E}[(b_{21}Y_{1} + b_{22}Y_{2})b_{11}Y_{1}],&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, в левых частях полученной системы уравнений располагаются элементы заданной ковариационной матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;, а в правых — элементы искомой матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;. Последовательно решая эту систему, получаем формулы для расчета элементов &amp;lt;math&amp;gt;\sigma_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
b_{11}=\sqrt{\sigma_{11}}; b_{21}=\frac{\sigma_{12}}{\sqrt{\sigma_{11}}}; b_{22} = \sqrt{\sigma_{22} - \frac{\sigma_{12}}{\sigma_{11}}}, \cdots&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рекуррентная формула для расчета любого элемента матрицы преобразования &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b_{ij} = \frac {\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}} {\sqrt{\sigma_{ij} - \sum_{k=1}^{j-1} b_{jk}^2}}, \quad 1 \leqslant j \leqslant i \leqslant n&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(суммы с верхним нулевым пределом считаются равными нулю)&lt;br /&gt;
&lt;br /&gt;
Таким образом, матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; получается с помощью [[Разложение_Холецкого_(метод_квадратного_корня)|разложения Холецкого]] матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Генерация случайного вектора Y ====&lt;br /&gt;
&lt;br /&gt;
Пусть имеется генератор псевдослучайных чисел (ГПСЧ, PRNG), с помощью которого можно получить реализацию случайной величины &amp;lt;math&amp;gt;u \sim U(0,1) &amp;lt;/math&amp;gt;. Описанный выше случайный вектор &amp;lt;math&amp;gt;Y=(y_1, \cdots, y_n)&amp;lt;/math&amp;gt; с независимыми компонентами составим из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; реализаций случайной величины &amp;lt;math&amp;gt;\eta \sim N(0,1)&amp;lt;/math&amp;gt;. Каждую такую реализацию &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;, в свою очередь, получим с помощью приближения по ЦПТ &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; случайными величинами, распределенными равномерно на отрезке [0,1]:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right), \quad i = \overline{1, n} \\&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;u_j^i - &amp;lt;/math&amp;gt; реализации случайной величины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;\kappa - &amp;lt;/math&amp;gt; параметр, обеспечивающий качество приближения.&lt;br /&gt;
&lt;br /&gt;
Как правило, &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; берут равным 12 и считают, что для подавляющего числа практических задач обеспечивается должная точность вычислений&amp;lt;ref name = &amp;quot;VVV&amp;quot;&amp;gt;Балдин К.В., Уткин В.Б. Информационные системы в экономике. — М.:Дашков и Кo, 2008. — 395 с.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}, \quad 1 \leqslant j \leqslant i \leqslant n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;&lt;br /&gt;
* Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1) Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;b_{11}= \sqrt{\sigma_{11}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;b_{k1}= \frac{\sigma_{k1}}{l_{11}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad k = \overline{2,n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{2,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (c) &amp;lt;math&amp;gt;b_{ii} = \sqrt{\sigma_{ii} - \sum_{p = 1}^{i - 1} b_{ip}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (d) &amp;lt;math&amp;gt;b_{ji} = \frac{\sigma_{ji} - \sum_{p = 1}^{i - 1} b_{ip} b_{jp}} {l_{ii}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad i \neq n, j = \overline{i+1,n}&amp;lt;/math&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;u_j^i \leftarrow PRNG,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\quad j = \overline{1,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3) Вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i = m_{x_i} + \sum_{k = 1}^{i} b_{ik} y_{k}, \quad i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + \sum_{j=1}^{n-2}j(n-j-1) + n + \frac {n(n+1)}{2} =&lt;br /&gt;
  n(n+1) + \frac {n(n-1)(n-2)}{6}&amp;lt;/math&amp;gt; (умножений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + \sum_{j=1}^{n-2}j(n-j-1) + n =&lt;br /&gt;
  \frac {n(n+1)}{2} + \frac {n(n-1)(n-2)}{6}&amp;lt;/math&amp;gt; (вычитаний)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad (\kappa-1)n + \frac {n(n+1)}{2} = \frac {n(n-1+2\kappa)}{2}&amp;lt;/math&amp;gt; (сложений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + 2n = \frac {n(n+3)}{2}&amp;lt;/math&amp;gt; (делений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad n + n  = 2n &amp;lt;/math&amp;gt; (взятия квадратного корня)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{n}{6}\left(2n^2+9n+31+6\kappa\right) &amp;lt;/math&amp;gt; - итого операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
==== Заполнение матрицы B====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 1 макроструктуры алгоритма ([[Разложение_Холецкого_(метод_квадратного_корня)|&#039;&#039;разложения Холецкого&#039;&#039;]]) состоит из трёх групп вершин, расположенных в целочисленных узлах трёх областей разной размерности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин расположена в одномерной области, соответствующая ей операция вычисляет функцию SQRT. &lt;br /&gt;
Единственная координата каждой из вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргумент этой функции &lt;br /&gt;
	&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{11}&amp;lt;/math&amp;gt;; &lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ii}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин расположена в двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a / b&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;: &lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{j1}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1, j, i - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ji}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин расположена в трёхмерной области, соответствующая ей операция  &amp;lt;math&amp;gt;a - b * c&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; — меняется в диапазоне  от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;p = 1&amp;lt;/math&amp;gt; элемент входных данных &amp;lt;math&amp;gt;\sigma_{ji}&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;p &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i, j, p - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, i&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, j&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.1, выполненном для случая &amp;lt;math&amp;gt;n = 4&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
[[file:Cholesky full_in_out.png|thumb|center|1400px|Рисунок 1. Граф этапа 1 макроструктуры алгоритма. SQ — вычисление квадратного корня, F — операция a-bc, Div — деление, In — входные данные, Out — выходные.]]&lt;br /&gt;
&lt;br /&gt;
====Генерация вектора Y====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 2 макроструктуры алгоритма состоит из одной группы вершин, расположенной в целочисленных узлах одномерной области, соответствующая ей операция &amp;lt;math&amp;gt;\left(\sum\limits_{j=1}^{\kappa}u_j^i-\frac{\kappa}{2}\right)\sqrt{\frac{12}{\kappa}}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;u_j^i&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039;, поступающий с &amp;lt;math&amp;gt;PRNG&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039;, заданная положительная целочисленная константа; &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; алгоритма &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.3, выполненном для случая &amp;lt;math&amp;gt;n = 3, \kappa = 2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf2.png|650px|thumb|center|Рисунок 3. Граф этапа 3 макроструктуры алгоритма]]&lt;br /&gt;
&lt;br /&gt;
====Вычисление вектора X====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 3 макроструктуры алгоритма (&#039;&#039;умножение нижней треугольной матрицы на вектор и сложение результата с другим вектором&#039;&#039;) состоит из одной группы вершин, расположенной в целочисленных узлах двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a+bc&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;j = 1&amp;lt;/math&amp;gt; — компонента &amp;lt;math&amp;gt;m_{x_i}&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;j &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине с координатами &amp;lt;math&amp;gt;i, j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;b_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;y_{j}&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является:&lt;br /&gt;
* при &amp;lt;math&amp;gt;j &amp;lt; i&amp;lt;/math&amp;gt; — &#039;&#039;промежуточным данным&#039;&#039; этапа;&lt;br /&gt;
* при &amp;lt;math&amp;gt;j = i&amp;lt;/math&amp;gt; — &#039;&#039;выходным данным&#039;&#039; алгоритма &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.3, выполненном для случая &amp;lt;math&amp;gt; n = 4&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf3.png|750px|thumb|center|Рисунок 3. Граф этапа 3 макроструктуры алгоритма,  F — операция a+bc]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для распараллеливания доступны следующие опции:&lt;br /&gt;
* вычисление элементов матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в рамках столбца (под диагональю),&lt;br /&gt;
* генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;,&lt;br /&gt;
* вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (умножение матрицы на вектор, сложение векторов).&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: вещественная всюду плотная положительно определенная симметрическая  &amp;lt;math&amp;gt;(n \times n)&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;\Sigma&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;
* Выходные данные: вещественный &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектор &amp;lt;math&amp;gt;X&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;syntaxhighlight lang = c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// compute matrix B (core)&lt;br /&gt;
for (int j = 0; j &amp;lt; n; j++){&lt;br /&gt;
    double sum_down = matrix_cov[j][j];&lt;br /&gt;
    for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
        double cur = matrix_cov[j][k];&lt;br /&gt;
        sum_down -= cur * cur;&lt;br /&gt;
    }&lt;br /&gt;
    matrix_cov[j][j] = sqrt(sum_down);&lt;br /&gt;
    for (int i = j + 1; i &amp;lt; n; i++){&lt;br /&gt;
        double sum_up = matrix_cov[i][j];&lt;br /&gt;
        for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
            sum_up -= matrix_cov[i][k] * matrix_cov[j][k];&lt;br /&gt;
        }&lt;br /&gt;
        matrix_cov[i][j] = sum_up / matrix_cov[j][j];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
// generate vector Y&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){&lt;br /&gt;
    double sum = generate_uniform(n);&lt;br /&gt;
    for (int j = 0; j &amp;lt; CLT_NUM - 1; j++){&lt;br /&gt;
        sum += generate_uniform(n);&lt;br /&gt;
    }&lt;br /&gt;
    vec_Y[i] = (sum - CLT_NUM / 2) * sqrt(12.0 / CLT_NUM);&lt;br /&gt;
}&lt;br /&gt;
// linear transformation&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){  &lt;br /&gt;
    vec_X[i] = vec_exp[i];&lt;br /&gt;
    for (int k = 0; k &amp;lt;= i; k++){&lt;br /&gt;
        vec_X[i] += matrix_cov[i][k] * vec_Y[k];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Алгоритм был реализован на языке C++ с использованием Intel MPI Library и запущен на кластере regular4.&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add impi/5.0.1&lt;br /&gt;
 mpicxx -std=c++0x task.c -o _scratch/task&lt;br /&gt;
 sbatch -n256 impi ./task &amp;lt;matrix_size&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
* размер матрицы [1024 : 4864] с шагом 256,&lt;br /&gt;
* число ядер [2 : 256] с шагом-умножением в 2 раза.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:Ops_2.png|thumb|center|700px|Рисунок 4. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
MS Excel и распространённые статистические пакеты (напр., SPSS, Statistica) позволяют моделировать только одномерные статистические распределения. Имеется возможность &amp;quot;собрать&amp;quot; многомерное распределение из нескольких одномерных при условии, что компоненты независимы. Однако если необходимо исследовать данные с зависящими друг от друга переменными, то приходится писать собственную программу. При этом удобно воспользоваться готовой реализацией разложения Холецкого (точечного метода), представленной в таких прикладных пакетах, как LINPACK, LAPACK, SCALAPACK.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Lonalone</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26749</id>
		<title>Участник:Lonalone/Генерация гауссовского вектора методом линейных преобразований</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26749"/>
		<updated>2018-12-01T18:18:28Z</updated>

		<summary type="html">&lt;p&gt;Lonalone: /* Генерация вектора Y */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор описания: &#039;&#039;Меньших И. М.&#039;&#039;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из многомерных распределений особый интерес представляет нормальное. Этому закону подчиняются все результаты воздействия большого числа случайных факторов, среди которых нет превалирующих.&lt;br /&gt;
&lt;br /&gt;
В статье приведен алгоритм генерации n-мерного гауссовского случайного вектора с помощью &#039;&#039;метода линейных преобразований&#039;&#039;&amp;lt;ref name=&amp;quot;V&amp;quot;&amp;gt;(п. 1.10.4) Михайлов Г.А., Войтишек А.В. Численное статистическое моделирование. Методы Монте-Карло — М.: Академия, 2006. — 368 с.&amp;lt;/ref&amp;gt;. Известно, что случае нормально распределенного случайного вектора, ковариационная матрица вместе с математическим ожиданием этого вектора полностью определяют его распределение. Поэтому для полного статистического соответствия моделируемого и теоретического распределения гауссовского вектора достаточно обеспечить требуемые значения указанных параметров&amp;lt;ref name=&amp;quot;VV&amp;quot;&amp;gt; https://ru.wikipedia.org/wiki/Многомерное_нормальное_распределение&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея алгоритма заключается в линейном преобразовании n-мерного случайного вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, компоненты которого независимы и одинаково распределены по нормальному закону со стандартными параметрами, в случайный вектор &amp;lt;math&amp;gt;X&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;\Sigma&amp;lt;/math&amp;gt; и вектор математических ожиданий &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Sigma = \|\sigma_{ij}\| = \| \mathbb{E}[(X_{i} - m_{x_{i}})(X_{j} - m_{x_{j}})]\|, \\&lt;br /&gt;
M = (m_{x_{1}}, m_{x_{2}}, ..., m_{x_{n}})^T.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Требуется найти такую матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, которая позволяла бы получить искомый вектор &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; с требуемыми характеристиками в результате линейного преобразования &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — n-мерный случайный вектор с независимыми нормально распределенными компонентами со стандартными параметрами.&lt;br /&gt;
&lt;br /&gt;
Будем искать матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в виде нижней треугольной матрицы. Перейдем от матричной записи к системе алгебраических уравнений:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} X_{1} \\&lt;br /&gt;
 X_{2} \\ \vdots \\ X_{n} \end{pmatrix} =&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} b_{11} &amp;amp; 0 &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\b_{21} &amp;amp; b_{22} &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\ \vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \vdots&lt;br /&gt;
\\ b_{n1} &amp;amp; b_{n2} &amp;amp; \cdots &amp;amp; b_{nn}&lt;br /&gt;
\end{pmatrix} \times&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} Y_{1} \\&lt;br /&gt;
 Y_{2} \\ \vdots \\ Y_{n} \end{pmatrix} +&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} m_{x_{1}} \\&lt;br /&gt;
 m_{x_{2}} \\ \vdots \\ m_{x_{n}} \end{pmatrix} \Rightarrow&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}X_{1} - m_{x_{1}} = b_{11}Y_{1}&lt;br /&gt;
\\X_{2} - m_{x_{2}} = b_{21}Y_{1} + b_{22}Y_{2}&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\\X_{n} - m_{x_{n}} = b_{n1}Y_{1} + b_{n2}Y_{2} + \cdots + b_{nn}Y_{n}&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Поскольку компоненты вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; независимы и имеют стандартные параметры, справедливо выражение:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\mathbb{E}[Y_{i}Y_{j}] =&lt;br /&gt;
\left\{\begin{matrix} &lt;br /&gt;
1, &amp;amp;i = j, \\&lt;br /&gt;
0, &amp;amp;i \not= j.&lt;br /&gt;
\end{matrix}\right.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Почленно перемножив сами на себя и между собой соответственно левые и правые части уравнений системы и взяв от результатов перемножения математическое ожидание, получаем систему уравнений вида:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\mathbb{E}[(X_{1} - m_{x_{1}})(X_{1} - m_{x_{1}})] = \mathbb{E}[b_{11}Y_{1}b_{11}Y_{1}],&lt;br /&gt;
\\ \mathbb{E}[(X_{1} - m_{x_{1}})(X_{2} - m_{x_{2}})] = \mathbb{E}[(b_{21}Y_{1} + b_{22}Y_{2})b_{11}Y_{1}],&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, в левых частях полученной системы уравнений располагаются элементы заданной ковариационной матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;, а в правых — элементы искомой матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;. Последовательно решая эту систему, получаем формулы для расчета элементов &amp;lt;math&amp;gt;\sigma_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
b_{11}=\sqrt{\sigma_{11}}; b_{21}=\frac{\sigma_{12}}{\sqrt{\sigma_{11}}}; b_{22} = \sqrt{\sigma_{22} - \frac{\sigma_{12}}{\sigma_{11}}}, \cdots&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рекуррентная формула для расчета любого элемента матрицы преобразования &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b_{ij} = \frac {\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}} {\sqrt{\sigma_{ij} - \sum_{k=1}^{j-1} b_{jk}^2}}, \quad 1 \leqslant j \leqslant i \leqslant n&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(суммы с верхним нулевым пределом считаются равными нулю)&lt;br /&gt;
&lt;br /&gt;
Таким образом, матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; получается с помощью [[Разложение_Холецкого_(метод_квадратного_корня)|разложения Холецкого]] матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Генерация случайного вектора Y ====&lt;br /&gt;
&lt;br /&gt;
Пусть имеется генератор псевдослучайных чисел (ГПСЧ, PRNG), с помощью которого можно получить реализацию случайной величины &amp;lt;math&amp;gt;u \sim U(0,1) &amp;lt;/math&amp;gt;. Описанный выше случайный вектор &amp;lt;math&amp;gt;Y=(y_1, \cdots, y_n)&amp;lt;/math&amp;gt; с независимыми компонентами составим из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; реализаций случайной величины &amp;lt;math&amp;gt;\eta \sim N(0,1)&amp;lt;/math&amp;gt;. Каждую такую реализацию &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;, в свою очередь, получим с помощью приближения по ЦПТ &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; случайными величинами, распределенными равномерно на отрезке [0,1]:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right), \quad i = \overline{1, n} \\&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;u_j^i - &amp;lt;/math&amp;gt; реализации случайной величины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;\kappa - &amp;lt;/math&amp;gt; параметр, обеспечивающий качество приближения.&lt;br /&gt;
&lt;br /&gt;
Как правило, &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; берут равным 12 и считают, что для подавляющего числа практических задач обеспечивается должная точность вычислений&amp;lt;ref name = &amp;quot;VVV&amp;quot;&amp;gt;Балдин К.В., Уткин В.Б. Информационные системы в экономике. — М.:Дашков и Кo, 2008. — 395 с.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}, \quad 1 \leqslant j \leqslant i \leqslant n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;&lt;br /&gt;
* Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1) Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;b_{11}= \sqrt{\sigma_{11}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;b_{k1}= \frac{\sigma_{k1}}{l_{11}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad k = \overline{2,n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{2,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (c) &amp;lt;math&amp;gt;b_{ii} = \sqrt{\sigma_{ii} - \sum_{p = 1}^{i - 1} b_{ip}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (d) &amp;lt;math&amp;gt;b_{ji} = \frac{\sigma_{ji} - \sum_{p = 1}^{i - 1} b_{ip} b_{jp}} {l_{ii}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad i \neq n, j = \overline{i+1,n}&amp;lt;/math&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;u_j^i \leftarrow PRNG,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\quad j = \overline{1,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3) Вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i = m_{x_i} + \sum_{k = 1}^{i} b_{ik} y_{k}, \quad i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + \sum_{j=1}^{n-2}j(n-j-1) + n + \frac {n(n+1)}{2} =&lt;br /&gt;
  n(n+1) + \frac {n(n-1)(n-2)}{6}&amp;lt;/math&amp;gt; (умножений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + \sum_{j=1}^{n-2}j(n-j-1) + n =&lt;br /&gt;
  \frac {n(n+1)}{2} + \frac {n(n-1)(n-2)}{6}&amp;lt;/math&amp;gt; (вычитаний)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad (\kappa-1)n + \frac {n(n+1)}{2} = \frac {n(n-1+2\kappa)}{2}&amp;lt;/math&amp;gt; (сложений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + 2n = \frac {n(n+3)}{2}&amp;lt;/math&amp;gt; (делений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad n + n  = 2n &amp;lt;/math&amp;gt; (взятия квадратного корня)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{n}{6}\left(2n^2+9n+31+6\kappa\right) &amp;lt;/math&amp;gt; - итого операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
==== Заполнение матрицы B====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 1 макроструктуры алгоритма ([[Разложение_Холецкого_(метод_квадратного_корня)|&#039;&#039;разложения Холецкого&#039;&#039;]]) состоит из трёх групп вершин, расположенных в целочисленных узлах трёх областей разной размерности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин расположена в одномерной области, соответствующая ей операция вычисляет функцию SQRT. &lt;br /&gt;
Единственная координата каждой из вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргумент этой функции &lt;br /&gt;
	&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{11}&amp;lt;/math&amp;gt;; &lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ii}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин расположена в двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a / b&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;: &lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{j1}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1, j, i - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ji}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин расположена в трёхмерной области, соответствующая ей операция  &amp;lt;math&amp;gt;a - b * c&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; — меняется в диапазоне  от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;p = 1&amp;lt;/math&amp;gt; элемент входных данных &amp;lt;math&amp;gt;\sigma_{ji}&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;p &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i, j, p - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, i&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, j&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.1, выполненном для случая &amp;lt;math&amp;gt;n = 4&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
[[file:Cholesky full_in_out.png|thumb|center|1400px|Рисунок 1. Граф этапа 1 макроструктуры алгоритма. SQ — вычисление квадратного корня, F — операция a-bc, Div — деление, In — входные данные, Out — выходные.]]&lt;br /&gt;
&lt;br /&gt;
====Генерация вектора Y====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 2 макроструктуры алгоритма состоит из одной группы вершин, расположенной в целочисленных узлах одномерной области, соответствующая ей операция &amp;lt;math&amp;gt;\left(\sum\limits_{j=1}^{\kappa}u_j^i-\frac{\kappa}{2}\right)\sqrt{\frac{12}{\kappa}}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;u_j^i&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039;, поступающий с &amp;lt;math&amp;gt;PRNG&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039;, заданная положительная целочисленная константа; &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; алгоритма &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.3, выполненном для случая &amp;lt;math&amp;gt;n = 3, \kappa = 2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf3.png|750px|thumb|center|Рисунок 3. Граф этапа 3 макроструктуры алгоритма]]&lt;br /&gt;
&lt;br /&gt;
====Вычисление вектора X====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 3 макроструктуры алгоритма (&#039;&#039;умножение нижней треугольной матрицы на вектор и сложение результата с другим вектором&#039;&#039;) состоит из одной группы вершин, расположенной в целочисленных узлах двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a+bc&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;j = 1&amp;lt;/math&amp;gt; — компонента &amp;lt;math&amp;gt;m_{x_i}&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;j &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине с координатами &amp;lt;math&amp;gt;i, j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;b_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;y_{j}&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является:&lt;br /&gt;
* при &amp;lt;math&amp;gt;j &amp;lt; i&amp;lt;/math&amp;gt; — &#039;&#039;промежуточным данным&#039;&#039; этапа;&lt;br /&gt;
* при &amp;lt;math&amp;gt;j = i&amp;lt;/math&amp;gt; — &#039;&#039;выходным данным&#039;&#039; алгоритма &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.3, выполненном для случая &amp;lt;math&amp;gt; n = 4&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf3.png|750px|thumb|center|Рисунок 3. Граф этапа 3 макроструктуры алгоритма,  F — операция a+bc]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для распараллеливания доступны следующие опции:&lt;br /&gt;
* вычисление элементов матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в рамках столбца (под диагональю),&lt;br /&gt;
* генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;,&lt;br /&gt;
* вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (умножение матрицы на вектор, сложение векторов).&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: вещественная всюду плотная положительно определенная симметрическая  &amp;lt;math&amp;gt;(n \times n)&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;\Sigma&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;
* Выходные данные: вещественный &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектор &amp;lt;math&amp;gt;X&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;syntaxhighlight lang = c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// compute matrix B (core)&lt;br /&gt;
for (int j = 0; j &amp;lt; n; j++){&lt;br /&gt;
    double sum_down = matrix_cov[j][j];&lt;br /&gt;
    for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
        double cur = matrix_cov[j][k];&lt;br /&gt;
        sum_down -= cur * cur;&lt;br /&gt;
    }&lt;br /&gt;
    matrix_cov[j][j] = sqrt(sum_down);&lt;br /&gt;
    for (int i = j + 1; i &amp;lt; n; i++){&lt;br /&gt;
        double sum_up = matrix_cov[i][j];&lt;br /&gt;
        for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
            sum_up -= matrix_cov[i][k] * matrix_cov[j][k];&lt;br /&gt;
        }&lt;br /&gt;
        matrix_cov[i][j] = sum_up / matrix_cov[j][j];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
// generate vector Y&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){&lt;br /&gt;
    double sum = generate_uniform(n);&lt;br /&gt;
    for (int j = 0; j &amp;lt; CLT_NUM - 1; j++){&lt;br /&gt;
        sum += generate_uniform(n);&lt;br /&gt;
    }&lt;br /&gt;
    vec_Y[i] = (sum - CLT_NUM / 2) * sqrt(12.0 / CLT_NUM);&lt;br /&gt;
}&lt;br /&gt;
// linear transformation&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){  &lt;br /&gt;
    vec_X[i] = vec_exp[i];&lt;br /&gt;
    for (int k = 0; k &amp;lt;= i; k++){&lt;br /&gt;
        vec_X[i] += matrix_cov[i][k] * vec_Y[k];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Алгоритм был реализован на языке C++ с использованием Intel MPI Library и запущен на кластере regular4.&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add impi/5.0.1&lt;br /&gt;
 mpicxx -std=c++0x task.c -o _scratch/task&lt;br /&gt;
 sbatch -n256 impi ./task &amp;lt;matrix_size&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
* размер матрицы [1024 : 4864] с шагом 256,&lt;br /&gt;
* число ядер [2 : 256] с шагом-умножением в 2 раза.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:Ops_2.png|thumb|center|700px|Рисунок 4. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
MS Excel и распространённые статистические пакеты (напр., SPSS, Statistica) позволяют моделировать только одномерные статистические распределения. Имеется возможность &amp;quot;собрать&amp;quot; многомерное распределение из нескольких одномерных при условии, что компоненты независимы. Однако если необходимо исследовать данные с зависящими друг от друга переменными, то приходится писать собственную программу. При этом удобно воспользоваться готовой реализацией разложения Холецкого (точечного метода), представленной в таких прикладных пакетах, как LINPACK, LAPACK, SCALAPACK.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Lonalone</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26748</id>
		<title>Участник:Lonalone/Генерация гауссовского вектора методом линейных преобразований</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26748"/>
		<updated>2018-12-01T17:37:19Z</updated>

		<summary type="html">&lt;p&gt;Lonalone: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор описания: &#039;&#039;Меньших И. М.&#039;&#039;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из многомерных распределений особый интерес представляет нормальное. Этому закону подчиняются все результаты воздействия большого числа случайных факторов, среди которых нет превалирующих.&lt;br /&gt;
&lt;br /&gt;
В статье приведен алгоритм генерации n-мерного гауссовского случайного вектора с помощью &#039;&#039;метода линейных преобразований&#039;&#039;&amp;lt;ref name=&amp;quot;V&amp;quot;&amp;gt;(п. 1.10.4) Михайлов Г.А., Войтишек А.В. Численное статистическое моделирование. Методы Монте-Карло — М.: Академия, 2006. — 368 с.&amp;lt;/ref&amp;gt;. Известно, что случае нормально распределенного случайного вектора, ковариационная матрица вместе с математическим ожиданием этого вектора полностью определяют его распределение. Поэтому для полного статистического соответствия моделируемого и теоретического распределения гауссовского вектора достаточно обеспечить требуемые значения указанных параметров&amp;lt;ref name=&amp;quot;VV&amp;quot;&amp;gt; https://ru.wikipedia.org/wiki/Многомерное_нормальное_распределение&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея алгоритма заключается в линейном преобразовании n-мерного случайного вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, компоненты которого независимы и одинаково распределены по нормальному закону со стандартными параметрами, в случайный вектор &amp;lt;math&amp;gt;X&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;\Sigma&amp;lt;/math&amp;gt; и вектор математических ожиданий &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Sigma = \|\sigma_{ij}\| = \| \mathbb{E}[(X_{i} - m_{x_{i}})(X_{j} - m_{x_{j}})]\|, \\&lt;br /&gt;
M = (m_{x_{1}}, m_{x_{2}}, ..., m_{x_{n}})^T.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Требуется найти такую матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, которая позволяла бы получить искомый вектор &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; с требуемыми характеристиками в результате линейного преобразования &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — n-мерный случайный вектор с независимыми нормально распределенными компонентами со стандартными параметрами.&lt;br /&gt;
&lt;br /&gt;
Будем искать матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в виде нижней треугольной матрицы. Перейдем от матричной записи к системе алгебраических уравнений:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} X_{1} \\&lt;br /&gt;
 X_{2} \\ \vdots \\ X_{n} \end{pmatrix} =&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} b_{11} &amp;amp; 0 &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\b_{21} &amp;amp; b_{22} &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\ \vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \vdots&lt;br /&gt;
\\ b_{n1} &amp;amp; b_{n2} &amp;amp; \cdots &amp;amp; b_{nn}&lt;br /&gt;
\end{pmatrix} \times&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} Y_{1} \\&lt;br /&gt;
 Y_{2} \\ \vdots \\ Y_{n} \end{pmatrix} +&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} m_{x_{1}} \\&lt;br /&gt;
 m_{x_{2}} \\ \vdots \\ m_{x_{n}} \end{pmatrix} \Rightarrow&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}X_{1} - m_{x_{1}} = b_{11}Y_{1}&lt;br /&gt;
\\X_{2} - m_{x_{2}} = b_{21}Y_{1} + b_{22}Y_{2}&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\\X_{n} - m_{x_{n}} = b_{n1}Y_{1} + b_{n2}Y_{2} + \cdots + b_{nn}Y_{n}&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Поскольку компоненты вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; независимы и имеют стандартные параметры, справедливо выражение:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\mathbb{E}[Y_{i}Y_{j}] =&lt;br /&gt;
\left\{\begin{matrix} &lt;br /&gt;
1, &amp;amp;i = j, \\&lt;br /&gt;
0, &amp;amp;i \not= j.&lt;br /&gt;
\end{matrix}\right.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Почленно перемножив сами на себя и между собой соответственно левые и правые части уравнений системы и взяв от результатов перемножения математическое ожидание, получаем систему уравнений вида:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\mathbb{E}[(X_{1} - m_{x_{1}})(X_{1} - m_{x_{1}})] = \mathbb{E}[b_{11}Y_{1}b_{11}Y_{1}],&lt;br /&gt;
\\ \mathbb{E}[(X_{1} - m_{x_{1}})(X_{2} - m_{x_{2}})] = \mathbb{E}[(b_{21}Y_{1} + b_{22}Y_{2})b_{11}Y_{1}],&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, в левых частях полученной системы уравнений располагаются элементы заданной ковариационной матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;, а в правых — элементы искомой матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;. Последовательно решая эту систему, получаем формулы для расчета элементов &amp;lt;math&amp;gt;\sigma_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
b_{11}=\sqrt{\sigma_{11}}; b_{21}=\frac{\sigma_{12}}{\sqrt{\sigma_{11}}}; b_{22} = \sqrt{\sigma_{22} - \frac{\sigma_{12}}{\sigma_{11}}}, \cdots&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рекуррентная формула для расчета любого элемента матрицы преобразования &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b_{ij} = \frac {\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}} {\sqrt{\sigma_{ij} - \sum_{k=1}^{j-1} b_{jk}^2}}, \quad 1 \leqslant j \leqslant i \leqslant n&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(суммы с верхним нулевым пределом считаются равными нулю)&lt;br /&gt;
&lt;br /&gt;
Таким образом, матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; получается с помощью [[Разложение_Холецкого_(метод_квадратного_корня)|разложения Холецкого]] матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Генерация случайного вектора Y ====&lt;br /&gt;
&lt;br /&gt;
Пусть имеется генератор псевдослучайных чисел (ГПСЧ, PRNG), с помощью которого можно получить реализацию случайной величины &amp;lt;math&amp;gt;u \sim U(0,1) &amp;lt;/math&amp;gt;. Описанный выше случайный вектор &amp;lt;math&amp;gt;Y=(y_1, \cdots, y_n)&amp;lt;/math&amp;gt; с независимыми компонентами составим из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; реализаций случайной величины &amp;lt;math&amp;gt;\eta \sim N(0,1)&amp;lt;/math&amp;gt;. Каждую такую реализацию &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;, в свою очередь, получим с помощью приближения по ЦПТ &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; случайными величинами, распределенными равномерно на отрезке [0,1]:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right), \quad i = \overline{1, n} \\&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;u_j^i - &amp;lt;/math&amp;gt; реализации случайной величины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;\kappa - &amp;lt;/math&amp;gt; параметр, обеспечивающий качество приближения.&lt;br /&gt;
&lt;br /&gt;
Как правило, &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; берут равным 12 и считают, что для подавляющего числа практических задач обеспечивается должная точность вычислений&amp;lt;ref name = &amp;quot;VVV&amp;quot;&amp;gt;Балдин К.В., Уткин В.Б. Информационные системы в экономике. — М.:Дашков и Кo, 2008. — 395 с.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}, \quad 1 \leqslant j \leqslant i \leqslant n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;&lt;br /&gt;
* Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1) Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;b_{11}= \sqrt{\sigma_{11}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;b_{k1}= \frac{\sigma_{k1}}{l_{11}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad k = \overline{2,n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{2,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (c) &amp;lt;math&amp;gt;b_{ii} = \sqrt{\sigma_{ii} - \sum_{p = 1}^{i - 1} b_{ip}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (d) &amp;lt;math&amp;gt;b_{ji} = \frac{\sigma_{ji} - \sum_{p = 1}^{i - 1} b_{ip} b_{jp}} {l_{ii}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad i \neq n, j = \overline{i+1,n}&amp;lt;/math&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;u_j^i \leftarrow PRNG,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\quad j = \overline{1,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3) Вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i = m_{x_i} + \sum_{k = 1}^{i} b_{ik} y_{k}, \quad i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + \sum_{j=1}^{n-2}j(n-j-1) + n + \frac {n(n+1)}{2} =&lt;br /&gt;
  n(n+1) + \frac {n(n-1)(n-2)}{6}&amp;lt;/math&amp;gt; (умножений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + \sum_{j=1}^{n-2}j(n-j-1) + n =&lt;br /&gt;
  \frac {n(n+1)}{2} + \frac {n(n-1)(n-2)}{6}&amp;lt;/math&amp;gt; (вычитаний)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad (\kappa-1)n + \frac {n(n+1)}{2} = \frac {n(n-1+2\kappa)}{2}&amp;lt;/math&amp;gt; (сложений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + 2n = \frac {n(n+3)}{2}&amp;lt;/math&amp;gt; (делений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad n + n  = 2n &amp;lt;/math&amp;gt; (взятия квадратного корня)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{n}{6}\left(2n^2+9n+31+6\kappa\right) &amp;lt;/math&amp;gt; - итого операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
==== Заполнение матрицы B====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 1 макроструктуры алгоритма ([[Разложение_Холецкого_(метод_квадратного_корня)|&#039;&#039;разложения Холецкого&#039;&#039;]]) состоит из трёх групп вершин, расположенных в целочисленных узлах трёх областей разной размерности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин расположена в одномерной области, соответствующая ей операция вычисляет функцию SQRT. &lt;br /&gt;
Единственная координата каждой из вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргумент этой функции &lt;br /&gt;
	&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{11}&amp;lt;/math&amp;gt;; &lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ii}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин расположена в двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a / b&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;: &lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{j1}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1, j, i - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ji}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин расположена в трёхмерной области, соответствующая ей операция  &amp;lt;math&amp;gt;a - b * c&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; — меняется в диапазоне  от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;p = 1&amp;lt;/math&amp;gt; элемент входных данных &amp;lt;math&amp;gt;\sigma_{ji}&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;p &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i, j, p - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, i&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, j&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.1, выполненном для случая &amp;lt;math&amp;gt;n = 4&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
[[file:Cholesky full_in_out.png|thumb|center|1400px|Рисунок 1. Граф этапа 1 макроструктуры алгоритма. SQ — вычисление квадратного корня, F — операция a-bc, Div — деление, In — входные данные, Out — выходные.]]&lt;br /&gt;
&lt;br /&gt;
====Генерация вектора Y====&lt;br /&gt;
&lt;br /&gt;
====Вычисление вектора X====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 3 макроструктуры алгоритма (&#039;&#039;умножение нижней треугольной матрицы на вектор и сложение результата с другим вектором&#039;&#039;) состоит из одной группы вершин, расположенной в целочисленных узлах двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a+bc&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;j = 1&amp;lt;/math&amp;gt; — компонента &amp;lt;math&amp;gt;m_{x_i}&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;j &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине с координатами &amp;lt;math&amp;gt;i, j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;b_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;y_{j}&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является:&lt;br /&gt;
* при &amp;lt;math&amp;gt;j &amp;lt; i&amp;lt;/math&amp;gt; — &#039;&#039;промежуточным данным&#039;&#039; этапа;&lt;br /&gt;
* при &amp;lt;math&amp;gt;j = i&amp;lt;/math&amp;gt; — &#039;&#039;выходным данным&#039;&#039; алгоритма &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.3, выполненном для случая &amp;lt;math&amp;gt; n = 4&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf3.png|750px|thumb|center|Рисунок 3. Граф этапа 3 макроструктуры алгоритма,  F — операция a+bc]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для распараллеливания доступны следующие опции:&lt;br /&gt;
* вычисление элементов матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в рамках столбца (под диагональю),&lt;br /&gt;
* генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;,&lt;br /&gt;
* вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (умножение матрицы на вектор, сложение векторов).&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: вещественная всюду плотная положительно определенная симметрическая  &amp;lt;math&amp;gt;(n \times n)&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;\Sigma&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;
* Выходные данные: вещественный &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектор &amp;lt;math&amp;gt;X&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;syntaxhighlight lang = c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// compute matrix B (core)&lt;br /&gt;
for (int j = 0; j &amp;lt; n; j++){&lt;br /&gt;
    double sum_down = matrix_cov[j][j];&lt;br /&gt;
    for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
        double cur = matrix_cov[j][k];&lt;br /&gt;
        sum_down -= cur * cur;&lt;br /&gt;
    }&lt;br /&gt;
    matrix_cov[j][j] = sqrt(sum_down);&lt;br /&gt;
    for (int i = j + 1; i &amp;lt; n; i++){&lt;br /&gt;
        double sum_up = matrix_cov[i][j];&lt;br /&gt;
        for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
            sum_up -= matrix_cov[i][k] * matrix_cov[j][k];&lt;br /&gt;
        }&lt;br /&gt;
        matrix_cov[i][j] = sum_up / matrix_cov[j][j];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
// generate vector Y&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){&lt;br /&gt;
    double sum = generate_uniform(n);&lt;br /&gt;
    for (int j = 0; j &amp;lt; CLT_NUM - 1; j++){&lt;br /&gt;
        sum += generate_uniform(n);&lt;br /&gt;
    }&lt;br /&gt;
    vec_Y[i] = (sum - CLT_NUM / 2) * sqrt(12.0 / CLT_NUM);&lt;br /&gt;
}&lt;br /&gt;
// linear transformation&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){  &lt;br /&gt;
    vec_X[i] = vec_exp[i];&lt;br /&gt;
    for (int k = 0; k &amp;lt;= i; k++){&lt;br /&gt;
        vec_X[i] += matrix_cov[i][k] * vec_Y[k];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Алгоритм был реализован на языке C++ с использованием Intel MPI Library и запущен на кластере regular4.&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add impi/5.0.1&lt;br /&gt;
 mpicxx -std=c++0x task.c -o _scratch/task&lt;br /&gt;
 sbatch -n256 impi ./task &amp;lt;matrix_size&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
* размер матрицы [1024 : 4864] с шагом 256,&lt;br /&gt;
* число ядер [2 : 256] с шагом-умножением в 2 раза.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:Ops_2.png|thumb|center|700px|Рисунок 4. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
MS Excel и распространённые статистические пакеты (напр., SPSS, Statistica) позволяют моделировать только одномерные статистические распределения. Имеется возможность &amp;quot;собрать&amp;quot; многомерное распределение из нескольких одномерных при условии, что компоненты независимы. Однако если необходимо исследовать данные с зависящими друг от друга переменными, то приходится писать собственную программу. При этом удобно воспользоваться готовой реализацией разложения Холецкого (точечного метода), представленной в таких прикладных пакетах, как LINPACK, LAPACK, SCALAPACK.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Lonalone</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26747</id>
		<title>Участник:Lonalone/Генерация гауссовского вектора методом линейных преобразований</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26747"/>
		<updated>2018-12-01T17:29:03Z</updated>

		<summary type="html">&lt;p&gt;Lonalone: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор описания: &#039;&#039;Меньших И. М.&#039;&#039;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из многомерных распределений особый интерес представляет нормальное. Этому закону подчиняются все результаты воздействия большого числа случайных факторов, среди которых нет превалирующих.&lt;br /&gt;
&lt;br /&gt;
В статье приведен алгоритм генерации n-мерного гауссовского случайного вектора с помощью &#039;&#039;метода линейных преобразований&#039;&#039;&amp;lt;ref name=&amp;quot;V&amp;quot;&amp;gt;(п. 1.10.4) Михайлов Г.А., Войтишек А.В. Численное статистическое моделирование. Методы Монте-Карло — М.: Академия, 2006. — 368 с.&amp;lt;/ref&amp;gt;. Известно, что случае нормально распределенного случайного вектора, ковариационная матрица вместе с математическим ожиданием этого вектора полностью определяют его распределение. Поэтому для полного статистического соответствия моделируемого и теоретического распределения гауссовского вектора достаточно обеспечить требуемые значения указанных параметров&amp;lt;ref name=&amp;quot;VV&amp;quot;&amp;gt; https://ru.wikipedia.org/wiki/Многомерное_нормальное_распределение&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея алгоритма заключается в линейном преобразовании n-мерного случайного вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, компоненты которого независимы и одинаково распределены по нормальному закону со стандартными параметрами, в случайный вектор &amp;lt;math&amp;gt;X&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;\Sigma&amp;lt;/math&amp;gt; и вектор математических ожиданий &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Sigma = \|\sigma_{ij}\| = \| \mathbb{E}[(X_{i} - m_{x_{i}})(X_{j} - m_{x_{j}})]\|, \\&lt;br /&gt;
M = (m_{x_{1}}, m_{x_{2}}, ..., m_{x_{n}})^T.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Требуется найти такую матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, которая позволяла бы получить искомый вектор &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; с требуемыми характеристиками в результате линейного преобразования &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — n-мерный случайный вектор с независимыми нормально распределенными компонентами со стандартными параметрами.&lt;br /&gt;
&lt;br /&gt;
Будем искать матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в виде нижней треугольной матрицы. Перейдем от матричной записи к системе алгебраических уравнений:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} X_{1} \\&lt;br /&gt;
 X_{2} \\ \vdots \\ X_{n} \end{pmatrix} =&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} b_{11} &amp;amp; 0 &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\b_{21} &amp;amp; b_{22} &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\ \vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \vdots&lt;br /&gt;
\\ b_{n1} &amp;amp; b_{n2} &amp;amp; \cdots &amp;amp; b_{nn}&lt;br /&gt;
\end{pmatrix} \times&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} Y_{1} \\&lt;br /&gt;
 Y_{2} \\ \vdots \\ Y_{n} \end{pmatrix} +&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} m_{x_{1}} \\&lt;br /&gt;
 m_{x_{2}} \\ \vdots \\ m_{x_{n}} \end{pmatrix} \Rightarrow&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}X_{1} - m_{x_{1}} = b_{11}Y_{1}&lt;br /&gt;
\\X_{2} - m_{x_{2}} = b_{21}Y_{1} + b_{22}Y_{2}&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\\X_{n} - m_{x_{n}} = b_{n1}Y_{1} + b_{n2}Y_{2} + \cdots + b_{nn}Y_{n}&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Поскольку компоненты вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; независимы и имеют стандартные параметры, справедливо выражение:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\mathbb{E}[Y_{i}Y_{j}] =&lt;br /&gt;
\left\{\begin{matrix} &lt;br /&gt;
1, &amp;amp;i = j, \\&lt;br /&gt;
0, &amp;amp;i \not= j.&lt;br /&gt;
\end{matrix}\right.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Почленно перемножив сами на себя и между собой соответственно левые и правые части уравнений системы и взяв от результатов перемножения математическое ожидание, получаем систему уравнений вида:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\mathbb{E}[(X_{1} - m_{x_{1}})(X_{1} - m_{x_{1}})] = \mathbb{E}[b_{11}Y_{1}b_{11}Y_{1}],&lt;br /&gt;
\\ \mathbb{E}[(X_{1} - m_{x_{1}})(X_{2} - m_{x_{2}})] = \mathbb{E}[(b_{21}Y_{1} + b_{22}Y_{2})b_{11}Y_{1}],&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, в левых частях полученной системы уравнений располагаются элементы заданной ковариационной матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;, а в правых — элементы искомой матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;. Последовательно решая эту систему, получаем формулы для расчета элементов &amp;lt;math&amp;gt;\sigma_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
b_{11}=\sqrt{\sigma_{11}}; b_{21}=\frac{\sigma_{12}}{\sqrt{\sigma_{11}}}; b_{22} = \sqrt{\sigma_{22} - \frac{\sigma_{12}}{\sigma_{11}}}, \cdots&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рекуррентная формула для расчета любого элемента матрицы преобразования &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b_{ij} = \frac {\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}} {\sqrt{\sigma_{ij} - \sum_{k=1}^{j-1} b_{jk}^2}}, \quad 1 \leqslant j \leqslant i \leqslant n&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(суммы с верхним нулевым пределом считаются равными нулю)&lt;br /&gt;
&lt;br /&gt;
Таким образом, матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; получается с помощью [[Разложение_Холецкого_(метод_квадратного_корня)|разложения Холецкого]] матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Генерация случайного вектора Y ====&lt;br /&gt;
&lt;br /&gt;
Пусть имеется генератор псевдослучайных чисел (ГПСЧ, PRNG), с помощью которого можно получить реализацию случайной величины &amp;lt;math&amp;gt;u \sim U(0,1) &amp;lt;/math&amp;gt;. Описанный выше случайный вектор &amp;lt;math&amp;gt;Y=(y_1, \cdots, y_n)&amp;lt;/math&amp;gt; с независимыми компонентами составим из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; реализаций случайной величины &amp;lt;math&amp;gt;\eta \sim N(0,1)&amp;lt;/math&amp;gt;. Каждую такую реализацию &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;, в свою очередь, получим с помощью приближения по ЦПТ &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; случайными величинами, распределенными равномерно на отрезке [0,1]:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right), \quad i = \overline{1, n} \\&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;u_j^i - &amp;lt;/math&amp;gt; реализации случайной величины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;\kappa - &amp;lt;/math&amp;gt; параметр, обеспечивающий качество приближения.&lt;br /&gt;
&lt;br /&gt;
Как правило, &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; берут равным 12 и считают, что для подавляющего числа практических задач обеспечивается должная точность вычислений&amp;lt;ref name = &amp;quot;VVV&amp;quot;&amp;gt;Балдин К.В., Уткин В.Б. Информационные системы в экономике. — М.:Дашков и Кo, 2008. — 395 с.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}, \quad 1 \leqslant j \leqslant i \leqslant n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;&lt;br /&gt;
* Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1) Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;b_{11}= \sqrt{\sigma_{11}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;b_{k1}= \frac{\sigma_{k1}}{l_{11}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad k = \overline{2,n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{2,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (c) &amp;lt;math&amp;gt;b_{ii} = \sqrt{\sigma_{ii} - \sum_{p = 1}^{i - 1} b_{ip}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (d) &amp;lt;math&amp;gt;b_{ji} = \frac{\sigma_{ji} - \sum_{p = 1}^{i - 1} b_{ip} b_{jp}} {l_{ii}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad i \neq n, j = \overline{i+1,n}&amp;lt;/math&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;u_j^i \leftarrow PRNG,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\quad j = \overline{1,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3) Вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i = m_{x_i} + \sum_{k = 1}^{i} b_{ik} y_{k}, \quad i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + \sum_{j=1}^{n-2}j(n-j-1) + n + \frac {n(n+1)}{2} =&lt;br /&gt;
  n(n+1) + \frac {n(n-1)(n-2)}{6}&amp;lt;/math&amp;gt; (умножений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + \sum_{j=1}^{n-2}j(n-j-1) + n =&lt;br /&gt;
  \frac {n(n+1)}{2} + \frac {n(n-1)(n-2)}{6}&amp;lt;/math&amp;gt; (вычитаний)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad (\kappa-1)n + \frac {n(n+1)}{2} = \frac {n(n-1+2\kappa)}{2}&amp;lt;/math&amp;gt; (сложений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + 2n = \frac {n(n+3)}{2}&amp;lt;/math&amp;gt; (делений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad n + n  = 2n &amp;lt;/math&amp;gt; (взятия квадратного корня)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{n}{6}\left(2n^2+9n+31+6\kappa\right) &amp;lt;/math&amp;gt; - итого операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
==== Заполнение матрицы B====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 1 макроструктуры алгоритма ([[Разложение_Холецкого_(метод_квадратного_корня)|&#039;&#039;разложения Холецкого&#039;&#039;]]) состоит из трёх групп вершин, расположенных в целочисленных узлах трёх областей разной размерности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин расположена в одномерной области, соответствующая ей операция вычисляет функцию SQRT. &lt;br /&gt;
Единственная координата каждой из вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргумент этой функции &lt;br /&gt;
	&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{11}&amp;lt;/math&amp;gt;; &lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ii}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин расположена в двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a / b&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;: &lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{j1}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1, j, i - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ji}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин расположена в трёхмерной области, соответствующая ей операция  &amp;lt;math&amp;gt;a - b * c&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; — меняется в диапазоне  от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;p = 1&amp;lt;/math&amp;gt; элемент входных данных &amp;lt;math&amp;gt;\sigma_{ji}&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;p &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i, j, p - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, i&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, j&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.1, выполненном для случая &amp;lt;math&amp;gt;n = 4&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
[[file:Cholesky full_in_out.png|thumb|center|1400px|Рисунок 1. Граф этапа 1 макроструктуры алгоритма. SQ — вычисление квадратного корня, F — операция a-bc, Div — деление, In — входные данные, Out — выходные.]]&lt;br /&gt;
&lt;br /&gt;
====Генерация вектора Y====&lt;br /&gt;
&lt;br /&gt;
====Вычисление вектора X====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 3 макроструктуры алгоритма (&#039;&#039;умножение нижней треугольной матрицы на вектор и сложение результата с другим вектором&#039;&#039;) состоит из одной группы вершин, расположенной в целочисленных узлах двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a+bc&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;j = 1&amp;lt;/math&amp;gt; — компонента &amp;lt;math&amp;gt;m_{x_i}&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;j &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине с координатами &amp;lt;math&amp;gt;i, j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;b_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;y_{j}&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является:&lt;br /&gt;
* при &amp;lt;math&amp;gt;j &amp;lt; i&amp;lt;/math&amp;gt; — &#039;&#039;промежуточным данным&#039;&#039; этапа;&lt;br /&gt;
* при &amp;lt;math&amp;gt;j = i&amp;lt;/math&amp;gt; — &#039;&#039;выходным данным&#039;&#039; алгоритма &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.3, выполненном для случая &amp;lt;math&amp;gt; n = 4&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf3.png|750px|thumb|center|Рисунок 3. Граф этапа 3 макроструктуры алгоритма,  F — операция a+bc]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для распараллеливания доступны следующие опции:&lt;br /&gt;
* вычисление элементов матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в рамках столбца (под диагональю),&lt;br /&gt;
* генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;,&lt;br /&gt;
* вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (умножение матрицы на вектор, сложение векторов).&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: вещественная всюду плотная положительно определенная симметрическая  &amp;lt;math&amp;gt;(n \times n)&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;\Sigma&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;
* Выходные данные: вещественный &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектор &amp;lt;math&amp;gt;X&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;syntaxhighlight lang = c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// compute matrix B (core)&lt;br /&gt;
for (int j = 0; j &amp;lt; n; j++){&lt;br /&gt;
    double sum_down = matrix_cov[j][j];&lt;br /&gt;
    for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
        double cur = matrix_cov[j][k];&lt;br /&gt;
        sum_down -= cur * cur;&lt;br /&gt;
    }&lt;br /&gt;
    matrix_cov[j][j] = sqrt(sum_down);&lt;br /&gt;
    for (int i = j + 1; i &amp;lt; n; i++){&lt;br /&gt;
        double sum_up = matrix_cov[i][j];&lt;br /&gt;
        for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
            sum_up -= matrix_cov[i][k] * matrix_cov[j][k];&lt;br /&gt;
        }&lt;br /&gt;
        matrix_cov[i][j] = sum_up / matrix_cov[j][j];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
// generate vector Y&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){&lt;br /&gt;
    double sum = generate_uniform(n);&lt;br /&gt;
    for (int j = 0; j &amp;lt; CLT_NUM - 1; j++){&lt;br /&gt;
        sum += generate_uniform(n);&lt;br /&gt;
    }&lt;br /&gt;
    vec_Y[i] = (sum - CLT_NUM / 2) * sqrt(12.0 / CLT_NUM);&lt;br /&gt;
}&lt;br /&gt;
// linear transformation&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){  &lt;br /&gt;
    vec_X[i] = vec_exp[i];&lt;br /&gt;
    for (int k = 0; k &amp;lt;= i; k++){&lt;br /&gt;
        vec_X[i] += matrix_cov[i][k] * vec_Y[k];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Алгоритм был реализован на языке C++ с использованием Intel MPI Library и запущен на кластере regular4.&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add impi/5.0.1&lt;br /&gt;
 mpicxx -std=c++0x task.c -o _scratch/task&lt;br /&gt;
 sbatch -n256 impi ./task &amp;lt;matrix_size&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
* размер матрицы [1024 : 4864] с шагом 256,&lt;br /&gt;
* число ядер [2 : 256] с шагом-умножением в 2 раза.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:Ops_2.png|thumb|center|700px|Рисунок 4. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В отличие от разложения Холецкого, которое реализовано (точечный метод) во многих прикладных пакетах (напр., LINPACK, LAPACK, SCALAPACK), моделирование гауссовского случайного вектора не так &amp;quot;популярно&amp;quot;. MS Excel и распространённые статистические пакеты (напр., SPSS, Statistica) позволяют моделировать только одномерные статистические распределения.&lt;br /&gt;
&lt;br /&gt;
Имеется возможность &amp;quot;собрать&amp;quot; многомерное распределение из нескольких одномерных при условии, что компоненты независимы. Однако если необходимо исследовать данные с зависящими друг от друга переменными, то приходится писать собственную программу.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Lonalone</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26746</id>
		<title>Участник:Lonalone/Генерация гауссовского вектора методом линейных преобразований</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26746"/>
		<updated>2018-12-01T17:28:48Z</updated>

		<summary type="html">&lt;p&gt;Lonalone: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор описания: &#039;&#039;Меньших И. М.&#039;&#039;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из многомерных распределений особый интерес представляет нормальное. Этому закону подчиняются все результаты воздействия большого числа случайных факторов, среди которых нет превалирующих.&lt;br /&gt;
&lt;br /&gt;
В статье приведен алгоритм генерации n-мерного гауссовского случайного вектора с помощью &#039;&#039;метода линейных преобразований&#039;&#039;&amp;lt;ref name=&amp;quot;V&amp;quot;&amp;gt;(п. 1.10.4) Михайлов Г.А., Войтишек А.В. Численное статистическое моделирование. Методы Монте-Карло — М.: Академия, 2006. — 368 с.&amp;lt;/ref&amp;gt;. Известно, что случае нормально распределенного случайного вектора, ковариационная матрица вместе с математическим ожиданием этого вектора полностью определяют его распределение. Поэтому для полного статистического соответствия моделируемого и теоретического распределения гауссовского вектора достаточно обеспечить требуемые значения указанных параметров&amp;lt;ref name=&amp;quot;VV&amp;quot;&amp;gt; https://ru.wikipedia.org/wiki/Многомерное_нормальное_распределение&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея алгоритма заключается в линейном преобразовании n-мерного случайного вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, компоненты которого независимы и одинаково распределены по нормальному закону со стандартными параметрами, в случайный вектор &amp;lt;math&amp;gt;X&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;\Sigma&amp;lt;/math&amp;gt; и вектор математических ожиданий &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Sigma = \|\sigma_{ij}\| = \| \mathbb{E}[(X_{i} - m_{x_{i}})(X_{j} - m_{x_{j}})]\|, \\&lt;br /&gt;
M = (m_{x_{1}}, m_{x_{2}}, ..., m_{x_{n}})^T.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Требуется найти такую матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, которая позволяла бы получить искомый вектор &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; с требуемыми характеристиками в результате линейного преобразования &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — n-мерный случайный вектор с независимыми нормально распределенными компонентами со стандартными параметрами.&lt;br /&gt;
&lt;br /&gt;
Будем искать матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в виде нижней треугольной матрицы. Перейдем от матричной записи к системе алгебраических уравнений:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} X_{1} \\&lt;br /&gt;
 X_{2} \\ \vdots \\ X_{n} \end{pmatrix} =&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} b_{11} &amp;amp; 0 &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\b_{21} &amp;amp; b_{22} &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\ \vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \vdots&lt;br /&gt;
\\ b_{n1} &amp;amp; b_{n2} &amp;amp; \cdots &amp;amp; b_{nn}&lt;br /&gt;
\end{pmatrix} \times&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} Y_{1} \\&lt;br /&gt;
 Y_{2} \\ \vdots \\ Y_{n} \end{pmatrix} +&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} m_{x_{1}} \\&lt;br /&gt;
 m_{x_{2}} \\ \vdots \\ m_{x_{n}} \end{pmatrix} \Rightarrow&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}X_{1} - m_{x_{1}} = b_{11}Y_{1}&lt;br /&gt;
\\X_{2} - m_{x_{2}} = b_{21}Y_{1} + b_{22}Y_{2}&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\\X_{n} - m_{x_{n}} = b_{n1}Y_{1} + b_{n2}Y_{2} + \cdots + b_{nn}Y_{n}&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Поскольку компоненты вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; независимы и имеют стандартные параметры, справедливо выражение:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\mathbb{E}[Y_{i}Y_{j}] =&lt;br /&gt;
\left\{\begin{matrix} &lt;br /&gt;
1, &amp;amp;i = j, \\&lt;br /&gt;
0, &amp;amp;i \not= j.&lt;br /&gt;
\end{matrix}\right.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Почленно перемножив сами на себя и между собой соответственно левые и правые части уравнений системы и взяв от результатов перемножения математическое ожидание, получаем систему уравнений вида:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\mathbb{E}[(X_{1} - m_{x_{1}})(X_{1} - m_{x_{1}})] = \mathbb{E}[b_{11}Y_{1}b_{11}Y_{1}],&lt;br /&gt;
\\ \mathbb{E}[(X_{1} - m_{x_{1}})(X_{2} - m_{x_{2}})] = \mathbb{E}[(b_{21}Y_{1} + b_{22}Y_{2})b_{11}Y_{1}],&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, в левых частях полученной системы уравнений располагаются элементы заданной ковариационной матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;, а в правых — элементы искомой матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;. Последовательно решая эту систему, получаем формулы для расчета элементов &amp;lt;math&amp;gt;\sigma_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
b_{11}=\sqrt{\sigma_{11}}; b_{21}=\frac{\sigma_{12}}{\sqrt{\sigma_{11}}}; b_{22} = \sqrt{\sigma_{22} - \frac{\sigma_{12}}{\sigma_{11}}}, \cdots&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рекуррентная формула для расчета любого элемента матрицы преобразования &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b_{ij} = \frac {\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}} {\sqrt{\sigma_{ij} - \sum_{k=1}^{j-1} b_{jk}^2}}, \quad 1 \leqslant j \leqslant i \leqslant n&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(суммы с верхним нулевым пределом считаются равными нулю)&lt;br /&gt;
&lt;br /&gt;
Таким образом, матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; получается с помощью [[Разложение_Холецкого_(метод_квадратного_корня)|разложения Холецкого]] матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Генерация случайного вектора Y ====&lt;br /&gt;
&lt;br /&gt;
Пусть имеется генератор псевдослучайных чисел (ГПСЧ, PRNG), с помощью которого можно получить реализацию случайной величины &amp;lt;math&amp;gt;u \sim U(0,1) &amp;lt;/math&amp;gt;. Описанный выше случайный вектор &amp;lt;math&amp;gt;Y=(y_1, \cdots, y_n)&amp;lt;/math&amp;gt; с независимыми компонентами составим из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; реализаций случайной величины &amp;lt;math&amp;gt;\eta \sim N(0,1)&amp;lt;/math&amp;gt;. Каждую такую реализацию &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;, в свою очередь, получим с помощью приближения по ЦПТ &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; случайными величинами, распределенными равномерно на отрезке [0,1]:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right), \quad i = \overline{1, n} \\&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;u_j^i - &amp;lt;/math&amp;gt; реализации случайной величины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;\kappa - &amp;lt;/math&amp;gt; параметр, обеспечивающий качество приближения.&lt;br /&gt;
&lt;br /&gt;
Как правило, &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; берут равным 12 и считают, что для подавляющего числа практических задач обеспечивается должная точность вычислений&amp;lt;ref name = &amp;quot;VVV&amp;quot;&amp;gt;Балдин К.В., Уткин В.Б. Информационные системы в экономике. — М.:Дашков и Кo, 2008. — 395 с.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}, \quad 1 \leqslant j \leqslant i \leqslant n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;&lt;br /&gt;
* Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1) Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;b_{11}= \sqrt{\sigma_{11}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;b_{k1}= \frac{\sigma_{k1}}{l_{11}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad k = \overline{2,n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{2,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (c) &amp;lt;math&amp;gt;b_{ii} = \sqrt{\sigma_{ii} - \sum_{p = 1}^{i - 1} b_{ip}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (d) &amp;lt;math&amp;gt;b_{ji} = \frac{\sigma_{ji} - \sum_{p = 1}^{i - 1} b_{ip} b_{jp}} {l_{ii}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad i \neq n, j = \overline{i+1,n}&amp;lt;/math&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;u_j^i \leftarrow PRNG,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\quad j = \overline{1,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3) Вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i = m_{x_i} + \sum_{k = 1}^{i} b_{ik} y_{k}, \quad i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + \sum_{j=1}^{n-2}j(n-j-1) + n + \frac {n(n+1)}{2} =&lt;br /&gt;
  n(n+1) + \frac {n(n-1)(n-2)}{6}&amp;lt;/math&amp;gt; (умножений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + \sum_{j=1}^{n-2}j(n-j-1) + n =&lt;br /&gt;
  \frac {n(n+1)}{2} + \frac {n(n-1)(n-2)}{6}&amp;lt;/math&amp;gt; (вычитаний)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad (\kappa-1)n + \frac {n(n+1)}{2} = \frac {n(n-1+2\kappa)}{2}&amp;lt;/math&amp;gt; (сложений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + 2n = \frac {n(n+3)}{2}&amp;lt;/math&amp;gt; (делений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad n + n  = 2n &amp;lt;/math&amp;gt; (взятия квадратного корня)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{n}{6}\left(2n^2+9n+31+6\kappa\right) &amp;lt;/math&amp;gt; - итого операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
==== Заполнение матрицы B====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 1 макроструктуры алгоритма ([[Разложение_Холецкого_(метод_квадратного_корня)|&#039;&#039;разложения Холецкого&#039;&#039;]]) состоит из трёх групп вершин, расположенных в целочисленных узлах трёх областей разной размерности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин расположена в одномерной области, соответствующая ей операция вычисляет функцию SQRT. &lt;br /&gt;
Единственная координата каждой из вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргумент этой функции &lt;br /&gt;
	&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{11}&amp;lt;/math&amp;gt;; &lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ii}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин расположена в двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a / b&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;: &lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{j1}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1, j, i - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ji}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин расположена в трёхмерной области, соответствующая ей операция  &amp;lt;math&amp;gt;a - b * c&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; — меняется в диапазоне  от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;p = 1&amp;lt;/math&amp;gt; элемент входных данных &amp;lt;math&amp;gt;\sigma_{ji}&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;p &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i, j, p - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, i&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, j&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.1, выполненном для случая &amp;lt;math&amp;gt;n = 4&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
[[file:Cholesky full_in_out.png|thumb|center|1400px|Рисунок 1. Граф этапа 1 макроструктуры алгоритма. SQ — вычисление квадратного корня, F — операция a-bc, Div — деление, In — входные данные, Out — выходные.]]&lt;br /&gt;
&lt;br /&gt;
====Генерация вектора Y====&lt;br /&gt;
&lt;br /&gt;
====Вычисление вектора X====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 3 макроструктуры алгоритма (&#039;&#039;умножение нижней треугольной матрицы на вектор и сложение результата с другим вектором&#039;&#039;) состоит из одной группы вершин, расположенной в целочисленных узлах двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a+bc&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;j = 1&amp;lt;/math&amp;gt; — компонента &amp;lt;math&amp;gt;m_{x_i}&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;j &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине с координатами &amp;lt;math&amp;gt;i, j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;b_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;y_{j}&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является:&lt;br /&gt;
* при &amp;lt;math&amp;gt;j &amp;lt; i&amp;lt;/math&amp;gt; — &#039;&#039;промежуточным данным&#039;&#039; этапа;&lt;br /&gt;
* при &amp;lt;math&amp;gt;j = i&amp;lt;/math&amp;gt; — &#039;&#039;выходным данным&#039;&#039; алгоритма &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.3, выполненном для случая &amp;lt;math&amp;gt; n = 4&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf3.png|750px|thumb|center|Рисунок 3. Граф этапа 3 макроструктуры алгоритма,  F — операция a+bc]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для распараллеливания доступны следующие опции:&lt;br /&gt;
* вычисление элементов матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в рамках столбца (под диагональю),&lt;br /&gt;
* генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;,&lt;br /&gt;
* вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (умножение матрицы на вектор, сложение векторов).&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: вещественная всюду плотная положительно определенная симметрическая  &amp;lt;math&amp;gt;(n \times n)&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;\Sigma&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;
* Выходные данные: вещественный &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектор &amp;lt;math&amp;gt;X&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;syntaxhighlight lang = c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// compute matrix B (core)&lt;br /&gt;
for (int j = 0; j &amp;lt; n; j++){&lt;br /&gt;
    double sum_down = matrix_cov[j][j];&lt;br /&gt;
    for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
        double cur = matrix_cov[j][k];&lt;br /&gt;
        sum_down -= cur * cur;&lt;br /&gt;
    }&lt;br /&gt;
    matrix_cov[j][j] = sqrt(sum_down);&lt;br /&gt;
    for (int i = j + 1; i &amp;lt; n; i++){&lt;br /&gt;
        double sum_up = matrix_cov[i][j];&lt;br /&gt;
        for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
            sum_up -= matrix_cov[i][k] * matrix_cov[j][k];&lt;br /&gt;
        }&lt;br /&gt;
        matrix_cov[i][j] = sum_up / matrix_cov[j][j];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
// generate vector Y&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){&lt;br /&gt;
    double sum = generate_uniform(n);&lt;br /&gt;
    for (int j = 0; j &amp;lt; CLT_NUM - 1; j++){&lt;br /&gt;
        sum += generate_uniform(n);&lt;br /&gt;
    }&lt;br /&gt;
    vec_Y[i] = (sum - CLT_NUM / 2) * sqrt(12.0 / CLT_NUM);&lt;br /&gt;
}&lt;br /&gt;
// linear transformation&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){  &lt;br /&gt;
    vec_X[i] = vec_exp[i];&lt;br /&gt;
    for (int k = 0; k &amp;lt;= i; k++){&lt;br /&gt;
        vec_X[i] += matrix_cov[i][k] * vec_Y[k];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Алгоритм был реализован на языке C++ с использованием Intel MPI Library и запущен на кластере regular4.&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add impi/5.0.1&lt;br /&gt;
 mpicxx -std=c++0x task.c -o _scratch/task&lt;br /&gt;
 sbatch -n256 impi ./task &amp;lt;matrix_size&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
* размер матрицы [1024 : 4864] с шагом 256,&lt;br /&gt;
* число ядер [2 : 256] с шагом-умножением в 2 раза.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:Ops_2.png|thumb|center|700px|Рисунок 1. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В отличие от разложения Холецкого, которое реализовано (точечный метод) во многих прикладных пакетах (напр., LINPACK, LAPACK, SCALAPACK), моделирование гауссовского случайного вектора не так &amp;quot;популярно&amp;quot;. MS Excel и распространённые статистические пакеты (напр., SPSS, Statistica) позволяют моделировать только одномерные статистические распределения.&lt;br /&gt;
&lt;br /&gt;
Имеется возможность &amp;quot;собрать&amp;quot; многомерное распределение из нескольких одномерных при условии, что компоненты независимы. Однако если необходимо исследовать данные с зависящими друг от друга переменными, то приходится писать собственную программу.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Lonalone</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26745</id>
		<title>Участник:Lonalone/Генерация гауссовского вектора методом линейных преобразований</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26745"/>
		<updated>2018-12-01T07:27:25Z</updated>

		<summary type="html">&lt;p&gt;Lonalone: /* Вычисление вектора X */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор описания: &#039;&#039;Меньших И. М.&#039;&#039;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из многомерных распределений особый интерес представляет нормальное. Этому закону подчиняются все результаты воздействия большого числа случайных факторов, среди которых нет превалирующих.&lt;br /&gt;
&lt;br /&gt;
В статье приведен алгоритм генерации n-мерного гауссовского случайного вектора с помощью &#039;&#039;метода линейных преобразований&#039;&#039;&amp;lt;ref name=&amp;quot;V&amp;quot;&amp;gt;(п. 1.10.4) Михайлов Г.А., Войтишек А.В. Численное статистическое моделирование. Методы Монте-Карло — М.: Академия, 2006. — 368 с.&amp;lt;/ref&amp;gt;. Известно, что случае нормально распределенного случайного вектора, ковариационная матрица вместе с математическим ожиданием этого вектора полностью определяют его распределение. Поэтому для полного статистического соответствия моделируемого и теоретического распределения гауссовского вектора достаточно обеспечить требуемые значения указанных параметров&amp;lt;ref name=&amp;quot;VV&amp;quot;&amp;gt; https://ru.wikipedia.org/wiki/Многомерное_нормальное_распределение&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея алгоритма заключается в линейном преобразовании n-мерного случайного вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, компоненты которого независимы и одинаково распределены по нормальному закону со стандартными параметрами, в случайный вектор &amp;lt;math&amp;gt;X&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;\Sigma&amp;lt;/math&amp;gt; и вектор математических ожиданий &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Sigma = \|\sigma_{ij}\| = \| \mathbb{E}[(X_{i} - m_{x_{i}})(X_{j} - m_{x_{j}})]\|, \\&lt;br /&gt;
M = (m_{x_{1}}, m_{x_{2}}, ..., m_{x_{n}})^T.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Требуется найти такую матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, которая позволяла бы получить искомый вектор &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; с требуемыми характеристиками в результате линейного преобразования &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — n-мерный случайный вектор с независимыми нормально распределенными компонентами со стандартными параметрами.&lt;br /&gt;
&lt;br /&gt;
Будем искать матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в виде нижней треугольной матрицы. Перейдем от матричной записи к системе алгебраических уравнений:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} X_{1} \\&lt;br /&gt;
 X_{2} \\ \vdots \\ X_{n} \end{pmatrix} =&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} b_{11} &amp;amp; 0 &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\b_{21} &amp;amp; b_{22} &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\ \vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \vdots&lt;br /&gt;
\\ b_{n1} &amp;amp; b_{n2} &amp;amp; \cdots &amp;amp; b_{nn}&lt;br /&gt;
\end{pmatrix} \times&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} Y_{1} \\&lt;br /&gt;
 Y_{2} \\ \vdots \\ Y_{n} \end{pmatrix} +&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} m_{x_{1}} \\&lt;br /&gt;
 m_{x_{2}} \\ \vdots \\ m_{x_{n}} \end{pmatrix} \Rightarrow&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}X_{1} - m_{x_{1}} = b_{11}Y_{1}&lt;br /&gt;
\\X_{2} - m_{x_{2}} = b_{21}Y_{1} + b_{22}Y_{2}&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\\X_{n} - m_{x_{n}} = b_{n1}Y_{1} + b_{n2}Y_{2} + \cdots + b_{nn}Y_{n}&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Поскольку компоненты вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; независимы и имеют стандартные параметры, справедливо выражение:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\mathbb{E}[Y_{i}Y_{j}] =&lt;br /&gt;
\left\{\begin{matrix} &lt;br /&gt;
1, &amp;amp;i = j, \\&lt;br /&gt;
0, &amp;amp;i \not= j.&lt;br /&gt;
\end{matrix}\right.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Почленно перемножив сами на себя и между собой соответственно левые и правые части уравнений системы и взяв от результатов перемножения математическое ожидание, получаем систему уравнений вида:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\mathbb{E}[(X_{1} - m_{x_{1}})(X_{1} - m_{x_{1}})] = \mathbb{E}[b_{11}Y_{1}b_{11}Y_{1}],&lt;br /&gt;
\\ \mathbb{E}[(X_{1} - m_{x_{1}})(X_{2} - m_{x_{2}})] = \mathbb{E}[(b_{21}Y_{1} + b_{22}Y_{2})b_{11}Y_{1}],&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, в левых частях полученной системы уравнений располагаются элементы заданной ковариационной матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;, а в правых — элементы искомой матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;. Последовательно решая эту систему, получаем формулы для расчета элементов &amp;lt;math&amp;gt;\sigma_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
b_{11}=\sqrt{\sigma_{11}}; b_{21}=\frac{\sigma_{12}}{\sqrt{\sigma_{11}}}; b_{22} = \sqrt{\sigma_{22} - \frac{\sigma_{12}}{\sigma_{11}}}, \cdots&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рекуррентная формула для расчета любого элемента матрицы преобразования &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b_{ij} = \frac {\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}} {\sqrt{\sigma_{ij} - \sum_{k=1}^{j-1} b_{jk}^2}}, \quad 1 \leqslant j \leqslant i \leqslant n&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(суммы с верхним нулевым пределом считаются равными нулю)&lt;br /&gt;
&lt;br /&gt;
Таким образом, матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; получается с помощью [[Разложение_Холецкого_(метод_квадратного_корня)|разложения Холецкого]] матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Генерация случайного вектора Y ====&lt;br /&gt;
&lt;br /&gt;
Пусть имеется генератор псевдослучайных чисел (ГПСЧ, PRNG), с помощью которого можно получить реализацию случайной величины &amp;lt;math&amp;gt;u \sim U(0,1) &amp;lt;/math&amp;gt;. Описанный выше случайный вектор &amp;lt;math&amp;gt;Y=(y_1, \cdots, y_n)&amp;lt;/math&amp;gt; с независимыми компонентами составим из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; реализаций случайной величины &amp;lt;math&amp;gt;\eta \sim N(0,1)&amp;lt;/math&amp;gt;. Каждую такую реализацию &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;, в свою очередь, получим с помощью приближения по ЦПТ &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; случайными величинами, распределенными равномерно на отрезке [0,1]:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right), \quad i = \overline{1, n} \\&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;u_j^i - &amp;lt;/math&amp;gt; реализации случайной величины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;\kappa - &amp;lt;/math&amp;gt; параметр, обеспечивающий качество приближения.&lt;br /&gt;
&lt;br /&gt;
Как правило, &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; берут равным 12 и считают, что для подавляющего числа практических задач обеспечивается должная точность вычислений&amp;lt;ref name = &amp;quot;VVV&amp;quot;&amp;gt;Балдин К.В., Уткин В.Б. Информационные системы в экономике. — М.:Дашков и Кo, 2008. — 395 с.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}, \quad 1 \leqslant j \leqslant i \leqslant n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;&lt;br /&gt;
* Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1) Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;b_{11}= \sqrt{\sigma_{11}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;b_{k1}= \frac{\sigma_{k1}}{l_{11}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad k = \overline{2,n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{2,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (c) &amp;lt;math&amp;gt;b_{ii} = \sqrt{\sigma_{ii} - \sum_{p = 1}^{i - 1} b_{ip}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (d) &amp;lt;math&amp;gt;b_{ji} = \frac{\sigma_{ji} - \sum_{p = 1}^{i - 1} b_{ip} b_{jp}} {l_{ii}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad i \neq n, j = \overline{i+1,n}&amp;lt;/math&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;u_j^i \leftarrow PRNG,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\quad j = \overline{1,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3) Вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i = m_{x_i} + \sum_{k = 1}^{i} b_{ik} y_{k}, \quad i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + \sum_{j=1}^{n-2}j(n-j-1) + n + \frac {n(n+1)}{2} =&lt;br /&gt;
  n(n+1) + \frac {n(n-1)(n-2)}{6}&amp;lt;/math&amp;gt; (умножений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + \sum_{j=1}^{n-2}j(n-j-1) + n =&lt;br /&gt;
  \frac {n(n+1)}{2} + \frac {n(n-1)(n-2)}{6}&amp;lt;/math&amp;gt; (вычитаний)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad (\kappa-1)n + \frac {n(n+1)}{2} = \frac {n(n-1+2\kappa)}{2}&amp;lt;/math&amp;gt; (сложений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + 2n = \frac {n(n+3)}{2}&amp;lt;/math&amp;gt; (делений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad n + n  = 2n &amp;lt;/math&amp;gt; (взятия квадратного корня)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{n}{6}\left(2n^2+9n+31+6\kappa\right) &amp;lt;/math&amp;gt; - итого операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
==== Заполнение матрицы B====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 1 макроструктуры алгоритма ([[Разложение_Холецкого_(метод_квадратного_корня)|&#039;&#039;разложения Холецкого&#039;&#039;]]) состоит из трёх групп вершин, расположенных в целочисленных узлах трёх областей разной размерности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин расположена в одномерной области, соответствующая ей операция вычисляет функцию SQRT. &lt;br /&gt;
Единственная координата каждой из вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргумент этой функции &lt;br /&gt;
	&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{11}&amp;lt;/math&amp;gt;; &lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ii}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин расположена в двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a / b&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;: &lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{j1}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1, j, i - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ji}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин расположена в трёхмерной области, соответствующая ей операция  &amp;lt;math&amp;gt;a - b * c&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; — меняется в диапазоне  от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;p = 1&amp;lt;/math&amp;gt; элемент входных данных &amp;lt;math&amp;gt;\sigma_{ji}&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;p &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i, j, p - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, i&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, j&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.1, выполненном для случая &amp;lt;math&amp;gt;n = 4&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
[[file:Cholesky full_in_out.png|thumb|center|1400px|Рисунок 1. Граф этапа 1 макроструктуры алгоритма. SQ — вычисление квадратного корня, F — операция a-bc, Div — деление, In — входные данные, Out — выходные.]]&lt;br /&gt;
&lt;br /&gt;
====Генерация вектора Y====&lt;br /&gt;
&lt;br /&gt;
====Вычисление вектора X====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 3 макроструктуры алгоритма (&#039;&#039;умножение нижней треугольной матрицы на вектор и сложение результата с другим вектором&#039;&#039;) состоит из одной группы вершин, расположенной в целочисленных узлах двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a+bc&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;j = 1&amp;lt;/math&amp;gt; — компонента &amp;lt;math&amp;gt;m_{x_i}&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;j &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине с координатами &amp;lt;math&amp;gt;i, j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;b_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;y_{j}&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является:&lt;br /&gt;
* при &amp;lt;math&amp;gt;j &amp;lt; i&amp;lt;/math&amp;gt; — &#039;&#039;промежуточным данным&#039;&#039; этапа;&lt;br /&gt;
* при &amp;lt;math&amp;gt;j = i&amp;lt;/math&amp;gt; — &#039;&#039;выходным данным&#039;&#039; алгоритма &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.3, выполненном для случая &amp;lt;math&amp;gt; n = 4&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf3.png|750px|thumb|center|Рисунок 3. Граф этапа 3 макроструктуры алгоритма,  F — операция a+bc]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для распараллеливания доступны следующие опции:&lt;br /&gt;
* вычисление элементов матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в рамках столбца (под диагональю),&lt;br /&gt;
* генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;,&lt;br /&gt;
* вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (умножение матрицы на вектор, сложение векторов).&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: вещественная всюду плотная положительно определенная симметрическая  &amp;lt;math&amp;gt;(n \times n)&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;\Sigma&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;
* Выходные данные: вещественный &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектор &amp;lt;math&amp;gt;X&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;syntaxhighlight lang = c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// compute matrix B (core)&lt;br /&gt;
for (int j = 0; j &amp;lt; n; j++){&lt;br /&gt;
    double sum_down = matrix_cov[j][j];&lt;br /&gt;
    for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
        double cur = matrix_cov[j][k];&lt;br /&gt;
        sum_down -= cur * cur;&lt;br /&gt;
    }&lt;br /&gt;
    matrix_cov[j][j] = sqrt(sum_down);&lt;br /&gt;
    for (int i = j + 1; i &amp;lt; n; i++){&lt;br /&gt;
        double sum_up = matrix_cov[i][j];&lt;br /&gt;
        for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
            sum_up -= matrix_cov[i][k] * matrix_cov[j][k];&lt;br /&gt;
        }&lt;br /&gt;
        matrix_cov[i][j] = sum_up / matrix_cov[j][j];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
// generate vector Y&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){&lt;br /&gt;
    double sum = generate_uniform(n);&lt;br /&gt;
    for (int j = 0; j &amp;lt; CLT_NUM - 1; j++){&lt;br /&gt;
        sum += generate_uniform(n);&lt;br /&gt;
    }&lt;br /&gt;
    vec_Y[i] = (sum - CLT_NUM / 2) * sqrt(12.0 / CLT_NUM);&lt;br /&gt;
}&lt;br /&gt;
// linear transformation&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){  &lt;br /&gt;
    vec_X[i] = vec_exp[i];&lt;br /&gt;
    for (int k = 0; k &amp;lt;= i; k++){&lt;br /&gt;
        vec_X[i] += matrix_cov[i][k] * vec_Y[k];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Алгоритм был реализован на языке C++ с использованием Intel MPI Library и запущен на кластере regular4.&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add impi/5.0.1&lt;br /&gt;
 mpicxx -std=c++0x task.c -o _scratch/task&lt;br /&gt;
 cd _scratch&lt;br /&gt;
 sbatch -n256 impi ./task &amp;lt;matrix_size&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
* размер матрицы [1024 : 4864] с шагом 256,&lt;br /&gt;
* число ядер [2 : 256] с шагом-умножением в 2 раза.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:Ops_2.png|thumb|center|700px|Рисунок 1. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В отличие от разложения Холецкого, которое реализовано (точечный метод) во многих прикладных пакетах (напр., LINPACK, LAPACK, SCALAPACK), моделирование гауссовского случайного вектора не так &amp;quot;популярно&amp;quot;. MS Excel и распространённые статистические пакеты (напр., SPSS, Statistica) позволяют моделировать только одномерные статистические распределения.&lt;br /&gt;
&lt;br /&gt;
Имеется возможность &amp;quot;собрать&amp;quot; многомерное распределение из нескольких одномерных при условии, что компоненты независимы. Однако если необходимо исследовать данные с зависящими друг от друга переменными, то приходится писать собственную программу.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Lonalone</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26744</id>
		<title>Участник:Lonalone/Генерация гауссовского вектора методом линейных преобразований</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26744"/>
		<updated>2018-12-01T07:26:35Z</updated>

		<summary type="html">&lt;p&gt;Lonalone: /* Заполнение матрицы B */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор описания: &#039;&#039;Меньших И. М.&#039;&#039;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из многомерных распределений особый интерес представляет нормальное. Этому закону подчиняются все результаты воздействия большого числа случайных факторов, среди которых нет превалирующих.&lt;br /&gt;
&lt;br /&gt;
В статье приведен алгоритм генерации n-мерного гауссовского случайного вектора с помощью &#039;&#039;метода линейных преобразований&#039;&#039;&amp;lt;ref name=&amp;quot;V&amp;quot;&amp;gt;(п. 1.10.4) Михайлов Г.А., Войтишек А.В. Численное статистическое моделирование. Методы Монте-Карло — М.: Академия, 2006. — 368 с.&amp;lt;/ref&amp;gt;. Известно, что случае нормально распределенного случайного вектора, ковариационная матрица вместе с математическим ожиданием этого вектора полностью определяют его распределение. Поэтому для полного статистического соответствия моделируемого и теоретического распределения гауссовского вектора достаточно обеспечить требуемые значения указанных параметров&amp;lt;ref name=&amp;quot;VV&amp;quot;&amp;gt; https://ru.wikipedia.org/wiki/Многомерное_нормальное_распределение&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея алгоритма заключается в линейном преобразовании n-мерного случайного вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, компоненты которого независимы и одинаково распределены по нормальному закону со стандартными параметрами, в случайный вектор &amp;lt;math&amp;gt;X&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;\Sigma&amp;lt;/math&amp;gt; и вектор математических ожиданий &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Sigma = \|\sigma_{ij}\| = \| \mathbb{E}[(X_{i} - m_{x_{i}})(X_{j} - m_{x_{j}})]\|, \\&lt;br /&gt;
M = (m_{x_{1}}, m_{x_{2}}, ..., m_{x_{n}})^T.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Требуется найти такую матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, которая позволяла бы получить искомый вектор &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; с требуемыми характеристиками в результате линейного преобразования &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — n-мерный случайный вектор с независимыми нормально распределенными компонентами со стандартными параметрами.&lt;br /&gt;
&lt;br /&gt;
Будем искать матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в виде нижней треугольной матрицы. Перейдем от матричной записи к системе алгебраических уравнений:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} X_{1} \\&lt;br /&gt;
 X_{2} \\ \vdots \\ X_{n} \end{pmatrix} =&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} b_{11} &amp;amp; 0 &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\b_{21} &amp;amp; b_{22} &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\ \vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \vdots&lt;br /&gt;
\\ b_{n1} &amp;amp; b_{n2} &amp;amp; \cdots &amp;amp; b_{nn}&lt;br /&gt;
\end{pmatrix} \times&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} Y_{1} \\&lt;br /&gt;
 Y_{2} \\ \vdots \\ Y_{n} \end{pmatrix} +&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} m_{x_{1}} \\&lt;br /&gt;
 m_{x_{2}} \\ \vdots \\ m_{x_{n}} \end{pmatrix} \Rightarrow&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}X_{1} - m_{x_{1}} = b_{11}Y_{1}&lt;br /&gt;
\\X_{2} - m_{x_{2}} = b_{21}Y_{1} + b_{22}Y_{2}&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\\X_{n} - m_{x_{n}} = b_{n1}Y_{1} + b_{n2}Y_{2} + \cdots + b_{nn}Y_{n}&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Поскольку компоненты вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; независимы и имеют стандартные параметры, справедливо выражение:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\mathbb{E}[Y_{i}Y_{j}] =&lt;br /&gt;
\left\{\begin{matrix} &lt;br /&gt;
1, &amp;amp;i = j, \\&lt;br /&gt;
0, &amp;amp;i \not= j.&lt;br /&gt;
\end{matrix}\right.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Почленно перемножив сами на себя и между собой соответственно левые и правые части уравнений системы и взяв от результатов перемножения математическое ожидание, получаем систему уравнений вида:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\mathbb{E}[(X_{1} - m_{x_{1}})(X_{1} - m_{x_{1}})] = \mathbb{E}[b_{11}Y_{1}b_{11}Y_{1}],&lt;br /&gt;
\\ \mathbb{E}[(X_{1} - m_{x_{1}})(X_{2} - m_{x_{2}})] = \mathbb{E}[(b_{21}Y_{1} + b_{22}Y_{2})b_{11}Y_{1}],&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, в левых частях полученной системы уравнений располагаются элементы заданной ковариационной матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;, а в правых — элементы искомой матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;. Последовательно решая эту систему, получаем формулы для расчета элементов &amp;lt;math&amp;gt;\sigma_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
b_{11}=\sqrt{\sigma_{11}}; b_{21}=\frac{\sigma_{12}}{\sqrt{\sigma_{11}}}; b_{22} = \sqrt{\sigma_{22} - \frac{\sigma_{12}}{\sigma_{11}}}, \cdots&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рекуррентная формула для расчета любого элемента матрицы преобразования &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b_{ij} = \frac {\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}} {\sqrt{\sigma_{ij} - \sum_{k=1}^{j-1} b_{jk}^2}}, \quad 1 \leqslant j \leqslant i \leqslant n&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(суммы с верхним нулевым пределом считаются равными нулю)&lt;br /&gt;
&lt;br /&gt;
Таким образом, матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; получается с помощью [[Разложение_Холецкого_(метод_квадратного_корня)|разложения Холецкого]] матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Генерация случайного вектора Y ====&lt;br /&gt;
&lt;br /&gt;
Пусть имеется генератор псевдослучайных чисел (ГПСЧ, PRNG), с помощью которого можно получить реализацию случайной величины &amp;lt;math&amp;gt;u \sim U(0,1) &amp;lt;/math&amp;gt;. Описанный выше случайный вектор &amp;lt;math&amp;gt;Y=(y_1, \cdots, y_n)&amp;lt;/math&amp;gt; с независимыми компонентами составим из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; реализаций случайной величины &amp;lt;math&amp;gt;\eta \sim N(0,1)&amp;lt;/math&amp;gt;. Каждую такую реализацию &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;, в свою очередь, получим с помощью приближения по ЦПТ &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; случайными величинами, распределенными равномерно на отрезке [0,1]:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right), \quad i = \overline{1, n} \\&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;u_j^i - &amp;lt;/math&amp;gt; реализации случайной величины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;\kappa - &amp;lt;/math&amp;gt; параметр, обеспечивающий качество приближения.&lt;br /&gt;
&lt;br /&gt;
Как правило, &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; берут равным 12 и считают, что для подавляющего числа практических задач обеспечивается должная точность вычислений&amp;lt;ref name = &amp;quot;VVV&amp;quot;&amp;gt;Балдин К.В., Уткин В.Б. Информационные системы в экономике. — М.:Дашков и Кo, 2008. — 395 с.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}, \quad 1 \leqslant j \leqslant i \leqslant n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;&lt;br /&gt;
* Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1) Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;b_{11}= \sqrt{\sigma_{11}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;b_{k1}= \frac{\sigma_{k1}}{l_{11}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad k = \overline{2,n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{2,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (c) &amp;lt;math&amp;gt;b_{ii} = \sqrt{\sigma_{ii} - \sum_{p = 1}^{i - 1} b_{ip}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (d) &amp;lt;math&amp;gt;b_{ji} = \frac{\sigma_{ji} - \sum_{p = 1}^{i - 1} b_{ip} b_{jp}} {l_{ii}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad i \neq n, j = \overline{i+1,n}&amp;lt;/math&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;u_j^i \leftarrow PRNG,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\quad j = \overline{1,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3) Вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i = m_{x_i} + \sum_{k = 1}^{i} b_{ik} y_{k}, \quad i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + \sum_{j=1}^{n-2}j(n-j-1) + n + \frac {n(n+1)}{2} =&lt;br /&gt;
  n(n+1) + \frac {n(n-1)(n-2)}{6}&amp;lt;/math&amp;gt; (умножений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + \sum_{j=1}^{n-2}j(n-j-1) + n =&lt;br /&gt;
  \frac {n(n+1)}{2} + \frac {n(n-1)(n-2)}{6}&amp;lt;/math&amp;gt; (вычитаний)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad (\kappa-1)n + \frac {n(n+1)}{2} = \frac {n(n-1+2\kappa)}{2}&amp;lt;/math&amp;gt; (сложений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + 2n = \frac {n(n+3)}{2}&amp;lt;/math&amp;gt; (делений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad n + n  = 2n &amp;lt;/math&amp;gt; (взятия квадратного корня)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{n}{6}\left(2n^2+9n+31+6\kappa\right) &amp;lt;/math&amp;gt; - итого операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
==== Заполнение матрицы B====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 1 макроструктуры алгоритма ([[Разложение_Холецкого_(метод_квадратного_корня)|&#039;&#039;разложения Холецкого&#039;&#039;]]) состоит из трёх групп вершин, расположенных в целочисленных узлах трёх областей разной размерности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин расположена в одномерной области, соответствующая ей операция вычисляет функцию SQRT. &lt;br /&gt;
Единственная координата каждой из вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргумент этой функции &lt;br /&gt;
	&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{11}&amp;lt;/math&amp;gt;; &lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ii}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин расположена в двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a / b&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;: &lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{j1}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1, j, i - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ji}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин расположена в трёхмерной области, соответствующая ей операция  &amp;lt;math&amp;gt;a - b * c&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; — меняется в диапазоне  от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;p = 1&amp;lt;/math&amp;gt; элемент входных данных &amp;lt;math&amp;gt;\sigma_{ji}&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;p &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i, j, p - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, i&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, j&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.1, выполненном для случая &amp;lt;math&amp;gt;n = 4&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
[[file:Cholesky full_in_out.png|thumb|center|1400px|Рисунок 1. Граф этапа 1 макроструктуры алгоритма. SQ — вычисление квадратного корня, F — операция a-bc, Div — деление, In — входные данные, Out — выходные.]]&lt;br /&gt;
&lt;br /&gt;
====Генерация вектора Y====&lt;br /&gt;
&lt;br /&gt;
====Вычисление вектора X====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 3 макроструктуры алгоритма (умножение нижней треугольной матрицы на вектор и сложение результата с другим вектором) состоит из одной группы вершин, расположенной в целочисленных узлах двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a+bc&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;j = 1&amp;lt;/math&amp;gt; — компонента &amp;lt;math&amp;gt;m_{x_i}&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;j &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине с координатами &amp;lt;math&amp;gt;i, j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;b_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;y_{j}&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является:&lt;br /&gt;
* при &amp;lt;math&amp;gt;j &amp;lt; i&amp;lt;/math&amp;gt; — &#039;&#039;промежуточным данным&#039;&#039; этапа;&lt;br /&gt;
* при &amp;lt;math&amp;gt;j = i&amp;lt;/math&amp;gt; — &#039;&#039;выходным данным&#039;&#039; алгоритма &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.3, выполненном для случая &amp;lt;math&amp;gt; n = 4&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf3.png|750px|thumb|center|Рисунок 3. Граф этапа 3 макроструктуры алгоритма,  F — операция a+bc]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для распараллеливания доступны следующие опции:&lt;br /&gt;
* вычисление элементов матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в рамках столбца (под диагональю),&lt;br /&gt;
* генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;,&lt;br /&gt;
* вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (умножение матрицы на вектор, сложение векторов).&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: вещественная всюду плотная положительно определенная симметрическая  &amp;lt;math&amp;gt;(n \times n)&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;\Sigma&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;
* Выходные данные: вещественный &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектор &amp;lt;math&amp;gt;X&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;syntaxhighlight lang = c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// compute matrix B (core)&lt;br /&gt;
for (int j = 0; j &amp;lt; n; j++){&lt;br /&gt;
    double sum_down = matrix_cov[j][j];&lt;br /&gt;
    for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
        double cur = matrix_cov[j][k];&lt;br /&gt;
        sum_down -= cur * cur;&lt;br /&gt;
    }&lt;br /&gt;
    matrix_cov[j][j] = sqrt(sum_down);&lt;br /&gt;
    for (int i = j + 1; i &amp;lt; n; i++){&lt;br /&gt;
        double sum_up = matrix_cov[i][j];&lt;br /&gt;
        for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
            sum_up -= matrix_cov[i][k] * matrix_cov[j][k];&lt;br /&gt;
        }&lt;br /&gt;
        matrix_cov[i][j] = sum_up / matrix_cov[j][j];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
// generate vector Y&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){&lt;br /&gt;
    double sum = generate_uniform(n);&lt;br /&gt;
    for (int j = 0; j &amp;lt; CLT_NUM - 1; j++){&lt;br /&gt;
        sum += generate_uniform(n);&lt;br /&gt;
    }&lt;br /&gt;
    vec_Y[i] = (sum - CLT_NUM / 2) * sqrt(12.0 / CLT_NUM);&lt;br /&gt;
}&lt;br /&gt;
// linear transformation&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){  &lt;br /&gt;
    vec_X[i] = vec_exp[i];&lt;br /&gt;
    for (int k = 0; k &amp;lt;= i; k++){&lt;br /&gt;
        vec_X[i] += matrix_cov[i][k] * vec_Y[k];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Алгоритм был реализован на языке C++ с использованием Intel MPI Library и запущен на кластере regular4.&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add impi/5.0.1&lt;br /&gt;
 mpicxx -std=c++0x task.c -o _scratch/task&lt;br /&gt;
 cd _scratch&lt;br /&gt;
 sbatch -n256 impi ./task &amp;lt;matrix_size&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
* размер матрицы [1024 : 4864] с шагом 256,&lt;br /&gt;
* число ядер [2 : 256] с шагом-умножением в 2 раза.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:Ops_2.png|thumb|center|700px|Рисунок 1. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В отличие от разложения Холецкого, которое реализовано (точечный метод) во многих прикладных пакетах (напр., LINPACK, LAPACK, SCALAPACK), моделирование гауссовского случайного вектора не так &amp;quot;популярно&amp;quot;. MS Excel и распространённые статистические пакеты (напр., SPSS, Statistica) позволяют моделировать только одномерные статистические распределения.&lt;br /&gt;
&lt;br /&gt;
Имеется возможность &amp;quot;собрать&amp;quot; многомерное распределение из нескольких одномерных при условии, что компоненты независимы. Однако если необходимо исследовать данные с зависящими друг от друга переменными, то приходится писать собственную программу.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Lonalone</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26743</id>
		<title>Участник:Lonalone/Генерация гауссовского вектора методом линейных преобразований</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26743"/>
		<updated>2018-12-01T07:24:07Z</updated>

		<summary type="html">&lt;p&gt;Lonalone: /* Заполнение матрицы B */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор описания: &#039;&#039;Меньших И. М.&#039;&#039;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из многомерных распределений особый интерес представляет нормальное. Этому закону подчиняются все результаты воздействия большого числа случайных факторов, среди которых нет превалирующих.&lt;br /&gt;
&lt;br /&gt;
В статье приведен алгоритм генерации n-мерного гауссовского случайного вектора с помощью &#039;&#039;метода линейных преобразований&#039;&#039;&amp;lt;ref name=&amp;quot;V&amp;quot;&amp;gt;(п. 1.10.4) Михайлов Г.А., Войтишек А.В. Численное статистическое моделирование. Методы Монте-Карло — М.: Академия, 2006. — 368 с.&amp;lt;/ref&amp;gt;. Известно, что случае нормально распределенного случайного вектора, ковариационная матрица вместе с математическим ожиданием этого вектора полностью определяют его распределение. Поэтому для полного статистического соответствия моделируемого и теоретического распределения гауссовского вектора достаточно обеспечить требуемые значения указанных параметров&amp;lt;ref name=&amp;quot;VV&amp;quot;&amp;gt; https://ru.wikipedia.org/wiki/Многомерное_нормальное_распределение&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея алгоритма заключается в линейном преобразовании n-мерного случайного вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, компоненты которого независимы и одинаково распределены по нормальному закону со стандартными параметрами, в случайный вектор &amp;lt;math&amp;gt;X&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;\Sigma&amp;lt;/math&amp;gt; и вектор математических ожиданий &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Sigma = \|\sigma_{ij}\| = \| \mathbb{E}[(X_{i} - m_{x_{i}})(X_{j} - m_{x_{j}})]\|, \\&lt;br /&gt;
M = (m_{x_{1}}, m_{x_{2}}, ..., m_{x_{n}})^T.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Требуется найти такую матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, которая позволяла бы получить искомый вектор &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; с требуемыми характеристиками в результате линейного преобразования &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — n-мерный случайный вектор с независимыми нормально распределенными компонентами со стандартными параметрами.&lt;br /&gt;
&lt;br /&gt;
Будем искать матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в виде нижней треугольной матрицы. Перейдем от матричной записи к системе алгебраических уравнений:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} X_{1} \\&lt;br /&gt;
 X_{2} \\ \vdots \\ X_{n} \end{pmatrix} =&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} b_{11} &amp;amp; 0 &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\b_{21} &amp;amp; b_{22} &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\ \vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \vdots&lt;br /&gt;
\\ b_{n1} &amp;amp; b_{n2} &amp;amp; \cdots &amp;amp; b_{nn}&lt;br /&gt;
\end{pmatrix} \times&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} Y_{1} \\&lt;br /&gt;
 Y_{2} \\ \vdots \\ Y_{n} \end{pmatrix} +&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} m_{x_{1}} \\&lt;br /&gt;
 m_{x_{2}} \\ \vdots \\ m_{x_{n}} \end{pmatrix} \Rightarrow&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}X_{1} - m_{x_{1}} = b_{11}Y_{1}&lt;br /&gt;
\\X_{2} - m_{x_{2}} = b_{21}Y_{1} + b_{22}Y_{2}&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\\X_{n} - m_{x_{n}} = b_{n1}Y_{1} + b_{n2}Y_{2} + \cdots + b_{nn}Y_{n}&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Поскольку компоненты вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; независимы и имеют стандартные параметры, справедливо выражение:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\mathbb{E}[Y_{i}Y_{j}] =&lt;br /&gt;
\left\{\begin{matrix} &lt;br /&gt;
1, &amp;amp;i = j, \\&lt;br /&gt;
0, &amp;amp;i \not= j.&lt;br /&gt;
\end{matrix}\right.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Почленно перемножив сами на себя и между собой соответственно левые и правые части уравнений системы и взяв от результатов перемножения математическое ожидание, получаем систему уравнений вида:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\mathbb{E}[(X_{1} - m_{x_{1}})(X_{1} - m_{x_{1}})] = \mathbb{E}[b_{11}Y_{1}b_{11}Y_{1}],&lt;br /&gt;
\\ \mathbb{E}[(X_{1} - m_{x_{1}})(X_{2} - m_{x_{2}})] = \mathbb{E}[(b_{21}Y_{1} + b_{22}Y_{2})b_{11}Y_{1}],&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, в левых частях полученной системы уравнений располагаются элементы заданной ковариационной матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;, а в правых — элементы искомой матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;. Последовательно решая эту систему, получаем формулы для расчета элементов &amp;lt;math&amp;gt;\sigma_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
b_{11}=\sqrt{\sigma_{11}}; b_{21}=\frac{\sigma_{12}}{\sqrt{\sigma_{11}}}; b_{22} = \sqrt{\sigma_{22} - \frac{\sigma_{12}}{\sigma_{11}}}, \cdots&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рекуррентная формула для расчета любого элемента матрицы преобразования &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b_{ij} = \frac {\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}} {\sqrt{\sigma_{ij} - \sum_{k=1}^{j-1} b_{jk}^2}}, \quad 1 \leqslant j \leqslant i \leqslant n&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(суммы с верхним нулевым пределом считаются равными нулю)&lt;br /&gt;
&lt;br /&gt;
Таким образом, матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; получается с помощью [[Разложение_Холецкого_(метод_квадратного_корня)|разложения Холецкого]] матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Генерация случайного вектора Y ====&lt;br /&gt;
&lt;br /&gt;
Пусть имеется генератор псевдослучайных чисел (ГПСЧ, PRNG), с помощью которого можно получить реализацию случайной величины &amp;lt;math&amp;gt;u \sim U(0,1) &amp;lt;/math&amp;gt;. Описанный выше случайный вектор &amp;lt;math&amp;gt;Y=(y_1, \cdots, y_n)&amp;lt;/math&amp;gt; с независимыми компонентами составим из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; реализаций случайной величины &amp;lt;math&amp;gt;\eta \sim N(0,1)&amp;lt;/math&amp;gt;. Каждую такую реализацию &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;, в свою очередь, получим с помощью приближения по ЦПТ &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; случайными величинами, распределенными равномерно на отрезке [0,1]:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right), \quad i = \overline{1, n} \\&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;u_j^i - &amp;lt;/math&amp;gt; реализации случайной величины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;\kappa - &amp;lt;/math&amp;gt; параметр, обеспечивающий качество приближения.&lt;br /&gt;
&lt;br /&gt;
Как правило, &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; берут равным 12 и считают, что для подавляющего числа практических задач обеспечивается должная точность вычислений&amp;lt;ref name = &amp;quot;VVV&amp;quot;&amp;gt;Балдин К.В., Уткин В.Б. Информационные системы в экономике. — М.:Дашков и Кo, 2008. — 395 с.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}, \quad 1 \leqslant j \leqslant i \leqslant n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;&lt;br /&gt;
* Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1) Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;b_{11}= \sqrt{\sigma_{11}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;b_{k1}= \frac{\sigma_{k1}}{l_{11}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad k = \overline{2,n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{2,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (c) &amp;lt;math&amp;gt;b_{ii} = \sqrt{\sigma_{ii} - \sum_{p = 1}^{i - 1} b_{ip}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (d) &amp;lt;math&amp;gt;b_{ji} = \frac{\sigma_{ji} - \sum_{p = 1}^{i - 1} b_{ip} b_{jp}} {l_{ii}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad i \neq n, j = \overline{i+1,n}&amp;lt;/math&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;u_j^i \leftarrow PRNG,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\quad j = \overline{1,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3) Вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i = m_{x_i} + \sum_{k = 1}^{i} b_{ik} y_{k}, \quad i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + \sum_{j=1}^{n-2}j(n-j-1) + n + \frac {n(n+1)}{2} =&lt;br /&gt;
  n(n+1) + \frac {n(n-1)(n-2)}{6}&amp;lt;/math&amp;gt; (умножений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + \sum_{j=1}^{n-2}j(n-j-1) + n =&lt;br /&gt;
  \frac {n(n+1)}{2} + \frac {n(n-1)(n-2)}{6}&amp;lt;/math&amp;gt; (вычитаний)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad (\kappa-1)n + \frac {n(n+1)}{2} = \frac {n(n-1+2\kappa)}{2}&amp;lt;/math&amp;gt; (сложений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + 2n = \frac {n(n+3)}{2}&amp;lt;/math&amp;gt; (делений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad n + n  = 2n &amp;lt;/math&amp;gt; (взятия квадратного корня)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{n}{6}\left(2n^2+9n+31+6\kappa\right) &amp;lt;/math&amp;gt; - итого операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
==== Заполнение матрицы B====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 1 макроструктуры алгоритма (&#039;&#039;разложение Холецкого&#039;&#039;) состоит из трёх групп вершин, расположенных в целочисленных узлах трёх областей разной размерности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин расположена в одномерной области, соответствующая ей операция вычисляет функцию SQRT. &lt;br /&gt;
Единственная координата каждой из вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргумент этой функции &lt;br /&gt;
	&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{11}&amp;lt;/math&amp;gt;; &lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ii}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин расположена в двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a / b&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;: &lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{j1}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1, j, i - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ji}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин расположена в трёхмерной области, соответствующая ей операция  &amp;lt;math&amp;gt;a - b * c&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; — меняется в диапазоне  от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;p = 1&amp;lt;/math&amp;gt; элемент входных данных &amp;lt;math&amp;gt;\sigma_{ji}&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;p &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i, j, p - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, i&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, j&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.1, выполненном для случая &amp;lt;math&amp;gt;n = 4&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
[[file:Cholesky full_in_out.png|thumb|center|1400px|Рисунок 1. Граф этапа 1 макроструктуры алгоритма. SQ — вычисление квадратного корня, F — операция a-bc, Div — деление, In — входные данные, Out — выходные.]]&lt;br /&gt;
&lt;br /&gt;
====Генерация вектора Y====&lt;br /&gt;
&lt;br /&gt;
====Вычисление вектора X====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 3 макроструктуры алгоритма (умножение нижней треугольной матрицы на вектор и сложение результата с другим вектором) состоит из одной группы вершин, расположенной в целочисленных узлах двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a+bc&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;j = 1&amp;lt;/math&amp;gt; — компонента &amp;lt;math&amp;gt;m_{x_i}&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;j &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине с координатами &amp;lt;math&amp;gt;i, j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;b_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;y_{j}&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является:&lt;br /&gt;
* при &amp;lt;math&amp;gt;j &amp;lt; i&amp;lt;/math&amp;gt; — &#039;&#039;промежуточным данным&#039;&#039; этапа;&lt;br /&gt;
* при &amp;lt;math&amp;gt;j = i&amp;lt;/math&amp;gt; — &#039;&#039;выходным данным&#039;&#039; алгоритма &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.3, выполненном для случая &amp;lt;math&amp;gt; n = 4&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf3.png|750px|thumb|center|Рисунок 3. Граф этапа 3 макроструктуры алгоритма,  F — операция a+bc]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для распараллеливания доступны следующие опции:&lt;br /&gt;
* вычисление элементов матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в рамках столбца (под диагональю),&lt;br /&gt;
* генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;,&lt;br /&gt;
* вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (умножение матрицы на вектор, сложение векторов).&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: вещественная всюду плотная положительно определенная симметрическая  &amp;lt;math&amp;gt;(n \times n)&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;\Sigma&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;
* Выходные данные: вещественный &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектор &amp;lt;math&amp;gt;X&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;syntaxhighlight lang = c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// compute matrix B (core)&lt;br /&gt;
for (int j = 0; j &amp;lt; n; j++){&lt;br /&gt;
    double sum_down = matrix_cov[j][j];&lt;br /&gt;
    for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
        double cur = matrix_cov[j][k];&lt;br /&gt;
        sum_down -= cur * cur;&lt;br /&gt;
    }&lt;br /&gt;
    matrix_cov[j][j] = sqrt(sum_down);&lt;br /&gt;
    for (int i = j + 1; i &amp;lt; n; i++){&lt;br /&gt;
        double sum_up = matrix_cov[i][j];&lt;br /&gt;
        for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
            sum_up -= matrix_cov[i][k] * matrix_cov[j][k];&lt;br /&gt;
        }&lt;br /&gt;
        matrix_cov[i][j] = sum_up / matrix_cov[j][j];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
// generate vector Y&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){&lt;br /&gt;
    double sum = generate_uniform(n);&lt;br /&gt;
    for (int j = 0; j &amp;lt; CLT_NUM - 1; j++){&lt;br /&gt;
        sum += generate_uniform(n);&lt;br /&gt;
    }&lt;br /&gt;
    vec_Y[i] = (sum - CLT_NUM / 2) * sqrt(12.0 / CLT_NUM);&lt;br /&gt;
}&lt;br /&gt;
// linear transformation&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){  &lt;br /&gt;
    vec_X[i] = vec_exp[i];&lt;br /&gt;
    for (int k = 0; k &amp;lt;= i; k++){&lt;br /&gt;
        vec_X[i] += matrix_cov[i][k] * vec_Y[k];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Алгоритм был реализован на языке C++ с использованием Intel MPI Library и запущен на кластере regular4.&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add impi/5.0.1&lt;br /&gt;
 mpicxx -std=c++0x task.c -o _scratch/task&lt;br /&gt;
 cd _scratch&lt;br /&gt;
 sbatch -n256 impi ./task &amp;lt;matrix_size&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
* размер матрицы [1024 : 4864] с шагом 256,&lt;br /&gt;
* число ядер [2 : 256] с шагом-умножением в 2 раза.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:Ops_2.png|thumb|center|700px|Рисунок 1. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В отличие от разложения Холецкого, которое реализовано (точечный метод) во многих прикладных пакетах (напр., LINPACK, LAPACK, SCALAPACK), моделирование гауссовского случайного вектора не так &amp;quot;популярно&amp;quot;. MS Excel и распространённые статистические пакеты (напр., SPSS, Statistica) позволяют моделировать только одномерные статистические распределения.&lt;br /&gt;
&lt;br /&gt;
Имеется возможность &amp;quot;собрать&amp;quot; многомерное распределение из нескольких одномерных при условии, что компоненты независимы. Однако если необходимо исследовать данные с зависящими друг от друга переменными, то приходится писать собственную программу.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Lonalone</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26742</id>
		<title>Участник:Lonalone/Генерация гауссовского вектора методом линейных преобразований</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26742"/>
		<updated>2018-12-01T07:23:30Z</updated>

		<summary type="html">&lt;p&gt;Lonalone: /* Вычисление вектора X */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор описания: &#039;&#039;Меньших И. М.&#039;&#039;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из многомерных распределений особый интерес представляет нормальное. Этому закону подчиняются все результаты воздействия большого числа случайных факторов, среди которых нет превалирующих.&lt;br /&gt;
&lt;br /&gt;
В статье приведен алгоритм генерации n-мерного гауссовского случайного вектора с помощью &#039;&#039;метода линейных преобразований&#039;&#039;&amp;lt;ref name=&amp;quot;V&amp;quot;&amp;gt;(п. 1.10.4) Михайлов Г.А., Войтишек А.В. Численное статистическое моделирование. Методы Монте-Карло — М.: Академия, 2006. — 368 с.&amp;lt;/ref&amp;gt;. Известно, что случае нормально распределенного случайного вектора, ковариационная матрица вместе с математическим ожиданием этого вектора полностью определяют его распределение. Поэтому для полного статистического соответствия моделируемого и теоретического распределения гауссовского вектора достаточно обеспечить требуемые значения указанных параметров&amp;lt;ref name=&amp;quot;VV&amp;quot;&amp;gt; https://ru.wikipedia.org/wiki/Многомерное_нормальное_распределение&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея алгоритма заключается в линейном преобразовании n-мерного случайного вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, компоненты которого независимы и одинаково распределены по нормальному закону со стандартными параметрами, в случайный вектор &amp;lt;math&amp;gt;X&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;\Sigma&amp;lt;/math&amp;gt; и вектор математических ожиданий &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Sigma = \|\sigma_{ij}\| = \| \mathbb{E}[(X_{i} - m_{x_{i}})(X_{j} - m_{x_{j}})]\|, \\&lt;br /&gt;
M = (m_{x_{1}}, m_{x_{2}}, ..., m_{x_{n}})^T.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Требуется найти такую матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, которая позволяла бы получить искомый вектор &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; с требуемыми характеристиками в результате линейного преобразования &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — n-мерный случайный вектор с независимыми нормально распределенными компонентами со стандартными параметрами.&lt;br /&gt;
&lt;br /&gt;
Будем искать матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в виде нижней треугольной матрицы. Перейдем от матричной записи к системе алгебраических уравнений:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} X_{1} \\&lt;br /&gt;
 X_{2} \\ \vdots \\ X_{n} \end{pmatrix} =&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} b_{11} &amp;amp; 0 &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\b_{21} &amp;amp; b_{22} &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\ \vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \vdots&lt;br /&gt;
\\ b_{n1} &amp;amp; b_{n2} &amp;amp; \cdots &amp;amp; b_{nn}&lt;br /&gt;
\end{pmatrix} \times&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} Y_{1} \\&lt;br /&gt;
 Y_{2} \\ \vdots \\ Y_{n} \end{pmatrix} +&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} m_{x_{1}} \\&lt;br /&gt;
 m_{x_{2}} \\ \vdots \\ m_{x_{n}} \end{pmatrix} \Rightarrow&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}X_{1} - m_{x_{1}} = b_{11}Y_{1}&lt;br /&gt;
\\X_{2} - m_{x_{2}} = b_{21}Y_{1} + b_{22}Y_{2}&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\\X_{n} - m_{x_{n}} = b_{n1}Y_{1} + b_{n2}Y_{2} + \cdots + b_{nn}Y_{n}&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Поскольку компоненты вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; независимы и имеют стандартные параметры, справедливо выражение:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\mathbb{E}[Y_{i}Y_{j}] =&lt;br /&gt;
\left\{\begin{matrix} &lt;br /&gt;
1, &amp;amp;i = j, \\&lt;br /&gt;
0, &amp;amp;i \not= j.&lt;br /&gt;
\end{matrix}\right.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Почленно перемножив сами на себя и между собой соответственно левые и правые части уравнений системы и взяв от результатов перемножения математическое ожидание, получаем систему уравнений вида:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\mathbb{E}[(X_{1} - m_{x_{1}})(X_{1} - m_{x_{1}})] = \mathbb{E}[b_{11}Y_{1}b_{11}Y_{1}],&lt;br /&gt;
\\ \mathbb{E}[(X_{1} - m_{x_{1}})(X_{2} - m_{x_{2}})] = \mathbb{E}[(b_{21}Y_{1} + b_{22}Y_{2})b_{11}Y_{1}],&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, в левых частях полученной системы уравнений располагаются элементы заданной ковариационной матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;, а в правых — элементы искомой матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;. Последовательно решая эту систему, получаем формулы для расчета элементов &amp;lt;math&amp;gt;\sigma_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
b_{11}=\sqrt{\sigma_{11}}; b_{21}=\frac{\sigma_{12}}{\sqrt{\sigma_{11}}}; b_{22} = \sqrt{\sigma_{22} - \frac{\sigma_{12}}{\sigma_{11}}}, \cdots&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рекуррентная формула для расчета любого элемента матрицы преобразования &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b_{ij} = \frac {\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}} {\sqrt{\sigma_{ij} - \sum_{k=1}^{j-1} b_{jk}^2}}, \quad 1 \leqslant j \leqslant i \leqslant n&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(суммы с верхним нулевым пределом считаются равными нулю)&lt;br /&gt;
&lt;br /&gt;
Таким образом, матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; получается с помощью [[Разложение_Холецкого_(метод_квадратного_корня)|разложения Холецкого]] матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Генерация случайного вектора Y ====&lt;br /&gt;
&lt;br /&gt;
Пусть имеется генератор псевдослучайных чисел (ГПСЧ, PRNG), с помощью которого можно получить реализацию случайной величины &amp;lt;math&amp;gt;u \sim U(0,1) &amp;lt;/math&amp;gt;. Описанный выше случайный вектор &amp;lt;math&amp;gt;Y=(y_1, \cdots, y_n)&amp;lt;/math&amp;gt; с независимыми компонентами составим из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; реализаций случайной величины &amp;lt;math&amp;gt;\eta \sim N(0,1)&amp;lt;/math&amp;gt;. Каждую такую реализацию &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;, в свою очередь, получим с помощью приближения по ЦПТ &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; случайными величинами, распределенными равномерно на отрезке [0,1]:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right), \quad i = \overline{1, n} \\&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;u_j^i - &amp;lt;/math&amp;gt; реализации случайной величины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;\kappa - &amp;lt;/math&amp;gt; параметр, обеспечивающий качество приближения.&lt;br /&gt;
&lt;br /&gt;
Как правило, &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; берут равным 12 и считают, что для подавляющего числа практических задач обеспечивается должная точность вычислений&amp;lt;ref name = &amp;quot;VVV&amp;quot;&amp;gt;Балдин К.В., Уткин В.Б. Информационные системы в экономике. — М.:Дашков и Кo, 2008. — 395 с.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}, \quad 1 \leqslant j \leqslant i \leqslant n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;&lt;br /&gt;
* Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1) Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;b_{11}= \sqrt{\sigma_{11}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;b_{k1}= \frac{\sigma_{k1}}{l_{11}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad k = \overline{2,n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{2,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (c) &amp;lt;math&amp;gt;b_{ii} = \sqrt{\sigma_{ii} - \sum_{p = 1}^{i - 1} b_{ip}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (d) &amp;lt;math&amp;gt;b_{ji} = \frac{\sigma_{ji} - \sum_{p = 1}^{i - 1} b_{ip} b_{jp}} {l_{ii}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad i \neq n, j = \overline{i+1,n}&amp;lt;/math&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;u_j^i \leftarrow PRNG,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\quad j = \overline{1,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3) Вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i = m_{x_i} + \sum_{k = 1}^{i} b_{ik} y_{k}, \quad i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + \sum_{j=1}^{n-2}j(n-j-1) + n + \frac {n(n+1)}{2} =&lt;br /&gt;
  n(n+1) + \frac {n(n-1)(n-2)}{6}&amp;lt;/math&amp;gt; (умножений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + \sum_{j=1}^{n-2}j(n-j-1) + n =&lt;br /&gt;
  \frac {n(n+1)}{2} + \frac {n(n-1)(n-2)}{6}&amp;lt;/math&amp;gt; (вычитаний)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad (\kappa-1)n + \frac {n(n+1)}{2} = \frac {n(n-1+2\kappa)}{2}&amp;lt;/math&amp;gt; (сложений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + 2n = \frac {n(n+3)}{2}&amp;lt;/math&amp;gt; (делений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad n + n  = 2n &amp;lt;/math&amp;gt; (взятия квадратного корня)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{n}{6}\left(2n^2+9n+31+6\kappa\right) &amp;lt;/math&amp;gt; - итого операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
==== Заполнение матрицы B====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 1 макроструктуры алгоритма (&#039;&#039;разложение Холецкого&#039;&#039;) состоит из трёх групп вершин, расположенных в целочисленных узлах трёх областей разной размерности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин расположена в одномерной области, соответствующая ей операция вычисляет функцию SQRT. &lt;br /&gt;
Единственная координата каждой из вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргумент этой функции &lt;br /&gt;
	&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{11}&amp;lt;/math&amp;gt;; &lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ii}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин расположена в двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a / b&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;: &lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{j1}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1, j, i - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ji}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин расположена в трёхмерной области, соответствующая ей операция  &amp;lt;math&amp;gt;a - b * c&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; — меняется в диапазоне  от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;p = 1&amp;lt;/math&amp;gt; элемент входных данных &amp;lt;math&amp;gt;\sigma_{ji}&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;p &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i, j, p - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, i&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, j&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.1, выполненном для случая &amp;lt;math&amp;gt;n = 4&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
[[file:Cholesky full_in_out.png|thumb|center|1400px|Рисунок 1. Граф этапа 1 макроструктуры алгоритма. SQ - вычисление квадратного корня, F - операция a-bc, Div - деление, In - входные данные, Out - выходные.]]&lt;br /&gt;
&lt;br /&gt;
====Генерация вектора Y====&lt;br /&gt;
&lt;br /&gt;
====Вычисление вектора X====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 3 макроструктуры алгоритма (умножение нижней треугольной матрицы на вектор и сложение результата с другим вектором) состоит из одной группы вершин, расположенной в целочисленных узлах двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a+bc&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;j = 1&amp;lt;/math&amp;gt; — компонента &amp;lt;math&amp;gt;m_{x_i}&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;j &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине с координатами &amp;lt;math&amp;gt;i, j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;b_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;y_{j}&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является:&lt;br /&gt;
* при &amp;lt;math&amp;gt;j &amp;lt; i&amp;lt;/math&amp;gt; — &#039;&#039;промежуточным данным&#039;&#039; этапа;&lt;br /&gt;
* при &amp;lt;math&amp;gt;j = i&amp;lt;/math&amp;gt; — &#039;&#039;выходным данным&#039;&#039; алгоритма &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.3, выполненном для случая &amp;lt;math&amp;gt; n = 4&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf3.png|750px|thumb|center|Рисунок 3. Граф этапа 3 макроструктуры алгоритма,  F — операция a+bc]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для распараллеливания доступны следующие опции:&lt;br /&gt;
* вычисление элементов матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в рамках столбца (под диагональю),&lt;br /&gt;
* генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;,&lt;br /&gt;
* вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (умножение матрицы на вектор, сложение векторов).&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: вещественная всюду плотная положительно определенная симметрическая  &amp;lt;math&amp;gt;(n \times n)&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;\Sigma&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;
* Выходные данные: вещественный &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектор &amp;lt;math&amp;gt;X&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;syntaxhighlight lang = c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// compute matrix B (core)&lt;br /&gt;
for (int j = 0; j &amp;lt; n; j++){&lt;br /&gt;
    double sum_down = matrix_cov[j][j];&lt;br /&gt;
    for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
        double cur = matrix_cov[j][k];&lt;br /&gt;
        sum_down -= cur * cur;&lt;br /&gt;
    }&lt;br /&gt;
    matrix_cov[j][j] = sqrt(sum_down);&lt;br /&gt;
    for (int i = j + 1; i &amp;lt; n; i++){&lt;br /&gt;
        double sum_up = matrix_cov[i][j];&lt;br /&gt;
        for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
            sum_up -= matrix_cov[i][k] * matrix_cov[j][k];&lt;br /&gt;
        }&lt;br /&gt;
        matrix_cov[i][j] = sum_up / matrix_cov[j][j];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
// generate vector Y&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){&lt;br /&gt;
    double sum = generate_uniform(n);&lt;br /&gt;
    for (int j = 0; j &amp;lt; CLT_NUM - 1; j++){&lt;br /&gt;
        sum += generate_uniform(n);&lt;br /&gt;
    }&lt;br /&gt;
    vec_Y[i] = (sum - CLT_NUM / 2) * sqrt(12.0 / CLT_NUM);&lt;br /&gt;
}&lt;br /&gt;
// linear transformation&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){  &lt;br /&gt;
    vec_X[i] = vec_exp[i];&lt;br /&gt;
    for (int k = 0; k &amp;lt;= i; k++){&lt;br /&gt;
        vec_X[i] += matrix_cov[i][k] * vec_Y[k];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Алгоритм был реализован на языке C++ с использованием Intel MPI Library и запущен на кластере regular4.&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add impi/5.0.1&lt;br /&gt;
 mpicxx -std=c++0x task.c -o _scratch/task&lt;br /&gt;
 cd _scratch&lt;br /&gt;
 sbatch -n256 impi ./task &amp;lt;matrix_size&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
* размер матрицы [1024 : 4864] с шагом 256,&lt;br /&gt;
* число ядер [2 : 256] с шагом-умножением в 2 раза.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:Ops_2.png|thumb|center|700px|Рисунок 1. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В отличие от разложения Холецкого, которое реализовано (точечный метод) во многих прикладных пакетах (напр., LINPACK, LAPACK, SCALAPACK), моделирование гауссовского случайного вектора не так &amp;quot;популярно&amp;quot;. MS Excel и распространённые статистические пакеты (напр., SPSS, Statistica) позволяют моделировать только одномерные статистические распределения.&lt;br /&gt;
&lt;br /&gt;
Имеется возможность &amp;quot;собрать&amp;quot; многомерное распределение из нескольких одномерных при условии, что компоненты независимы. Однако если необходимо исследовать данные с зависящими друг от друга переменными, то приходится писать собственную программу.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Lonalone</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26741</id>
		<title>Участник:Lonalone/Генерация гауссовского вектора методом линейных преобразований</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26741"/>
		<updated>2018-12-01T07:23:07Z</updated>

		<summary type="html">&lt;p&gt;Lonalone: /* Вычисление вектора X */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор описания: &#039;&#039;Меньших И. М.&#039;&#039;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из многомерных распределений особый интерес представляет нормальное. Этому закону подчиняются все результаты воздействия большого числа случайных факторов, среди которых нет превалирующих.&lt;br /&gt;
&lt;br /&gt;
В статье приведен алгоритм генерации n-мерного гауссовского случайного вектора с помощью &#039;&#039;метода линейных преобразований&#039;&#039;&amp;lt;ref name=&amp;quot;V&amp;quot;&amp;gt;(п. 1.10.4) Михайлов Г.А., Войтишек А.В. Численное статистическое моделирование. Методы Монте-Карло — М.: Академия, 2006. — 368 с.&amp;lt;/ref&amp;gt;. Известно, что случае нормально распределенного случайного вектора, ковариационная матрица вместе с математическим ожиданием этого вектора полностью определяют его распределение. Поэтому для полного статистического соответствия моделируемого и теоретического распределения гауссовского вектора достаточно обеспечить требуемые значения указанных параметров&amp;lt;ref name=&amp;quot;VV&amp;quot;&amp;gt; https://ru.wikipedia.org/wiki/Многомерное_нормальное_распределение&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея алгоритма заключается в линейном преобразовании n-мерного случайного вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, компоненты которого независимы и одинаково распределены по нормальному закону со стандартными параметрами, в случайный вектор &amp;lt;math&amp;gt;X&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;\Sigma&amp;lt;/math&amp;gt; и вектор математических ожиданий &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Sigma = \|\sigma_{ij}\| = \| \mathbb{E}[(X_{i} - m_{x_{i}})(X_{j} - m_{x_{j}})]\|, \\&lt;br /&gt;
M = (m_{x_{1}}, m_{x_{2}}, ..., m_{x_{n}})^T.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Требуется найти такую матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, которая позволяла бы получить искомый вектор &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; с требуемыми характеристиками в результате линейного преобразования &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — n-мерный случайный вектор с независимыми нормально распределенными компонентами со стандартными параметрами.&lt;br /&gt;
&lt;br /&gt;
Будем искать матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в виде нижней треугольной матрицы. Перейдем от матричной записи к системе алгебраических уравнений:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} X_{1} \\&lt;br /&gt;
 X_{2} \\ \vdots \\ X_{n} \end{pmatrix} =&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} b_{11} &amp;amp; 0 &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\b_{21} &amp;amp; b_{22} &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\ \vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \vdots&lt;br /&gt;
\\ b_{n1} &amp;amp; b_{n2} &amp;amp; \cdots &amp;amp; b_{nn}&lt;br /&gt;
\end{pmatrix} \times&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} Y_{1} \\&lt;br /&gt;
 Y_{2} \\ \vdots \\ Y_{n} \end{pmatrix} +&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} m_{x_{1}} \\&lt;br /&gt;
 m_{x_{2}} \\ \vdots \\ m_{x_{n}} \end{pmatrix} \Rightarrow&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}X_{1} - m_{x_{1}} = b_{11}Y_{1}&lt;br /&gt;
\\X_{2} - m_{x_{2}} = b_{21}Y_{1} + b_{22}Y_{2}&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\\X_{n} - m_{x_{n}} = b_{n1}Y_{1} + b_{n2}Y_{2} + \cdots + b_{nn}Y_{n}&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Поскольку компоненты вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; независимы и имеют стандартные параметры, справедливо выражение:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\mathbb{E}[Y_{i}Y_{j}] =&lt;br /&gt;
\left\{\begin{matrix} &lt;br /&gt;
1, &amp;amp;i = j, \\&lt;br /&gt;
0, &amp;amp;i \not= j.&lt;br /&gt;
\end{matrix}\right.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Почленно перемножив сами на себя и между собой соответственно левые и правые части уравнений системы и взяв от результатов перемножения математическое ожидание, получаем систему уравнений вида:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\mathbb{E}[(X_{1} - m_{x_{1}})(X_{1} - m_{x_{1}})] = \mathbb{E}[b_{11}Y_{1}b_{11}Y_{1}],&lt;br /&gt;
\\ \mathbb{E}[(X_{1} - m_{x_{1}})(X_{2} - m_{x_{2}})] = \mathbb{E}[(b_{21}Y_{1} + b_{22}Y_{2})b_{11}Y_{1}],&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, в левых частях полученной системы уравнений располагаются элементы заданной ковариационной матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;, а в правых — элементы искомой матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;. Последовательно решая эту систему, получаем формулы для расчета элементов &amp;lt;math&amp;gt;\sigma_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
b_{11}=\sqrt{\sigma_{11}}; b_{21}=\frac{\sigma_{12}}{\sqrt{\sigma_{11}}}; b_{22} = \sqrt{\sigma_{22} - \frac{\sigma_{12}}{\sigma_{11}}}, \cdots&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рекуррентная формула для расчета любого элемента матрицы преобразования &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b_{ij} = \frac {\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}} {\sqrt{\sigma_{ij} - \sum_{k=1}^{j-1} b_{jk}^2}}, \quad 1 \leqslant j \leqslant i \leqslant n&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(суммы с верхним нулевым пределом считаются равными нулю)&lt;br /&gt;
&lt;br /&gt;
Таким образом, матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; получается с помощью [[Разложение_Холецкого_(метод_квадратного_корня)|разложения Холецкого]] матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Генерация случайного вектора Y ====&lt;br /&gt;
&lt;br /&gt;
Пусть имеется генератор псевдослучайных чисел (ГПСЧ, PRNG), с помощью которого можно получить реализацию случайной величины &amp;lt;math&amp;gt;u \sim U(0,1) &amp;lt;/math&amp;gt;. Описанный выше случайный вектор &amp;lt;math&amp;gt;Y=(y_1, \cdots, y_n)&amp;lt;/math&amp;gt; с независимыми компонентами составим из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; реализаций случайной величины &amp;lt;math&amp;gt;\eta \sim N(0,1)&amp;lt;/math&amp;gt;. Каждую такую реализацию &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;, в свою очередь, получим с помощью приближения по ЦПТ &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; случайными величинами, распределенными равномерно на отрезке [0,1]:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right), \quad i = \overline{1, n} \\&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;u_j^i - &amp;lt;/math&amp;gt; реализации случайной величины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;\kappa - &amp;lt;/math&amp;gt; параметр, обеспечивающий качество приближения.&lt;br /&gt;
&lt;br /&gt;
Как правило, &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; берут равным 12 и считают, что для подавляющего числа практических задач обеспечивается должная точность вычислений&amp;lt;ref name = &amp;quot;VVV&amp;quot;&amp;gt;Балдин К.В., Уткин В.Б. Информационные системы в экономике. — М.:Дашков и Кo, 2008. — 395 с.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}, \quad 1 \leqslant j \leqslant i \leqslant n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;&lt;br /&gt;
* Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1) Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;b_{11}= \sqrt{\sigma_{11}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;b_{k1}= \frac{\sigma_{k1}}{l_{11}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad k = \overline{2,n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{2,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (c) &amp;lt;math&amp;gt;b_{ii} = \sqrt{\sigma_{ii} - \sum_{p = 1}^{i - 1} b_{ip}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (d) &amp;lt;math&amp;gt;b_{ji} = \frac{\sigma_{ji} - \sum_{p = 1}^{i - 1} b_{ip} b_{jp}} {l_{ii}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad i \neq n, j = \overline{i+1,n}&amp;lt;/math&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;u_j^i \leftarrow PRNG,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\quad j = \overline{1,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3) Вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i = m_{x_i} + \sum_{k = 1}^{i} b_{ik} y_{k}, \quad i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + \sum_{j=1}^{n-2}j(n-j-1) + n + \frac {n(n+1)}{2} =&lt;br /&gt;
  n(n+1) + \frac {n(n-1)(n-2)}{6}&amp;lt;/math&amp;gt; (умножений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + \sum_{j=1}^{n-2}j(n-j-1) + n =&lt;br /&gt;
  \frac {n(n+1)}{2} + \frac {n(n-1)(n-2)}{6}&amp;lt;/math&amp;gt; (вычитаний)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad (\kappa-1)n + \frac {n(n+1)}{2} = \frac {n(n-1+2\kappa)}{2}&amp;lt;/math&amp;gt; (сложений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + 2n = \frac {n(n+3)}{2}&amp;lt;/math&amp;gt; (делений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad n + n  = 2n &amp;lt;/math&amp;gt; (взятия квадратного корня)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{n}{6}\left(2n^2+9n+31+6\kappa\right) &amp;lt;/math&amp;gt; - итого операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
==== Заполнение матрицы B====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 1 макроструктуры алгоритма (&#039;&#039;разложение Холецкого&#039;&#039;) состоит из трёх групп вершин, расположенных в целочисленных узлах трёх областей разной размерности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин расположена в одномерной области, соответствующая ей операция вычисляет функцию SQRT. &lt;br /&gt;
Единственная координата каждой из вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргумент этой функции &lt;br /&gt;
	&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{11}&amp;lt;/math&amp;gt;; &lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ii}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин расположена в двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a / b&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;: &lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{j1}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1, j, i - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ji}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин расположена в трёхмерной области, соответствующая ей операция  &amp;lt;math&amp;gt;a - b * c&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; — меняется в диапазоне  от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;p = 1&amp;lt;/math&amp;gt; элемент входных данных &amp;lt;math&amp;gt;\sigma_{ji}&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;p &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i, j, p - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, i&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, j&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.1, выполненном для случая &amp;lt;math&amp;gt;n = 4&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
[[file:Cholesky full_in_out.png|thumb|center|1400px|Рисунок 1. Граф этапа 1 макроструктуры алгоритма. SQ - вычисление квадратного корня, F - операция a-bc, Div - деление, In - входные данные, Out - выходные.]]&lt;br /&gt;
&lt;br /&gt;
====Генерация вектора Y====&lt;br /&gt;
&lt;br /&gt;
====Вычисление вектора X====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 3 макроструктуры алгоритма (умножение нижней треугольной матрицы на вектор и сложение результата с другим вектором) состоит из одной группы вершин, расположенной в целочисленных узлах двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a+bc&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;j = 1&amp;lt;/math&amp;gt; — компонента &amp;lt;math&amp;gt;m_{x_i}&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;j &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине с координатами &amp;lt;math&amp;gt;i, j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;b_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;y_{j}&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является:&lt;br /&gt;
* при &amp;lt;math&amp;gt;j &amp;lt; i&amp;lt;/math&amp;gt; — &#039;&#039;промежуточным данным&#039;&#039; этапа;&lt;br /&gt;
* при &amp;lt;math&amp;gt;j = i&amp;lt;/math&amp;gt; — &#039;&#039;выходным данным&#039;&#039; алгоритма &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.3, выполненном для случая &amp;lt;math&amp;gt; n = 4&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf3.png|750px|thumb|center|Рисунок 3. Граф этапа 3 макроструктуры алгоритма,  F - операция a+bc]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для распараллеливания доступны следующие опции:&lt;br /&gt;
* вычисление элементов матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в рамках столбца (под диагональю),&lt;br /&gt;
* генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;,&lt;br /&gt;
* вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (умножение матрицы на вектор, сложение векторов).&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: вещественная всюду плотная положительно определенная симметрическая  &amp;lt;math&amp;gt;(n \times n)&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;\Sigma&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;
* Выходные данные: вещественный &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектор &amp;lt;math&amp;gt;X&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;syntaxhighlight lang = c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// compute matrix B (core)&lt;br /&gt;
for (int j = 0; j &amp;lt; n; j++){&lt;br /&gt;
    double sum_down = matrix_cov[j][j];&lt;br /&gt;
    for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
        double cur = matrix_cov[j][k];&lt;br /&gt;
        sum_down -= cur * cur;&lt;br /&gt;
    }&lt;br /&gt;
    matrix_cov[j][j] = sqrt(sum_down);&lt;br /&gt;
    for (int i = j + 1; i &amp;lt; n; i++){&lt;br /&gt;
        double sum_up = matrix_cov[i][j];&lt;br /&gt;
        for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
            sum_up -= matrix_cov[i][k] * matrix_cov[j][k];&lt;br /&gt;
        }&lt;br /&gt;
        matrix_cov[i][j] = sum_up / matrix_cov[j][j];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
// generate vector Y&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){&lt;br /&gt;
    double sum = generate_uniform(n);&lt;br /&gt;
    for (int j = 0; j &amp;lt; CLT_NUM - 1; j++){&lt;br /&gt;
        sum += generate_uniform(n);&lt;br /&gt;
    }&lt;br /&gt;
    vec_Y[i] = (sum - CLT_NUM / 2) * sqrt(12.0 / CLT_NUM);&lt;br /&gt;
}&lt;br /&gt;
// linear transformation&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){  &lt;br /&gt;
    vec_X[i] = vec_exp[i];&lt;br /&gt;
    for (int k = 0; k &amp;lt;= i; k++){&lt;br /&gt;
        vec_X[i] += matrix_cov[i][k] * vec_Y[k];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Алгоритм был реализован на языке C++ с использованием Intel MPI Library и запущен на кластере regular4.&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add impi/5.0.1&lt;br /&gt;
 mpicxx -std=c++0x task.c -o _scratch/task&lt;br /&gt;
 cd _scratch&lt;br /&gt;
 sbatch -n256 impi ./task &amp;lt;matrix_size&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
* размер матрицы [1024 : 4864] с шагом 256,&lt;br /&gt;
* число ядер [2 : 256] с шагом-умножением в 2 раза.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:Ops_2.png|thumb|center|700px|Рисунок 1. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В отличие от разложения Холецкого, которое реализовано (точечный метод) во многих прикладных пакетах (напр., LINPACK, LAPACK, SCALAPACK), моделирование гауссовского случайного вектора не так &amp;quot;популярно&amp;quot;. MS Excel и распространённые статистические пакеты (напр., SPSS, Statistica) позволяют моделировать только одномерные статистические распределения.&lt;br /&gt;
&lt;br /&gt;
Имеется возможность &amp;quot;собрать&amp;quot; многомерное распределение из нескольких одномерных при условии, что компоненты независимы. Однако если необходимо исследовать данные с зависящими друг от друга переменными, то приходится писать собственную программу.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Lonalone</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26740</id>
		<title>Участник:Lonalone/Генерация гауссовского вектора методом линейных преобразований</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26740"/>
		<updated>2018-12-01T07:22:25Z</updated>

		<summary type="html">&lt;p&gt;Lonalone: /* Заполнение матрицы B */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор описания: &#039;&#039;Меньших И. М.&#039;&#039;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из многомерных распределений особый интерес представляет нормальное. Этому закону подчиняются все результаты воздействия большого числа случайных факторов, среди которых нет превалирующих.&lt;br /&gt;
&lt;br /&gt;
В статье приведен алгоритм генерации n-мерного гауссовского случайного вектора с помощью &#039;&#039;метода линейных преобразований&#039;&#039;&amp;lt;ref name=&amp;quot;V&amp;quot;&amp;gt;(п. 1.10.4) Михайлов Г.А., Войтишек А.В. Численное статистическое моделирование. Методы Монте-Карло — М.: Академия, 2006. — 368 с.&amp;lt;/ref&amp;gt;. Известно, что случае нормально распределенного случайного вектора, ковариационная матрица вместе с математическим ожиданием этого вектора полностью определяют его распределение. Поэтому для полного статистического соответствия моделируемого и теоретического распределения гауссовского вектора достаточно обеспечить требуемые значения указанных параметров&amp;lt;ref name=&amp;quot;VV&amp;quot;&amp;gt; https://ru.wikipedia.org/wiki/Многомерное_нормальное_распределение&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея алгоритма заключается в линейном преобразовании n-мерного случайного вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, компоненты которого независимы и одинаково распределены по нормальному закону со стандартными параметрами, в случайный вектор &amp;lt;math&amp;gt;X&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;\Sigma&amp;lt;/math&amp;gt; и вектор математических ожиданий &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Sigma = \|\sigma_{ij}\| = \| \mathbb{E}[(X_{i} - m_{x_{i}})(X_{j} - m_{x_{j}})]\|, \\&lt;br /&gt;
M = (m_{x_{1}}, m_{x_{2}}, ..., m_{x_{n}})^T.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Требуется найти такую матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, которая позволяла бы получить искомый вектор &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; с требуемыми характеристиками в результате линейного преобразования &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — n-мерный случайный вектор с независимыми нормально распределенными компонентами со стандартными параметрами.&lt;br /&gt;
&lt;br /&gt;
Будем искать матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в виде нижней треугольной матрицы. Перейдем от матричной записи к системе алгебраических уравнений:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} X_{1} \\&lt;br /&gt;
 X_{2} \\ \vdots \\ X_{n} \end{pmatrix} =&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} b_{11} &amp;amp; 0 &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\b_{21} &amp;amp; b_{22} &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\ \vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \vdots&lt;br /&gt;
\\ b_{n1} &amp;amp; b_{n2} &amp;amp; \cdots &amp;amp; b_{nn}&lt;br /&gt;
\end{pmatrix} \times&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} Y_{1} \\&lt;br /&gt;
 Y_{2} \\ \vdots \\ Y_{n} \end{pmatrix} +&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} m_{x_{1}} \\&lt;br /&gt;
 m_{x_{2}} \\ \vdots \\ m_{x_{n}} \end{pmatrix} \Rightarrow&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}X_{1} - m_{x_{1}} = b_{11}Y_{1}&lt;br /&gt;
\\X_{2} - m_{x_{2}} = b_{21}Y_{1} + b_{22}Y_{2}&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\\X_{n} - m_{x_{n}} = b_{n1}Y_{1} + b_{n2}Y_{2} + \cdots + b_{nn}Y_{n}&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Поскольку компоненты вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; независимы и имеют стандартные параметры, справедливо выражение:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\mathbb{E}[Y_{i}Y_{j}] =&lt;br /&gt;
\left\{\begin{matrix} &lt;br /&gt;
1, &amp;amp;i = j, \\&lt;br /&gt;
0, &amp;amp;i \not= j.&lt;br /&gt;
\end{matrix}\right.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Почленно перемножив сами на себя и между собой соответственно левые и правые части уравнений системы и взяв от результатов перемножения математическое ожидание, получаем систему уравнений вида:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\mathbb{E}[(X_{1} - m_{x_{1}})(X_{1} - m_{x_{1}})] = \mathbb{E}[b_{11}Y_{1}b_{11}Y_{1}],&lt;br /&gt;
\\ \mathbb{E}[(X_{1} - m_{x_{1}})(X_{2} - m_{x_{2}})] = \mathbb{E}[(b_{21}Y_{1} + b_{22}Y_{2})b_{11}Y_{1}],&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, в левых частях полученной системы уравнений располагаются элементы заданной ковариационной матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;, а в правых — элементы искомой матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;. Последовательно решая эту систему, получаем формулы для расчета элементов &amp;lt;math&amp;gt;\sigma_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
b_{11}=\sqrt{\sigma_{11}}; b_{21}=\frac{\sigma_{12}}{\sqrt{\sigma_{11}}}; b_{22} = \sqrt{\sigma_{22} - \frac{\sigma_{12}}{\sigma_{11}}}, \cdots&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рекуррентная формула для расчета любого элемента матрицы преобразования &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b_{ij} = \frac {\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}} {\sqrt{\sigma_{ij} - \sum_{k=1}^{j-1} b_{jk}^2}}, \quad 1 \leqslant j \leqslant i \leqslant n&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(суммы с верхним нулевым пределом считаются равными нулю)&lt;br /&gt;
&lt;br /&gt;
Таким образом, матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; получается с помощью [[Разложение_Холецкого_(метод_квадратного_корня)|разложения Холецкого]] матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Генерация случайного вектора Y ====&lt;br /&gt;
&lt;br /&gt;
Пусть имеется генератор псевдослучайных чисел (ГПСЧ, PRNG), с помощью которого можно получить реализацию случайной величины &amp;lt;math&amp;gt;u \sim U(0,1) &amp;lt;/math&amp;gt;. Описанный выше случайный вектор &amp;lt;math&amp;gt;Y=(y_1, \cdots, y_n)&amp;lt;/math&amp;gt; с независимыми компонентами составим из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; реализаций случайной величины &amp;lt;math&amp;gt;\eta \sim N(0,1)&amp;lt;/math&amp;gt;. Каждую такую реализацию &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;, в свою очередь, получим с помощью приближения по ЦПТ &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; случайными величинами, распределенными равномерно на отрезке [0,1]:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right), \quad i = \overline{1, n} \\&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;u_j^i - &amp;lt;/math&amp;gt; реализации случайной величины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;\kappa - &amp;lt;/math&amp;gt; параметр, обеспечивающий качество приближения.&lt;br /&gt;
&lt;br /&gt;
Как правило, &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; берут равным 12 и считают, что для подавляющего числа практических задач обеспечивается должная точность вычислений&amp;lt;ref name = &amp;quot;VVV&amp;quot;&amp;gt;Балдин К.В., Уткин В.Б. Информационные системы в экономике. — М.:Дашков и Кo, 2008. — 395 с.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}, \quad 1 \leqslant j \leqslant i \leqslant n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;&lt;br /&gt;
* Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1) Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;b_{11}= \sqrt{\sigma_{11}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;b_{k1}= \frac{\sigma_{k1}}{l_{11}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad k = \overline{2,n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{2,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (c) &amp;lt;math&amp;gt;b_{ii} = \sqrt{\sigma_{ii} - \sum_{p = 1}^{i - 1} b_{ip}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (d) &amp;lt;math&amp;gt;b_{ji} = \frac{\sigma_{ji} - \sum_{p = 1}^{i - 1} b_{ip} b_{jp}} {l_{ii}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad i \neq n, j = \overline{i+1,n}&amp;lt;/math&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;u_j^i \leftarrow PRNG,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\quad j = \overline{1,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3) Вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i = m_{x_i} + \sum_{k = 1}^{i} b_{ik} y_{k}, \quad i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + \sum_{j=1}^{n-2}j(n-j-1) + n + \frac {n(n+1)}{2} =&lt;br /&gt;
  n(n+1) + \frac {n(n-1)(n-2)}{6}&amp;lt;/math&amp;gt; (умножений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + \sum_{j=1}^{n-2}j(n-j-1) + n =&lt;br /&gt;
  \frac {n(n+1)}{2} + \frac {n(n-1)(n-2)}{6}&amp;lt;/math&amp;gt; (вычитаний)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad (\kappa-1)n + \frac {n(n+1)}{2} = \frac {n(n-1+2\kappa)}{2}&amp;lt;/math&amp;gt; (сложений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + 2n = \frac {n(n+3)}{2}&amp;lt;/math&amp;gt; (делений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad n + n  = 2n &amp;lt;/math&amp;gt; (взятия квадратного корня)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{n}{6}\left(2n^2+9n+31+6\kappa\right) &amp;lt;/math&amp;gt; - итого операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
==== Заполнение матрицы B====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 1 макроструктуры алгоритма (&#039;&#039;разложение Холецкого&#039;&#039;) состоит из трёх групп вершин, расположенных в целочисленных узлах трёх областей разной размерности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин расположена в одномерной области, соответствующая ей операция вычисляет функцию SQRT. &lt;br /&gt;
Единственная координата каждой из вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргумент этой функции &lt;br /&gt;
	&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{11}&amp;lt;/math&amp;gt;; &lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ii}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин расположена в двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a / b&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;: &lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{j1}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1, j, i - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ji}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин расположена в трёхмерной области, соответствующая ей операция  &amp;lt;math&amp;gt;a - b * c&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; — меняется в диапазоне  от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;p = 1&amp;lt;/math&amp;gt; элемент входных данных &amp;lt;math&amp;gt;\sigma_{ji}&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;p &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i, j, p - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, i&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, j&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; этапа.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.1, выполненном для случая &amp;lt;math&amp;gt;n = 4&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
[[file:Cholesky full_in_out.png|thumb|center|1400px|Рисунок 1. Граф этапа 1 макроструктуры алгоритма. SQ - вычисление квадратного корня, F - операция a-bc, Div - деление, In - входные данные, Out - выходные.]]&lt;br /&gt;
&lt;br /&gt;
====Генерация вектора Y====&lt;br /&gt;
&lt;br /&gt;
====Вычисление вектора X====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 3 макроструктуры алгоритма (умножение нижней треугольной матрицы на вектор и сложение результата с другим вектором) состоит из одной группы вершин, расположенной в целочисленных узлах двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a+bc&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;j = 1&amp;lt;/math&amp;gt; — компонента &amp;lt;math&amp;gt;m_{x_i}&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;j &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине с координатами &amp;lt;math&amp;gt;i, j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;b_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;y_{j}&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является:&lt;br /&gt;
* при &amp;lt;math&amp;gt;j &amp;lt; i&amp;lt;/math&amp;gt; — &#039;&#039;промежуточным данным&#039;&#039; этапа;&lt;br /&gt;
* при &amp;lt;math&amp;gt;j = i&amp;lt;/math&amp;gt; — &#039;&#039;выходным данным&#039;&#039; алгоритма &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рисунке, выполненном для случая &amp;lt;math&amp;gt; n = 4&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf3.png|750px|thumb|center|Рисунок 3. Граф этапа 3 макроструктуры алгоритма,  F - операция a+bc]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для распараллеливания доступны следующие опции:&lt;br /&gt;
* вычисление элементов матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в рамках столбца (под диагональю),&lt;br /&gt;
* генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;,&lt;br /&gt;
* вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (умножение матрицы на вектор, сложение векторов).&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: вещественная всюду плотная положительно определенная симметрическая  &amp;lt;math&amp;gt;(n \times n)&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;\Sigma&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;
* Выходные данные: вещественный &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектор &amp;lt;math&amp;gt;X&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;syntaxhighlight lang = c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// compute matrix B (core)&lt;br /&gt;
for (int j = 0; j &amp;lt; n; j++){&lt;br /&gt;
    double sum_down = matrix_cov[j][j];&lt;br /&gt;
    for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
        double cur = matrix_cov[j][k];&lt;br /&gt;
        sum_down -= cur * cur;&lt;br /&gt;
    }&lt;br /&gt;
    matrix_cov[j][j] = sqrt(sum_down);&lt;br /&gt;
    for (int i = j + 1; i &amp;lt; n; i++){&lt;br /&gt;
        double sum_up = matrix_cov[i][j];&lt;br /&gt;
        for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
            sum_up -= matrix_cov[i][k] * matrix_cov[j][k];&lt;br /&gt;
        }&lt;br /&gt;
        matrix_cov[i][j] = sum_up / matrix_cov[j][j];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
// generate vector Y&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){&lt;br /&gt;
    double sum = generate_uniform(n);&lt;br /&gt;
    for (int j = 0; j &amp;lt; CLT_NUM - 1; j++){&lt;br /&gt;
        sum += generate_uniform(n);&lt;br /&gt;
    }&lt;br /&gt;
    vec_Y[i] = (sum - CLT_NUM / 2) * sqrt(12.0 / CLT_NUM);&lt;br /&gt;
}&lt;br /&gt;
// linear transformation&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){  &lt;br /&gt;
    vec_X[i] = vec_exp[i];&lt;br /&gt;
    for (int k = 0; k &amp;lt;= i; k++){&lt;br /&gt;
        vec_X[i] += matrix_cov[i][k] * vec_Y[k];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Алгоритм был реализован на языке C++ с использованием Intel MPI Library и запущен на кластере regular4.&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add impi/5.0.1&lt;br /&gt;
 mpicxx -std=c++0x task.c -o _scratch/task&lt;br /&gt;
 cd _scratch&lt;br /&gt;
 sbatch -n256 impi ./task &amp;lt;matrix_size&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
* размер матрицы [1024 : 4864] с шагом 256,&lt;br /&gt;
* число ядер [2 : 256] с шагом-умножением в 2 раза.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:Ops_2.png|thumb|center|700px|Рисунок 1. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В отличие от разложения Холецкого, которое реализовано (точечный метод) во многих прикладных пакетах (напр., LINPACK, LAPACK, SCALAPACK), моделирование гауссовского случайного вектора не так &amp;quot;популярно&amp;quot;. MS Excel и распространённые статистические пакеты (напр., SPSS, Statistica) позволяют моделировать только одномерные статистические распределения.&lt;br /&gt;
&lt;br /&gt;
Имеется возможность &amp;quot;собрать&amp;quot; многомерное распределение из нескольких одномерных при условии, что компоненты независимы. Однако если необходимо исследовать данные с зависящими друг от друга переменными, то приходится писать собственную программу.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Lonalone</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26739</id>
		<title>Участник:Lonalone/Генерация гауссовского вектора методом линейных преобразований</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26739"/>
		<updated>2018-12-01T07:21:42Z</updated>

		<summary type="html">&lt;p&gt;Lonalone: /* Заполнение матрицы B */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор описания: &#039;&#039;Меньших И. М.&#039;&#039;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из многомерных распределений особый интерес представляет нормальное. Этому закону подчиняются все результаты воздействия большого числа случайных факторов, среди которых нет превалирующих.&lt;br /&gt;
&lt;br /&gt;
В статье приведен алгоритм генерации n-мерного гауссовского случайного вектора с помощью &#039;&#039;метода линейных преобразований&#039;&#039;&amp;lt;ref name=&amp;quot;V&amp;quot;&amp;gt;(п. 1.10.4) Михайлов Г.А., Войтишек А.В. Численное статистическое моделирование. Методы Монте-Карло — М.: Академия, 2006. — 368 с.&amp;lt;/ref&amp;gt;. Известно, что случае нормально распределенного случайного вектора, ковариационная матрица вместе с математическим ожиданием этого вектора полностью определяют его распределение. Поэтому для полного статистического соответствия моделируемого и теоретического распределения гауссовского вектора достаточно обеспечить требуемые значения указанных параметров&amp;lt;ref name=&amp;quot;VV&amp;quot;&amp;gt; https://ru.wikipedia.org/wiki/Многомерное_нормальное_распределение&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея алгоритма заключается в линейном преобразовании n-мерного случайного вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, компоненты которого независимы и одинаково распределены по нормальному закону со стандартными параметрами, в случайный вектор &amp;lt;math&amp;gt;X&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;\Sigma&amp;lt;/math&amp;gt; и вектор математических ожиданий &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Sigma = \|\sigma_{ij}\| = \| \mathbb{E}[(X_{i} - m_{x_{i}})(X_{j} - m_{x_{j}})]\|, \\&lt;br /&gt;
M = (m_{x_{1}}, m_{x_{2}}, ..., m_{x_{n}})^T.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Требуется найти такую матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, которая позволяла бы получить искомый вектор &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; с требуемыми характеристиками в результате линейного преобразования &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — n-мерный случайный вектор с независимыми нормально распределенными компонентами со стандартными параметрами.&lt;br /&gt;
&lt;br /&gt;
Будем искать матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в виде нижней треугольной матрицы. Перейдем от матричной записи к системе алгебраических уравнений:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} X_{1} \\&lt;br /&gt;
 X_{2} \\ \vdots \\ X_{n} \end{pmatrix} =&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} b_{11} &amp;amp; 0 &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\b_{21} &amp;amp; b_{22} &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\ \vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \vdots&lt;br /&gt;
\\ b_{n1} &amp;amp; b_{n2} &amp;amp; \cdots &amp;amp; b_{nn}&lt;br /&gt;
\end{pmatrix} \times&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} Y_{1} \\&lt;br /&gt;
 Y_{2} \\ \vdots \\ Y_{n} \end{pmatrix} +&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} m_{x_{1}} \\&lt;br /&gt;
 m_{x_{2}} \\ \vdots \\ m_{x_{n}} \end{pmatrix} \Rightarrow&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}X_{1} - m_{x_{1}} = b_{11}Y_{1}&lt;br /&gt;
\\X_{2} - m_{x_{2}} = b_{21}Y_{1} + b_{22}Y_{2}&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\\X_{n} - m_{x_{n}} = b_{n1}Y_{1} + b_{n2}Y_{2} + \cdots + b_{nn}Y_{n}&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Поскольку компоненты вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; независимы и имеют стандартные параметры, справедливо выражение:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\mathbb{E}[Y_{i}Y_{j}] =&lt;br /&gt;
\left\{\begin{matrix} &lt;br /&gt;
1, &amp;amp;i = j, \\&lt;br /&gt;
0, &amp;amp;i \not= j.&lt;br /&gt;
\end{matrix}\right.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Почленно перемножив сами на себя и между собой соответственно левые и правые части уравнений системы и взяв от результатов перемножения математическое ожидание, получаем систему уравнений вида:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\mathbb{E}[(X_{1} - m_{x_{1}})(X_{1} - m_{x_{1}})] = \mathbb{E}[b_{11}Y_{1}b_{11}Y_{1}],&lt;br /&gt;
\\ \mathbb{E}[(X_{1} - m_{x_{1}})(X_{2} - m_{x_{2}})] = \mathbb{E}[(b_{21}Y_{1} + b_{22}Y_{2})b_{11}Y_{1}],&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, в левых частях полученной системы уравнений располагаются элементы заданной ковариационной матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;, а в правых — элементы искомой матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;. Последовательно решая эту систему, получаем формулы для расчета элементов &amp;lt;math&amp;gt;\sigma_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
b_{11}=\sqrt{\sigma_{11}}; b_{21}=\frac{\sigma_{12}}{\sqrt{\sigma_{11}}}; b_{22} = \sqrt{\sigma_{22} - \frac{\sigma_{12}}{\sigma_{11}}}, \cdots&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рекуррентная формула для расчета любого элемента матрицы преобразования &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b_{ij} = \frac {\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}} {\sqrt{\sigma_{ij} - \sum_{k=1}^{j-1} b_{jk}^2}}, \quad 1 \leqslant j \leqslant i \leqslant n&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(суммы с верхним нулевым пределом считаются равными нулю)&lt;br /&gt;
&lt;br /&gt;
Таким образом, матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; получается с помощью [[Разложение_Холецкого_(метод_квадратного_корня)|разложения Холецкого]] матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Генерация случайного вектора Y ====&lt;br /&gt;
&lt;br /&gt;
Пусть имеется генератор псевдослучайных чисел (ГПСЧ, PRNG), с помощью которого можно получить реализацию случайной величины &amp;lt;math&amp;gt;u \sim U(0,1) &amp;lt;/math&amp;gt;. Описанный выше случайный вектор &amp;lt;math&amp;gt;Y=(y_1, \cdots, y_n)&amp;lt;/math&amp;gt; с независимыми компонентами составим из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; реализаций случайной величины &amp;lt;math&amp;gt;\eta \sim N(0,1)&amp;lt;/math&amp;gt;. Каждую такую реализацию &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;, в свою очередь, получим с помощью приближения по ЦПТ &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; случайными величинами, распределенными равномерно на отрезке [0,1]:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right), \quad i = \overline{1, n} \\&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;u_j^i - &amp;lt;/math&amp;gt; реализации случайной величины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;\kappa - &amp;lt;/math&amp;gt; параметр, обеспечивающий качество приближения.&lt;br /&gt;
&lt;br /&gt;
Как правило, &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; берут равным 12 и считают, что для подавляющего числа практических задач обеспечивается должная точность вычислений&amp;lt;ref name = &amp;quot;VVV&amp;quot;&amp;gt;Балдин К.В., Уткин В.Б. Информационные системы в экономике. — М.:Дашков и Кo, 2008. — 395 с.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}, \quad 1 \leqslant j \leqslant i \leqslant n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;&lt;br /&gt;
* Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1) Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;b_{11}= \sqrt{\sigma_{11}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;b_{k1}= \frac{\sigma_{k1}}{l_{11}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad k = \overline{2,n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{2,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (c) &amp;lt;math&amp;gt;b_{ii} = \sqrt{\sigma_{ii} - \sum_{p = 1}^{i - 1} b_{ip}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (d) &amp;lt;math&amp;gt;b_{ji} = \frac{\sigma_{ji} - \sum_{p = 1}^{i - 1} b_{ip} b_{jp}} {l_{ii}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad i \neq n, j = \overline{i+1,n}&amp;lt;/math&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;u_j^i \leftarrow PRNG,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\quad j = \overline{1,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3) Вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i = m_{x_i} + \sum_{k = 1}^{i} b_{ik} y_{k}, \quad i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + \sum_{j=1}^{n-2}j(n-j-1) + n + \frac {n(n+1)}{2} =&lt;br /&gt;
  n(n+1) + \frac {n(n-1)(n-2)}{6}&amp;lt;/math&amp;gt; (умножений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + \sum_{j=1}^{n-2}j(n-j-1) + n =&lt;br /&gt;
  \frac {n(n+1)}{2} + \frac {n(n-1)(n-2)}{6}&amp;lt;/math&amp;gt; (вычитаний)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad (\kappa-1)n + \frac {n(n+1)}{2} = \frac {n(n-1+2\kappa)}{2}&amp;lt;/math&amp;gt; (сложений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + 2n = \frac {n(n+3)}{2}&amp;lt;/math&amp;gt; (делений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad n + n  = 2n &amp;lt;/math&amp;gt; (взятия квадратного корня)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{n}{6}\left(2n^2+9n+31+6\kappa\right) &amp;lt;/math&amp;gt; - итого операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
==== Заполнение матрицы B====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 1 макроструктуры алгоритма (&#039;&#039;разложение Холецкого&#039;&#039;) состоит из трёх групп вершин, расположенных в целочисленных узлах трёх областей разной размерности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин расположена в одномерной области, соответствующая ей операция вычисляет функцию SQRT. &lt;br /&gt;
Единственная координата каждой из вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргумент этой функции &lt;br /&gt;
	&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{11}&amp;lt;/math&amp;gt;; &lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ii}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин расположена в двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a / b&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;: &lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;\sigma_{j1}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1, j, i - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ji}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин расположена в трёхмерной области, соответствующая ей операция  &amp;lt;math&amp;gt;a - b * c&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; — меняется в диапазоне  от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;p = 1&amp;lt;/math&amp;gt; элемент входных данных &amp;lt;math&amp;gt;\sigma_{ji}&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;p &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i, j, p - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, i&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, j&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; .&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.1, выполненном для случая &amp;lt;math&amp;gt;n = 4&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
[[file:Cholesky full_in_out.png|thumb|center|1400px|Рисунок 1. Граф этапа 1 макроструктуры алгоритма. SQ - вычисление квадратного корня, F - операция a-bc, Div - деление, In - входные данные, Out - выходные.]]&lt;br /&gt;
&lt;br /&gt;
====Генерация вектора Y====&lt;br /&gt;
&lt;br /&gt;
====Вычисление вектора X====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 3 макроструктуры алгоритма (умножение нижней треугольной матрицы на вектор и сложение результата с другим вектором) состоит из одной группы вершин, расположенной в целочисленных узлах двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a+bc&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;j = 1&amp;lt;/math&amp;gt; — компонента &amp;lt;math&amp;gt;m_{x_i}&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;j &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине с координатами &amp;lt;math&amp;gt;i, j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;b_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;y_{j}&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является:&lt;br /&gt;
* при &amp;lt;math&amp;gt;j &amp;lt; i&amp;lt;/math&amp;gt; — &#039;&#039;промежуточным данным&#039;&#039; этапа;&lt;br /&gt;
* при &amp;lt;math&amp;gt;j = i&amp;lt;/math&amp;gt; — &#039;&#039;выходным данным&#039;&#039; алгоритма &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рисунке, выполненном для случая &amp;lt;math&amp;gt; n = 4&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf3.png|750px|thumb|center|Рисунок 3. Граф этапа 3 макроструктуры алгоритма,  F - операция a+bc]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для распараллеливания доступны следующие опции:&lt;br /&gt;
* вычисление элементов матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в рамках столбца (под диагональю),&lt;br /&gt;
* генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;,&lt;br /&gt;
* вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (умножение матрицы на вектор, сложение векторов).&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: вещественная всюду плотная положительно определенная симметрическая  &amp;lt;math&amp;gt;(n \times n)&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;\Sigma&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;
* Выходные данные: вещественный &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектор &amp;lt;math&amp;gt;X&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;syntaxhighlight lang = c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// compute matrix B (core)&lt;br /&gt;
for (int j = 0; j &amp;lt; n; j++){&lt;br /&gt;
    double sum_down = matrix_cov[j][j];&lt;br /&gt;
    for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
        double cur = matrix_cov[j][k];&lt;br /&gt;
        sum_down -= cur * cur;&lt;br /&gt;
    }&lt;br /&gt;
    matrix_cov[j][j] = sqrt(sum_down);&lt;br /&gt;
    for (int i = j + 1; i &amp;lt; n; i++){&lt;br /&gt;
        double sum_up = matrix_cov[i][j];&lt;br /&gt;
        for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
            sum_up -= matrix_cov[i][k] * matrix_cov[j][k];&lt;br /&gt;
        }&lt;br /&gt;
        matrix_cov[i][j] = sum_up / matrix_cov[j][j];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
// generate vector Y&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){&lt;br /&gt;
    double sum = generate_uniform(n);&lt;br /&gt;
    for (int j = 0; j &amp;lt; CLT_NUM - 1; j++){&lt;br /&gt;
        sum += generate_uniform(n);&lt;br /&gt;
    }&lt;br /&gt;
    vec_Y[i] = (sum - CLT_NUM / 2) * sqrt(12.0 / CLT_NUM);&lt;br /&gt;
}&lt;br /&gt;
// linear transformation&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){  &lt;br /&gt;
    vec_X[i] = vec_exp[i];&lt;br /&gt;
    for (int k = 0; k &amp;lt;= i; k++){&lt;br /&gt;
        vec_X[i] += matrix_cov[i][k] * vec_Y[k];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Алгоритм был реализован на языке C++ с использованием Intel MPI Library и запущен на кластере regular4.&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add impi/5.0.1&lt;br /&gt;
 mpicxx -std=c++0x task.c -o _scratch/task&lt;br /&gt;
 cd _scratch&lt;br /&gt;
 sbatch -n256 impi ./task &amp;lt;matrix_size&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
* размер матрицы [1024 : 4864] с шагом 256,&lt;br /&gt;
* число ядер [2 : 256] с шагом-умножением в 2 раза.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:Ops_2.png|thumb|center|700px|Рисунок 1. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В отличие от разложения Холецкого, которое реализовано (точечный метод) во многих прикладных пакетах (напр., LINPACK, LAPACK, SCALAPACK), моделирование гауссовского случайного вектора не так &amp;quot;популярно&amp;quot;. MS Excel и распространённые статистические пакеты (напр., SPSS, Statistica) позволяют моделировать только одномерные статистические распределения.&lt;br /&gt;
&lt;br /&gt;
Имеется возможность &amp;quot;собрать&amp;quot; многомерное распределение из нескольких одномерных при условии, что компоненты независимы. Однако если необходимо исследовать данные с зависящими друг от друга переменными, то приходится писать собственную программу.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Lonalone</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26738</id>
		<title>Участник:Lonalone/Генерация гауссовского вектора методом линейных преобразований</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26738"/>
		<updated>2018-12-01T07:15:16Z</updated>

		<summary type="html">&lt;p&gt;Lonalone: /* Вычисление вектора X */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор описания: &#039;&#039;Меньших И. М.&#039;&#039;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из многомерных распределений особый интерес представляет нормальное. Этому закону подчиняются все результаты воздействия большого числа случайных факторов, среди которых нет превалирующих.&lt;br /&gt;
&lt;br /&gt;
В статье приведен алгоритм генерации n-мерного гауссовского случайного вектора с помощью &#039;&#039;метода линейных преобразований&#039;&#039;&amp;lt;ref name=&amp;quot;V&amp;quot;&amp;gt;(п. 1.10.4) Михайлов Г.А., Войтишек А.В. Численное статистическое моделирование. Методы Монте-Карло — М.: Академия, 2006. — 368 с.&amp;lt;/ref&amp;gt;. Известно, что случае нормально распределенного случайного вектора, ковариационная матрица вместе с математическим ожиданием этого вектора полностью определяют его распределение. Поэтому для полного статистического соответствия моделируемого и теоретического распределения гауссовского вектора достаточно обеспечить требуемые значения указанных параметров&amp;lt;ref name=&amp;quot;VV&amp;quot;&amp;gt; https://ru.wikipedia.org/wiki/Многомерное_нормальное_распределение&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея алгоритма заключается в линейном преобразовании n-мерного случайного вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, компоненты которого независимы и одинаково распределены по нормальному закону со стандартными параметрами, в случайный вектор &amp;lt;math&amp;gt;X&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;\Sigma&amp;lt;/math&amp;gt; и вектор математических ожиданий &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Sigma = \|\sigma_{ij}\| = \| \mathbb{E}[(X_{i} - m_{x_{i}})(X_{j} - m_{x_{j}})]\|, \\&lt;br /&gt;
M = (m_{x_{1}}, m_{x_{2}}, ..., m_{x_{n}})^T.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Требуется найти такую матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, которая позволяла бы получить искомый вектор &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; с требуемыми характеристиками в результате линейного преобразования &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — n-мерный случайный вектор с независимыми нормально распределенными компонентами со стандартными параметрами.&lt;br /&gt;
&lt;br /&gt;
Будем искать матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в виде нижней треугольной матрицы. Перейдем от матричной записи к системе алгебраических уравнений:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} X_{1} \\&lt;br /&gt;
 X_{2} \\ \vdots \\ X_{n} \end{pmatrix} =&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} b_{11} &amp;amp; 0 &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\b_{21} &amp;amp; b_{22} &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\ \vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \vdots&lt;br /&gt;
\\ b_{n1} &amp;amp; b_{n2} &amp;amp; \cdots &amp;amp; b_{nn}&lt;br /&gt;
\end{pmatrix} \times&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} Y_{1} \\&lt;br /&gt;
 Y_{2} \\ \vdots \\ Y_{n} \end{pmatrix} +&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} m_{x_{1}} \\&lt;br /&gt;
 m_{x_{2}} \\ \vdots \\ m_{x_{n}} \end{pmatrix} \Rightarrow&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}X_{1} - m_{x_{1}} = b_{11}Y_{1}&lt;br /&gt;
\\X_{2} - m_{x_{2}} = b_{21}Y_{1} + b_{22}Y_{2}&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\\X_{n} - m_{x_{n}} = b_{n1}Y_{1} + b_{n2}Y_{2} + \cdots + b_{nn}Y_{n}&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Поскольку компоненты вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; независимы и имеют стандартные параметры, справедливо выражение:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\mathbb{E}[Y_{i}Y_{j}] =&lt;br /&gt;
\left\{\begin{matrix} &lt;br /&gt;
1, &amp;amp;i = j, \\&lt;br /&gt;
0, &amp;amp;i \not= j.&lt;br /&gt;
\end{matrix}\right.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Почленно перемножив сами на себя и между собой соответственно левые и правые части уравнений системы и взяв от результатов перемножения математическое ожидание, получаем систему уравнений вида:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\mathbb{E}[(X_{1} - m_{x_{1}})(X_{1} - m_{x_{1}})] = \mathbb{E}[b_{11}Y_{1}b_{11}Y_{1}],&lt;br /&gt;
\\ \mathbb{E}[(X_{1} - m_{x_{1}})(X_{2} - m_{x_{2}})] = \mathbb{E}[(b_{21}Y_{1} + b_{22}Y_{2})b_{11}Y_{1}],&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, в левых частях полученной системы уравнений располагаются элементы заданной ковариационной матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;, а в правых — элементы искомой матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;. Последовательно решая эту систему, получаем формулы для расчета элементов &amp;lt;math&amp;gt;\sigma_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
b_{11}=\sqrt{\sigma_{11}}; b_{21}=\frac{\sigma_{12}}{\sqrt{\sigma_{11}}}; b_{22} = \sqrt{\sigma_{22} - \frac{\sigma_{12}}{\sigma_{11}}}, \cdots&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рекуррентная формула для расчета любого элемента матрицы преобразования &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b_{ij} = \frac {\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}} {\sqrt{\sigma_{ij} - \sum_{k=1}^{j-1} b_{jk}^2}}, \quad 1 \leqslant j \leqslant i \leqslant n&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(суммы с верхним нулевым пределом считаются равными нулю)&lt;br /&gt;
&lt;br /&gt;
Таким образом, матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; получается с помощью [[Разложение_Холецкого_(метод_квадратного_корня)|разложения Холецкого]] матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Генерация случайного вектора Y ====&lt;br /&gt;
&lt;br /&gt;
Пусть имеется генератор псевдослучайных чисел (ГПСЧ, PRNG), с помощью которого можно получить реализацию случайной величины &amp;lt;math&amp;gt;u \sim U(0,1) &amp;lt;/math&amp;gt;. Описанный выше случайный вектор &amp;lt;math&amp;gt;Y=(y_1, \cdots, y_n)&amp;lt;/math&amp;gt; с независимыми компонентами составим из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; реализаций случайной величины &amp;lt;math&amp;gt;\eta \sim N(0,1)&amp;lt;/math&amp;gt;. Каждую такую реализацию &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;, в свою очередь, получим с помощью приближения по ЦПТ &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; случайными величинами, распределенными равномерно на отрезке [0,1]:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right), \quad i = \overline{1, n} \\&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;u_j^i - &amp;lt;/math&amp;gt; реализации случайной величины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;\kappa - &amp;lt;/math&amp;gt; параметр, обеспечивающий качество приближения.&lt;br /&gt;
&lt;br /&gt;
Как правило, &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; берут равным 12 и считают, что для подавляющего числа практических задач обеспечивается должная точность вычислений&amp;lt;ref name = &amp;quot;VVV&amp;quot;&amp;gt;Балдин К.В., Уткин В.Б. Информационные системы в экономике. — М.:Дашков и Кo, 2008. — 395 с.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}, \quad 1 \leqslant j \leqslant i \leqslant n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;&lt;br /&gt;
* Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1) Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;b_{11}= \sqrt{\sigma_{11}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;b_{k1}= \frac{\sigma_{k1}}{l_{11}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad k = \overline{2,n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{2,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (c) &amp;lt;math&amp;gt;b_{ii} = \sqrt{\sigma_{ii} - \sum_{p = 1}^{i - 1} b_{ip}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (d) &amp;lt;math&amp;gt;b_{ji} = \frac{\sigma_{ji} - \sum_{p = 1}^{i - 1} b_{ip} b_{jp}} {l_{ii}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad i \neq n, j = \overline{i+1,n}&amp;lt;/math&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;u_j^i \leftarrow PRNG,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\quad j = \overline{1,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3) Вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i = m_{x_i} + \sum_{k = 1}^{i} b_{ik} y_{k}, \quad i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + \sum_{j=1}^{n-2}j(n-j-1) + n + \frac {n(n+1)}{2} =&lt;br /&gt;
  n(n+1) + \frac {n(n-1)(n-2)}{6}&amp;lt;/math&amp;gt; (умножений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + \sum_{j=1}^{n-2}j(n-j-1) + n =&lt;br /&gt;
  \frac {n(n+1)}{2} + \frac {n(n-1)(n-2)}{6}&amp;lt;/math&amp;gt; (вычитаний)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad (\kappa-1)n + \frac {n(n+1)}{2} = \frac {n(n-1+2\kappa)}{2}&amp;lt;/math&amp;gt; (сложений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + 2n = \frac {n(n+3)}{2}&amp;lt;/math&amp;gt; (делений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad n + n  = 2n &amp;lt;/math&amp;gt; (взятия квадратного корня)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{n}{6}\left(2n^2+9n+31+6\kappa\right) &amp;lt;/math&amp;gt; - итого операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
==== Заполнение матрицы B====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 1 макроструктуры алгоритма (разложение Холецкого) состоит из трёх групп вершин, расположенных в целочисленных узлах трёх областей разной размерности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин расположена в одномерной области, соответствующая ей операция вычисляет функцию SQRT. &lt;br /&gt;
Единственная координата каждой из вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргумент этой функции &lt;br /&gt;
	&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039;, а именно  &amp;lt;math&amp;gt;\sigma_{11}&amp;lt;/math&amp;gt;; &lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ii}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин расположена в двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a / b&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;: &lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элементы &#039;&#039;входных данных&#039;&#039;, а именно &amp;lt;math&amp;gt;\sigma_{j1}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1, j, i - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ji}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин расположена в трёхмерной области, соответствующая ей операция  &amp;lt;math&amp;gt;a - b * c&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; — меняется в диапазоне  от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;p = 1&amp;lt;/math&amp;gt; элемент входных данных &amp;lt;math&amp;gt;\sigma_{ji}&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;p &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i, j, p - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, i&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, j&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.1, выполненном для случая &amp;lt;math&amp;gt;n = 4&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
[[file:Cholesky full_in_out.png|thumb|center|1400px|Рисунок 1. Граф этапа 1 макроструктуры алгоритма. SQ - вычисление квадратного корня, F - операция a-bc, Div - деление, In - входные данные, Out - результаты.]]&lt;br /&gt;
&lt;br /&gt;
====Генерация вектора Y====&lt;br /&gt;
&lt;br /&gt;
====Вычисление вектора X====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 3 макроструктуры алгоритма (умножение нижней треугольной матрицы на вектор и сложение результата с другим вектором) состоит из одной группы вершин, расположенной в целочисленных узлах двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a+bc&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;j = 1&amp;lt;/math&amp;gt; — компонента &amp;lt;math&amp;gt;m_{x_i}&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;j &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине с координатами &amp;lt;math&amp;gt;i, j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;b_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;y_{j}&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является:&lt;br /&gt;
* при &amp;lt;math&amp;gt;j &amp;lt; i&amp;lt;/math&amp;gt; — &#039;&#039;промежуточным данным&#039;&#039; этапа;&lt;br /&gt;
* при &amp;lt;math&amp;gt;j = i&amp;lt;/math&amp;gt; — &#039;&#039;выходным данным&#039;&#039; алгоритма &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рисунке, выполненном для случая &amp;lt;math&amp;gt; n = 4&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf3.png|750px|thumb|center|Рисунок 3. Граф этапа 3 макроструктуры алгоритма,  F - операция a+bc]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для распараллеливания доступны следующие опции:&lt;br /&gt;
* вычисление элементов матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в рамках столбца (под диагональю),&lt;br /&gt;
* генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;,&lt;br /&gt;
* вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (умножение матрицы на вектор, сложение векторов).&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: вещественная всюду плотная положительно определенная симметрическая  &amp;lt;math&amp;gt;(n \times n)&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;\Sigma&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;
* Выходные данные: вещественный &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектор &amp;lt;math&amp;gt;X&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;syntaxhighlight lang = c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// compute matrix B (core)&lt;br /&gt;
for (int j = 0; j &amp;lt; n; j++){&lt;br /&gt;
    double sum_down = matrix_cov[j][j];&lt;br /&gt;
    for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
        double cur = matrix_cov[j][k];&lt;br /&gt;
        sum_down -= cur * cur;&lt;br /&gt;
    }&lt;br /&gt;
    matrix_cov[j][j] = sqrt(sum_down);&lt;br /&gt;
    for (int i = j + 1; i &amp;lt; n; i++){&lt;br /&gt;
        double sum_up = matrix_cov[i][j];&lt;br /&gt;
        for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
            sum_up -= matrix_cov[i][k] * matrix_cov[j][k];&lt;br /&gt;
        }&lt;br /&gt;
        matrix_cov[i][j] = sum_up / matrix_cov[j][j];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
// generate vector Y&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){&lt;br /&gt;
    double sum = generate_uniform(n);&lt;br /&gt;
    for (int j = 0; j &amp;lt; CLT_NUM - 1; j++){&lt;br /&gt;
        sum += generate_uniform(n);&lt;br /&gt;
    }&lt;br /&gt;
    vec_Y[i] = (sum - CLT_NUM / 2) * sqrt(12.0 / CLT_NUM);&lt;br /&gt;
}&lt;br /&gt;
// linear transformation&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){  &lt;br /&gt;
    vec_X[i] = vec_exp[i];&lt;br /&gt;
    for (int k = 0; k &amp;lt;= i; k++){&lt;br /&gt;
        vec_X[i] += matrix_cov[i][k] * vec_Y[k];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Алгоритм был реализован на языке C++ с использованием Intel MPI Library и запущен на кластере regular4.&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add impi/5.0.1&lt;br /&gt;
 mpicxx -std=c++0x task.c -o _scratch/task&lt;br /&gt;
 cd _scratch&lt;br /&gt;
 sbatch -n256 impi ./task &amp;lt;matrix_size&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
* размер матрицы [1024 : 4864] с шагом 256,&lt;br /&gt;
* число ядер [2 : 256] с шагом-умножением в 2 раза.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:Ops_2.png|thumb|center|700px|Рисунок 1. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В отличие от разложения Холецкого, которое реализовано (точечный метод) во многих прикладных пакетах (напр., LINPACK, LAPACK, SCALAPACK), моделирование гауссовского случайного вектора не так &amp;quot;популярно&amp;quot;. MS Excel и распространённые статистические пакеты (напр., SPSS, Statistica) позволяют моделировать только одномерные статистические распределения.&lt;br /&gt;
&lt;br /&gt;
Имеется возможность &amp;quot;собрать&amp;quot; многомерное распределение из нескольких одномерных при условии, что компоненты независимы. Однако если необходимо исследовать данные с зависящими друг от друга переменными, то приходится писать собственную программу.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Lonalone</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26737</id>
		<title>Участник:Lonalone/Генерация гауссовского вектора методом линейных преобразований</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26737"/>
		<updated>2018-12-01T07:14:01Z</updated>

		<summary type="html">&lt;p&gt;Lonalone: /* Вычисление вектора X */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор описания: &#039;&#039;Меньших И. М.&#039;&#039;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из многомерных распределений особый интерес представляет нормальное. Этому закону подчиняются все результаты воздействия большого числа случайных факторов, среди которых нет превалирующих.&lt;br /&gt;
&lt;br /&gt;
В статье приведен алгоритм генерации n-мерного гауссовского случайного вектора с помощью &#039;&#039;метода линейных преобразований&#039;&#039;&amp;lt;ref name=&amp;quot;V&amp;quot;&amp;gt;(п. 1.10.4) Михайлов Г.А., Войтишек А.В. Численное статистическое моделирование. Методы Монте-Карло — М.: Академия, 2006. — 368 с.&amp;lt;/ref&amp;gt;. Известно, что случае нормально распределенного случайного вектора, ковариационная матрица вместе с математическим ожиданием этого вектора полностью определяют его распределение. Поэтому для полного статистического соответствия моделируемого и теоретического распределения гауссовского вектора достаточно обеспечить требуемые значения указанных параметров&amp;lt;ref name=&amp;quot;VV&amp;quot;&amp;gt; https://ru.wikipedia.org/wiki/Многомерное_нормальное_распределение&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея алгоритма заключается в линейном преобразовании n-мерного случайного вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, компоненты которого независимы и одинаково распределены по нормальному закону со стандартными параметрами, в случайный вектор &amp;lt;math&amp;gt;X&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;\Sigma&amp;lt;/math&amp;gt; и вектор математических ожиданий &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Sigma = \|\sigma_{ij}\| = \| \mathbb{E}[(X_{i} - m_{x_{i}})(X_{j} - m_{x_{j}})]\|, \\&lt;br /&gt;
M = (m_{x_{1}}, m_{x_{2}}, ..., m_{x_{n}})^T.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Требуется найти такую матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, которая позволяла бы получить искомый вектор &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; с требуемыми характеристиками в результате линейного преобразования &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — n-мерный случайный вектор с независимыми нормально распределенными компонентами со стандартными параметрами.&lt;br /&gt;
&lt;br /&gt;
Будем искать матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в виде нижней треугольной матрицы. Перейдем от матричной записи к системе алгебраических уравнений:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} X_{1} \\&lt;br /&gt;
 X_{2} \\ \vdots \\ X_{n} \end{pmatrix} =&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} b_{11} &amp;amp; 0 &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\b_{21} &amp;amp; b_{22} &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\ \vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \vdots&lt;br /&gt;
\\ b_{n1} &amp;amp; b_{n2} &amp;amp; \cdots &amp;amp; b_{nn}&lt;br /&gt;
\end{pmatrix} \times&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} Y_{1} \\&lt;br /&gt;
 Y_{2} \\ \vdots \\ Y_{n} \end{pmatrix} +&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} m_{x_{1}} \\&lt;br /&gt;
 m_{x_{2}} \\ \vdots \\ m_{x_{n}} \end{pmatrix} \Rightarrow&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}X_{1} - m_{x_{1}} = b_{11}Y_{1}&lt;br /&gt;
\\X_{2} - m_{x_{2}} = b_{21}Y_{1} + b_{22}Y_{2}&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\\X_{n} - m_{x_{n}} = b_{n1}Y_{1} + b_{n2}Y_{2} + \cdots + b_{nn}Y_{n}&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Поскольку компоненты вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; независимы и имеют стандартные параметры, справедливо выражение:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\mathbb{E}[Y_{i}Y_{j}] =&lt;br /&gt;
\left\{\begin{matrix} &lt;br /&gt;
1, &amp;amp;i = j, \\&lt;br /&gt;
0, &amp;amp;i \not= j.&lt;br /&gt;
\end{matrix}\right.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Почленно перемножив сами на себя и между собой соответственно левые и правые части уравнений системы и взяв от результатов перемножения математическое ожидание, получаем систему уравнений вида:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\mathbb{E}[(X_{1} - m_{x_{1}})(X_{1} - m_{x_{1}})] = \mathbb{E}[b_{11}Y_{1}b_{11}Y_{1}],&lt;br /&gt;
\\ \mathbb{E}[(X_{1} - m_{x_{1}})(X_{2} - m_{x_{2}})] = \mathbb{E}[(b_{21}Y_{1} + b_{22}Y_{2})b_{11}Y_{1}],&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, в левых частях полученной системы уравнений располагаются элементы заданной ковариационной матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;, а в правых — элементы искомой матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;. Последовательно решая эту систему, получаем формулы для расчета элементов &amp;lt;math&amp;gt;\sigma_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
b_{11}=\sqrt{\sigma_{11}}; b_{21}=\frac{\sigma_{12}}{\sqrt{\sigma_{11}}}; b_{22} = \sqrt{\sigma_{22} - \frac{\sigma_{12}}{\sigma_{11}}}, \cdots&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рекуррентная формула для расчета любого элемента матрицы преобразования &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b_{ij} = \frac {\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}} {\sqrt{\sigma_{ij} - \sum_{k=1}^{j-1} b_{jk}^2}}, \quad 1 \leqslant j \leqslant i \leqslant n&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(суммы с верхним нулевым пределом считаются равными нулю)&lt;br /&gt;
&lt;br /&gt;
Таким образом, матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; получается с помощью [[Разложение_Холецкого_(метод_квадратного_корня)|разложения Холецкого]] матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Генерация случайного вектора Y ====&lt;br /&gt;
&lt;br /&gt;
Пусть имеется генератор псевдослучайных чисел (ГПСЧ, PRNG), с помощью которого можно получить реализацию случайной величины &amp;lt;math&amp;gt;u \sim U(0,1) &amp;lt;/math&amp;gt;. Описанный выше случайный вектор &amp;lt;math&amp;gt;Y=(y_1, \cdots, y_n)&amp;lt;/math&amp;gt; с независимыми компонентами составим из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; реализаций случайной величины &amp;lt;math&amp;gt;\eta \sim N(0,1)&amp;lt;/math&amp;gt;. Каждую такую реализацию &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;, в свою очередь, получим с помощью приближения по ЦПТ &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; случайными величинами, распределенными равномерно на отрезке [0,1]:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right), \quad i = \overline{1, n} \\&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;u_j^i - &amp;lt;/math&amp;gt; реализации случайной величины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;\kappa - &amp;lt;/math&amp;gt; параметр, обеспечивающий качество приближения.&lt;br /&gt;
&lt;br /&gt;
Как правило, &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; берут равным 12 и считают, что для подавляющего числа практических задач обеспечивается должная точность вычислений&amp;lt;ref name = &amp;quot;VVV&amp;quot;&amp;gt;Балдин К.В., Уткин В.Б. Информационные системы в экономике. — М.:Дашков и Кo, 2008. — 395 с.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}, \quad 1 \leqslant j \leqslant i \leqslant n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;&lt;br /&gt;
* Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1) Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;b_{11}= \sqrt{\sigma_{11}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;b_{k1}= \frac{\sigma_{k1}}{l_{11}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad k = \overline{2,n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{2,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (c) &amp;lt;math&amp;gt;b_{ii} = \sqrt{\sigma_{ii} - \sum_{p = 1}^{i - 1} b_{ip}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (d) &amp;lt;math&amp;gt;b_{ji} = \frac{\sigma_{ji} - \sum_{p = 1}^{i - 1} b_{ip} b_{jp}} {l_{ii}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad i \neq n, j = \overline{i+1,n}&amp;lt;/math&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;u_j^i \leftarrow PRNG,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\quad j = \overline{1,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3) Вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i = m_{x_i} + \sum_{k = 1}^{i} b_{ik} y_{k}, \quad i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + \sum_{j=1}^{n-2}j(n-j-1) + n + \frac {n(n+1)}{2} =&lt;br /&gt;
  n(n+1) + \frac {n(n-1)(n-2)}{6}&amp;lt;/math&amp;gt; (умножений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + \sum_{j=1}^{n-2}j(n-j-1) + n =&lt;br /&gt;
  \frac {n(n+1)}{2} + \frac {n(n-1)(n-2)}{6}&amp;lt;/math&amp;gt; (вычитаний)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad (\kappa-1)n + \frac {n(n+1)}{2} = \frac {n(n-1+2\kappa)}{2}&amp;lt;/math&amp;gt; (сложений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + 2n = \frac {n(n+3)}{2}&amp;lt;/math&amp;gt; (делений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad n + n  = 2n &amp;lt;/math&amp;gt; (взятия квадратного корня)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{n}{6}\left(2n^2+9n+31+6\kappa\right) &amp;lt;/math&amp;gt; - итого операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
==== Заполнение матрицы B====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 1 макроструктуры алгоритма (разложение Холецкого) состоит из трёх групп вершин, расположенных в целочисленных узлах трёх областей разной размерности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин расположена в одномерной области, соответствующая ей операция вычисляет функцию SQRT. &lt;br /&gt;
Единственная координата каждой из вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргумент этой функции &lt;br /&gt;
	&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039;, а именно  &amp;lt;math&amp;gt;\sigma_{11}&amp;lt;/math&amp;gt;; &lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ii}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин расположена в двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a / b&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;: &lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элементы &#039;&#039;входных данных&#039;&#039;, а именно &amp;lt;math&amp;gt;\sigma_{j1}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1, j, i - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ji}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин расположена в трёхмерной области, соответствующая ей операция  &amp;lt;math&amp;gt;a - b * c&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; — меняется в диапазоне  от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;p = 1&amp;lt;/math&amp;gt; элемент входных данных &amp;lt;math&amp;gt;\sigma_{ji}&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;p &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i, j, p - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, i&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, j&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.1, выполненном для случая &amp;lt;math&amp;gt;n = 4&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
[[file:Cholesky full_in_out.png|thumb|center|1400px|Рисунок 1. Граф этапа 1 макроструктуры алгоритма. SQ - вычисление квадратного корня, F - операция a-bc, Div - деление, In - входные данные, Out - результаты.]]&lt;br /&gt;
&lt;br /&gt;
====Генерация вектора Y====&lt;br /&gt;
&lt;br /&gt;
====Вычисление вектора X====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 3 макроструктуры алгоритма (умножение нижней треугольной матрицы на вектор и сложение результата с другим вектором) состоит из одной группы вершин, расположенной в целочисленных узлах двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a+bc&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;j = 1&amp;lt;/math&amp;gt; — компонента &amp;lt;math&amp;gt;m_{x_i}&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;j &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине с координатами &amp;lt;math&amp;gt;i, j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;b_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;y_{j}&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является:&lt;br /&gt;
* при &amp;lt;math&amp;gt;j &amp;lt; i&amp;lt;/math&amp;gt; — &#039;&#039;промежуточным данным&#039;&#039; алгоритма;&lt;br /&gt;
* при &amp;lt;math&amp;gt;j = i&amp;lt;/math&amp;gt; — &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рисунке, выполненном для случая &amp;lt;math&amp;gt; n = 4&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf3.png|750px|thumb|center|Рисунок 3. Граф этапа 3 макроструктуры алгоритма,  F - операция a+bc]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для распараллеливания доступны следующие опции:&lt;br /&gt;
* вычисление элементов матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в рамках столбца (под диагональю),&lt;br /&gt;
* генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;,&lt;br /&gt;
* вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (умножение матрицы на вектор, сложение векторов).&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: вещественная всюду плотная положительно определенная симметрическая  &amp;lt;math&amp;gt;(n \times n)&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;\Sigma&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;
* Выходные данные: вещественный &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектор &amp;lt;math&amp;gt;X&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;syntaxhighlight lang = c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// compute matrix B (core)&lt;br /&gt;
for (int j = 0; j &amp;lt; n; j++){&lt;br /&gt;
    double sum_down = matrix_cov[j][j];&lt;br /&gt;
    for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
        double cur = matrix_cov[j][k];&lt;br /&gt;
        sum_down -= cur * cur;&lt;br /&gt;
    }&lt;br /&gt;
    matrix_cov[j][j] = sqrt(sum_down);&lt;br /&gt;
    for (int i = j + 1; i &amp;lt; n; i++){&lt;br /&gt;
        double sum_up = matrix_cov[i][j];&lt;br /&gt;
        for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
            sum_up -= matrix_cov[i][k] * matrix_cov[j][k];&lt;br /&gt;
        }&lt;br /&gt;
        matrix_cov[i][j] = sum_up / matrix_cov[j][j];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
// generate vector Y&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){&lt;br /&gt;
    double sum = generate_uniform(n);&lt;br /&gt;
    for (int j = 0; j &amp;lt; CLT_NUM - 1; j++){&lt;br /&gt;
        sum += generate_uniform(n);&lt;br /&gt;
    }&lt;br /&gt;
    vec_Y[i] = (sum - CLT_NUM / 2) * sqrt(12.0 / CLT_NUM);&lt;br /&gt;
}&lt;br /&gt;
// linear transformation&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){  &lt;br /&gt;
    vec_X[i] = vec_exp[i];&lt;br /&gt;
    for (int k = 0; k &amp;lt;= i; k++){&lt;br /&gt;
        vec_X[i] += matrix_cov[i][k] * vec_Y[k];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Алгоритм был реализован на языке C++ с использованием Intel MPI Library и запущен на кластере regular4.&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add impi/5.0.1&lt;br /&gt;
 mpicxx -std=c++0x task.c -o _scratch/task&lt;br /&gt;
 cd _scratch&lt;br /&gt;
 sbatch -n256 impi ./task &amp;lt;matrix_size&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
* размер матрицы [1024 : 4864] с шагом 256,&lt;br /&gt;
* число ядер [2 : 256] с шагом-умножением в 2 раза.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:Ops_2.png|thumb|center|700px|Рисунок 1. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В отличие от разложения Холецкого, которое реализовано (точечный метод) во многих прикладных пакетах (напр., LINPACK, LAPACK, SCALAPACK), моделирование гауссовского случайного вектора не так &amp;quot;популярно&amp;quot;. MS Excel и распространённые статистические пакеты (напр., SPSS, Statistica) позволяют моделировать только одномерные статистические распределения.&lt;br /&gt;
&lt;br /&gt;
Имеется возможность &amp;quot;собрать&amp;quot; многомерное распределение из нескольких одномерных при условии, что компоненты независимы. Однако если необходимо исследовать данные с зависящими друг от друга переменными, то приходится писать собственную программу.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Lonalone</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26736</id>
		<title>Участник:Lonalone/Генерация гауссовского вектора методом линейных преобразований</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26736"/>
		<updated>2018-12-01T07:13:13Z</updated>

		<summary type="html">&lt;p&gt;Lonalone: /* Заполнение матрицы B */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор описания: &#039;&#039;Меньших И. М.&#039;&#039;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из многомерных распределений особый интерес представляет нормальное. Этому закону подчиняются все результаты воздействия большого числа случайных факторов, среди которых нет превалирующих.&lt;br /&gt;
&lt;br /&gt;
В статье приведен алгоритм генерации n-мерного гауссовского случайного вектора с помощью &#039;&#039;метода линейных преобразований&#039;&#039;&amp;lt;ref name=&amp;quot;V&amp;quot;&amp;gt;(п. 1.10.4) Михайлов Г.А., Войтишек А.В. Численное статистическое моделирование. Методы Монте-Карло — М.: Академия, 2006. — 368 с.&amp;lt;/ref&amp;gt;. Известно, что случае нормально распределенного случайного вектора, ковариационная матрица вместе с математическим ожиданием этого вектора полностью определяют его распределение. Поэтому для полного статистического соответствия моделируемого и теоретического распределения гауссовского вектора достаточно обеспечить требуемые значения указанных параметров&amp;lt;ref name=&amp;quot;VV&amp;quot;&amp;gt; https://ru.wikipedia.org/wiki/Многомерное_нормальное_распределение&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея алгоритма заключается в линейном преобразовании n-мерного случайного вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, компоненты которого независимы и одинаково распределены по нормальному закону со стандартными параметрами, в случайный вектор &amp;lt;math&amp;gt;X&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;\Sigma&amp;lt;/math&amp;gt; и вектор математических ожиданий &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Sigma = \|\sigma_{ij}\| = \| \mathbb{E}[(X_{i} - m_{x_{i}})(X_{j} - m_{x_{j}})]\|, \\&lt;br /&gt;
M = (m_{x_{1}}, m_{x_{2}}, ..., m_{x_{n}})^T.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Требуется найти такую матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, которая позволяла бы получить искомый вектор &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; с требуемыми характеристиками в результате линейного преобразования &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — n-мерный случайный вектор с независимыми нормально распределенными компонентами со стандартными параметрами.&lt;br /&gt;
&lt;br /&gt;
Будем искать матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в виде нижней треугольной матрицы. Перейдем от матричной записи к системе алгебраических уравнений:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} X_{1} \\&lt;br /&gt;
 X_{2} \\ \vdots \\ X_{n} \end{pmatrix} =&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} b_{11} &amp;amp; 0 &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\b_{21} &amp;amp; b_{22} &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\ \vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \vdots&lt;br /&gt;
\\ b_{n1} &amp;amp; b_{n2} &amp;amp; \cdots &amp;amp; b_{nn}&lt;br /&gt;
\end{pmatrix} \times&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} Y_{1} \\&lt;br /&gt;
 Y_{2} \\ \vdots \\ Y_{n} \end{pmatrix} +&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} m_{x_{1}} \\&lt;br /&gt;
 m_{x_{2}} \\ \vdots \\ m_{x_{n}} \end{pmatrix} \Rightarrow&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}X_{1} - m_{x_{1}} = b_{11}Y_{1}&lt;br /&gt;
\\X_{2} - m_{x_{2}} = b_{21}Y_{1} + b_{22}Y_{2}&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\\X_{n} - m_{x_{n}} = b_{n1}Y_{1} + b_{n2}Y_{2} + \cdots + b_{nn}Y_{n}&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Поскольку компоненты вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; независимы и имеют стандартные параметры, справедливо выражение:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\mathbb{E}[Y_{i}Y_{j}] =&lt;br /&gt;
\left\{\begin{matrix} &lt;br /&gt;
1, &amp;amp;i = j, \\&lt;br /&gt;
0, &amp;amp;i \not= j.&lt;br /&gt;
\end{matrix}\right.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Почленно перемножив сами на себя и между собой соответственно левые и правые части уравнений системы и взяв от результатов перемножения математическое ожидание, получаем систему уравнений вида:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\mathbb{E}[(X_{1} - m_{x_{1}})(X_{1} - m_{x_{1}})] = \mathbb{E}[b_{11}Y_{1}b_{11}Y_{1}],&lt;br /&gt;
\\ \mathbb{E}[(X_{1} - m_{x_{1}})(X_{2} - m_{x_{2}})] = \mathbb{E}[(b_{21}Y_{1} + b_{22}Y_{2})b_{11}Y_{1}],&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, в левых частях полученной системы уравнений располагаются элементы заданной ковариационной матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;, а в правых — элементы искомой матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;. Последовательно решая эту систему, получаем формулы для расчета элементов &amp;lt;math&amp;gt;\sigma_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
b_{11}=\sqrt{\sigma_{11}}; b_{21}=\frac{\sigma_{12}}{\sqrt{\sigma_{11}}}; b_{22} = \sqrt{\sigma_{22} - \frac{\sigma_{12}}{\sigma_{11}}}, \cdots&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рекуррентная формула для расчета любого элемента матрицы преобразования &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b_{ij} = \frac {\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}} {\sqrt{\sigma_{ij} - \sum_{k=1}^{j-1} b_{jk}^2}}, \quad 1 \leqslant j \leqslant i \leqslant n&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(суммы с верхним нулевым пределом считаются равными нулю)&lt;br /&gt;
&lt;br /&gt;
Таким образом, матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; получается с помощью [[Разложение_Холецкого_(метод_квадратного_корня)|разложения Холецкого]] матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Генерация случайного вектора Y ====&lt;br /&gt;
&lt;br /&gt;
Пусть имеется генератор псевдослучайных чисел (ГПСЧ, PRNG), с помощью которого можно получить реализацию случайной величины &amp;lt;math&amp;gt;u \sim U(0,1) &amp;lt;/math&amp;gt;. Описанный выше случайный вектор &amp;lt;math&amp;gt;Y=(y_1, \cdots, y_n)&amp;lt;/math&amp;gt; с независимыми компонентами составим из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; реализаций случайной величины &amp;lt;math&amp;gt;\eta \sim N(0,1)&amp;lt;/math&amp;gt;. Каждую такую реализацию &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;, в свою очередь, получим с помощью приближения по ЦПТ &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; случайными величинами, распределенными равномерно на отрезке [0,1]:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right), \quad i = \overline{1, n} \\&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;u_j^i - &amp;lt;/math&amp;gt; реализации случайной величины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;\kappa - &amp;lt;/math&amp;gt; параметр, обеспечивающий качество приближения.&lt;br /&gt;
&lt;br /&gt;
Как правило, &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; берут равным 12 и считают, что для подавляющего числа практических задач обеспечивается должная точность вычислений&amp;lt;ref name = &amp;quot;VVV&amp;quot;&amp;gt;Балдин К.В., Уткин В.Б. Информационные системы в экономике. — М.:Дашков и Кo, 2008. — 395 с.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}, \quad 1 \leqslant j \leqslant i \leqslant n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;&lt;br /&gt;
* Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1) Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;b_{11}= \sqrt{\sigma_{11}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;b_{k1}= \frac{\sigma_{k1}}{l_{11}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad k = \overline{2,n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{2,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (c) &amp;lt;math&amp;gt;b_{ii} = \sqrt{\sigma_{ii} - \sum_{p = 1}^{i - 1} b_{ip}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (d) &amp;lt;math&amp;gt;b_{ji} = \frac{\sigma_{ji} - \sum_{p = 1}^{i - 1} b_{ip} b_{jp}} {l_{ii}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad i \neq n, j = \overline{i+1,n}&amp;lt;/math&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;u_j^i \leftarrow PRNG,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\quad j = \overline{1,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3) Вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i = m_{x_i} + \sum_{k = 1}^{i} b_{ik} y_{k}, \quad i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + \sum_{j=1}^{n-2}j(n-j-1) + n + \frac {n(n+1)}{2} =&lt;br /&gt;
  n(n+1) + \frac {n(n-1)(n-2)}{6}&amp;lt;/math&amp;gt; (умножений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + \sum_{j=1}^{n-2}j(n-j-1) + n =&lt;br /&gt;
  \frac {n(n+1)}{2} + \frac {n(n-1)(n-2)}{6}&amp;lt;/math&amp;gt; (вычитаний)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad (\kappa-1)n + \frac {n(n+1)}{2} = \frac {n(n-1+2\kappa)}{2}&amp;lt;/math&amp;gt; (сложений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + 2n = \frac {n(n+3)}{2}&amp;lt;/math&amp;gt; (делений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad n + n  = 2n &amp;lt;/math&amp;gt; (взятия квадратного корня)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{n}{6}\left(2n^2+9n+31+6\kappa\right) &amp;lt;/math&amp;gt; - итого операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
==== Заполнение матрицы B====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 1 макроструктуры алгоритма (разложение Холецкого) состоит из трёх групп вершин, расположенных в целочисленных узлах трёх областей разной размерности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин расположена в одномерной области, соответствующая ей операция вычисляет функцию SQRT. &lt;br /&gt;
Единственная координата каждой из вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргумент этой функции &lt;br /&gt;
	&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039;, а именно  &amp;lt;math&amp;gt;\sigma_{11}&amp;lt;/math&amp;gt;; &lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ii}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин расположена в двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a / b&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;: &lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элементы &#039;&#039;входных данных&#039;&#039;, а именно &amp;lt;math&amp;gt;\sigma_{j1}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1, j, i - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;b_{ji}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин расположена в трёхмерной области, соответствующая ей операция  &amp;lt;math&amp;gt;a - b * c&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; — меняется в диапазоне  от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;p = 1&amp;lt;/math&amp;gt; элемент входных данных &amp;lt;math&amp;gt;\sigma_{ji}&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;p &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i, j, p - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, i&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, j&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.1, выполненном для случая &amp;lt;math&amp;gt;n = 4&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
[[file:Cholesky full_in_out.png|thumb|center|1400px|Рисунок 1. Граф этапа 1 макроструктуры алгоритма. SQ - вычисление квадратного корня, F - операция a-bc, Div - деление, In - входные данные, Out - результаты.]]&lt;br /&gt;
&lt;br /&gt;
====Генерация вектора Y====&lt;br /&gt;
&lt;br /&gt;
====Вычисление вектора X====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 3 макроструктуры алгоритма (умножение нижней треугольной матрицы на вектор и сложение результата с другим вектором) состоит из одной группы вершин, расположенной в целочисленных узлах двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a+bc&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;j = 1&amp;lt;/math&amp;gt; — компонента &amp;lt;math&amp;gt;m_{x_i}&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;j &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине с координатами &amp;lt;math&amp;gt;i, j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;b_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;y_{j}&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является:&lt;br /&gt;
* при &amp;lt;math&amp;gt;j &amp;lt; i&amp;lt;/math&amp;gt; — &#039;&#039;промежуточным данным&#039;&#039; алгоритма;&lt;br /&gt;
* при &amp;lt;math&amp;gt;j = i&amp;lt;/math&amp;gt; — &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рисунке, выполненном для случая &amp;lt;math&amp;gt; n = 4&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf3.png|750px|thumb|center|Рисунок 3. Граф этапа 3 макроструктуры алгоритма]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для распараллеливания доступны следующие опции:&lt;br /&gt;
* вычисление элементов матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в рамках столбца (под диагональю),&lt;br /&gt;
* генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;,&lt;br /&gt;
* вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (умножение матрицы на вектор, сложение векторов).&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: вещественная всюду плотная положительно определенная симметрическая  &amp;lt;math&amp;gt;(n \times n)&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;\Sigma&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;
* Выходные данные: вещественный &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектор &amp;lt;math&amp;gt;X&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;syntaxhighlight lang = c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// compute matrix B (core)&lt;br /&gt;
for (int j = 0; j &amp;lt; n; j++){&lt;br /&gt;
    double sum_down = matrix_cov[j][j];&lt;br /&gt;
    for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
        double cur = matrix_cov[j][k];&lt;br /&gt;
        sum_down -= cur * cur;&lt;br /&gt;
    }&lt;br /&gt;
    matrix_cov[j][j] = sqrt(sum_down);&lt;br /&gt;
    for (int i = j + 1; i &amp;lt; n; i++){&lt;br /&gt;
        double sum_up = matrix_cov[i][j];&lt;br /&gt;
        for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
            sum_up -= matrix_cov[i][k] * matrix_cov[j][k];&lt;br /&gt;
        }&lt;br /&gt;
        matrix_cov[i][j] = sum_up / matrix_cov[j][j];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
// generate vector Y&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){&lt;br /&gt;
    double sum = generate_uniform(n);&lt;br /&gt;
    for (int j = 0; j &amp;lt; CLT_NUM - 1; j++){&lt;br /&gt;
        sum += generate_uniform(n);&lt;br /&gt;
    }&lt;br /&gt;
    vec_Y[i] = (sum - CLT_NUM / 2) * sqrt(12.0 / CLT_NUM);&lt;br /&gt;
}&lt;br /&gt;
// linear transformation&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){  &lt;br /&gt;
    vec_X[i] = vec_exp[i];&lt;br /&gt;
    for (int k = 0; k &amp;lt;= i; k++){&lt;br /&gt;
        vec_X[i] += matrix_cov[i][k] * vec_Y[k];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Алгоритм был реализован на языке C++ с использованием Intel MPI Library и запущен на кластере regular4.&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add impi/5.0.1&lt;br /&gt;
 mpicxx -std=c++0x task.c -o _scratch/task&lt;br /&gt;
 cd _scratch&lt;br /&gt;
 sbatch -n256 impi ./task &amp;lt;matrix_size&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
* размер матрицы [1024 : 4864] с шагом 256,&lt;br /&gt;
* число ядер [2 : 256] с шагом-умножением в 2 раза.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:Ops_2.png|thumb|center|700px|Рисунок 1. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В отличие от разложения Холецкого, которое реализовано (точечный метод) во многих прикладных пакетах (напр., LINPACK, LAPACK, SCALAPACK), моделирование гауссовского случайного вектора не так &amp;quot;популярно&amp;quot;. MS Excel и распространённые статистические пакеты (напр., SPSS, Statistica) позволяют моделировать только одномерные статистические распределения.&lt;br /&gt;
&lt;br /&gt;
Имеется возможность &amp;quot;собрать&amp;quot; многомерное распределение из нескольких одномерных при условии, что компоненты независимы. Однако если необходимо исследовать данные с зависящими друг от друга переменными, то приходится писать собственную программу.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Lonalone</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26735</id>
		<title>Участник:Lonalone/Генерация гауссовского вектора методом линейных преобразований</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26735"/>
		<updated>2018-12-01T00:58:08Z</updated>

		<summary type="html">&lt;p&gt;Lonalone: /* Вычисление вектора X */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор описания: &#039;&#039;Меньших И. М.&#039;&#039;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из многомерных распределений особый интерес представляет нормальное. Этому закону подчиняются все результаты воздействия большого числа случайных факторов, среди которых нет превалирующих.&lt;br /&gt;
&lt;br /&gt;
В статье приведен алгоритм генерации n-мерного гауссовского случайного вектора с помощью &#039;&#039;метода линейных преобразований&#039;&#039;&amp;lt;ref name=&amp;quot;V&amp;quot;&amp;gt;(п. 1.10.4) Михайлов Г.А., Войтишек А.В. Численное статистическое моделирование. Методы Монте-Карло — М.: Академия, 2006. — 368 с.&amp;lt;/ref&amp;gt;. Известно, что случае нормально распределенного случайного вектора, ковариационная матрица вместе с математическим ожиданием этого вектора полностью определяют его распределение. Поэтому для полного статистического соответствия моделируемого и теоретического распределения гауссовского вектора достаточно обеспечить требуемые значения указанных параметров&amp;lt;ref name=&amp;quot;VV&amp;quot;&amp;gt; https://ru.wikipedia.org/wiki/Многомерное_нормальное_распределение&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея алгоритма заключается в линейном преобразовании n-мерного случайного вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, компоненты которого независимы и одинаково распределены по нормальному закону со стандартными параметрами, в случайный вектор &amp;lt;math&amp;gt;X&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;\Sigma&amp;lt;/math&amp;gt; и вектор математических ожиданий &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Sigma = \|\sigma_{ij}\| = \| \mathbb{E}[(X_{i} - m_{x_{i}})(X_{j} - m_{x_{j}})]\|, \\&lt;br /&gt;
M = (m_{x_{1}}, m_{x_{2}}, ..., m_{x_{n}})^T.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Требуется найти такую матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, которая позволяла бы получить искомый вектор &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; с требуемыми характеристиками в результате линейного преобразования &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — n-мерный случайный вектор с независимыми нормально распределенными компонентами со стандартными параметрами.&lt;br /&gt;
&lt;br /&gt;
Будем искать матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в виде нижней треугольной матрицы. Перейдем от матричной записи к системе алгебраических уравнений:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} X_{1} \\&lt;br /&gt;
 X_{2} \\ \vdots \\ X_{n} \end{pmatrix} =&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} b_{11} &amp;amp; 0 &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\b_{21} &amp;amp; b_{22} &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\ \vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \vdots&lt;br /&gt;
\\ b_{n1} &amp;amp; b_{n2} &amp;amp; \cdots &amp;amp; b_{nn}&lt;br /&gt;
\end{pmatrix} \times&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} Y_{1} \\&lt;br /&gt;
 Y_{2} \\ \vdots \\ Y_{n} \end{pmatrix} +&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} m_{x_{1}} \\&lt;br /&gt;
 m_{x_{2}} \\ \vdots \\ m_{x_{n}} \end{pmatrix} \Rightarrow&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}X_{1} - m_{x_{1}} = b_{11}Y_{1}&lt;br /&gt;
\\X_{2} - m_{x_{2}} = b_{21}Y_{1} + b_{22}Y_{2}&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\\X_{n} - m_{x_{n}} = b_{n1}Y_{1} + b_{n2}Y_{2} + \cdots + b_{nn}Y_{n}&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Поскольку компоненты вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; независимы и имеют стандартные параметры, справедливо выражение:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\mathbb{E}[Y_{i}Y_{j}] =&lt;br /&gt;
\left\{\begin{matrix} &lt;br /&gt;
1, &amp;amp;i = j, \\&lt;br /&gt;
0, &amp;amp;i \not= j.&lt;br /&gt;
\end{matrix}\right.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Почленно перемножив сами на себя и между собой соответственно левые и правые части уравнений системы и взяв от результатов перемножения математическое ожидание, получаем систему уравнений вида:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\mathbb{E}[(X_{1} - m_{x_{1}})(X_{1} - m_{x_{1}})] = \mathbb{E}[b_{11}Y_{1}b_{11}Y_{1}],&lt;br /&gt;
\\ \mathbb{E}[(X_{1} - m_{x_{1}})(X_{2} - m_{x_{2}})] = \mathbb{E}[(b_{21}Y_{1} + b_{22}Y_{2})b_{11}Y_{1}],&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, в левых частях полученной системы уравнений располагаются элементы заданной ковариационной матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;, а в правых — элементы искомой матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;. Последовательно решая эту систему, получаем формулы для расчета элементов &amp;lt;math&amp;gt;\sigma_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
b_{11}=\sqrt{\sigma_{11}}; b_{21}=\frac{\sigma_{12}}{\sqrt{\sigma_{11}}}; b_{22} = \sqrt{\sigma_{22} - \frac{\sigma_{12}}{\sigma_{11}}}, \cdots&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рекуррентная формула для расчета любого элемента матрицы преобразования &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b_{ij} = \frac {\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}} {\sqrt{\sigma_{ij} - \sum_{k=1}^{j-1} b_{jk}^2}}, \quad 1 \leqslant j \leqslant i \leqslant n&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(суммы с верхним нулевым пределом считаются равными нулю)&lt;br /&gt;
&lt;br /&gt;
Таким образом, матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; получается с помощью [[Разложение_Холецкого_(метод_квадратного_корня)|разложения Холецкого]] матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Генерация случайного вектора Y ====&lt;br /&gt;
&lt;br /&gt;
Пусть имеется генератор псевдослучайных чисел (ГПСЧ, PRNG), с помощью которого можно получить реализацию случайной величины &amp;lt;math&amp;gt;u \sim U(0,1) &amp;lt;/math&amp;gt;. Описанный выше случайный вектор &amp;lt;math&amp;gt;Y=(y_1, \cdots, y_n)&amp;lt;/math&amp;gt; с независимыми компонентами составим из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; реализаций случайной величины &amp;lt;math&amp;gt;\eta \sim N(0,1)&amp;lt;/math&amp;gt;. Каждую такую реализацию &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;, в свою очередь, получим с помощью приближения по ЦПТ &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; случайными величинами, распределенными равномерно на отрезке [0,1]:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right), \quad i = \overline{1, n} \\&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;u_j^i - &amp;lt;/math&amp;gt; реализации случайной величины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;\kappa - &amp;lt;/math&amp;gt; параметр, обеспечивающий качество приближения.&lt;br /&gt;
&lt;br /&gt;
Как правило, &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; берут равным 12 и считают, что для подавляющего числа практических задач обеспечивается должная точность вычислений&amp;lt;ref name = &amp;quot;VVV&amp;quot;&amp;gt;Балдин К.В., Уткин В.Б. Информационные системы в экономике. — М.:Дашков и Кo, 2008. — 395 с.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}, \quad 1 \leqslant j \leqslant i \leqslant n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;&lt;br /&gt;
* Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1) Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;b_{11}= \sqrt{\sigma_{11}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;b_{k1}= \frac{\sigma_{k1}}{l_{11}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad k = \overline{2,n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{2,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (c) &amp;lt;math&amp;gt;b_{ii} = \sqrt{\sigma_{ii} - \sum_{p = 1}^{i - 1} b_{ip}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (d) &amp;lt;math&amp;gt;b_{ji} = \frac{\sigma_{ji} - \sum_{p = 1}^{i - 1} b_{ip} b_{jp}} {l_{ii}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad i \neq n, j = \overline{i+1,n}&amp;lt;/math&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;u_j^i \leftarrow PRNG,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\quad j = \overline{1,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3) Вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i = m_{x_i} + \sum_{k = 1}^{i} b_{ik} y_{k}, \quad i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + \sum_{j=1}^{n-2}j(n-j-1) + n + \frac {n(n+1)}{2} =&lt;br /&gt;
  n(n+1) + \frac {n(n-1)(n-2)}{6}&amp;lt;/math&amp;gt; (умножений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + \sum_{j=1}^{n-2}j(n-j-1) + n =&lt;br /&gt;
  \frac {n(n+1)}{2} + \frac {n(n-1)(n-2)}{6}&amp;lt;/math&amp;gt; (вычитаний)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad (\kappa-1)n + \frac {n(n+1)}{2} = \frac {n(n-1+2\kappa)}{2}&amp;lt;/math&amp;gt; (сложений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + 2n = \frac {n(n+3)}{2}&amp;lt;/math&amp;gt; (делений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad n + n  = 2n &amp;lt;/math&amp;gt; (взятия квадратного корня)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{n}{6}\left(2n^2+9n+31+6\kappa\right) &amp;lt;/math&amp;gt; - итого операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
==== Заполнение матрицы B====&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из трёх групп вершин, расположенных в целочисленных узлах трёх областей разной размерности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин расположена в одномерной области, соответствующая ей операция вычисляет функцию SQRT. &lt;br /&gt;
Единственная координата каждой из вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргумент этой функции &lt;br /&gt;
	&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039;, а именно  &amp;lt;math&amp;gt;a_{11}&amp;lt;/math&amp;gt;; &lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;l_{ii}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин расположена в двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a / b&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;: &lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элементы &#039;&#039;входных данных&#039;&#039;, а именно &amp;lt;math&amp;gt;a_{j1}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1, j, i - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;l_{ji}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин расположена в трёхмерной области, соответствующая ей операция  &amp;lt;math&amp;gt;a - b * c&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; — меняется в диапазоне  от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;p = 1&amp;lt;/math&amp;gt; элемент входных данных &amp;lt;math&amp;gt;a_{ji}&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;p &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i, j, p - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, i&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, j&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.1, выполненном для случая &amp;lt;math&amp;gt;n = 4&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
[[file:Cholesky full_in_out.png|thumb|center|1400px|Граф 1. SQ - вычисление квадратного корня, F - операция a-bc, Div - деление, In - входные данные, Out - результаты.]]&lt;br /&gt;
&lt;br /&gt;
====Генерация вектора Y====&lt;br /&gt;
&lt;br /&gt;
====Вычисление вектора X====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 3 макроструктуры алгоритма (умножение нижней треугольной матрицы на вектор и сложение результата с другим вектором) состоит из одной группы вершин, расположенной в целочисленных узлах двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a+bc&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;j = 1&amp;lt;/math&amp;gt; — компонента &amp;lt;math&amp;gt;m_{x_i}&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;j &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине с координатами &amp;lt;math&amp;gt;i, j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;b_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039; &amp;lt;math&amp;gt;y_{j}&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является:&lt;br /&gt;
* при &amp;lt;math&amp;gt;j &amp;lt; i&amp;lt;/math&amp;gt; — &#039;&#039;промежуточным данным&#039;&#039; алгоритма;&lt;br /&gt;
* при &amp;lt;math&amp;gt;j = i&amp;lt;/math&amp;gt; — &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рисунке, выполненном для случая &amp;lt;math&amp;gt; n = 4&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf3.png|750px|thumb|center|Рисунок 3. Граф этапа 3 макроструктуры алгоритма]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для распараллеливания доступны следующие опции:&lt;br /&gt;
* вычисление элементов матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в рамках столбца (под диагональю),&lt;br /&gt;
* генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;,&lt;br /&gt;
* вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (умножение матрицы на вектор, сложение векторов).&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: вещественная всюду плотная положительно определенная симметрическая  &amp;lt;math&amp;gt;(n \times n)&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;\Sigma&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;
* Выходные данные: вещественный &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектор &amp;lt;math&amp;gt;X&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;syntaxhighlight lang = c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// compute matrix B (core)&lt;br /&gt;
for (int j = 0; j &amp;lt; n; j++){&lt;br /&gt;
    double sum_down = matrix_cov[j][j];&lt;br /&gt;
    for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
        double cur = matrix_cov[j][k];&lt;br /&gt;
        sum_down -= cur * cur;&lt;br /&gt;
    }&lt;br /&gt;
    matrix_cov[j][j] = sqrt(sum_down);&lt;br /&gt;
    for (int i = j + 1; i &amp;lt; n; i++){&lt;br /&gt;
        double sum_up = matrix_cov[i][j];&lt;br /&gt;
        for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
            sum_up -= matrix_cov[i][k] * matrix_cov[j][k];&lt;br /&gt;
        }&lt;br /&gt;
        matrix_cov[i][j] = sum_up / matrix_cov[j][j];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
// generate vector Y&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){&lt;br /&gt;
    double sum = generate_uniform(n);&lt;br /&gt;
    for (int j = 0; j &amp;lt; CLT_NUM - 1; j++){&lt;br /&gt;
        sum += generate_uniform(n);&lt;br /&gt;
    }&lt;br /&gt;
    vec_Y[i] = (sum - CLT_NUM / 2) * sqrt(12.0 / CLT_NUM);&lt;br /&gt;
}&lt;br /&gt;
// linear transformation&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){  &lt;br /&gt;
    vec_X[i] = vec_exp[i];&lt;br /&gt;
    for (int k = 0; k &amp;lt;= i; k++){&lt;br /&gt;
        vec_X[i] += matrix_cov[i][k] * vec_Y[k];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Алгоритм был реализован на языке C++ с использованием Intel MPI Library и запущен на кластере regular4.&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add impi/5.0.1&lt;br /&gt;
 mpicxx -std=c++0x task.c -o _scratch/task&lt;br /&gt;
 cd _scratch&lt;br /&gt;
 sbatch -n256 impi ./task &amp;lt;matrix_size&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
* размер матрицы [1024 : 4864] с шагом 256,&lt;br /&gt;
* число ядер [2 : 256] с шагом-умножением в 2 раза.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:Ops_2.png|thumb|center|700px|Рисунок 1. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В отличие от разложения Холецкого, которое реализовано (точечный метод) во многих прикладных пакетах (напр., LINPACK, LAPACK, SCALAPACK), моделирование гауссовского случайного вектора не так &amp;quot;популярно&amp;quot;. MS Excel и распространённые статистические пакеты (напр., SPSS, Statistica) позволяют моделировать только одномерные статистические распределения.&lt;br /&gt;
&lt;br /&gt;
Имеется возможность &amp;quot;собрать&amp;quot; многомерное распределение из нескольких одномерных при условии, что компоненты независимы. Однако если необходимо исследовать данные с зависящими друг от друга переменными, то приходится писать собственную программу.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Lonalone</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26734</id>
		<title>Участник:Lonalone/Генерация гауссовского вектора методом линейных преобразований</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26734"/>
		<updated>2018-12-01T00:28:28Z</updated>

		<summary type="html">&lt;p&gt;Lonalone: /* Вычисление вектора X */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор описания: &#039;&#039;Меньших И. М.&#039;&#039;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из многомерных распределений особый интерес представляет нормальное. Этому закону подчиняются все результаты воздействия большого числа случайных факторов, среди которых нет превалирующих.&lt;br /&gt;
&lt;br /&gt;
В статье приведен алгоритм генерации n-мерного гауссовского случайного вектора с помощью &#039;&#039;метода линейных преобразований&#039;&#039;&amp;lt;ref name=&amp;quot;V&amp;quot;&amp;gt;(п. 1.10.4) Михайлов Г.А., Войтишек А.В. Численное статистическое моделирование. Методы Монте-Карло — М.: Академия, 2006. — 368 с.&amp;lt;/ref&amp;gt;. Известно, что случае нормально распределенного случайного вектора, ковариационная матрица вместе с математическим ожиданием этого вектора полностью определяют его распределение. Поэтому для полного статистического соответствия моделируемого и теоретического распределения гауссовского вектора достаточно обеспечить требуемые значения указанных параметров&amp;lt;ref name=&amp;quot;VV&amp;quot;&amp;gt; https://ru.wikipedia.org/wiki/Многомерное_нормальное_распределение&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея алгоритма заключается в линейном преобразовании n-мерного случайного вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, компоненты которого независимы и одинаково распределены по нормальному закону со стандартными параметрами, в случайный вектор &amp;lt;math&amp;gt;X&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;\Sigma&amp;lt;/math&amp;gt; и вектор математических ожиданий &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Sigma = \|\sigma_{ij}\| = \| \mathbb{E}[(X_{i} - m_{x_{i}})(X_{j} - m_{x_{j}})]\|, \\&lt;br /&gt;
M = (m_{x_{1}}, m_{x_{2}}, ..., m_{x_{n}})^T.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Требуется найти такую матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, которая позволяла бы получить искомый вектор &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; с требуемыми характеристиками в результате линейного преобразования &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — n-мерный случайный вектор с независимыми нормально распределенными компонентами со стандартными параметрами.&lt;br /&gt;
&lt;br /&gt;
Будем искать матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в виде нижней треугольной матрицы. Перейдем от матричной записи к системе алгебраических уравнений:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} X_{1} \\&lt;br /&gt;
 X_{2} \\ \vdots \\ X_{n} \end{pmatrix} =&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} b_{11} &amp;amp; 0 &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\b_{21} &amp;amp; b_{22} &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\ \vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \vdots&lt;br /&gt;
\\ b_{n1} &amp;amp; b_{n2} &amp;amp; \cdots &amp;amp; b_{nn}&lt;br /&gt;
\end{pmatrix} \times&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} Y_{1} \\&lt;br /&gt;
 Y_{2} \\ \vdots \\ Y_{n} \end{pmatrix} +&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} m_{x_{1}} \\&lt;br /&gt;
 m_{x_{2}} \\ \vdots \\ m_{x_{n}} \end{pmatrix} \Rightarrow&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}X_{1} - m_{x_{1}} = b_{11}Y_{1}&lt;br /&gt;
\\X_{2} - m_{x_{2}} = b_{21}Y_{1} + b_{22}Y_{2}&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\\X_{n} - m_{x_{n}} = b_{n1}Y_{1} + b_{n2}Y_{2} + \cdots + b_{nn}Y_{n}&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Поскольку компоненты вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; независимы и имеют стандартные параметры, справедливо выражение:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\mathbb{E}[Y_{i}Y_{j}] =&lt;br /&gt;
\left\{\begin{matrix} &lt;br /&gt;
1, &amp;amp;i = j, \\&lt;br /&gt;
0, &amp;amp;i \not= j.&lt;br /&gt;
\end{matrix}\right.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Почленно перемножив сами на себя и между собой соответственно левые и правые части уравнений системы и взяв от результатов перемножения математическое ожидание, получаем систему уравнений вида:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\mathbb{E}[(X_{1} - m_{x_{1}})(X_{1} - m_{x_{1}})] = \mathbb{E}[b_{11}Y_{1}b_{11}Y_{1}],&lt;br /&gt;
\\ \mathbb{E}[(X_{1} - m_{x_{1}})(X_{2} - m_{x_{2}})] = \mathbb{E}[(b_{21}Y_{1} + b_{22}Y_{2})b_{11}Y_{1}],&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, в левых частях полученной системы уравнений располагаются элементы заданной ковариационной матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;, а в правых — элементы искомой матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;. Последовательно решая эту систему, получаем формулы для расчета элементов &amp;lt;math&amp;gt;\sigma_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
b_{11}=\sqrt{\sigma_{11}}; b_{21}=\frac{\sigma_{12}}{\sqrt{\sigma_{11}}}; b_{22} = \sqrt{\sigma_{22} - \frac{\sigma_{12}}{\sigma_{11}}}, \cdots&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рекуррентная формула для расчета любого элемента матрицы преобразования &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b_{ij} = \frac {\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}} {\sqrt{\sigma_{ij} - \sum_{k=1}^{j-1} b_{jk}^2}}, \quad 1 \leqslant j \leqslant i \leqslant n&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(суммы с верхним нулевым пределом считаются равными нулю)&lt;br /&gt;
&lt;br /&gt;
Таким образом, матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; получается с помощью [[Разложение_Холецкого_(метод_квадратного_корня)|разложения Холецкого]] матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Генерация случайного вектора Y ====&lt;br /&gt;
&lt;br /&gt;
Пусть имеется генератор псевдослучайных чисел (ГПСЧ, PRNG), с помощью которого можно получить реализацию случайной величины &amp;lt;math&amp;gt;u \sim U(0,1) &amp;lt;/math&amp;gt;. Описанный выше случайный вектор &amp;lt;math&amp;gt;Y=(y_1, \cdots, y_n)&amp;lt;/math&amp;gt; с независимыми компонентами составим из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; реализаций случайной величины &amp;lt;math&amp;gt;\eta \sim N(0,1)&amp;lt;/math&amp;gt;. Каждую такую реализацию &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;, в свою очередь, получим с помощью приближения по ЦПТ &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; случайными величинами, распределенными равномерно на отрезке [0,1]:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right), \quad i = \overline{1, n} \\&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;u_j^i - &amp;lt;/math&amp;gt; реализации случайной величины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;\kappa - &amp;lt;/math&amp;gt; параметр, обеспечивающий качество приближения.&lt;br /&gt;
&lt;br /&gt;
Как правило, &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; берут равным 12 и считают, что для подавляющего числа практических задач обеспечивается должная точность вычислений&amp;lt;ref name = &amp;quot;VVV&amp;quot;&amp;gt;Балдин К.В., Уткин В.Б. Информационные системы в экономике. — М.:Дашков и Кo, 2008. — 395 с.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}, \quad 1 \leqslant j \leqslant i \leqslant n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;&lt;br /&gt;
* Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1) Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;b_{11}= \sqrt{\sigma_{11}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;b_{k1}= \frac{\sigma_{k1}}{l_{11}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad k = \overline{2,n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{2,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (c) &amp;lt;math&amp;gt;b_{ii} = \sqrt{\sigma_{ii} - \sum_{p = 1}^{i - 1} b_{ip}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (d) &amp;lt;math&amp;gt;b_{ji} = \frac{\sigma_{ji} - \sum_{p = 1}^{i - 1} b_{ip} b_{jp}} {l_{ii}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad i \neq n, j = \overline{i+1,n}&amp;lt;/math&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;u_j^i \leftarrow PRNG,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\quad j = \overline{1,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3) Вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i = m_{x_i} + \sum_{k = 1}^{i} b_{ik} y_{k}, \quad i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + \sum_{j=1}^{n-2}j(n-j-1) + n + \frac {n(n+1)}{2} =&lt;br /&gt;
  n(n+1) + \frac {n(n-1)(n-2)}{6}&amp;lt;/math&amp;gt; (умножений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + \sum_{j=1}^{n-2}j(n-j-1) + n =&lt;br /&gt;
  \frac {n(n+1)}{2} + \frac {n(n-1)(n-2)}{6}&amp;lt;/math&amp;gt; (вычитаний)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad (\kappa-1)n + \frac {n(n+1)}{2} = \frac {n(n-1+2\kappa)}{2}&amp;lt;/math&amp;gt; (сложений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + 2n = \frac {n(n+3)}{2}&amp;lt;/math&amp;gt; (делений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad n + n  = 2n &amp;lt;/math&amp;gt; (взятия квадратного корня)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{n}{6}\left(2n^2+9n+31+6\kappa\right) &amp;lt;/math&amp;gt; - итого операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
==== Заполнение матрицы B====&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из трёх групп вершин, расположенных в целочисленных узлах трёх областей разной размерности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин расположена в одномерной области, соответствующая ей операция вычисляет функцию SQRT. &lt;br /&gt;
Единственная координата каждой из вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргумент этой функции &lt;br /&gt;
	&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039;, а именно  &amp;lt;math&amp;gt;a_{11}&amp;lt;/math&amp;gt;; &lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;l_{ii}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин расположена в двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a / b&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;: &lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элементы &#039;&#039;входных данных&#039;&#039;, а именно &amp;lt;math&amp;gt;a_{j1}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1, j, i - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;l_{ji}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин расположена в трёхмерной области, соответствующая ей операция  &amp;lt;math&amp;gt;a - b * c&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; — меняется в диапазоне  от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;p = 1&amp;lt;/math&amp;gt; элемент входных данных &amp;lt;math&amp;gt;a_{ji}&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;p &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i, j, p - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, i&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, j&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.1, выполненном для случая &amp;lt;math&amp;gt;n = 4&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
[[file:Cholesky full_in_out.png|thumb|center|1400px|Граф 1. SQ - вычисление квадратного корня, F - операция a-bc, Div - деление, In - входные данные, Out - результаты.]]&lt;br /&gt;
&lt;br /&gt;
====Генерация вектора Y====&lt;br /&gt;
&lt;br /&gt;
====Вычисление вектора X====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 3 макроструктуры алгоритма (умножение нижней треугольной матрицы на вектор и сложение результата с другим вектором) состоит из одной группы вершин, расположенной в целочисленных узлах двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a+bc&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;j = 1&amp;lt;/math&amp;gt; — компонента &amp;lt;math&amp;gt;m_{x_i}&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;j &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине с координатами &amp;lt;math&amp;gt;i, j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039;, а именно  &amp;lt;math&amp;gt;b_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — элемент входных данных &amp;lt;math&amp;gt;y_{j}&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является:&lt;br /&gt;
* при &amp;lt;math&amp;gt;j &amp;lt; i&amp;lt;/math&amp;gt; — &#039;&#039;промежуточным данным&#039;&#039; алгоритма;&lt;br /&gt;
* при &amp;lt;math&amp;gt;j = i&amp;lt;/math&amp;gt; — &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рисунке, выполненном для случая &amp;lt;math&amp;gt; n = 4&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf3.png|750px|thumb|center|Рисунок 3. Граф этапа 3 макроструктуры алгоритма]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для распараллеливания доступны следующие опции:&lt;br /&gt;
* вычисление элементов матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в рамках столбца (под диагональю),&lt;br /&gt;
* генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;,&lt;br /&gt;
* вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (умножение матрицы на вектор, сложение векторов).&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: вещественная всюду плотная положительно определенная симметрическая  &amp;lt;math&amp;gt;(n \times n)&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;\Sigma&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;
* Выходные данные: вещественный &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектор &amp;lt;math&amp;gt;X&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;syntaxhighlight lang = c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// compute matrix B (core)&lt;br /&gt;
for (int j = 0; j &amp;lt; n; j++){&lt;br /&gt;
    double sum_down = matrix_cov[j][j];&lt;br /&gt;
    for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
        double cur = matrix_cov[j][k];&lt;br /&gt;
        sum_down -= cur * cur;&lt;br /&gt;
    }&lt;br /&gt;
    matrix_cov[j][j] = sqrt(sum_down);&lt;br /&gt;
    for (int i = j + 1; i &amp;lt; n; i++){&lt;br /&gt;
        double sum_up = matrix_cov[i][j];&lt;br /&gt;
        for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
            sum_up -= matrix_cov[i][k] * matrix_cov[j][k];&lt;br /&gt;
        }&lt;br /&gt;
        matrix_cov[i][j] = sum_up / matrix_cov[j][j];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
// generate vector Y&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){&lt;br /&gt;
    double sum = generate_uniform(n);&lt;br /&gt;
    for (int j = 0; j &amp;lt; CLT_NUM - 1; j++){&lt;br /&gt;
        sum += generate_uniform(n);&lt;br /&gt;
    }&lt;br /&gt;
    vec_Y[i] = (sum - CLT_NUM / 2) * sqrt(12.0 / CLT_NUM);&lt;br /&gt;
}&lt;br /&gt;
// linear transformation&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){  &lt;br /&gt;
    vec_X[i] = vec_exp[i];&lt;br /&gt;
    for (int k = 0; k &amp;lt;= i; k++){&lt;br /&gt;
        vec_X[i] += matrix_cov[i][k] * vec_Y[k];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Алгоритм был реализован на языке C++ с использованием Intel MPI Library и запущен на кластере regular4.&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add impi/5.0.1&lt;br /&gt;
 mpicxx -std=c++0x task.c -o _scratch/task&lt;br /&gt;
 cd _scratch&lt;br /&gt;
 sbatch -n256 impi ./task &amp;lt;matrix_size&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
* размер матрицы [1024 : 4864] с шагом 256,&lt;br /&gt;
* число ядер [2 : 256] с шагом-умножением в 2 раза.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:Ops_2.png|thumb|center|700px|Рисунок 1. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В отличие от разложения Холецкого, которое реализовано (точечный метод) во многих прикладных пакетах (напр., LINPACK, LAPACK, SCALAPACK), моделирование гауссовского случайного вектора не так &amp;quot;популярно&amp;quot;. MS Excel и распространённые статистические пакеты (напр., SPSS, Statistica) позволяют моделировать только одномерные статистические распределения.&lt;br /&gt;
&lt;br /&gt;
Имеется возможность &amp;quot;собрать&amp;quot; многомерное распределение из нескольких одномерных при условии, что компоненты независимы. Однако если необходимо исследовать данные с зависящими друг от друга переменными, то приходится писать собственную программу.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Lonalone</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26733</id>
		<title>Участник:Lonalone/Генерация гауссовского вектора методом линейных преобразований</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26733"/>
		<updated>2018-12-01T00:16:26Z</updated>

		<summary type="html">&lt;p&gt;Lonalone: /* Вычисление вектора X */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор описания: &#039;&#039;Меньших И. М.&#039;&#039;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из многомерных распределений особый интерес представляет нормальное. Этому закону подчиняются все результаты воздействия большого числа случайных факторов, среди которых нет превалирующих.&lt;br /&gt;
&lt;br /&gt;
В статье приведен алгоритм генерации n-мерного гауссовского случайного вектора с помощью &#039;&#039;метода линейных преобразований&#039;&#039;&amp;lt;ref name=&amp;quot;V&amp;quot;&amp;gt;(п. 1.10.4) Михайлов Г.А., Войтишек А.В. Численное статистическое моделирование. Методы Монте-Карло — М.: Академия, 2006. — 368 с.&amp;lt;/ref&amp;gt;. Известно, что случае нормально распределенного случайного вектора, ковариационная матрица вместе с математическим ожиданием этого вектора полностью определяют его распределение. Поэтому для полного статистического соответствия моделируемого и теоретического распределения гауссовского вектора достаточно обеспечить требуемые значения указанных параметров&amp;lt;ref name=&amp;quot;VV&amp;quot;&amp;gt; https://ru.wikipedia.org/wiki/Многомерное_нормальное_распределение&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея алгоритма заключается в линейном преобразовании n-мерного случайного вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, компоненты которого независимы и одинаково распределены по нормальному закону со стандартными параметрами, в случайный вектор &amp;lt;math&amp;gt;X&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;\Sigma&amp;lt;/math&amp;gt; и вектор математических ожиданий &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Sigma = \|\sigma_{ij}\| = \| \mathbb{E}[(X_{i} - m_{x_{i}})(X_{j} - m_{x_{j}})]\|, \\&lt;br /&gt;
M = (m_{x_{1}}, m_{x_{2}}, ..., m_{x_{n}})^T.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Требуется найти такую матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, которая позволяла бы получить искомый вектор &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; с требуемыми характеристиками в результате линейного преобразования &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — n-мерный случайный вектор с независимыми нормально распределенными компонентами со стандартными параметрами.&lt;br /&gt;
&lt;br /&gt;
Будем искать матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в виде нижней треугольной матрицы. Перейдем от матричной записи к системе алгебраических уравнений:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} X_{1} \\&lt;br /&gt;
 X_{2} \\ \vdots \\ X_{n} \end{pmatrix} =&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} b_{11} &amp;amp; 0 &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\b_{21} &amp;amp; b_{22} &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\ \vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \vdots&lt;br /&gt;
\\ b_{n1} &amp;amp; b_{n2} &amp;amp; \cdots &amp;amp; b_{nn}&lt;br /&gt;
\end{pmatrix} \times&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} Y_{1} \\&lt;br /&gt;
 Y_{2} \\ \vdots \\ Y_{n} \end{pmatrix} +&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} m_{x_{1}} \\&lt;br /&gt;
 m_{x_{2}} \\ \vdots \\ m_{x_{n}} \end{pmatrix} \Rightarrow&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}X_{1} - m_{x_{1}} = b_{11}Y_{1}&lt;br /&gt;
\\X_{2} - m_{x_{2}} = b_{21}Y_{1} + b_{22}Y_{2}&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\\X_{n} - m_{x_{n}} = b_{n1}Y_{1} + b_{n2}Y_{2} + \cdots + b_{nn}Y_{n}&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Поскольку компоненты вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; независимы и имеют стандартные параметры, справедливо выражение:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\mathbb{E}[Y_{i}Y_{j}] =&lt;br /&gt;
\left\{\begin{matrix} &lt;br /&gt;
1, &amp;amp;i = j, \\&lt;br /&gt;
0, &amp;amp;i \not= j.&lt;br /&gt;
\end{matrix}\right.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Почленно перемножив сами на себя и между собой соответственно левые и правые части уравнений системы и взяв от результатов перемножения математическое ожидание, получаем систему уравнений вида:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\mathbb{E}[(X_{1} - m_{x_{1}})(X_{1} - m_{x_{1}})] = \mathbb{E}[b_{11}Y_{1}b_{11}Y_{1}],&lt;br /&gt;
\\ \mathbb{E}[(X_{1} - m_{x_{1}})(X_{2} - m_{x_{2}})] = \mathbb{E}[(b_{21}Y_{1} + b_{22}Y_{2})b_{11}Y_{1}],&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, в левых частях полученной системы уравнений располагаются элементы заданной ковариационной матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;, а в правых — элементы искомой матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;. Последовательно решая эту систему, получаем формулы для расчета элементов &amp;lt;math&amp;gt;\sigma_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
b_{11}=\sqrt{\sigma_{11}}; b_{21}=\frac{\sigma_{12}}{\sqrt{\sigma_{11}}}; b_{22} = \sqrt{\sigma_{22} - \frac{\sigma_{12}}{\sigma_{11}}}, \cdots&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рекуррентная формула для расчета любого элемента матрицы преобразования &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b_{ij} = \frac {\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}} {\sqrt{\sigma_{ij} - \sum_{k=1}^{j-1} b_{jk}^2}}, \quad 1 \leqslant j \leqslant i \leqslant n&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(суммы с верхним нулевым пределом считаются равными нулю)&lt;br /&gt;
&lt;br /&gt;
Таким образом, матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; получается с помощью [[Разложение_Холецкого_(метод_квадратного_корня)|разложения Холецкого]] матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Генерация случайного вектора Y ====&lt;br /&gt;
&lt;br /&gt;
Пусть имеется генератор псевдослучайных чисел (ГПСЧ, PRNG), с помощью которого можно получить реализацию случайной величины &amp;lt;math&amp;gt;u \sim U(0,1) &amp;lt;/math&amp;gt;. Описанный выше случайный вектор &amp;lt;math&amp;gt;Y=(y_1, \cdots, y_n)&amp;lt;/math&amp;gt; с независимыми компонентами составим из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; реализаций случайной величины &amp;lt;math&amp;gt;\eta \sim N(0,1)&amp;lt;/math&amp;gt;. Каждую такую реализацию &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;, в свою очередь, получим с помощью приближения по ЦПТ &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; случайными величинами, распределенными равномерно на отрезке [0,1]:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right), \quad i = \overline{1, n} \\&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;u_j^i - &amp;lt;/math&amp;gt; реализации случайной величины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;\kappa - &amp;lt;/math&amp;gt; параметр, обеспечивающий качество приближения.&lt;br /&gt;
&lt;br /&gt;
Как правило, &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; берут равным 12 и считают, что для подавляющего числа практических задач обеспечивается должная точность вычислений&amp;lt;ref name = &amp;quot;VVV&amp;quot;&amp;gt;Балдин К.В., Уткин В.Б. Информационные системы в экономике. — М.:Дашков и Кo, 2008. — 395 с.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}, \quad 1 \leqslant j \leqslant i \leqslant n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;&lt;br /&gt;
* Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1) Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;b_{11}= \sqrt{\sigma_{11}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;b_{k1}= \frac{\sigma_{k1}}{l_{11}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad k = \overline{2,n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{2,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (c) &amp;lt;math&amp;gt;b_{ii} = \sqrt{\sigma_{ii} - \sum_{p = 1}^{i - 1} b_{ip}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (d) &amp;lt;math&amp;gt;b_{ji} = \frac{\sigma_{ji} - \sum_{p = 1}^{i - 1} b_{ip} b_{jp}} {l_{ii}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad i \neq n, j = \overline{i+1,n}&amp;lt;/math&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;u_j^i \leftarrow PRNG,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\quad j = \overline{1,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3) Вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i = m_{x_i} + \sum_{k = 1}^{i} b_{ik} y_{k}, \quad i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + \sum_{j=1}^{n-2}j(n-j-1) + n + \frac {n(n+1)}{2} =&lt;br /&gt;
  n(n+1) + \frac {n(n-1)(n-2)}{6}&amp;lt;/math&amp;gt; (умножений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + \sum_{j=1}^{n-2}j(n-j-1) + n =&lt;br /&gt;
  \frac {n(n+1)}{2} + \frac {n(n-1)(n-2)}{6}&amp;lt;/math&amp;gt; (вычитаний)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad (\kappa-1)n + \frac {n(n+1)}{2} = \frac {n(n-1+2\kappa)}{2}&amp;lt;/math&amp;gt; (сложений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + 2n = \frac {n(n+3)}{2}&amp;lt;/math&amp;gt; (делений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad n + n  = 2n &amp;lt;/math&amp;gt; (взятия квадратного корня)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{n}{6}\left(2n^2+9n+31+6\kappa\right) &amp;lt;/math&amp;gt; - итого операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
==== Заполнение матрицы B====&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из трёх групп вершин, расположенных в целочисленных узлах трёх областей разной размерности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин расположена в одномерной области, соответствующая ей операция вычисляет функцию SQRT. &lt;br /&gt;
Единственная координата каждой из вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргумент этой функции &lt;br /&gt;
	&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039;, а именно  &amp;lt;math&amp;gt;a_{11}&amp;lt;/math&amp;gt;; &lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;l_{ii}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин расположена в двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a / b&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;: &lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элементы &#039;&#039;входных данных&#039;&#039;, а именно &amp;lt;math&amp;gt;a_{j1}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1, j, i - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;l_{ji}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин расположена в трёхмерной области, соответствующая ей операция  &amp;lt;math&amp;gt;a - b * c&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; — меняется в диапазоне  от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;p = 1&amp;lt;/math&amp;gt; элемент входных данных &amp;lt;math&amp;gt;a_{ji}&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;p &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i, j, p - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, i&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, j&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.1, выполненном для случая &amp;lt;math&amp;gt;n = 4&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
[[file:Cholesky full_in_out.png|thumb|center|1400px|Граф 1. SQ - вычисление квадратного корня, F - операция a-bc, Div - деление, In - входные данные, Out - результаты.]]&lt;br /&gt;
&lt;br /&gt;
====Генерация вектора Y====&lt;br /&gt;
&lt;br /&gt;
====Вычисление вектора X====&lt;br /&gt;
&lt;br /&gt;
Граф этапа 3 макроструктуры алгоритма (умножение нижней треугольной матрицы на вектор и сложение результата с другим вектором) состоит из одной группы вершин, расположенной в целочисленных узлах двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a+bc&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;j = 1&amp;lt;/math&amp;gt; — компонента &amp;lt;math&amp;gt;m_{x_i}&amp;lt;/math&amp;gt; вектора &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;j &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине с координатами &amp;lt;math&amp;gt;i, j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039;, а именно  &amp;lt;math&amp;gt;b_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — элемент входных данных &amp;lt;math&amp;gt;y_{j}&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является:&lt;br /&gt;
* при &amp;lt;math&amp;gt;j &amp;lt; i&amp;lt;/math&amp;gt; — &#039;&#039;промежуточным данным&#039;&#039; алгоритма;&lt;br /&gt;
* при &amp;lt;math&amp;gt;j = i&amp;lt;/math&amp;gt; — &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рисунке, выполненном для случая &amp;lt;math&amp;gt; n = 4&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:LonGraf3.png|500px|thumb|center|Рисунок 3. Граф этапа 3 макроструктуры алгоритма]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для распараллеливания доступны следующие опции:&lt;br /&gt;
* вычисление элементов матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в рамках столбца (под диагональю),&lt;br /&gt;
* генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;,&lt;br /&gt;
* вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (умножение матрицы на вектор, сложение векторов).&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: вещественная всюду плотная положительно определенная симметрическая  &amp;lt;math&amp;gt;(n \times n)&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;\Sigma&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;
* Выходные данные: вещественный &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектор &amp;lt;math&amp;gt;X&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;syntaxhighlight lang = c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// compute matrix B (core)&lt;br /&gt;
for (int j = 0; j &amp;lt; n; j++){&lt;br /&gt;
    double sum_down = matrix_cov[j][j];&lt;br /&gt;
    for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
        double cur = matrix_cov[j][k];&lt;br /&gt;
        sum_down -= cur * cur;&lt;br /&gt;
    }&lt;br /&gt;
    matrix_cov[j][j] = sqrt(sum_down);&lt;br /&gt;
    for (int i = j + 1; i &amp;lt; n; i++){&lt;br /&gt;
        double sum_up = matrix_cov[i][j];&lt;br /&gt;
        for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
            sum_up -= matrix_cov[i][k] * matrix_cov[j][k];&lt;br /&gt;
        }&lt;br /&gt;
        matrix_cov[i][j] = sum_up / matrix_cov[j][j];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
// generate vector Y&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){&lt;br /&gt;
    double sum = generate_uniform(n);&lt;br /&gt;
    for (int j = 0; j &amp;lt; CLT_NUM - 1; j++){&lt;br /&gt;
        sum += generate_uniform(n);&lt;br /&gt;
    }&lt;br /&gt;
    vec_Y[i] = (sum - CLT_NUM / 2) * sqrt(12.0 / CLT_NUM);&lt;br /&gt;
}&lt;br /&gt;
// linear transformation&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){  &lt;br /&gt;
    vec_X[i] = vec_exp[i];&lt;br /&gt;
    for (int k = 0; k &amp;lt;= i; k++){&lt;br /&gt;
        vec_X[i] += matrix_cov[i][k] * vec_Y[k];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Алгоритм был реализован на языке C++ с использованием Intel MPI Library и запущен на кластере regular4.&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add impi/5.0.1&lt;br /&gt;
 mpicxx -std=c++0x task.c -o _scratch/task&lt;br /&gt;
 cd _scratch&lt;br /&gt;
 sbatch -n256 impi ./task &amp;lt;matrix_size&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
* размер матрицы [1024 : 4864] с шагом 256,&lt;br /&gt;
* число ядер [2 : 256] с шагом-умножением в 2 раза.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:Ops_2.png|thumb|center|700px|Рисунок 1. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В отличие от разложения Холецкого, которое реализовано (точечный метод) во многих прикладных пакетах (напр., LINPACK, LAPACK, SCALAPACK), моделирование гауссовского случайного вектора не так &amp;quot;популярно&amp;quot;. MS Excel и распространённые статистические пакеты (напр., SPSS, Statistica) позволяют моделировать только одномерные статистические распределения.&lt;br /&gt;
&lt;br /&gt;
Имеется возможность &amp;quot;собрать&amp;quot; многомерное распределение из нескольких одномерных при условии, что компоненты независимы. Однако если необходимо исследовать данные с зависящими друг от друга переменными, то приходится писать собственную программу.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Lonalone</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26732</id>
		<title>Участник:Lonalone/Генерация гауссовского вектора методом линейных преобразований</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26732"/>
		<updated>2018-11-30T16:49:45Z</updated>

		<summary type="html">&lt;p&gt;Lonalone: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор описания: &#039;&#039;Меньших И. М.&#039;&#039;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из многомерных распределений особый интерес представляет нормальное. Этому закону подчиняются все результаты воздействия большого числа случайных факторов, среди которых нет превалирующих.&lt;br /&gt;
&lt;br /&gt;
В статье приведен алгоритм генерации n-мерного гауссовского случайного вектора с помощью &#039;&#039;метода линейных преобразований&#039;&#039;&amp;lt;ref name=&amp;quot;V&amp;quot;&amp;gt;(п. 1.10.4) Михайлов Г.А., Войтишек А.В. Численное статистическое моделирование. Методы Монте-Карло — М.: Академия, 2006. — 368 с.&amp;lt;/ref&amp;gt;. Известно, что случае нормально распределенного случайного вектора, ковариационная матрица вместе с математическим ожиданием этого вектора полностью определяют его распределение. Поэтому для полного статистического соответствия моделируемого и теоретического распределения гауссовского вектора достаточно обеспечить требуемые значения указанных параметров&amp;lt;ref name=&amp;quot;VV&amp;quot;&amp;gt; https://ru.wikipedia.org/wiki/Многомерное_нормальное_распределение&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея алгоритма заключается в линейном преобразовании n-мерного случайного вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, компоненты которого независимы и одинаково распределены по нормальному закону со стандартными параметрами, в случайный вектор &amp;lt;math&amp;gt;X&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;\Sigma&amp;lt;/math&amp;gt; и вектор математических ожиданий &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Sigma = \|\sigma_{ij}\| = \| \mathbb{E}[(X_{i} - m_{x_{i}})(X_{j} - m_{x_{j}})]\|, \\&lt;br /&gt;
M = (m_{x_{1}}, m_{x_{2}}, ..., m_{x_{n}})^T.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Требуется найти такую матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, которая позволяла бы получить искомый вектор &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; с требуемыми характеристиками в результате линейного преобразования &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — n-мерный случайный вектор с независимыми нормально распределенными компонентами со стандартными параметрами.&lt;br /&gt;
&lt;br /&gt;
Будем искать матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в виде нижней треугольной матрицы. Перейдем от матричной записи к системе алгебраических уравнений:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} X_{1} \\&lt;br /&gt;
 X_{2} \\ \vdots \\ X_{n} \end{pmatrix} =&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} b_{11} &amp;amp; 0 &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\b_{21} &amp;amp; b_{22} &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\ \vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \vdots&lt;br /&gt;
\\ b_{n1} &amp;amp; b_{n2} &amp;amp; \cdots &amp;amp; b_{nn}&lt;br /&gt;
\end{pmatrix} \times&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} Y_{1} \\&lt;br /&gt;
 Y_{2} \\ \vdots \\ Y_{n} \end{pmatrix} +&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} m_{x_{1}} \\&lt;br /&gt;
 m_{x_{2}} \\ \vdots \\ m_{x_{n}} \end{pmatrix} \Rightarrow&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}X_{1} - m_{x_{1}} = b_{11}Y_{1}&lt;br /&gt;
\\X_{2} - m_{x_{2}} = b_{21}Y_{1} + b_{22}Y_{2}&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\\X_{n} - m_{x_{n}} = b_{n1}Y_{1} + b_{n2}Y_{2} + \cdots + b_{nn}Y_{n}&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Поскольку компоненты вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; независимы и имеют стандартные параметры, справедливо выражение:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\mathbb{E}[Y_{i}Y_{j}] =&lt;br /&gt;
\left\{\begin{matrix} &lt;br /&gt;
1, &amp;amp;i = j, \\&lt;br /&gt;
0, &amp;amp;i \not= j.&lt;br /&gt;
\end{matrix}\right.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Почленно перемножив сами на себя и между собой соответственно левые и правые части уравнений системы и взяв от результатов перемножения математическое ожидание, получаем систему уравнений вида:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\mathbb{E}[(X_{1} - m_{x_{1}})(X_{1} - m_{x_{1}})] = \mathbb{E}[b_{11}Y_{1}b_{11}Y_{1}],&lt;br /&gt;
\\ \mathbb{E}[(X_{1} - m_{x_{1}})(X_{2} - m_{x_{2}})] = \mathbb{E}[(b_{21}Y_{1} + b_{22}Y_{2})b_{11}Y_{1}],&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, в левых частях полученной системы уравнений располагаются элементы заданной ковариационной матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;, а в правых — элементы искомой матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;. Последовательно решая эту систему, получаем формулы для расчета элементов &amp;lt;math&amp;gt;\sigma_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
b_{11}=\sqrt{\sigma_{11}}; b_{21}=\frac{\sigma_{12}}{\sqrt{\sigma_{11}}}; b_{22} = \sqrt{\sigma_{22} - \frac{\sigma_{12}}{\sigma_{11}}}, \cdots&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рекуррентная формула для расчета любого элемента матрицы преобразования &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b_{ij} = \frac {\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}} {\sqrt{\sigma_{ij} - \sum_{k=1}^{j-1} b_{jk}^2}}, \quad 1 \leqslant j \leqslant i \leqslant n&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(суммы с верхним нулевым пределом считаются равными нулю)&lt;br /&gt;
&lt;br /&gt;
Таким образом, матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; получается с помощью [[Разложение_Холецкого_(метод_квадратного_корня)|разложения Холецкого]] матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Генерация случайного вектора Y ====&lt;br /&gt;
&lt;br /&gt;
Пусть имеется генератор псевдослучайных чисел (ГПСЧ, PRNG), с помощью которого можно получить реализацию случайной величины &amp;lt;math&amp;gt;u \sim U(0,1) &amp;lt;/math&amp;gt;. Описанный выше случайный вектор &amp;lt;math&amp;gt;Y=(y_1, \cdots, y_n)&amp;lt;/math&amp;gt; с независимыми компонентами составим из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; реализаций случайной величины &amp;lt;math&amp;gt;\eta \sim N(0,1)&amp;lt;/math&amp;gt;. Каждую такую реализацию &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;, в свою очередь, получим с помощью приближения по ЦПТ &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; случайными величинами, распределенными равномерно на отрезке [0,1]:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right), \quad i = \overline{1, n} \\&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;u_j^i - &amp;lt;/math&amp;gt; реализации случайной величины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;\kappa - &amp;lt;/math&amp;gt; параметр, обеспечивающий качество приближения.&lt;br /&gt;
&lt;br /&gt;
Как правило, &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; берут равным 12 и считают, что для подавляющего числа практических задач обеспечивается должная точность вычислений&amp;lt;ref name = &amp;quot;VVV&amp;quot;&amp;gt;Балдин К.В., Уткин В.Б. Информационные системы в экономике. — М.:Дашков и Кo, 2008. — 395 с.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}, \quad 1 \leqslant j \leqslant i \leqslant n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;&lt;br /&gt;
* Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1) Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;b_{11}= \sqrt{\sigma_{11}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;b_{k1}= \frac{\sigma_{k1}}{l_{11}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad k = \overline{2,n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{2,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (c) &amp;lt;math&amp;gt;b_{ii} = \sqrt{\sigma_{ii} - \sum_{p = 1}^{i - 1} b_{ip}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (d) &amp;lt;math&amp;gt;b_{ji} = \frac{\sigma_{ji} - \sum_{p = 1}^{i - 1} b_{ip} b_{jp}} {l_{ii}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad i \neq n, j = \overline{i+1,n}&amp;lt;/math&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;u_j^i \leftarrow PRNG,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\quad j = \overline{1,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3) Вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i = m_{x_i} + \sum_{k = 1}^{i} b_{ik} y_{k}, \quad i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + \sum_{j=1}^{n-2}j(n-j-1) + n + \frac {n(n+1)}{2} =&lt;br /&gt;
  n(n+1) + \frac {n(n-1)(n-2)}{6}&amp;lt;/math&amp;gt; (умножений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + \sum_{j=1}^{n-2}j(n-j-1) + n =&lt;br /&gt;
  \frac {n(n+1)}{2} + \frac {n(n-1)(n-2)}{6}&amp;lt;/math&amp;gt; (вычитаний)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad (\kappa-1)n + \frac {n(n+1)}{2} = \frac {n(n-1+2\kappa)}{2}&amp;lt;/math&amp;gt; (сложений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + 2n = \frac {n(n+3)}{2}&amp;lt;/math&amp;gt; (делений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad n + n  = 2n &amp;lt;/math&amp;gt; (взятия квадратного корня)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{n}{6}\left(2n^2+9n+31+6\kappa\right) &amp;lt;/math&amp;gt; - итого операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
==== Заполнение матрицы B====&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из трёх групп вершин, расположенных в целочисленных узлах трёх областей разной размерности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин расположена в одномерной области, соответствующая ей операция вычисляет функцию SQRT. &lt;br /&gt;
Единственная координата каждой из вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргумент этой функции &lt;br /&gt;
	&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039;, а именно  &amp;lt;math&amp;gt;a_{11}&amp;lt;/math&amp;gt;; &lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;l_{ii}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин расположена в двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a / b&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;: &lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элементы &#039;&#039;входных данных&#039;&#039;, а именно &amp;lt;math&amp;gt;a_{j1}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1, j, i - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;l_{ji}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин расположена в трёхмерной области, соответствующая ей операция  &amp;lt;math&amp;gt;a - b * c&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; — меняется в диапазоне  от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;p = 1&amp;lt;/math&amp;gt; элемент входных данных &amp;lt;math&amp;gt;a_{ji}&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;p &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i, j, p - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, i&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, j&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.1, выполненном для случая &amp;lt;math&amp;gt;n = 4&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
[[file:Cholesky full_in_out.png|thumb|center|1400px|Граф 1. SQ - вычисление квадратного корня, F - операция a-bc, Div - деление, In - входные данные, Out - результаты.]]&lt;br /&gt;
&lt;br /&gt;
====Генерация вектора Y====&lt;br /&gt;
&lt;br /&gt;
====Вычисление вектора X====&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма умножения плотной матрицы на вектор состоит из одной группы вершин, расположенной в целочисленных узлах двумерной области, соответствующая ей операция  &amp;lt;math&amp;gt;a+bc&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;j = 1&amp;lt;/math&amp;gt; константа &amp;lt;math&amp;gt;0.&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;j &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине с координатами &amp;lt;math&amp;gt;i, j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039;, а именно  &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; - элемент входных данных &amp;lt;math&amp;gt;x_{j}&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является:&lt;br /&gt;
* при &amp;lt;math&amp;gt;j &amp;lt; n&amp;lt;/math&amp;gt; - &#039;&#039;промежуточным данным&#039;&#039; алгоритма;&lt;br /&gt;
* при &amp;lt;math&amp;gt;j = n&amp;lt;/math&amp;gt; - выходным данным.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рисунке, выполненном для случая &amp;lt;math&amp;gt;m = 4, n = 5&amp;lt;/math&amp;gt;. Здесь вершины обозначены голубым цветом. Изображена подача только входных данных из вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, подача элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, идущая во все вершины, на рисунке не представлена.&lt;br /&gt;
&lt;br /&gt;
[[Файл:YeqAX.png|500px|thumb|center|Рисунок 1. Граф 2]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для распараллеливания доступны следующие опции:&lt;br /&gt;
* вычисление элементов матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в рамках столбца (под диагональю),&lt;br /&gt;
* генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;,&lt;br /&gt;
* вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (умножение матрицы на вектор, сложение векторов).&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: вещественная всюду плотная положительно определенная симметрическая  &amp;lt;math&amp;gt;(n \times n)&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;\Sigma&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;
* Выходные данные: вещественный &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектор &amp;lt;math&amp;gt;X&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;syntaxhighlight lang = c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// compute matrix B (core)&lt;br /&gt;
for (int j = 0; j &amp;lt; n; j++){&lt;br /&gt;
    double sum_down = matrix_cov[j][j];&lt;br /&gt;
    for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
        double cur = matrix_cov[j][k];&lt;br /&gt;
        sum_down -= cur * cur;&lt;br /&gt;
    }&lt;br /&gt;
    matrix_cov[j][j] = sqrt(sum_down);&lt;br /&gt;
    for (int i = j + 1; i &amp;lt; n; i++){&lt;br /&gt;
        double sum_up = matrix_cov[i][j];&lt;br /&gt;
        for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
            sum_up -= matrix_cov[i][k] * matrix_cov[j][k];&lt;br /&gt;
        }&lt;br /&gt;
        matrix_cov[i][j] = sum_up / matrix_cov[j][j];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
// generate vector Y&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){&lt;br /&gt;
    double sum = generate_uniform(n);&lt;br /&gt;
    for (int j = 0; j &amp;lt; CLT_NUM - 1; j++){&lt;br /&gt;
        sum += generate_uniform(n);&lt;br /&gt;
    }&lt;br /&gt;
    vec_Y[i] = (sum - CLT_NUM / 2) * sqrt(12.0 / CLT_NUM);&lt;br /&gt;
}&lt;br /&gt;
// linear transformation&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){  &lt;br /&gt;
    vec_X[i] = vec_exp[i];&lt;br /&gt;
    for (int k = 0; k &amp;lt;= i; k++){&lt;br /&gt;
        vec_X[i] += matrix_cov[i][k] * vec_Y[k];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Алгоритм был реализован на языке C++ с использованием Intel MPI Library и запущен на кластере regular4.&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add impi/5.0.1&lt;br /&gt;
 mpicxx -std=c++0x task.c -o _scratch/task&lt;br /&gt;
 cd _scratch&lt;br /&gt;
 sbatch -n256 impi ./task &amp;lt;matrix_size&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
* размер матрицы [1024 : 4864] с шагом 256,&lt;br /&gt;
* число ядер [2 : 256] с шагом-умножением в 2 раза.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:Ops_2.png|thumb|center|700px|Рисунок 1. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В отличие от разложения Холецкого, которое реализовано (точечный метод) во многих прикладных пакетах (напр., LINPACK, LAPACK, SCALAPACK), моделирование гауссовского случайного вектора не так &amp;quot;популярно&amp;quot;. MS Excel и распространённые статистические пакеты (напр., SPSS, Statistica) позволяют моделировать только одномерные статистические распределения.&lt;br /&gt;
&lt;br /&gt;
Имеется возможность &amp;quot;собрать&amp;quot; многомерное распределение из нескольких одномерных при условии, что компоненты независимы. Однако если необходимо исследовать данные с зависящими друг от друга переменными, то приходится писать собственную программу.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Lonalone</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26731</id>
		<title>Участник:Lonalone/Генерация гауссовского вектора методом линейных преобразований</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26731"/>
		<updated>2018-11-30T16:42:07Z</updated>

		<summary type="html">&lt;p&gt;Lonalone: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор описания: &#039;&#039;Меньших И. М.&#039;&#039;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из многомерных распределений особый интерес представляет нормальное. Этому закону подчиняются все результаты воздействия большого числа случайных факторов, среди которых нет превалирующих.&lt;br /&gt;
&lt;br /&gt;
В статье приведен алгоритм генерации n-мерного гауссовского случайного вектора с помощью &#039;&#039;метода линейных преобразований&#039;&#039;&amp;lt;ref name=&amp;quot;V&amp;quot;&amp;gt;(п. 1.10.4) Михайлов Г.А., Войтишек А.В. Численное статистическое моделирование. Методы Монте-Карло — М.: Академия, 2006. — 368 с.&amp;lt;/ref&amp;gt;. Известно, что случае нормально распределенного случайного вектора, ковариационная матрица вместе с математическим ожиданием этого вектора полностью определяют его распределение. Поэтому для полного статистического соответствия моделируемого и теоретического распределения гауссовского вектора достаточно обеспечить требуемые значения указанных параметров&amp;lt;ref name=&amp;quot;VV&amp;quot;&amp;gt; https://ru.wikipedia.org/wiki/Многомерное_нормальное_распределение&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея алгоритма заключается в линейном преобразовании n-мерного случайного вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, компоненты которого независимы и одинаково распределены по нормальному закону со стандартными параметрами, в случайный вектор &amp;lt;math&amp;gt;X&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;\Sigma&amp;lt;/math&amp;gt; и вектор математических ожиданий &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Sigma = \|\sigma_{ij}\| = \| \mathbb{E}[(X_{i} - m_{x_{i}})(X_{j} - m_{x_{j}})]\|, \\&lt;br /&gt;
M = (m_{x_{1}}, m_{x_{2}}, ..., m_{x_{n}})^T.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Требуется найти такую матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, которая позволяла бы получить искомый вектор &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; с требуемыми характеристиками в результате линейного преобразования &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — n-мерный случайный вектор с независимыми нормально распределенными компонентами со стандартными параметрами.&lt;br /&gt;
&lt;br /&gt;
Будем искать матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в виде нижней треугольной матрицы. Перейдем от матричной записи к системе алгебраических уравнений:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} X_{1} \\&lt;br /&gt;
 X_{2} \\ \vdots \\ X_{n} \end{pmatrix} =&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} b_{11} &amp;amp; 0 &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\b_{21} &amp;amp; b_{22} &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\ \vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \vdots&lt;br /&gt;
\\ b_{n1} &amp;amp; b_{n2} &amp;amp; \cdots &amp;amp; b_{nn}&lt;br /&gt;
\end{pmatrix} \times&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} Y_{1} \\&lt;br /&gt;
 Y_{2} \\ \vdots \\ Y_{n} \end{pmatrix} +&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} m_{x_{1}} \\&lt;br /&gt;
 m_{x_{2}} \\ \vdots \\ m_{x_{n}} \end{pmatrix} \Rightarrow&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}X_{1} - m_{x_{1}} = b_{11}Y_{1}&lt;br /&gt;
\\X_{2} - m_{x_{2}} = b_{21}Y_{1} + b_{22}Y_{2}&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\\X_{n} - m_{x_{n}} = b_{n1}Y_{1} + b_{n2}Y_{2} + \cdots + b_{nn}Y_{n}&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Поскольку компоненты вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; независимы и имеют стандартные параметры, справедливо выражение:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\mathbb{E}[Y_{i}Y_{j}] =&lt;br /&gt;
\left\{\begin{matrix} &lt;br /&gt;
1, &amp;amp;i = j, \\&lt;br /&gt;
0, &amp;amp;i \not= j.&lt;br /&gt;
\end{matrix}\right.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Почленно перемножив сами на себя и между собой соответственно левые и правые части уравнений системы и взяв от результатов перемножения математическое ожидание, получаем систему уравнений вида:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\mathbb{E}[(X_{1} - m_{x_{1}})(X_{1} - m_{x_{1}})] = \mathbb{E}[b_{11}Y_{1}b_{11}Y_{1}],&lt;br /&gt;
\\ \mathbb{E}[(X_{1} - m_{x_{1}})(X_{2} - m_{x_{2}})] = \mathbb{E}[(b_{21}Y_{1} + b_{22}Y_{2})b_{11}Y_{1}],&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, в левых частях полученной системы уравнений располагаются элементы заданной ковариационной матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;, а в правых — элементы искомой матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;. Последовательно решая эту систему, получаем формулы для расчета элементов &amp;lt;math&amp;gt;\sigma_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
b_{11}=\sqrt{\sigma_{11}}; b_{21}=\frac{\sigma_{12}}{\sqrt{\sigma_{11}}}; b_{22} = \sqrt{\sigma_{22} - \frac{\sigma_{12}}{\sigma_{11}}}, \cdots&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рекуррентная формула для расчета любого элемента матрицы преобразования &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b_{ij} = \frac {\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}} {\sqrt{\sigma_{ij} - \sum_{k=1}^{j-1} b_{jk}^2}}, \quad 1 \leqslant j \leqslant i \leqslant n&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(суммы с верхним нулевым пределом считаются равными нулю)&lt;br /&gt;
&lt;br /&gt;
Таким образом, матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; получается с помощью [[Разложение_Холецкого_(метод_квадратного_корня)|разложения Холецкого]] матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Генерация случайного вектора Y ====&lt;br /&gt;
&lt;br /&gt;
Пусть имеется генератор псевдослучайных чисел (ГПСЧ, PRNG), с помощью которого можно получить реализацию случайной величины &amp;lt;math&amp;gt;u \sim U(0,1) &amp;lt;/math&amp;gt;. Описанный выше случайный вектор &amp;lt;math&amp;gt;Y=(y_1, \cdots, y_n)&amp;lt;/math&amp;gt; с независимыми компонентами составим из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; реализаций случайной величины &amp;lt;math&amp;gt;\eta \sim N(0,1)&amp;lt;/math&amp;gt;. Каждую такую реализацию &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;, в свою очередь, получим с помощью приближения по ЦПТ &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; случайными величинами, распределенными равномерно на отрезке [0,1]:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right), \quad i = \overline{1, n} \\&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;u_j^i - &amp;lt;/math&amp;gt; реализации случайной величины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;\kappa - &amp;lt;/math&amp;gt; параметр, обеспечивающий качество приближения.&lt;br /&gt;
&lt;br /&gt;
Как правило, &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; берут равным 12 и считают, что для подавляющего числа практических задач обеспечивается должная точность вычислений&amp;lt;ref name = &amp;quot;VVV&amp;quot;&amp;gt;Балдин К.В., Уткин В.Б. Информационные системы в экономике. — М.:Дашков и Кo, 2008. — 395 с.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}, \quad 1 \leqslant j \leqslant i \leqslant n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;&lt;br /&gt;
* Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1) Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;b_{11}= \sqrt{\sigma_{11}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;b_{k1}= \frac{\sigma_{k1}}{l_{11}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad k = \overline{2,n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{2,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (c) &amp;lt;math&amp;gt;b_{ii} = \sqrt{\sigma_{ii} - \sum_{p = 1}^{i - 1} b_{ip}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (d) &amp;lt;math&amp;gt;b_{ji} = \frac{\sigma_{ji} - \sum_{p = 1}^{i - 1} b_{ip} b_{jp}} {l_{ii}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad i \neq n, j = \overline{i+1,n}&amp;lt;/math&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;u_j^i \leftarrow PRNG,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\quad j = \overline{1,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3) Вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i = m_{x_i} + \sum_{k = 1}^{i} b_{ik} y_{k}, \quad i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + \sum_{j=1}^{n-2}j(n-j-1) + n + \frac {n(n+1)}{2} =&lt;br /&gt;
  n(n+1) + \frac {n(n-1)(n-2)}{6}&amp;lt;/math&amp;gt; (умножений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + \sum_{j=1}^{n-2}j(n-j-1) + n =&lt;br /&gt;
  \frac {n(n+1)}{2} + \frac {n(n-1)(n-2)}{6}&amp;lt;/math&amp;gt; (вычитаний)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad (\kappa-1)n + \frac {n(n+1)}{2} = \frac {n(n-1+2\kappa)}{2}&amp;lt;/math&amp;gt; (сложений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + 2n = \frac {n(n+3)}{2}&amp;lt;/math&amp;gt; (делений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad n + n  = 2n &amp;lt;/math&amp;gt; (взятия квадратного корня)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{n}{6}\left(2n^2+9n+31+6\kappa\right) &amp;lt;/math&amp;gt; - итого операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
==== Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из трёх групп вершин, расположенных в целочисленных узлах трёх областей разной размерности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин расположена в одномерной области, соответствующая ей операция вычисляет функцию SQRT. &lt;br /&gt;
Единственная координата каждой из вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргумент этой функции &lt;br /&gt;
	&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039;, а именно  &amp;lt;math&amp;gt;a_{11}&amp;lt;/math&amp;gt;; &lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;l_{ii}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин расположена в двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;a / b&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;: &lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — элементы &#039;&#039;входных данных&#039;&#039;, а именно &amp;lt;math&amp;gt;a_{j1}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i - 1, j, i - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;выходным данным&#039;&#039; &amp;lt;math&amp;gt;l_{ji}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа вершин расположена в трёхмерной области, соответствующая ей операция  &amp;lt;math&amp;gt;a - b * c&amp;lt;/math&amp;gt;. &lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; — меняется в диапазоне  от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;i - 1&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;p = 1&amp;lt;/math&amp;gt; элемент входных данных &amp;lt;math&amp;gt;a_{ji}&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;p &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из третьей группы, с координатами &amp;lt;math&amp;gt;i, j, p - 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, i&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине из второй группы, с координатами &amp;lt;math&amp;gt;p, j&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является &#039;&#039;промежуточным данным&#039;&#039; алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рис.1 для случая &amp;lt;math&amp;gt;n = 4&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
[[file:Cholesky full_in_out.png|thumb|center|1400px|Граф 1. SQ - вычисление квадратного корня, F - операция a-bc, Div - деление, In - входные данные, Out - результаты.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для распараллеливания доступны следующие опции:&lt;br /&gt;
* вычисление элементов матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в рамках столбца (под диагональю),&lt;br /&gt;
* генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;,&lt;br /&gt;
* вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (умножение матрицы на вектор, сложение векторов).&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: вещественная всюду плотная положительно определенная симметрическая  &amp;lt;math&amp;gt;(n \times n)&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;\Sigma&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;
* Выходные данные: вещественный &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектор &amp;lt;math&amp;gt;X&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;syntaxhighlight lang = c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// compute matrix B (core)&lt;br /&gt;
for (int j = 0; j &amp;lt; n; j++){&lt;br /&gt;
    double sum_down = matrix_cov[j][j];&lt;br /&gt;
    for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
        double cur = matrix_cov[j][k];&lt;br /&gt;
        sum_down -= cur * cur;&lt;br /&gt;
    }&lt;br /&gt;
    matrix_cov[j][j] = sqrt(sum_down);&lt;br /&gt;
    for (int i = j + 1; i &amp;lt; n; i++){&lt;br /&gt;
        double sum_up = matrix_cov[i][j];&lt;br /&gt;
        for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
            sum_up -= matrix_cov[i][k] * matrix_cov[j][k];&lt;br /&gt;
        }&lt;br /&gt;
        matrix_cov[i][j] = sum_up / matrix_cov[j][j];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
// generate vector Y&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){&lt;br /&gt;
    double sum = generate_uniform(n);&lt;br /&gt;
    for (int j = 0; j &amp;lt; CLT_NUM - 1; j++){&lt;br /&gt;
        sum += generate_uniform(n);&lt;br /&gt;
    }&lt;br /&gt;
    vec_Y[i] = (sum - CLT_NUM / 2) * sqrt(12.0 / CLT_NUM);&lt;br /&gt;
}&lt;br /&gt;
// linear transformation&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){  &lt;br /&gt;
    vec_X[i] = vec_exp[i];&lt;br /&gt;
    for (int k = 0; k &amp;lt;= i; k++){&lt;br /&gt;
        vec_X[i] += matrix_cov[i][k] * vec_Y[k];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Алгоритм был реализован на языке C++ с использованием Intel MPI Library и запущен на кластере regular4.&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add impi/5.0.1&lt;br /&gt;
 mpicxx -std=c++0x task.c -o _scratch/task&lt;br /&gt;
 cd _scratch&lt;br /&gt;
 sbatch -n256 impi ./task &amp;lt;matrix_size&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
* размер матрицы [1024 : 4864] с шагом 256,&lt;br /&gt;
* число ядер [2 : 256] с шагом-умножением в 2 раза.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:Ops_2.png|thumb|center|700px|Рисунок 1. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В отличие от разложения Холецкого, которое реализовано (точечный метод) во многих прикладных пакетах (напр., LINPACK, LAPACK, SCALAPACK), моделирование гауссовского случайного вектора не так &amp;quot;популярно&amp;quot;. MS Excel и распространённые статистические пакеты (напр., SPSS, Statistica) позволяют моделировать только одномерные статистические распределения.&lt;br /&gt;
&lt;br /&gt;
Имеется возможность &amp;quot;собрать&amp;quot; многомерное распределение из нескольких одномерных при условии, что компоненты независимы. Однако если необходимо исследовать данные с зависящими друг от друга переменными, то приходится писать собственную программу.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Lonalone</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26730</id>
		<title>Участник:Lonalone/Генерация гауссовского вектора методом линейных преобразований</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26730"/>
		<updated>2018-11-29T22:37:17Z</updated>

		<summary type="html">&lt;p&gt;Lonalone: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор описания: &#039;&#039;Меньших И. М.&#039;&#039;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из многомерных распределений особый интерес представляет нормальное. Этому закону подчиняются все результаты воздействия большого числа случайных факторов, среди которых нет превалирующих.&lt;br /&gt;
&lt;br /&gt;
В статье приведен алгоритм генерации n-мерного гауссовского случайного вектора с помощью &#039;&#039;метода линейных преобразований&#039;&#039;&amp;lt;ref name=&amp;quot;V&amp;quot;&amp;gt;(п. 1.10.4) Михайлов Г.А., Войтишек А.В. Численное статистическое моделирование. Методы Монте-Карло — М.: Академия, 2006. — 368 с.&amp;lt;/ref&amp;gt;. Известно, что случае нормально распределенного случайного вектора, ковариационная матрица вместе с математическим ожиданием этого вектора полностью определяют его распределение. Поэтому для полного статистического соответствия моделируемого и теоретического распределения гауссовского вектора достаточно обеспечить требуемые значения указанных параметров&amp;lt;ref name=&amp;quot;VV&amp;quot;&amp;gt; https://ru.wikipedia.org/wiki/Многомерное_нормальное_распределение&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея алгоритма заключается в линейном преобразовании n-мерного случайного вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, компоненты которого независимы и одинаково распределены по нормальному закону со стандартными параметрами, в случайный вектор &amp;lt;math&amp;gt;X&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;\Sigma&amp;lt;/math&amp;gt; и вектор математических ожиданий &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Sigma = \|\sigma_{ij}\| = \| \mathbb{E}[(X_{i} - m_{x_{i}})(X_{j} - m_{x_{j}})]\|, \\&lt;br /&gt;
M = (m_{x_{1}}, m_{x_{2}}, ..., m_{x_{n}})^T.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Требуется найти такую матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, которая позволяла бы получить искомый вектор &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; с требуемыми характеристиками в результате линейного преобразования &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — n-мерный случайный вектор с независимыми нормально распределенными компонентами со стандартными параметрами.&lt;br /&gt;
&lt;br /&gt;
Будем искать матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в виде нижней треугольной матрицы. Перейдем от матричной записи к системе алгебраических уравнений:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} X_{1} \\&lt;br /&gt;
 X_{2} \\ \vdots \\ X_{n} \end{pmatrix} =&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} b_{11} &amp;amp; 0 &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\b_{21} &amp;amp; b_{22} &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\ \vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \vdots&lt;br /&gt;
\\ b_{n1} &amp;amp; b_{n2} &amp;amp; \cdots &amp;amp; b_{nn}&lt;br /&gt;
\end{pmatrix} \times&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} Y_{1} \\&lt;br /&gt;
 Y_{2} \\ \vdots \\ Y_{n} \end{pmatrix} +&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} m_{x_{1}} \\&lt;br /&gt;
 m_{x_{2}} \\ \vdots \\ m_{x_{n}} \end{pmatrix} \Rightarrow&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}X_{1} - m_{x_{1}} = b_{11}Y_{1}&lt;br /&gt;
\\X_{2} - m_{x_{2}} = b_{21}Y_{1} + b_{22}Y_{2}&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\\X_{n} - m_{x_{n}} = b_{n1}Y_{1} + b_{n2}Y_{2} + \cdots + b_{nn}Y_{n}&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Поскольку компоненты вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; независимы и имеют стандартные параметры, справедливо выражение:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\mathbb{E}[Y_{i}Y_{j}] =&lt;br /&gt;
\left\{\begin{matrix} &lt;br /&gt;
1, &amp;amp;i = j, \\&lt;br /&gt;
0, &amp;amp;i \not= j.&lt;br /&gt;
\end{matrix}\right.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Почленно перемножив сами на себя и между собой соответственно левые и правые части уравнений системы и взяв от результатов перемножения математическое ожидание, получаем систему уравнений вида:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\mathbb{E}[(X_{1} - m_{x_{1}})(X_{1} - m_{x_{1}})] = \mathbb{E}[b_{11}Y_{1}b_{11}Y_{1}],&lt;br /&gt;
\\ \mathbb{E}[(X_{1} - m_{x_{1}})(X_{2} - m_{x_{2}})] = \mathbb{E}[(b_{21}Y_{1} + b_{22}Y_{2})b_{11}Y_{1}],&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, в левых частях полученной системы уравнений располагаются элементы заданной ковариационной матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;, а в правых — элементы искомой матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;. Последовательно решая эту систему, получаем формулы для расчета элементов &amp;lt;math&amp;gt;\sigma_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
b_{11}=\sqrt{\sigma_{11}}; b_{21}=\frac{\sigma_{12}}{\sqrt{\sigma_{11}}}; b_{22} = \sqrt{\sigma_{22} - \frac{\sigma_{12}}{\sigma_{11}}}, \cdots&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рекуррентная формула для расчета любого элемента матрицы преобразования &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b_{ij} = \frac {\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}} {\sqrt{\sigma_{ij} - \sum_{k=1}^{j-1} b_{jk}^2}}, \quad 1 \leqslant j \leqslant i \leqslant n&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(суммы с верхним нулевым пределом считаются равными нулю)&lt;br /&gt;
&lt;br /&gt;
Таким образом, матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; получается с помощью [[Разложение_Холецкого_(метод_квадратного_корня)|разложения Холецкого]] матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Генерация случайного вектора Y ====&lt;br /&gt;
&lt;br /&gt;
Пусть имеется генератор псевдослучайных чисел (ГПСЧ, PRNG), с помощью которого можно получить реализацию случайной величины &amp;lt;math&amp;gt;u \sim U(0,1) &amp;lt;/math&amp;gt;. Описанный выше случайный вектор &amp;lt;math&amp;gt;Y=(y_1, \cdots, y_n)&amp;lt;/math&amp;gt; с независимыми компонентами составим из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; реализаций случайной величины &amp;lt;math&amp;gt;\eta \sim N(0,1)&amp;lt;/math&amp;gt;. Каждую такую реализацию &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;, в свою очередь, получим с помощью приближения по ЦПТ &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; случайными величинами, распределенными равномерно на отрезке [0,1]:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right), \quad i = \overline{1, n} \\&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;u_j^i - &amp;lt;/math&amp;gt; реализации случайной величины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;\kappa - &amp;lt;/math&amp;gt; параметр, обеспечивающий качество приближения.&lt;br /&gt;
&lt;br /&gt;
Как правило, &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; берут равным 12 и считают, что для подавляющего числа практических задач обеспечивается должная точность вычислений&amp;lt;ref name = &amp;quot;VVV&amp;quot;&amp;gt;Балдин К.В., Уткин В.Б. Информационные системы в экономике. — М.:Дашков и Кo, 2008. — 395 с.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}, \quad 1 \leqslant j \leqslant i \leqslant n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;&lt;br /&gt;
* Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1) Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;b_{11}= \sqrt{\sigma_{11}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;b_{k1}= \frac{\sigma_{k1}}{l_{11}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad k = \overline{2,n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{2,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (c) &amp;lt;math&amp;gt;b_{ii} = \sqrt{\sigma_{ii} - \sum_{p = 1}^{i - 1} b_{ip}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (d) &amp;lt;math&amp;gt;b_{ji} = \frac{\sigma_{ji} - \sum_{p = 1}^{i - 1} b_{ip} b_{jp}} {l_{ii}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad i \neq n, j = \overline{i+1,n}&amp;lt;/math&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;u_j^i \leftarrow PRNG,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\quad j = \overline{1,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3) Вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i = m_{x_i} + \sum_{k = 1}^{i} b_{ik} y_{k}, \quad i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + \sum_{j=1}^{n-2}j(n-j-1) + n + \frac {n(n+1)}{2} =&lt;br /&gt;
  n(n+1) + \frac {n(n-1)(n-2)}{6}&amp;lt;/math&amp;gt; (умножений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + \sum_{j=1}^{n-2}j(n-j-1) + n =&lt;br /&gt;
  \frac {n(n+1)}{2} + \frac {n(n-1)(n-2)}{6}&amp;lt;/math&amp;gt; (вычитаний)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad (\kappa-1)n + \frac {n(n+1)}{2} = \frac {n(n-1+2\kappa)}{2}&amp;lt;/math&amp;gt; (сложений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + 2n = \frac {n(n+3)}{2}&amp;lt;/math&amp;gt; (делений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad n + n  = 2n &amp;lt;/math&amp;gt; (взятия квадратного корня)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{n}{6}\left(2n^2+9n+31+6\kappa\right) &amp;lt;/math&amp;gt; - итого операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для распараллеливания доступны следующие опции:&lt;br /&gt;
* вычисление элементов матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в рамках столбца (под диагональю),&lt;br /&gt;
* генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;,&lt;br /&gt;
* вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (умножение матрицы на вектор, сложение векторов).&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: вещественная всюду плотная положительно определенная симметрическая  &amp;lt;math&amp;gt;(n \times n)&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;\Sigma&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;
* Выходные данные: вещественный &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектор &amp;lt;math&amp;gt;X&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;syntaxhighlight lang = c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// compute matrix B (core)&lt;br /&gt;
for (int j = 0; j &amp;lt; n; j++){&lt;br /&gt;
    double sum_down = matrix_cov[j][j];&lt;br /&gt;
    for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
        double cur = matrix_cov[j][k];&lt;br /&gt;
        sum_down -= cur * cur;&lt;br /&gt;
    }&lt;br /&gt;
    matrix_cov[j][j] = sqrt(sum_down);&lt;br /&gt;
    for (int i = j + 1; i &amp;lt; n; i++){&lt;br /&gt;
        double sum_up = matrix_cov[i][j];&lt;br /&gt;
        for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
            sum_up -= matrix_cov[i][k] * matrix_cov[j][k];&lt;br /&gt;
        }&lt;br /&gt;
        matrix_cov[i][j] = sum_up / matrix_cov[j][j];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
// generate vector Y&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){&lt;br /&gt;
    double sum = generate_uniform(n);&lt;br /&gt;
    for (int j = 0; j &amp;lt; CLT_NUM - 1; j++){&lt;br /&gt;
        sum += generate_uniform(n);&lt;br /&gt;
    }&lt;br /&gt;
    vec_Y[i] = (sum - CLT_NUM / 2) * sqrt(12.0 / CLT_NUM);&lt;br /&gt;
}&lt;br /&gt;
// linear transformation&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){  &lt;br /&gt;
    vec_X[i] = vec_exp[i];&lt;br /&gt;
    for (int k = 0; k &amp;lt;= i; k++){&lt;br /&gt;
        vec_X[i] += matrix_cov[i][k] * vec_Y[k];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Алгоритм был реализован на языке C++ с использованием Intel MPI Library и запущен на кластере regular4.&lt;br /&gt;
&lt;br /&gt;
Параметры компиляции и запуска: &lt;br /&gt;
 module add slurm&lt;br /&gt;
 module add impi/5.0.1&lt;br /&gt;
 mpicxx -std=c++0x task.c -o _scratch/task&lt;br /&gt;
 cd _scratch&lt;br /&gt;
 sbatch -n256 impi ./task &amp;lt;matrix_size&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
* размер матрицы [1024 : 4864] с шагом 256,&lt;br /&gt;
* число ядер [2 : 256] с шагом-умножением в 2 раза.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:Ops_2.png|thumb|center|700px|Рисунок 1. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В отличие от разложения Холецкого, которое реализовано (точечный метод) во многих прикладных пакетах (напр., LINPACK, LAPACK, SCALAPACK), моделирование гауссовского случайного вектора не так &amp;quot;популярно&amp;quot;. MS Excel и распространённые статистические пакеты (напр., SPSS, Statistica) позволяют моделировать только одномерные статистические распределения.&lt;br /&gt;
&lt;br /&gt;
Имеется возможность &amp;quot;собрать&amp;quot; многомерное распределение из нескольких одномерных при условии, что компоненты независимы. Однако если необходимо исследовать данные с зависящими друг от друга переменными, то приходится писать собственную программу.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Lonalone</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26729</id>
		<title>Участник:Lonalone/Генерация гауссовского вектора методом линейных преобразований</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26729"/>
		<updated>2018-11-29T18:02:55Z</updated>

		<summary type="html">&lt;p&gt;Lonalone: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор описания: &#039;&#039;Меньших И. М.&#039;&#039;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из многомерных распределений особый интерес представляет нормальное. Этому закону подчиняются все результаты воздействия большого числа случайных факторов, среди которых нет превалирующих.&lt;br /&gt;
&lt;br /&gt;
В статье приведен алгоритм генерации n-мерного гауссовского случайного вектора с помощью &#039;&#039;метода линейных преобразований&#039;&#039;&amp;lt;ref name=&amp;quot;V&amp;quot;&amp;gt;(п. 1.10.4) Михайлов Г.А., Войтишек А.В. Численное статистическое моделирование. Методы Монте-Карло — М.: Академия, 2006. — 368 с.&amp;lt;/ref&amp;gt;. Известно, что случае нормально распределенного случайного вектора, ковариационная матрица вместе с математическим ожиданием этого вектора полностью определяют его распределение. Поэтому для полного статистического соответствия моделируемого и теоретического распределения гауссовского вектора достаточно обеспечить требуемые значения указанных параметров&amp;lt;ref name=&amp;quot;VV&amp;quot;&amp;gt; https://ru.wikipedia.org/wiki/Многомерное_нормальное_распределение&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея алгоритма заключается в линейном преобразовании n-мерного случайного вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, компоненты которого независимы и одинаково распределены по нормальному закону со стандартными параметрами, в случайный вектор &amp;lt;math&amp;gt;X&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;\Sigma&amp;lt;/math&amp;gt; и вектор математических ожиданий &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Sigma = \|\sigma_{ij}\| = \| \mathbb{E}[(X_{i} - m_{x_{i}})(X_{j} - m_{x_{j}})]\|, \\&lt;br /&gt;
M = (m_{x_{1}}, m_{x_{2}}, ..., m_{x_{n}})^T.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Требуется найти такую матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, которая позволяла бы получить искомый вектор &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; с требуемыми характеристиками в результате линейного преобразования &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — n-мерный случайный вектор с независимыми нормально распределенными компонентами со стандартными параметрами.&lt;br /&gt;
&lt;br /&gt;
Будем искать матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в виде нижней треугольной матрицы. Перейдем от матричной записи к системе алгебраических уравнений:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} X_{1} \\&lt;br /&gt;
 X_{2} \\ \vdots \\ X_{n} \end{pmatrix} =&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} b_{11} &amp;amp; 0 &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\b_{21} &amp;amp; b_{22} &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\ \vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \vdots&lt;br /&gt;
\\ b_{n1} &amp;amp; b_{n2} &amp;amp; \cdots &amp;amp; b_{nn}&lt;br /&gt;
\end{pmatrix} \times&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} Y_{1} \\&lt;br /&gt;
 Y_{2} \\ \vdots \\ Y_{n} \end{pmatrix} +&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} m_{x_{1}} \\&lt;br /&gt;
 m_{x_{2}} \\ \vdots \\ m_{x_{n}} \end{pmatrix} \Rightarrow&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}X_{1} - m_{x_{1}} = b_{11}Y_{1}&lt;br /&gt;
\\X_{2} - m_{x_{2}} = b_{21}Y_{1} + b_{22}Y_{2}&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\\X_{n} - m_{x_{n}} = b_{n1}Y_{1} + b_{n2}Y_{2} + \cdots + b_{nn}Y_{n}&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Поскольку компоненты вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; независимы и имеют стандартные параметры, справедливо выражение:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\mathbb{E}[Y_{i}Y_{j}] =&lt;br /&gt;
\left\{\begin{matrix} &lt;br /&gt;
1, &amp;amp;i = j, \\&lt;br /&gt;
0, &amp;amp;i \not= j.&lt;br /&gt;
\end{matrix}\right.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Почленно перемножив сами на себя и между собой соответственно левые и правые части уравнений системы и взяв от результатов перемножения математическое ожидание, получаем систему уравнений вида:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\mathbb{E}[(X_{1} - m_{x_{1}})(X_{1} - m_{x_{1}})] = \mathbb{E}[b_{11}Y_{1}b_{11}Y_{1}],&lt;br /&gt;
\\ \mathbb{E}[(X_{1} - m_{x_{1}})(X_{2} - m_{x_{2}})] = \mathbb{E}[(b_{21}Y_{1} + b_{22}Y_{2})b_{11}Y_{1}],&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, в левых частях полученной системы уравнений располагаются элементы заданной ковариационной матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;, а в правых — элементы искомой матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;. Последовательно решая эту систему, получаем формулы для расчета элементов &amp;lt;math&amp;gt;\sigma_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
b_{11}=\sqrt{\sigma_{11}}; b_{21}=\frac{\sigma_{12}}{\sqrt{\sigma_{11}}}; b_{22} = \sqrt{\sigma_{22} - \frac{\sigma_{12}}{\sigma_{11}}}, \cdots&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рекуррентная формула для расчета любого элемента матрицы преобразования &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b_{ij} = \frac {\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}} {\sqrt{\sigma_{ij} - \sum_{k=1}^{j-1} b_{jk}^2}}, \quad 1 \leqslant j \leqslant i \leqslant n&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(суммы с верхним нулевым пределом считаются равными нулю)&lt;br /&gt;
&lt;br /&gt;
Таким образом, матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; получается с помощью [[Разложение_Холецкого_(метод_квадратного_корня)|разложения Холецкого]] матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Генерация случайного вектора Y ====&lt;br /&gt;
&lt;br /&gt;
Пусть имеется генератор псевдослучайных чисел (ГПСЧ, PRNG), с помощью которого можно получить реализацию случайной величины &amp;lt;math&amp;gt;u \sim U(0,1) &amp;lt;/math&amp;gt;. Описанный выше случайный вектор &amp;lt;math&amp;gt;Y=(y_1, \cdots, y_n)&amp;lt;/math&amp;gt; с независимыми компонентами составим из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; реализаций случайной величины &amp;lt;math&amp;gt;\eta \sim N(0,1)&amp;lt;/math&amp;gt;. Каждую такую реализацию &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;, в свою очередь, получим с помощью приближения по ЦПТ &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; случайными величинами, распределенными равномерно на отрезке [0,1]:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right), \quad i = \overline{1, n} \\&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;u_j^i - &amp;lt;/math&amp;gt; реализации случайной величины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;\kappa - &amp;lt;/math&amp;gt; параметр, обеспечивающий качество приближения.&lt;br /&gt;
&lt;br /&gt;
Как правило, &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; берут равным 12 и считают, что для подавляющего числа практических задач обеспечивается должная точность вычислений&amp;lt;ref name = &amp;quot;VVV&amp;quot;&amp;gt;Балдин К.В., Уткин В.Б. Информационные системы в экономике. — М.:Дашков и Кo, 2008. — 395 с.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}, \quad 1 \leqslant j \leqslant i \leqslant n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;&lt;br /&gt;
* Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1) Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;b_{11}= \sqrt{\sigma_{11}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;b_{k1}= \frac{\sigma_{k1}}{l_{11}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad k = \overline{2,n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{2,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (c) &amp;lt;math&amp;gt;b_{ii} = \sqrt{\sigma_{ii} - \sum_{p = 1}^{i - 1} b_{ip}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (d) &amp;lt;math&amp;gt;b_{ji} = \frac{\sigma_{ji} - \sum_{p = 1}^{i - 1} b_{ip} b_{jp}} {l_{ii}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad i \neq n, j = \overline{i+1,n}&amp;lt;/math&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;u_j^i \leftarrow PRNG,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\quad j = \overline{1,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3) Вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i = m_{x_i} + \sum_{k = 1}^{i} b_{ik} y_{k}, \quad i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + \sum_{j=1}^{n-2}j(n-j-1) + n + \frac {n(n+1)}{2} =&lt;br /&gt;
  n(n+1) + \frac {n(n-1)(n-2)}{6}&amp;lt;/math&amp;gt; (умножений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + \sum_{j=1}^{n-2}j(n-j-1) + n =&lt;br /&gt;
  \frac {n(n+1)}{2} + \frac {n(n-1)(n-2)}{6}&amp;lt;/math&amp;gt; (вычитаний)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad (\kappa-1)n + \frac {n(n+1)}{2} = \frac {n(n-1+2\kappa)}{2}&amp;lt;/math&amp;gt; (сложений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + 2n = \frac {n(n+3)}{2}&amp;lt;/math&amp;gt; (делений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad n + n  = 2n &amp;lt;/math&amp;gt; (взятия квадратного корня)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{n}{6}\left(2n^2+9n+31+6\kappa\right) &amp;lt;/math&amp;gt; - итого операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для распараллеливания доступны следующие опции:&lt;br /&gt;
* вычисление элементов матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в рамках столбца (под диагональю),&lt;br /&gt;
* генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;,&lt;br /&gt;
* вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (умножение матрицы на вектор, сложение векторов).&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: вещественная всюду плотная положительно определенная симметрическая  &amp;lt;math&amp;gt;(n \times n)&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;\Sigma&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;
* Выходные данные: вещественный &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектор &amp;lt;math&amp;gt;X&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;syntaxhighlight lang = c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// compute matrix B (core)&lt;br /&gt;
for (int j = 0; j &amp;lt; n; j++){&lt;br /&gt;
    double sum_down = matrix_cov[j][j];&lt;br /&gt;
    for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
        double cur = matrix_cov[j][k];&lt;br /&gt;
        sum_down -= cur * cur;&lt;br /&gt;
    }&lt;br /&gt;
    matrix_cov[j][j] = sqrt(sum_down);&lt;br /&gt;
    for (int i = j + 1; i &amp;lt; n; i++){&lt;br /&gt;
        double sum_up = matrix_cov[i][j];&lt;br /&gt;
        for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
            sum_up -= matrix_cov[i][k] * matrix_cov[j][k];&lt;br /&gt;
        }&lt;br /&gt;
        matrix_cov[i][j] = sum_up / matrix_cov[j][j];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
// generate vector Y&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){&lt;br /&gt;
    double sum = generate_uniform(n);&lt;br /&gt;
    for (int j = 0; j &amp;lt; CLT_NUM - 1; j++){&lt;br /&gt;
        sum += generate_uniform(n);&lt;br /&gt;
    }&lt;br /&gt;
    vec_Y[i] = (sum - CLT_NUM / 2) * sqrt(12.0 / CLT_NUM);&lt;br /&gt;
}&lt;br /&gt;
// linear transformation&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){  &lt;br /&gt;
    vec_X[i] = vec_exp[i];&lt;br /&gt;
    for (int k = 0; k &amp;lt;= i; k++){&lt;br /&gt;
        vec_X[i] += matrix_cov[i][k] * vec_Y[k];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
* размер матрицы [1024; 4864] с шагом 256,&lt;br /&gt;
* число ядер [2; 256] с шагом-умножением в 2 раза.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:Ops_2.png|thumb|center|700px|Рисунок 1. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В отличие от разложения Холецкого, которое реализовано (точечный метод) во многих прикладных пакетах (напр., LINPACK, LAPACK, SCALAPACK), моделирование гауссовского случайного вектора не так &amp;quot;популярно&amp;quot;. MS Excel и распространённые статистические пакеты (напр., SPSS, Statistica) позволяют моделировать только одномерные статистические распределения.&lt;br /&gt;
&lt;br /&gt;
Имеется возможность &amp;quot;собрать&amp;quot; многомерное распределение из нескольких одномерных при условии, что компоненты независимы. Однако если необходимо исследовать данные с зависящими друг от друга переменными, то приходится писать собственную программу.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Lonalone</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26728</id>
		<title>Участник:Lonalone/Генерация гауссовского вектора методом линейных преобразований</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:Lonalone/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B3%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9&amp;diff=26728"/>
		<updated>2018-11-29T17:50:10Z</updated>

		<summary type="html">&lt;p&gt;Lonalone: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор описания: &#039;&#039;Меньших И. М.&#039;&#039;&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Из многомерных распределений особый интерес представляет нормальное. Этому закону подчиняются все результаты воздействия большого числа случайных факторов, среди которых нет превалирующих.&lt;br /&gt;
&lt;br /&gt;
В статье приведен алгоритм генерации n-мерного гауссовского случайного вектора с помощью &#039;&#039;метода линейных преобразований&#039;&#039;&amp;lt;ref name=&amp;quot;V&amp;quot;&amp;gt;(п. 1.10.4) Михайлов Г.А., Войтишек А.В. Численное статистическое моделирование. Методы Монте-Карло — М.: Академия, 2006. — 368 с.&amp;lt;/ref&amp;gt;. Известно, что случае нормально распределенного случайного вектора, ковариационная матрица вместе с математическим ожиданием этого вектора полностью определяют его распределение. Поэтому для полного статистического соответствия моделируемого и теоретического распределения гауссовского вектора достаточно обеспечить требуемые значения указанных параметров&amp;lt;ref name=&amp;quot;VV&amp;quot;&amp;gt; https://ru.wikipedia.org/wiki/Многомерное_нормальное_распределение&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея алгоритма заключается в линейном преобразовании n-мерного случайного вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;, компоненты которого независимы и одинаково распределены по нормальному закону со стандартными параметрами, в случайный вектор &amp;lt;math&amp;gt;X&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;\Sigma&amp;lt;/math&amp;gt; и вектор математических ожиданий &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Sigma = \|\sigma_{ij}\| = \| \mathbb{E}[(X_{i} - m_{x_{i}})(X_{j} - m_{x_{j}})]\|, \\&lt;br /&gt;
M = (m_{x_{1}}, m_{x_{2}}, ..., m_{x_{n}})^T.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Требуется найти такую матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, которая позволяла бы получить искомый вектор &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; с требуемыми характеристиками в результате линейного преобразования &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; — n-мерный случайный вектор с независимыми нормально распределенными компонентами со стандартными параметрами.&lt;br /&gt;
&lt;br /&gt;
Будем искать матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в виде нижней треугольной матрицы. Перейдем от матричной записи к системе алгебраических уравнений:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} X_{1} \\&lt;br /&gt;
 X_{2} \\ \vdots \\ X_{n} \end{pmatrix} =&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} b_{11} &amp;amp; 0 &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\b_{21} &amp;amp; b_{22} &amp;amp; \cdots &amp;amp; 0&lt;br /&gt;
\\ \vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \vdots&lt;br /&gt;
\\ b_{n1} &amp;amp; b_{n2} &amp;amp; \cdots &amp;amp; b_{nn}&lt;br /&gt;
\end{pmatrix} \times&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} Y_{1} \\&lt;br /&gt;
 Y_{2} \\ \vdots \\ Y_{n} \end{pmatrix} +&lt;br /&gt;
&lt;br /&gt;
\begin{pmatrix} m_{x_{1}} \\&lt;br /&gt;
 m_{x_{2}} \\ \vdots \\ m_{x_{n}} \end{pmatrix} \Rightarrow&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}X_{1} - m_{x_{1}} = b_{11}Y_{1}&lt;br /&gt;
\\X_{2} - m_{x_{2}} = b_{21}Y_{1} + b_{22}Y_{2}&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\\X_{n} - m_{x_{n}} = b_{n1}Y_{1} + b_{n2}Y_{2} + \cdots + b_{nn}Y_{n}&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Поскольку компоненты вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; независимы и имеют стандартные параметры, справедливо выражение:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\mathbb{E}[Y_{i}Y_{j}] =&lt;br /&gt;
\left\{\begin{matrix} &lt;br /&gt;
1, &amp;amp;i = j, \\&lt;br /&gt;
0, &amp;amp;i \not= j.&lt;br /&gt;
\end{matrix}\right.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Почленно перемножив сами на себя и между собой соответственно левые и правые части уравнений системы и взяв от результатов перемножения математическое ожидание, получаем систему уравнений вида:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\mathbb{E}[(X_{1} - m_{x_{1}})(X_{1} - m_{x_{1}})] = \mathbb{E}[b_{11}Y_{1}b_{11}Y_{1}],&lt;br /&gt;
\\ \mathbb{E}[(X_{1} - m_{x_{1}})(X_{2} - m_{x_{2}})] = \mathbb{E}[(b_{21}Y_{1} + b_{22}Y_{2})b_{11}Y_{1}],&lt;br /&gt;
\\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots&lt;br /&gt;
\end{cases}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, в левых частях полученной системы уравнений располагаются элементы заданной ковариационной матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;, а в правых — элементы искомой матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;. Последовательно решая эту систему, получаем формулы для расчета элементов &amp;lt;math&amp;gt;\sigma_{ij}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
b_{11}=\sqrt{\sigma_{11}}; b_{21}=\frac{\sigma_{12}}{\sqrt{\sigma_{11}}}; b_{22} = \sqrt{\sigma_{22} - \frac{\sigma_{12}}{\sigma_{11}}}, \cdots&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рекуррентная формула для расчета любого элемента матрицы преобразования &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; имеет вид:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b_{ij} = \frac {\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}} {\sqrt{\sigma_{ij} - \sum_{k=1}^{j-1} b_{jk}^2}}, \quad 1 \leqslant j \leqslant i \leqslant n&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(суммы с верхним нулевым пределом считаются равными нулю)&lt;br /&gt;
&lt;br /&gt;
Таким образом, матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; получается с помощью [[Разложение_Холецкого_(метод_квадратного_корня)|разложения Холецкого]] матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Генерация случайного вектора Y ====&lt;br /&gt;
&lt;br /&gt;
Пусть имеется генератор псевдослучайных чисел (ГПСЧ, PRNG), с помощью которого можно получить реализацию случайной величины &amp;lt;math&amp;gt;u \sim U(0,1) &amp;lt;/math&amp;gt;. Описанный выше случайный вектор &amp;lt;math&amp;gt;Y=(y_1, \cdots, y_n)&amp;lt;/math&amp;gt; с независимыми компонентами составим из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; реализаций случайной величины &amp;lt;math&amp;gt;\eta \sim N(0,1)&amp;lt;/math&amp;gt;. Каждую такую реализацию &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;, в свою очередь, получим с помощью приближения по ЦПТ &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; случайными величинами, распределенными равномерно на отрезке [0,1]:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right), \quad i = \overline{1, n} \\&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;u_j^i - &amp;lt;/math&amp;gt; реализации случайной величины &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;\kappa - &amp;lt;/math&amp;gt; параметр, обеспечивающий качество приближения.&lt;br /&gt;
&lt;br /&gt;
Как правило, &amp;lt;math&amp;gt;\kappa&amp;lt;/math&amp;gt; берут равным 12 и считают, что для подавляющего числа практических задач обеспечивается должная точность вычислений&amp;lt;ref name = &amp;quot;VVV&amp;quot;&amp;gt;Балдин К.В., Уткин В.Б. Информационные системы в экономике. — М.:Дашков и Кo, 2008. — 395 с.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sigma_{ij} - \sum_{k=1}^{j-1} b_{ik} b_{jk}, \quad 1 \leqslant j \leqslant i \leqslant n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;&lt;br /&gt;
* Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;X = BY + M&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
1) Заполнение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;b_{11}= \sqrt{\sigma_{11}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;b_{k1}= \frac{\sigma_{k1}}{l_{11}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad k = \overline{2,n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{2,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (c) &amp;lt;math&amp;gt;b_{ii} = \sqrt{\sigma_{ii} - \sum_{p = 1}^{i - 1} b_{ip}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (d) &amp;lt;math&amp;gt;b_{ji} = \frac{\sigma_{ji} - \sum_{p = 1}^{i - 1} b_{ip} b_{jp}} {l_{ii}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\quad i \neq n, j = \overline{i+1,n}&amp;lt;/math&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) Генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: Следующие два пункта выполняются циклически, друг за другом для &amp;lt;math&amp;gt;i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: (a) &amp;lt;math&amp;gt;u_j^i \leftarrow PRNG,&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\quad j = \overline{1,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: (b) &amp;lt;math&amp;gt;y_i = \sqrt{\frac{12}{\kappa}} \left(\sum_{j=1}^{\kappa}{u_j^i} - \frac{\kappa}{2}\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3) Вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i = m_{x_i} + \sum_{k = 1}^{i} b_{ik} y_{k}, \quad i = \overline{1,n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + \sum_{j=1}^{n-2}j(n-j-1) + n + \frac {n(n+1)}{2} =&lt;br /&gt;
  n(n+1) + \frac {n(n-1)(n-2)}{6}&amp;lt;/math&amp;gt; (умножений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + \sum_{j=1}^{n-2}j(n-j-1) + n =&lt;br /&gt;
  \frac {n(n+1)}{2} + \frac {n(n-1)(n-2)}{6}&amp;lt;/math&amp;gt; (вычитаний)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad (\kappa-1)n + \frac {n(n+1)}{2} = \frac {n(n-1+2\kappa)}{2}&amp;lt;/math&amp;gt; (сложений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad \frac {n(n-1)}{2} + 2n = \frac {n(n+3)}{2}&amp;lt;/math&amp;gt; (делений)&lt;br /&gt;
* &amp;lt;math&amp;gt; \quad n + n  = 2n &amp;lt;/math&amp;gt; (взятия квадратного корня)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{n}{6}\left(2n^2+9n+31+6\kappa\right) &amp;lt;/math&amp;gt; - итого операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для распараллеливания доступны следующие опции:&lt;br /&gt;
* вычисление элементов матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; в рамках столбца (под диагональю),&lt;br /&gt;
* генерация вектора &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;,&lt;br /&gt;
* вычисление вектора &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; (умножение матрицы на вектор, сложение векторов).&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Входные данные: вещественная всюду плотная положительно определенная симметрическая  &amp;lt;math&amp;gt;(n \times n)&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;\Sigma&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;
* Выходные данные: вещественный &amp;lt;math&amp;gt;(n)&amp;lt;/math&amp;gt; вектор &amp;lt;math&amp;gt;X&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;syntaxhighlight lang = c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// compute matrix B (core)&lt;br /&gt;
for (int j = 0; j &amp;lt; n; j++){&lt;br /&gt;
    double sum_down = matrix_cov[j][j];&lt;br /&gt;
    for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
        double cur = matrix_cov[j][k];&lt;br /&gt;
        sum_down -= cur * cur;&lt;br /&gt;
    }&lt;br /&gt;
    matrix_cov[j][j] = sqrt(sum_down);&lt;br /&gt;
    for (int i = j + 1; i &amp;lt; n; i++){&lt;br /&gt;
        double sum_up = matrix_cov[i][j];&lt;br /&gt;
        for (int k = 0; k &amp;lt; j; k++){&lt;br /&gt;
            sum_up -= matrix_cov[i][k] * matrix_cov[j][k];&lt;br /&gt;
        }&lt;br /&gt;
        matrix_cov[i][j] = sum_up / matrix_cov[j][j];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
// generate vector Y&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){&lt;br /&gt;
    double sum = generate_uniform(n);&lt;br /&gt;
    for (int j = 0; j &amp;lt; CLT_NUM - 1; j++){&lt;br /&gt;
        sum += generate_uniform(n);&lt;br /&gt;
    }&lt;br /&gt;
    vec_Y[i] = (sum - CLT_NUM / 2) * sqrt(12.0 / CLT_NUM);&lt;br /&gt;
}&lt;br /&gt;
// linear transformation&lt;br /&gt;
for (int i = 0; i &amp;lt; n; i++){  &lt;br /&gt;
    vec_X[i] = vec_exp[i];&lt;br /&gt;
    for (int k = 0; k &amp;lt;= i; k++){&lt;br /&gt;
        vec_X[i] += matrix_cov[i][k] * vec_Y[k];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
[[file:Eff_2.png|thumb|center|700px|Рисунок 1. Изменение эффективности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
[[file:Eff_2_up.png|thumb|center|700px|Рисунок 2. Изменение эффективности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
[[file:Ops_2.png|thumb|center|700px|Рисунок 3. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
[[file:Ops_2_up.png|thumb|center|700px|Рисунок 4. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В отличие от разложения Холецкого, которое реализовано (точечный метод) во многих прикладных пакетах (напр., LINPACK, LAPACK, SCALAPACK), моделирование гауссовского случайного вектора не так &amp;quot;популярно&amp;quot;. MS Excel и распространённые статистические пакеты (напр., SPSS, Statistica) позволяют моделировать только одномерные статистические распределения.&lt;br /&gt;
&lt;br /&gt;
Имеется возможность &amp;quot;собрать&amp;quot; многомерное распределение из нескольких одномерных при условии, что компоненты независимы. Однако если необходимо исследовать данные с зависящими друг от друга переменными, то приходится писать собственную программу.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Lonalone</name></author>
	</entry>
</feed>