<?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=Chernyavskiy1</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=Chernyavskiy1"/>
	<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/Chernyavskiy1"/>
	<updated>2026-10-22T17:08:58Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A1%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D0%BE%D0%B5_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_(%D0%BD%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2)&amp;diff=2357</id>
		<title>Сингулярное разложение (нахождение сингулярных значений и векторов)</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A1%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D0%BE%D0%B5_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_(%D0%BD%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2)&amp;diff=2357"/>
		<updated>2015-08-23T09:10:59Z</updated>

		<summary type="html">&lt;p&gt;Chernyavskiy1: /* Особенности */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник:Chernyavskiy|А.Ю.Чернявский]]&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;m \times n&amp;lt;/math&amp;gt;, необходимо построить её разложение в виде &amp;lt;math&amp;gt;A=U\cdot S \cdot V^*,&amp;lt;/math&amp;gt; где &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; — унитарные матрицы размера &amp;lt;math&amp;gt;m \times m&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; соответственно, &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; — диагональная матрица с вещественными положительными числами на диагонали. Диагональные элементы матрицы &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; называются сингулярными числами матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, а столбцы матриц &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; левыми и правыми сингулярными векторами соотвтественно.&lt;br /&gt;
== Возможные вариации постановки задачи ==&lt;br /&gt;
* Поиск всех сингулярных чисел матрицы без поиска сингулярных векторов.&lt;br /&gt;
* Поиск сингулярных чисел матрицы из интервала &amp;lt;math&amp;gt;(a,b)&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Поиск сингулярных чисел матрицы из интервала &amp;lt;math&amp;gt;(a,b)&amp;lt;/math&amp;gt; и соответствующих сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
= Методы решения =&lt;br /&gt;
&lt;br /&gt;
== Общий метод сведения к спектральному разложению ==&lt;br /&gt;
&lt;br /&gt;
== Метод сведения к двухдиагональной матрице ==&lt;br /&gt;
Наиболее популярным методом вычисления сингулярных чисел и сингулярного разложения матрицы общего вида является приведение матрицы к двухдиагональному виду с дальнейшим примененеим хорошо разработанных &lt;br /&gt;
[[Сингулярное разложение (нахождение сингулярных значений и векторов)#Методы вычисления сингулярного разложения двухдиагональных матриц|методов вычисления сингулярного разложения двухдиагональных матриц]].&lt;br /&gt;
Таким образом метод сводится к следующим шагам:&lt;br /&gt;
# Вычисление [[Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме|разложения матрицы на двухдиагональную и унитарные]] &amp;lt;math&amp;gt;A=U_1TV_1^*.&amp;lt;/math&amp;gt; (Если нет необходимости вычислять сингулярные вектора, можно ограничиться вычислением двухдиагональной матрицы &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;.)&lt;br /&gt;
# Вычисление SVD разложения матрицы &amp;lt;math&amp;gt;T=U_2SV_2^*.&amp;lt;/math&amp;gt;&lt;br /&gt;
# Вычисление (при необходимости) &amp;lt;math&amp;gt;U=U_1U_2, V=V_1V_2.&amp;lt;/math&amp;gt; ([[Умножение матриц]].)&lt;br /&gt;
&lt;br /&gt;
== Методы вычисления сингулярного разложения двухдиагональных матриц ==&lt;br /&gt;
&lt;br /&gt;
=== QR-итерация и её варианты===&lt;br /&gt;
==== Особенности ====&lt;br /&gt;
* Быстрый метод для матриц порядка примерно 25 и меньше.&lt;br /&gt;
* Высокая относительная точность вычисления сингулярных чисел.&lt;br /&gt;
==== Алгоритмы ====&lt;br /&gt;
[[Алгоритм dqds нахождения сингулярных чисел двухдиагональной матрицы]], вещественная версия, последовательный вариант&lt;br /&gt;
&lt;br /&gt;
=== Метод &amp;quot;Разделяй-и-властвуй&amp;quot; ===&lt;br /&gt;
==== Особенности ====&lt;br /&gt;
* Быстрый метод для произвольных матриц размерности больше 25.&lt;br /&gt;
* Возможна низкая относительная точность вычисления сингулярных значений.&lt;br /&gt;
&lt;br /&gt;
==== Алгоритмы ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Метод бисекции и обратной итерации===&lt;br /&gt;
==== Особенности ====&lt;br /&gt;
==== Алгоритмы ====&lt;br /&gt;
&lt;br /&gt;
== Метод Якоби ==&lt;br /&gt;
==== Особенности ====&lt;br /&gt;
==== Алгоритмы ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Начатые статьи]]&lt;/div&gt;</summary>
		<author><name>Chernyavskiy1</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A1%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D0%BE%D0%B5_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_(%D0%BD%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2)&amp;diff=2356</id>
		<title>Сингулярное разложение (нахождение сингулярных значений и векторов)</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A1%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D0%BE%D0%B5_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_(%D0%BD%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2)&amp;diff=2356"/>
		<updated>2015-08-23T09:10:45Z</updated>

		<summary type="html">&lt;p&gt;Chernyavskiy1: /* Алгоритмы */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник:Chernyavskiy|А.Ю.Чернявский]]&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;m \times n&amp;lt;/math&amp;gt;, необходимо построить её разложение в виде &amp;lt;math&amp;gt;A=U\cdot S \cdot V^*,&amp;lt;/math&amp;gt; где &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; — унитарные матрицы размера &amp;lt;math&amp;gt;m \times m&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; соответственно, &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; — диагональная матрица с вещественными положительными числами на диагонали. Диагональные элементы матрицы &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; называются сингулярными числами матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, а столбцы матриц &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; левыми и правыми сингулярными векторами соотвтественно.&lt;br /&gt;
== Возможные вариации постановки задачи ==&lt;br /&gt;
* Поиск всех сингулярных чисел матрицы без поиска сингулярных векторов.&lt;br /&gt;
* Поиск сингулярных чисел матрицы из интервала &amp;lt;math&amp;gt;(a,b)&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Поиск сингулярных чисел матрицы из интервала &amp;lt;math&amp;gt;(a,b)&amp;lt;/math&amp;gt; и соответствующих сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
= Методы решения =&lt;br /&gt;
&lt;br /&gt;
== Общий метод сведения к спектральному разложению ==&lt;br /&gt;
&lt;br /&gt;
== Метод сведения к двухдиагональной матрице ==&lt;br /&gt;
Наиболее популярным методом вычисления сингулярных чисел и сингулярного разложения матрицы общего вида является приведение матрицы к двухдиагональному виду с дальнейшим примененеим хорошо разработанных &lt;br /&gt;
[[Сингулярное разложение (нахождение сингулярных значений и векторов)#Методы вычисления сингулярного разложения двухдиагональных матриц|методов вычисления сингулярного разложения двухдиагональных матриц]].&lt;br /&gt;
Таким образом метод сводится к следующим шагам:&lt;br /&gt;
# Вычисление [[Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме|разложения матрицы на двухдиагональную и унитарные]] &amp;lt;math&amp;gt;A=U_1TV_1^*.&amp;lt;/math&amp;gt; (Если нет необходимости вычислять сингулярные вектора, можно ограничиться вычислением двухдиагональной матрицы &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;.)&lt;br /&gt;
# Вычисление SVD разложения матрицы &amp;lt;math&amp;gt;T=U_2SV_2^*.&amp;lt;/math&amp;gt;&lt;br /&gt;
# Вычисление (при необходимости) &amp;lt;math&amp;gt;U=U_1U_2, V=V_1V_2.&amp;lt;/math&amp;gt; ([[Умножение матриц]].)&lt;br /&gt;
&lt;br /&gt;
== Методы вычисления сингулярного разложения двухдиагональных матриц ==&lt;br /&gt;
&lt;br /&gt;
=== QR-итерация и её варианты===&lt;br /&gt;
==== Особенности ====&lt;br /&gt;
* Быстрый метод для матриц порядка примерно 25 и меньше.&lt;br /&gt;
* Высокая относительная точность вычисления сингулярных чисел.&lt;br /&gt;
==== Алгоритмы ====&lt;br /&gt;
[[Алгоритм dqds нахождения сингулярных чисел двухдиагональной матрицы]], вещественная версия, последовательный вариант&lt;br /&gt;
&lt;br /&gt;
=== Метод &amp;quot;Разделяй-и-властвуй&amp;quot; ===&lt;br /&gt;
==== Особенности ====&lt;br /&gt;
* Быстрый метод для произвольных матриц размеронсти больше 25.&lt;br /&gt;
* Возможна низкая относительная точность вычисления сингулярных значений.&lt;br /&gt;
==== Алгоритмы ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Метод бисекции и обратной итерации===&lt;br /&gt;
==== Особенности ====&lt;br /&gt;
==== Алгоритмы ====&lt;br /&gt;
&lt;br /&gt;
== Метод Якоби ==&lt;br /&gt;
==== Особенности ====&lt;br /&gt;
==== Алгоритмы ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Начатые статьи]]&lt;/div&gt;</summary>
		<author><name>Chernyavskiy1</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%94%D0%B2%D1%83%D1%85%D0%BA%D1%83%D0%B1%D0%B8%D1%82%D0%BD%D0%BE%D0%B5_%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%B5_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0-%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F&amp;diff=954</id>
		<title>Двухкубитное преобразование вектора-состояния</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%94%D0%B2%D1%83%D1%85%D0%BA%D1%83%D0%B1%D0%B8%D1%82%D0%BD%D0%BE%D0%B5_%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%B5_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0-%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F&amp;diff=954"/>
		<updated>2015-02-12T09:01:08Z</updated>

		<summary type="html">&lt;p&gt;Chernyavskiy1: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
== Описание свойств и структуры алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм производит моделирование действия двухкубитного квантового вентиля на вектор-состояние. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
-Целочисленные параметры &amp;lt;math&amp;gt;n - &amp;lt;/math&amp;gt; число кубитов (необязательно) и &amp;lt;math&amp;gt;k,l -&amp;lt;/math&amp;gt; номера кубитов, над которым производится преобразование.&lt;br /&gt;
&lt;br /&gt;
-Комплексная матрица &amp;lt;math&amp;gt;U = {u_{ij}}= \begin{pmatrix}&lt;br /&gt;
u_{00}^{00} &amp;amp; u_{01}^{00} &amp;amp; u_{10}^{00} &amp;amp; u_{11}^{00}\\ &lt;br /&gt;
u_{00}^{01} &amp;amp; u_{01}^{01} &amp;amp; u_{10}^{01} &amp;amp; u_{11}^{01}\\ &lt;br /&gt;
u_{00}^{10} &amp;amp; u_{01}^{10} &amp;amp; u_{10}^{10} &amp;amp; u_{11}^{10}\\ &lt;br /&gt;
u_{00}^{11} &amp;amp; u_{01}^{11} &amp;amp; u_{10}^{11} &amp;amp; u_{11}^{11}&lt;br /&gt;
&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt; двухкубитного преобразования  размера &amp;lt;math&amp;gt;4 \times 4.&amp;lt;/math&amp;gt; Верхние и нижние двойные индексы обозначают бинарную запись индексов &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; (такие обозначения сильно упрощают дальнейшее описание).&lt;br /&gt;
&lt;br /&gt;
-Комплексный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;2^n,&amp;lt;/math&amp;gt; задающей начальное состояние многокубитной системы.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; комплексный вектор &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;2^n,&amp;lt;/math&amp;gt; соответствующий состоянию после преобразования.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Элементы итогового вектора записываются в следующем виде: &lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
w_{i_1i_2\ldots i_k \ldots i_l \ldots i_n} = \sum\limits_{j_k=0, j_l=0}^1 u^{j_k j_l}_{i_k i_l} v_{i_1i_2\ldots j_k \ldots j_l \ldots i_n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Индекс-кортеж &amp;lt;math&amp;gt;i_1i_2\ldots i_n&amp;lt;/math&amp;gt; представляет собой двоичную запись индекса элемента в массиве.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма представляет собой независимое вычисление всех &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; элементов вектора &amp;lt;math&amp;gt;w.&amp;lt;/math&amp;gt; Вычисление каждого элемента требует четыре операции умножения и три операцию сложения. Кроме того необходимо вычислять индексы типа &amp;lt;math&amp;gt;i_1i_2\ldots j_k \ldots j_l \ldots i_n,&amp;lt;/math&amp;gt; а также значение битов &amp;lt;math&amp;gt;j_k,j_l&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;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;2^n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычислить элементы &amp;lt;math&amp;gt;i_k, i_l&amp;lt;/math&amp;gt; двоичного представления индекса &amp;lt;math&amp;gt;i.&amp;lt;/math&amp;gt;&lt;br /&gt;
#Для всех четырех бинарных значений &amp;lt;math&amp;gt;j_k, j_l&amp;lt;/math&amp;gt; вычислить индексы  &amp;lt;math&amp;gt;i_1i_2\ldots j_k \ldots j_l \ldots i_n&amp;lt;/math&amp;gt;&lt;br /&gt;
#Просуммировать &amp;lt;math&amp;gt;u^{j_k j_l}_{i_k i_l} v_{i_1i_2\ldots j_k \ldots j_l \ldots i_n}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Алгоритм требует:&lt;br /&gt;
# &amp;lt;math&amp;gt;2^{n+2}&amp;lt;/math&amp;gt; операций умножения комплексных чисел;&lt;br /&gt;
# &amp;lt;math&amp;gt;3\dot 2^n&amp;lt;/math&amp;gt; операций сложения комплексных чисел;&lt;br /&gt;
# &amp;lt;math&amp;gt;2^{n+1}&amp;lt;/math&amp;gt; операций получения значения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-го бита числа;&lt;br /&gt;
# &amp;lt;math&amp;gt;2^{n+3}&amp;lt;/math&amp;gt; операций изменения значения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-го бита числа.&lt;br /&gt;
Отметим, что данный алгоритм обычно применяется много раз подряд, в связи с чем вычисления, связанные с побитовыми операциями (3-4), могут единожды проводиться в начале алгоритма. Кроме того, от них можно избавиться, пользуясь сложением и логическим умножением с числами &amp;lt;math&amp;gt;2^l,&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;2^k,&amp;lt;/math&amp;gt; которые сохраняется для всего алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Представим граф алгоритма для случаев &amp;lt;math&amp;gt;n=3, k=1, l=2&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=3, k=1, l=3&amp;lt;/math&amp;gt;. На графах не представлены матрицы преобразования &amp;lt;math&amp;gt;U,&amp;lt;/math&amp;gt; в связи с тем, что их размер при больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; много меньше, нежели размеры входного и выходного векторов. Отметим, что структура графа (а именно обращение к входным данным) сильно зависит от параметров &amp;lt;math&amp;gt;k,l.&amp;lt;/math&amp;gt;&lt;br /&gt;
[[file:TwoQubitVectorTransform_23.png|thumb|center|800px|Граф алгоритма для &amp;lt;math&amp;gt;n=3, k=2, l=3&amp;lt;/math&amp;gt; без отображения матрицы преобразования &amp;lt;math&amp;gt;U.&amp;lt;/math&amp;gt; ]]&lt;br /&gt;
[[file:TwoQubitVectorTransform_13.png|thumb|center|800px|Граф алгоритма для &amp;lt;math&amp;gt;n=3, k=1, l=3&amp;lt;/math&amp;gt; без отображения матрицы преобразования &amp;lt;math&amp;gt;U.&amp;lt;/math&amp;gt; ]]&lt;br /&gt;
&lt;br /&gt;
=== Описание ресурса параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Описание входных и выходных данных ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Программная реализация ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Описание локальности данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
==== Описание локальности алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Описание локальности реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
===== Описание структуры обращений в память и качественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Chernyavskiy1</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%94%D0%B2%D1%83%D1%85%D0%BA%D1%83%D0%B1%D0%B8%D1%82%D0%BD%D0%BE%D0%B5_%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%B5_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0-%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F&amp;diff=953</id>
		<title>Двухкубитное преобразование вектора-состояния</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%94%D0%B2%D1%83%D1%85%D0%BA%D1%83%D0%B1%D0%B8%D1%82%D0%BD%D0%BE%D0%B5_%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%B5_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0-%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F&amp;diff=953"/>
		<updated>2015-02-12T08:55:24Z</updated>

		<summary type="html">&lt;p&gt;Chernyavskiy1: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
== Описание свойств и структуры алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм производит моделирование действия двухкубитного квантового вентиля на вектор-состояние. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
-Целочисленные параметры &amp;lt;math&amp;gt;n - &amp;lt;/math&amp;gt; число кубитов (необязательно) и &amp;lt;math&amp;gt;k,l -&amp;lt;/math&amp;gt; номера кубитов, над которым производится преобразование.&lt;br /&gt;
&lt;br /&gt;
-Комплексная матрица &amp;lt;math&amp;gt;U = {u_{ij}}= \begin{pmatrix}&lt;br /&gt;
u_{00}^{00} &amp;amp; u_{01}^{00} &amp;amp; u_{10}^{00} &amp;amp; u_{11}^{00}\\ &lt;br /&gt;
u_{00}^{01} &amp;amp; u_{01}^{01} &amp;amp; u_{10}^{01} &amp;amp; u_{11}^{01}\\ &lt;br /&gt;
u_{00}^{10} &amp;amp; u_{01}^{10} &amp;amp; u_{10}^{10} &amp;amp; u_{11}^{10}\\ &lt;br /&gt;
u_{00}^{11} &amp;amp; u_{01}^{11} &amp;amp; u_{10}^{11} &amp;amp; u_{11}^{11}&lt;br /&gt;
&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt; двухкубитного преобразования  размера &amp;lt;math&amp;gt;4 \times 4.&amp;lt;/math&amp;gt; Верхние и нижние двойные индексы обозначают бинарную запись индексов &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; (такие обозначения сильно упрощают дальнейшее описание).&lt;br /&gt;
&lt;br /&gt;
-Комплексный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;2^n,&amp;lt;/math&amp;gt; задающей начальное состояние многокубитной системы.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; комплексный вектор &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;2^n,&amp;lt;/math&amp;gt; соответствующий состоянию после преобразования.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Элементы итогового вектора записываются в следующем виде: &lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
w_{i_1i_2\ldots i_k \ldots i_l \ldots i_n} = \sum\limits_{j_k=0, j_l=0}^1 u^{j_k j_l}_{i_k i_l} v_{i_1i_2\ldots j_k \ldots j_l \ldots i_n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Индекс-кортеж &amp;lt;math&amp;gt;i_1i_2\ldots i_n&amp;lt;/math&amp;gt; представляет собой двоичную запись индекса элемента в массиве.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма представляет собой независимое вычисление всех &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; элементов вектора &amp;lt;math&amp;gt;w.&amp;lt;/math&amp;gt; Вычисление каждого элемента требует четыре операции умножения и три операцию сложения. Кроме того необходимо вычислять индексы типа &amp;lt;math&amp;gt;i_1i_2\ldots j_k \ldots j_l \ldots i_n,&amp;lt;/math&amp;gt; а также значение битов &amp;lt;math&amp;gt;j_k,j_l&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;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;2^n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычислить элементы &amp;lt;math&amp;gt;i_k, i_l&amp;lt;/math&amp;gt; двоичного представления индекса &amp;lt;math&amp;gt;i.&amp;lt;/math&amp;gt;&lt;br /&gt;
#Для всех четырех бинарных значений &amp;lt;math&amp;gt;j_k, j_l&amp;lt;/math&amp;gt; вычислить индексы  &amp;lt;math&amp;gt;i_1i_2\ldots j_k \ldots j_l \ldots i_n&amp;lt;/math&amp;gt;&lt;br /&gt;
#Просуммировать &amp;lt;math&amp;gt;u^{j_k j_l}_{i_k i_l} v_{i_1i_2\ldots j_k \ldots j_l \ldots i_n}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Алгоритм требует:&lt;br /&gt;
# &amp;lt;math&amp;gt;2^{n+2}&amp;lt;/math&amp;gt; операций умножения комплексных чисел;&lt;br /&gt;
# &amp;lt;math&amp;gt;3\dot 2^n&amp;lt;/math&amp;gt; операций сложения комплексных чисел;&lt;br /&gt;
# &amp;lt;math&amp;gt;2^{n+1}&amp;lt;/math&amp;gt; операций получения значения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-го бита числа;&lt;br /&gt;
# &amp;lt;math&amp;gt;2^{n+3}&amp;lt;/math&amp;gt; операций изменения значения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-го бита числа.&lt;br /&gt;
Отметим, что данный алгоритм обычно применяется много раз подряд, в связи с чем вычисления, связанные с побитовыми операциями (3-4), могут единожды проводиться в начале алгоритма. Кроме того, от них можно избавиться, пользуясь сложением и логическим умножением с числами &amp;lt;math&amp;gt;2^l,&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;2^k,&amp;lt;/math&amp;gt; которые сохраняется для всего алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Представим граф алгоритма для случаев &amp;lt;math&amp;gt;n=3, k=1, l=2&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=3, k=1, l=3&amp;lt;/math&amp;gt;. На графах не представлены матрицы преобразования &amp;lt;math&amp;gt;U,&amp;lt;/math&amp;gt; в связи с тем, что их размер при больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; много меньше, нежели размеры входного и выходного векторов. Отметим, что структура графа (а именно обращение к входным данным) сильно зависит от параметров &amp;lt;math&amp;gt;k,l.&amp;lt;/math&amp;gt;&lt;br /&gt;
[[file:TwoQubitVectorTransform_23.png|thumb|center|800px|Граф алгоритма для &amp;lt;math&amp;gt;n=3, k=2, l=3&amp;lt;/math&amp;gt; без отображения матрицы преобразования &amp;lt;math&amp;gt;U.&amp;lt;/math&amp;gt; ]]&lt;br /&gt;
[[file:TwoQubitVectorTransform_13.svg|thumb|center|800px|Граф алгоритма для &amp;lt;math&amp;gt;n=3, k=1, l=3&amp;lt;/math&amp;gt; без отображения матрицы преобразования &amp;lt;math&amp;gt;U.&amp;lt;/math&amp;gt; ]]&lt;br /&gt;
&lt;br /&gt;
=== Описание ресурса параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Описание входных и выходных данных ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Программная реализация ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Описание локальности данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
==== Описание локальности алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Описание локальности реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
===== Описание структуры обращений в память и качественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Chernyavskiy1</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%94%D0%B2%D1%83%D1%85%D0%BA%D1%83%D0%B1%D0%B8%D1%82%D0%BD%D0%BE%D0%B5_%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%B5_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0-%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F&amp;diff=952</id>
		<title>Двухкубитное преобразование вектора-состояния</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%94%D0%B2%D1%83%D1%85%D0%BA%D1%83%D0%B1%D0%B8%D1%82%D0%BD%D0%BE%D0%B5_%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%B5_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0-%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F&amp;diff=952"/>
		<updated>2015-02-12T08:44:36Z</updated>

		<summary type="html">&lt;p&gt;Chernyavskiy1: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
== Описание свойств и структуры алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм производит моделирование действия двухкубитного квантового вентиля на вектор-состояние. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
-Целочисленные параметры &amp;lt;math&amp;gt;n - &amp;lt;/math&amp;gt; число кубитов (необязательно) и &amp;lt;math&amp;gt;k,l -&amp;lt;/math&amp;gt; номера кубитов, над которым производится преобразование.&lt;br /&gt;
&lt;br /&gt;
-Комплексная матрица &amp;lt;math&amp;gt;U = {u_{ij}}= \begin{pmatrix}&lt;br /&gt;
u_{00}^{00} &amp;amp; u_{01}^{00} &amp;amp; u_{10}^{00} &amp;amp; u_{11}^{00}\\ &lt;br /&gt;
u_{00}^{01} &amp;amp; u_{01}^{01} &amp;amp; u_{10}^{01} &amp;amp; u_{11}^{01}\\ &lt;br /&gt;
u_{00}^{10} &amp;amp; u_{01}^{10} &amp;amp; u_{10}^{10} &amp;amp; u_{11}^{10}\\ &lt;br /&gt;
u_{00}^{11} &amp;amp; u_{01}^{11} &amp;amp; u_{10}^{11} &amp;amp; u_{11}^{11}&lt;br /&gt;
&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt; двухкубитного преобразования  размера &amp;lt;math&amp;gt;4 \times 4.&amp;lt;/math&amp;gt; Верхние и нижние двойные индексы обозначают бинарную запись индексов &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; (такие обозначения сильно упрощают дальнейшее описание).&lt;br /&gt;
&lt;br /&gt;
-Комплексный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;2^n,&amp;lt;/math&amp;gt; задающей начальное состояние многокубитной системы.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; комплексный вектор &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;2^n,&amp;lt;/math&amp;gt; соответствующий состоянию после преобразования.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Элементы итогового вектора записываются в следующем виде: &lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
w_{i_1i_2\ldots i_k \ldots i_l \ldots i_n} = \sum\limits_{j_k=0, j_l=0}^1 u^{j_k j_l}_{i_k i_l} v_{i_1i_2\ldots j_k \ldots j_l \ldots i_n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Индекс-кортеж &amp;lt;math&amp;gt;i_1i_2\ldots i_n&amp;lt;/math&amp;gt; представляет собой двоичную запись индекса элемента в массиве.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма представляет собой независимое вычисление всех &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; элементов вектора &amp;lt;math&amp;gt;w.&amp;lt;/math&amp;gt; Вычисление каждого элемента требует четыре операции умножения и три операцию сложения. Кроме того необходимо вычислять индексы типа &amp;lt;math&amp;gt;i_1i_2\ldots j_k \ldots j_l \ldots i_n,&amp;lt;/math&amp;gt; а также значение битов &amp;lt;math&amp;gt;j_k,j_l&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;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;2^n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычислить элементы &amp;lt;math&amp;gt;i_k, i_l&amp;lt;/math&amp;gt; двоичного представления индекса &amp;lt;math&amp;gt;i.&amp;lt;/math&amp;gt;&lt;br /&gt;
#Для всех четырех бинарных значений &amp;lt;math&amp;gt;j_k, j_l&amp;lt;/math&amp;gt; вычислить индексы  &amp;lt;math&amp;gt;i_1i_2\ldots j_k \ldots j_l \ldots i_n&amp;lt;/math&amp;gt;&lt;br /&gt;
#Просуммировать &amp;lt;math&amp;gt;u^{j_k j_l}_{i_k i_l} v_{i_1i_2\ldots j_k \ldots j_l \ldots i_n}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Алгоритм требует:&lt;br /&gt;
# &amp;lt;math&amp;gt;2^{n+2}&amp;lt;/math&amp;gt; операций умножения комплексных чисел;&lt;br /&gt;
# &amp;lt;math&amp;gt;3\dot 2^n&amp;lt;/math&amp;gt; операций сложения комплексных чисел;&lt;br /&gt;
# &amp;lt;math&amp;gt;2^{n+1}&amp;lt;/math&amp;gt; операций получения значения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-го бита числа;&lt;br /&gt;
# &amp;lt;math&amp;gt;2^{n+3}&amp;lt;/math&amp;gt; операций изменения значения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-го бита числа.&lt;br /&gt;
Отметим, что данный алгоритм обычно применяется много раз подряд, в связи с чем вычисления, связанные с побитовыми операциями (3-4), могут единожды проводиться в начале алгоритма. Кроме того, от них можно избавиться, пользуясь сложением и логическим умножением с числами &amp;lt;math&amp;gt;2^l,&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;2^k,&amp;lt;/math&amp;gt; которые сохраняется для всего алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Представим граф алгоритма для случаев &amp;lt;math&amp;gt;n=3, k=1, l=2&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=3, k=1, l=3&amp;lt;/math&amp;gt;. На графах не представлены матрицы преобразования &amp;lt;math&amp;gt;U,&amp;lt;/math&amp;gt; в связи с тем, что их размер при больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; много меньше, нежели размеры входного и выходного векторов. Отметим, что структура графа (а именно обращение к входным данным) сильно зависит от параметров &amp;lt;math&amp;gt;k,l.&amp;lt;/math&amp;gt;&lt;br /&gt;
[[file:TwoQubitVectorTransform_v1.svg|thumb|center|800px|Граф алгоритма для &amp;lt;math&amp;gt;n=3, k=2, l=3&amp;lt;/math&amp;gt; без отображения матрицы преобразования &amp;lt;math&amp;gt;U.&amp;lt;/math&amp;gt; ]]&lt;br /&gt;
[[file:TwoQubitVectorTransform_13.svg|thumb|center|800px|Граф алгоритма для &amp;lt;math&amp;gt;n=3, k=1, l=3&amp;lt;/math&amp;gt; без отображения матрицы преобразования &amp;lt;math&amp;gt;U.&amp;lt;/math&amp;gt; ]]&lt;br /&gt;
&lt;br /&gt;
=== Описание ресурса параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Описание входных и выходных данных ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Программная реализация ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Описание локальности данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
==== Описание локальности алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Описание локальности реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
===== Описание структуры обращений в память и качественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Chernyavskiy1</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%8F_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%BE%D0%B2&amp;diff=951</id>
		<title>Классификация алгоритмов</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%8F_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%BE%D0%B2&amp;diff=951"/>
		<updated>2015-02-10T17:48:59Z</updated>

		<summary type="html">&lt;p&gt;Chernyavskiy1: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Векторные операции ==&lt;br /&gt;
&lt;br /&gt;
# [[Суммирование сдваиванием]]&lt;br /&gt;
# [[Равномерная норма вектора, вещественная версия, последовательно-параллельный вариант]]&lt;br /&gt;
# [[Скалярное произведение векторов, вещественная версия, последовательно-параллельный вариант]]&lt;br /&gt;
# [[Последовательно-параллельный метод суммирования]]&lt;br /&gt;
&lt;br /&gt;
== Умножение матрицы на вектор ==&lt;br /&gt;
&lt;br /&gt;
# [[Умножение плотной матрицы на вектор]]&lt;br /&gt;
&lt;br /&gt;
== Матричные операции ==&lt;br /&gt;
&lt;br /&gt;
# [[Умножение плотных матриц]]&lt;br /&gt;
&lt;br /&gt;
== Разложения матриц == &lt;br /&gt;
&lt;br /&gt;
=== Треугольные разложения ===&lt;br /&gt;
&lt;br /&gt;
# [[Метод Холецкого (нахождение симметричного треугольного разложения)]]&lt;br /&gt;
&lt;br /&gt;
=== Унитарно-треугольные разложения ===&lt;br /&gt;
&lt;br /&gt;
# [[Метод Гивенса (вращений) QR-разложения матрицы]]&lt;br /&gt;
# [[Метод Хаусхолдера (отражений) QR-разложения матрицы]]&lt;br /&gt;
&lt;br /&gt;
=== Разложения на унитарные и хессенберговы матрицы ===&lt;br /&gt;
&lt;br /&gt;
# [[Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме]]&lt;br /&gt;
&lt;br /&gt;
=== Разложения на унитарные и диагональные матрицы ===&lt;br /&gt;
&lt;br /&gt;
# [[Спектральное разложение (нахождение собственных значений и векторов)]]&lt;br /&gt;
# [[Сингулярное разложение (нахождение сингулярных значений и векторов)]]&lt;br /&gt;
&lt;br /&gt;
== Решение систем линейных уравнений ==&lt;br /&gt;
&lt;br /&gt;
# [[High Performance Conjugate Gradient (HPCG) benchmark]]&lt;br /&gt;
# [[Linpack benchmark]]&lt;br /&gt;
# [[Метод Гаусса решения СЛАУ (прямой ход)]]&lt;br /&gt;
# [[Метод Гаусса решения СЛАУ (обратный ход)]]&lt;br /&gt;
&lt;br /&gt;
== Тесты производительности компьютеров ==&lt;br /&gt;
&lt;br /&gt;
# [[High Performance Conjugate Gradient (HPCG) benchmark]]&lt;br /&gt;
# [[Linpack benchmark]]&lt;br /&gt;
&lt;br /&gt;
== Преобразование Фурье ==&lt;br /&gt;
&lt;br /&gt;
# [[Быстрое преобразование Фурье для степеней двойки]]&lt;br /&gt;
&lt;br /&gt;
== Численные методы интегрирования ==&lt;br /&gt;
&lt;br /&gt;
# [[Квадратурные_(кубатурные)_методы_численного_интегрирования_по_отрезку_(многомерному_кубу)#Математическое описание|Метод прямоугольников]]&lt;br /&gt;
# [[Квадратурные_(кубатурные)_методы_численного_интегрирования_по_отрезку_(многомерному_кубу)#Математическое описание|Метод трапеций]]&lt;br /&gt;
# [[Квадратурные_(кубатурные)_методы_численного_интегрирования_по_отрезку_(многомерному_кубу)#Математическое описание|Метод парабол (метод Симпсона)]]&lt;br /&gt;
# [[Квадратурные_(кубатурные)_методы_численного_интегрирования_по_отрезку_(многомерному_кубу)#Математическое описание|Метод Гаусса]]&lt;br /&gt;
&lt;br /&gt;
== Алгоритмы на графах ==&lt;br /&gt;
&lt;br /&gt;
# [[Алгоритм вычисления кратчайшего пути во взвешенном графе]]&lt;br /&gt;
# [[Алгоритм обхода графа]]&lt;br /&gt;
&lt;br /&gt;
== Алгоритмы поиска ==&lt;br /&gt;
&lt;br /&gt;
# [[Двоичный поиск - находит элемент в отсортированном списке]], &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Алгоритмы сортировки ==&lt;br /&gt;
&lt;br /&gt;
# [[Сортировка с помощью двоичного дерева]]&lt;br /&gt;
# [[Сортировка пузырьком]]&lt;br /&gt;
# [[Сортировка слиянием (последовательный и параллельный варианты)]]&lt;br /&gt;
&lt;br /&gt;
== Вычислительная геометрия ==&lt;br /&gt;
&lt;br /&gt;
# [[Поиск диаметра множества точек]]&lt;br /&gt;
# [[Построение выпуклой оболочки набора точек]]&lt;br /&gt;
# [[Триангуляция Делоне]]&lt;br /&gt;
# [[Диаграмма Вороного]]&lt;br /&gt;
# [[Принадлежность точки многоугольнику]]&lt;br /&gt;
# [[Пересечения выпуклых многоугольников]] - трудоёмкость &amp;lt;math&amp;gt;O(n_1 + n_2)&amp;lt;/math&amp;gt;&lt;br /&gt;
# [[Пересечение звёздных многоугольников]] - трудоёмкость &amp;lt;math&amp;gt;O(n_1 * n_2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Компьютерная графика ==&lt;br /&gt;
&lt;br /&gt;
# [[Алгоритмы построения отрезка - алгоритмы для аппроксимации отрезка на дискретной графической поверхности]]&lt;br /&gt;
# [[Алгоритм определения видимых частей трёхмерной сцены]]&lt;br /&gt;
# [[Трассировка лучей - рендеринг реалистичных изображений]]&lt;br /&gt;
# [[Глобальное освещение - рассматривает прямое освещение и отражение от других объектов]]&lt;br /&gt;
&lt;br /&gt;
== Криптографические алгоритмы ==&lt;br /&gt;
&lt;br /&gt;
== Нейронные сети ==&lt;br /&gt;
&lt;br /&gt;
== Алгоритмы оптимизации ==&lt;br /&gt;
&lt;br /&gt;
# [[Линейное программирование]]&lt;br /&gt;
# [[Симплекс-метод]]&lt;br /&gt;
# [[Метод ветвей и границ (последовательный и параллельный варианты)]]&lt;br /&gt;
# [[Генетические алгоритмы]]&lt;br /&gt;
# [[Муравьиные алгоритмы]]&lt;br /&gt;
# [[Комбинированные алгоритмы]]&lt;br /&gt;
# [[Нахождение экстремума функции]]&lt;br /&gt;
&lt;br /&gt;
== Алгоритмы теории игр ==&lt;br /&gt;
&lt;br /&gt;
== Алгоритмы моделирования квантовых систем ==&lt;br /&gt;
&lt;br /&gt;
=== Алгоритмы моделирования квантовых вычислений ===&lt;br /&gt;
#[[Однокубитное преобразование вектора-состояния]]&lt;br /&gt;
#[[Двухкубитное преобразование вектора-состояния]]&lt;br /&gt;
#[[Моделирование квантового преобразования Фурье]]&lt;br /&gt;
== Другие алгоритмы ==&lt;br /&gt;
&lt;br /&gt;
[[en:Algorithm classification]]&lt;/div&gt;</summary>
		<author><name>Chernyavskiy1</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%94%D0%B2%D1%83%D1%85%D0%BA%D1%83%D0%B1%D0%B8%D1%82%D0%BD%D0%BE%D0%B5_%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%B5_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0-%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F&amp;diff=878</id>
		<title>Двухкубитное преобразование вектора-состояния</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%94%D0%B2%D1%83%D1%85%D0%BA%D1%83%D0%B1%D0%B8%D1%82%D0%BD%D0%BE%D0%B5_%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%B5_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0-%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F&amp;diff=878"/>
		<updated>2015-01-22T12:56:59Z</updated>

		<summary type="html">&lt;p&gt;Chernyavskiy1: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
== Описание свойств и структуры алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм производит моделирование действия двухкубитного квантового вентиля на вектор-состояние. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
-Целочисленные параметры &amp;lt;math&amp;gt;n - &amp;lt;/math&amp;gt; число кубитов (необязательно) и &amp;lt;math&amp;gt;k,l -&amp;lt;/math&amp;gt; номера кубитов, над которым производится преобразование.&lt;br /&gt;
&lt;br /&gt;
-Комплексная матрица &amp;lt;math&amp;gt;U = {u_{ij}}= \begin{pmatrix}&lt;br /&gt;
u_{00}^{00} &amp;amp; u_{01}^{00} &amp;amp; u_{10}^{00} &amp;amp; u_{11}^{00}\\ &lt;br /&gt;
u_{00}^{01} &amp;amp; u_{01}^{01} &amp;amp; u_{10}^{01} &amp;amp; u_{11}^{01}\\ &lt;br /&gt;
u_{00}^{10} &amp;amp; u_{01}^{10} &amp;amp; u_{10}^{10} &amp;amp; u_{11}^{10}\\ &lt;br /&gt;
u_{00}^{11} &amp;amp; u_{01}^{11} &amp;amp; u_{10}^{11} &amp;amp; u_{11}^{11}&lt;br /&gt;
&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt; двухкубитного преобразования  размера &amp;lt;math&amp;gt;4 \times 4.&amp;lt;/math&amp;gt; Верхние и нижние двойные индексы обозначают бинарную запись индексов &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; (такие обозначения сильно упрощают дальнейшее описание).&lt;br /&gt;
&lt;br /&gt;
-Комплексный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;2^n,&amp;lt;/math&amp;gt; задающей начальное состояние многокубитной системы.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; комплексный вектор &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;2^n,&amp;lt;/math&amp;gt; соответствующий состоянию после преобразования.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Элементы итогового вектора записываются в следующем виде: &lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
w_{i_1i_2\ldots i_k \ldots i_l \ldots i_n} = \sum\limits_{j_k=0, j_l=0}^1 u^{j_k j_l}_{i_k i_l} v_{i_1i_2\ldots j_k \ldots j_l \ldots i_n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Индекс-кортеж &amp;lt;math&amp;gt;i_1i_2\ldots i_n&amp;lt;/math&amp;gt; представляет собой двоичную запись индекса элемента в массиве.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма представляет собой независимое вычисление всех &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; элементов вектора &amp;lt;math&amp;gt;w.&amp;lt;/math&amp;gt; Вычисление каждого элемента требует четыре операции умножения и три операцию сложения. Кроме того необходимо вычислять индексы типа &amp;lt;math&amp;gt;i_1i_2\ldots j_k \ldots j_l \ldots i_n,&amp;lt;/math&amp;gt; а также значение битов &amp;lt;math&amp;gt;j_k,j_l&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;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;2^n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычислить элементы &amp;lt;math&amp;gt;i_k, i_l&amp;lt;/math&amp;gt; двоичного представления индекса &amp;lt;math&amp;gt;i.&amp;lt;/math&amp;gt;&lt;br /&gt;
#Для всех четырех бинарных значений &amp;lt;math&amp;gt;j_k, j_l&amp;lt;/math&amp;gt; вычислить индексы  &amp;lt;math&amp;gt;i_1i_2\ldots j_k \ldots j_l \ldots i_n&amp;lt;/math&amp;gt;&lt;br /&gt;
#Просуммировать &amp;lt;math&amp;gt;u^{j_k j_l}_{i_k i_l} v_{i_1i_2\ldots j_k \ldots j_l \ldots i_n}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Алгоритм требует:&lt;br /&gt;
# &amp;lt;math&amp;gt;2^{n+2}&amp;lt;/math&amp;gt; операций умножения комплексных чисел;&lt;br /&gt;
# &amp;lt;math&amp;gt;3\dot 2^n&amp;lt;/math&amp;gt; операций сложения комплексных чисел;&lt;br /&gt;
# &amp;lt;math&amp;gt;2^{n+1}&amp;lt;/math&amp;gt; операций получения значения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-го бита числа;&lt;br /&gt;
# &amp;lt;math&amp;gt;2^{n+3}&amp;lt;/math&amp;gt; операций изменения значения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-го бита числа.&lt;br /&gt;
Отметим, что данный алгоритм обычно применяется много раз подряд, в связи с чем вычисления, связанные с побитовыми операциями (3-4), могут единожды проводиться в начале алгоритма. Кроме того, от них можно избавиться, пользуясь сложением и логическим умножением с числами &amp;lt;math&amp;gt;2^l,&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;2^k,&amp;lt;/math&amp;gt; которые сохраняется для всего алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Представим граф алгоритма для случая &amp;lt;math&amp;gt;n=3, k=1, l=2&amp;lt;/math&amp;gt;. На графах не представлены матрицы преобразования &amp;lt;math&amp;gt;U,&amp;lt;/math&amp;gt; в связи с тем, что их размер при больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; много меньше, нежели размеры входного и выходного векторов. Отметим, что структура графа (а именно обращение к входным данным) сильно зависит от параметров &amp;lt;math&amp;gt;k,l.&amp;lt;/math&amp;gt;&lt;br /&gt;
[[file:TwoQubitVectorTransform_v1.svg|thumb|center|800px|Граф алгоритма для &amp;lt;math&amp;gt;n=3, k=2, l=3&amp;lt;/math&amp;gt; без отображения матрицы преобразования &amp;lt;math&amp;gt;U.&amp;lt;/math&amp;gt; ]]&lt;br /&gt;
&lt;br /&gt;
=== Описание ресурса параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Описание входных и выходных данных ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Программная реализация ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Описание локальности данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
==== Описание локальности алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Описание локальности реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
===== Описание структуры обращений в память и качественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Chernyavskiy1</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%94%D0%B2%D1%83%D1%85%D0%BA%D1%83%D0%B1%D0%B8%D1%82%D0%BD%D0%BE%D0%B5_%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%B5_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0-%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F&amp;diff=877</id>
		<title>Двухкубитное преобразование вектора-состояния</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%94%D0%B2%D1%83%D1%85%D0%BA%D1%83%D0%B1%D0%B8%D1%82%D0%BD%D0%BE%D0%B5_%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%B5_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0-%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F&amp;diff=877"/>
		<updated>2015-01-22T12:47:41Z</updated>

		<summary type="html">&lt;p&gt;Chernyavskiy1: Новая страница: «  == Описание свойств и структуры алгоритма ==  === Общее описание алгоритма ===  Алгоритм про…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
== Описание свойств и структуры алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм производит моделирование действия двухкубитного квантового вентиля на вектор-состояние. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
-Целочисленные параметры &amp;lt;math&amp;gt;n - &amp;lt;/math&amp;gt; число кубитов (необязательно) и &amp;lt;math&amp;gt;k,l -&amp;lt;/math&amp;gt; номера кубитов, над которым производится преобразование.&lt;br /&gt;
&lt;br /&gt;
-Комплексная матрица &amp;lt;math&amp;gt;U = {u_{ij}}= \begin{pmatrix}&lt;br /&gt;
u_{00}^{00} &amp;amp; u_{01}^{00} &amp;amp; u_{10}^{00} &amp;amp; u_{11}^{00}\\ &lt;br /&gt;
u_{00}^{01} &amp;amp; u_{01}^{01} &amp;amp; u_{10}^{01} &amp;amp; u_{11}^{01}\\ &lt;br /&gt;
u_{00}^{10} &amp;amp; u_{01}^{10} &amp;amp; u_{10}^{10} &amp;amp; u_{11}^{10}\\ &lt;br /&gt;
u_{00}^{11} &amp;amp; u_{01}^{11} &amp;amp; u_{10}^{11} &amp;amp; u_{11}^{11}&lt;br /&gt;
&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt; двухкубитного преобразования  размера &amp;lt;math&amp;gt;4 \times 4.&amp;lt;/math&amp;gt; Верхние и нижние двойные индексы обозначают бинарную запись индексов &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; (такие обозначения сильно упрощают дальнейшее описание).&lt;br /&gt;
&lt;br /&gt;
-Комплексный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;2^n,&amp;lt;/math&amp;gt; задающей начальное состояние многокубитной системы.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; комплексный вектор &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;2^n,&amp;lt;/math&amp;gt; соответствующий состоянию после преобразования.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Элементы итогового вектора записываются в следующем виде: &lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
w_{i_1i_2\ldots i_k \ldots i_l \ldots i_n} = \sum\limits_{j_k=0, j_l=0}^1 u^{j_k j_l}_{i_k i_l} v_{i_1i_2\ldots j_k \ldots j_l \ldots i_n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Индекс-кортеж &amp;lt;math&amp;gt;i_1i_2\ldots i_n&amp;lt;/math&amp;gt; представляет собой двоичную запись индекса элемента в массиве.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма представляет собой независимое вычисление всех &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; элементов вектора &amp;lt;math&amp;gt;w.&amp;lt;/math&amp;gt; Вычисление каждого элемента требует четыре операции умножения и три операцию сложения. Кроме того необходимо вычислять индексы типа &amp;lt;math&amp;gt;i_1i_2\ldots j_k \ldots j_l \ldots i_n,&amp;lt;/math&amp;gt; а также значение битов &amp;lt;math&amp;gt;j_k,j_l&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;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;2^n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычислить элементы &amp;lt;math&amp;gt;i_k, i_l&amp;lt;/math&amp;gt; двоичного представления индекса &amp;lt;math&amp;gt;i.&amp;lt;/math&amp;gt;&lt;br /&gt;
#Для всех четырех бинарных значений &amp;lt;math&amp;gt;j_k, j_l&amp;lt;/math&amp;gt; вычислить индексы  &amp;lt;math&amp;gt;i_1i_2\ldots j_k \ldots j_l \ldots i_n&amp;lt;/math&amp;gt;&lt;br /&gt;
#Просуммировать &amp;lt;math&amp;gt;u^{j_k j_l}_{i_k i_l} v_{i_1i_2\ldots j_k \ldots j_l \ldots i_n}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Алгоритм требует:&lt;br /&gt;
# &amp;lt;math&amp;gt;2^{n+2}&amp;lt;/math&amp;gt; операций умножения комплексных чисел;&lt;br /&gt;
# &amp;lt;math&amp;gt;3\dot 2^n&amp;lt;/math&amp;gt; операций сложения комплексных чисел;&lt;br /&gt;
# &amp;lt;math&amp;gt;2^{n+1}&amp;lt;/math&amp;gt; операций получения значения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-го бита числа;&lt;br /&gt;
# &amp;lt;math&amp;gt;2^{n+3}&amp;lt;/math&amp;gt; операций изменения значения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-го бита числа.&lt;br /&gt;
Отметим, что данный алгоритм обычно применяется много раз подряд, в связи с чем вычисления, связанные с побитовыми операциями (3-4), могут единожды проводиться в начале алгоритма. Кроме того, от них можно избавиться, пользуясь сложением и логическим умножением с числами &amp;lt;math&amp;gt;2^l,&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;2^k,&amp;lt;/math&amp;gt; которые сохраняется для всего алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Представим рисунки графов алгоритма для случая &amp;lt;math&amp;gt;n=3, k=1-2&amp;lt;/math&amp;gt;. На графах не представлены матрицы преобразования &amp;lt;math&amp;gt;U,&amp;lt;/math&amp;gt; в связи с тем, что их размер при больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; много меньше, нежели размеры входного и выходного векторов. Отметим, что структура графа (а именно обращение к входным данным) сильно зависит от параметра &amp;lt;math&amp;gt;k.&amp;lt;/math&amp;gt;&lt;br /&gt;
[[file:OneQubitVectorTransform1.png|thumb|center|800px|Граф алгоритма для &amp;lt;math&amp;gt;n=3, k=1&amp;lt;/math&amp;gt; без отображения матрицы преобразования &amp;lt;math&amp;gt;U.&amp;lt;/math&amp;gt; ]]&lt;br /&gt;
[[file:OneQubitVectorTransform.png|thumb|center|800px|Граф алгоритма для &amp;lt;math&amp;gt;n=3, k=2&amp;lt;/math&amp;gt; без отображения матрицы преобразования &amp;lt;math&amp;gt;U.&amp;lt;/math&amp;gt; ]]&lt;br /&gt;
&lt;br /&gt;
=== Описание ресурса параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Описание входных и выходных данных ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Программная реализация ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Описание локальности данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
==== Описание локальности алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Описание локальности реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
===== Описание структуры обращений в память и качественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Chernyavskiy1</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B4%D0%BD%D0%BE%D0%BA%D1%83%D0%B1%D0%B8%D1%82%D0%BD%D0%BE%D0%B5_%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%B5_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0-%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F&amp;diff=818</id>
		<title>Однокубитное преобразование вектора-состояния</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B4%D0%BD%D0%BE%D0%BA%D1%83%D0%B1%D0%B8%D1%82%D0%BD%D0%BE%D0%B5_%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%B5_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0-%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F&amp;diff=818"/>
		<updated>2014-12-03T21:06:19Z</updated>

		<summary type="html">&lt;p&gt;Chernyavskiy1: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
== Описание свойств и структуры алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм производит моделирование действия однокубитного квантового вентиля на вектор-состояние. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Целочисленные параметры &amp;lt;math&amp;gt;n - &amp;lt;/math&amp;gt; число кубитов (необязательно) и &amp;lt;math&amp;gt;k -&amp;lt;/math&amp;gt; номер кубита, над которым производится преобразование.&lt;br /&gt;
&lt;br /&gt;
Комплексная матрица &amp;lt;math&amp;gt;U = \begin{pmatrix}&lt;br /&gt;
u_{00} &amp;amp; u_{01}\\ &lt;br /&gt;
u_{10} &amp;amp; u_{11}&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt; однокубитного преобразования  размера &amp;lt;math&amp;gt;2 \times 2.&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Комплексный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;2^n,&amp;lt;/math&amp;gt; задающей начальное состояние многокубитной системы.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; комплексный вектор &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;2^n,&amp;lt;/math&amp;gt; соответствующий состоянию после преобразования.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Состояние после действия преобразования &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;k-&amp;lt;/math&amp;gt;й кубит имеет вид &amp;lt;math&amp;gt;v_{out} = I_{2^{k-1}}\otimes U \otimes I_{2^{n-k}},&amp;lt;/math&amp;gt; где &amp;lt;math&amp;gt;I_{j} - &amp;lt;/math&amp;gt; единичная матрица размерности &amp;lt;math&amp;gt;j,&amp;lt;/math&amp;gt; а &amp;lt;math&amp;gt;\otimes - &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;
w_{i_1i_2\ldots i_k \ldots i_n} = \sum\limits_{j_k=0}^1 u_{i_k j} v_{i_1i_2\ldots j_k \ldots i_n} = u_{i_k 0} v_{i_1i_2\ldots 0_k \ldots i_n} + u_{i_k 1} v_{i_1i_2\ldots 1_k \ldots i_n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Индекс-кортеж &amp;lt;math&amp;gt;i_1i_2\ldots i_n&amp;lt;/math&amp;gt; представляет собой двоичную запись индекса элемента в массиве.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма представляет собой независимое вычисление всех &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; элементов вектора &amp;lt;math&amp;gt;w.&amp;lt;/math&amp;gt; Вычисление каждого элемента требует две операции умножения и одну операцию сложения. Кроме того необходимо вычислять индексы типа &amp;lt;math&amp;gt;i_1i_2\ldots 0_k \ldots i_n,&amp;lt;/math&amp;gt; а также значение бита &amp;lt;math&amp;gt;i_k,&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;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;2^n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычислить элемент &amp;lt;math&amp;gt;i_k&amp;lt;/math&amp;gt; двоичного представления индекса &amp;lt;math&amp;gt;i.&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_1i_2\ldots \overline{i_k} \ldots i_n,&amp;lt;/math&amp;gt; где крышка означает обращение бита.&lt;br /&gt;
#Вычислить &amp;lt;math&amp;gt;w_i = u_{i_k i_k}\cdot v_{i} + u_{i_k \overline{i_k}}\cdot v_j.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Алгоритм требует:&lt;br /&gt;
# &amp;lt;math&amp;gt;2^{n+1}&amp;lt;/math&amp;gt; операций умножения комплексных чисел;&lt;br /&gt;
# &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; операций сложения комплексных чисел;&lt;br /&gt;
# &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; операций получения значения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-го бита числа;&lt;br /&gt;
# &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; операций изменения значения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-го бита числа.&lt;br /&gt;
Отметим, что данный алгоритм обычно применяется много раз подряд, в связи с чем вычисления, связанные с побитовыми операциями (3-4), могут единожды проводиться в начале алгоритма. Кроме того, от них можно избавиться, пользуясь сложением и логическим умножением с числом &amp;lt;math&amp;gt;2^k,&amp;lt;/math&amp;gt; которое сохраняется для всего алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Представим рисунки графов алгоритма для случая &amp;lt;math&amp;gt;n=3, k=1-2&amp;lt;/math&amp;gt;. На графах не представлены матрицы преобразования &amp;lt;math&amp;gt;U,&amp;lt;/math&amp;gt; в связи с тем, что их размер при больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; много меньше, нежели размеры входного и выходного векторов. Отметим, что структура графа (а именно обращение к входным данным) сильно зависит от параметра &amp;lt;math&amp;gt;k.&amp;lt;/math&amp;gt;&lt;br /&gt;
[[file:OneQubitVectorTransform1.png|thumb|center|800px|Граф алгоритма для &amp;lt;math&amp;gt;n=3, k=1&amp;lt;/math&amp;gt; без отображения матрицы преобразования &amp;lt;math&amp;gt;U.&amp;lt;/math&amp;gt; ]]&lt;br /&gt;
[[file:OneQubitVectorTransform.png|thumb|center|800px|Граф алгоритма для &amp;lt;math&amp;gt;n=3, k=2&amp;lt;/math&amp;gt; без отображения матрицы преобразования &amp;lt;math&amp;gt;U.&amp;lt;/math&amp;gt; ]]&lt;br /&gt;
&lt;br /&gt;
=== Описание ресурса параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Описание входных и выходных данных ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Программная реализация ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Описание локальности данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
==== Описание локальности алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Описание локальности реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
===== Описание структуры обращений в память и качественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Chernyavskiy1</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:OneQubitVectorTransform1.png&amp;diff=816</id>
		<title>Файл:OneQubitVectorTransform1.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:OneQubitVectorTransform1.png&amp;diff=816"/>
		<updated>2014-12-03T21:02:04Z</updated>

		<summary type="html">&lt;p&gt;Chernyavskiy1: Информационный граф алгоритма однокубитного преобразования вектора-состояния, n=3, k=8.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Информационный граф алгоритма однокубитного преобразования вектора-состояния, n=3, k=8.&lt;/div&gt;</summary>
		<author><name>Chernyavskiy1</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B4%D0%BD%D0%BE%D0%BA%D1%83%D0%B1%D0%B8%D1%82%D0%BD%D0%BE%D0%B5_%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%B5_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0-%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F&amp;diff=808</id>
		<title>Однокубитное преобразование вектора-состояния</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B4%D0%BD%D0%BE%D0%BA%D1%83%D0%B1%D0%B8%D1%82%D0%BD%D0%BE%D0%B5_%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%B5_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0-%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F&amp;diff=808"/>
		<updated>2014-12-03T20:35:09Z</updated>

		<summary type="html">&lt;p&gt;Chernyavskiy1: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
== Описание свойств и структуры алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм производит моделирование действия однокубитного квантового вентиля на вектор-состояние. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Целочисленные параметры &amp;lt;math&amp;gt;n - &amp;lt;/math&amp;gt; число кубитов (необязательно) и &amp;lt;math&amp;gt;k -&amp;lt;/math&amp;gt; номер кубита, над которым производится преобразование.&lt;br /&gt;
&lt;br /&gt;
Комплексная матрица &amp;lt;math&amp;gt;U = \begin{pmatrix}&lt;br /&gt;
u_{00} &amp;amp; u_{01}\\ &lt;br /&gt;
u_{10} &amp;amp; u_{11}&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt; однокубитного преобразования  размера &amp;lt;math&amp;gt;2 \times 2.&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Комплексный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;2^n,&amp;lt;/math&amp;gt; задающей начальное состояние многокубитной системы.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; комплексный вектор &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;2^n,&amp;lt;/math&amp;gt; соответствующий состоянию после преобразования.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Состояние после действия преобразования &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;k-&amp;lt;/math&amp;gt;й кубит имеет вид &amp;lt;math&amp;gt;v_{out} = I_{2^{k-1}}\otimes U \otimes I_{2^{n-k}},&amp;lt;/math&amp;gt; где &amp;lt;math&amp;gt;I_{j} - &amp;lt;/math&amp;gt; единичная матрица размерности &amp;lt;math&amp;gt;j,&amp;lt;/math&amp;gt; а &amp;lt;math&amp;gt;\otimes - &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;
w_{i_1i_2\ldots i_k \ldots i_n} = \sum\limits_{j_k=0}^1 u_{i_k j} v_{i_1i_2\ldots j_k \ldots i_n} = u_{i_k 0} v_{i_1i_2\ldots 0_k \ldots i_n} + u_{i_k 1} v_{i_1i_2\ldots 1_k \ldots i_n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Индекс-кортеж &amp;lt;math&amp;gt;i_1i_2\ldots i_n&amp;lt;/math&amp;gt; представляет собой двоичную запись индекса элемента в массиве.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма представляет собой независимое вычисление всех &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; элементов вектора &amp;lt;math&amp;gt;w.&amp;lt;/math&amp;gt; Вычисление каждого элемента требует две операции умножения и одну операцию сложения. Кроме того необходимо вычислять индексы типа &amp;lt;math&amp;gt;i_1i_2\ldots 0_k \ldots i_n,&amp;lt;/math&amp;gt; а также значение бита &amp;lt;math&amp;gt;i_k,&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;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;2^n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычислить элемент &amp;lt;math&amp;gt;i_k&amp;lt;/math&amp;gt; двоичного представления индекса &amp;lt;math&amp;gt;i.&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_1i_2\ldots \overline{i_k} \ldots i_n,&amp;lt;/math&amp;gt; где крышка означает обращение бита.&lt;br /&gt;
#Вычислить &amp;lt;math&amp;gt;w_i = u_{i_k i_k}\cdot v_{i} + u_{i_k \overline{i_k}}\cdot v_j.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Алгоритм требует:&lt;br /&gt;
# &amp;lt;math&amp;gt;2^{n+1}&amp;lt;/math&amp;gt; операций умножения комплексных чисел;&lt;br /&gt;
# &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; операций сложения комплексных чисел;&lt;br /&gt;
# &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; операций получения значения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-го бита числа;&lt;br /&gt;
# &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; операций изменения значения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-го бита числа.&lt;br /&gt;
Отметим, что данный алгоритм обычно применяется много раз подряд, в связи с чем вычисления, связанные с побитовыми операциями (3-4), могут единожды проводиться в начале алгоритма. Кроме того, от них можно избавиться, пользуясь сложением и логическим умножением с числом &amp;lt;math&amp;gt;2^k,&amp;lt;/math&amp;gt; которое сохраняется для всего алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[file:OneQubitVectorTransform.png|thumb|center|800px|Граф алгоритма для &amp;lt;math&amp;gt;n=3, k=2&amp;lt;/math&amp;gt; без отображения матрицы преобразования &amp;lt;math&amp;gt;U.&amp;lt;/math&amp;gt; ]]&lt;br /&gt;
&lt;br /&gt;
=== Описание ресурса параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Описание входных и выходных данных ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Программная реализация ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Описание локальности данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
==== Описание локальности алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Описание локальности реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
===== Описание структуры обращений в память и качественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Chernyavskiy1</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B4%D0%BD%D0%BE%D0%BA%D1%83%D0%B1%D0%B8%D1%82%D0%BD%D0%BE%D0%B5_%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%B5_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0-%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F&amp;diff=807</id>
		<title>Однокубитное преобразование вектора-состояния</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B4%D0%BD%D0%BE%D0%BA%D1%83%D0%B1%D0%B8%D1%82%D0%BD%D0%BE%D0%B5_%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%B5_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0-%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F&amp;diff=807"/>
		<updated>2014-12-03T20:33:28Z</updated>

		<summary type="html">&lt;p&gt;Chernyavskiy1: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
== Описание свойств и структуры алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм производит моделирование действия однокубитного квантового вентиля на вектор-состояние. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Целочисленные параметры &amp;lt;math&amp;gt;n - &amp;lt;/math&amp;gt; число кубитов (необязательно) и &amp;lt;math&amp;gt;k -&amp;lt;/math&amp;gt; номер кубита, над которым производится преобразование.&lt;br /&gt;
&lt;br /&gt;
Комплексная матрица &amp;lt;math&amp;gt;U = \begin{pmatrix}&lt;br /&gt;
u_{00} &amp;amp; u_{01}\\ &lt;br /&gt;
u_{10} &amp;amp; u_{11}&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt; однокубитного преобразования  размера &amp;lt;math&amp;gt;2 \times 2.&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Комплексный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;2^n,&amp;lt;/math&amp;gt; задающей начальное состояние многокубитной системы.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; комплексный вектор &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;2^n,&amp;lt;/math&amp;gt; соответствующий состоянию после преобразования.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Состояние после действия преобразования &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;k-&amp;lt;/math&amp;gt;й кубит имеет вид &amp;lt;math&amp;gt;v_{out} = I_{2^{k-1}}\otimes U \otimes I_{2^{n-k}},&amp;lt;/math&amp;gt; где &amp;lt;math&amp;gt;I_{j} - &amp;lt;/math&amp;gt; единичная матрица размерности &amp;lt;math&amp;gt;j,&amp;lt;/math&amp;gt; а &amp;lt;math&amp;gt;\otimes - &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;
w_{i_1i_2\ldots i_k \ldots i_n} = \sum\limits_{j_k=0}^1 u_{i_k j} v_{i_1i_2\ldots j_k \ldots i_n} = u_{i_k 0} v_{i_1i_2\ldots 0_k \ldots i_n} + u_{i_k 1} v_{i_1i_2\ldots 1_k \ldots i_n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Индекс-кортеж &amp;lt;math&amp;gt;i_1i_2\ldots i_n&amp;lt;/math&amp;gt; представляет собой двоичную запись индекса элемента в массиве.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма представляет собой независимое вычисление всех &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; элементов вектора &amp;lt;math&amp;gt;w.&amp;lt;/math&amp;gt; Вычисление каждого элемента требует две операции умножения и одну операцию сложения. Кроме того необходимо вычислять индексы типа &amp;lt;math&amp;gt;i_1i_2\ldots 0_k \ldots i_n,&amp;lt;/math&amp;gt; а также значение бита &amp;lt;math&amp;gt;i_k,&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;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;2^n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычислить элемент &amp;lt;math&amp;gt;i_k&amp;lt;/math&amp;gt; двоичного представления индекса &amp;lt;math&amp;gt;i.&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_1i_2\ldots \overline{i_k} \ldots i_n,&amp;lt;/math&amp;gt; где крышка означает обращение бита.&lt;br /&gt;
#Вычислить &amp;lt;math&amp;gt;w_i = u_{i_k i_k}\cdot v_{i} + u_{i_k \overline{i_k}}\cdot v_j.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Алгоритм требует:&lt;br /&gt;
# &amp;lt;math&amp;gt;2^{n+1}&amp;lt;/math&amp;gt; операций умножения комплексных чисел;&lt;br /&gt;
# &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; операций сложения комплексных чисел;&lt;br /&gt;
# &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; операций получения значения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-го бита числа;&lt;br /&gt;
# &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; операций изменения значения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-го бита числа.&lt;br /&gt;
Отметим, что данный алгоритм обычно применяется много раз подряд, в связи с чем вычисления, связанные с побитовыми операциями (3-4), могут единожды проводиться в начале алгоритма. Кроме того, от них можно избавиться, пользуясь сложением и логическим умножением с числом &amp;lt;math&amp;gt;2^k,&amp;lt;/math&amp;gt; которое сохраняется для всего алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[file:OneQubitVectorTransform.png|thumb|center|800px|Граф алгоритма без отображения входных и выходных данных. SQ - вычисление квадратного корня, F - операция a-bc, Div - деление.]]&lt;br /&gt;
&lt;br /&gt;
=== Описание ресурса параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Описание входных и выходных данных ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Программная реализация ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Описание локальности данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
==== Описание локальности алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Описание локальности реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
===== Описание структуры обращений в память и качественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Chernyavskiy1</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:OneQubitVectorTransform.png&amp;diff=806</id>
		<title>Файл:OneQubitVectorTransform.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:OneQubitVectorTransform.png&amp;diff=806"/>
		<updated>2014-12-03T20:32:51Z</updated>

		<summary type="html">&lt;p&gt;Chernyavskiy1: Информационный граф алгоритма однокубитного преобразования вектора-состояния&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Информационный граф алгоритма однокубитного преобразования вектора-состояния&lt;/div&gt;</summary>
		<author><name>Chernyavskiy1</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:1q.png&amp;diff=805</id>
		<title>Файл:1q.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:1q.png&amp;diff=805"/>
		<updated>2014-12-03T20:21:16Z</updated>

		<summary type="html">&lt;p&gt;Chernyavskiy1: Информационный граф алгоритма однокубитного преобразования вектора-состояния&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Информационный граф алгоритма однокубитного преобразования вектора-состояния&lt;/div&gt;</summary>
		<author><name>Chernyavskiy1</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B4%D0%BD%D0%BE%D0%BA%D1%83%D0%B1%D0%B8%D1%82%D0%BD%D0%BE%D0%B5_%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%B5_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0-%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F&amp;diff=804</id>
		<title>Однокубитное преобразование вектора-состояния</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B4%D0%BD%D0%BE%D0%BA%D1%83%D0%B1%D0%B8%D1%82%D0%BD%D0%BE%D0%B5_%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%B5_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0-%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F&amp;diff=804"/>
		<updated>2014-12-03T19:05:19Z</updated>

		<summary type="html">&lt;p&gt;Chernyavskiy1: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
== Описание свойств и структуры алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм производит моделирование действия однокубитного квантового вентиля на вектор-состояние. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Целочисленные параметры &amp;lt;math&amp;gt;n - &amp;lt;/math&amp;gt; число кубитов (необязательно) и &amp;lt;math&amp;gt;k -&amp;lt;/math&amp;gt; номер кубита, над которым производится преобразование.&lt;br /&gt;
&lt;br /&gt;
Комплексная матрица &amp;lt;math&amp;gt;U = \begin{pmatrix}&lt;br /&gt;
u_{00} &amp;amp; u_{01}\\ &lt;br /&gt;
u_{10} &amp;amp; u_{11}&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt; однокубитного преобразования  размера &amp;lt;math&amp;gt;2 \times 2.&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Комплексный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;2^n,&amp;lt;/math&amp;gt; задающей начальное состояние многокубитной системы.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; комплексный вектор &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;2^n,&amp;lt;/math&amp;gt; соответствующий состоянию после преобразования.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Состояние после действия преобразования &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;k-&amp;lt;/math&amp;gt;й кубит имеет вид &amp;lt;math&amp;gt;v_{out} = I_{2^{k-1}}\otimes U \otimes I_{2^{n-k}},&amp;lt;/math&amp;gt; где &amp;lt;math&amp;gt;I_{j} - &amp;lt;/math&amp;gt; единичная матрица размерности &amp;lt;math&amp;gt;j,&amp;lt;/math&amp;gt; а &amp;lt;math&amp;gt;\otimes - &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;
w_{i_1i_2\ldots i_k \ldots i_n} = \sum\limits_{j_k=0}^1 u_{i_k j} v_{i_1i_2\ldots j_k \ldots i_n} = u_{i_k 0} v_{i_1i_2\ldots 0_k \ldots i_n} + u_{i_k 1} v_{i_1i_2\ldots 1_k \ldots i_n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Индекс-кортеж &amp;lt;math&amp;gt;i_1i_2\ldots i_n&amp;lt;/math&amp;gt; представляет собой двоичную запись индекса элемента в массиве.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма представляет собой независимое вычисление всех &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; элементов вектора &amp;lt;math&amp;gt;w.&amp;lt;/math&amp;gt; Вычисление каждого элемента требует две операции умножения и одну операцию сложения. Кроме того необходимо вычислять индексы типа &amp;lt;math&amp;gt;i_1i_2\ldots 0_k \ldots i_n,&amp;lt;/math&amp;gt; а также значение бита &amp;lt;math&amp;gt;i_k,&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;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;2^n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычислить элемент &amp;lt;math&amp;gt;i_k&amp;lt;/math&amp;gt; двоичного представления индекса &amp;lt;math&amp;gt;i.&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_1i_2\ldots \overline{i_k} \ldots i_n,&amp;lt;/math&amp;gt; где крышка означает обращение бита.&lt;br /&gt;
#Вычислить &amp;lt;math&amp;gt;w_i = u_{i_k i_k}\cdot v_{i} + u_{i_k \overline{i_k}}\cdot v_j.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Алгоритм требует:&lt;br /&gt;
# &amp;lt;math&amp;gt;2^{n+1}&amp;lt;/math&amp;gt; операций умножения комплексных чисел;&lt;br /&gt;
# &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; операций сложения комплексных чисел;&lt;br /&gt;
# &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; операций получения значения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-го бита числа;&lt;br /&gt;
# &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; операций изменения значения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-го бита числа.&lt;br /&gt;
Отметим, что данный алгоритм обычно применяется много раз подряд, в связи с чем вычисления, связанные с побитовыми операциями (3-4), могут единожды проводиться в начале алгоритма. Кроме того, от них можно избавиться, пользуясь сложением и логическим умножением с числом &amp;lt;math&amp;gt;2^k,&amp;lt;/math&amp;gt; которое сохраняется для всего алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Описание ресурса параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Описание входных и выходных данных ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Программная реализация ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Описание локальности данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
==== Описание локальности алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Описание локальности реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
===== Описание структуры обращений в память и качественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Chernyavskiy1</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B4%D0%BD%D0%BE%D0%BA%D1%83%D0%B1%D0%B8%D1%82%D0%BD%D0%BE%D0%B5_%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%B5_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0-%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F&amp;diff=803</id>
		<title>Однокубитное преобразование вектора-состояния</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B4%D0%BD%D0%BE%D0%BA%D1%83%D0%B1%D0%B8%D1%82%D0%BD%D0%BE%D0%B5_%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%B5_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0-%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F&amp;diff=803"/>
		<updated>2014-12-03T19:03:06Z</updated>

		<summary type="html">&lt;p&gt;Chernyavskiy1: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
== Описание свойств и структуры алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм производит моделирование действия однокубитного квантового вентиля на вектор-состояние. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Целочисленные параметры &amp;lt;math&amp;gt;n - &amp;lt;/math&amp;gt; число кубитов (необязательно) и &amp;lt;math&amp;gt;k -&amp;lt;/math&amp;gt; номер кубита, над которым производится преобразование.&lt;br /&gt;
&lt;br /&gt;
Комплексная матрица &amp;lt;math&amp;gt;U = \begin{pmatrix}&lt;br /&gt;
u_{00} &amp;amp; u_{01}\\ &lt;br /&gt;
u_{10} &amp;amp; u_{11}&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt; однокубитного преобразования  размера &amp;lt;math&amp;gt;2 \times 2.&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Комплексный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;2^n,&amp;lt;/math&amp;gt; задающей начальное состояние многокубитной системы.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; комплексный вектор &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;2^n,&amp;lt;/math&amp;gt; соответствующий состоянию после преобразования.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Состояние после действия преобразования &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;k-&amp;lt;/math&amp;gt;й кубит имеет вид &amp;lt;math&amp;gt;v_{out} = I_{2^{k-1}}\otimes U \otimes I_{2^{n-k}},&amp;lt;/math&amp;gt; где &amp;lt;math&amp;gt;I_{j} - &amp;lt;/math&amp;gt; единичная матрица размерности &amp;lt;math&amp;gt;j,&amp;lt;/math&amp;gt; а &amp;lt;math&amp;gt;\otimes - &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;
w_{i_1i_2\ldots i_k \ldots i_n} = \sum\limits_{j_k=0}^1 u_{i_k j} v_{i_1i_2\ldots j_k \ldots i_n} = u_{i_k 0} v_{i_1i_2\ldots 0_k \ldots i_n} + u_{i_k 1} v_{i_1i_2\ldots 1_k \ldots i_n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Индекс-кортеж &amp;lt;math&amp;gt;i_1i_2\ldots i_n&amp;lt;/math&amp;gt; представляет собой двоичную запись индекса элемента в массиве.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма представляет собой независимое вычисление всех &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; элементов вектора &amp;lt;math&amp;gt;w.&amp;lt;/math&amp;gt; Вычисление каждого элемента требует две операции умножения и одну операцию сложения. Кроме того необходимо вычислять индексы типа &amp;lt;math&amp;gt;i_1i_2\ldots 0_k \ldots i_n,&amp;lt;/math&amp;gt; а также значение бита &amp;lt;math&amp;gt;i_k,&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;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;2^n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычислить элемент &amp;lt;math&amp;gt;i_k&amp;lt;/math&amp;gt; двоичного представления индекса &amp;lt;math&amp;gt;i.&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_1i_2\ldots \overline{i_k} \ldots i_n,&amp;lt;/math&amp;gt; где крышка означает обращение бита.&lt;br /&gt;
#Вычислить &amp;lt;math&amp;gt;w_i = u_{i_k i_k}\cdot v_{i} + u_{i_k \overline{i_k}}\cdot v_j.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Алгоритм требует:&lt;br /&gt;
# &amp;lt;math&amp;gt;2^{n+1}&amp;lt;/math&amp;gt; операций умножения комплексных чисел;&lt;br /&gt;
# &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; операций сложения комплексных чисел;&lt;br /&gt;
# &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; операций получения значения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-го бита числа;&lt;br /&gt;
# &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; операций изменения значения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-го бита числа.&lt;br /&gt;
Отметим, что данный алгоритм обычно применяется много раз подряд, в связи с чем вычисления, связанные с побитовыми операциями (3-4), могут единожды вычисляться в начале алгоритма. Кроме того, от них можно избавиться пользуясь сложением и побитовым умножением с числом &amp;lt;math&amp;gt;2^k,&amp;lt;/math&amp;gt; которое сохраняется для всего алгоритма.     &lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Описание ресурса параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Описание входных и выходных данных ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Программная реализация ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Описание локальности данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
==== Описание локальности алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Описание локальности реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
===== Описание структуры обращений в память и качественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Chernyavskiy1</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B4%D0%BD%D0%BE%D0%BA%D1%83%D0%B1%D0%B8%D1%82%D0%BD%D0%BE%D0%B5_%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%B5_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0-%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F&amp;diff=802</id>
		<title>Однокубитное преобразование вектора-состояния</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B4%D0%BD%D0%BE%D0%BA%D1%83%D0%B1%D0%B8%D1%82%D0%BD%D0%BE%D0%B5_%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%B5_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0-%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F&amp;diff=802"/>
		<updated>2014-12-03T18:42:54Z</updated>

		<summary type="html">&lt;p&gt;Chernyavskiy1: /* Описание схемы реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
== Описание свойств и структуры алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм производит моделирование действия однокубитного квантового вентиля на вектор-состояние. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Целочисленные параметры &amp;lt;math&amp;gt;n - &amp;lt;/math&amp;gt; число кубитов (необязательно) и &amp;lt;math&amp;gt;k -&amp;lt;/math&amp;gt; номер кубита, над которым производится преобразование.&lt;br /&gt;
&lt;br /&gt;
Комплексная матрица &amp;lt;math&amp;gt;U = \begin{pmatrix}&lt;br /&gt;
u_{00} &amp;amp; u_{01}\\ &lt;br /&gt;
u_{10} &amp;amp; u_{11}&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt; однокубитного преобразования  размера &amp;lt;math&amp;gt;2 \times 2.&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Комплексный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;2^n,&amp;lt;/math&amp;gt; задающей начальное состояние многокубитной системы.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; комплексный вектор &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;2^n,&amp;lt;/math&amp;gt; соответствующий состоянию после преобразования.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Состояние после действия преобразования &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;k-&amp;lt;/math&amp;gt;й кубит имеет вид &amp;lt;math&amp;gt;v_{out} = I_{2^{k-1}}\otimes U \otimes I_{2^{n-k}},&amp;lt;/math&amp;gt; где &amp;lt;math&amp;gt;I_{j} - &amp;lt;/math&amp;gt; единичная матрица размерности &amp;lt;math&amp;gt;j,&amp;lt;/math&amp;gt; а &amp;lt;math&amp;gt;\otimes - &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;
w_{i_1i_2\ldots i_k \ldots i_n} = \sum\limits_{j_k=0}^1 u_{i_k j} v_{i_1i_2\ldots j_k \ldots i_n} = u_{i_k 0} v_{i_1i_2\ldots 0_k \ldots i_n} + u_{i_k 1} v_{i_1i_2\ldots 1_k \ldots i_n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Индекс-кортеж &amp;lt;math&amp;gt;i_1i_2\ldots i_n&amp;lt;/math&amp;gt; представляет собой двоичную запись индекса элемента в массиве.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма представляет собой независимое вычисление всех &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; элементов вектора &amp;lt;math&amp;gt;w.&amp;lt;/math&amp;gt; Вычисление каждого элемента требует две операции умножения и одну операцию сложения. Кроме того необходимо вычислять индексы типа &amp;lt;math&amp;gt;i_1i_2\ldots 0_k \ldots i_n,&amp;lt;/math&amp;gt; а также значение бита &amp;lt;math&amp;gt;i_k,&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;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;2^n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычислить элемент &amp;lt;math&amp;gt;i_k&amp;lt;/math&amp;gt; двоичного представления индекса &amp;lt;math&amp;gt;i.&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_1i_2\ldots \overline{i_k} \ldots i_n,&amp;lt;/math&amp;gt; где крышка означает обращение бита.&lt;br /&gt;
#Вычислить &amp;lt;math&amp;gt;w_i = u_{i_k i_k}\cdot v_{i} + u_{i_k \overline{i_k}}\cdot v_j.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Описание ресурса параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Описание входных и выходных данных ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Программная реализация ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Описание локальности данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
==== Описание локальности алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Описание локальности реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
===== Описание структуры обращений в память и качественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Chernyavskiy1</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B4%D0%BD%D0%BE%D0%BA%D1%83%D0%B1%D0%B8%D1%82%D0%BD%D0%BE%D0%B5_%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%B5_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0-%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F&amp;diff=801</id>
		<title>Однокубитное преобразование вектора-состояния</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B4%D0%BD%D0%BE%D0%BA%D1%83%D0%B1%D0%B8%D1%82%D0%BD%D0%BE%D0%B5_%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%B5_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0-%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F&amp;diff=801"/>
		<updated>2014-12-03T18:09:31Z</updated>

		<summary type="html">&lt;p&gt;Chernyavskiy1: /* Макроструктура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
== Описание свойств и структуры алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм производит моделирование действия однокубитного квантового вентиля на вектор-состояние. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Целочисленные параметры &amp;lt;math&amp;gt;n - &amp;lt;/math&amp;gt; число кубитов (необязательно) и &amp;lt;math&amp;gt;k -&amp;lt;/math&amp;gt; номер кубита, над которым производится преобразование.&lt;br /&gt;
&lt;br /&gt;
Комплексная матрица &amp;lt;math&amp;gt;U = \begin{pmatrix}&lt;br /&gt;
u_{00} &amp;amp; u_{01}\\ &lt;br /&gt;
u_{10} &amp;amp; u_{11}&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt; однокубитного преобразования  размера &amp;lt;math&amp;gt;2 \times 2.&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Комплексный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;2^n,&amp;lt;/math&amp;gt; задающей начальное состояние многокубитной системы.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; комплексный вектор &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;2^n,&amp;lt;/math&amp;gt; соответствующий состоянию после преобразования.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Состояние после действия преобразования &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;k-&amp;lt;/math&amp;gt;й кубит имеет вид &amp;lt;math&amp;gt;v_{out} = I_{2^{k-1}}\otimes U \otimes I_{2^{n-k}},&amp;lt;/math&amp;gt; где &amp;lt;math&amp;gt;I_{j} - &amp;lt;/math&amp;gt; единичная матрица размерности &amp;lt;math&amp;gt;j,&amp;lt;/math&amp;gt; а &amp;lt;math&amp;gt;\otimes - &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;
w_{i_1i_2\ldots i_k \ldots i_n} = \sum\limits_{j_k=0}^1 u_{i_k j} v_{i_1i_2\ldots j_k \ldots i_n} = u_{i_k 0} v_{i_1i_2\ldots 0_k \ldots i_n} + u_{i_k 1} v_{i_1i_2\ldots 1_k \ldots i_n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Индекс-кортеж &amp;lt;math&amp;gt;i_1i_2\ldots i_n&amp;lt;/math&amp;gt; представляет собой двоичную запись индекса элемента в массиве.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма представляет собой независимое вычисление всех &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; элементов вектора &amp;lt;math&amp;gt;w.&amp;lt;/math&amp;gt; Вычисление каждого элемента требует две операции умножения и одну операцию сложения. Кроме того необходимо вычислять индексы типа &amp;lt;math&amp;gt;i_1i_2\ldots 0_k \ldots i_n,&amp;lt;/math&amp;gt; а также значение бита &amp;lt;math&amp;gt;i_k,&amp;lt;/math&amp;gt; что требует побитовых операций.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как записано и в [[#Вычислительное ядро алгоритма|описании ядра алгоритма]], основную часть метода составляют независимые вычсиления элементов выходного вектора.&lt;br /&gt;
&lt;br /&gt;
=== Описание схемы реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Описание ресурса параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Описание входных и выходных данных ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Программная реализация ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Описание локальности данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
==== Описание локальности алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Описание локальности реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
===== Описание структуры обращений в память и качественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Chernyavskiy1</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B4%D0%BD%D0%BE%D0%BA%D1%83%D0%B1%D0%B8%D1%82%D0%BD%D0%BE%D0%B5_%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%B5_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0-%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F&amp;diff=736</id>
		<title>Однокубитное преобразование вектора-состояния</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B4%D0%BD%D0%BE%D0%BA%D1%83%D0%B1%D0%B8%D1%82%D0%BD%D0%BE%D0%B5_%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%B5_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0-%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F&amp;diff=736"/>
		<updated>2014-11-19T00:28:34Z</updated>

		<summary type="html">&lt;p&gt;Chernyavskiy1: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
== Описание свойств и структуры алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм производит моделирование действия однокубитного квантового вентиля на вектор-состояние. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Целочисленные параметры &amp;lt;math&amp;gt;n - &amp;lt;/math&amp;gt; число кубитов (необязательно) и &amp;lt;math&amp;gt;k -&amp;lt;/math&amp;gt; номер кубита, над которым производится преобразование.&lt;br /&gt;
&lt;br /&gt;
Комплексная матрица &amp;lt;math&amp;gt;U = \begin{pmatrix}&lt;br /&gt;
u_{00} &amp;amp; u_{01}\\ &lt;br /&gt;
u_{10} &amp;amp; u_{11}&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt; однокубитного преобразования  размера &amp;lt;math&amp;gt;2 \times 2.&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Комплексный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;2^n,&amp;lt;/math&amp;gt; задающей начальное состояние многокубитной системы.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; комплексный вектор &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;2^n,&amp;lt;/math&amp;gt; соответствующий состоянию после преобразования.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Состояние после действия преобразования &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;k-&amp;lt;/math&amp;gt;й кубит имеет вид &amp;lt;math&amp;gt;v_{out} = I_{2^{k-1}}\otimes U \otimes I_{2^{n-k}},&amp;lt;/math&amp;gt; где &amp;lt;math&amp;gt;I_{j} - &amp;lt;/math&amp;gt; единичная матрица размерности &amp;lt;math&amp;gt;j,&amp;lt;/math&amp;gt; а &amp;lt;math&amp;gt;\otimes - &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;
w_{i_1i_2\ldots i_k \ldots i_n} = \sum\limits_{j_k=0}^1 u_{i_k j} v_{i_1i_2\ldots j_k \ldots i_n} = u_{i_k 0} v_{i_1i_2\ldots 0_k \ldots i_n} + u_{i_k 1} v_{i_1i_2\ldots 1_k \ldots i_n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Индекс-кортеж &amp;lt;math&amp;gt;i_1i_2\ldots i_n&amp;lt;/math&amp;gt; представляет собой двоичную запись индекса элемента в массиве.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма представляет собой независимое вычисление всех &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; элементов вектора &amp;lt;math&amp;gt;w.&amp;lt;/math&amp;gt; Вычисление каждого элемента требует две операции умножения и одну операцию сложения. Кроме того необходимо вычислять индексы типа &amp;lt;math&amp;gt;i_1i_2\ldots 0_k \ldots i_n,&amp;lt;/math&amp;gt; а также значение бита &amp;lt;math&amp;gt;i_k,&amp;lt;/math&amp;gt; что требует побитовых операций.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Описание схемы реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Описание ресурса параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Описание входных и выходных данных ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Программная реализация ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Описание локальности данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
==== Описание локальности алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Описание локальности реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
===== Описание структуры обращений в память и качественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Chernyavskiy1</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B4%D0%BD%D0%BE%D0%BA%D1%83%D0%B1%D0%B8%D1%82%D0%BD%D0%BE%D0%B5_%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%B5_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0-%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F&amp;diff=735</id>
		<title>Однокубитное преобразование вектора-состояния</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B4%D0%BD%D0%BE%D0%BA%D1%83%D0%B1%D0%B8%D1%82%D0%BD%D0%BE%D0%B5_%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%B5_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0-%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F&amp;diff=735"/>
		<updated>2014-11-19T00:26:32Z</updated>

		<summary type="html">&lt;p&gt;Chernyavskiy1: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
== Описание свойств и структуры алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм производит моделирование действия однокубитного квантового вентиля на вектор-состояние. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: &lt;br /&gt;
Целочисленные параметры &amp;lt;math&amp;gt;n - &amp;lt;/math&amp;gt; число кубитов (необязательно) и &amp;lt;math&amp;gt;k -&amp;lt;/math&amp;gt; номер кубита, над которым производится преобразование.&lt;br /&gt;
Комплексная матрица &amp;lt;math&amp;gt;U = \begin{pmatrix}&lt;br /&gt;
u_{00} &amp;amp; u_{01}\\ &lt;br /&gt;
u_{10} &amp;amp; u_{11}&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt; однокубитного преобразования  размера &amp;lt;math&amp;gt;2 \times 2.&amp;lt;/math&amp;gt; &lt;br /&gt;
Комплексный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;2^n,&amp;lt;/math&amp;gt; задающей начальное состояние многокубитной системы.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: комплексный вектор &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;2^n,&amp;lt;/math&amp;gt; соответствующий состоянию после преобразования.&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
&lt;br /&gt;
Состояние после действия преобразования &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;k-&amp;lt;/math&amp;gt;й кубит имеет вид &amp;lt;math&amp;gt;v_{out} = I_{2^{k-1}}\otimes U \otimes I_{2^{n-k}},&amp;lt;/math&amp;gt; где &amp;lt;math&amp;gt;I_{j} - &amp;lt;/math&amp;gt; единичная матрица размерности &amp;lt;math&amp;gt;j,&amp;lt;/math&amp;gt; а &amp;lt;math&amp;gt;\otimes - &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;
w_{i_1i_2\ldots \i_k \ldots i_n} = \sum\limits_{j_k=0}^1 u_{i_k j} v_{i_1i_2\ldots j_k \ldots i_n} = u_{i_k 0} v_{i_1i_2\ldots 0_k \ldots i_n} + u_{i_k 1} v_{i_1i_2\ldots 1_k \ldots i_n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Индекс-кортеж &amp;lt;math&amp;gt;i_1i_2\ldots i_n&amp;lt;/math&amp;gt; представляет собой двоичную запись индекса элемента в массиве.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма представляет собой независимое вычисление всех &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; элементов вектора &amp;lt;math&amp;gt;w.&amp;lt;/math&amp;gt; Вычисление каждого элемента требует две операции умножения и одну операцию сложения. Кроме того необходимо вычислять индексы типа &amp;lt;math&amp;gt;i_1i_2\ldots 0_k \ldots i_n,&amp;lt;/math&amp;gt; а также значение бита &amp;lt;math&amp;gt;i_k,&amp;lt;/math&amp;gt; что требует побитовых операций.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Описание схемы реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Описание ресурса параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Описание входных и выходных данных ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Программная реализация ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Описание локальности данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
==== Описание локальности алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Описание локальности реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
===== Описание структуры обращений в память и качественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Chernyavskiy1</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B4%D0%BD%D0%BE%D0%BA%D1%83%D0%B1%D0%B8%D1%82%D0%BD%D0%BE%D0%B5_%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%B5_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0-%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F&amp;diff=734</id>
		<title>Однокубитное преобразование вектора-состояния</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B4%D0%BD%D0%BE%D0%BA%D1%83%D0%B1%D0%B8%D1%82%D0%BD%D0%BE%D0%B5_%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%B5_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0-%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F&amp;diff=734"/>
		<updated>2014-11-19T00:12:02Z</updated>

		<summary type="html">&lt;p&gt;Chernyavskiy1: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
== Описание свойств и структуры алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм производит моделирование действия однокубитного квантового вентиля на вектор-состояние. &lt;br /&gt;
&lt;br /&gt;
==== Математическая формулировка ====&lt;br /&gt;
Состояние &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; кубитов задается комплексным вектором &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;2^n.&amp;lt;/math&amp;gt; Однокубитная операция задается комплексной унитарной матрицей &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;2 \times 2.&amp;lt;/math&amp;gt; Состояние после действия преобразования &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;k-&amp;lt;/math&amp;gt;й кубит имеет вид &amp;lt;math&amp;gt;v_{out} = I_{2^{k-1}}\otimes U \otimes I_{2^{n-k}},&amp;lt;/math&amp;gt; где &amp;lt;math&amp;gt;I_{j} - &amp;lt;/math&amp;gt; единичная матрица размерности &amp;lt;math&amp;gt;j,&amp;lt;/math&amp;gt; а &amp;lt;math&amp;gt;\otimes - &amp;lt;/math&amp;gt; тензорное произведение (произведение Кронекера).&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: &lt;br /&gt;
Целочисленные параметры &amp;lt;math&amp;gt;n - &amp;lt;/math&amp;gt; число кубитов (необязательно) и &amp;lt;math&amp;gt;k -&amp;lt;/math&amp;gt; номер кубита, над которым производится преобразование.&lt;br /&gt;
Комплексная матрица преобразования &amp;lt;math&amp;gt;U=\begin{pmatrix}&lt;br /&gt;
u_{00} &amp;amp; u_{01}\\ &lt;br /&gt;
u_{10} &amp;amp; u_{11}&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;2 \times 2.&amp;lt;/math&amp;gt; &lt;br /&gt;
Исходный комплексный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;2^n.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: комплексный вектор &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;2^n,&amp;lt;/math&amp;gt; соответствующий состоянию после преобразования.&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
w_{i_1i_2\ldots \i_k \ldots i_n} = \sum\limits_{j_k=0}^1 u_{i_k j} v_{i_1i_2\ldots j_k \ldots i_n} = u_{i_k 0} v_{i_1i_2\ldots 0_k \ldots i_n} + u_{i_k 1} v_{i_1i_2\ldots 1_k \ldots i_n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Индекс-кортеж &amp;lt;math&amp;gt;i_1i_2\ldots i_n&amp;lt;/math&amp;gt; представляет собой двоичную запись индекса элемента в массиве.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма представляет собой независимое вычисление всех &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; элементов вектора &amp;lt;math&amp;gt;w.&amp;lt;/math&amp;gt; Вычисление каждого элемента требует две операции умножения и одну операцию сложения. Кроме того необходимо вычислять индексы типа &amp;lt;math&amp;gt;i_1i_2\ldots 0_k \ldots i_n,&amp;lt;/math&amp;gt; а также значение бита &amp;lt;math&amp;gt;i_k,&amp;lt;/math&amp;gt; что требует побитовых операций.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Описание схемы реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Описание ресурса параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Описание входных и выходных данных ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Программная реализация ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Описание локальности данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
==== Описание локальности алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Описание локальности реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
===== Описание структуры обращений в память и качественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Chernyavskiy1</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B4%D0%BD%D0%BE%D0%BA%D1%83%D0%B1%D0%B8%D1%82%D0%BD%D0%BE%D0%B5_%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%B5_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0-%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F&amp;diff=733</id>
		<title>Однокубитное преобразование вектора-состояния</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B4%D0%BD%D0%BE%D0%BA%D1%83%D0%B1%D0%B8%D1%82%D0%BD%D0%BE%D0%B5_%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%B5_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0-%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F&amp;diff=733"/>
		<updated>2014-11-18T23:58:37Z</updated>

		<summary type="html">&lt;p&gt;Chernyavskiy1: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
== Описание свойств и структуры алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм производит моделирование действия однокубитного квантового вентиля на вектор-состояние. &lt;br /&gt;
&lt;br /&gt;
==== Математическая формулировка ====&lt;br /&gt;
Состояние &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; кубитов задается комплексным вектором &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;2^n.&amp;lt;/math&amp;gt; Однокубитная операция задается комплексной унитарной матрицей &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;2 \times 2.&amp;lt;/math&amp;gt; Состояние после действия преобразования &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;k-&amp;lt;/math&amp;gt;й кубит имеет вид &amp;lt;math&amp;gt;v_{out} = I_{2^{k-1}}\otimes U \otimes I_{2^{n-k}},&amp;lt;/math&amp;gt; где &amp;lt;math&amp;gt;I_{j} - &amp;lt;/math&amp;gt; единичная матрица размерности &amp;lt;math&amp;gt;j,&amp;lt;/math&amp;gt; а &amp;lt;math&amp;gt;\otimes - &amp;lt;/math&amp;gt; тензорное произведение (произведение Кронекера).&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: &lt;br /&gt;
Целочисленные параметры &amp;lt;math&amp;gt;n - &amp;lt;/math&amp;gt; число кубитов (необязательно) и &amp;lt;math&amp;gt;k -&amp;lt;/math&amp;gt; номер кубита, над которым производится преобразование.&lt;br /&gt;
Комплексная матрица преобразования &amp;lt;math&amp;gt;U=\begin{pmatrix}&lt;br /&gt;
u_{00} &amp;amp; u_{01}\\ &lt;br /&gt;
u_{10} &amp;amp; u_{11}&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;2 \times 2.&amp;lt;/math&amp;gt; &lt;br /&gt;
Исходный комплексный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;2^n.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: комплексный вектор &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;2^n,&amp;lt;/math&amp;gt; соответствующий состоянию после преобразования.&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
w_{i_1i_2\ldots i_n} = \sum\limits_{j=0}^1 u_{i_k j} v_{i_1i_2\ldots j_k \ldots i_n} = u_{i_k 0} v_{i_1i_2\ldots 0_k \ldots i_n} + u_{i_k 1} v_{i_1i_2\ldots 1_k \ldots i_n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Индекс-кортеж &amp;lt;math&amp;gt;i_1i_2\ldots i_n&amp;lt;/math&amp;gt; представляет собой двоичную запись индекса элемента в массиве.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии метода Холецкого можно составить из множественных (всего их &amp;lt;math&amp;gt;\frac{n (n - 1)}{2}&amp;lt;/math&amp;gt;) вычислений скалярных произведений строк матрицы:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;\sum_{p = 1}^{i - 1} l_{ip} l_{jp}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
в режиме накопления или без него, в зависимости от требований задачи. В отечественных реализациях, даже в последовательных, упомянутый способ представления не используется. Дело в том, что даже в этих реализациях метода вычисление сумм типа&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;a_{ji} - \sum_{p = 1}^{i - 1} l_{ip} l_{jp}&amp;lt;/math&amp;gt;&amp;lt;nowiki/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
в которых и встречаются скалярные произведения, ведутся не в порядке «вычислили скалярное произведение, а потом вычли его из элемента», а путём вычитания из элемента покомпонентных произведений, являющихся частями скалярных произведений. Поэтому следует считать вычислительным ядром метода не вычисления скалярных произведений, а вычисления выражений&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;a_{ji} - \sum_{p = 1}^{i - 1} l_{ip} l_{jp}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
в &#039;&#039;режиме накопления&#039;&#039; или без него.&lt;br /&gt;
&lt;br /&gt;
Тем не менее, в популярных зарубежных реализациях точечного метода Холецкого, в частности, в библиотеках LINPACK и LAPACK, основанных на BLAS, используются именно вычисления скалярных произведений в виде вызова соответствующих подпрограмм BLAS (конкретно — функции SDOT). На последовательном уровне это влечёт за собой дополнительную операцию суммирования на каждый из &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt; вычисляемый элемент матрицы &amp;lt;math&amp;gt;L&amp;lt;/math&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;a_{ji}-\sum_{p=1}^{i-1}l_{ip} l_{jp}&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;
1. &amp;lt;math&amp;gt;l_{11}= \sqrt{a_{11}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;l_{j1}= \frac{a_{j1}}{l_{11}}&amp;lt;/math&amp;gt; (при &amp;lt;math&amp;gt;j&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;
&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;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;l_{ii} = \sqrt{a_{ii} - \sum_{p = 1}^{i - 1} l_{ip}^2}&amp;lt;/math&amp;gt; и&lt;br /&gt;
&lt;br /&gt;
4. (кроме &amp;lt;math&amp;gt;i = n&amp;lt;/math&amp;gt;): &amp;lt;nowiki/&amp;gt;&amp;lt;math&amp;gt;l_{ji} = \left (a_{ji} - \sum_{p = 1}^{i - 1} l_{ip} l_{jp} \right ) / l_{ii}&amp;lt;/math&amp;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;
После этого (если &amp;lt;math&amp;gt;i &amp;lt; n&amp;lt;/math&amp;gt;) происходит переход к шагу 3 с бо́льшим &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Особо отметим, что вычисления сумм вида &amp;lt;math&amp;gt;a_{ji} - \sum_{p = 1}^{i - 1} l_{ip} l_{jp}&amp;lt;/math&amp;gt; в обеих формулах производят в режиме накопления вычитанием из &amp;lt;math&amp;gt;a_{ji}&amp;lt;/math&amp;gt; произведений &amp;lt;math&amp;gt;l_{ip} l_{jp}&amp;lt;/math&amp;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;, c нарастанием &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для разложения матрицы порядка n методом Холецкого в последовательном (наиболее быстром) варианте требуется:&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;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* по &amp;lt;math&amp;gt;\frac{n^3-n}{6}&amp;lt;/math&amp;gt; умножений и сложений (вычитаний) — &#039;&#039;основная часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
При этом использование режима накопления требует совершения умножений и вычитаний в режиме двойной точности (или использования функции вроде DPROD в Фортране), что ещё больше увеличивает долю умножений и сложений/вычитаний во времени, требуемом для выполнения метода Холецкого.&lt;br /&gt;
&lt;br /&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;
&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;
Описанный граф можно посмотреть на рисунке, выполненном для случая &amp;lt;math&amp;gt;n = 4&amp;lt;/math&amp;gt;. Здесь вершины первой группы обозначены жёлтым цветом и буквосочетанием sq, вершины второй — зелёным цветом и знаком деления, третьей — красным цветом и буквой f. Вершины, соответствующие операциям, производящим выходные данные алгоритма, выполнены более крупно. Дублирующие друг друга дуги даны как одна. На первом изображении показан граф алгоритма согласно классическому определению , на втором к графу алгоритма добавлены вершины , соответствующие входным данным ( обозначены синим цветом ) и выходным данным ( обозначены розовым цветом ).&lt;br /&gt;
&lt;br /&gt;
[[file:Cholesky full.png|thumb|center|1400px|Граф алгоритма без отображения входных и выходных данных. SQ - вычисление квадратного корня, F - операция a-bc, Div - деление.]]&lt;br /&gt;
[[file:Cholesky full_in_out.png|thumb|center|1400px|Граф алгоритма с отображением входных и выходных данных. SQ - вычисление квадратного корня, F - операция a-bc, Div - деление, In - входные данные, Out - результаты.]]&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&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;
Таким образом, в параллельном варианте, в отличие от последовательного, вычисления квадратных корней и делений будут определять довольно значительную долю требуемого времени. При реализации на конкретных архитектурах наличие в отдельных ярусах [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] отдельных вычислений квадратных корней может породить и другие проблемы. Например, при реализации на ПЛИСах остальные вычисления (деления и тем более умножения и сложения/вычитания) могут быть конвейеризованы, что даёт экономию и по ресурсам на программируемых платах; вычисления же квадратных корней из-за их изолированности приведут к занятию ресурсов на платах, которые будут простаивать большую часть времени. Таким образом, общая экономия в 2 раза, из-за которой метод Холецкого предпочитают в случае симметричных задач тому же методу Гаусса, в параллельном случае уже имеет место вовсе не по всем ресурсам, и главное - не по требуемому времени.&lt;br /&gt;
&lt;br /&gt;
При этом использование режима накопления требует совершения умножений и вычитаний в режиме двойной точности, а в параллельном варианте это означает, что практически все промежуточные вычисления для выполнения метода Холецкого в режиме накопления должны быть двойной точности. В отличие от последовательного варианта это означает увеличение требуемой памяти почти в 2 раза.&lt;br /&gt;
&lt;br /&gt;
При классификации по высоте ЯПФ, таким образом, метод Холецкого относится к алгоритмам &#039;&#039;с линейной сложностью&#039;&#039;. При классификации по ширине ЯПФ его сложность будет &#039;&#039;квадратичной&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Описание входных и выходных данных ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&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;a_{ij}= a_{ji}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; – положительно определённая матрица, т. е. для любых ненулевых векторов &amp;lt;math&amp;gt;\vec{x}&amp;lt;/math&amp;gt; выполняется &amp;lt;math&amp;gt;\vec{x}^T A \vec{x} &amp;gt; 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/поддиагональные элементы). В разных реализациях эта экономия хранения может быть выполнена разным образом. Например, в библиотеке, реализованной в НИВЦ МГУ, матрица A хранилась в одномерном массиве длины &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt; по строкам своей нижней части. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: левая треугольная матрица &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;l_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;  (в силу треугольности достаточно хранить только ненулевые - диагональ и поддиагональные - элементы). В разных реализациях эта экономия хранения может быть выполнена разным образом. Например, в той же  библиотеке, созданной в НИВЦ МГУ, матрица &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt; хранилась в одномерном массиве длины &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt; по строкам своей нижней части.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является &#039;&#039;квадратичным&#039;&#039; (отношение кубической к линейной). &lt;br /&gt;
&lt;br /&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;
&lt;br /&gt;
== Программная реализация ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В простейшем (без перестановок суммирования) варианте метод Холецкого на Фортране можно записать так:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;fortran&amp;quot;&amp;gt;&lt;br /&gt;
	DO  I = 1, N&lt;br /&gt;
		S = A(I,I)&lt;br /&gt;
		DO  IP=1, I-1&lt;br /&gt;
			S = S - DPROD(A(I,P), A(I,IP))&lt;br /&gt;
		END DO&lt;br /&gt;
		A(I,I) = SQRT (S)&lt;br /&gt;
		DO  J = I+1, N&lt;br /&gt;
			S = A(J,I)&lt;br /&gt;
			DO  IP=1, I-1&lt;br /&gt;
				S = S - DPROD(A(I,P), A(J,IP))&lt;br /&gt;
			END DO&lt;br /&gt;
			A(J,I) = S/A(I,I)&lt;br /&gt;
		END DO&lt;br /&gt;
	END DO&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
При этом для реализации режима накопления переменная &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; должна быть двойной точности. &lt;br /&gt;
&lt;br /&gt;
Для метода Холецкого существует блочная версия, которая отличается от точечной не тем, что операции над числами заменены на аналоги этих операций над блоками; её построение основано на том, что практически все циклы точечной версии имеют тип SchedDo в терминах методологии, основанной на исследовании информационного графа и, следовательно, могут быть расщеплены на составляющие. Тем не менее, обычно блочную версию метода Холецкого записывают не в виде программы с расщеплёнными и переставленными циклами, а в виде программы, подобной реализации точечного метода, в которой вместо соответствующих скалярных операций присутствуют операции над блоками.&lt;br /&gt;
&lt;br /&gt;
Для обеспечения локальности работы с памятью представляется более эффективной такая схема метода Холецкого (полностью эквивалентная описанной), когда исходная матрица и её разложение хранятся не в нижнем-левом, а в правом-верхнем треугольнике. Это связано с особенностью размещения массивов в Фортране и тем, что в этом случае вычисления скалярных произведений будут идти с выборкой идущих подряд элементов массива. &lt;br /&gt;
&lt;br /&gt;
Есть и другой вариант точечной схемы: использовать вычисляемые элементы матрицы &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt; в качестве аргументов непосредственно «сразу после» их вычисления. Такая программа будет выглядеть так:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;fortran&amp;quot;&amp;gt;&lt;br /&gt;
	DO  I = 1, N&lt;br /&gt;
		A(I,I) = SQRT (A(I, I))&lt;br /&gt;
		DO  J = I+1, N&lt;br /&gt;
			A(J,I) = A(J,I)/A(I,I)&lt;br /&gt;
		END DO&lt;br /&gt;
		DO  K=I+1,N&lt;br /&gt;
			DO J = K, N&lt;br /&gt;
				A(J,K) = A(J,K) - A(J,I)*A(K,I)&lt;br /&gt;
			END DO	&lt;br /&gt;
		END DO&lt;br /&gt;
	END DO&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Как видно, в этом варианте для реализации режима накопления одинарной точности мы должны будем объявить двойную точность для массива, хранящего исходные данные и результат. Подчеркнём, что [[глоссарий#Граф алгоритма|граф алгоритма]] обеих схем - один и тот же (из п.1.7), если не считать изменением замену умножения на функцию DPROD!&lt;br /&gt;
&lt;br /&gt;
=== Описание локальности данных и вычислений ===&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:Cholesky_locality1.jpg|thumb|center|700px|Рисунок 1. Реализация метода Холецкого. Общий профиль обращений в память]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 1 представлен профиль обращений в память для реализации метода Холецкого. В программе задействован только 1 массив, поэтому в данном случае обращения в профиле происходят только к элементам этого массива. Программа состоит из одного основного этапа, который, в свою очередь, состоит из последовательности подобных итераций. Пример одной итерации выделен зеленым цветом.&lt;br /&gt;
&lt;br /&gt;
Видно, что на каждой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации используются все адреса, кроме первых &amp;lt;math&amp;gt;k_i&amp;lt;/math&amp;gt;, при этом с ростом &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; увеличивается значение &amp;lt;math&amp;gt;k_i&amp;lt;/math&amp;gt;. Также можно заметить, что число обращений в память на каждой итерации растет примерно до середины работы программы, после чего уменьшается вплоть до завершения работы. Это позволяет говорить о том, что данные в программе используются неравномерно, при этом многие итерации, особенно в начале выполнения программы, задействуют большой объем данных, что приводит к ухудшению локальности.&lt;br /&gt;
&lt;br /&gt;
Однако в данном случае основным фактором, влияющим на локальность работы с памятью, является строение итерации. Рассмотрим фрагмент профиля, соответствующий нескольким первым итерациям.&lt;br /&gt;
&lt;br /&gt;
[[file:Cholesky_locality2.jpg|thumb|center|700px|Рисунок 2. Реализация метода Холецкого. Фрагмент профиля (несколько первых итераций)]]&lt;br /&gt;
&lt;br /&gt;
Исходя из рисунка 2 видно, что каждая итерация состоит из двух различных фрагментов. Фрагмент 1 – последовательный перебор (с некоторым шагом) всех адресов, начиная с некоторого начального. При этом к каждому элементу происходит мало обращений. Такой фрагмент обладает достаточно неплохой пространственной локальностью, так как шаг по памяти между соседними обращениями невелик, но плохой временно́й локальностью, поскольку данные редко используются повторно.&lt;br /&gt;
&lt;br /&gt;
Фрагмент 2 устроен гораздо лучше с точки зрения локальности. В рамках этого фрагмента выполняется большое число обращений подряд к одним и тем же данным, что обеспечивает гораздо более высокую степень как пространственной, так и временно́й локальности по сравнению с фрагментом 1.&lt;br /&gt;
&lt;br /&gt;
После рассмотрения фрагмента профиля на рис. 2 можно оценить общую локальность двух фрагментов на каждой итерации. Однако стоит рассмотреть более подробно, как устроен каждый из фрагментов. &lt;br /&gt;
&lt;br /&gt;
[[file:Cholesky_locality3.jpg|thumb|center|700px|Рисунок 3. Реализация метода Холецкого. Фрагмент профиля (часть одной итерации)]]&lt;br /&gt;
&lt;br /&gt;
Рис. 3, на котором представлена часть одной итерации общего профиля,  позволяет отметить достаточно интересный факт: строение каждого из фрагментов на самом деле заметно сложнее, чем это выглядит на рис. 2. В частности, каждый шаг фрагмента 1 состоит из нескольких обращений к соседним элементам, причем выполняется не последовательный перебор. Также можно увидеть, что фрагмент 2 на самом деле в свою очередь состоит из повторяющихся итераций, при этом видно, что каждый шаг фрагмента 1 соответствует одной итерации фрагмента 2 (выделено зеленым на рис. 3). Это лишний раз говорит о том, что для точного понимания локальной структуры профиля необходимо его рассмотреть на уровне отдельных обращений.&lt;br /&gt;
&lt;br /&gt;
Стоит отметить, что выводы на основе рис. 3 просто дополняют общее представлении о строении профиля обращений; сделанные на основе рис. 2 выводы относительно общей локальности двух фрагментов остаются верны.&lt;br /&gt;
&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
Первая оценка выполняется на основе характеристики daps, которая оценивает число выполненных обращений (чтений и записей) в память в секунду. Данная характеристика является аналогом оценки flops применительно к работе с памятью и является в большей степени оценкой производительности взаимодействия с памятью, чем оценкой локальности. Однако она служит хорошим источником информации, в том числе для сравнения с результатами по следующей характеристике cvg.&lt;br /&gt;
&lt;br /&gt;
[[file:Cholesky_locality4.jpg|thumb|center|700px|Рисунок 4. Сравнение значений оценки daps]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 4 приведены значения daps для реализаций распространенных алгоритмов, отсортированные по возрастанию (чем больше daps, тем в общем случае выше производительность). Можно увидеть, что реализация метода Холецкого характеризуется достаточно высокой скоростью взаимодействия с памятью, однако ниже, чем, например, у теста Линпак или реализации метода Якоби.&lt;br /&gt;
&lt;br /&gt;
Вторая характеристика – cvg – предназначена для получения более машинно-независимой оценки локальности. Она определяет, насколько часто в программе необходимо подтягивать данные в кэш-память. Соответственно, чем меньше значение cvg, тем реже это нужно делать, тем лучше локальность. &lt;br /&gt;
&lt;br /&gt;
[[file:Cholesky_locality5.jpg|thumb|center|700px|Рисунок 5. Сравнение значений оценки cvg]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 5 приведены значения cvg для того же набора реализаций, отсортированные по убыванию (чем меньше cvg, тем в общем случае выше локальность). Можно увидеть, что, согласно данной оценке, реализация метода Холецкого оказалась ниже в списке по сравнению с оценкой daps.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности реализации параллельного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Как нетрудно видеть по структуре графа алгоритма, вариантов распараллеливания алгоритма довольно много. Например, во втором варианте (см. раздел «[[#Особенности реализации последовательного алгоритма|Особенности реализации последовательного алгоритма]]») все внутренние циклы параллельны, в первом — параллелен цикл по &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;. Тем не менее, простое распараллеливание таким способом «в лоб» вызовет такое количество пересылок между процессорами с каждым шагом по внешнему циклу, которое почти сопоставимо с количеством арифметических операций. Поэтому перед размещением операций и данных между процессорами вычислительной системы предпочтительно разбиение всего пространства вычислений на блоки, с сопутствующим разбиением обрабатываемого массива.&lt;br /&gt;
&lt;br /&gt;
Многое зависит от конкретного типа вычислительной системы. Присутствие конвейеров на узлах многопроцессорной системы делает рентабельным параллельное вычисление нескольких скалярных произведений сразу. Подобная возможность есть и на программировании ПЛИСов, но там быстродействие будет ограничено медленным последовательным выполнением операции извлечения квадратного корня. &lt;br /&gt;
	&lt;br /&gt;
В принципе, возможно и использование т. н. «скошенного» параллелизма. Однако его на практике никто не использует, из-за усложнения управляющей структуры программы.&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Описание масштабируемости алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Описание масштабируемости реализации алгоритма ====&lt;br /&gt;
Проведём исследование масштабируемости параллельной реализации разложения Холецкого согласно [[Scalability methodology|методике]]. Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета].&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [4 : 256] с шагом 4;&lt;br /&gt;
*	размер матрицы [1024 : 5120].&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон [[Глоссарий#Эффективность реализации|эффективности реализации]] алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 0,11%;&lt;br /&gt;
*	максимальная эффективность реализации 2,65%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики [[Глоссарий#Производительность|производительности]] и эффективности выбранной реализации разложения Холецкого в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость Параллельной реализации метода Холецкого Производительность.png|thumb|center|700px|Рисунок 1. Параллельная реализация метода Холецкого. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
[[file:Холецкий масштабируемость эффективность.png|thumb|center|700px|Рисунок 2. Параллельная реализация метода Холецкого. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
Построим оценки масштабируемости выбранной реализации разложения Холецкого:&lt;br /&gt;
*	По числу процессов: -0,000593. При увеличении числа процессов эффективность на рассмотренной области изменений параметров запуска уменьшается, однако в целом уменьшение не очень быстрое. Малая интенсивность изменения объясняется крайне низкой общей эффективностью работы приложения с максимумом в 2,65%, и значение эффективности на рассмотренной области значений быстро доходит до десятых долей процента. Это свидетельствует о том, что на большей части области значений нет интенсивного снижения эффективности. Это объясняется также тем, что с ростом [[Глоссарий#Вычислительная сложность|вычислительной сложности]] падение эффективности становится не таким быстрым. Уменьшение эффективности на рассмотренной области работы параллельной программы объясняется быстрым ростом накладных расходов на организацию параллельного выполнения. С ростом вычислительной сложности задачи эффективность снижается так же быстро, но при больших значениях числа процессов. Это подтверждает предположение о том, что накладные расходы начинают сильно превалировать над вычислениями.&lt;br /&gt;
*	По размеру задачи: 0,06017. При увеличении размера задачи эффективность возрастает. Эффективность возрастает тем быстрее, чем большее число процессов используется для выполнения. Это подтверждает предположение о том, что размер задачи сильно влияет на эффективность выполнения приложения. Оценка показывает, что с ростом размера задачи эффективность на рассмотренной области значений параметров запуска сильно увеличивается. Также, учитывая разницу максимальной и минимальной эффективности в 2,5%, можно сделать вывод, что рост эффективности при увеличении размера задачи наблюдается на большей части рассмотренной области значений.&lt;br /&gt;
*	По двум направлениям: 0,000403. При рассмотрении увеличения как вычислительной сложности, так и числа процессов на всей рассмотренной области значений эффективность увеличивается, однако скорость увеличения эффективности небольшая. В совокупности с тем фактом, что разница между максимальной и минимальной эффективностью на рассмотренной области значений параметров небольшая, эффективность с увеличением масштабов возрастает, но медленно и с небольшими перепадами.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для существующих параллельных реализаций характерно отнесение всего ресурса параллелизма на блочный уровень. Относительно низкая эффективность работы связана с проблемами внутри одного узла, следующим фактором является неоптимальное соотношение между «арифметикой» и обменами. Видно, что при некотором (довольно большом) оптимальном размере блока обмены влияют не так уж сильно.&lt;br /&gt;
&lt;br /&gt;
Для проведения экспериментов использовалась реализация разложения Холецкого, представленная в пакете SCALAPACK библиотеки Intel MKL (метод pdpotrf).  Все результаты получены на суперкомпьютере «Ломоносов». Использовались процессоры Intel Xeon X5570 с пиковой производительностью в 94 Гфлопс, а также компилятор Intel с опцией –O2. &lt;br /&gt;
&lt;br /&gt;
[[file:Cholesky_efficiency1.jpg|thumb|center|700px]]&lt;br /&gt;
&lt;br /&gt;
На рисунке показана эффективность реализации разложения Холецкого (случай использования нижних треугольников матриц) для разного числа процессов и разной размерности матрицы (10000, 20000 и 50000 элементов). Видно, что общая эффективность достаточно невысока – даже при малом числе процессов менее 10 %. Однако при всех размерностях матрицы эффективность снижается очень медленно – в самом худшем случае, при N = 10000, при увеличении числа процессов с 16 до 900 (в 56 раз) эффективность падает с 7 % до 0,8 % (всего в 9 раз). При N = 50000 эффективность уменьшается еще медленнее. &lt;br /&gt;
&lt;br /&gt;
Также стоит отметить небольшое суперлинейное ускорение, полученное на 4-х процессах для N = 10000 и N = 20000 (для N = 50000 провести эксперименты на таком малом числе процессов не удалось). Помимо более эффективной работы с кэш-памятью, оно, видимо, обусловлено тем, что эти 4 процесса помещаются на ядрах одного процессора, что позволяет использовать общую память, и, соответственно, не приводит к появлению накладных расходов, связанных с пересылкой данных.&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
Как видно по показателям SCALAPACK на суперкомпьютерах, обмены при большом n хоть и уменьшают эффективность расчётов, но слабее, чем неоптимальность организации расчётов внутри одного узла. Поэтому, видимо, следует сначала оптимизировать не блочный алгоритм, а подпрограммы, используемые на отдельных процессорах: точечный метод Холецкого, перемножения матриц и др. подпрограммы. [[#Существующие реализации алгоритма|Ниже]] содержится информация о возможном направлении такой оптимизации.&lt;br /&gt;
&lt;br /&gt;
В отношении же архитектуры типа ПЛИС вполне показателен тот момент, что разработчики — наполнители библиотек для ПЛИСов пока что не докладывают об успешных и эффективных реализациях точечного метода Холецкого на ПЛИСах. Это связано со следующим свойством информационной структуры алгоритма: если операции деления или вычисления выражений &amp;lt;math&amp;gt;a - bc&amp;lt;/math&amp;gt; являются не только массовыми, но и параллельными, и потому их вычисления сравнительно легко выстраивать в конвейеры, то операции извлечения квадратных корней являются узким местом алгоритма - отведённое на эту операцию оборудование неизбежно будет простаивать большую часть времени. Поэтому для эффективной реализации на ПЛИСах алгоритмов, столь же хороших по вычислительным характеристикам, как и метод квадратного корня, следует использовать не метод Холецкого, а его давно известную модификацию без извлечения квадратных корней — [[Компактная схема разложения Гаусса (вариант для симметричных матриц)|разложение матрицы в произведение &amp;lt;math&amp;gt;L D L^T&amp;lt;/math&amp;gt;]].&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Точечный метод Холецкого реализован как в основных библиотеках программ отечественных организаций, так и в западных пакетах LINPACK, LAPACK, SCALAPACK и др. &lt;br /&gt;
	&lt;br /&gt;
При этом в отечественных реализациях, как правило, выполнены стандартные требования к методу с точки зрения ошибок округления, то есть, реализован режим накопления, и обычно нет лишних операций. Правда, анахронизмом в наше время выглядит то, что ряд старых отечественных реализаций использует для экономии памяти упаковку матриц &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt; в одномерный массив. При реальных вычислениях на современных вычислительных системах данная упаковка только создаёт дополнительные накладные расходы. Однако отечественные реализации, не использующие такую упаковку, вполне отвечают требованиям современности в отношении вычислительной точности метода.  &lt;br /&gt;
	&lt;br /&gt;
Реализация точечного метода Холецкого в современных западных пакетах страдает другими недостатками, вытекающими из того, что все эти реализации, по сути, происходят из одной и той же реализации метода в LINPACK, а та использует пакет BLAS. Основным их недостатком является даже не наличие лишних операций, о котором уже написано в разделе «[[#Вычислительное ядро алгоритма|Вычислительное ядро алгоритма]]», ибо их количество всё же невелико по сравнению с главной частью, а то, что в BLAS скалярное произведение реализовано без режима накопления. Это перечёркивает имеющиеся для метода Холецкого хорошие оценки влияния ошибок округления, поскольку они выведены как раз в предположении использования режима накопления при вычислении скалярных произведений. Поэтому тот, кто использует реализации метода Холецкого из LINPACK, LAPACK, SCALAPACK и т. п. пакетов, серьёзно рискует не получить требуемую вычислительную точность, либо ему придётся для получения хороших оценок &#039;&#039;одинарной точности&#039;&#039; использовать подпрограммы &#039;&#039;двойной&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
# В.В.Воеводин. Вычислительные основы линейной алгебры. М.: Наука, 1977.&lt;br /&gt;
# В.В.Воеводин, Ю.А.Кузнецов. Матрицы и вычисления. М.: Наука, 1984.&lt;br /&gt;
# Д.К.Фаддеев, В.Н.Фаддева. Вычислительные основы линейной алгебры. М.-Л.: Физматгиз, 1963.&lt;br /&gt;
&lt;br /&gt;
[[en:Cholesky decomposition]]&lt;/div&gt;</summary>
		<author><name>Chernyavskiy1</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B4%D0%BD%D0%BE%D0%BA%D1%83%D0%B1%D0%B8%D1%82%D0%BD%D0%BE%D0%B5_%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%B5_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0-%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F&amp;diff=732</id>
		<title>Однокубитное преобразование вектора-состояния</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B4%D0%BD%D0%BE%D0%BA%D1%83%D0%B1%D0%B8%D1%82%D0%BD%D0%BE%D0%B5_%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%B5_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0-%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F&amp;diff=732"/>
		<updated>2014-11-18T23:29:09Z</updated>

		<summary type="html">&lt;p&gt;Chernyavskiy1: Новая страница: «  == Описание свойств и структуры алгоритма ==  === Общее описание алгоритма ===  Алгоритм про…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
== Описание свойств и структуры алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм производит моделирование действия однокубитного квантового вентиля на вектор-состояние. &lt;br /&gt;
&lt;br /&gt;
==== Математическая формулировка ====&lt;br /&gt;
Состояние &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; кубитов задается комплексным вектором &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;2^n.&amp;lt;/math&amp;gt; Однокубитная операция задается унитарной матрицей &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;2 \times 2.&amp;lt;/math&amp;gt; Состояние после действия преобразования &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;k-&amp;lt;/math&amp;gt;й кубит имеет вид &amp;lt;math&amp;gt;v_{out} = I_{2^{k-1}}\otimes U \otimes I_{2^{n-k}},&amp;lt;/math&amp;gt; где &amp;lt;math&amp;gt;I_{j} - &amp;lt;/math&amp;gt; единичная матрица размерности &amp;lt;math&amp;gt;j,&amp;lt;/math&amp;gt; а &amp;lt;math&amp;gt;\otimes - &amp;lt;/math&amp;gt; тензорное произведение (произведение Кронекера).&lt;br /&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;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: левая треугольная матрица &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;l_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
l_{11} &amp;amp; = \sqrt{a_{11}}, \\&lt;br /&gt;
l_{j1} &amp;amp; = \frac{a_{j1}}{l_{11}}, \quad j \in [2, n], \\&lt;br /&gt;
l_{ii} &amp;amp; = \sqrt{a_{ii} - \sum_{p = 1}^{i - 1} l_{ip}^2}, \quad i \in [2, n], \\&lt;br /&gt;
l_{ji} &amp;amp; = \left (a_{ji} - \sum_{p = 1}^{i - 1} l_{ip} l_{jp} \right ) / l_{ii}, \quad i \in [2, n - 1], j \in [i + 1, n].&lt;br /&gt;
\end{align}&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;\frac{1}{l_{ii}}&amp;lt;/math&amp;gt; и затем умножение на него всех (видоизменённых) &amp;lt;math&amp;gt;a_{ji}&amp;lt;/math&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;\sum_{p = 1}^{i - 1} l_{ip} l_{jp}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
в режиме накопления или без него, в зависимости от требований задачи. В отечественных реализациях, даже в последовательных, упомянутый способ представления не используется. Дело в том, что даже в этих реализациях метода вычисление сумм типа&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;a_{ji} - \sum_{p = 1}^{i - 1} l_{ip} l_{jp}&amp;lt;/math&amp;gt;&amp;lt;nowiki/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
в которых и встречаются скалярные произведения, ведутся не в порядке «вычислили скалярное произведение, а потом вычли его из элемента», а путём вычитания из элемента покомпонентных произведений, являющихся частями скалярных произведений. Поэтому следует считать вычислительным ядром метода не вычисления скалярных произведений, а вычисления выражений&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;a_{ji} - \sum_{p = 1}^{i - 1} l_{ip} l_{jp}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
в &#039;&#039;режиме накопления&#039;&#039; или без него.&lt;br /&gt;
&lt;br /&gt;
Тем не менее, в популярных зарубежных реализациях точечного метода Холецкого, в частности, в библиотеках LINPACK и LAPACK, основанных на BLAS, используются именно вычисления скалярных произведений в виде вызова соответствующих подпрограмм BLAS (конкретно — функции SDOT). На последовательном уровне это влечёт за собой дополнительную операцию суммирования на каждый из &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt; вычисляемый элемент матрицы &amp;lt;math&amp;gt;L&amp;lt;/math&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;a_{ji}-\sum_{p=1}^{i-1}l_{ip} l_{jp}&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;
1. &amp;lt;math&amp;gt;l_{11}= \sqrt{a_{11}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;l_{j1}= \frac{a_{j1}}{l_{11}}&amp;lt;/math&amp;gt; (при &amp;lt;math&amp;gt;j&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;
&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;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;l_{ii} = \sqrt{a_{ii} - \sum_{p = 1}^{i - 1} l_{ip}^2}&amp;lt;/math&amp;gt; и&lt;br /&gt;
&lt;br /&gt;
4. (кроме &amp;lt;math&amp;gt;i = n&amp;lt;/math&amp;gt;): &amp;lt;nowiki/&amp;gt;&amp;lt;math&amp;gt;l_{ji} = \left (a_{ji} - \sum_{p = 1}^{i - 1} l_{ip} l_{jp} \right ) / l_{ii}&amp;lt;/math&amp;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;
После этого (если &amp;lt;math&amp;gt;i &amp;lt; n&amp;lt;/math&amp;gt;) происходит переход к шагу 3 с бо́льшим &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Особо отметим, что вычисления сумм вида &amp;lt;math&amp;gt;a_{ji} - \sum_{p = 1}^{i - 1} l_{ip} l_{jp}&amp;lt;/math&amp;gt; в обеих формулах производят в режиме накопления вычитанием из &amp;lt;math&amp;gt;a_{ji}&amp;lt;/math&amp;gt; произведений &amp;lt;math&amp;gt;l_{ip} l_{jp}&amp;lt;/math&amp;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;, c нарастанием &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для разложения матрицы порядка n методом Холецкого в последовательном (наиболее быстром) варианте требуется:&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;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* по &amp;lt;math&amp;gt;\frac{n^3-n}{6}&amp;lt;/math&amp;gt; умножений и сложений (вычитаний) — &#039;&#039;основная часть алгоритма&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
При этом использование режима накопления требует совершения умножений и вычитаний в режиме двойной точности (или использования функции вроде DPROD в Фортране), что ещё больше увеличивает долю умножений и сложений/вычитаний во времени, требуемом для выполнения метода Холецкого.&lt;br /&gt;
&lt;br /&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;
&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;
Описанный граф можно посмотреть на рисунке, выполненном для случая &amp;lt;math&amp;gt;n = 4&amp;lt;/math&amp;gt;. Здесь вершины первой группы обозначены жёлтым цветом и буквосочетанием sq, вершины второй — зелёным цветом и знаком деления, третьей — красным цветом и буквой f. Вершины, соответствующие операциям, производящим выходные данные алгоритма, выполнены более крупно. Дублирующие друг друга дуги даны как одна. На первом изображении показан граф алгоритма согласно классическому определению , на втором к графу алгоритма добавлены вершины , соответствующие входным данным ( обозначены синим цветом ) и выходным данным ( обозначены розовым цветом ).&lt;br /&gt;
&lt;br /&gt;
[[file:Cholesky full.png|thumb|center|1400px|Граф алгоритма без отображения входных и выходных данных. SQ - вычисление квадратного корня, F - операция a-bc, Div - деление.]]&lt;br /&gt;
[[file:Cholesky full_in_out.png|thumb|center|1400px|Граф алгоритма с отображением входных и выходных данных. SQ - вычисление квадратного корня, F - операция a-bc, Div - деление, In - входные данные, Out - результаты.]]&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&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;
Таким образом, в параллельном варианте, в отличие от последовательного, вычисления квадратных корней и делений будут определять довольно значительную долю требуемого времени. При реализации на конкретных архитектурах наличие в отдельных ярусах [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] отдельных вычислений квадратных корней может породить и другие проблемы. Например, при реализации на ПЛИСах остальные вычисления (деления и тем более умножения и сложения/вычитания) могут быть конвейеризованы, что даёт экономию и по ресурсам на программируемых платах; вычисления же квадратных корней из-за их изолированности приведут к занятию ресурсов на платах, которые будут простаивать большую часть времени. Таким образом, общая экономия в 2 раза, из-за которой метод Холецкого предпочитают в случае симметричных задач тому же методу Гаусса, в параллельном случае уже имеет место вовсе не по всем ресурсам, и главное - не по требуемому времени.&lt;br /&gt;
&lt;br /&gt;
При этом использование режима накопления требует совершения умножений и вычитаний в режиме двойной точности, а в параллельном варианте это означает, что практически все промежуточные вычисления для выполнения метода Холецкого в режиме накопления должны быть двойной точности. В отличие от последовательного варианта это означает увеличение требуемой памяти почти в 2 раза.&lt;br /&gt;
&lt;br /&gt;
При классификации по высоте ЯПФ, таким образом, метод Холецкого относится к алгоритмам &#039;&#039;с линейной сложностью&#039;&#039;. При классификации по ширине ЯПФ его сложность будет &#039;&#039;квадратичной&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Описание входных и выходных данных ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&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;a_{ij}= a_{ji}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; – положительно определённая матрица, т. е. для любых ненулевых векторов &amp;lt;math&amp;gt;\vec{x}&amp;lt;/math&amp;gt; выполняется &amp;lt;math&amp;gt;\vec{x}^T A \vec{x} &amp;gt; 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/поддиагональные элементы). В разных реализациях эта экономия хранения может быть выполнена разным образом. Например, в библиотеке, реализованной в НИВЦ МГУ, матрица A хранилась в одномерном массиве длины &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt; по строкам своей нижней части. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: левая треугольная матрица &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;l_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;  (в силу треугольности достаточно хранить только ненулевые - диагональ и поддиагональные - элементы). В разных реализациях эта экономия хранения может быть выполнена разным образом. Например, в той же  библиотеке, созданной в НИВЦ МГУ, матрица &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt; хранилась в одномерном массиве длины &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt; по строкам своей нижней части.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является &#039;&#039;квадратичным&#039;&#039; (отношение кубической к линейной). &lt;br /&gt;
&lt;br /&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;
&lt;br /&gt;
== Программная реализация ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В простейшем (без перестановок суммирования) варианте метод Холецкого на Фортране можно записать так:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;fortran&amp;quot;&amp;gt;&lt;br /&gt;
	DO  I = 1, N&lt;br /&gt;
		S = A(I,I)&lt;br /&gt;
		DO  IP=1, I-1&lt;br /&gt;
			S = S - DPROD(A(I,P), A(I,IP))&lt;br /&gt;
		END DO&lt;br /&gt;
		A(I,I) = SQRT (S)&lt;br /&gt;
		DO  J = I+1, N&lt;br /&gt;
			S = A(J,I)&lt;br /&gt;
			DO  IP=1, I-1&lt;br /&gt;
				S = S - DPROD(A(I,P), A(J,IP))&lt;br /&gt;
			END DO&lt;br /&gt;
			A(J,I) = S/A(I,I)&lt;br /&gt;
		END DO&lt;br /&gt;
	END DO&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
При этом для реализации режима накопления переменная &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; должна быть двойной точности. &lt;br /&gt;
&lt;br /&gt;
Для метода Холецкого существует блочная версия, которая отличается от точечной не тем, что операции над числами заменены на аналоги этих операций над блоками; её построение основано на том, что практически все циклы точечной версии имеют тип SchedDo в терминах методологии, основанной на исследовании информационного графа и, следовательно, могут быть расщеплены на составляющие. Тем не менее, обычно блочную версию метода Холецкого записывают не в виде программы с расщеплёнными и переставленными циклами, а в виде программы, подобной реализации точечного метода, в которой вместо соответствующих скалярных операций присутствуют операции над блоками.&lt;br /&gt;
&lt;br /&gt;
Для обеспечения локальности работы с памятью представляется более эффективной такая схема метода Холецкого (полностью эквивалентная описанной), когда исходная матрица и её разложение хранятся не в нижнем-левом, а в правом-верхнем треугольнике. Это связано с особенностью размещения массивов в Фортране и тем, что в этом случае вычисления скалярных произведений будут идти с выборкой идущих подряд элементов массива. &lt;br /&gt;
&lt;br /&gt;
Есть и другой вариант точечной схемы: использовать вычисляемые элементы матрицы &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt; в качестве аргументов непосредственно «сразу после» их вычисления. Такая программа будет выглядеть так:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;fortran&amp;quot;&amp;gt;&lt;br /&gt;
	DO  I = 1, N&lt;br /&gt;
		A(I,I) = SQRT (A(I, I))&lt;br /&gt;
		DO  J = I+1, N&lt;br /&gt;
			A(J,I) = A(J,I)/A(I,I)&lt;br /&gt;
		END DO&lt;br /&gt;
		DO  K=I+1,N&lt;br /&gt;
			DO J = K, N&lt;br /&gt;
				A(J,K) = A(J,K) - A(J,I)*A(K,I)&lt;br /&gt;
			END DO	&lt;br /&gt;
		END DO&lt;br /&gt;
	END DO&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Как видно, в этом варианте для реализации режима накопления одинарной точности мы должны будем объявить двойную точность для массива, хранящего исходные данные и результат. Подчеркнём, что [[глоссарий#Граф алгоритма|граф алгоритма]] обеих схем - один и тот же (из п.1.7), если не считать изменением замену умножения на функцию DPROD!&lt;br /&gt;
&lt;br /&gt;
=== Описание локальности данных и вычислений ===&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:Cholesky_locality1.jpg|thumb|center|700px|Рисунок 1. Реализация метода Холецкого. Общий профиль обращений в память]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 1 представлен профиль обращений в память для реализации метода Холецкого. В программе задействован только 1 массив, поэтому в данном случае обращения в профиле происходят только к элементам этого массива. Программа состоит из одного основного этапа, который, в свою очередь, состоит из последовательности подобных итераций. Пример одной итерации выделен зеленым цветом.&lt;br /&gt;
&lt;br /&gt;
Видно, что на каждой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации используются все адреса, кроме первых &amp;lt;math&amp;gt;k_i&amp;lt;/math&amp;gt;, при этом с ростом &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; увеличивается значение &amp;lt;math&amp;gt;k_i&amp;lt;/math&amp;gt;. Также можно заметить, что число обращений в память на каждой итерации растет примерно до середины работы программы, после чего уменьшается вплоть до завершения работы. Это позволяет говорить о том, что данные в программе используются неравномерно, при этом многие итерации, особенно в начале выполнения программы, задействуют большой объем данных, что приводит к ухудшению локальности.&lt;br /&gt;
&lt;br /&gt;
Однако в данном случае основным фактором, влияющим на локальность работы с памятью, является строение итерации. Рассмотрим фрагмент профиля, соответствующий нескольким первым итерациям.&lt;br /&gt;
&lt;br /&gt;
[[file:Cholesky_locality2.jpg|thumb|center|700px|Рисунок 2. Реализация метода Холецкого. Фрагмент профиля (несколько первых итераций)]]&lt;br /&gt;
&lt;br /&gt;
Исходя из рисунка 2 видно, что каждая итерация состоит из двух различных фрагментов. Фрагмент 1 – последовательный перебор (с некоторым шагом) всех адресов, начиная с некоторого начального. При этом к каждому элементу происходит мало обращений. Такой фрагмент обладает достаточно неплохой пространственной локальностью, так как шаг по памяти между соседними обращениями невелик, но плохой временно́й локальностью, поскольку данные редко используются повторно.&lt;br /&gt;
&lt;br /&gt;
Фрагмент 2 устроен гораздо лучше с точки зрения локальности. В рамках этого фрагмента выполняется большое число обращений подряд к одним и тем же данным, что обеспечивает гораздо более высокую степень как пространственной, так и временно́й локальности по сравнению с фрагментом 1.&lt;br /&gt;
&lt;br /&gt;
После рассмотрения фрагмента профиля на рис. 2 можно оценить общую локальность двух фрагментов на каждой итерации. Однако стоит рассмотреть более подробно, как устроен каждый из фрагментов. &lt;br /&gt;
&lt;br /&gt;
[[file:Cholesky_locality3.jpg|thumb|center|700px|Рисунок 3. Реализация метода Холецкого. Фрагмент профиля (часть одной итерации)]]&lt;br /&gt;
&lt;br /&gt;
Рис. 3, на котором представлена часть одной итерации общего профиля,  позволяет отметить достаточно интересный факт: строение каждого из фрагментов на самом деле заметно сложнее, чем это выглядит на рис. 2. В частности, каждый шаг фрагмента 1 состоит из нескольких обращений к соседним элементам, причем выполняется не последовательный перебор. Также можно увидеть, что фрагмент 2 на самом деле в свою очередь состоит из повторяющихся итераций, при этом видно, что каждый шаг фрагмента 1 соответствует одной итерации фрагмента 2 (выделено зеленым на рис. 3). Это лишний раз говорит о том, что для точного понимания локальной структуры профиля необходимо его рассмотреть на уровне отдельных обращений.&lt;br /&gt;
&lt;br /&gt;
Стоит отметить, что выводы на основе рис. 3 просто дополняют общее представлении о строении профиля обращений; сделанные на основе рис. 2 выводы относительно общей локальности двух фрагментов остаются верны.&lt;br /&gt;
&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
Первая оценка выполняется на основе характеристики daps, которая оценивает число выполненных обращений (чтений и записей) в память в секунду. Данная характеристика является аналогом оценки flops применительно к работе с памятью и является в большей степени оценкой производительности взаимодействия с памятью, чем оценкой локальности. Однако она служит хорошим источником информации, в том числе для сравнения с результатами по следующей характеристике cvg.&lt;br /&gt;
&lt;br /&gt;
[[file:Cholesky_locality4.jpg|thumb|center|700px|Рисунок 4. Сравнение значений оценки daps]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 4 приведены значения daps для реализаций распространенных алгоритмов, отсортированные по возрастанию (чем больше daps, тем в общем случае выше производительность). Можно увидеть, что реализация метода Холецкого характеризуется достаточно высокой скоростью взаимодействия с памятью, однако ниже, чем, например, у теста Линпак или реализации метода Якоби.&lt;br /&gt;
&lt;br /&gt;
Вторая характеристика – cvg – предназначена для получения более машинно-независимой оценки локальности. Она определяет, насколько часто в программе необходимо подтягивать данные в кэш-память. Соответственно, чем меньше значение cvg, тем реже это нужно делать, тем лучше локальность. &lt;br /&gt;
&lt;br /&gt;
[[file:Cholesky_locality5.jpg|thumb|center|700px|Рисунок 5. Сравнение значений оценки cvg]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 5 приведены значения cvg для того же набора реализаций, отсортированные по убыванию (чем меньше cvg, тем в общем случае выше локальность). Можно увидеть, что, согласно данной оценке, реализация метода Холецкого оказалась ниже в списке по сравнению с оценкой daps.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности реализации параллельного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Как нетрудно видеть по структуре графа алгоритма, вариантов распараллеливания алгоритма довольно много. Например, во втором варианте (см. раздел «[[#Особенности реализации последовательного алгоритма|Особенности реализации последовательного алгоритма]]») все внутренние циклы параллельны, в первом — параллелен цикл по &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;. Тем не менее, простое распараллеливание таким способом «в лоб» вызовет такое количество пересылок между процессорами с каждым шагом по внешнему циклу, которое почти сопоставимо с количеством арифметических операций. Поэтому перед размещением операций и данных между процессорами вычислительной системы предпочтительно разбиение всего пространства вычислений на блоки, с сопутствующим разбиением обрабатываемого массива.&lt;br /&gt;
&lt;br /&gt;
Многое зависит от конкретного типа вычислительной системы. Присутствие конвейеров на узлах многопроцессорной системы делает рентабельным параллельное вычисление нескольких скалярных произведений сразу. Подобная возможность есть и на программировании ПЛИСов, но там быстродействие будет ограничено медленным последовательным выполнением операции извлечения квадратного корня. &lt;br /&gt;
	&lt;br /&gt;
В принципе, возможно и использование т. н. «скошенного» параллелизма. Однако его на практике никто не использует, из-за усложнения управляющей структуры программы.&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Описание масштабируемости алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Описание масштабируемости реализации алгоритма ====&lt;br /&gt;
Проведём исследование масштабируемости параллельной реализации разложения Холецкого согласно [[Scalability methodology|методике]]. Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета].&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [4 : 256] с шагом 4;&lt;br /&gt;
*	размер матрицы [1024 : 5120].&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон [[Глоссарий#Эффективность реализации|эффективности реализации]] алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 0,11%;&lt;br /&gt;
*	максимальная эффективность реализации 2,65%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики [[Глоссарий#Производительность|производительности]] и эффективности выбранной реализации разложения Холецкого в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость Параллельной реализации метода Холецкого Производительность.png|thumb|center|700px|Рисунок 1. Параллельная реализация метода Холецкого. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
[[file:Холецкий масштабируемость эффективность.png|thumb|center|700px|Рисунок 2. Параллельная реализация метода Холецкого. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
Построим оценки масштабируемости выбранной реализации разложения Холецкого:&lt;br /&gt;
*	По числу процессов: -0,000593. При увеличении числа процессов эффективность на рассмотренной области изменений параметров запуска уменьшается, однако в целом уменьшение не очень быстрое. Малая интенсивность изменения объясняется крайне низкой общей эффективностью работы приложения с максимумом в 2,65%, и значение эффективности на рассмотренной области значений быстро доходит до десятых долей процента. Это свидетельствует о том, что на большей части области значений нет интенсивного снижения эффективности. Это объясняется также тем, что с ростом [[Глоссарий#Вычислительная сложность|вычислительной сложности]] падение эффективности становится не таким быстрым. Уменьшение эффективности на рассмотренной области работы параллельной программы объясняется быстрым ростом накладных расходов на организацию параллельного выполнения. С ростом вычислительной сложности задачи эффективность снижается так же быстро, но при больших значениях числа процессов. Это подтверждает предположение о том, что накладные расходы начинают сильно превалировать над вычислениями.&lt;br /&gt;
*	По размеру задачи: 0,06017. При увеличении размера задачи эффективность возрастает. Эффективность возрастает тем быстрее, чем большее число процессов используется для выполнения. Это подтверждает предположение о том, что размер задачи сильно влияет на эффективность выполнения приложения. Оценка показывает, что с ростом размера задачи эффективность на рассмотренной области значений параметров запуска сильно увеличивается. Также, учитывая разницу максимальной и минимальной эффективности в 2,5%, можно сделать вывод, что рост эффективности при увеличении размера задачи наблюдается на большей части рассмотренной области значений.&lt;br /&gt;
*	По двум направлениям: 0,000403. При рассмотрении увеличения как вычислительной сложности, так и числа процессов на всей рассмотренной области значений эффективность увеличивается, однако скорость увеличения эффективности небольшая. В совокупности с тем фактом, что разница между максимальной и минимальной эффективностью на рассмотренной области значений параметров небольшая, эффективность с увеличением масштабов возрастает, но медленно и с небольшими перепадами.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для существующих параллельных реализаций характерно отнесение всего ресурса параллелизма на блочный уровень. Относительно низкая эффективность работы связана с проблемами внутри одного узла, следующим фактором является неоптимальное соотношение между «арифметикой» и обменами. Видно, что при некотором (довольно большом) оптимальном размере блока обмены влияют не так уж сильно.&lt;br /&gt;
&lt;br /&gt;
Для проведения экспериментов использовалась реализация разложения Холецкого, представленная в пакете SCALAPACK библиотеки Intel MKL (метод pdpotrf).  Все результаты получены на суперкомпьютере «Ломоносов». Использовались процессоры Intel Xeon X5570 с пиковой производительностью в 94 Гфлопс, а также компилятор Intel с опцией –O2. &lt;br /&gt;
&lt;br /&gt;
[[file:Cholesky_efficiency1.jpg|thumb|center|700px]]&lt;br /&gt;
&lt;br /&gt;
На рисунке показана эффективность реализации разложения Холецкого (случай использования нижних треугольников матриц) для разного числа процессов и разной размерности матрицы (10000, 20000 и 50000 элементов). Видно, что общая эффективность достаточно невысока – даже при малом числе процессов менее 10 %. Однако при всех размерностях матрицы эффективность снижается очень медленно – в самом худшем случае, при N = 10000, при увеличении числа процессов с 16 до 900 (в 56 раз) эффективность падает с 7 % до 0,8 % (всего в 9 раз). При N = 50000 эффективность уменьшается еще медленнее. &lt;br /&gt;
&lt;br /&gt;
Также стоит отметить небольшое суперлинейное ускорение, полученное на 4-х процессах для N = 10000 и N = 20000 (для N = 50000 провести эксперименты на таком малом числе процессов не удалось). Помимо более эффективной работы с кэш-памятью, оно, видимо, обусловлено тем, что эти 4 процесса помещаются на ядрах одного процессора, что позволяет использовать общую память, и, соответственно, не приводит к появлению накладных расходов, связанных с пересылкой данных.&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
Как видно по показателям SCALAPACK на суперкомпьютерах, обмены при большом n хоть и уменьшают эффективность расчётов, но слабее, чем неоптимальность организации расчётов внутри одного узла. Поэтому, видимо, следует сначала оптимизировать не блочный алгоритм, а подпрограммы, используемые на отдельных процессорах: точечный метод Холецкого, перемножения матриц и др. подпрограммы. [[#Существующие реализации алгоритма|Ниже]] содержится информация о возможном направлении такой оптимизации.&lt;br /&gt;
&lt;br /&gt;
В отношении же архитектуры типа ПЛИС вполне показателен тот момент, что разработчики — наполнители библиотек для ПЛИСов пока что не докладывают об успешных и эффективных реализациях точечного метода Холецкого на ПЛИСах. Это связано со следующим свойством информационной структуры алгоритма: если операции деления или вычисления выражений &amp;lt;math&amp;gt;a - bc&amp;lt;/math&amp;gt; являются не только массовыми, но и параллельными, и потому их вычисления сравнительно легко выстраивать в конвейеры, то операции извлечения квадратных корней являются узким местом алгоритма - отведённое на эту операцию оборудование неизбежно будет простаивать большую часть времени. Поэтому для эффективной реализации на ПЛИСах алгоритмов, столь же хороших по вычислительным характеристикам, как и метод квадратного корня, следует использовать не метод Холецкого, а его давно известную модификацию без извлечения квадратных корней — [[Компактная схема разложения Гаусса (вариант для симметричных матриц)|разложение матрицы в произведение &amp;lt;math&amp;gt;L D L^T&amp;lt;/math&amp;gt;]].&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Точечный метод Холецкого реализован как в основных библиотеках программ отечественных организаций, так и в западных пакетах LINPACK, LAPACK, SCALAPACK и др. &lt;br /&gt;
	&lt;br /&gt;
При этом в отечественных реализациях, как правило, выполнены стандартные требования к методу с точки зрения ошибок округления, то есть, реализован режим накопления, и обычно нет лишних операций. Правда, анахронизмом в наше время выглядит то, что ряд старых отечественных реализаций использует для экономии памяти упаковку матриц &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt; в одномерный массив. При реальных вычислениях на современных вычислительных системах данная упаковка только создаёт дополнительные накладные расходы. Однако отечественные реализации, не использующие такую упаковку, вполне отвечают требованиям современности в отношении вычислительной точности метода.  &lt;br /&gt;
	&lt;br /&gt;
Реализация точечного метода Холецкого в современных западных пакетах страдает другими недостатками, вытекающими из того, что все эти реализации, по сути, происходят из одной и той же реализации метода в LINPACK, а та использует пакет BLAS. Основным их недостатком является даже не наличие лишних операций, о котором уже написано в разделе «[[#Вычислительное ядро алгоритма|Вычислительное ядро алгоритма]]», ибо их количество всё же невелико по сравнению с главной частью, а то, что в BLAS скалярное произведение реализовано без режима накопления. Это перечёркивает имеющиеся для метода Холецкого хорошие оценки влияния ошибок округления, поскольку они выведены как раз в предположении использования режима накопления при вычислении скалярных произведений. Поэтому тот, кто использует реализации метода Холецкого из LINPACK, LAPACK, SCALAPACK и т. п. пакетов, серьёзно рискует не получить требуемую вычислительную точность, либо ему придётся для получения хороших оценок &#039;&#039;одинарной точности&#039;&#039; использовать подпрограммы &#039;&#039;двойной&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
# В.В.Воеводин. Вычислительные основы линейной алгебры. М.: Наука, 1977.&lt;br /&gt;
# В.В.Воеводин, Ю.А.Кузнецов. Матрицы и вычисления. М.: Наука, 1984.&lt;br /&gt;
# Д.К.Фаддеев, В.Н.Фаддева. Вычислительные основы линейной алгебры. М.-Л.: Физматгиз, 1963.&lt;br /&gt;
&lt;br /&gt;
[[en:Cholesky decomposition]]&lt;/div&gt;</summary>
		<author><name>Chernyavskiy1</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%8F_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%BE%D0%B2&amp;diff=731</id>
		<title>Классификация алгоритмов</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%8F_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%BE%D0%B2&amp;diff=731"/>
		<updated>2014-11-18T23:03:57Z</updated>

		<summary type="html">&lt;p&gt;Chernyavskiy1: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Векторные операции ==&lt;br /&gt;
&lt;br /&gt;
# [[Суммирование сдваиванием]]&lt;br /&gt;
# [[Равномерная норма вектора, вещественная версия, последовательно-параллельный вариант]]&lt;br /&gt;
# [[Скалярное произведение векторов, вещественная версия, последовательно-параллельный вариант]]&lt;br /&gt;
# [[Последовательно-параллельный метод суммирования]]&lt;br /&gt;
&lt;br /&gt;
== Умножение матрицы на вектор ==&lt;br /&gt;
&lt;br /&gt;
# [[Умножение плотной матрицы на вектор]]&lt;br /&gt;
&lt;br /&gt;
== Матричные операции ==&lt;br /&gt;
&lt;br /&gt;
# [[Умножение плотных матриц]]&lt;br /&gt;
&lt;br /&gt;
== Разложения матриц == &lt;br /&gt;
&lt;br /&gt;
=== Треугольные разложения ===&lt;br /&gt;
&lt;br /&gt;
# [[Метод Холецкого (нахождение симметричного треугольного разложения)]]&lt;br /&gt;
&lt;br /&gt;
=== Унитарно-треугольные разложения ===&lt;br /&gt;
&lt;br /&gt;
# [[Метод Гивенса (вращений) QR-разложения матрицы]]&lt;br /&gt;
# [[Метод Хаусхолдера (отражений) QR-разложения матрицы]]&lt;br /&gt;
&lt;br /&gt;
=== Разложения на унитарные и хессенберговы матрицы ===&lt;br /&gt;
&lt;br /&gt;
# [[Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме]]&lt;br /&gt;
&lt;br /&gt;
=== Разложения на унитарные и диагональные матрицы ===&lt;br /&gt;
&lt;br /&gt;
# [[Спектральное разложение (нахождение собственных значений и векторов)]]&lt;br /&gt;
# [[Сингулярное разложение (нахождение сингулярных значений и векторов)]]&lt;br /&gt;
&lt;br /&gt;
== Решение систем линейных уравнений ==&lt;br /&gt;
&lt;br /&gt;
# [[High Performance Conjugate Gradient (HPCG) benchmark]]&lt;br /&gt;
# [[Linpack benchmark]]&lt;br /&gt;
# [[Метод Гаусса решения СЛАУ (прямой ход)]]&lt;br /&gt;
# [[Метод Гаусса решения СЛАУ (обратный ход)]]&lt;br /&gt;
&lt;br /&gt;
== Тесты производительности компьютеров ==&lt;br /&gt;
&lt;br /&gt;
# [[High Performance Conjugate Gradient (HPCG) benchmark]]&lt;br /&gt;
# [[Linpack benchmark]]&lt;br /&gt;
&lt;br /&gt;
== Преобразование Фурье ==&lt;br /&gt;
&lt;br /&gt;
# [[Быстрое преобразование Фурье для степеней двойки]]&lt;br /&gt;
&lt;br /&gt;
== Алгоритмы на графах ==&lt;br /&gt;
&lt;br /&gt;
# [[Алгоритм вычисления кратчайшего пути во взвешенном графе]]&lt;br /&gt;
# [[Алгоритм обхода графа]]&lt;br /&gt;
&lt;br /&gt;
== Алгоритмы поиска ==&lt;br /&gt;
&lt;br /&gt;
# [[Двоичный поиск - находит элемент в отсортированном списке]], &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Алгоритмы сортировки ==&lt;br /&gt;
&lt;br /&gt;
# [[Сортировка с помощью двоичного дерева]]&lt;br /&gt;
# [[Сортировка пузырьком]]&lt;br /&gt;
# [[Сортировка слиянием (последовательный и параллельный варианты)]]&lt;br /&gt;
&lt;br /&gt;
== Вычислительная геометрия ==&lt;br /&gt;
&lt;br /&gt;
# [[Поиск диаметра множества точек]]&lt;br /&gt;
# [[Построение выпуклой оболочки набора точек]]&lt;br /&gt;
# [[Триангуляция Делоне]]&lt;br /&gt;
# [[Диаграмма Вороного]]&lt;br /&gt;
# [[Принадлежность точки многоугольнику]]&lt;br /&gt;
# [[Пересечения выпуклых многоугольников]] - трудоёмкость &amp;lt;math&amp;gt;O(n_1 + n_2)&amp;lt;/math&amp;gt;&lt;br /&gt;
# [[Пересечение звёздных многоугольников]] - трудоёмкость &amp;lt;math&amp;gt;O(n_1 * n_2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Компьютерная графика ==&lt;br /&gt;
&lt;br /&gt;
# [[Алгоритмы построения отрезка - алгоритмы для аппроксимации отрезка на дискретной графической поверхности]]&lt;br /&gt;
# [[Алгоритм определения видимых частей трёхмерной сцены]]&lt;br /&gt;
# [[Трассировка лучей - рендеринг реалистичных изображений]]&lt;br /&gt;
# [[Глобальное освещение - рассматривает прямое освещение и отражение от других объектов]]&lt;br /&gt;
&lt;br /&gt;
== Криптографические алгоритмы ==&lt;br /&gt;
&lt;br /&gt;
== Нейронные сети ==&lt;br /&gt;
&lt;br /&gt;
== Алгоритмы оптимизации ==&lt;br /&gt;
&lt;br /&gt;
# [[Линейное программирование]]&lt;br /&gt;
# [[Симплекс-метод]]&lt;br /&gt;
# [[Метод ветвей и границ (последовательный и параллельный варианты)]]&lt;br /&gt;
# [[Генетические алгоритмы]]&lt;br /&gt;
# [[Муравьиные алгоритмы]]&lt;br /&gt;
# [[Комбинированные алгоритмы]]&lt;br /&gt;
# [[Нахождение экстремума функции]]&lt;br /&gt;
&lt;br /&gt;
== Алгоритмы теории игр ==&lt;br /&gt;
&lt;br /&gt;
== Алгоритмы моделирования квантовых систем ==&lt;br /&gt;
&lt;br /&gt;
=== Алгоритмы моделирования квантовых вычислений ===&lt;br /&gt;
#[[Однокубитное преобразование вектора-состояния]]&lt;br /&gt;
== Другие алгоритмы ==&lt;/div&gt;</summary>
		<author><name>Chernyavskiy1</name></author>
	</entry>
</feed>